From 06f252b2e462d4cc51f8e1f323bdb0a6c9b4bfc7 Mon Sep 17 00:00:00 2001 From: Maxmtg Date: Sat, 2 Mar 2013 09:21:25 +0000 Subject: [PATCH] PlayArea is intialized with a r/o list that is a reference to all cards in given zone. --- src/main/java/forge/gui/GuiDisplayUtil.java | 88 ------------------ .../gui/match/nonsingleton/CCommand.java | 7 +- .../forge/gui/match/nonsingleton/CField.java | 4 +- .../gui/match/nonsingleton/VCommand.java | 3 +- .../forge/gui/match/nonsingleton/VField.java | 2 +- src/main/java/forge/view/arcane/PlayArea.java | 89 ++++++++++++++++++- 6 files changed, 94 insertions(+), 99 deletions(-) diff --git a/src/main/java/forge/gui/GuiDisplayUtil.java b/src/main/java/forge/gui/GuiDisplayUtil.java index 3c0012d13cc..cd601122daa 100644 --- a/src/main/java/forge/gui/GuiDisplayUtil.java +++ b/src/main/java/forge/gui/GuiDisplayUtil.java @@ -18,7 +18,6 @@ package forge.gui; import java.awt.Color; -import java.awt.Rectangle; import java.io.BufferedReader; import java.io.DataInputStream; import java.io.FileInputStream; @@ -61,8 +60,6 @@ import forge.game.zone.ZoneType; import forge.item.CardDb; import forge.item.CardPrinted; import forge.item.IPaperCard; -import forge.view.arcane.PlayArea; -import forge.view.arcane.util.Animation; /** *

@@ -255,91 +252,6 @@ public final class GuiDisplayUtil { } - /** - *

- * setupPlayZone. - *

- * - * @param p - * a {@link forge.view.arcane.PlayArea} object. - * @param c - * an array of {@link forge.Card} objects. - */ - public static void setupPlayZone(final PlayArea p, final List c) { - List tmp, diff; - tmp = new ArrayList(); - for (final forge.view.arcane.CardPanel cpa : p.getCardPanels()) { - tmp.add(cpa.getGameCard()); - } - diff = new ArrayList(tmp); - diff.removeAll(c); - if (diff.size() == p.getCardPanels().size()) { - p.clear(); - } else { - for (final Card card : diff) { - p.removeCardPanel(p.getCardPanel(card.getUniqueNumber())); - } - } - diff = new ArrayList(c); - diff.removeAll(tmp); - - List panelList = new ArrayList(); - for (final Card card : diff) { - panelList.add(p.addCard(card)); - } - if (!diff.isEmpty()) { - p.doLayout(); - } - for (final forge.view.arcane.CardPanel toPanel : panelList) { - p.scrollRectToVisible(new Rectangle(toPanel.getCardX(), toPanel.getCardY(), toPanel - .getCardWidth(), toPanel.getCardHeight())); - Animation.moveCard(toPanel); - } - - for (final Card card : c) { - final forge.view.arcane.CardPanel toPanel = p.getCardPanel(card.getUniqueNumber()); - if (card.isTapped()) { - toPanel.setTapped(true); - toPanel.setTappedAngle(forge.view.arcane.CardPanel.TAPPED_ANGLE); - } else { - toPanel.setTapped(false); - toPanel.setTappedAngle(0); - } - toPanel.getAttachedPanels().clear(); - if (card.isEnchanted()) { - final ArrayList enchants = card.getEnchantedBy(); - for (final Card e : enchants) { - final forge.view.arcane.CardPanel cardE = p.getCardPanel(e.getUniqueNumber()); - if (cardE != null) { - toPanel.getAttachedPanels().add(cardE); - } - } - } - - if (card.isEquipped()) { - final ArrayList enchants = card.getEquippedBy(); - for (final Card e : enchants) { - final forge.view.arcane.CardPanel cardE = p.getCardPanel(e.getUniqueNumber()); - if (cardE != null) { - toPanel.getAttachedPanels().add(cardE); - } - } - } - - if (card.isEnchantingCard()) { - toPanel.setAttachedToPanel(p.getCardPanel(card.getEnchantingCard().getUniqueNumber())); - } else if (card.isEquipping()) { - toPanel.setAttachedToPanel(p.getCardPanel(card.getEquipping().get(0).getUniqueNumber())); - } else { - toPanel.setAttachedToPanel(null); - } - - toPanel.setCard(toPanel.getGameCard()); - } - p.invalidate(); - p.repaint(); - } - /** *

* updateGUI. diff --git a/src/main/java/forge/gui/match/nonsingleton/CCommand.java b/src/main/java/forge/gui/match/nonsingleton/CCommand.java index e7bf41f086a..0e19f4339c2 100644 --- a/src/main/java/forge/gui/match/nonsingleton/CCommand.java +++ b/src/main/java/forge/gui/match/nonsingleton/CCommand.java @@ -29,9 +29,7 @@ import forge.Card; import forge.Command; import forge.game.player.Player; -import forge.game.zone.PlayerZone; import forge.game.zone.ZoneType; -import forge.gui.GuiDisplayUtil; import forge.gui.framework.ICDoc; import forge.gui.match.CMatchUI; import forge.gui.match.controllers.CMessage; @@ -55,8 +53,7 @@ public class CCommand implements ICDoc { private final Observer observerPlay = new Observer() { @Override public void update(final Observable a, final Object b) { - final PlayerZone pZone = (PlayerZone) a; - GuiDisplayUtil.setupPlayZone(CCommand.this.view.getTabletop(), pZone.getCards(false)); + CCommand.this.view.getTabletop().setupPlayZone(); } }; @@ -118,7 +115,7 @@ public class CCommand implements ICDoc { if (c != null && c.isInZone(ZoneType.Command)) { //TODO: Cast commander/activate avatar/roll planar dice here. - CMessage.SINGLETON_INSTANCE.getInputControl().getInput().selectCard(c); + CMessage.SINGLETON_INSTANCE.getInputControl().selectCard(c, player.getZone(ZoneType.Command)); } } diff --git a/src/main/java/forge/gui/match/nonsingleton/CField.java b/src/main/java/forge/gui/match/nonsingleton/CField.java index 0d62d09c590..2e14f5e8dae 100644 --- a/src/main/java/forge/gui/match/nonsingleton/CField.java +++ b/src/main/java/forge/gui/match/nonsingleton/CField.java @@ -50,7 +50,6 @@ import forge.game.zone.PlayerZone; import forge.game.zone.ZoneType; import forge.gui.ForgeAction; import forge.gui.GuiChoose; -import forge.gui.GuiDisplayUtil; import forge.gui.framework.ICDoc; import forge.gui.match.CMatchUI; import forge.gui.match.controllers.CMessage; @@ -147,8 +146,7 @@ public class CField implements ICDoc { private final Observer observerPlay = new Observer() { @Override public void update(final Observable a, final Object b) { - final PlayerZone pZone = (PlayerZone) a; - GuiDisplayUtil.setupPlayZone(CField.this.view.getTabletop(), pZone.getCards(false)); + CField.this.view.getTabletop().setupPlayZone(); } }; diff --git a/src/main/java/forge/gui/match/nonsingleton/VCommand.java b/src/main/java/forge/gui/match/nonsingleton/VCommand.java index b4dc3be18ac..17711a00c6c 100644 --- a/src/main/java/forge/gui/match/nonsingleton/VCommand.java +++ b/src/main/java/forge/gui/match/nonsingleton/VCommand.java @@ -23,6 +23,7 @@ import javax.swing.border.MatteBorder; import net.miginfocom.swing.MigLayout; import forge.game.player.Player; +import forge.game.zone.ZoneType; import forge.gui.framework.DragCell; import forge.gui.framework.DragTab; import forge.gui.framework.EDocID; @@ -66,7 +67,7 @@ public class VCommand implements IVDoc { // TODO player is hard-coded into tabletop...should be dynamic // (haven't looked into it too deeply). Doublestrike 12-04-12 - tabletop = new PlayArea(scroller, id0 == EDocID.COMMAND_0); + tabletop = new PlayArea(scroller, id0 == EDocID.COMMAND_0, player.getZone(ZoneType.Command).getCards(false)); control = new CCommand(player, this); diff --git a/src/main/java/forge/gui/match/nonsingleton/VField.java b/src/main/java/forge/gui/match/nonsingleton/VField.java index bfc435f4828..1efc4e95d9f 100644 --- a/src/main/java/forge/gui/match/nonsingleton/VField.java +++ b/src/main/java/forge/gui/match/nonsingleton/VField.java @@ -121,7 +121,7 @@ public class VField implements IVDoc { // TODO player is hard-coded into tabletop...should be dynamic // (haven't looked into it too deeply). Doublestrike 12-04-12 - tabletop = new PlayArea(scroller, id0 == EDocID.FIELD_1); + tabletop = new PlayArea(scroller, id0 == EDocID.FIELD_1, player.getZone(ZoneType.Battlefield).getCards(false)); control = new CField(player, this, playerViewer); diff --git a/src/main/java/forge/view/arcane/PlayArea.java b/src/main/java/forge/view/arcane/PlayArea.java index 3b878e19d3f..b15772cdd1b 100644 --- a/src/main/java/forge/view/arcane/PlayArea.java +++ b/src/main/java/forge/view/arcane/PlayArea.java @@ -27,6 +27,7 @@ import java.util.List; import javax.swing.JScrollPane; import forge.Card; +import forge.view.arcane.util.Animation; import forge.view.arcane.util.CardPanelMouseListener; /** @@ -65,6 +66,8 @@ public class PlayArea extends CardPanelContainer implements CardPanelMouseListen private int extraCardSpacingX, cardSpacingX, cardSpacingY; private int stackSpacingX, stackSpacingY; + private List model; + /** *

* Constructor for PlayArea. @@ -76,10 +79,11 @@ public class PlayArea extends CardPanelContainer implements CardPanelMouseListen * a boolean. * @param modelRef */ - public PlayArea(final JScrollPane scrollPane, final boolean mirror) { + public PlayArea(final JScrollPane scrollPane, final boolean mirror, List modelRef) { super(scrollPane); this.setBackground(Color.white); this.mirror = mirror; + this.model = modelRef; } private final CardStackRow collectAllLands() { @@ -478,6 +482,89 @@ public class PlayArea extends CardPanelContainer implements CardPanelMouseListen super.mouseLeftClicked(panel, evt); } + /** + *

+ * setupPlayZone. + *

+ * + * @param newList + * an array of {@link forge.Card} objects. + */ + public void setupPlayZone() { + List oldCards, toDelete; + oldCards = new ArrayList(); + for (final CardPanel cpa : getCardPanels()) { + oldCards.add(cpa.getGameCard()); + } + toDelete = new ArrayList(oldCards); + toDelete.removeAll(model); + if (toDelete.size() == getCardPanels().size()) { + clear(); + } else { + for (final Card card : toDelete) { + removeCardPanel(getCardPanel(card.getUniqueNumber())); + } + } + + List toAdd = new ArrayList(model); + toAdd.removeAll(oldCards); + + List newPanels = new ArrayList(); + for (final Card card : toAdd) { + newPanels.add(addCard(card)); + } + if (!toAdd.isEmpty()) { + doLayout(); + } + for (final CardPanel toPanel : newPanels) { + scrollRectToVisible(new Rectangle(toPanel.getCardX(), toPanel.getCardY(), toPanel.getCardWidth(), toPanel.getCardHeight())); + Animation.moveCard(toPanel); + } + + for (final Card card : model) { + final CardPanel toPanel = getCardPanel(card.getUniqueNumber()); + if (card.isTapped()) { + toPanel.setTapped(true); + toPanel.setTappedAngle(forge.view.arcane.CardPanel.TAPPED_ANGLE); + } else { + toPanel.setTapped(false); + toPanel.setTappedAngle(0); + } + toPanel.getAttachedPanels().clear(); + if (card.isEnchanted()) { + final ArrayList enchants = card.getEnchantedBy(); + for (final Card e : enchants) { + final forge.view.arcane.CardPanel cardE = getCardPanel(e.getUniqueNumber()); + if (cardE != null) { + toPanel.getAttachedPanels().add(cardE); + } + } + } + + if (card.isEquipped()) { + final ArrayList enchants = card.getEquippedBy(); + for (final Card e : enchants) { + final forge.view.arcane.CardPanel cardE = getCardPanel(e.getUniqueNumber()); + if (cardE != null) { + toPanel.getAttachedPanels().add(cardE); + } + } + } + + if (card.isEnchantingCard()) { + toPanel.setAttachedToPanel(getCardPanel(card.getEnchantingCard().getUniqueNumber())); + } else if (card.isEquipping()) { + toPanel.setAttachedToPanel(getCardPanel(card.getEquipping().get(0).getUniqueNumber())); + } else { + toPanel.setAttachedToPanel(null); + } + + toPanel.setCard(toPanel.getGameCard()); + } + invalidate(); + repaint(); + } + private static enum RowType { Land, Creature,