package games.strategy.triplea.ui; import java.util.Collection; import java.util.Comparator; import java.util.HashMap; import java.util.Optional; import java.util.Set; import java.util.TreeSet; import javax.swing.BoxLayout; import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.JPanel; import games.strategy.engine.data.GameData; import games.strategy.engine.data.NamedAttachable; import games.strategy.engine.data.PlayerID; import games.strategy.engine.data.ProductionRule; import games.strategy.engine.data.RepairRule; import games.strategy.engine.data.Resource; import games.strategy.engine.data.Unit; import games.strategy.engine.data.UnitType; import games.strategy.triplea.attachments.UnitTypeComparator; import games.strategy.triplea.delegate.Matches; import games.strategy.triplea.util.UnitCategory; import games.strategy.util.IntegerMap; /** * A Simple panel that displays a list of units. */ public class SimpleUnitPanel extends JPanel { private static final long serialVersionUID = -3768796793775300770L; private final IUIContext m_uiContext; public SimpleUnitPanel(final IUIContext uiContext) { m_uiContext = uiContext; setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); } /** * @param units * a HashMap in the form ProductionRule -> number of units * assumes that each production rule has 1 result, which is simple the number of units. */ public void setUnitsFromProductionRuleMap(final IntegerMap<ProductionRule> units, final PlayerID player, final GameData data) { removeAll(); final TreeSet<ProductionRule> productionRules = new TreeSet<>(productionRuleComparator); productionRules.addAll(units.keySet()); for (final ProductionRule productionRule : productionRules) { final int quantity = units.getInt(productionRule); for (final NamedAttachable resourceOrUnit : productionRule.getResults().keySet()) { addUnits(player, data, quantity * productionRule.getResults().getInt(resourceOrUnit), resourceOrUnit, false, false); } } } /** * @param units * a HashMap in the form RepairRule -> number of units * assumes that each repair rule has 1 result, which is simply the number of units. */ public void setUnitsFromRepairRuleMap(final HashMap<Unit, IntegerMap<RepairRule>> units, final PlayerID player, final GameData data) { removeAll(); final Set<Unit> entries = units.keySet(); for (final Unit unit : entries) { final IntegerMap<RepairRule> rules = units.get(unit); final TreeSet<RepairRule> repairRules = new TreeSet<>(repairRuleComparator); repairRules.addAll(rules.keySet()); for (final RepairRule repairRule : repairRules) { final int quantity = rules.getInt(repairRule); if (games.strategy.triplea.Properties.getDamageFromBombingDoneToUnitsInsteadOfTerritories(data)) { // check to see if the repair rule matches the damaged unit if (unit.getType().equals((repairRule.getResults().keySet().iterator().next()))) { addUnits(player, data, quantity, unit.getType(), Matches.UnitHasTakenSomeBombingUnitDamage.match(unit), Matches.UnitIsDisabled.match(unit)); } } } } } /** * @param categories * a collection of UnitCategories. */ public void setUnitsFromCategories(final Collection<UnitCategory> categories, final GameData data) { removeAll(); for (final UnitCategory category : categories) { addUnits(category.getOwner(), data, category.getUnits().size(), category.getType(), category.hasDamageOrBombingUnitDamage(), category.getDisabled()); } } private void addUnits(final PlayerID player, final GameData data, final int quantity, final NamedAttachable unit, final boolean damaged, final boolean disabled) { final JLabel label = new JLabel(); label.setText(" x " + quantity); if (unit instanceof UnitType) { final Optional<ImageIcon> icon = m_uiContext.getUnitImageFactory().getIcon((UnitType) unit, player, data, damaged, disabled); if (icon.isPresent()) { label.setIcon(icon.get()); } } else if (unit instanceof Resource) { label.setIcon(m_uiContext.getResourceImageFactory().getIcon((Resource) unit, data, true)); } add(label); } Comparator<ProductionRule> productionRuleComparator = new Comparator<ProductionRule>() { UnitTypeComparator utc = new UnitTypeComparator(); @Override public int compare(final ProductionRule o1, final ProductionRule o2) { if (o1.getResults().size() == 1 && o2.getResults().size() == 1) { final NamedAttachable n1 = o1.getResults().keySet().iterator().next(); final NamedAttachable n2 = o2.getResults().keySet().iterator().next(); if (n1 instanceof UnitType) { final UnitType u1 = (UnitType) n1; if (n2 instanceof UnitType) { final UnitType u2 = (UnitType) n2; return utc.compare(u1, u2); } else if (n2 instanceof Resource) { // final Resource r2 = (Resource) n2; return -1; } return n1.getName().compareTo(n2.getName()); } else if (n1 instanceof Resource) { final Resource r1 = (Resource) n1; if (n2 instanceof UnitType) { // final UnitType u2 = (UnitType) n2; return 1; } else if (n2 instanceof Resource) { final Resource r2 = (Resource) n2; return r1.getName().compareTo(r2.getName()); } else { return n1.getName().compareTo(n2.getName()); } } return n1.getName().compareTo(n2.getName()); } if (o1.getResults().size() > o2.getResults().size()) { return -1; } else if (o1.getResults().size() < o2.getResults().size()) { return 1; } return o1.getName().compareTo(o2.getName()); } }; Comparator<RepairRule> repairRuleComparator = new Comparator<RepairRule>() { UnitTypeComparator utc = new UnitTypeComparator(); @Override public int compare(final RepairRule o1, final RepairRule o2) { if (o1.getResults().size() == 1 && o2.getResults().size() == 1) { final NamedAttachable n1 = o1.getResults().keySet().iterator().next(); final NamedAttachable n2 = o2.getResults().keySet().iterator().next(); if (n1 instanceof UnitType) { final UnitType u1 = (UnitType) n1; if (n2 instanceof UnitType) { final UnitType u2 = (UnitType) n2; return utc.compare(u1, u2); } else if (n2 instanceof Resource) { // final Resource r2 = (Resource) n2; return -1; } return n1.getName().compareTo(n2.getName()); } else if (n1 instanceof Resource) { final Resource r1 = (Resource) n1; if (n2 instanceof UnitType) { // final UnitType u2 = (UnitType) n2; return 1; } else if (n2 instanceof Resource) { final Resource r2 = (Resource) n2; return r1.getName().compareTo(r2.getName()); } else { return n1.getName().compareTo(n2.getName()); } } return n1.getName().compareTo(n2.getName()); } if (o1.getResults().size() > o2.getResults().size()) { return -1; } else if (o1.getResults().size() < o2.getResults().size()) { return 1; } return o1.getName().compareTo(o2.getName()); } }; }