/** * Class which keeps set of all areas required to represent Capital Fighter unit in * MechDsiplay.ArmorPanel class. */ public class CapitalFighterMapSet implements DisplayMapSet { private JComponent comp; // Images that shows how much armor left. private Image armorImage; // Set of areas to show fighter armor left private PMPicArea armorArea; // Set of labels to show fighter armor left // images and areas for each crit tally private Image avCritImage; private PMPicArea avCritArea; private Image engineCritImage; private PMPicArea engineCritArea; private Image fcsCritImage; private PMPicArea fcsCritArea; private Image sensorCritImage; private PMPicArea sensorCritArea; private Image pilotCritImage; private PMPicArea pilotCritArea; private PMSimpleLabel armorLabel; private PMValueLabel armorVLabel; private PMSimpleLabel avCritLabel; private PMSimpleLabel engineCritLabel; private PMSimpleLabel fcsCritLabel; private PMSimpleLabel sensorCritLabel; private PMSimpleLabel pilotCritLabel; private Vector<BackGroundDrawer> bgDrawers = new Vector<BackGroundDrawer>(); private PMAreasGroup content = new PMAreasGroup(); private int stepY = 14; private int squareSize = 7; private int armorRows = 8; private int armorCols = 6; private static final Font FONT_LABEL = new Font( "SansSerif", Font.PLAIN, GUIPreferences.getInstance() .getInt("AdvancedMechDisplayArmorSmallFontSize")); // $NON-NLS-1$ public CapitalFighterMapSet(JComponent c) { comp = c; setAreas(); setLabels(); setBackGround(); translateAreas(); setContent(); } public void setRest() {} public PMAreasGroup getContentGroup() { return content; } public Vector<BackGroundDrawer> getBackgroundDrawers() { return bgDrawers; } public void setEntity(Entity e) { Aero t = (Aero) e; int armor = t.getCapArmor(); int armorO = t.getCap0Armor(); armorVLabel.setValue(Integer.toString(armor)); if (t.getGame().getOptions().booleanOption("aero_sanity")) { armor = (int) Math.ceil(armor / 10.0); armorO = (int) Math.ceil(armorO / 10.0); } drawArmorImage(armorImage, armor, armorO); drawCrits(avCritImage, t.getAvionicsHits()); drawCrits(engineCritImage, t.getEngineHits()); drawCrits(fcsCritImage, t.getFCSHits()); drawCrits(sensorCritImage, t.getSensorHits()); drawCrits(pilotCritImage, t.getCrew().getHits()); } private void setContent() { content.addArea(armorLabel); content.addArea(armorArea); content.addArea(armorVLabel); content.addArea(avCritLabel); content.addArea(engineCritLabel); content.addArea(fcsCritLabel); content.addArea(sensorCritLabel); content.addArea(pilotCritLabel); content.addArea(avCritArea); content.addArea(engineCritArea); content.addArea(fcsCritArea); content.addArea(sensorCritArea); content.addArea(pilotCritArea); } private void setAreas() { armorImage = comp.createImage(armorCols * (squareSize + 1), armorRows * (squareSize + 1)); armorArea = new PMPicArea(armorImage); avCritImage = comp.createImage(3 * (squareSize + 1), squareSize + 1); avCritArea = new PMPicArea(avCritImage); engineCritImage = comp.createImage(3 * (squareSize + 1), squareSize + 1); engineCritArea = new PMPicArea(engineCritImage); fcsCritImage = comp.createImage(3 * (squareSize + 1), squareSize + 1); fcsCritArea = new PMPicArea(fcsCritImage); sensorCritImage = comp.createImage(3 * (squareSize + 1), squareSize + 1); sensorCritArea = new PMPicArea(sensorCritImage); pilotCritImage = comp.createImage(6 * (squareSize + 1), squareSize + 1); pilotCritArea = new PMPicArea(pilotCritImage); } private void setLabels() { FontMetrics fm = comp.getFontMetrics(FONT_LABEL); armorLabel = new PMSimpleLabel("Armor:", fm, Color.white); armorVLabel = new PMValueLabel(fm, Color.red.brighter()); avCritLabel = new PMSimpleLabel("Avionics:", fm, Color.white); // $NON-NLS-1$ engineCritLabel = new PMSimpleLabel("Engine:", fm, Color.white); // $NON-NLS-1$ fcsCritLabel = new PMSimpleLabel("FCS:", fm, Color.white); // $NON-NLS-1$ sensorCritLabel = new PMSimpleLabel("Sensors:", fm, Color.white); // $NON-NLS-1$ pilotCritLabel = new PMSimpleLabel("Pilot hits:", fm, Color.white); // $NON-NLS-1$ } private void setBackGround() { Image tile = comp.getToolkit() .getImage(new File(Configuration.widgetsDir(), "tile.gif").toString()); // $NON-NLS-1$ PMUtil.setImage(tile, comp); int b = BackGroundDrawer.TILING_BOTH; bgDrawers.addElement(new BackGroundDrawer(tile, b)); b = BackGroundDrawer.TILING_HORIZONTAL | BackGroundDrawer.VALIGN_TOP; tile = comp.getToolkit() .getImage(new File(Configuration.widgetsDir(), "h_line.gif").toString()); // $NON-NLS-1$ PMUtil.setImage(tile, comp); bgDrawers.addElement(new BackGroundDrawer(tile, b)); b = BackGroundDrawer.TILING_HORIZONTAL | BackGroundDrawer.VALIGN_BOTTOM; tile = comp.getToolkit() .getImage(new File(Configuration.widgetsDir(), "h_line.gif").toString()); // $NON-NLS-1$ PMUtil.setImage(tile, comp); bgDrawers.addElement(new BackGroundDrawer(tile, b)); b = BackGroundDrawer.TILING_VERTICAL | BackGroundDrawer.HALIGN_LEFT; tile = comp.getToolkit() .getImage(new File(Configuration.widgetsDir(), "v_line.gif").toString()); // $NON-NLS-1$ PMUtil.setImage(tile, comp); bgDrawers.addElement(new BackGroundDrawer(tile, b)); b = BackGroundDrawer.TILING_VERTICAL | BackGroundDrawer.HALIGN_RIGHT; tile = comp.getToolkit() .getImage(new File(Configuration.widgetsDir(), "v_line.gif").toString()); // $NON-NLS-1$ PMUtil.setImage(tile, comp); bgDrawers.addElement(new BackGroundDrawer(tile, b)); b = BackGroundDrawer.NO_TILING | BackGroundDrawer.VALIGN_TOP | BackGroundDrawer.HALIGN_LEFT; tile = comp.getToolkit() .getImage( new File(Configuration.widgetsDir(), "tl_corner.gif").toString()); // $NON-NLS-1$ PMUtil.setImage(tile, comp); bgDrawers.addElement(new BackGroundDrawer(tile, b)); b = BackGroundDrawer.NO_TILING | BackGroundDrawer.VALIGN_BOTTOM | BackGroundDrawer.HALIGN_LEFT; tile = comp.getToolkit() .getImage( new File(Configuration.widgetsDir(), "bl_corner.gif").toString()); // $NON-NLS-1$ PMUtil.setImage(tile, comp); bgDrawers.addElement(new BackGroundDrawer(tile, b)); b = BackGroundDrawer.NO_TILING | BackGroundDrawer.VALIGN_TOP | BackGroundDrawer.HALIGN_RIGHT; tile = comp.getToolkit() .getImage( new File(Configuration.widgetsDir(), "tr_corner.gif").toString()); // $NON-NLS-1$ PMUtil.setImage(tile, comp); bgDrawers.addElement(new BackGroundDrawer(tile, b)); b = BackGroundDrawer.NO_TILING | BackGroundDrawer.VALIGN_BOTTOM | BackGroundDrawer.HALIGN_RIGHT; tile = comp.getToolkit() .getImage( new File(Configuration.widgetsDir(), "br_corner.gif").toString()); // $NON-NLS-1$ PMUtil.setImage(tile, comp); bgDrawers.addElement(new BackGroundDrawer(tile, b)); } private void translateAreas() { armorLabel.translate(0, 0); armorArea.translate(0, squareSize); armorVLabel.translate( (armorCols * (squareSize + 1)) / 2, squareSize + (armorRows * (squareSize + 1)) / 2); avCritLabel.translate(5 + armorCols * (squareSize + 1), stepY); engineCritLabel.translate(5 + armorCols * (squareSize + 1), 2 * stepY); fcsCritLabel.translate(5 + armorCols * (squareSize + 1), 3 * stepY); sensorCritLabel.translate(5 + armorCols * (squareSize + 1), 4 * stepY); pilotCritLabel.translate(5 + armorCols * (squareSize + 1), 5 * stepY); avCritArea.translate( 10 + pilotCritLabel.width + armorCols * (squareSize + 1), stepY - (squareSize + 1)); engineCritArea.translate( 10 + pilotCritLabel.width + armorCols * (squareSize + 1), 2 * stepY - (squareSize + 1)); fcsCritArea.translate( 10 + pilotCritLabel.width + armorCols * (squareSize + 1), 3 * stepY - (squareSize + 1)); sensorCritArea.translate( 10 + pilotCritLabel.width + armorCols * (squareSize + 1), 4 * stepY - (squareSize + 1)); pilotCritArea.translate( 10 + pilotCritLabel.width + armorCols * (squareSize + 1), 5 * stepY - (squareSize + 1)); } private void drawCrits(Image im, int crits) { int w = im.getWidth(null); int h = im.getHeight(null); Graphics g = im.getGraphics(); g.setColor(Color.black); g.fillRect(0, 0, w, h); for (int i = 0; i < crits; i++) { g.setColor(Color.red.darker()); g.fillRect(i * (squareSize + 1), 0, squareSize, squareSize); } } // Redraws armor images private void drawArmorImage(Image im, int a, int initial) { int w = im.getWidth(null); int h = im.getHeight(null); Graphics g = im.getGraphics(); g.setColor(Color.gray); g.fillRect(0, 0, w, h); // first fill up the initial armor area with black for (int i = 0; i < initial; i++) { // 6 across and 8 down int row = i / armorRows; int column = i - row * armorRows; g.setColor(Color.black); g.fillRect( row * (squareSize + 1), column * (squareSize + 1), (squareSize + 1), (squareSize + 1)); } for (int i = 0; i < a; i++) { int row = i / armorRows; int column = i - row * armorRows; g.setColor(Color.green.darker()); g.fillRect(row * (squareSize + 1), column * (squareSize + 1), squareSize, squareSize); } } }
@Override public StringBuffer getTooltip() { // Tooltip info for a sensor blip if (onlyDetectedBySensors()) return new StringBuffer(Messages.getString("BoardView1.sensorReturn")); // No sensor blip... Infantry thisInfantry = null; if (entity instanceof Infantry) thisInfantry = (Infantry) entity; GunEmplacement thisGunEmp = null; if (entity instanceof GunEmplacement) thisGunEmp = (GunEmplacement) entity; Aero thisAero = null; if (entity instanceof Aero) thisAero = (Aero) entity; tooltipString = new StringBuffer(); // Unit Chassis and Player addToTT( "Unit", NOBR, Integer.toHexString(PlayerColors.getColorRGB(entity.getOwner().getColorIndex())), entity.getChassis(), entity.getOwner().getName()); // Pilot Info // Nickname > Name > "Pilot" String pnameStr = "Pilot"; if ((entity.getCrew().getName() != null) && !entity.getCrew().getName().equals("")) pnameStr = entity.getCrew().getName(); if ((entity.getCrew().getNickname() != null) && !entity.getCrew().getNickname().equals("")) pnameStr = "'" + entity.getCrew().getNickname() + "'"; addToTT("Pilot", BR, pnameStr, entity.getCrew().getGunnery(), entity.getCrew().getPiloting()); // Pilot Status if (!entity.getCrew().getStatusDesc().equals("")) addToTT("PilotStatus", NOBR, entity.getCrew().getStatusDesc()); // Pilot Advantages int numAdv = entity.getCrew().countOptions(PilotOptions.LVL3_ADVANTAGES); if (numAdv == 1) addToTT("Adv1", NOBR, numAdv); else if (numAdv > 1) addToTT("Advs", NOBR, numAdv); // Pilot Manei Domini if ((entity.getCrew().countOptions(PilotOptions.MD_ADVANTAGES) > 0)) addToTT("MD", NOBR); // Unit movement ability if (thisGunEmp == null) { addToTT("Movement", BR, entity.getWalkMP(), entity.getRunMPasString()); if (entity.getJumpMP() > 0) tooltipString.append("/" + entity.getJumpMP()); } // Armor and Internals addToTT("ArmorInternals", BR, entity.getTotalArmor(), entity.getTotalInternal()); // Heat, not shown for units with 999 heat sinks (vehicles) if (entity.getHeatCapacity() != 999) { if (entity.heat == 0) addToTT("Heat0", BR); else addToTT("Heat", BR, entity.heat); } // Actual Movement if (thisGunEmp == null) { // In the Movement Phase, unit not done if (!entity.isDone() && this.bv.game.getPhase() == Phase.PHASE_MOVEMENT) { // "Has not yet moved" only during movement phase addToTT("NotYetMoved", BR); // In the Movement Phase, unit is done - or in the Firing Phase } else if ((entity.isDone() && this.bv.game.getPhase() == Phase.PHASE_MOVEMENT) || this.bv.game.getPhase() == Phase.PHASE_FIRING) { int tmm = Compute.getTargetMovementModifier(bv.game, entity.getId()).getValue(); // Unit didn't move if (entity.moved == EntityMovementType.MOVE_NONE) { addToTT("NoMove", BR, tmm); // Unit did move } else { // Colored arrow // get the color resource String guipName = "AdvancedMoveDefaultColor"; if ((entity.moved == EntityMovementType.MOVE_RUN) || (entity.moved == EntityMovementType.MOVE_VTOL_RUN) || (entity.moved == EntityMovementType.MOVE_OVER_THRUST)) guipName = "AdvancedMoveRunColor"; else if (entity.moved == EntityMovementType.MOVE_SPRINT) guipName = "AdvancedMoveSprintColor"; else if (entity.moved == EntityMovementType.MOVE_JUMP) guipName = "AdvancedMoveJumpColor"; // HTML color String from Preferences String moveTypeColor = Integer.toHexString( GUIPreferences.getInstance().getColor(guipName).getRGB() & 0xFFFFFF); // Arrow addToTT("Arrow", BR, moveTypeColor); // Actual movement and modifier addToTT( "MovementF", NOBR, entity.getMovementString(entity.moved), entity.delta_distance, tmm); } // Special Moves if (entity.isEvading()) addToTT("Evade", NOBR); if ((thisInfantry != null) && (thisInfantry.isTakingCover())) addToTT("TakingCover", NOBR); if (entity.isCharging()) addToTT("Charging", NOBR); if (entity.isMakingDfa()) addToTT("DFA", NOBR); } } // ASF Velocity if (thisAero != null) { addToTT("AeroVelocity", BR, thisAero.getCurrentVelocity()); } // Gun Emplacement Status if (thisGunEmp != null) { if (thisGunEmp.isTurret() && thisGunEmp.isTurretLocked(thisGunEmp.getLocTurret())) addToTT("TurretLocked", BR); } // Unit Immobile if ((thisGunEmp == null) && (entity.isImmobile())) addToTT("Immobile", BR); if (entity.isHiddenActivating()) { addToTT( "HiddenActivating", BR, IGame.Phase.getDisplayableName(entity.getHiddenActivationPhase())); } else if (entity.isHidden()) { addToTT("Hidden", BR); } // Jammed by ECM if (isAffectedByECM()) { addToTT("Jammed", BR); } // If DB, add information about who sees this Entity if (bv.game.getOptions().booleanOption("double_blind")) { StringBuffer playerList = new StringBuffer(); boolean teamVision = bv.game.getOptions().booleanOption("team_vision"); for (IPlayer player : entity.getWhoCanSee()) { if (player.isEnemyOf(entity.getOwner()) || !teamVision) { playerList.append(player.getName()); playerList.append(", "); } } if (playerList.length() > 1) { playerList.delete(playerList.length() - 2, playerList.length()); addToTT("SeenBy", BR, playerList.toString()); } } // If sensors, display what sensors this unit is using if (bv.game.getOptions().booleanOption("tacops_sensors")) { addToTT("Sensors", BR, entity.getSensorDesc()); } // Weapon List if (GUIPreferences.getInstance().getBoolean(GUIPreferences.SHOW_WPS_IN_TT)) { ArrayList<Mounted> weapons = entity.getWeaponList(); HashMap<String, Integer> wpNames = new HashMap<String, Integer>(); // Gather names, counts, Clan/IS // When clan then the number will be stored as negative for (Mounted curWp : weapons) { String weapDesc = curWp.getDesc(); // Append ranges WeaponType wtype = (WeaponType) curWp.getType(); int ranges[]; if (entity instanceof Aero) { ranges = wtype.getATRanges(); } else { ranges = wtype.getRanges(curWp); } String rangeString = "("; if ((ranges[RangeType.RANGE_MINIMUM] != WeaponType.WEAPON_NA) && (ranges[RangeType.RANGE_MINIMUM] != 0)) { rangeString += ranges[RangeType.RANGE_MINIMUM] + "/"; } else { rangeString += "-/"; } int maxRange = RangeType.RANGE_LONG; if (bv.game.getOptions().booleanOption(OptionsConstants.AC_TAC_OPS_RANGE)) { maxRange = RangeType.RANGE_EXTREME; } for (int i = RangeType.RANGE_SHORT; i <= maxRange; i++) { rangeString += ranges[i]; if (i != maxRange) { rangeString += "/"; } } weapDesc += rangeString + ")"; if (wpNames.containsKey(weapDesc)) { int number = wpNames.get(weapDesc); if (number > 0) wpNames.put(weapDesc, number + 1); else wpNames.put(weapDesc, number - 1); } else { WeaponType wpT = ((WeaponType) curWp.getType()); if (entity.isClan() && TechConstants.isClan(wpT.getTechLevel(entity.getYear()))) wpNames.put(weapDesc, -1); else wpNames.put(weapDesc, 1); } } // Print to Tooltip tooltipString.append("<FONT SIZE=\"-2\">"); for (Entry<String, Integer> entry : wpNames.entrySet()) { // Check if weapon is destroyed, text gray and strikethrough if so, remove the "x "/"*" // Also remove "+", means currently selected for firing boolean wpDest = false; String nameStr = entry.getKey(); if (entry.getKey().startsWith("x ")) { nameStr = entry.getKey().substring(2, entry.getKey().length()); wpDest = true; } if (entry.getKey().startsWith("*")) { nameStr = entry.getKey().substring(1, entry.getKey().length()); wpDest = true; } if (entry.getKey().startsWith("+")) { nameStr = entry.getKey().substring(1, entry.getKey().length()); nameStr = nameStr.concat(" <I>(Firing)</I>"); } // normal coloring tooltipString.append("<FONT COLOR=#8080FF>"); // but: color gray and strikethrough when weapon destroyed if (wpDest) tooltipString.append("<FONT COLOR=#a0a0a0><S>"); String clanStr = ""; if (entry.getValue() < 0) clanStr = Messages.getString("BoardView1.Tooltip.Clan"); // when more than 5 weapons are present, they will be grouped // and listed with a multiplier if (weapons.size() > 5) { addToTT("WeaponN", BR, Math.abs(entry.getValue()), clanStr, nameStr); } else { // few weapons: list each weapon separately for (int i = 0; i < Math.abs(entry.getValue()); i++) { addToTT("Weapon", BR, Math.abs(entry.getValue()), clanStr, nameStr); } } // Weapon destroyed? End strikethrough if (wpDest) tooltipString.append("</S>"); tooltipString.append("</FONT>"); } tooltipString.append("</FONT>"); } return tooltipString; }
/** * Class which keeps set of all areas required to represent Protomech unit in MechDisplay.ArmorPanel * class. */ public class ProtomechMapSet implements DisplayMapSet { // Boring list of labels. private PMValueLabel[] sectionLabels = new PMValueLabel[Protomech.NUM_PMECH_LOCATIONS]; private PMValueLabel[] armorLabels = new PMValueLabel[Protomech.NUM_PMECH_LOCATIONS]; private PMValueLabel[] internalLabels = new PMValueLabel[Protomech.NUM_PMECH_LOCATIONS]; private PMSimplePolygonArea[] areas = new PMSimplePolygonArea[Protomech.NUM_PMECH_LOCATIONS]; private Polygon head = new Polygon( new int[] {50, 50, 60, 80, 90, 90, 80, 60}, new int[] {40, 20, 10, 10, 20, 40, 50, 50}, 8); private Polygon mainGun = new Polygon(new int[] {20, 20, 50, 50}, new int[] {30, 0, 0, 30}, 4); private Polygon leftArm = new Polygon( new int[] {0, 0, 20, 30, 40, 30, 20, 20, 10}, new int[] {100, 40, 30, 30, 60, 60, 70, 110, 110}, 9); private Polygon rightArm = new Polygon( new int[] {120, 120, 110, 100, 110, 120, 140, 140, 130}, new int[] {110, 70, 60, 60, 30, 30, 40, 100, 110, 110}, 9); private Polygon torso = new Polygon( new int[] {40, 40, 30, 50, 50, 60, 80, 90, 90, 110, 100, 100}, new int[] {130, 60, 30, 30, 40, 50, 50, 40, 30, 30, 60, 130}, 12); private Polygon legs = new Polygon( new int[] { 0, 0, 10, 30, 30, 40, 100, 110, 110, 130, 140, 140, 100, 90, 90, 80, 60, 50, 50, 40 }, new int[] { 240, 230, 220, 220, 160, 130, 130, 160, 220, 220, 230, 240, 240, 230, 190, 170, 170, 190, 230, 240 }, 20); // Reference to Component (required for Image handling) private JComponent comp; // Content group which will be sent to PicMap component private PMAreasGroup content = new PMAreasGroup(); // Set of Backgrpund drawers which will be sent to PicMap component private Vector<BackGroundDrawer> bgDrawers = new Vector<BackGroundDrawer>(); private static final Font FONT_VALUE = new Font( "SansSerif", Font.PLAIN, GUIPreferences.getInstance() .getInt("AdvancedMechDisplayArmorLargeFontSize")); // $NON-NLS-1$ /** This constructor have to be called anly from addNotify() method */ public ProtomechMapSet(JComponent c) { comp = c; setAreas(); setBackGround(); } /* * * Set the armor diagram on the mapset. */ private void setAreas() { areas[Protomech.LOC_HEAD] = new PMSimplePolygonArea(head); areas[Protomech.LOC_LEG] = new PMSimplePolygonArea(legs); areas[Protomech.LOC_LARM] = new PMSimplePolygonArea(leftArm); areas[Protomech.LOC_RARM] = new PMSimplePolygonArea(rightArm); areas[Protomech.LOC_TORSO] = new PMSimplePolygonArea(torso); areas[Protomech.LOC_MAINGUN] = new PMSimplePolygonArea(mainGun); for (int i = 0; i <= 5; i++) { content.addArea(areas[i]); } FontMetrics fm = comp.getFontMetrics(FONT_VALUE); for (int i = 0; i < Protomech.NUM_PMECH_LOCATIONS; i++) { sectionLabels[i] = new PMValueLabel(fm, Color.black); content.addArea(sectionLabels[i]); armorLabels[i] = new PMValueLabel(fm, Color.yellow.brighter()); content.addArea(armorLabels[i]); internalLabels[i] = new PMValueLabel(fm, Color.red.brighter()); content.addArea(internalLabels[i]); } sectionLabels[0].moveTo(70, 30); armorLabels[0].moveTo(60, 45); internalLabels[0].moveTo(80, 45); sectionLabels[1].moveTo(70, 70); armorLabels[1].moveTo(70, 85); internalLabels[1].moveTo(70, 100); sectionLabels[2].moveTo(125, 55); armorLabels[2].moveTo(125, 70); internalLabels[2].moveTo(125, 85); sectionLabels[3].moveTo(15, 55); armorLabels[3].moveTo(15, 70); internalLabels[3].moveTo(15, 85); sectionLabels[4].moveTo(70, 150); armorLabels[4].moveTo(60, 165); internalLabels[4].moveTo(80, 165); sectionLabels[5].moveTo(35, 15); armorLabels[5].moveTo(25, 30); internalLabels[5].moveTo(45, 30); } public PMAreasGroup getContentGroup() { return content; } public Vector<BackGroundDrawer> getBackgroundDrawers() { return bgDrawers; } /** * Show the diagram for the given Protomech. * * @param entity - the <code>Entity</code> to be displayed. This should be a <code>Protomech * </code> unit. */ public void setEntity(Entity entity) { Protomech proto = (Protomech) entity; int loc = proto.locations(); if (loc != Protomech.NUM_PMECH_LOCATIONS) { armorLabels[5].setVisible(false); internalLabels[5].setVisible(false); sectionLabels[5].setVisible(false); } else { armorLabels[5].setVisible(true); internalLabels[5].setVisible(true); sectionLabels[5].setVisible(true); } for (int i = 0; i < loc; i++) { // armor = proto.getArmor(i); // internal = proto.getInternal(i); armorLabels[i].setValue(proto.getArmorString(i)); internalLabels[i].setValue(proto.getInternalString(i)); sectionLabels[i].setValue(proto.getLocationAbbr(i)); } } /* * * Sets the background on the mapset. */ private void setBackGround() { Image tile = comp.getToolkit() .getImage(new File(Configuration.widgetsDir(), "tile.gif").toString()); // $NON-NLS-1$ PMUtil.setImage(tile, comp); int b = BackGroundDrawer.TILING_BOTH; bgDrawers.addElement(new BackGroundDrawer(tile, b)); b = BackGroundDrawer.TILING_HORIZONTAL | BackGroundDrawer.VALIGN_TOP; tile = comp.getToolkit() .getImage(new File(Configuration.widgetsDir(), "h_line.gif").toString()); // $NON-NLS-1$ PMUtil.setImage(tile, comp); bgDrawers.addElement(new BackGroundDrawer(tile, b)); b = BackGroundDrawer.TILING_HORIZONTAL | BackGroundDrawer.VALIGN_BOTTOM; tile = comp.getToolkit() .getImage(new File(Configuration.widgetsDir(), "h_line.gif").toString()); // $NON-NLS-1$ PMUtil.setImage(tile, comp); bgDrawers.addElement(new BackGroundDrawer(tile, b)); b = BackGroundDrawer.TILING_VERTICAL | BackGroundDrawer.HALIGN_LEFT; tile = comp.getToolkit() .getImage(new File(Configuration.widgetsDir(), "v_line.gif").toString()); // $NON-NLS-1$ PMUtil.setImage(tile, comp); bgDrawers.addElement(new BackGroundDrawer(tile, b)); b = BackGroundDrawer.TILING_VERTICAL | BackGroundDrawer.HALIGN_RIGHT; tile = comp.getToolkit() .getImage(new File(Configuration.widgetsDir(), "v_line.gif").toString()); // $NON-NLS-1$ PMUtil.setImage(tile, comp); bgDrawers.addElement(new BackGroundDrawer(tile, b)); b = BackGroundDrawer.NO_TILING | BackGroundDrawer.VALIGN_TOP | BackGroundDrawer.HALIGN_LEFT; tile = comp.getToolkit() .getImage( new File(Configuration.widgetsDir(), "tl_corner.gif").toString()); // $NON-NLS-1$ PMUtil.setImage(tile, comp); bgDrawers.addElement(new BackGroundDrawer(tile, b)); b = BackGroundDrawer.NO_TILING | BackGroundDrawer.VALIGN_BOTTOM | BackGroundDrawer.HALIGN_LEFT; tile = comp.getToolkit() .getImage( new File(Configuration.widgetsDir(), "bl_corner.gif").toString()); // $NON-NLS-1$ PMUtil.setImage(tile, comp); bgDrawers.addElement(new BackGroundDrawer(tile, b)); b = BackGroundDrawer.NO_TILING | BackGroundDrawer.VALIGN_TOP | BackGroundDrawer.HALIGN_RIGHT; tile = comp.getToolkit() .getImage( new File(Configuration.widgetsDir(), "tr_corner.gif").toString()); // $NON-NLS-1$ PMUtil.setImage(tile, comp); bgDrawers.addElement(new BackGroundDrawer(tile, b)); b = BackGroundDrawer.NO_TILING | BackGroundDrawer.VALIGN_BOTTOM | BackGroundDrawer.HALIGN_RIGHT; tile = comp.getToolkit() .getImage( new File(Configuration.widgetsDir(), "br_corner.gif").toString()); // $NON-NLS-1$ PMUtil.setImage(tile, comp); bgDrawers.addElement(new BackGroundDrawer(tile, b)); } }
/** * Creates the sprite for this entity. Fortunately it is no longer an extra pain to create * transparent images in AWT. */ @Override public void prepare() { final IBoard board = bv.game.getBoard(); // recalculate bounds & label getBounds(); // create image for buffer GraphicsConfiguration config = GraphicsEnvironment.getLocalGraphicsEnvironment() .getDefaultScreenDevice() .getDefaultConfiguration(); image = config.createCompatibleImage(bounds.width, bounds.height, Transparency.TRANSLUCENT); Graphics2D graph = (Graphics2D) image.getGraphics(); GUIPreferences.AntiAliasifSet(graph); // translate everything (=correction for label placement) graph.translate(-hexOrigin.x, -hexOrigin.y); if (!bv.useIsometric()) { // The entity sprite is drawn when the hexes are rendered. // So do not include the sprite info here. if (onlyDetectedBySensors()) { graph.drawImage(bv.getScaledImage(radarBlipImage, true), 0, 0, this); } else { // draw the unit icon translucent if: // hidden from the enemy (and activated graphics setting); or // submerged boolean translucentHiddenUnits = GUIPreferences.getInstance() .getBoolean(GUIPreferences.ADVANCED_TRANSLUCENT_HIDDEN_UNITS); boolean shouldBeTranslucent = (trackThisEntitiesVisibilityInfo(entity) && !entity.isVisibleToEnemy()) || entity.isHidden(); if ((shouldBeTranslucent && translucentHiddenUnits) || (entity.relHeight() < 0)) { graph.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f)); } graph.drawImage( bv.getScaledImage(bv.tileManager.imageFor(entity, secondaryPos), true), 0, 0, this); graph.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f)); } } // scale the following draws according to board zoom graph.scale(bv.scale, bv.scale); boolean isInfantry = (entity instanceof Infantry); boolean isAero = (entity instanceof Aero); if ((isAero && ((Aero) entity).isSpheroid() && !board.inSpace()) && (secondaryPos == 1)) { graph.setColor(Color.WHITE); graph.draw(bv.facingPolys[entity.getFacing()]); } if ((secondaryPos == -1) || (secondaryPos == 6)) { // Gather unit conditions ArrayList<Status> stStr = new ArrayList<Status>(); criticalStatus = false; // Determine if the entity has a locked turret, // and if it is a gun emplacement boolean turretLocked = false; int crewStunned = 0; boolean ge = false; if (entity instanceof Tank) { turretLocked = !((Tank) entity).hasNoTurret() && !entity.canChangeSecondaryFacing(); crewStunned = ((Tank) entity).getStunnedTurns(); ge = entity instanceof GunEmplacement; } // draw elevation/altitude if non-zero if (entity.isAirborne()) { if (!board.inSpace()) { stStr.add(new Status(Color.CYAN, "A", SMALL)); stStr.add(new Status(Color.CYAN, Integer.toString(entity.getAltitude()), SMALL)); } } else if (entity.getElevation() != 0) { stStr.add(new Status(Color.CYAN, Integer.toString(entity.getElevation()), SMALL)); } // Shutdown if (entity.isManualShutdown()) { stStr.add(new Status(Color.YELLOW, "SHUTDOWN")); } else if (entity.isShutDown()) { stStr.add(new Status(Color.RED, "SHUTDOWN")); } // Prone, Hulldown, Stuck, Immobile, Jammed if (entity.isProne()) stStr.add(new Status(Color.RED, "PRONE")); if (entity.isHiddenActivating()) stStr.add(new Status(Color.RED, "ACTIVATING")); if (entity.isHidden()) stStr.add(new Status(Color.RED, "HIDDEN")); if (entity.isHullDown()) stStr.add(new Status(Color.ORANGE, "HULLDOWN")); if ((entity.isStuck())) stStr.add(new Status(Color.ORANGE, "STUCK")); if (!ge && entity.isImmobile()) stStr.add(new Status(Color.RED, "IMMOBILE")); if (isAffectedByECM()) stStr.add(new Status(Color.YELLOW, "Jammed")); // Turret Lock if (turretLocked) stStr.add(new Status(Color.YELLOW, "LOCKED")); // Grappling & Swarming if (entity.getGrappled() != Entity.NONE) { if (entity.isGrappleAttacker()) { stStr.add(new Status(Color.YELLOW, "GRAPPLER")); } else { stStr.add(new Status(Color.RED, "GRAPPLED")); } } if (entity.getSwarmAttackerId() != Entity.NONE) { stStr.add(new Status(Color.RED, "SWARMED")); } // Transporting if ((entity.getLoadedUnits()).size() > 0) { stStr.add(new Status(Color.YELLOW, "T", SMALL)); } // Hidden, Unseen Unit if (trackThisEntitiesVisibilityInfo(entity)) { if (!entity.isEverSeenByEnemy()) { stStr.add(new Status(Color.GREEN, "U", SMALL)); } else if (!entity.isVisibleToEnemy()) { stStr.add(new Status(Color.GREEN, "H", SMALL)); } } // Crew if (entity.getCrew().isDead()) stStr.add(new Status(Color.RED, "CrewDead")); if (crewStunned > 0) { stStr.add(new Status(Color.YELLOW, "STUNNED", new Object[] {crewStunned})); } // Infantry if (isInfantry) { int dig = ((Infantry) entity).getDugIn(); if (dig == Infantry.DUG_IN_COMPLETE) { stStr.add(new Status(Color.PINK, "D", SMALL)); } else if (dig != Infantry.DUG_IN_NONE) { stStr.add(new Status(Color.YELLOW, "Working", DIRECT)); stStr.add(new Status(Color.PINK, "D", SMALL)); } else if (((Infantry) entity).isTakingCover()) { stStr.add(new Status(Color.YELLOW, "TakingCover")); } } // Aero if (isAero) { Aero a = (Aero) entity; if (a.isRolled()) stStr.add(new Status(Color.YELLOW, "ROLLED")); if (a.getFuel() <= 0) stStr.add(new Status(Color.RED, "FUEL")); if (a.isEvading()) stStr.add(new Status(Color.GREEN, "EVADE")); if (a.isOutControlTotal() & a.isRandomMove()) { stStr.add(new Status(Color.RED, "RANDOM")); } else if (a.isOutControlTotal()) { stStr.add(new Status(Color.RED, "CONTROL")); } } if (GUIPreferences.getInstance().getShowDamageLevel()) { Color damageColor = getDamageColor(); if (damageColor != null) { stStr.add(new Status(damageColor, 0, SMALL)); } } // Unit Label // no scaling for the label, its size is changed by varying // the font size directly => better control graph.scale(1 / bv.scale, 1 / bv.scale); // Label background if (criticalStatus) { graph.setColor(LABEL_CRITICAL_BACK); } else { graph.setColor(LABEL_BACK); } graph.fillRoundRect(labelRect.x, labelRect.y, labelRect.width, labelRect.height, 5, 10); // Label text graph.setFont(labelFont); Color textColor = LABEL_TEXT_COLOR; if (!entity.isDone() && !onlyDetectedBySensors()) { textColor = GUIPreferences.getInstance().getColor(GUIPreferences.ADVANCED_UNITOVERVIEW_VALID_COLOR); } if (isSelected) { textColor = GUIPreferences.getInstance() .getColor(GUIPreferences.ADVANCED_UNITOVERVIEW_SELECTED_COLOR); } bv.drawCenteredText( graph, getAdjShortName(), labelRect.x + labelRect.width / 2, labelRect.y + labelRect.height / 2 - 1, textColor, (entity.isDone() && !onlyDetectedBySensors())); // Past here, everything is drawing status that shouldn't be seen // on a sensor return, so we'll just quit here if (onlyDetectedBySensors()) { graph.dispose(); return; } // Draw all the status information now drawStatusStrings(graph, stStr); // from here, scale the following draws according to board zoom graph.scale(bv.scale, bv.scale); // draw facing graph.setColor(Color.white); if ((entity.getFacing() != -1) && !(isInfantry && !((Infantry) entity).hasFieldGun() && !((Infantry) entity).isTakingCover()) && !(isAero && ((Aero) entity).isSpheroid() && !board.inSpace())) { graph.draw(bv.facingPolys[entity.getFacing()]); } // determine secondary facing for non-mechs & flipped arms int secFacing = entity.getFacing(); if (!((entity instanceof Mech) || (entity instanceof Protomech))) { secFacing = entity.getSecondaryFacing(); } else if (entity.getArmsFlipped()) { secFacing = (entity.getFacing() + 3) % 6; } // draw red secondary facing arrow if necessary if ((secFacing != -1) && (secFacing != entity.getFacing())) { graph.setColor(Color.red); graph.draw(bv.facingPolys[secFacing]); } if ((entity instanceof Aero) && this.bv.game.useVectorMove()) { for (int head : entity.getHeading()) { graph.setColor(Color.red); graph.draw(bv.facingPolys[head]); } } // armor and internal status bars int baseBarLength = 23; int barLength = 0; double percentRemaining = 0.00; percentRemaining = entity.getArmorRemainingPercent(); barLength = (int) (baseBarLength * percentRemaining); graph.setColor(Color.darkGray); graph.fillRect(56, 7, 23, 3); graph.setColor(Color.lightGray); graph.fillRect(55, 6, 23, 3); graph.setColor(getStatusBarColor(percentRemaining)); graph.fillRect(55, 6, barLength, 3); if (!ge) { // Gun emplacements don't have internal structure percentRemaining = entity.getInternalRemainingPercent(); barLength = (int) (baseBarLength * percentRemaining); graph.setColor(Color.darkGray); graph.fillRect(56, 11, 23, 3); graph.setColor(Color.lightGray); graph.fillRect(55, 10, 23, 3); graph.setColor(getStatusBarColor(percentRemaining)); graph.fillRect(55, 10, barLength, 3); } } graph.dispose(); }
/** Set of elements to reperesent pilot information in MechDisplay */ public class PilotMapSet implements DisplayMapSet { private static String STAR3 = "***"; // $NON-NLS-1$ private static int N_ADV = 35; private JComponent comp; private PMAreasGroup content = new PMAreasGroup(); private PMPicArea portraitArea; private PMSimpleLabel nameL, nickL, pilotL, gunneryL, gunneryLL, gunneryML, gunneryBL, toughBL, initBL, commandBL; private PMSimpleLabel pilotR, gunneryR, gunneryLR, gunneryMR, gunneryBR, toughBR, initBR, commandBR, hitsR; private PMSimpleLabel[] advantagesR; private Vector<BackGroundDrawer> bgDrawers = new Vector<BackGroundDrawer>(); private static final Font FONT_VALUE = new Font( "SansSerif", Font.PLAIN, GUIPreferences.getInstance().getInt("AdvancedMechDisplayLargeFontSize")); // $NON-NLS-1$ private static final Font FONT_TITLE = new Font( "SansSerif", Font.ITALIC, GUIPreferences.getInstance().getInt("AdvancedMechDisplayLargeFontSize")); // $NON-NLS-1$ private int yCoord = 1; // keep track of portrait images private DirectoryItems portraits; /** This constructor have to be called anly from addNotify() method */ public PilotMapSet(JComponent c) { comp = c; try { portraits = new DirectoryItems( Configuration.portraitImagesDir(), "", //$NON-NLS-1$ ImageFileFactory.getInstance()); } catch (Exception e) { portraits = null; } setAreas(); setBackGround(); } // These two methods are used to vertically position new labels on the // display. private int getYCoord() { return (yCoord * 15) - 5; } private int getNewYCoord() { yCoord++; return getYCoord(); } private void setAreas() { portraitArea = new PMPicArea(new BufferedImage(72, 72, BufferedImage.TYPE_BYTE_INDEXED)); content.addArea(portraitArea); yCoord = 6; FontMetrics fm = comp.getFontMetrics(FONT_TITLE); nameL = createLabel( Messages.getString("GeneralInfoMapSet.LocOstLCT"), fm, 0, getYCoord()); // $NON-NLS-1$ nameL.setColor(Color.yellow); content.addArea(nameL); fm = comp.getFontMetrics(FONT_VALUE); nickL = createLabel( Messages.getString("GeneralInfoMapSet.LocOstLCT"), fm, 0, getNewYCoord()); //$NON-NLS-1$ content.addArea(nickL); hitsR = createLabel(STAR3, fm, 0, getNewYCoord()); hitsR.setColor(Color.RED); content.addArea(hitsR); getNewYCoord(); pilotL = createLabel( Messages.getString("PilotMapSet.pilotLAntiMech"), fm, 0, getNewYCoord()); // $NON-NLS-1$ content.addArea(pilotL); pilotR = createLabel(STAR3, fm, pilotL.getSize().width + 5, getYCoord()); content.addArea(pilotR); initBL = createLabel( Messages.getString("PilotMapSet.initBL"), fm, pilotL.getSize().width + 50, getYCoord()); //$NON-NLS-1$ content.addArea(initBL); initBR = createLabel( STAR3, fm, pilotL.getSize().width + 50 + initBL.getSize().width + 15, getYCoord()); content.addArea(initBR); gunneryL = createLabel( Messages.getString("PilotMapSet.gunneryL"), fm, 0, getNewYCoord()); // $NON-NLS-1$ content.addArea(gunneryL); gunneryR = createLabel(STAR3, fm, pilotL.getSize().width + 5, getYCoord()); content.addArea(gunneryR); commandBL = createLabel( Messages.getString("PilotMapSet.commandBL"), fm, pilotL.getSize().width + 50, getYCoord()); //$NON-NLS-1$ content.addArea(commandBL); commandBR = createLabel( STAR3, fm, pilotL.getSize().width + 50 + initBL.getSize().width + 15, getYCoord()); content.addArea(commandBR); gunneryLL = createLabel(Messages.getString("PilotMapSet.gunneryLL"), fm, 0, getYCoord()); // $NON-NLS-1$ content.addArea(gunneryLL); gunneryLR = createLabel(STAR3, fm, pilotL.getSize().width + 25, getYCoord()); content.addArea(gunneryLR); gunneryML = createLabel( Messages.getString("PilotMapSet.gunneryML"), fm, 0, getNewYCoord()); // $NON-NLS-1$ content.addArea(gunneryML); gunneryMR = createLabel(STAR3, fm, pilotL.getSize().width + 25, getYCoord()); content.addArea(gunneryMR); toughBL = createLabel( Messages.getString("PilotMapSet.toughBL"), fm, pilotL.getSize().width + 50, getYCoord()); //$NON-NLS-1$ content.addArea(toughBL); toughBR = createLabel( STAR3, fm, pilotL.getSize().width + 50 + initBL.getSize().width + 15, getYCoord()); content.addArea(toughBR); gunneryBL = createLabel( Messages.getString("PilotMapSet.gunneryBL"), fm, 0, getNewYCoord()); // $NON-NLS-1$ content.addArea(gunneryBL); gunneryBR = createLabel(STAR3, fm, pilotL.getSize().width + 25, getYCoord()); content.addArea(gunneryBR); getNewYCoord(); advantagesR = new PMSimpleLabel[N_ADV]; for (int i = 0; i < advantagesR.length; i++) { advantagesR[i] = createLabel(new Integer(i).toString(), fm, 10, getNewYCoord()); content.addArea(advantagesR[i]); } // DO NOT PLACE ANY MORE LABELS BELOW HERE. They will get // pushed off the bottom of the screen by the pilot advantage // labels. Why not just allocate the number of pilot advantage // labels required instead of a hard 24? Because we don't have // an entity at this point. Bleh. } /** updates fields for the unit */ public void setEntity(Entity en) { if (en instanceof Infantry) { pilotL.setString(Messages.getString("PilotMapSet.pilotLAntiMech")); } else { pilotL.setString(Messages.getString("PilotMapSet.pilotL")); } nameL.setString(en.getCrew().getName()); nickL.setString(en.getCrew().getNickname()); pilotR.setString(Integer.toString(en.getCrew().getPiloting())); gunneryR.setString(Integer.toString(en.getCrew().getGunnery())); if (null != getPortrait(en.getCrew())) { portraitArea.setIdleImage(getPortrait(en.getCrew())); } if ((en.getGame() != null) && en.getGame().getOptions().booleanOption("rpg_gunnery")) { gunneryLR.setString(Integer.toString(en.getCrew().getGunneryL())); gunneryMR.setString(Integer.toString(en.getCrew().getGunneryM())); gunneryBR.setString(Integer.toString(en.getCrew().getGunneryB())); gunneryL.setVisible(false); gunneryR.setVisible(false); gunneryLL.setVisible(true); gunneryLR.setVisible(true); gunneryML.setVisible(true); gunneryMR.setVisible(true); gunneryBL.setVisible(true); gunneryBR.setVisible(true); } else { gunneryLL.setVisible(false); gunneryLR.setVisible(false); gunneryML.setVisible(false); gunneryMR.setVisible(false); gunneryBL.setVisible(false); gunneryBR.setVisible(false); gunneryL.setVisible(true); gunneryR.setVisible(true); } if ((en.getGame() != null) && en.getGame().getOptions().booleanOption("toughness")) { toughBR.setString(Integer.toString(en.getCrew().getToughness())); } else { toughBL.setVisible(false); toughBR.setVisible(false); } if ((en.getGame() != null) && en.getGame().getOptions().booleanOption("individual_initiative")) { initBR.setString(Integer.toString(en.getCrew().getInitBonus())); } else { initBL.setVisible(false); initBR.setVisible(false); } if ((en.getGame() != null) && en.getGame().getOptions().booleanOption("command_init")) { commandBR.setString(Integer.toString(en.getCrew().getCommandBonus())); } else { commandBL.setVisible(false); commandBR.setVisible(false); } hitsR.setString(en.getCrew().getStatusDesc()); for (int i = 0; i < advantagesR.length; i++) { advantagesR[i].setString(""); // $NON-NLS-1$ } int i = 0; for (Enumeration<IOptionGroup> advGroups = en.getCrew().getOptions().getGroups(); advGroups.hasMoreElements(); ) { if (i >= (N_ADV - 1)) { advantagesR[i++].setString(Messages.getString("PilotMapSet.more")); break; } IOptionGroup advGroup = advGroups.nextElement(); if (en.getCrew().countOptions(advGroup.getKey()) > 0) { advantagesR[i++].setString(advGroup.getDisplayableName()); for (Enumeration<IOption> advs = advGroup.getOptions(); advs.hasMoreElements(); ) { if (i >= (N_ADV - 1)) { advantagesR[i++].setString(" " + Messages.getString("PilotMapSet.more")); break; } IOption adv = advs.nextElement(); if (adv.booleanValue()) { advantagesR[i++].setString(" " + adv.getDisplayableNameWithValue()); } } } } } public PMAreasGroup getContentGroup() { return content; } public Vector<BackGroundDrawer> getBackgroundDrawers() { return bgDrawers; } private void setBackGround() { Image tile = comp.getToolkit() .getImage(new File(Configuration.widgetsDir(), "tile.gif").toString()); // $NON-NLS-1$ PMUtil.setImage(tile, comp); int b = BackGroundDrawer.TILING_BOTH; bgDrawers.addElement(new BackGroundDrawer(tile, b)); b = BackGroundDrawer.TILING_HORIZONTAL | BackGroundDrawer.VALIGN_TOP; tile = comp.getToolkit() .getImage(new File(Configuration.widgetsDir(), "h_line.gif").toString()); // $NON-NLS-1$ PMUtil.setImage(tile, comp); bgDrawers.addElement(new BackGroundDrawer(tile, b)); b = BackGroundDrawer.TILING_HORIZONTAL | BackGroundDrawer.VALIGN_BOTTOM; tile = comp.getToolkit() .getImage(new File(Configuration.widgetsDir(), "h_line.gif").toString()); // $NON-NLS-1$ PMUtil.setImage(tile, comp); bgDrawers.addElement(new BackGroundDrawer(tile, b)); b = BackGroundDrawer.TILING_VERTICAL | BackGroundDrawer.HALIGN_LEFT; tile = comp.getToolkit() .getImage(new File(Configuration.widgetsDir(), "v_line.gif").toString()); // $NON-NLS-1$ PMUtil.setImage(tile, comp); bgDrawers.addElement(new BackGroundDrawer(tile, b)); b = BackGroundDrawer.TILING_VERTICAL | BackGroundDrawer.HALIGN_RIGHT; tile = comp.getToolkit() .getImage(new File(Configuration.widgetsDir(), "v_line.gif").toString()); // $NON-NLS-1$ PMUtil.setImage(tile, comp); bgDrawers.addElement(new BackGroundDrawer(tile, b)); b = BackGroundDrawer.NO_TILING | BackGroundDrawer.VALIGN_TOP | BackGroundDrawer.HALIGN_LEFT; tile = comp.getToolkit() .getImage( new File(Configuration.widgetsDir(), "tl_corner.gif").toString()); // $NON-NLS-1$ PMUtil.setImage(tile, comp); bgDrawers.addElement(new BackGroundDrawer(tile, b)); b = BackGroundDrawer.NO_TILING | BackGroundDrawer.VALIGN_BOTTOM | BackGroundDrawer.HALIGN_LEFT; tile = comp.getToolkit() .getImage( new File(Configuration.widgetsDir(), "bl_corner.gif").toString()); // $NON-NLS-1$ PMUtil.setImage(tile, comp); bgDrawers.addElement(new BackGroundDrawer(tile, b)); b = BackGroundDrawer.NO_TILING | BackGroundDrawer.VALIGN_TOP | BackGroundDrawer.HALIGN_RIGHT; tile = comp.getToolkit() .getImage( new File(Configuration.widgetsDir(), "tr_corner.gif").toString()); // $NON-NLS-1$ PMUtil.setImage(tile, comp); bgDrawers.addElement(new BackGroundDrawer(tile, b)); b = BackGroundDrawer.NO_TILING | BackGroundDrawer.VALIGN_BOTTOM | BackGroundDrawer.HALIGN_RIGHT; tile = comp.getToolkit() .getImage( new File(Configuration.widgetsDir(), "br_corner.gif").toString()); // $NON-NLS-1$ PMUtil.setImage(tile, comp); bgDrawers.addElement(new BackGroundDrawer(tile, b)); } private PMSimpleLabel createLabel(String s, FontMetrics fm, int x, int y) { PMSimpleLabel l = new PMSimpleLabel(s, fm, Color.white); l.moveTo(x, y); return l; } /** * Get the portrait for the given pilot. * * @return The <code>Image</code> of the pilot's portrait. This value will be <code>null</code> if * no portrait was selected or if there was an error loading it. */ public Image getPortrait(Crew pilot) { String category = pilot.getPortraitCategory(); String file = pilot.getPortraitFileName(); // Return a null if the player has selected no portrait file. if ((null == category) || (null == file) || (null == portraits)) { return null; } if (Crew.PORTRAIT_NONE.equals(file)) { file = "default.gif"; // $NON-NLS-1$ } if (Crew.ROOT_PORTRAIT.equals(category)) { category = ""; } // Try to get the player's portrait file. Image portrait = null; try { portrait = (Image) portraits.getItem(category, file); if (null == portrait) { // the image could not be found so switch to default one category = ""; file = "default.gif"; portrait = (Image) portraits.getItem(category, file); } // make sure no images are longer than 72 pixels if (null != portrait) { portrait = portrait.getScaledInstance(-1, 72, Image.SCALE_DEFAULT); } } catch (Exception err) { err.printStackTrace(); } return portrait; } }