From c56b573231adc04257021b52a44a115a27021286 Mon Sep 17 00:00:00 2001 From: Ron Date: Sat, 17 Feb 2018 15:06:47 -0600 Subject: [PATCH 1/4] Add new resource attribute isDisplayFor --- .../strategy/engine/data/GameParser.java | 24 +++++++++++++++---- .../games/strategy/engine/data/Resource.java | 15 ++++++++++++ .../strategy/triplea/ui/ResourceBar.java | 20 +++++++++------- .../games/strategy/engine/xml/game.dtd | 1 + 4 files changed, 47 insertions(+), 13 deletions(-) diff --git a/src/main/java/games/strategy/engine/data/GameParser.java b/src/main/java/games/strategy/engine/data/GameParser.java index 5fffa2eb4f9..329bac2a823 100644 --- a/src/main/java/games/strategy/engine/data/GameParser.java +++ b/src/main/java/games/strategy/engine/data/GameParser.java @@ -732,11 +732,25 @@ private void parseConnections(final List connections) throws GameParseE } } - private void parseResources(final Element root) { - getChildren("resource", root).stream() - .map(e -> e.getAttribute("name")) - .map(name -> new Resource(name, data)) - .forEach(data.getResourceList()::addResource); + private void parseResources(final Element root) throws GameParseException { + for (final Element element : getChildren("resource", root)) { + final String name = element.getAttribute("name"); + final String isDisplayedFor = element.getAttribute("isDisplayedFor"); + final List players = data.getPlayerList().getPlayers(); + if (isDisplayedFor.equalsIgnoreCase("NONE")) { + players.clear(); + } else if (!isDisplayedFor.isEmpty()) { + players.clear(); + for (final String s : isDisplayedFor.split(":")) { + final PlayerID player = data.getPlayerList().getPlayerId(s); + if (player == null) { + throw new GameParseException("Parse resources could not find player: " + s); + } + players.add(player); + } + } + data.getResourceList().addResource(new Resource(name, data, players)); + } } private void parseRelationshipTypes(final Element root) { diff --git a/src/main/java/games/strategy/engine/data/Resource.java b/src/main/java/games/strategy/engine/data/Resource.java index d9db6e94ea7..29ed7ebcef4 100644 --- a/src/main/java/games/strategy/engine/data/Resource.java +++ b/src/main/java/games/strategy/engine/data/Resource.java @@ -1,8 +1,13 @@ package games.strategy.engine.data; +import java.util.ArrayList; +import java.util.List; + public class Resource extends NamedAttachable { private static final long serialVersionUID = 7471431759007499935L; + private List players = new ArrayList<>(); + /** * Creates new Resource. * @@ -14,4 +19,14 @@ public class Resource extends NamedAttachable { public Resource(final String name, final GameData data) { super(name, data); } + + public Resource(final String name, final GameData data, final List players) { + this(name, data); + this.players = players; + } + + public boolean isDisplayedFor(final PlayerID player) { + return players != null ? players.contains(player) : true; + } + } diff --git a/src/main/java/games/strategy/triplea/ui/ResourceBar.java b/src/main/java/games/strategy/triplea/ui/ResourceBar.java index 5d835df1371..67b23dfbd87 100644 --- a/src/main/java/games/strategy/triplea/ui/ResourceBar.java +++ b/src/main/java/games/strategy/triplea/ui/ResourceBar.java @@ -1,5 +1,6 @@ package games.strategy.triplea.ui; +import java.awt.Dimension; import java.util.ArrayList; import java.util.List; @@ -22,7 +23,7 @@ public class ResourceBar extends AbstractStatPanel implements GameDataChangeList private static final long serialVersionUID = -7713792841831042952L; private final UiContext uiContext; - private final List resources = new ArrayList<>(); + private final List resourceStats = new ArrayList<>(); private final List labels = new ArrayList<>(); public ResourceBar(final GameData data, final UiContext uiContext) { @@ -37,6 +38,7 @@ public ResourceBar(final GameData data, final UiContext uiContext) { protected void initLayout() { setBorder(new EtchedBorder(EtchedBorder.RAISED)); labels.stream().forEachOrdered(this::add); + this.setPreferredSize(new Dimension(400, 0)); } @Override @@ -51,7 +53,7 @@ private void setResources() { if (resource.getName().equals(Constants.VPS)) { continue; } - resources.add(new ResourceStat(resource)); + resourceStats.add(new ResourceStat(resource)); final JLabel label = new JLabel(); label.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 20)); labels.add(label); @@ -64,15 +66,17 @@ public void gameDataChanged(final Change change) { try { final PlayerID player = gameData.getSequence().getStep().getPlayerId(); if (player != null) { - for (int i = 0; i < resources.size(); i++) { - final String quantity = resources.get(i).getFormatter().format(resources.get(i).getValue(player, gameData)); + for (int i = 0; i < resourceStats.size(); i++) { + final IStat resourceStat = resourceStats.get(i); + final Resource resource = gameData.getResourceList().getResource(resourceStat.getName()); + final String quantity = resourceStat.getFormatter().format(resourceStat.getValue(player, gameData)); + labels.get(i).setVisible(resource.isDisplayedFor(player)); try { - labels.get(i).setIcon(uiContext.getResourceImageFactory() - .getIcon(gameData.getResourceList().getResource(resources.get(i).getName()), true)); + labels.get(i).setIcon(uiContext.getResourceImageFactory().getIcon(resource, true)); labels.get(i).setText(quantity); - labels.get(i).setToolTipText(resources.get(i).getName()); + labels.get(i).setToolTipText(resourceStat.getName()); } catch (final IllegalStateException e) { - labels.get(i).setText(resources.get(i).getName() + " " + quantity); + labels.get(i).setText(resourceStat.getName() + " " + quantity); } } } diff --git a/src/main/resources/games/strategy/engine/xml/game.dtd b/src/main/resources/games/strategy/engine/xml/game.dtd index 3e8ad25b82b..c8b7f58a8f6 100644 --- a/src/main/resources/games/strategy/engine/xml/game.dtd +++ b/src/main/resources/games/strategy/engine/xml/game.dtd @@ -61,6 +61,7 @@ From 8781ebf00d4d40037e1ad749205c17d09030c71c Mon Sep 17 00:00:00 2001 From: Ron Date: Sat, 17 Feb 2018 17:16:06 -0600 Subject: [PATCH 2/4] Remove preferred size parameter --- src/main/java/games/strategy/triplea/ui/ResourceBar.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/games/strategy/triplea/ui/ResourceBar.java b/src/main/java/games/strategy/triplea/ui/ResourceBar.java index 67b23dfbd87..38dcf453530 100644 --- a/src/main/java/games/strategy/triplea/ui/ResourceBar.java +++ b/src/main/java/games/strategy/triplea/ui/ResourceBar.java @@ -1,6 +1,5 @@ package games.strategy.triplea.ui; -import java.awt.Dimension; import java.util.ArrayList; import java.util.List; @@ -38,7 +37,6 @@ public ResourceBar(final GameData data, final UiContext uiContext) { protected void initLayout() { setBorder(new EtchedBorder(EtchedBorder.RAISED)); labels.stream().forEachOrdered(this::add); - this.setPreferredSize(new Dimension(400, 0)); } @Override From 5d51f647ba039fa61e6a346a79b44db7f20c0a83 Mon Sep 17 00:00:00 2001 From: Ron Date: Sat, 17 Feb 2018 20:11:48 -0600 Subject: [PATCH 3/4] Small clean ups --- .../games/strategy/engine/data/GameParser.java | 4 +++- .../games/strategy/engine/data/Resource.java | 7 ++++--- .../games/strategy/triplea/ui/ResourceBar.java | 18 +++++++++--------- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/main/java/games/strategy/engine/data/GameParser.java b/src/main/java/games/strategy/engine/data/GameParser.java index 329bac2a823..718d5d7a0fa 100644 --- a/src/main/java/games/strategy/engine/data/GameParser.java +++ b/src/main/java/games/strategy/engine/data/GameParser.java @@ -61,6 +61,8 @@ */ public final class GameParser { private static final Class[] SETTER_ARGS = {String.class}; + private static final String RESOURCE_IS_DISPLAY_FOR_NONE = "NONE"; + private final GameData data = new GameData(); private final Collection errorsSax = new ArrayList<>(); public static final String DTD_FILE_NAME = "game.dtd"; @@ -737,7 +739,7 @@ private void parseResources(final Element root) throws GameParseException { final String name = element.getAttribute("name"); final String isDisplayedFor = element.getAttribute("isDisplayedFor"); final List players = data.getPlayerList().getPlayers(); - if (isDisplayedFor.equalsIgnoreCase("NONE")) { + if (isDisplayedFor.equalsIgnoreCase(RESOURCE_IS_DISPLAY_FOR_NONE)) { players.clear(); } else if (!isDisplayedFor.isEmpty()) { players.clear(); diff --git a/src/main/java/games/strategy/engine/data/Resource.java b/src/main/java/games/strategy/engine/data/Resource.java index 29ed7ebcef4..31844f00e2f 100644 --- a/src/main/java/games/strategy/engine/data/Resource.java +++ b/src/main/java/games/strategy/engine/data/Resource.java @@ -17,16 +17,17 @@ public class Resource extends NamedAttachable { * game data */ public Resource(final String name, final GameData data) { - super(name, data); + this(name, data, new ArrayList<>()); } public Resource(final String name, final GameData data, final List players) { - this(name, data); + super(name, data); this.players = players; } public boolean isDisplayedFor(final PlayerID player) { - return players != null ? players.contains(player) : true; + // TODO: remove null check on incompatible release + return players == null || players.contains(player); } } diff --git a/src/main/java/games/strategy/triplea/ui/ResourceBar.java b/src/main/java/games/strategy/triplea/ui/ResourceBar.java index 38dcf453530..eb266f55278 100644 --- a/src/main/java/games/strategy/triplea/ui/ResourceBar.java +++ b/src/main/java/games/strategy/triplea/ui/ResourceBar.java @@ -12,7 +12,6 @@ import games.strategy.engine.data.PlayerID; import games.strategy.engine.data.Resource; import games.strategy.engine.data.events.GameDataChangeListener; -import games.strategy.engine.stats.IStat; import games.strategy.triplea.Constants; /** @@ -22,7 +21,7 @@ public class ResourceBar extends AbstractStatPanel implements GameDataChangeList private static final long serialVersionUID = -7713792841831042952L; private final UiContext uiContext; - private final List resourceStats = new ArrayList<>(); + private final List resourceStats = new ArrayList<>(); private final List labels = new ArrayList<>(); public ResourceBar(final GameData data, final UiContext uiContext) { @@ -65,16 +64,17 @@ public void gameDataChanged(final Change change) { final PlayerID player = gameData.getSequence().getStep().getPlayerId(); if (player != null) { for (int i = 0; i < resourceStats.size(); i++) { - final IStat resourceStat = resourceStats.get(i); - final Resource resource = gameData.getResourceList().getResource(resourceStat.getName()); + final ResourceStat resourceStat = resourceStats.get(i); + final Resource resource = resourceStat.resource; + final JLabel label = labels.get(i); final String quantity = resourceStat.getFormatter().format(resourceStat.getValue(player, gameData)); - labels.get(i).setVisible(resource.isDisplayedFor(player)); + label.setVisible(resource.isDisplayedFor(player)); try { - labels.get(i).setIcon(uiContext.getResourceImageFactory().getIcon(resource, true)); - labels.get(i).setText(quantity); - labels.get(i).setToolTipText(resourceStat.getName()); + label.setIcon(uiContext.getResourceImageFactory().getIcon(resource, true)); + label.setText(quantity); + label.setToolTipText(resourceStat.getName()); } catch (final IllegalStateException e) { - labels.get(i).setText(resourceStat.getName() + " " + quantity); + label.setText(resourceStat.getName() + " " + quantity); } } } From d50edba2b334a44c2d5cb996d51fd99e9184e6a4 Mon Sep 17 00:00:00 2001 From: Ron Date: Sat, 17 Feb 2018 22:20:26 -0600 Subject: [PATCH 4/4] Add final and refactor method --- .../java/games/strategy/engine/data/GameParser.java | 13 +++++++------ .../java/games/strategy/engine/data/Resource.java | 2 +- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/main/java/games/strategy/engine/data/GameParser.java b/src/main/java/games/strategy/engine/data/GameParser.java index 718d5d7a0fa..98ae3c05010 100644 --- a/src/main/java/games/strategy/engine/data/GameParser.java +++ b/src/main/java/games/strategy/engine/data/GameParser.java @@ -738,11 +738,12 @@ private void parseResources(final Element root) throws GameParseException { for (final Element element : getChildren("resource", root)) { final String name = element.getAttribute("name"); final String isDisplayedFor = element.getAttribute("isDisplayedFor"); - final List players = data.getPlayerList().getPlayers(); - if (isDisplayedFor.equalsIgnoreCase(RESOURCE_IS_DISPLAY_FOR_NONE)) { - players.clear(); - } else if (!isDisplayedFor.isEmpty()) { - players.clear(); + if (isDisplayedFor.isEmpty()) { + data.getResourceList().addResource(new Resource(name, data, data.getPlayerList().getPlayers())); + } else if (isDisplayedFor.equalsIgnoreCase(RESOURCE_IS_DISPLAY_FOR_NONE)) { + data.getResourceList().addResource(new Resource(name, data)); + } else { + final List players = new ArrayList<>(); for (final String s : isDisplayedFor.split(":")) { final PlayerID player = data.getPlayerList().getPlayerId(s); if (player == null) { @@ -750,8 +751,8 @@ private void parseResources(final Element root) throws GameParseException { } players.add(player); } + data.getResourceList().addResource(new Resource(name, data, players)); } - data.getResourceList().addResource(new Resource(name, data, players)); } } diff --git a/src/main/java/games/strategy/engine/data/Resource.java b/src/main/java/games/strategy/engine/data/Resource.java index 31844f00e2f..51e529eb1dc 100644 --- a/src/main/java/games/strategy/engine/data/Resource.java +++ b/src/main/java/games/strategy/engine/data/Resource.java @@ -6,7 +6,7 @@ public class Resource extends NamedAttachable { private static final long serialVersionUID = 7471431759007499935L; - private List players = new ArrayList<>(); + private final List players; /** * Creates new Resource.