From e4f6c7cb5d99f16b86db5f252b7831b85ac9ea68 Mon Sep 17 00:00:00 2001 From: elcnesh Date: Tue, 2 Sep 2014 08:29:19 +0000 Subject: [PATCH 01/29] Branch GUI refactoring. Most of the code has been converted, but some problems remain (mostly with Inputs). Nothing has been tested yet. --- .project | 4 +- .../src/main/java/forge/GuiDesktop.java | 75 +-- .../src/main/java/forge/ImageCache.java | 18 +- .../src/main/java/forge/control/FControl.java | 131 +++-- .../java/forge/deckchooser/FDeckViewer.java | 2 +- .../forge/gui/BoxedProductCardListViewer.java | 2 +- .../main/java/forge/gui/CardContainer.java | 6 +- .../main/java/forge/gui/CardDetailPanel.java | 124 ++++- .../main/java/forge/gui/CardListViewer.java | 2 +- .../main/java/forge/gui/CardPicturePanel.java | 41 +- .../src/main/java/forge/gui/DualListBox.java | 50 +- .../src/main/java/forge/gui/GuiChoose.java | 40 +- .../src/main/java/forge/gui/GuiDialog.java | 28 +- .../src/main/java/forge/gui/GuiUtils.java | 34 +- .../forge/itemmanager/views/ImageView.java | 8 +- .../home/sanctioned/VSubmenuConstructed.java | 2 +- .../java/forge/screens/match/CMatchUI.java | 152 +++--- .../forge/screens/match/ControlWinLose.java | 26 +- .../forge/screens/match/GauntletWinLose.java | 22 +- .../forge/screens/match/LimitedWinLose.java | 8 +- .../screens/match/QuestDraftWinLose.java | 20 +- .../forge/screens/match/QuestWinLose.java | 22 +- .../screens/match/QuestWinLoseCardViewer.java | 2 +- .../forge/screens/match/VAssignDamage.java | 114 +++-- .../java/forge/screens/match/VAutoYields.java | 10 +- .../java/forge/screens/match/ViewWinLose.java | 26 +- .../java/forge/screens/match/ZoneAction.java | 57 +-- .../screens/match/controllers/CCommand.java | 13 +- .../screens/match/controllers/CDetail.java | 12 +- .../screens/match/controllers/CDock.java | 21 +- .../screens/match/controllers/CField.java | 63 +-- .../screens/match/controllers/CHand.java | 53 +- .../screens/match/controllers/CPicture.java | 39 +- .../screens/match/controllers/CPlayers.java | 6 +- .../screens/match/controllers/CPrompt.java | 20 +- .../screens/match/controllers/CStack.java | 15 +- .../forge/screens/match/menus/GameMenu.java | 4 +- .../forge/screens/match/views/VAntes.java | 45 +- .../forge/screens/match/views/VCommand.java | 23 +- .../forge/screens/match/views/VDetail.java | 2 +- .../forge/screens/match/views/VField.java | 37 +- .../java/forge/screens/match/views/VHand.java | 19 +- .../forge/screens/match/views/VPlayers.java | 54 +- .../forge/screens/match/views/VStack.java | 100 ++-- .../forge/toolbox/imaging/FImageUtil.java | 32 +- .../forge/toolbox/special/CardViewer.java | 2 +- .../forge/toolbox/special/CardZoomer.java | 188 +++---- .../toolbox/special/PlayerDetailsPanel.java | 53 +- .../java/forge/view/arcane/CardPanel.java | 111 +++-- .../forge/view/arcane/CardPanelContainer.java | 48 +- .../main/java/forge/view/arcane/PlayArea.java | 182 ++++--- .../forge/gui/game/CardDetailPanelTest.java | 2 +- .../main/java/forge/card/CardDetailUtil.java | 456 ++++++++++++++--- .../control/FControlGameEventHandler.java | 9 +- .../forge/events/UiEventAttackerDeclared.java | 14 +- .../forge/events/UiEventBlockerAssigned.java | 10 +- .../gauntlet/GauntletWinLoseController.java | 21 +- .../main/java/forge/interfaces/IGuiBase.java | 52 +- .../limited/LimitedWinLoseController.java | 17 +- .../main/java/forge/match/input/Input.java | 5 +- .../java/forge/match/input/InputAttack.java | 14 +- .../java/forge/match/input/InputBase.java | 8 +- .../java/forge/match/input/InputProxy.java | 38 +- .../java/forge/match/input/InputQueue.java | 5 +- .../java/forge/player/GamePlayerUtil.java | 13 - .../forge/player/PlayerControllerHuman.java | 460 ++++++++++++++++-- .../java/forge/player/TargetSelection.java | 21 +- .../forge/quest/QuestEventDifficulty.java | 28 +- .../forge/quest/QuestWinLoseController.java | 42 +- .../main/java/forge/util/gui/SGuiChoose.java | 11 +- .../main/java/forge/util/gui/SOptionPane.java | 5 +- 71 files changed, 2192 insertions(+), 1207 deletions(-) diff --git a/.project b/.project index bd5285d6a7e..107b0a19ca3 100644 --- a/.project +++ b/.project @@ -1,9 +1,11 @@ - ForgeLocal + forge + + org.eclipse.m2e.core.maven2Nature diff --git a/forge-gui-desktop/src/main/java/forge/GuiDesktop.java b/forge-gui-desktop/src/main/java/forge/GuiDesktop.java index 5f038e872c4..a1886a018fe 100644 --- a/forge-gui-desktop/src/main/java/forge/GuiDesktop.java +++ b/forge-gui-desktop/src/main/java/forge/GuiDesktop.java @@ -31,17 +31,11 @@ import forge.control.FControl; import forge.deck.CardPool; import forge.error.BugReportDialog; import forge.events.UiEvent; -import forge.game.Game; -import forge.game.GameEntity; import forge.game.GameType; import forge.game.Match; -import forge.game.card.Card; import forge.game.combat.Combat; -import forge.game.event.GameEventTurnBegan; -import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseType; import forge.game.player.IHasIcon; -import forge.game.player.Player; import forge.game.player.RegisteredPlayer; import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; @@ -81,6 +75,10 @@ import forge.toolbox.MouseTriggerEvent; import forge.toolbox.special.PhaseLabel; import forge.util.BuildInfo; import forge.util.ITriggerEvent; +import forge.view.CardView; +import forge.view.GameEntityView; +import forge.view.IGameView; +import forge.view.PlayerView; public class GuiDesktop implements IGuiBase { @@ -132,7 +130,7 @@ public class GuiDesktop implements IGuiBase { } @Override - public boolean mayShowCard(Card card) { + public boolean mayShowCard(CardView card) { return Singletons.getControl().mayShowCard(card); } @@ -153,7 +151,7 @@ public class GuiDesktop implements IGuiBase { } @Override - public int showCardOptionDialog(final Card card, String message, String title, FSkinProp skinIcon, String[] options, int defaultOption) { + public int showCardOptionDialog(final CardView card, String message, String title, FSkinProp skinIcon, String[] options, int defaultOption) { if (card != null) { FThreads.invokeInEdtAndWait(new Runnable() { @Override @@ -177,7 +175,7 @@ public class GuiDesktop implements IGuiBase { @Override public List order(final String title, final String top, final int remainingObjectsMin, final int remainingObjectsMax, - final List sourceChoices, final List destChoices, final Card referenceCard, final boolean sideboardingMode) { + final List sourceChoices, final List destChoices, final CardView referenceCard, final boolean sideboardingMode) { return GuiChoose.order(title, top, remainingObjectsMin, remainingObjectsMax, sourceChoices, destChoices, referenceCard, sideboardingMode); } @@ -231,10 +229,11 @@ public class GuiDesktop implements IGuiBase { @Override public void updatePhase() { - PhaseHandler pH = Singletons.getControl().getObservedGame().getPhaseHandler(); - Player p = pH.getPlayerTurn(); - PhaseType ph = pH.getPhase(); + //PhaseHandler pH = Singletons.getControl().getObservedGame().getPhaseHandler(); + //PhaseType ph = pH.getPhase(); + final PlayerView p = Singletons.getControl().getGameView().getPlayerTurn(); + final PhaseType ph = Singletons.getControl().getGameView().getPhase(); final CMatchUI matchUi = CMatchUI.SINGLETON_INSTANCE; PhaseLabel lbl = matchUi.getFieldViewFor(p).getPhaseIndicator().getLabelFor(ph); @@ -245,10 +244,10 @@ public class GuiDesktop implements IGuiBase { } @Override - public void updateTurn(final GameEventTurnBegan event, final Game game) { - VField nextField = CMatchUI.SINGLETON_INSTANCE.getFieldViewFor(event.turnOwner); + public void updateTurn(final PlayerView player) { + VField nextField = CMatchUI.SINGLETON_INSTANCE.getFieldViewFor(player); SDisplayUtil.showTab(nextField); - CPrompt.SINGLETON_INSTANCE.updateText(game); + CPrompt.SINGLETON_INSTANCE.updateText(); } @Override @@ -273,7 +272,7 @@ public class GuiDesktop implements IGuiBase { @Override public void finishGame() { - new ViewWinLose(Singletons.getControl().getObservedGame()); + new ViewWinLose(Singletons.getControl().getGameView()); if (showOverlay) { SOverlayUtils.showOverlay(); } @@ -290,7 +289,7 @@ public class GuiDesktop implements IGuiBase { } @Override - public void setPanelSelection(Card c) { + public void setPanelSelection(final CardView c) { GuiUtils.setPanelSelection(c); } @@ -374,7 +373,7 @@ public class GuiDesktop implements IGuiBase { } @Override - public void setCard(Card card) { + public void setCard(final CardView card) { CMatchUI.SINGLETON_INSTANCE.setCard(card); } @@ -384,22 +383,22 @@ public class GuiDesktop implements IGuiBase { } @Override - public void setUsedToPay(Card card, boolean b) { + public void setUsedToPay(final CardView card, final boolean b) { CMatchUI.SINGLETON_INSTANCE.setUsedToPay(card, b); } @Override - public void setHighlighted(Player player, boolean b) { + public void setHighlighted(final PlayerView player, final boolean b) { CMatchUI.SINGLETON_INSTANCE.setHighlighted(player, b); } @Override - public void showPromptMessage(String message) { + public void showPromptMessage(final String message) { CMatchUI.SINGLETON_INSTANCE.showMessage(message); } @Override - public boolean stopAtPhase(Player playerTurn, PhaseType phase) { + public boolean stopAtPhase(final PlayerView playerTurn, PhaseType phase) { return CMatchUI.SINGLETON_INSTANCE.stopAtPhase(playerTurn, phase); } @@ -409,21 +408,22 @@ public class GuiDesktop implements IGuiBase { } @Override - public Game getGame() { - return FControl.instance.getObservedGame(); + @Deprecated + public IGameView getGame() { + return FControl.instance.getGameView(); } - public Object showManaPool(Player player) { + public Object showManaPool(final PlayerView player) { return null; //not needed since mana pool icons are always visible } @Override - public void hideManaPool(Player player, Object zoneToRestore) { + public void hideManaPool(final PlayerView player, final Object zoneToRestore) { //not needed since mana pool icons are always visible } @Override - public boolean openZones(List zones, Map players) { + public boolean openZones(final List zones, final Map players) { if (zones.size() == 1) { switch (zones.get(0)) { case Battlefield: @@ -437,31 +437,31 @@ public class GuiDesktop implements IGuiBase { } @Override - public void restoreOldZones(Map playersToRestoreZonesFor) { + public void restoreOldZones(final Map playersToRestoreZonesFor) { } @Override - public void updateZones(List> zonesToUpdate) { + public void updateZones(final List> zonesToUpdate) { CMatchUI.SINGLETON_INSTANCE.updateZones(zonesToUpdate); } @Override - public void updateCards(Set cardsToUpdate) { + public void updateCards(final Set cardsToUpdate) { CMatchUI.SINGLETON_INSTANCE.updateCards(cardsToUpdate); } @Override - public void refreshCardDetails(Collection cards) { + public void refreshCardDetails(final Collection cards) { CMatchUI.SINGLETON_INSTANCE.refreshCardDetails(cards); } @Override - public void updateManaPool(List manaPoolUpdate) { + public void updateManaPool(final List manaPoolUpdate) { CMatchUI.SINGLETON_INSTANCE.updateManaPool(manaPoolUpdate); } @Override - public void updateLives(List livesUpdate) { + public void updateLives(final List livesUpdate) { CMatchUI.SINGLETON_INSTANCE.updateLives(livesUpdate); } @@ -471,10 +471,11 @@ public class GuiDesktop implements IGuiBase { } @Override - public Map getDamageToAssign(Card attacker, List blockers, - int damageDealt, GameEntity defender, boolean overrideOrder) { - return CMatchUI.SINGLETON_INSTANCE.getDamageToAssign(attacker, blockers, - damageDealt, defender, overrideOrder); + public Map getDamageToAssign(final CardView attacker, + final List blockers, final int damageDealt, + final GameEntityView defender, final boolean overrideOrder) { + return CMatchUI.SINGLETON_INSTANCE.getDamageToAssign(attacker, + blockers, damageDealt, defender, overrideOrder); } @Override diff --git a/forge-gui-desktop/src/main/java/forge/ImageCache.java b/forge-gui-desktop/src/main/java/forge/ImageCache.java index db9e4421fc8..53f8f4a9a82 100644 --- a/forge-gui-desktop/src/main/java/forge/ImageCache.java +++ b/forge-gui-desktop/src/main/java/forge/ImageCache.java @@ -29,6 +29,7 @@ import forge.item.InventoryItem; import forge.properties.ForgeConstants; import forge.toolbox.FSkin; import forge.toolbox.FSkin.SkinIcon; +import forge.view.CardView; import org.apache.commons.lang3.StringUtils; @@ -80,6 +81,7 @@ public class ImageCache { * retrieve an image from the cache. returns null if the image is not found in the cache * and cannot be loaded from disk. pass -1 for width and/or height to avoid resizing in that dimension. */ + @Deprecated public static BufferedImage getImage(Card card, int width, int height) { final String key; if (!Singletons.getControl().mayShowCard(card) || card.isFaceDown()) { @@ -89,7 +91,21 @@ public class ImageCache { } return scaleImage(key, width, height, true); } - + + /** + * retrieve an image from the cache. returns null if the image is not found in the cache + * and cannot be loaded from disk. pass -1 for width and/or height to avoid resizing in that dimension. + */ + public static BufferedImage getImage(final CardView card, final int width, final int height) { + final String key; + if (!Singletons.getControl().mayShowCard(card)) { + key = ImageKeys.TOKEN_PREFIX + ImageKeys.MORPH_IMAGE; + } else { + key = card.getOriginal().getImageKey(); + } + return scaleImage(key, width, height, true); + } + /** * retrieve an image from the cache. returns null if the image is not found in the cache * and cannot be loaded from disk. pass -1 for width and/or height to avoid resizing in that dimension. diff --git a/forge-gui-desktop/src/main/java/forge/control/FControl.java b/forge-gui-desktop/src/main/java/forge/control/FControl.java index 62a0f135d05..34f230b365f 100644 --- a/forge-gui-desktop/src/main/java/forge/control/FControl.java +++ b/forge-gui-desktop/src/main/java/forge/control/FControl.java @@ -17,6 +17,26 @@ */ package forge.control; +import java.awt.Component; +import java.awt.KeyEventDispatcher; +import java.awt.KeyboardFocusManager; +import java.awt.event.ComponentAdapter; +import java.awt.event.ComponentEvent; +import java.awt.event.KeyEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +import javax.swing.ImageIcon; +import javax.swing.JLayeredPane; +import javax.swing.SwingUtilities; +import javax.swing.WindowConstants; + +import org.apache.commons.lang3.StringUtils; + import forge.FThreads; import forge.GuiBase; import forge.ImageCache; @@ -35,15 +55,21 @@ import forge.game.player.Player; import forge.game.player.RegisteredPlayer; import forge.gui.GuiDialog; import forge.gui.SOverlayUtils; -import forge.gui.framework.*; -import forge.player.GamePlayerUtil; -import forge.player.LobbyPlayerHuman; +import forge.gui.framework.EDocID; +import forge.gui.framework.FScreen; +import forge.gui.framework.InvalidLayoutFileException; +import forge.gui.framework.SDisplayUtil; +import forge.gui.framework.SLayoutIO; +import forge.gui.framework.SOverflowUtil; +import forge.gui.framework.SResizingUtil; import forge.match.input.InputQueue; import forge.menus.ForgeMenu; import forge.model.FModel; +import forge.player.GamePlayerUtil; +import forge.player.LobbyPlayerHuman; +import forge.properties.ForgeConstants; import forge.properties.ForgePreferences; import forge.properties.ForgePreferences.FPref; -import forge.properties.ForgeConstants; import forge.quest.QuestController; import forge.quest.data.QuestPreferences.QPref; import forge.quest.io.QuestDataIO; @@ -66,19 +92,11 @@ import forge.toolbox.special.PhaseIndicator; import forge.util.GuiDisplayUtil; import forge.util.MyRandom; import forge.util.NameGenerator; +import forge.view.CardView; import forge.view.FFrame; import forge.view.FView; - -import org.apache.commons.lang3.StringUtils; - -import javax.swing.*; - -import java.awt.*; -import java.awt.event.*; -import java.io.File; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; +import forge.view.IGameView; +import forge.view.PlayerView; /** *

@@ -97,7 +115,7 @@ public enum FControl implements KeyEventDispatcher { private FScreen currentScreen; private boolean altKeyLastDown; private CloseAction closeAction; - private Player localPlayer; + private PlayerView localPlayer; public static enum CloseAction { NONE, @@ -352,6 +370,7 @@ public enum FControl implements KeyEventDispatcher { if (children.length != 0) { children[0].setSize(display.getSize()); } } + @Deprecated public Player getCurrentPlayer() { // try current priority Player currentPriority = game.getPhaseHandler().getPriorityPlayer(); @@ -369,9 +388,13 @@ public enum FControl implements KeyEventDispatcher { return null; } + @Deprecated public boolean mayShowCard(Card c) { return game == null || !gameHasHumanPlayer || c.canBeShownTo(getCurrentPlayer()); } + public boolean mayShowCard(final CardView c) { + return gameView == null || !gameHasHumanPlayer || gameView.mayShowCard(c, getCurrentPlayer()); + } /** * TODO: Write javadoc for this method. @@ -382,13 +405,19 @@ public enum FControl implements KeyEventDispatcher { } private Game game; + private IGameView gameView; private boolean gameHasHumanPlayer; + @Deprecated public Game getObservedGame() { return game; } - public Player getLocalPlayer() { + public IGameView getGameView() { + return this.gameView; + } + + public PlayerView getLocalPlayer() { return localPlayer; } @@ -428,6 +457,14 @@ public enum FControl implements KeyEventDispatcher { return inputQueue; } + public final void startGameInSameMatch() { + this.startGameWithUi(game.getMatch()); + } + public final void startGameAndClearMatch() { + game.getMatch().clearGamesPlayed(); + startGameInSameMatch(); + } + public final void startGameWithUi(final Match match) { if (this.game != null) { this.setCurrentScreen(FScreen.MATCH_SCREEN); @@ -436,15 +473,23 @@ public enum FControl implements KeyEventDispatcher { return; //TODO: See if it's possible to run multiple games at once without crashing } setPlayerName(match.getPlayers()); - final Game newGame = match.createGame(); - attachToGame(newGame); - + this.game = match.createGame(); + final LobbyPlayer me = getGuiPlayer(); + for (final Player p : this.game.getPlayers()) { + if (p.getLobbyPlayer().equals(me)) { + this.gameView = (IGameView) p.getController(); + break; + } + } + + attachToGame(this.gameView); + // It's important to run match in a different thread to allow GUI inputs to be invoked from inside game. // Game is set on pause while gui player takes decisions game.getAction().invoke(new Runnable() { @Override public void run() { - match.startGame(newGame); + match.startGame(game); } }); SOverlayUtils.hideOverlay(); @@ -459,11 +504,11 @@ public enum FControl implements KeyEventDispatcher { private final FControlGameEventHandler fcVisitor = new FControlGameEventHandler(); private final FControlGamePlayback playbackControl = new FControlGamePlayback(); - private void attachToGame(Game game0) { - if (game0.getRules().getGameType() == GameType.Quest) { + private void attachToGame(final IGameView game0) { + if (game0.getGameType().equals(GameType.Quest)) { QuestController qc = FModel.getQuest(); // Reset new list when the Match round starts, not when each game starts - if (game0.getMatch().getPlayedGames().isEmpty()) { + if (game0.isFirstGameInMatch()) { qc.getCards().resetNewList(); } game0.subscribeToEvents(qc); // this one listens to player's mulligans ATM @@ -471,49 +516,45 @@ public enum FControl implements KeyEventDispatcher { inputQueue = new InputQueue(); - this.game = game0; - game.subscribeToEvents(Singletons.getControl().getSoundSystem()); + game0.subscribeToEvents(Singletons.getControl().getSoundSystem()); //switch back to match screen music Singletons.getControl().getSoundSystem().setBackgroundMusic(MusicPlaylist.MATCH); - LobbyPlayer humanLobbyPlayer = getGuiPlayer(); + final LobbyPlayer humanLobbyPlayer = getGuiPlayer(); // The UI controls should use these game data as models - CMatchUI.SINGLETON_INSTANCE.initMatch(game.getRegisteredPlayers(), humanLobbyPlayer); + final List players = game0.getPlayers(); + CMatchUI.SINGLETON_INSTANCE.initMatch(players, humanLobbyPlayer); localPlayer = null; - for (Player p : game.getPlayers()) { + gameHasHumanPlayer = false; + for (final PlayerView p : players) { if (p.getLobbyPlayer() == humanLobbyPlayer) { localPlayer = p; + gameHasHumanPlayer = true; break; } } - CDock.SINGLETON_INSTANCE.setModel(game, humanLobbyPlayer); - CStack.SINGLETON_INSTANCE.setModel(game.getStack(), localPlayer); - CPlayers.SINGLETON_INSTANCE.setModel(game); - CLog.SINGLETON_INSTANCE.setModel(game.getGameLog()); + CDock.SINGLETON_INSTANCE.setModel(game0, humanLobbyPlayer); + CStack.SINGLETON_INSTANCE.setModel(game0, localPlayer); + CPlayers.SINGLETON_INSTANCE.setModel(game0); + CLog.SINGLETON_INSTANCE.setModel(game0.getGameLog()); actuateMatchPreferences(); - VAntes.SINGLETON_INSTANCE.setModel(game.getRegisteredPlayers()); + VAntes.SINGLETON_INSTANCE.setModel(players); setCurrentScreen(FScreen.MATCH_SCREEN); SDisplayUtil.showTab(EDocID.REPORT_LOG.getDoc()); - CPrompt.SINGLETON_INSTANCE.getInputControl().setGame(game); + CPrompt.SINGLETON_INSTANCE.getInputControl().setGame(game0); // Listen to DuelOutcome event to show ViewWinLose - game.subscribeToEvents(fcVisitor); + game0.subscribeToEvents(fcVisitor); // Add playback controls to match if needed - gameHasHumanPlayer = false; - for (Player p : game.getPlayers()) { - if (p.getController().getLobbyPlayer() == getGuiPlayer()) - gameHasHumanPlayer = true; - } - - if (!gameHasHumanPlayer) { - game.subscribeToEvents(playbackControl); + if (localPlayer != null) { + game0.subscribeToEvents(playbackControl); } for (final VField field : VMatchUI.SINGLETON_INSTANCE.getFieldViews()) { @@ -522,7 +563,7 @@ public enum FControl implements KeyEventDispatcher { // per player observers were set in CMatchUI.SINGLETON_INSTANCE.initMatch //Set Field shown to current player. - VField nextField = CMatchUI.SINGLETON_INSTANCE.getFieldViewFor(game.getPlayers().get(0)); + final VField nextField = CMatchUI.SINGLETON_INSTANCE.getFieldViewFor(localPlayer); SDisplayUtil.showTab(nextField); } diff --git a/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckViewer.java b/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckViewer.java index efd2fc21b90..7c93417cfb1 100644 --- a/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckViewer.java +++ b/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckViewer.java @@ -36,7 +36,7 @@ public class FDeckViewer extends FDialog { private final CardManager cardManager; private DeckSection currentSection; - private final CardDetailPanel cardDetail = new CardDetailPanel(null); + private final CardDetailPanel cardDetail = new CardDetailPanel(); private final CardPicturePanel cardPicture = new CardPicturePanel(); private final FButton btnCopyToClipboard = new FButton("Copy to Clipboard"); private final FButton btnChangeSection = new FButton("Change Section"); diff --git a/forge-gui-desktop/src/main/java/forge/gui/BoxedProductCardListViewer.java b/forge-gui-desktop/src/main/java/forge/gui/BoxedProductCardListViewer.java index 41a60064180..05a840ea733 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/BoxedProductCardListViewer.java +++ b/forge-gui-desktop/src/main/java/forge/gui/BoxedProductCardListViewer.java @@ -99,7 +99,7 @@ public class BoxedProductCardListViewer extends FDialog { public BoxedProductCardListViewer(final String title, final String message, final List list, final Icon dialogIcon) { this.list = Collections.unmodifiableList(list); this.jList = new JList(new ChooserListModel()); - this.detail = new CardDetailPanel(null); + this.detail = new CardDetailPanel(); this.picture = new CardPicturePanel(); this.picture.setOpaque(false); diff --git a/forge-gui-desktop/src/main/java/forge/gui/CardContainer.java b/forge-gui-desktop/src/main/java/forge/gui/CardContainer.java index bf7380b7fa9..0c0c608a078 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/CardContainer.java +++ b/forge-gui-desktop/src/main/java/forge/gui/CardContainer.java @@ -18,7 +18,7 @@ package forge.gui; -import forge.game.card.Card; +import forge.view.CardView; /** * The class CardContainer. A card container is an object that references a @@ -36,7 +36,7 @@ public interface CardContainer { * @param card * a {@link forge.game.card.Card} object. */ - void setCard(Card card); + void setCard(CardView card); /** *

@@ -45,6 +45,6 @@ public interface CardContainer { * * @return a {@link forge.game.card.Card} object. */ - Card getCard(); + CardView getCard(); } diff --git a/forge-gui-desktop/src/main/java/forge/gui/CardDetailPanel.java b/forge-gui-desktop/src/main/java/forge/gui/CardDetailPanel.java index 8f673783cbd..5bbcb6f3fb1 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/CardDetailPanel.java +++ b/forge-gui-desktop/src/main/java/forge/gui/CardDetailPanel.java @@ -30,6 +30,8 @@ import forge.item.InventoryItemFromSet; import forge.model.FModel; import forge.toolbox.*; import forge.toolbox.FSkin.SkinnedPanel; +import forge.view.CardView; +import forge.view.CardView.CardStateView; import forge.view.FDialog; import org.apache.commons.lang3.StringUtils; @@ -62,7 +64,7 @@ public class CardDetailPanel extends SkinnedPanel { private final FHtmlViewer cdArea; private final FScrollPane scrArea; - public CardDetailPanel(final Card card) { + public CardDetailPanel() { super(); this.setLayout(null); this.setOpaque(false); @@ -74,7 +76,7 @@ public class CardDetailPanel extends SkinnedPanel { this.setInfoLabel = new JLabel(); this.setInfoLabel.setHorizontalAlignment(SwingConstants.CENTER); - Font font = new Font("Dialog", 0, 14); + final Font font = new Font("Dialog", 0, 14); this.nameCostLabel.setFont(font); this.typeLabel.setFont(font); this.idLabel.setFont(font); @@ -91,8 +93,6 @@ public class CardDetailPanel extends SkinnedPanel { this.add(this.powerToughnessLabel); this.add(this.setInfoLabel); this.add(this.scrArea); - - this.setCard(card); } @Override @@ -121,7 +121,7 @@ public class CardDetailPanel extends SkinnedPanel { this.scrArea.setBounds(0, y, getWidth(), getHeight() - y); } - public final void setItem(InventoryItemFromSet item) { + public final void setItem(final InventoryItemFromSet item) { nameCostLabel.setText(item.getName()); typeLabel.setVisible(false); powerToughnessLabel.setVisible(false); @@ -155,7 +155,7 @@ public class CardDetailPanel extends SkinnedPanel { }); } - /** {@inheritDoc} */ + @Deprecated public final void setCard(Card card) { this.nameCostLabel.setText(""); this.typeLabel.setVisible(true); @@ -169,7 +169,7 @@ public class CardDetailPanel extends SkinnedPanel { this.setInfoLabel.setBorder(null); this.cdArea.setText(""); if (card == null) { - this.updateBorder(null, false); + this.updateBorder((Card)null, false); return; } @@ -258,6 +258,102 @@ public class CardDetailPanel extends SkinnedPanel { }); } + public final void setCard(final CardView card, final boolean isInAltState) { + this.nameCostLabel.setText(""); + this.typeLabel.setVisible(true); + this.typeLabel.setText(""); + this.powerToughnessLabel.setVisible(true); + this.powerToughnessLabel.setText(""); + this.idLabel.setText(""); + this.setInfoLabel.setText(""); + this.setInfoLabel.setToolTipText(""); + this.setInfoLabel.setOpaque(false); + this.setInfoLabel.setBorder(null); + this.cdArea.setText(""); + if (card == null) { + this.updateBorder((CardStateView)null, false); + return; + } + + final CardStateView state = card.getState(isInAltState); + //this.setCard(card.card); + + boolean canShowThis = false; + + if (Singletons.getControl().mayShowCard(card) || FDialog.isModalOpen()) { //allow showing cards while modal open to account for revealing, picking, and ordering cards + canShowThis = true; + + if (state.getManaCost().isNoCost()) { + this.nameCostLabel.setText(state.getName()); + } else { + String manaCost = state.getManaCost().toString(); + //if (state.isSplitCard() && card.getCurState() == CardCharacteristicName.Original) { + // manaCost = card.getRules().getMainPart().getManaCost().toString() + " // " + card.getRules().getOtherPart().getManaCost().toString(); + //} + this.nameCostLabel.setText(FSkin.encodeSymbols(state.getName() + " - " + manaCost, true)); + } + this.typeLabel.setText(CardDetailUtil.formatCardType(state)); + + String set = card.getSetCode(); + this.setInfoLabel.setText(set); + if (null != set && !set.isEmpty()) { + CardEdition edition = FModel.getMagicDb().getEditions().get(set); + if (null == edition) { + setInfoLabel.setToolTipText(card.getRarity().name()); + } + else { + setInfoLabel.setToolTipText(String.format("%s (%s)", edition.getName(), card.getRarity().name())); + } + + this.setInfoLabel.setOpaque(true); + + Color backColor; + switch(card.getRarity()) { + case Uncommon: + backColor = fromDetailColor(DetailColors.UNCOMMON); + break; + + case Rare: + backColor = fromDetailColor(DetailColors.RARE); + break; + + case MythicRare: + backColor = fromDetailColor(DetailColors.MYTHIC); + break; + + case Special: //"Timeshifted" or other Special Rarity Cards + backColor = fromDetailColor(DetailColors.SPECIAL); + break; + + default: //case BasicLand: + case Common: + backColor = fromDetailColor(DetailColors.COMMON); + break; + } + + Color foreColor = FSkin.getHighContrastColor(backColor); + this.setInfoLabel.setBackground(backColor); + this.setInfoLabel.setForeground(foreColor); + this.setInfoLabel.setBorder(BorderFactory.createLineBorder(foreColor)); + } + } + + this.updateBorder(state, canShowThis); + + this.powerToughnessLabel.setText(CardDetailUtil.formatPowerToughness(state)); + + this.idLabel.setText(CardDetailUtil.formatCardId(state)); + + // fill the card text + this.cdArea.setText(FSkin.encodeSymbols(CardDetailUtil.composeCardText(state, canShowThis), true)); + + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + scrArea.getVerticalScrollBar().setValue(scrArea.getVerticalScrollBar().getMinimum()); + } + }); + } + /** @return FLabel */ public FLabel getNameCostLabel() { return this.nameCostLabel; @@ -283,6 +379,7 @@ public class CardDetailPanel extends SkinnedPanel { return this.cdArea; } + @Deprecated private void updateBorder(final Card card, final boolean canShow) { // color info if (card == null) { @@ -296,6 +393,19 @@ public class CardDetailPanel extends SkinnedPanel { scrArea.setBorder(BorderFactory.createMatteBorder(2, 0, 0, 0, color)); } + private void updateBorder(final CardStateView card, final boolean canShow) { + // color info + if (card == null) { + this.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2)); + scrArea.setBorder(BorderFactory.createEmptyBorder(2, 0, 0, 0)); + return; + } + + Color color = fromDetailColor(CardDetailUtil.getBorderColor(card, canShow)); + this.setBorder(BorderFactory.createLineBorder(color, 2)); + scrArea.setBorder(BorderFactory.createMatteBorder(2, 0, 0, 0, color)); + } + //ensure mouse listener hooked up to all certain opaque child components so it can get raised properly @Override public void addMouseListener(MouseListener l) { diff --git a/forge-gui-desktop/src/main/java/forge/gui/CardListViewer.java b/forge-gui-desktop/src/main/java/forge/gui/CardListViewer.java index 339d8b00f6c..093ef6dc939 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/CardListViewer.java +++ b/forge-gui-desktop/src/main/java/forge/gui/CardListViewer.java @@ -97,7 +97,7 @@ public class CardListViewer extends FDialog { public CardListViewer(final String title, final String message, final List list, final Icon dialogIcon) { this.list = Collections.unmodifiableList(list); this.jList = new JList(new ChooserListModel()); - this.detail = new CardDetailPanel(null); + this.detail = new CardDetailPanel(); this.picture = new CardPicturePanel(); this.picture.setOpaque(false); diff --git a/forge-gui-desktop/src/main/java/forge/gui/CardPicturePanel.java b/forge-gui-desktop/src/main/java/forge/gui/CardPicturePanel.java index 8febb3583ef..bc171540a6c 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/CardPicturePanel.java +++ b/forge-gui-desktop/src/main/java/forge/gui/CardPicturePanel.java @@ -18,21 +18,21 @@ package forge.gui; +import java.awt.BorderLayout; +import java.awt.image.BufferedImage; + +import javax.swing.JPanel; + import forge.ImageCache; import forge.ImageKeys; -import forge.card.CardCharacteristicName; import forge.game.card.Card; import forge.item.InventoryItem; import forge.model.FModel; import forge.properties.ForgePreferences.FPref; import forge.toolbox.imaging.FImagePanel; -import forge.toolbox.imaging.FImageUtil; import forge.toolbox.imaging.FImagePanel.AutoSizeImageMode; - -import javax.swing.*; - -import java.awt.*; -import java.awt.image.BufferedImage; +import forge.toolbox.imaging.FImageUtil; +import forge.view.CardView.CardStateView; /** * Displays image associated with a card or inventory item. @@ -48,7 +48,7 @@ public final class CardPicturePanel extends JPanel { private final FImagePanel panel; private BufferedImage currentImage; - private boolean mayShowCard; + private boolean mayShowObject; public CardPicturePanel() { super(new BorderLayout()); @@ -59,23 +59,21 @@ public final class CardPicturePanel extends JPanel { public void setCard(final InventoryItem cp) { this.displayed = cp; - this.mayShowCard = true; + this.mayShowObject = true; this.setImage(); } - //@Override + @Deprecated public void setCard(final Card c, boolean mayShowCard) { this.displayed = c; - this.mayShowCard = mayShowCard; + this.mayShowObject = mayShowCard; this.setImage(); } - public void setCardImage(CardCharacteristicName flipState) { - BufferedImage image = FImageUtil.getImage((Card)displayed, flipState); - if (image != null && image != this.currentImage) { - this.currentImage = image; - this.panel.setImage(image, getAutoSizeImageMode()); - } + public void setCard(final CardStateView c, final boolean mayShowCard) { + this.displayed = c; + this.mayShowObject = mayShowCard; + this.setImage(); } public void setImage() { @@ -88,14 +86,19 @@ public final class CardPicturePanel extends JPanel { public BufferedImage getImage() { if (displayed instanceof InventoryItem) { - InventoryItem item = (InventoryItem) displayed; + final InventoryItem item = (InventoryItem) displayed; return ImageCache.getOriginalImage(ImageKeys.getImageKey(item, false), true); } else if (displayed instanceof Card) { - if (mayShowCard) { + if (mayShowObject) { return FImageUtil.getImage((Card)displayed); } return ImageCache.getOriginalImage(ImageKeys.TOKEN_PREFIX + ImageKeys.MORPH_IMAGE, true); + } else if (displayed instanceof CardStateView) { + if (mayShowObject) { + return FImageUtil.getImage((CardStateView)displayed); + } + return ImageCache.getOriginalImage(ImageKeys.TOKEN_PREFIX + ImageKeys.MORPH_IMAGE, true); } return null; } diff --git a/forge-gui-desktop/src/main/java/forge/gui/DualListBox.java b/forge-gui-desktop/src/main/java/forge/gui/DualListBox.java index e3201fd2d39..97b46b7482d 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/DualListBox.java +++ b/forge-gui-desktop/src/main/java/forge/gui/DualListBox.java @@ -1,23 +1,37 @@ package forge.gui; -import forge.game.card.Card; -import forge.game.spellability.SpellAbility; -import forge.item.IPaperCard; -import forge.item.PaperCard; -import forge.screens.match.CMatchUI; -import forge.toolbox.*; -import forge.view.FDialog; +import java.awt.BorderLayout; +import java.awt.GridLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.FocusAdapter; +import java.awt.event.FocusEvent; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.util.ArrayList; +import java.util.List; -import javax.swing.*; +import javax.swing.JPanel; +import javax.swing.ListModel; +import javax.swing.SwingUtilities; import javax.swing.event.ListDataEvent; import javax.swing.event.ListDataListener; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; -import java.awt.*; -import java.awt.event.*; -import java.util.ArrayList; -import java.util.List; +import forge.item.IPaperCard; +import forge.item.PaperCard; +import forge.screens.match.CMatchUI; +import forge.toolbox.FButton; +import forge.toolbox.FLabel; +import forge.toolbox.FList; +import forge.toolbox.FPanel; +import forge.toolbox.FScrollPane; +import forge.view.CardView; +import forge.view.FDialog; +import forge.view.SpellAbilityView; // An input box for handling the order of choices. // Left box has the original choices @@ -310,13 +324,13 @@ public class DualListBox extends FDialog { if (!showCard || null == obj) { return; } - Card card = null; - if (obj instanceof Card) { - card = (Card) obj; - } else if (obj instanceof SpellAbility) { - card = ((SpellAbility) obj).getHostCard(); + CardView card = null; + if (obj instanceof CardView) { + card = (CardView) obj; + } else if (obj instanceof SpellAbilityView) { + card = ((SpellAbilityView) obj).getHostCard(); } else if (obj instanceof PaperCard) { - card = Card.getCardForUi((IPaperCard) obj); + card = CardView.getCardForUi((IPaperCard) obj); } GuiUtils.clearPanelSelections(); diff --git a/forge-gui-desktop/src/main/java/forge/gui/GuiChoose.java b/forge-gui-desktop/src/main/java/forge/gui/GuiChoose.java index adc73d70132..052f73f9883 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/GuiChoose.java +++ b/forge-gui-desktop/src/main/java/forge/gui/GuiChoose.java @@ -1,24 +1,30 @@ package forge.gui; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.concurrent.Callable; +import java.util.concurrent.FutureTask; + +import javax.swing.JList; +import javax.swing.WindowConstants; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; + +import org.apache.commons.lang3.StringUtils; + import com.google.common.base.Function; import com.google.common.collect.Iterables; import forge.FThreads; import forge.Singletons; -import forge.game.card.Card; import forge.item.InventoryItem; import forge.screens.match.CMatchUI; import forge.toolbox.FOptionPane; - -import org.apache.commons.lang3.StringUtils; - -import javax.swing.*; -import javax.swing.event.ListSelectionEvent; -import javax.swing.event.ListSelectionListener; - -import java.util.*; -import java.util.concurrent.Callable; -import java.util.concurrent.FutureTask; +import forge.view.CardView; /** * TODO: Write javadoc for this type. @@ -200,8 +206,8 @@ public class GuiChoose { list.addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(final ListSelectionEvent ev) { - if (list.getSelectedValue() instanceof Card) { - Card card = (Card) list.getSelectedValue(); + if (list.getSelectedValue() instanceof CardView) { + final CardView card = (CardView) list.getSelectedValue(); if (card.isFaceDown() && Singletons.getControl().mayShowCard(card)) { CMatchUI.SINGLETON_INSTANCE.setCard(card, true); } @@ -240,17 +246,17 @@ public class GuiChoose { return null; } - public static List many(final String title, final String topCaption, int cnt, final List sourceChoices, Card referenceCard) { + public static List many(final String title, final String topCaption, int cnt, final List sourceChoices, final CardView referenceCard) { return order(title, topCaption, cnt, cnt, sourceChoices, null, referenceCard, false); } - public static List many(final String title, final String topCaption, int min, int max, final List sourceChoices, Card referenceCard) { + public static List many(final String title, final String topCaption, int min, int max, final List sourceChoices, final CardView referenceCard) { int m2 = min >= 0 ? sourceChoices.size() - min : -1; int m1 = max >= 0 ? sourceChoices.size() - max : -1; return order(title, topCaption, m1, m2, sourceChoices, null, referenceCard, false); } - public static List order(final String title, final String top, final List sourceChoices, Card referenceCard) { + public static List order(final String title, final String top, final List sourceChoices, final CardView referenceCard) { return order(title, top, 0, 0, sourceChoices, null, referenceCard, false); } @@ -261,7 +267,7 @@ public class GuiChoose { } public static List order(final String title, final String top, final int remainingObjectsMin, final int remainingObjectsMax, - final List sourceChoices, final List destChoices, final Card referenceCard, final boolean sideboardingMode) { + final List sourceChoices, final List destChoices, final CardView referenceCard, final boolean sideboardingMode) { // An input box for handling the order of choices. Callable> callable = new Callable>() { diff --git a/forge-gui-desktop/src/main/java/forge/gui/GuiDialog.java b/forge-gui-desktop/src/main/java/forge/gui/GuiDialog.java index c5f9fddd099..749587f9ba9 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/GuiDialog.java +++ b/forge-gui-desktop/src/main/java/forge/gui/GuiDialog.java @@ -1,17 +1,17 @@ package forge.gui; -import forge.FThreads; -import forge.game.card.Card; -import forge.screens.match.CMatchUI; -import forge.toolbox.FOptionPane; - -import org.apache.commons.lang3.StringUtils; - -import javax.swing.*; - import java.util.concurrent.Callable; import java.util.concurrent.FutureTask; +import javax.swing.UIManager; + +import org.apache.commons.lang3.StringUtils; + +import forge.FThreads; +import forge.screens.match.CMatchUI; +import forge.toolbox.FOptionPane; +import forge.view.CardView; + /** * Holds player interactions using standard windows * @@ -19,17 +19,17 @@ import java.util.concurrent.FutureTask; public class GuiDialog { private static final String[] defaultConfirmOptions = { "Yes", "No" }; - public static boolean confirm(final Card c, final String question) { + public static boolean confirm(final CardView c, final String question) { return GuiDialog.confirm(c, question, true, null); } - public static boolean confirm(final Card c, final String question, final boolean defaultChoice) { + public static boolean confirm(final CardView c, final String question, final boolean defaultChoice) { return GuiDialog.confirm(c, question, defaultChoice, null); } - public static boolean confirm(final Card c, final String question, String[] options) { + public static boolean confirm(final CardView c, final String question, String[] options) { return GuiDialog.confirm(c, question, true, options); } - public static boolean confirm(final Card c, final String question, final boolean defaultIsYes, final String[] options) { + public static boolean confirm(final CardView c, final String question, final boolean defaultIsYes, final String[] options) { Callable confirmTask = new Callable() { @Override public Boolean call() throws Exception { @@ -37,7 +37,7 @@ public class GuiDialog { CMatchUI.SINGLETON_INSTANCE.setCard(c); } - final String title = c == null ? "Question" : c.getCardForUi().getName() + " - Ability"; + final String title = c == null ? "Question" : c + " - Ability"; String questionToUse = StringUtils.isBlank(question) ? "Activate card's ability?" : question; String[] opts = options == null ? defaultConfirmOptions : options; int answer = FOptionPane.showOptionDialog(questionToUse, title, FOptionPane.QUESTION_ICON, opts, defaultIsYes ? 0 : 1); diff --git a/forge-gui-desktop/src/main/java/forge/gui/GuiUtils.java b/forge-gui-desktop/src/main/java/forge/gui/GuiUtils.java index 70628bb636a..d1ba41f8a4b 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/GuiUtils.java +++ b/forge-gui-desktop/src/main/java/forge/gui/GuiUtils.java @@ -17,20 +17,26 @@ */ package forge.gui; -import forge.game.card.Card; -import forge.screens.match.VMatchUI; -import forge.screens.match.views.VField; -import forge.view.arcane.CardPanel; - -import javax.swing.*; - -import java.awt.*; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.FontFormatException; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.IOException; import java.util.List; +import javax.swing.JMenu; +import javax.swing.JMenuItem; +import javax.swing.JPopupMenu; +import javax.swing.JSeparator; +import javax.swing.KeyStroke; + +import forge.screens.match.VMatchUI; +import forge.screens.match.views.VField; +import forge.view.CardView; +import forge.view.arcane.CardPanel; + /** *

* GuiUtils class. @@ -81,15 +87,15 @@ public final class GuiUtils { /** * Highlight a card on the playfield. * - * @param c + * @param card * a card to be highlighted */ - public static void setPanelSelection(final Card c) { + public static void setPanelSelection(final CardView card) { mainLoop: - for (VField v : VMatchUI.SINGLETON_INSTANCE.getFieldViews()) { - List panels = v.getTabletop().getCardPanels(); - for (CardPanel p : panels) { - if (p.getCard().equals(c)) { + for (final VField v : VMatchUI.SINGLETON_INSTANCE.getFieldViews()) { + final List panels = v.getTabletop().getCardPanels(); + for (final CardPanel p : panels) { + if (p.getCard().equals(card)) { p.setSelected(true); break mainLoop; } diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/views/ImageView.java b/forge-gui-desktop/src/main/java/forge/itemmanager/views/ImageView.java index db29dfe15a7..fa5d28e7497 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/views/ImageView.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/views/ImageView.java @@ -1,7 +1,6 @@ package forge.itemmanager.views; import forge.ImageCache; -import forge.game.card.Card; import forge.assets.FSkinProp; import forge.deck.DeckProxy; import forge.gui.framework.ILocalRepaint; @@ -20,6 +19,7 @@ import forge.toolbox.FSkin.SkinColor; import forge.toolbox.FSkin.SkinFont; import forge.toolbox.FSkin.SkinImage; import forge.toolbox.special.CardZoomer; +import forge.view.CardView; import forge.view.arcane.CardPanel; import javax.swing.*; @@ -232,7 +232,7 @@ public class ImageView extends ItemView { ItemInfo item = getItemAtPoint(e.getPoint()); if (item != null && item.item instanceof IPaperCard) { setLockHoveredItem(true); //lock hoveredItem while zoomer open - Card card = Card.getCardForUi((IPaperCard) item.item); + final CardView card = CardView.getCardForUi((IPaperCard) item.item); CardZoomer.SINGLETON_INSTANCE.doMouseButtonZoom(card); } } @@ -1099,8 +1099,8 @@ public class ImageView extends ItemView { if (item instanceof IPaperCard) { IPaperCard paperCard = (IPaperCard)item; if (paperCard.isFoil()) { - Card card = Card.getCardForUi(paperCard); - if (card.getFoil() == 0) { //if foil finish not yet established, assign a random one + final CardView card = CardView.getCardForUi(paperCard); + if (card.getFoilIndex() == 0) { //if foil finish not yet established, assign a random one card.setRandomFoil(); } CardPanel.drawFoilEffect(g, card, bounds.x, bounds.y, bounds.width, bounds.height, borderSize); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/VSubmenuConstructed.java b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/VSubmenuConstructed.java index 6469802d6cc..bf2d0ab3e70 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/VSubmenuConstructed.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/VSubmenuConstructed.java @@ -321,7 +321,7 @@ public enum VSubmenuConstructed implements IVSubmenu { FScrollPane scrAvatars = new FScrollPane(vgdAvatarList, true, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); - CardDetailPanel vgdDetail = new CardDetailPanel(null); + CardDetailPanel vgdDetail = new CardDetailPanel(); vgdAvatarDetails.add(vgdDetail); vgdDeckPanel.setLayout(new MigLayout(sectionConstraints)); diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java index d1eeb8611e2..e2dcb6a43b1 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java @@ -17,49 +17,65 @@ */ package forge.screens.match; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.swing.JMenu; + +import org.apache.commons.lang3.tuple.Pair; +import org.testng.collections.Maps; + import com.google.common.collect.Lists; +import com.google.common.collect.Sets; import com.google.common.eventbus.EventBus; import com.google.common.eventbus.Subscribe; -import forge.LobbyPlayer; -import forge.UiCommand; import forge.FThreads; import forge.ImageCache; +import forge.LobbyPlayer; import forge.Singletons; +import forge.UiCommand; import forge.events.IUiEventVisitor; import forge.events.UiEvent; import forge.events.UiEventAttackerDeclared; import forge.events.UiEventBlockerAssigned; -import forge.game.GameEntity; -import forge.game.card.Card; import forge.game.combat.Combat; import forge.game.phase.PhaseType; -import forge.game.player.Player; -import forge.game.zone.Zone; import forge.game.zone.ZoneType; -import forge.gui.framework.*; +import forge.gui.framework.EDocID; +import forge.gui.framework.FScreen; +import forge.gui.framework.ICDoc; +import forge.gui.framework.IVDoc; +import forge.gui.framework.SDisplayUtil; import forge.item.InventoryItem; import forge.menus.IMenuProvider; import forge.model.FModel; import forge.properties.ForgePreferences.FPref; import forge.quest.QuestDraftUtils; -import forge.screens.match.controllers.*; +import forge.screens.match.controllers.CAntes; +import forge.screens.match.controllers.CCombat; +import forge.screens.match.controllers.CDetail; +import forge.screens.match.controllers.CPicture; +import forge.screens.match.controllers.CPrompt; import forge.screens.match.menus.CMatchUIMenus; -import forge.screens.match.views.*; +import forge.screens.match.views.VCommand; +import forge.screens.match.views.VField; +import forge.screens.match.views.VHand; +import forge.screens.match.views.VPlayers; import forge.toolbox.FOptionPane; import forge.toolbox.FOverlay; import forge.toolbox.FSkin; import forge.toolbox.FSkin.SkinImage; import forge.toolbox.special.PhaseLabel; +import forge.view.CardView; +import forge.view.GameEntityView; +import forge.view.PlayerView; import forge.view.arcane.CardPanel; import forge.view.arcane.PlayArea; -import org.apache.commons.lang3.tuple.Pair; - -import javax.swing.*; - -import java.util.*; - /** * Constructs instance of match UI controller, used as a single point of * top-level control for child UIs. Tasks targeting the view of individual @@ -71,7 +87,7 @@ import java.util.*; public enum CMatchUI implements ICDoc, IMenuProvider { SINGLETON_INSTANCE; - private List sortedPlayers; + private List sortedPlayers; private VMatchUI view; private EventBus uiEvents; @@ -85,14 +101,12 @@ public enum CMatchUI implements ICDoc, IMenuProvider { uiEvents.register(visitor); } - private SkinImage getPlayerAvatar(final Player p, final int defaultIndex) { - LobbyPlayer lp = p.getLobbyPlayer(); - - if (avatarImages.containsKey(lp)) { - return ImageCache.getIcon(avatarImages.get(lp)); + private SkinImage getPlayerAvatar(final LobbyPlayer p, final int defaultIndex) { + if (avatarImages.containsKey(p)) { + return ImageCache.getIcon(avatarImages.get(p)); } - int avatarIdx = lp.getAvatarIndex(); + int avatarIdx = p.getAvatarIndex(); return FSkin.getAvatars().get(avatarIdx >= 0 ? avatarIdx : defaultIndex); } @@ -108,7 +122,7 @@ public enum CMatchUI implements ICDoc, IMenuProvider { * @param numFieldPanels int * @param numHandPanels int */ - public void initMatch(final List players, LobbyPlayer localPlayer) { + public void initMatch(final List players, LobbyPlayer localPlayer) { view = VMatchUI.SINGLETON_INSTANCE; // TODO fix for use with multiplayer @@ -121,7 +135,7 @@ public enum CMatchUI implements ICDoc, IMenuProvider { final List commands = new ArrayList(); int i = 0; - for (Player p : sortedPlayers) { + for (final PlayerView p : sortedPlayers) { // A field must be initialized after it's instantiated, to update player info. // No player, no init. VField f = new VField(EDocID.Fields[i], p, localPlayer); @@ -130,7 +144,7 @@ public enum CMatchUI implements ICDoc, IMenuProvider { commands.add(c); //setAvatar(f, new ImageIcon(FSkin.getAvatars().get())); - setAvatar(f, getPlayerAvatar(p, Integer.parseInt(indices[i > 2 ? 1 : 0]))); + setAvatar(f, getPlayerAvatar(p.getLobbyPlayer(), Integer.parseInt(indices[i > 2 ? 1 : 0]))); f.getLayoutControl().initialize(); c.getLayoutControl().initialize(); i++; @@ -149,7 +163,7 @@ public enum CMatchUI implements ICDoc, IMenuProvider { final List hands = new ArrayList(); int i = 0; - for (Player p : sortedPlayers) { + for (final PlayerView p : sortedPlayers) { if (p.getLobbyPlayer() == localPlayer) { VHand newHand = new VHand(EDocID.Hands[i], p); newHand.getLayoutControl().initialize(); @@ -166,9 +180,9 @@ public enum CMatchUI implements ICDoc, IMenuProvider { view.setHandViews(hands); } - private List shiftPlayersPlaceLocalFirst(final List players, LobbyPlayer localPlayer) { + private List shiftPlayersPlaceLocalFirst(final List players, final LobbyPlayer localPlayer) { // get an arranged list so that the first local player is at index 0 - List sortedPlayers = Lists.newArrayList(players); + final List sortedPlayers = Lists.newArrayList(players); int ixFirstHuman = -1; for (int i = 0; i < players.size(); i++) { if (sortedPlayers.get(i).getLobbyPlayer() == localPlayer) { @@ -199,17 +213,17 @@ public enum CMatchUI implements ICDoc, IMenuProvider { CPrompt.SINGLETON_INSTANCE.setMessage(s0); } - public VField getFieldViewFor(Player p) { + public VField getFieldViewFor(PlayerView p) { int idx = getPlayerIndex(p); return idx < 0 ? null :view.getFieldViews().get(idx); } - public VCommand getCommandFor(Player p) { + public VCommand getCommandFor(PlayerView p) { int idx = getPlayerIndex(p); return idx < 0 ? null :view.getCommandViews().get(idx); } - public VHand getHandFor(Player p) { + public VHand getHandFor(PlayerView p) { int idx = getPlayerIndex(p); List allHands = view.getHands(); return idx < 0 || idx >= allHands.size() ? null : allHands.get(idx); @@ -226,15 +240,15 @@ public enum CMatchUI implements ICDoc, IMenuProvider { * @param overrideOrder overriding combatant order */ @SuppressWarnings("unchecked") - public Map getDamageToAssign(final Card attacker, final List blockers, final int damage, final GameEntity defender, final boolean overrideOrder) { + public Map getDamageToAssign(final CardView attacker, final List blockers, final int damage, final GameEntityView defender, final boolean overrideOrder) { if (damage <= 0) { - return new HashMap(); + return Maps.newHashMap(); } // If the first blocker can absorb all of the damage, don't show the Assign Damage Frame - Card firstBlocker = blockers.get(0); - if (!overrideOrder && !attacker.hasKeyword("Deathtouch") && firstBlocker.getLethalDamage() >= damage) { - Map res = new HashMap(); + final CardView firstBlocker = blockers.get(0); + if (!overrideOrder && !attacker.getState().hasDeathtouch() && firstBlocker.getLethalDamage() >= damage) { + final Map res = Maps.newHashMap(); res.put(firstBlocker, damage); return res; } @@ -246,7 +260,7 @@ public enum CMatchUI implements ICDoc, IMenuProvider { VAssignDamage v = new VAssignDamage(attacker, blockers, damage, defender, overrideOrder); result[0] = v.getDamageMap(); }}); - return (Map)result[0]; + return (Map)result[0]; } /** @@ -257,20 +271,20 @@ public enum CMatchUI implements ICDoc, IMenuProvider { * @param phase   {@link java.lang.String} * @return boolean */ - public final boolean stopAtPhase(final Player turn, final PhaseType phase) { + public final boolean stopAtPhase(final PlayerView turn, final PhaseType phase) { VField vf = getFieldViewFor(turn); PhaseLabel label = vf.getPhaseIndicator().getLabelFor(phase); return label == null || label.getEnabled(); } - public void setCard(final Card c) { - FThreads.assertExecutedByEdt(true); - setCard(c, false); + public void setCard(final CardView c) { + this.setCard(c, c.isInAltState()); } - public void setCard(final Card c, final boolean showFlipped) { - CDetail.SINGLETON_INSTANCE.showCard(c); - CPicture.SINGLETON_INSTANCE.showCard(c, showFlipped); + public void setCard(final CardView c, final boolean isInAltState) { + FThreads.assertExecutedByEdt(true); + CDetail.SINGLETON_INSTANCE.showCard(c, isInAltState); + CPicture.SINGLETON_INSTANCE.showCard(c, isInAltState); } public void setCard(final InventoryItem c) { @@ -278,7 +292,7 @@ public enum CMatchUI implements ICDoc, IMenuProvider { CPicture.SINGLETON_INSTANCE.showImage(c); } - private int getPlayerIndex(Player player) { + private int getPlayerIndex(PlayerView player) { return sortedPlayers.indexOf(player); } @@ -305,19 +319,19 @@ public enum CMatchUI implements ICDoc, IMenuProvider { CCombat.SINGLETON_INSTANCE.update(); } // showBlockers() - Set highlightedPlayers = new HashSet(); - public void setHighlighted(Player ge, boolean b) { + final Set highlightedPlayers = Sets.newHashSet(); + public void setHighlighted(PlayerView ge, boolean b) { if (b) highlightedPlayers.add(ge); else highlightedPlayers.remove(ge); } - public boolean isHighlighted(Player player) { + public boolean isHighlighted(final PlayerView player) { return highlightedPlayers.contains(player); } - Set highlightedCards = new HashSet(); + Set highlightedCards = Sets.newHashSet(); // used to highlight cards in UI - public void setUsedToPay(Card card, boolean value) { + public void setUsedToPay(CardView card, boolean value) { FThreads.assertExecutedByEdt(true); boolean hasChanged = value ? highlightedCards.add(card) : highlightedCards.remove(card); @@ -326,14 +340,14 @@ public enum CMatchUI implements ICDoc, IMenuProvider { } } - public boolean isUsedToPay(Card card) { + public boolean isUsedToPay(CardView card) { return highlightedCards.contains(card); } - public void updateZones(List> zonesToUpdate) { + public void updateZones(List> zonesToUpdate) { //System.out.println("updateZones " + zonesToUpdate); - for (Pair kv : zonesToUpdate) { - Player owner = kv.getKey(); + for (Pair kv : zonesToUpdate) { + PlayerView owner = kv.getKey(); ZoneType zt = kv.getValue(); if (zt == ZoneType.Command) { @@ -355,41 +369,39 @@ public enum CMatchUI implements ICDoc, IMenuProvider { } // Player's mana pool changes - public void updateManaPool(List manaPoolUpdate) { - for (Player p : manaPoolUpdate) { + public void updateManaPool(final List manaPoolUpdate) { + for (final PlayerView p : manaPoolUpdate) { getFieldViewFor(p).getDetailsPanel().updateManaPool(); } } // Player's lives and poison counters - public void updateLives(List livesUpdate) { - for (Player p : livesUpdate) { + public void updateLives(final List livesUpdate) { + for (final PlayerView p : livesUpdate) { getFieldViewFor(p).updateDetails(); } } - public void updateCards(Set cardsToUpdate) { - for (Card c : cardsToUpdate) { + public void updateCards(final Set cardsToUpdate) { + for (final CardView c : cardsToUpdate) { updateSingleCard(c); } } - public void updateSingleCard(Card c) { - Zone zone = c.getZone(); - if (zone != null && zone.getZoneType() == ZoneType.Battlefield) { - PlayArea pa = getFieldViewFor(zone.getPlayer()).getTabletop(); + public void updateSingleCard(final CardView c) { + if (ZoneType.Battlefield.equals(c.getZone())) { + final PlayArea pa = getFieldViewFor(c.getController()).getTabletop(); pa.updateCard(c, false); } } - public void refreshCardDetails(Collection cards) { - for (Card c : cards) { - Zone zone = c.getZone(); - if (zone != null && zone.getZoneType() == ZoneType.Battlefield) { - PlayArea pa = getFieldViewFor(zone.getPlayer()).getTabletop(); - CardPanel pnl = pa.getCardPanel(c.getUniqueNumber()); + public void refreshCardDetails(final Iterable cards) { + for (final CardView c : cards) { + if (ZoneType.Battlefield.equals(c.getZone())) { + PlayArea pa = getFieldViewFor(c.getController()).getTabletop(); + CardPanel pnl = pa.getCardPanel(c.getId()); if (pnl != null) { pnl.updatePTOverlay(); } diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/ControlWinLose.java b/forge-gui-desktop/src/main/java/forge/screens/match/ControlWinLose.java index 8d902dbfe55..5695a7b80b9 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/ControlWinLose.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/ControlWinLose.java @@ -1,15 +1,15 @@ package forge.screens.match; -import forge.Singletons; -import forge.game.Game; -import forge.game.Match; -import forge.gui.SOverlayUtils; -import forge.gui.framework.FScreen; -import javax.swing.*; - import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import javax.swing.JButton; + +import forge.Singletons; +import forge.gui.SOverlayUtils; +import forge.gui.framework.FScreen; +import forge.view.IGameView; + /** * Default controller for a ViewWinLose object. This class can * be extended for various game modes to populate the custom @@ -18,13 +18,13 @@ import java.awt.event.ActionListener; */ public class ControlWinLose { private final ViewWinLose view; - protected final Game lastGame; + protected final IGameView lastGame; /** @param v   ViewWinLose * @param match */ - public ControlWinLose(final ViewWinLose v, Game game) { + public ControlWinLose(final ViewWinLose v, final IGameView game0) { this.view = v; - this.lastGame = game; + this.lastGame = game0; addListeners(); } @@ -59,17 +59,15 @@ public class ControlWinLose { saveOptions(); Singletons.getControl().endCurrentGame(); - Singletons.getControl().startGameWithUi(lastGame.getMatch()); + Singletons.getControl().startGameInSameMatch(); } /** Action performed when "restart" button is pressed in default win/lose UI. */ public void actionOnRestart() { SOverlayUtils.hideOverlay(); saveOptions(); - final Match match = lastGame.getMatch(); - match.clearGamesPlayed(); Singletons.getControl().endCurrentGame(); - Singletons.getControl().startGameWithUi(match); + Singletons.getControl().startGameAndClearMatch(); } /** Action performed when "quit" button is pressed in default win/lose UI. */ diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/GauntletWinLose.java b/forge-gui-desktop/src/main/java/forge/screens/match/GauntletWinLose.java index 052da685a6c..07772d8fefc 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/GauntletWinLose.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/GauntletWinLose.java @@ -17,18 +17,20 @@ package forge.screens.match; * along with this program. If not, see . */ +import java.awt.Color; +import java.util.List; + +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.SwingConstants; + +import net.miginfocom.swing.MigLayout; import forge.assets.FSkinProp; -import forge.game.Game; import forge.gauntlet.GauntletWinLoseController; import forge.toolbox.FLabel; import forge.toolbox.FSkin; import forge.toolbox.FSkin.SkinnedPanel; -import net.miginfocom.swing.MigLayout; - -import javax.swing.*; - -import java.awt.*; -import java.util.List; +import forge.view.IGameView; /** * The Win/Lose handler for 'gauntlet' type tournament @@ -43,9 +45,9 @@ public class GauntletWinLose extends ControlWinLose { * @param view0 ViewWinLose object * @param match */ - public GauntletWinLose(final ViewWinLose view0, Game lastGame) { - super(view0, lastGame); - controller = new GauntletWinLoseController(view0, lastGame) { + public GauntletWinLose(final ViewWinLose view0, final IGameView game0) { + super(view0, game0); + controller = new GauntletWinLoseController(view0, game0) { @Override protected void showOutcome(String message1, String message2, FSkinProp icon, List lstEventNames, List lstEventRecords, int len, int num) { final JLabel lblTitle = new FLabel.Builder().text("Gauntlet Progress") diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/LimitedWinLose.java b/forge-gui-desktop/src/main/java/forge/screens/match/LimitedWinLose.java index d283b8be1a5..352e0a6318d 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/LimitedWinLose.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/LimitedWinLose.java @@ -21,12 +21,12 @@ import java.awt.Dimension; import javax.swing.SwingConstants; -import forge.game.Game; import forge.limited.LimitedWinLoseController; import forge.toolbox.FSkin; import forge.toolbox.FSkin.Colors; import forge.toolbox.FSkin.SkinColor; import forge.toolbox.FSkin.SkinnedLabel; +import forge.view.IGameView; /** * The Win/Lose handler for 'gauntlet' type tournament @@ -46,9 +46,9 @@ public class LimitedWinLose extends ControlWinLose { * @param view0 {@link forge.screens.match.ViewWinLose} * @param match {@link forge.game.Match} */ - public LimitedWinLose(final ViewWinLose view0, Game lastGame) { - super(view0, lastGame); - controller = new LimitedWinLoseController(view0, lastGame) { + public LimitedWinLose(final ViewWinLose view0, final IGameView game0) { + super(view0, game0); + controller = new LimitedWinLoseController(view0, game0) { @Override protected void showOutcome(Runnable runnable) { runnable.run(); //just run on GUI thread diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/QuestDraftWinLose.java b/forge-gui-desktop/src/main/java/forge/screens/match/QuestDraftWinLose.java index f67d21b8fdd..04a48b14ee5 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/QuestDraftWinLose.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/QuestDraftWinLose.java @@ -24,8 +24,6 @@ import forge.GuiBase; import forge.LobbyPlayer; import forge.Singletons; import forge.assets.FSkinProp; -import forge.game.Game; -import forge.game.player.Player; import forge.gui.SOverlayUtils; import forge.gui.framework.FScreen; import forge.model.FModel; @@ -37,6 +35,8 @@ import forge.screens.home.quest.CSubmenuQuestDraft; import forge.screens.home.quest.VSubmenuQuestDraft; import forge.toolbox.FOptionPane; import forge.toolbox.FSkin; +import forge.view.IGameView; +import forge.view.PlayerView; /** *

@@ -58,8 +58,8 @@ public class QuestDraftWinLose extends ControlWinLose { * @param view0 ViewWinLose object * @param match2 */ - public QuestDraftWinLose(final ViewWinLose view0, Game lastGame) { - super(view0, lastGame); + public QuestDraftWinLose(final ViewWinLose view0, final IGameView game0) { + super(view0, game0); this.view = view0; qData = FModel.getQuest(); } @@ -79,18 +79,18 @@ public class QuestDraftWinLose extends ControlWinLose { QuestController quest = FModel.getQuest(); final LobbyPlayer questLobbyPlayer = GuiBase.getInterface().getQuestPlayer(); - List players = lastGame.getRegisteredPlayers(); + final List players = lastGame.getPlayers(); boolean gameHadHumanPlayer = false; - for (Player p : players) { + for (final PlayerView p : players) { if (p.getLobbyPlayer().equals(questLobbyPlayer)) { gameHadHumanPlayer = true; break; } } - if (lastGame.getMatch().isMatchOver()) { + if (lastGame.isMatchOver()) { - String winner = lastGame.getOutcome().getWinningPlayer().getName(); + String winner = lastGame.getWinningPlayer().getName(); quest.getAchievements().getCurrentDraft().setWinner(winner); quest.save(); @@ -99,7 +99,7 @@ public class QuestDraftWinLose extends ControlWinLose { if (!gameHadHumanPlayer) { - if (lastGame.getMatch().isMatchOver()) { + if (lastGame.isMatchOver()) { this.actionOnQuitMatch(); QuestDraftUtils.matchInProgress = false; QuestDraftUtils.update(); @@ -114,7 +114,7 @@ public class QuestDraftWinLose extends ControlWinLose { view.getBtnRestart().setEnabled(false); view.getBtnRestart().setVisible(false); - if (lastGame.getMatch().isMatchOver()) { + if (lastGame.isMatchOver()) { view.getBtnQuit().setEnabled(true); view.getBtnContinue().setEnabled(false); view.getBtnQuit().setText("Continue Tournament"); diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/QuestWinLose.java b/forge-gui-desktop/src/main/java/forge/screens/match/QuestWinLose.java index abb7e9b71cb..3a48b50521f 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/QuestWinLose.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/QuestWinLose.java @@ -16,12 +16,16 @@ */ package forge.screens.match; +import java.awt.Dimension; +import java.util.List; + +import javax.swing.SwingConstants; + import forge.assets.FSkinProp; -import forge.game.Game; -import forge.item.*; +import forge.item.PaperCard; import forge.model.FModel; import forge.properties.ForgePreferences.FPref; -import forge.quest.*; +import forge.quest.QuestWinLoseController; import forge.screens.home.quest.CSubmenuChallenges; import forge.screens.home.quest.CSubmenuDuels; import forge.toolbox.FSkin; @@ -29,11 +33,7 @@ import forge.toolbox.FSkin.Colors; import forge.toolbox.FSkin.SkinColor; import forge.toolbox.FSkin.SkinIcon; import forge.toolbox.FSkin.SkinnedLabel; - -import java.awt.Dimension; -import java.util.List; - -import javax.swing.SwingConstants; +import forge.view.IGameView; /** *

@@ -61,10 +61,10 @@ public class QuestWinLose extends ControlWinLose { * @param view0 ViewWinLose object * @param match2 */ - public QuestWinLose(final ViewWinLose view0, Game lastGame) { - super(view0, lastGame); + public QuestWinLose(final ViewWinLose view0, final IGameView game0) { + super(view0, game0); view = view0; - controller = new QuestWinLoseController(lastGame) { + controller = new QuestWinLoseController(game0) { @Override protected void showRewards(Runnable runnable) { runnable.run(); //just run on GUI thread diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/QuestWinLoseCardViewer.java b/forge-gui-desktop/src/main/java/forge/screens/match/QuestWinLoseCardViewer.java index 36f8ec984ca..e0993944417 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/QuestWinLoseCardViewer.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/QuestWinLoseCardViewer.java @@ -63,7 +63,7 @@ public class QuestWinLoseCardViewer extends FPanel { public QuestWinLoseCardViewer(final List list) { this.list = Collections.unmodifiableList(list); this.jList = new FList(new ChooserListModel()); - this.detail = new CardDetailPanel(null); + this.detail = new CardDetailPanel(); this.picture = new CardPicturePanel(); this.scroller = new FScrollPane(this.jList, false); diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/VAssignDamage.java b/forge-gui-desktop/src/main/java/forge/screens/match/VAssignDamage.java index 425e03768b7..555db808de3 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/VAssignDamage.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/VAssignDamage.java @@ -17,6 +17,7 @@ */ package forge.screens.match; +import forge.control.FControl; import forge.game.GameEntity; import forge.game.card.Card; import forge.game.card.CounterType; @@ -27,13 +28,20 @@ import forge.toolbox.FLabel; import forge.toolbox.FScrollPane; import forge.toolbox.FSkin; import forge.toolbox.FSkin.SkinnedPanel; +import forge.view.CardView; import forge.view.FDialog; +import forge.view.GameEntityView; +import forge.view.PlayerView; import forge.view.arcane.CardPanel; import net.miginfocom.swing.MigLayout; import javax.swing.*; import javax.swing.border.Border; +import org.testng.collections.Lists; + +import com.google.common.collect.Maps; + import java.awt.Dialog.ModalityType; import java.awt.*; import java.awt.event.ActionEvent; @@ -68,7 +76,7 @@ public class VAssignDamage { private boolean attackerHasInfect = false; private boolean overrideCombatantOrder = false; - private final GameEntity defender; + private final GameEntityView defender; private final JLabel lblTotalDamage = new FLabel.Builder().text("Available damage points: Unknown").build(); private final JLabel lblAssignRemaining = new FLabel.Builder().text("Distribute the remaining damage points among lethally wounded entities").build(); @@ -79,24 +87,24 @@ public class VAssignDamage { private static class DamageTarget { - public final Card card; + public final CardView card; public final JLabel label; public int damage; - public DamageTarget(Card entity0, JLabel lbl) { - card = entity0; + public DamageTarget(final CardView c, final JLabel lbl) { + card = c; label = lbl; } } // Indexes of defenders correspond to their indexes in the damage list and labels. - private final List defenders = new ArrayList(); // NULL in this map means defender - private final Map damage = new HashMap(); // NULL in this map means defender + private final List defenders = Lists.newArrayList(); // NULL in this map means defender + private final Map damage = Maps.newHashMap(); // NULL in this map means defender - private boolean canAssignTo(Card card) { - for(DamageTarget dt : defenders) { - if ( dt.card == card ) return true; - if ( getDamageToKill(dt.card) > dt.damage ) + private boolean canAssignTo(final CardView card) { + for (DamageTarget dt : defenders) { + if (dt.card == card ) return true; + if (getDamageToKill(dt.card) > dt.damage ) return false; } throw new RuntimeException("Asking to assign damage to object which is not present in defenders list"); @@ -106,10 +114,10 @@ public class VAssignDamage { private final MouseAdapter mad = new MouseAdapter() { @Override public void mouseEntered(final MouseEvent evt) { - Card source = ((CardPanel) evt.getSource()).getCard(); + CardView source = ((CardPanel) evt.getSource()).getCard(); if (!damage.containsKey(source)) source = null; // to get player instead of fake card - - FSkin.Colors brdrColor = VAssignDamage.this.canAssignTo(source) ? FSkin.Colors.CLR_ACTIVE : FSkin.Colors.CLR_INACTIVE; + + final FSkin.Colors brdrColor = VAssignDamage.this.canAssignTo(source) ? FSkin.Colors.CLR_ACTIVE : FSkin.Colors.CLR_INACTIVE; ((CardPanel) evt.getSource()).setBorder(new FSkin.LineSkinBorder(FSkin.getColor(brdrColor), 2)); } @@ -120,7 +128,7 @@ public class VAssignDamage { @Override public void mousePressed(final MouseEvent evt) { - Card source = ((CardPanel) evt.getSource()).getCard(); // will be NULL for player + CardView source = ((CardPanel) evt.getSource()).getCard(); // will be NULL for player boolean meta = evt.isControlDown(); boolean isLMB = SwingUtilities.isLeftMouseButton(evt); @@ -133,22 +141,22 @@ public class VAssignDamage { /** Constructor. * - * @param attacker0 {@link forge.game.card.Card} - * @param defenderCards List<{@link forge.game.card.Card}> + * @param attacker {@link forge.game.card.Card} + * @param blockers List<{@link forge.game.card.Card}> * @param damage0 int * @param defender GameEntity that's bein attacked * @param overrideOrder override combatant order */ - public VAssignDamage(final Card attacker0, final List defenderCards, final int damage0, final GameEntity defender, boolean overrideOrder) { - dlg.setTitle("Assign damage dealt by " + attacker0.getName()); + public VAssignDamage(final CardView attacker, final List blockers, final int damage0, final GameEntityView defender, boolean overrideOrder) { + dlg.setTitle("Assign damage dealt by " + attacker); // Set damage storage vars this.totalDamageToAssign = damage0; this.defender = defender; - this.attackerHasDeathtouch = attacker0.hasKeyword("Deathtouch"); - this.attackerHasInfect = attacker0.hasKeyword("Infect"); - this.attackerHasTrample = defender != null && attacker0.hasKeyword("Trample"); + this.attackerHasDeathtouch = attacker.getState().hasDeathtouch(); + this.attackerHasInfect = attacker.getState().hasInfect(); + this.attackerHasTrample = defender != null && attacker.getState().hasTrample(); this.overrideCombatantOrder = overrideOrder; // Top-level UI stuff @@ -157,7 +165,7 @@ public class VAssignDamage { pnlMain.setBackground(FSkin.getColor(FSkin.Colors.CLR_THEME2)); // Attacker area - final CardPanel pnlAttacker = new CardPanel(attacker0); + final CardPanel pnlAttacker = new CardPanel(attacker); pnlAttacker.setOpaque(false); pnlAttacker.setCardBounds(0, 0, 105, 150); @@ -170,14 +178,14 @@ public class VAssignDamage { // Defenders area final JPanel pnlDefenders = new JPanel(); pnlDefenders.setOpaque(false); - int cols = attackerHasTrample ? defenderCards.size() + 1 : defenderCards.size(); + int cols = attackerHasTrample ? blockers.size() + 1 : blockers.size(); final String wrap = "wrap " + Integer.toString(cols); pnlDefenders.setLayout(new MigLayout("insets 0, gap 0, ax center, " + wrap)); final FScrollPane scrDefenders = new FScrollPane(pnlDefenders, false); // Top row of cards... - for (final Card c : defenderCards) { + for (final CardView c : blockers) { DamageTarget dt = new DamageTarget(c, new FLabel.Builder().text("0").fontSize(18).fontAlign(SwingConstants.CENTER).build()); this.damage.put(c, dt); this.defenders.add(dt); @@ -188,18 +196,18 @@ public class VAssignDamage { DamageTarget dt = new DamageTarget(null, new FLabel.Builder().text("0").fontSize(18).fontAlign(SwingConstants.CENTER).build()); this.damage.put(null, dt); this.defenders.add(dt); - Card fakeCard; - if (defender instanceof Card) - fakeCard = (Card)defender; - else if (defender instanceof Player) { - fakeCard = new Card(-1); - fakeCard.setName(this.defender.getName()); - fakeCard.setOwner((Player)defender); - Player p = (Player)defender; - fakeCard.setImageKey(CMatchUI.SINGLETON_INSTANCE.avatarImages.get(p.getOriginalLobbyPlayer())); + final CardView fakeCard; + if (defender instanceof CardView) + fakeCard = (CardView)defender; + else if (defender instanceof PlayerView) { + fakeCard = new CardView(null, -1); + fakeCard.getState().setName(this.defender.toString()); + final PlayerView p = (PlayerView)defender; + fakeCard.getState().setOwner(p); + fakeCard.getState().setImageKey(CMatchUI.SINGLETON_INSTANCE.avatarImages.get(p.getLobbyPlayer())); } else { - fakeCard = new Card(-2); - fakeCard.setName(this.defender.getName()); + fakeCard = new CardView(null, -2); + fakeCard.getState().setName(this.defender.toString()); } addPanelForDefender(pnlDefenders, fakeCard); } @@ -259,7 +267,7 @@ public class VAssignDamage { * @param pnlDefenders * @param defender */ - private void addPanelForDefender(final JPanel pnlDefenders, final Card defender) { + private void addPanelForDefender(final JPanel pnlDefenders, final CardView defender) { final CardPanel cp = new CardPanel(defender); cp.setCardBounds(0, 0, 105, 150); cp.setOpaque(true); @@ -273,7 +281,7 @@ public class VAssignDamage { * @param meta * @param isLMB */ - private void assignDamageTo(Card source, boolean meta, boolean isAdding) { + private void assignDamageTo(CardView source, final boolean meta, final boolean isAdding) { if ( !damage.containsKey(source) ) source = null; @@ -366,14 +374,14 @@ public class VAssignDamage { dt.damage = 0; } - private void addDamage(final Card card, int addedDamage) { + private void addDamage(final CardView card, int addedDamage) { // If we don't have enough left or we're trying to unassign too much return - int canAssign = getRemainingDamage(); + final int canAssign = getRemainingDamage(); if (canAssign < addedDamage) { addedDamage = canAssign; } - DamageTarget dt = damage.get(card); + final DamageTarget dt = damage.get(card); dt.damage = Math.max(0, addedDamage + dt.damage); } @@ -433,28 +441,28 @@ public class VAssignDamage { /** * TODO: Write javadoc for this method. - * @param source + * @param card * @return */ - private int getDamageToKill(Card source) { + private int getDamageToKill(final CardView card) { int lethalDamage = 0; - if ( source == null ) { - if ( defender instanceof Player ) { - Player p = (Player)defender; - lethalDamage = attackerHasInfect ? p.getGame().getRules().getPoisonCountersToLose() - p.getPoisonCounters() : p.getLife(); - } else if ( defender instanceof Card ) { // planeswalker - Card pw = (Card)defender; - lethalDamage = pw.getCounters(CounterType.LOYALTY); + if (card == null) { + if (defender instanceof PlayerView) { + final PlayerView p = (PlayerView)defender; + lethalDamage = attackerHasInfect ? FControl.instance.getGameView().getPoisonCountersToLose() - p.getPoisonCounters() : p.getLife(); + } else if (defender instanceof CardView) { // planeswalker + final CardView pw = (CardView)defender; + lethalDamage = pw.getState().getLoyalty(); } } else { - lethalDamage = VAssignDamage.this.attackerHasDeathtouch ? 1 : Math.max(0, source.getLethalDamage()); + lethalDamage = VAssignDamage.this.attackerHasDeathtouch ? 1 : Math.max(0, card.getLethalDamage()); } return lethalDamage; } - public Map getDamageMap() { - Map result = new HashMap(); - for(DamageTarget dt : defenders) + public Map getDamageMap() { + Map result = Maps.newHashMapWithExpectedSize(defenders.size()); + for (DamageTarget dt : defenders) result.put(dt.card, dt.damage); return result; } diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/VAutoYields.java b/forge-gui-desktop/src/main/java/forge/screens/match/VAutoYields.java index 238d8d9262c..db32ba8e81a 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/VAutoYields.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/VAutoYields.java @@ -10,14 +10,14 @@ import javax.swing.event.ChangeListener; import forge.Singletons; import forge.UiCommand; -import forge.game.Game; -import forge.game.player.Player; import forge.toolbox.FButton; import forge.toolbox.FCheckBox; import forge.toolbox.FList; import forge.toolbox.FOptionPane; import forge.toolbox.FScrollPane; import forge.view.FDialog; +import forge.view.IGameView; +import forge.view.PlayerView; @SuppressWarnings("serial") public class VAutoYields extends FDialog { @@ -32,12 +32,12 @@ public class VAutoYields extends FDialog { private final FCheckBox chkDisableAll; private final List autoYields; - public VAutoYields(final Game game, final Player player) { + public VAutoYields(final IGameView game, final PlayerView playerView) { super(true); setTitle("Auto-Yields"); autoYields = new ArrayList(); - for (String autoYield : player.getController().getAutoYields()) { + for (final String autoYield : playerView.getController().getAutoYields()) { autoYields.add(autoYield); } lstAutoYields = new FList(new AutoYieldsListModel()); @@ -72,7 +72,7 @@ public class VAutoYields extends FDialog { if (selected != null) { autoYields.remove(selected); btnRemove.setEnabled(autoYields.size() > 0); - player.getController().setShouldAutoYield(selected, false); + playerView.getController().setShouldAutoYield(selected, false); VAutoYields.this.revalidate(); lstAutoYields.repaint(); } diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/ViewWinLose.java b/forge-gui-desktop/src/main/java/forge/screens/match/ViewWinLose.java index 2348f95ab73..90ef30a024a 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/ViewWinLose.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/ViewWinLose.java @@ -11,13 +11,11 @@ import javax.swing.SwingConstants; import javax.swing.SwingUtilities; import net.miginfocom.swing.MigLayout; +import forge.LobbyPlayer; import forge.UiCommand; -import forge.game.Game; import forge.game.GameLog; import forge.game.GameLogEntry; import forge.game.GameLogEntryType; -import forge.game.GameOutcome; -import forge.game.player.Player; import forge.gui.SOverlayUtils; import forge.interfaces.IWinLoseView; import forge.model.FModel; @@ -29,7 +27,7 @@ import forge.toolbox.FSkin; import forge.toolbox.FSkin.SkinnedLabel; import forge.toolbox.FSkin.SkinnedPanel; import forge.toolbox.FTextArea; - +import forge.view.IGameView; public class ViewWinLose implements IWinLoseView { private final FButton btnContinue, btnRestart, btnQuit; @@ -39,12 +37,12 @@ public class ViewWinLose implements IWinLoseView { private final SkinnedLabel lblStats = new SkinnedLabel("WinLoseFrame > lblStats needs updating."); private final JPanel pnlOutcomes = new JPanel(new MigLayout("wrap, align center")); - private final Game game; + private final IGameView game; @SuppressWarnings("serial") - public ViewWinLose(final Game game0) { + public ViewWinLose(final IGameView game0) { - game = game0; + this.game = game0; final JPanel overlay = FOverlay.SINGLETON_INSTANCE.getPanel(); @@ -60,7 +58,7 @@ public class ViewWinLose implements IWinLoseView { // Control of the win/lose is handled differently for various game // modes. ControlWinLose control = null; - switch (game0.getRules().getGameType()) { + switch (game0.getGameType()) { case Quest: control = new QuestWinLose(this, game0); break; @@ -103,7 +101,7 @@ public class ViewWinLose implements IWinLoseView { btnRestart.setFont(FSkin.getFont(22)); btnQuit.setText("Quit Match"); btnQuit.setFont(FSkin.getFont(22)); - btnContinue.setEnabled(!game0.getMatch().isMatchOver()); + btnContinue.setEnabled(!game0.isMatchOver()); // Assemble game log scroller. final FTextArea txtLog = new FTextArea(); @@ -180,20 +178,20 @@ public class ViewWinLose implements IWinLoseView { } }); - lblTitle.setText(composeTitle(game0.getOutcome())); + lblTitle.setText(composeTitle(game0)); showGameOutcomeSummary(); showPlayerScores(); } - private String composeTitle(GameOutcome outcome) { - Player winner = outcome.getWinningPlayer(); - int winningTeam = outcome.getWinningTeam(); + private String composeTitle(final IGameView game) { + final LobbyPlayer winner = game.getWinningPlayer(); + final int winningTeam = game.getWinningTeam(); if (winner == null) { return "It's a draw!"; } else if (winningTeam != -1) { - return "Team " + winner.getTeam() + " Won!"; + return "Team " + winningTeam + " Won!"; } else { return winner.getName() + " Won!"; } diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/ZoneAction.java b/forge-gui-desktop/src/main/java/forge/screens/match/ZoneAction.java index cdcec07dd48..ca483f0cc2b 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/ZoneAction.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/ZoneAction.java @@ -1,17 +1,16 @@ package forge.screens.match; -import forge.Singletons; -import forge.card.CardCharacteristicName; -import forge.game.card.Card; -import forge.game.card.CardFactory; -import forge.game.zone.PlayerZone; +import java.awt.event.ActionEvent; +import java.util.List; + +import com.beust.jcommander.internal.Lists; +import com.google.common.collect.Iterables; + import forge.gui.ForgeAction; import forge.gui.GuiChoose; import forge.match.MatchConstants; - -import java.awt.event.ActionEvent; -import java.util.ArrayList; -import java.util.List; +import forge.view.CardView; +import forge.view.CardView.CardStateView; /** * Receives click and programmatic requests for viewing data stacks in the @@ -20,7 +19,7 @@ import java.util.List; */ public class ZoneAction extends ForgeAction { private static final long serialVersionUID = -5822976087772388839L; - private final PlayerZone zone; + private final Iterable cards; private final String title; /** @@ -33,10 +32,10 @@ public class ZoneAction extends ForgeAction { * @param property *   String obj */ - public ZoneAction(final PlayerZone zone, MatchConstants property) { + public ZoneAction(final Iterable cards, final MatchConstants property) { super(property); this.title = property.title; - this.zone = zone; + this.cards = Iterables.unmodifiableIterable(cards); } /** @@ -45,37 +44,33 @@ public class ZoneAction extends ForgeAction { */ @Override public void actionPerformed(final ActionEvent e) { - final List choices = this.getCardsAsIterable(); - if (choices.isEmpty()) { + final Iterable choices = this.getCardsAsIterable(); + if (!choices.iterator().hasNext()) { GuiChoose.reveal(this.title, "no cards"); return; } - final ArrayList choices2 = new ArrayList(); - for (Card crd : choices) { - Card toAdd = crd; - if (crd.isFaceDown()) { - if (Singletons.getControl().mayShowCard(crd)) { - toAdd = CardFactory.copyCard(crd, false); - toAdd.setState(CardCharacteristicName.Original); - } else { - toAdd = new Card(0); - toAdd.setName("Face Down"); - } - } + final List choices2 = Lists.newLinkedList(); + for (final CardView crd : choices) { + final CardStateView toAdd; + if (crd.isFaceDown() && crd.hasAltState()) { + toAdd = crd.getAlternate(); + } else { + toAdd = crd.getState(); + } choices2.add(toAdd); } - final Card choice = GuiChoose.oneOrNone(this.title, choices2); + final CardStateView choice = GuiChoose.oneOrNone(this.title, choices2); if (choice != null) { - this.doAction(choice); + this.doAction(choice.getCard()); } } - protected List getCardsAsIterable() { - return this.zone.getCards(); + protected Iterable getCardsAsIterable() { + return cards; } - protected void doAction(final Card c) { + protected void doAction(final CardView c) { } } // End ZoneAction \ No newline at end of file diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CCommand.java b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CCommand.java index c20236a9565..e03ce86c1a7 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CCommand.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CCommand.java @@ -18,24 +18,25 @@ package forge.screens.match.controllers; import forge.UiCommand; -import forge.game.player.Player; import forge.gui.framework.ICDoc; import forge.screens.match.views.VCommand; +import forge.view.PlayerView; + /** * Controls Swing components of a player's command instance. */ public class CCommand implements ICDoc { - private final Player player; + private final PlayerView player; private final VCommand view; /** * Controls Swing components of a player's command instance. * - * @param p0   {@link forge.game.player.Player} + * @param player2   {@link forge.game.player.Player} * @param v0   {@link forge.screens.match.views.VCommand} */ - public CCommand(final Player p0, final VCommand v0) { - this.player = p0; + public CCommand(final PlayerView player2, final VCommand v0) { + this.player = player2; this.view = v0; } @@ -48,7 +49,7 @@ public class CCommand implements ICDoc { } /** @return {@link forge.game.player.Player} */ - public Player getPlayer() { + public PlayerView getPlayer() { return this.player; } diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CDetail.java b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CDetail.java index 638116e987c..7ab511e32b7 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CDetail.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CDetail.java @@ -27,6 +27,7 @@ import forge.item.InventoryItem; import forge.item.InventoryItemFromSet; import forge.screens.match.views.VDetail; import forge.toolbox.FMouseAdapter; +import forge.view.CardView; import java.awt.event.MouseEvent; @@ -45,6 +46,7 @@ public enum CDetail implements ICDoc { * * @param c   Card object */ + @Deprecated public void showCard(Card c) { if (c != null) { c = c.getCardForUi(); @@ -56,7 +58,15 @@ public enum CDetail implements ICDoc { } } - public void showCard(InventoryItem item) { + public void showCard(final CardView c, final boolean isInAltState) { + view.getLblFlipcard().setVisible(c != null && c.hasAltState() && Singletons.getControl().mayShowCard(c)); + view.getPnlDetail().setCard(c, isInAltState); + if (view.getParentCell() != null) { + view.getParentCell().repaintSelf(); + } + } + + public void showCard(final InventoryItem item) { if (item instanceof IPaperCard) { showCard(Card.getCardForUi((IPaperCard)item)); } diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CDock.java b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CDock.java index 150cee8782d..5fc548d7774 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CDock.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CDock.java @@ -17,19 +17,18 @@ */ package forge.screens.match.controllers; +import forge.GuiBase; import forge.LobbyPlayer; import forge.UiCommand; import forge.FThreads; import forge.Singletons; import forge.assets.FSkinProp; import forge.deckchooser.FDeckViewer; -import forge.game.Game; import forge.game.card.Card; import forge.game.card.CardLists; import forge.game.card.CardPredicates.Presets; import forge.game.combat.Combat; import forge.game.combat.CombatUtil; -import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseType; import forge.game.player.Player; import forge.game.player.RegisteredPlayer; @@ -38,7 +37,6 @@ import forge.gui.SOverlayUtils; import forge.gui.framework.ICDoc; import forge.gui.framework.SLayoutIO; import forge.model.FModel; -import forge.player.GamePlayerUtil; import forge.properties.FileLocation; import forge.properties.ForgePreferences.FPref; import forge.screens.match.CMatchUI; @@ -47,6 +45,7 @@ import forge.toolbox.FSkin; import forge.toolbox.SaveOpenDialog; import forge.toolbox.SaveOpenDialog.Filetypes; import forge.view.FView; +import forge.view.IGameView; import java.io.File; import java.util.List; @@ -61,9 +60,9 @@ public enum CDock implements ICDoc { SINGLETON_INSTANCE; private int arcState; - private Game game; + private IGameView game; - public void setModel(Game game0, LobbyPlayer player0) { + public void setModel(IGameView game0, LobbyPlayer player0) { game = game0; } @@ -136,7 +135,8 @@ public enum CDock implements ICDoc { * View deck list. */ public void viewDeckList() { - RegisteredPlayer player = GamePlayerUtil.getGuiRegisteredPlayer(game); + final LobbyPlayer guiPlayer = GuiBase.getInterface().getGuiPlayer(); + final RegisteredPlayer player = game.getGuiRegisteredPlayer(guiPlayer); if (player != null) { FDeckViewer.show(player.getDeck()); } @@ -178,12 +178,9 @@ public enum CDock implements ICDoc { /** Attack with everyone. */ public void alphaStrike() { - final PhaseHandler ph = game.getPhaseHandler(); - - final Player p = findAffectedPlayer(); - final Game game = p.getGame(); - Combat combat = game.getCombat(); - if (ph.is(PhaseType.COMBAT_DECLARE_ATTACKERS, p) && combat!= null) { // ph.is(...) includes null check + final Player p = this.findAffectedPlayer(); + final Combat combat = game.getCombat(); + if (this.game.isCombatDeclareAttackers()) { List defenders = p.getOpponents(); for (Card c : CardLists.filter(p.getCardsIn(ZoneType.Battlefield), Presets.CREATURES)) { diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CField.java b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CField.java index 04b85e68083..89f8de18c4d 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CField.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CField.java @@ -17,14 +17,17 @@ */ package forge.screens.match.controllers; +import java.awt.event.ActionEvent; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.util.List; + import com.google.common.base.Function; import forge.LobbyPlayer; -import forge.UiCommand; import forge.Singletons; -import forge.game.card.Card; -import forge.game.player.Player; -import forge.game.zone.ZoneType; +import forge.UiCommand; import forge.gui.framework.ICDoc; import forge.match.MatchConstants; import forge.match.input.Input; @@ -33,19 +36,15 @@ import forge.properties.ForgePreferences; import forge.screens.match.ZoneAction; import forge.screens.match.views.VField; import forge.toolbox.MouseTriggerEvent; - -import java.awt.event.ActionEvent; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.util.List; +import forge.view.CardView; +import forge.view.PlayerView; /** * Controls Swing components of a player's field instance. */ public class CField implements ICDoc { // The one who owns cards on this side of table - private final Player player; + private final PlayerView player; // Tho one who looks at screen and 'performs actions' private final LobbyPlayer viewer; private final VField view; @@ -61,42 +60,44 @@ public class CField implements ICDoc { /** * Controls Swing components of a player's field instance. * - * @param p0   {@link forge.game.player.Player} + * @param player2   {@link forge.game.player.Player} * @param v0   {@link forge.screens.match.views.VField} * @param playerViewer */ @SuppressWarnings("serial") - public CField(final Player p0, final VField v0, LobbyPlayer playerViewer) { - this.player = p0; + public CField(final PlayerView player2, final VField v0, LobbyPlayer playerViewer) { + this.player = player2; this.viewer = playerViewer; this.view = v0; - ZoneAction handAction = new ZoneAction(player.getZone(ZoneType.Hand), MatchConstants.HUMANHAND) { + final ZoneAction handAction = new ZoneAction(player.getHandCards(), MatchConstants.HUMANHAND) { @Override public void actionPerformed(ActionEvent e) { - if ( player.getLobbyPlayer() == viewer || ForgePreferences.DEV_MODE || player.hasKeyword("Play with your hand revealed.")) + if (player.getLobbyPlayer() == viewer || ForgePreferences.DEV_MODE) {// || player.hasKeyword("Play with your hand revealed.")) super.actionPerformed(e); + } } }; - - ZoneAction libraryAction = new ZoneAction(player.getZone(ZoneType.Library), MatchConstants.HUMANLIBRARY) { + + final ZoneAction libraryAction = new ZoneAction(player.getLibraryCards(), MatchConstants.HUMANLIBRARY) { @Override public void actionPerformed(ActionEvent e) { - if (ForgePreferences.DEV_MODE) + if (ForgePreferences.DEV_MODE) { super.actionPerformed(e); + } } }; - - ZoneAction exileAction = new ZoneAction(player.getZone(ZoneType.Exile), MatchConstants.HUMANEXILED); - ZoneAction graveAction = new ZoneAction(player.getZone(ZoneType.Graveyard), MatchConstants.HUMANGRAVEYARD); - ZoneAction flashBackAction = new ZoneAction(player.getZone(ZoneType.Graveyard), MatchConstants.HUMANFLASHBACK) { + + final ZoneAction exileAction = new ZoneAction(player.getExileCards(), MatchConstants.HUMANEXILED); + final ZoneAction graveAction = new ZoneAction(player.getGraveCards(), MatchConstants.HUMANGRAVEYARD); + final ZoneAction flashBackAction = new ZoneAction(player.getFlashbackCards(), MatchConstants.HUMANFLASHBACK) { @Override - protected List getCardsAsIterable() { - return player.getCardsActivableInExternalZones(true); + protected List getCardsAsIterable() { + return player.getFlashbackCards(); } @Override - protected void doAction(final Card c) { + protected void doAction(final CardView c) { // activate cards only via your own flashback button if (player.getLobbyPlayer() != CField.this.viewer) { return; @@ -157,16 +158,6 @@ public class CField implements ICDoc { public void update() { } - /** @return {@link forge.game.player.Player} */ - public Player getPlayer() { - return this.player; - } - - /** @return {@link forge.screens.match.views.VField} */ - public VField getView() { - return this.view; - } - /* (non-Javadoc) * @see forge.gui.framework.ICDoc#getCommandOnSelect() */ diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CHand.java b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CHand.java index a640d2909b3..77f23dcaa0f 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CHand.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CHand.java @@ -17,35 +17,36 @@ */ package forge.screens.match.controllers; -import forge.UiCommand; -import forge.FThreads; -import forge.Singletons; -import forge.game.card.Card; -import forge.game.player.Player; -import forge.game.zone.ZoneType; -import forge.gui.framework.ICDoc; -import forge.screens.match.CMatchUI; -import forge.screens.match.views.VField; -import forge.screens.match.views.VHand; -import forge.view.arcane.CardPanel; -import forge.view.arcane.HandArea; -import forge.view.arcane.util.Animation; -import forge.view.arcane.util.CardPanelMouseAdapter; - -import javax.swing.*; - -import java.awt.*; +import java.awt.Point; +import java.awt.Rectangle; import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.List; import java.util.Observable; +import javax.swing.JLayeredPane; +import javax.swing.SwingUtilities; + +import forge.FThreads; +import forge.Singletons; +import forge.UiCommand; +import forge.gui.framework.ICDoc; +import forge.screens.match.CMatchUI; +import forge.screens.match.views.VField; +import forge.screens.match.views.VHand; +import forge.view.CardView; +import forge.view.PlayerView; +import forge.view.arcane.CardPanel; +import forge.view.arcane.HandArea; +import forge.view.arcane.util.Animation; +import forge.view.arcane.util.CardPanelMouseAdapter; + /** * Controls Swing components of a player's hand instance. * */ public class CHand implements ICDoc { - private final Player player; + private final PlayerView player; private final VHand view; private boolean initializedAlready = false; @@ -55,15 +56,15 @@ public class CHand implements ICDoc { * @param p0   {@link forge.game.player.Player} * @param v0   {@link forge.screens.match.views.VHand} */ - public CHand(final Player p0, final VHand v0) { + public CHand(final PlayerView p0, final VHand v0) { this.player = p0; this.view = v0; v0.getHandArea().addCardPanelMouseListener(new CardPanelMouseAdapter() { @Override public void mouseDragEnd(CardPanel dragPanel, MouseEvent evt) { //update index of dragged card in hand zone to match new index within hand area - int index = CHand.this.view.getHandArea().getCardPanels().indexOf(dragPanel); - CHand.this.player.getZone(ZoneType.Hand).reposition(dragPanel.getCard(), index); + //int index = CHand.this.view.getHandArea().getCardPanels().indexOf(dragPanel); + //CHand.this.player.getZone(ZoneType.Hand).reposition(dragPanel.getCard(), index); } }); } @@ -103,12 +104,12 @@ public class CHand implements ICDoc { } //update card panels in hand area - final List cards = player.getZone(ZoneType.Hand).getCards(); + final List cards = player.getHandCards(); final List placeholders = new ArrayList(); final List cardPanels = new ArrayList(); - - for (Card card : cards) { - CardPanel cardPanel = p.getCardPanel(card.getUniqueNumber()); + + for (final CardView card : cards) { + CardPanel cardPanel = p.getCardPanel(card.getId()); if (cardPanel == null) { //create placeholders for new cards cardPanel = new CardPanel(card); cardPanel.setDisplayEnabled(false); diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CPicture.java b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CPicture.java index 3cb2a0adaa4..cbb8c0cf4c8 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CPicture.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CPicture.java @@ -29,6 +29,7 @@ import forge.item.InventoryItem; import forge.screens.match.views.VPicture; import forge.toolbox.FMouseAdapter; import forge.toolbox.special.CardZoomer; +import forge.view.CardView; import forge.view.FDialog; import javax.swing.*; @@ -57,9 +58,14 @@ public enum CPicture implements ICDoc { private final JLabel flipIndicator = this.view.getLblFlipcard(); private final CardZoomer zoomer = CardZoomer.SINGLETON_INSTANCE; + @Deprecated private Card currentCard = null; + @Deprecated private CardCharacteristicName displayedState = CardCharacteristicName.Original; + private CardView currentView = null; + private boolean isDisplayAlt = false; + private boolean mayShowCurrentCard() { if (currentCard == null) { return false; } if (FDialog.isModalOpen()) { return true; } //allow showing cards while modal open to account for revealing, picking, and ordering cards @@ -70,8 +76,9 @@ public enum CPicture implements ICDoc { * Shows card details and/or picture in sidebar cardview tabber. * */ + @Deprecated public void showCard(Card c, boolean showFlipped) { - if (c == null) { + if (null == c) { return; } @@ -86,6 +93,24 @@ public enum CPicture implements ICDoc { } } + /** + * Shows card details and/or picture in sidebar cardview tabber. + * + */ + public void showCard(final CardView c, boolean showAlt) { + if (null == c) { + return; + } + + currentView = c; + isDisplayAlt = false; + flipIndicator.setVisible(c.hasAltState()); + picturePanel.setCard(c.getState(showAlt), mayShowCurrentCard()); + if (showAlt && c.hasAltState()) { + flipCard(); + } + } + /** * Displays image associated with either a {@code Card} * or {@code InventoryItem} instance. @@ -137,7 +162,7 @@ public enum CPicture implements ICDoc { @Override public void onMiddleMouseDown(MouseEvent e) { if (isCardDisplayed()) { - CardZoomer.SINGLETON_INSTANCE.doMouseButtonZoom(currentCard, displayedState); + CardZoomer.SINGLETON_INSTANCE.doMouseButtonZoom(currentView); } } @@ -162,7 +187,7 @@ public enum CPicture implements ICDoc { public void mouseWheelMoved(MouseWheelEvent arg0) { if (isCardDisplayed()) { if (arg0.getWheelRotation() < 0) { - zoomer.doMouseWheelZoom(currentCard, displayedState); + zoomer.doMouseWheelZoom(currentView); } } } @@ -178,10 +203,9 @@ public enum CPicture implements ICDoc { } public void flipCard() { - if (isCurrentCardFlippable()) { - displayedState = CardDetailUtil.getAlternateState(currentCard, displayedState); - picturePanel.setCardImage(displayedState); - setCardDetailPanel(); + if (currentView.hasAltState()) { + isDisplayAlt = !isDisplayAlt; + picturePanel.setCard(currentView.getState(isDisplayAlt), mayShowCurrentCard()); } } @@ -205,6 +229,7 @@ public enum CPicture implements ICDoc { currentCard.setState(temp); } + @Deprecated private boolean isCurrentCardFlippable() { if (!mayShowCurrentCard()) { return false; } diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CPlayers.java b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CPlayers.java index 219fa300875..28a964f1134 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CPlayers.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CPlayers.java @@ -1,9 +1,9 @@ package forge.screens.match.controllers; import forge.UiCommand; -import forge.game.Game; import forge.gui.framework.ICDoc; import forge.screens.match.views.VPlayers; +import forge.view.IGameView; /** * Controls the combat panel in the match UI. @@ -14,7 +14,7 @@ import forge.screens.match.views.VPlayers; public enum CPlayers implements ICDoc { /** */ SINGLETON_INSTANCE; - private Game game; + private IGameView game; /* (non-Javadoc) * @see forge.gui.framework.ICDoc#getCommandOnSelect() @@ -39,7 +39,7 @@ public enum CPlayers implements ICDoc { VPlayers.SINGLETON_INSTANCE.update(game); } - public void setModel(Game game) { + public void setModel(IGameView game) { this.game = game; } diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CPrompt.java b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CPrompt.java index 8f6546b0c62..285b4fbcd46 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CPrompt.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CPrompt.java @@ -17,8 +17,18 @@ */ package forge.screens.match.controllers; -import forge.UiCommand; +import java.awt.Component; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.FocusAdapter; +import java.awt.event.FocusEvent; +import java.awt.event.FocusListener; + +import javax.swing.JButton; + import forge.FThreads; +import forge.Singletons; +import forge.UiCommand; import forge.game.Game; import forge.game.GameRules; import forge.game.Match; @@ -28,11 +38,6 @@ import forge.match.input.InputProxy; import forge.screens.match.views.VPrompt; import forge.toolbox.FSkin; -import javax.swing.*; - -import java.awt.*; -import java.awt.event.*; - /** * Controls the prompt panel in the match UI. * @@ -114,8 +119,9 @@ public enum CPrompt implements ICDoc { * @see java.util.Observer#update(java.util.Observable, java.lang.Object) */ - public void updateText(Game game) { + public void updateText() { FThreads.assertExecutedByEdt(true); + final Game game = Singletons.getControl().getObservedGame(); final Match match = game.getMatch(); final GameRules rules = game.getRules(); final String text = String.format("T:%d G:%d/%d [%s]", game.getPhaseHandler().getTurn(), match.getPlayedGames().size() + 1, rules.getGamesPerMatch(), rules.getGameType()); diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CStack.java b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CStack.java index 5301c40e5c8..2d2c50f0100 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CStack.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CStack.java @@ -1,12 +1,12 @@ package forge.screens.match.controllers; import forge.UiCommand; -import forge.game.player.Player; -import forge.game.zone.MagicStack; import forge.gui.framework.EDocID; import forge.gui.framework.ICDoc; import forge.gui.framework.SDisplayUtil; import forge.screens.match.views.VStack; +import forge.view.IGameView; +import forge.view.PlayerView; /** * Controls the combat panel in the match UI. @@ -18,8 +18,8 @@ public enum CStack implements ICDoc { /** */ SINGLETON_INSTANCE; - private MagicStack model; - private Player localPlayer; + private IGameView model; + private PlayerView localPlayer; /* (non-Javadoc) * @see forge.gui.framework.ICDoc#getCommandOnSelect() @@ -42,8 +42,9 @@ public enum CStack implements ICDoc { VStack.SINGLETON_INSTANCE.updateStack(model, localPlayer); } - public void setModel(MagicStack model0, Player localPlayer0) { - model = model0; - localPlayer = localPlayer0; + public void setModel(final IGameView game0, final PlayerView localPlayer) { + model = game0; + this.localPlayer = localPlayer; } + } diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/menus/GameMenu.java b/forge-gui-desktop/src/main/java/forge/screens/match/menus/GameMenu.java index 709c2ae48b8..859915955ea 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/menus/GameMenu.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/menus/GameMenu.java @@ -198,8 +198,8 @@ public final class GameMenu { return new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - FControl control = Singletons.getControl(); - VAutoYields autoYields = new VAutoYields(control.getObservedGame(), control.getLocalPlayer()); + final FControl control = Singletons.getControl(); + final VAutoYields autoYields = new VAutoYields(control.getGameView(), control.getLocalPlayer()); autoYields.showAutoYields(); } }; diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/views/VAntes.java b/forge-gui-desktop/src/main/java/forge/screens/match/views/VAntes.java index ab810ddccc3..ec18e49738d 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/views/VAntes.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/views/VAntes.java @@ -17,9 +17,15 @@ */ package forge.screens.match.views; -import forge.game.card.Card; -import forge.game.player.Player; -import forge.game.zone.ZoneType; +import java.awt.Dimension; +import java.util.List; +import java.util.SortedSet; +import java.util.TreeSet; + +import javax.swing.JPanel; +import javax.swing.SwingConstants; + +import net.miginfocom.swing.MigLayout; import forge.gui.CardPicturePanel; import forge.gui.WrapLayout; import forge.gui.framework.DragCell; @@ -29,13 +35,8 @@ import forge.gui.framework.IVDoc; import forge.screens.match.controllers.CAntes; import forge.toolbox.FLabel; import forge.toolbox.FScrollPane; -import net.miginfocom.swing.MigLayout; - -import javax.swing.*; - -import java.awt.*; -import java.util.SortedSet; -import java.util.TreeSet; +import forge.view.CardView; +import forge.view.PlayerView; /** * Assembles Swing components of card ante area. @@ -54,7 +55,7 @@ public enum VAntes implements IVDoc { private final FScrollPane scroller = new FScrollPane(pnl, false); private final SortedSet allAntes = new TreeSet(); - private Iterable players; + private Iterable players; //========== Constructor private VAntes() { pnl.setLayout(new WrapLayout()); @@ -72,8 +73,8 @@ public enum VAntes implements IVDoc { parentCell.getBody().add(scroller, "w 100%!, h 100%!"); } - public final void setModel(Iterable playerz) { - players = playerz; + public final void setModel(final List players) { + this.players = players; update(); } @@ -121,8 +122,8 @@ public enum VAntes implements IVDoc { allAntes.clear(); pnl.removeAll(); - for(Player p : players) { - for(Card c : p.getZone(ZoneType.Ante)) { + for (final PlayerView p : players) { + for (final CardView c : p.getAnteCards()) { final AntePanel pnlTemp = new AntePanel(c); allAntes.add(pnlTemp); } @@ -136,15 +137,15 @@ public enum VAntes implements IVDoc { //========= Private class handling @SuppressWarnings("serial") private class AntePanel extends JPanel implements Comparable { - private final Card card; + private final CardView card; /** * * @param p0   {@link forge.game.player.Player} - * @param c0   {@link forge.game.card.Card} + * @param c   {@link forge.game.card.Card} */ - public AntePanel(final Card c0) { + public AntePanel(final CardView c) { super(); - card = c0; + card = c; final Dimension d = new Dimension(160, 250); setPreferredSize(d); @@ -157,12 +158,12 @@ public enum VAntes implements IVDoc { .fontAlign(SwingConstants.CENTER).build(), "w 160px, h 20px"); CardPicturePanel picPanel = new CardPicturePanel(); add(picPanel, "w 160px, h 230px"); - picPanel.setCard(c0, true); + picPanel.setCard(c.getState(), true); } @Override - public int compareTo(AntePanel o) { - return o.card.getUniqueNumber() - card.getUniqueNumber(); + public int compareTo(final AntePanel o) { + return o.card.getId() - card.getId(); } } } diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/views/VCommand.java b/forge-gui-desktop/src/main/java/forge/screens/match/views/VCommand.java index c9c19ec9280..85d20e80b02 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/views/VCommand.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/views/VCommand.java @@ -17,8 +17,9 @@ */ package forge.screens.match.views; -import forge.game.player.Player; -import forge.game.zone.ZoneType; +import javax.swing.JPanel; + +import net.miginfocom.swing.MigLayout; import forge.gui.framework.DragCell; import forge.gui.framework.DragTab; import forge.gui.framework.EDocID; @@ -26,10 +27,8 @@ import forge.gui.framework.IVDoc; import forge.screens.match.controllers.CCommand; import forge.toolbox.FScrollPane; import forge.toolbox.FSkin; +import forge.view.PlayerView; import forge.view.arcane.PlayArea; -import net.miginfocom.swing.MigLayout; - -import javax.swing.*; /** * Assembles Swing components of a player command instance. @@ -44,7 +43,7 @@ public class VCommand implements IVDoc { private final DragTab tab = new DragTab("Command"); // Other fields - private Player player = null; + private PlayerView player = null; // Top-level containers private final FScrollPane scroller = new FScrollPane(false); @@ -54,20 +53,20 @@ public class VCommand implements IVDoc { /** * Assembles Swing components of a player command instance. * - * @param player0   {@link forge.game.player.Player} + * @param p   {@link forge.game.player.Player} * @param id0   {@link forge.gui.framework.EDocID} */ - public VCommand(final EDocID id0, final Player player0) { + public VCommand(final EDocID id0, final PlayerView p) { this.docID = id0; id0.setDoc(this); - this.player = player0; - if (player0 != null) { tab.setText(player0.getName() + " Command"); } + this.player = p; + if (p != null) { tab.setText(p.getName() + " Command"); } else { tab.setText("NO PLAYER FOR " + docID.toString()); } // 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, player.getZone(ZoneType.Command).getCards(false)); + tabletop = new PlayArea(scroller, id0 == EDocID.COMMAND_0, player.getCommandCards()); control = new CCommand(player, this); @@ -135,7 +134,7 @@ public class VCommand implements IVDoc { * Gets the player currently associated with this command. * @return {@link forge.game.player.Player} */ - public Player getPlayer() { + public PlayerView getPlayer() { return this.player; } diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/views/VDetail.java b/forge-gui-desktop/src/main/java/forge/screens/match/views/VDetail.java index 251b92077ee..e3c31cb2887 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/views/VDetail.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/views/VDetail.java @@ -44,7 +44,7 @@ public enum VDetail implements IVDoc { private final DragTab tab = new DragTab("Card Detail"); // Top-level containers - private final CardDetailPanel pnlDetail = new CardDetailPanel(null); + private final CardDetailPanel pnlDetail = new CardDetailPanel(); private final SkinnedLabel lblFlipcard = new SkinnedLabel(); //========= Constructor diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/views/VField.java b/forge-gui-desktop/src/main/java/forge/screens/match/views/VField.java index b3f969fffd6..47b345f3d5c 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/views/VField.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/views/VField.java @@ -17,9 +17,18 @@ */ package forge.screens.match.views; +import java.awt.Color; +import java.awt.Font; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; + +import javax.swing.JPanel; +import javax.swing.SwingConstants; +import javax.swing.border.Border; +import javax.swing.border.LineBorder; + +import net.miginfocom.swing.MigLayout; import forge.LobbyPlayer; -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; @@ -32,16 +41,8 @@ import forge.toolbox.FSkin; import forge.toolbox.FSkin.SkinnedPanel; import forge.toolbox.special.PhaseIndicator; import forge.toolbox.special.PlayerDetailsPanel; +import forge.view.PlayerView; import forge.view.arcane.PlayArea; -import net.miginfocom.swing.MigLayout; - -import javax.swing.*; -import javax.swing.border.Border; -import javax.swing.border.LineBorder; - -import java.awt.*; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; /** * Assembles Swing components of a player field instance. @@ -56,7 +57,7 @@ public class VField implements IVDoc { private final DragTab tab = new DragTab("Field"); // Other fields - private Player player = null; + private PlayerView player = null; // Top-level containers private final FScrollPane scroller = new FScrollPane(false); @@ -79,22 +80,22 @@ public class VField implements IVDoc { /** * Assembles Swing components of a player field instance. * - * @param playerOnwer   {@link forge.game.player.Player} + * @param p   {@link forge.game.player.Player} * @param id0   {@link forge.gui.framework.EDocID} */ - public VField(final EDocID id0, final Player playerOnwer, LobbyPlayer playerViewer) { + public VField(final EDocID id0, final PlayerView p, final LobbyPlayer playerViewer) { this.docID = id0; id0.setDoc(this); - this.player = playerOnwer; - if (playerOnwer != null) { tab.setText(playerOnwer.getName() + " Field"); } + this.player = p; + if (p != null) { tab.setText(p.getName() + " Field"); } else { tab.setText("NO PLAYER FOR " + docID.toString()); } detailsPanel = new PlayerDetailsPanel(player); // 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, player.getZone(ZoneType.Battlefield).getCards(false)); + tabletop = new PlayArea(scroller, id0 == EDocID.FIELD_1, player.getBfCards()); control = new CField(player, this, playerViewer); @@ -195,7 +196,7 @@ public class VField implements IVDoc { * Gets the player currently associated with this field. * @return {@link forge.game.player.Player} */ - public Player getPlayer() { + public PlayerView getPlayer() { return this.player; } diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/views/VHand.java b/forge-gui-desktop/src/main/java/forge/screens/match/views/VHand.java index a0a03ca74b2..2ae80cab48d 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/views/VHand.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/views/VHand.java @@ -17,17 +17,17 @@ */ package forge.screens.match.views; -import forge.game.player.Player; +import javax.swing.JPanel; + +import net.miginfocom.swing.MigLayout; import forge.gui.framework.DragCell; import forge.gui.framework.DragTab; import forge.gui.framework.EDocID; import forge.gui.framework.IVDoc; import forge.screens.match.controllers.CHand; import forge.toolbox.FScrollPane; +import forge.view.PlayerView; import forge.view.arcane.HandArea; -import net.miginfocom.swing.MigLayout; - -import javax.swing.*; /** * Assembles Swing components of hand area. @@ -41,7 +41,6 @@ public class VHand implements IVDoc { private final EDocID docID; private final DragTab tab = new DragTab("Your Hand"); - // Top-level containers private final FScrollPane scroller = new FScrollPane(false); private final HandArea hand = new HandArea(scroller); @@ -51,23 +50,23 @@ public class VHand implements IVDoc { * Assembles Swing components of a player hand instance. * * @param id0   {@link forge.gui.framework.EDocID} - * @param owner   {@link forge.game.player.Player} + * @param p   {@link forge.game.player.Player} */ - public VHand(final EDocID id0, final Player owner) { + public VHand(final EDocID id0, final PlayerView p) { docID = id0; id0.setDoc(this); - if (owner == null) { + if (p == null) { tab.setText("NO PLAYER Hand"); } else { - tab.setText(owner.getName() + " Hand"); + tab.setText(p.getName() + " Hand"); } scroller.setViewportView(VHand.this.hand); hand.setOpaque(false); - control = new CHand(owner, this); + control = new CHand(p, this); } //========= Overridden methods diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/views/VPlayers.java b/forge-gui-desktop/src/main/java/forge/screens/match/views/VPlayers.java index 07995c95f1b..e0793518f53 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/views/VPlayers.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/views/VPlayers.java @@ -17,12 +17,17 @@ */ package forge.screens.match.views; -import forge.game.Game; -import forge.game.GameType; -import forge.game.card.Card; -import forge.game.card.CardFactoryUtil; -import forge.game.player.Player; -import forge.game.zone.ZoneType; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import javax.swing.JLabel; +import javax.swing.ScrollPaneConstants; + +import net.miginfocom.swing.MigLayout; + +import org.testng.collections.Maps; + import forge.gui.framework.DragCell; import forge.gui.framework.DragTab; import forge.gui.framework.EDocID; @@ -33,14 +38,9 @@ import forge.screens.match.controllers.CPlayers; import forge.toolbox.FScrollPanel; import forge.toolbox.FSkin; import forge.toolbox.FSkin.SkinnedLabel; -import net.miginfocom.swing.MigLayout; - -import javax.swing.*; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; +import forge.view.CardView; +import forge.view.IGameView; +import forge.view.PlayerView; /** * Assembles Swing components of players report. @@ -59,7 +59,7 @@ public enum VPlayers implements IVDoc { ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); // Other fields - private Map infoLBLs; + private Map infoLBLs; //========= Overridden methods @@ -70,7 +70,7 @@ public enum VPlayers implements IVDoc { public void populate() { scroller.removeAll(); final String constraints = "w 97%!, gapleft 2%, gapbottom 1%"; - for (final Entry p : infoLBLs.entrySet()) { + for (final Entry p : infoLBLs.entrySet()) { for (JLabel label : p.getValue()) { scroller.add(label, constraints); } @@ -79,9 +79,9 @@ public enum VPlayers implements IVDoc { parentCell.getBody().add(scroller, "w 100%, h 100%!"); } - public void init(final Iterable players) { - this.infoLBLs = new HashMap(); - for (final Player p : players) { + public void init(final List players) { + this.infoLBLs = Maps.newHashMap(); + for (final PlayerView p : players) { // Create and store labels detailing various non-critical player info. final InfoLabel name = new InfoLabel(); final InfoLabel life = new InfoLabel(); @@ -142,27 +142,27 @@ public enum VPlayers implements IVDoc { //========== Observer update methods /** @param p0 {@link forge.game.player.Player} */ - public void update(Game game) { + public void update(final IGameView game) { // No need to update if this panel isn't showing if (parentCell == null || !this.equals(parentCell.getSelected())) { return; } - boolean isCommander = game.getRules().hasAppliedVariant(GameType.Commander); + boolean isCommander = game.isCommander(); - for(Entry rr : infoLBLs.entrySet()) { - Player p0 = rr.getKey(); + for(final Entry rr : infoLBLs.entrySet()) { + PlayerView p0 = rr.getKey(); final JLabel[] temp = rr.getValue(); temp[1].setText("Life: " + String.valueOf(p0.getLife()) + " | Poison counters: " + String.valueOf(p0.getPoisonCounters())); temp[2].setText("Maximum hand size: " + String.valueOf(p0.getMaxHandSize())); temp[3].setText("Cards drawn this turn: " + String.valueOf(p0.getNumDrawnThisTurn())); - temp[4].setText("Damage Prevention: " + String.valueOf(p0.getPreventNextDamageTotalShields())); + temp[4].setText("Damage Prevention: " + String.valueOf(p0.getPreventNextDamage())); if (!p0.getKeywords().isEmpty()) { temp[5].setText(p0.getKeywords().toString()); } else { temp[5].setText(""); } if (FModel.getPreferences().getPrefBoolean(FPref.UI_ANTE)) { - List list = p0.getCardsIn(ZoneType.Ante); - StringBuilder sb = new StringBuilder(); + final List list = p0.getAnteCards(); + final StringBuilder sb = new StringBuilder(); sb.append("Ante'd: "); for (int i = 0; i < list.size(); i++) { sb.append(list.get(i)); @@ -173,7 +173,7 @@ public enum VPlayers implements IVDoc { temp[6].setText(sb.toString()); } if (isCommander) { - temp[7].setText(CardFactoryUtil.getCommanderInfo(p0).trim().replace("\r\n", "; ")); + temp[7].setText(p0.getCommanderInfo()); } } } diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/views/VStack.java b/forge-gui-desktop/src/main/java/forge/screens/match/views/VStack.java index e5dc7fb7175..58e16567820 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/views/VStack.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/views/VStack.java @@ -17,16 +17,28 @@ */ package forge.screens.match.views; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.image.BufferedImage; + +import javax.swing.JCheckBoxMenuItem; +import javax.swing.JPopupMenu; +import javax.swing.ScrollPaneConstants; +import javax.swing.SwingUtilities; +import javax.swing.border.EmptyBorder; + +import net.miginfocom.swing.MigLayout; import forge.ImageCache; import forge.Singletons; import forge.card.CardDetailUtil; import forge.card.CardDetailUtil.DetailColors; -import forge.game.card.Card; -import forge.game.player.Player; import forge.game.player.PlayerController; -import forge.game.spellability.SpellAbility; -import forge.game.spellability.SpellAbilityStackInstance; -import forge.game.zone.MagicStack; import forge.gui.framework.DragCell; import forge.gui.framework.DragTab; import forge.gui.framework.EDocID; @@ -39,18 +51,11 @@ import forge.toolbox.FMouseAdapter; import forge.toolbox.FScrollPanel; import forge.toolbox.FSkin; import forge.toolbox.FSkin.SkinnedTextArea; +import forge.view.CardView; +import forge.view.IGameView; +import forge.view.PlayerView; +import forge.view.StackItemView; import forge.view.arcane.CardPanel; -import net.miginfocom.swing.MigLayout; - -import javax.swing.*; -import javax.swing.border.EmptyBorder; - -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.awt.image.BufferedImage; /** * Assembles Swing components of stack report. @@ -129,10 +134,11 @@ public enum VStack implements IVDoc { //========== Observer update methods /** - * @param stack + * @param model * @param viewer */ - public void updateStack(final MagicStack stack, final Player localPlayer) { - tab.setText("Stack : " + stack.size()); + public void updateStack(final IGameView model, final PlayerView localPlayer) { + final java.util.List items = model.getStack(); + tab.setText("Stack : " + items.size()); // No need to update the rest unless it's showing if (!parentCell.getSelected().equals(this)) { return; } @@ -140,15 +146,15 @@ public enum VStack implements IVDoc { scroller.removeAll(); boolean isFirst = true; - for (final SpellAbilityStackInstance spell : stack) { - StackInstanceTextArea tar = new StackInstanceTextArea(stack, spell, localPlayer); + for (final StackItemView item : items) { + final StackInstanceTextArea tar = new StackInstanceTextArea(model, item, localPlayer); scroller.add(tar, "pushx, growx" + (isFirst ? "" : ", gaptop 2px")); //update the Card Picture/Detail when the spell is added to the stack if (isFirst) { isFirst = false; - CMatchUI.SINGLETON_INSTANCE.setCard(spell.getSourceCard()); + CMatchUI.SINGLETON_INSTANCE.setCard(item.getSource()); } } @@ -169,16 +175,14 @@ public enum VStack implements IVDoc { private static final int CARD_WIDTH = 50; private static final int CARD_HEIGHT = Math.round((float)CARD_WIDTH * CardPanel.ASPECT_RATIO); - private final Card sourceCard; + private final CardView sourceCard; - public StackInstanceTextArea(final MagicStack stack, final SpellAbilityStackInstance spell, final Player localPlayer) { - sourceCard = spell.getSourceCard().getCardForUi(); + public StackInstanceTextArea(final IGameView game, final StackItemView item, final PlayerView localPlayer) { + sourceCard = item.getSource(); + + final String txt = (item.isOptionalTrigger() && item.getActivatingPlayer().equals(localPlayer) + ? "(OPTIONAL) " : "") + item.getText(); - String txt = spell.getStackDescription(); - if (spell.getSpellAbility().isOptionalTrigger() - && spell.getSourceCard().getController().equals(localPlayer)) { - txt = "(OPTIONAL) " + txt; - } setText(txt); setToolTipText(txt); setOpaque(true); @@ -193,13 +197,13 @@ public enum VStack implements IVDoc { addMouseListener(new MouseAdapter() { @Override public void mouseEntered(final MouseEvent e) { - if (!spell.getStackDescription().startsWith("Morph ")) { - CMatchUI.SINGLETON_INSTANCE.setCard(spell.getSpellAbility().getHostCard()); + if (!txt.startsWith("Morph ")) { + CMatchUI.SINGLETON_INSTANCE.setCard(item.getSource()); } } }); - if (spell.getSpellAbility().isAbility() && localPlayer != null) { + if (item.isAbility() && localPlayer != null) { addMouseListener(new FMouseAdapter() { @Override public void onLeftClick(MouseEvent e) { @@ -210,13 +214,13 @@ public enum VStack implements IVDoc { onClick(e); } private void onClick(MouseEvent e) { - abilityMenu.setStackInstance(stack, spell.getSpellAbility(), localPlayer); + abilityMenu.setStackInstance(game, item, localPlayer); abilityMenu.show(e.getComponent(), e.getX(), e.getY()); } }); } - DetailColors color = CardDetailUtil.getBorderColor(sourceCard, !spell.getStackDescription().startsWith("Morph ")); + DetailColors color = CardDetailUtil.getBorderColor(item.getSource().getOriginal(), !txt.startsWith("Morph ")); setBackground(new Color(color.r, color.g, color.b)); setForeground(FSkin.getHighContrastColor(getBackground())); } @@ -228,7 +232,7 @@ public enum VStack implements IVDoc { final Graphics2D g2d = (Graphics2D) g; //draw image for source card - BufferedImage img = ImageCache.getImage(sourceCard, CARD_WIDTH, CARD_HEIGHT); + final BufferedImage img = ImageCache.getImage(sourceCard, CARD_WIDTH, CARD_HEIGHT); if (img != null) { g2d.drawImage(img, null, PADDING, PADDING); } @@ -242,8 +246,8 @@ public enum VStack implements IVDoc { private final JCheckBoxMenuItem jmiAutoYield; private final JCheckBoxMenuItem jmiAlwaysYes; private final JCheckBoxMenuItem jmiAlwaysNo; - private MagicStack stack; - private SpellAbility ability; + private IGameView game; + private StackItemView item; private PlayerController controller; private Integer triggerID = 0; @@ -253,10 +257,10 @@ public enum VStack implements IVDoc { jmiAutoYield.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { - final String key = ability.toUnsuppressedString(); + final String key = item.getKey(); final boolean autoYield = controller.shouldAutoYield(key); controller.setShouldAutoYield(key, !autoYield); - if (!autoYield && stack.peekAbility() == ability) { + if (!autoYield && game.peekStack() == item) { //auto-pass priority if ability is on top of stack CPrompt.SINGLETON_INSTANCE.getInputControl().passPriority(); } @@ -273,7 +277,7 @@ public enum VStack implements IVDoc { } else { controller.setShouldAlwaysAcceptTrigger(triggerID); - if (stack.peekAbility() == ability && + if (game.peekStack() == item && Singletons.getControl().getInputQueue().getInput() instanceof InputConfirm) { //auto-yes if ability is on top of stack CPrompt.SINGLETON_INSTANCE.getInputControl().selectButtonOK(); @@ -292,7 +296,7 @@ public enum VStack implements IVDoc { } else { controller.setShouldAlwaysDeclineTrigger(triggerID); - if (stack.peekAbility() == ability && + if (game.peekStack() == item && Singletons.getControl().getInputQueue().getInput() instanceof InputConfirm) { //auto-no if ability is on top of stack CPrompt.SINGLETON_INSTANCE.getInputControl().selectButtonOK(); @@ -303,15 +307,15 @@ public enum VStack implements IVDoc { add(jmiAlwaysNo); } - public void setStackInstance(final MagicStack stack0, final SpellAbility ability0, final Player localPlayer) { - stack = stack0; - ability = ability0; + public void setStackInstance(final IGameView game, final StackItemView item, final PlayerView localPlayer) { + this.game = game; + this.item = item; controller = localPlayer.getController(); - triggerID = ability.getSourceTrigger(); + triggerID = Integer.valueOf(item.getSourceTrigger()); - jmiAutoYield.setSelected(controller.shouldAutoYield(ability.toUnsuppressedString())); + jmiAutoYield.setSelected(controller.shouldAutoYield(item.getKey())); - if (ability.isOptionalTrigger() && ability.getActivatingPlayer() == localPlayer) { + if (item.isOptionalTrigger() && item.getActivatingPlayer().equals(localPlayer)) { jmiAlwaysYes.setSelected(controller.shouldAlwaysAcceptTrigger(triggerID)); jmiAlwaysNo.setSelected(controller.shouldAlwaysDeclineTrigger(triggerID)); jmiAlwaysYes.setVisible(true); diff --git a/forge-gui-desktop/src/main/java/forge/toolbox/imaging/FImageUtil.java b/forge-gui-desktop/src/main/java/forge/toolbox/imaging/FImageUtil.java index 173a9ffbe67..66ab05691b3 100644 --- a/forge-gui-desktop/src/main/java/forge/toolbox/imaging/FImageUtil.java +++ b/forge-gui-desktop/src/main/java/forge/toolbox/imaging/FImageUtil.java @@ -18,6 +18,10 @@ package forge.toolbox.imaging; +import java.awt.Dimension; +import java.awt.image.BufferedImage; +import java.awt.image.ColorModel; + import forge.ImageCache; import forge.card.CardCharacteristicName; import forge.game.card.Card; @@ -25,10 +29,7 @@ import forge.model.FModel; import forge.properties.ForgePreferences; import forge.toolbox.CardFaceSymbols; import forge.toolbox.FSkin.SkinIcon; - -import java.awt.Dimension; -import java.awt.image.BufferedImage; -import java.awt.image.ColorModel; +import forge.view.CardView.CardStateView; /** * Common image-related routines specific to Forge images. @@ -38,7 +39,8 @@ import java.awt.image.ColorModel; */ public final class FImageUtil { private FImageUtil() {} - + + @Deprecated public static BufferedImage getImage(Card card, CardCharacteristicName state) { BufferedImage image = ImageCache.getOriginalImage(card.getImageKey(state), true); int foilIndex = card.getFoil(); @@ -56,6 +58,7 @@ public final class FImageUtil { * For double-sided cards, returns the front-side image.
* For flip cards, returns the un-flipped image. */ + @Deprecated public static BufferedImage getImage(Card card) { BufferedImage image = ImageCache.getOriginalImage(card.getImageKey(), true); int foilIndex = card.getFoil(); @@ -64,7 +67,24 @@ public final class FImageUtil { } return image; } - + + /** + * Gets the image associated with a card. + *

+ * Adds a random foil effect if enabled. + *

+ * For double-sided cards, returns the front-side image.
+ * For flip cards, returns the un-flipped image. + */ + public static BufferedImage getImage(final CardStateView card) { + BufferedImage image = ImageCache.getOriginalImage(card.getImageKey(), true); + final int foilIndex = card.getCard().getFoilIndex(); + if (image != null && foilIndex > 0) { + image = getImageWithFoilEffect(image, foilIndex); + } + return image; + } + /** * Applies a foil effect to a card image. */ diff --git a/forge-gui-desktop/src/main/java/forge/toolbox/special/CardViewer.java b/forge-gui-desktop/src/main/java/forge/toolbox/special/CardViewer.java index 7c28c99bdd5..80f03156d2e 100644 --- a/forge-gui-desktop/src/main/java/forge/toolbox/special/CardViewer.java +++ b/forge-gui-desktop/src/main/java/forge/toolbox/special/CardViewer.java @@ -56,7 +56,7 @@ public class CardViewer extends JPanel { public CardViewer(final List list) { this.list = Collections.unmodifiableList(list); this.jList = new JList(new ChooserListModel()); - this.detail = new CardDetailPanel(null); + this.detail = new CardDetailPanel(); this.picture = new CardPicturePanel(); this.add(new FScrollPane(this.jList, true)); diff --git a/forge-gui-desktop/src/main/java/forge/toolbox/special/CardZoomer.java b/forge-gui-desktop/src/main/java/forge/toolbox/special/CardZoomer.java index 5349bb86b05..3c3b76bef55 100644 --- a/forge-gui-desktop/src/main/java/forge/toolbox/special/CardZoomer.java +++ b/forge-gui-desktop/src/main/java/forge/toolbox/special/CardZoomer.java @@ -18,23 +18,29 @@ package forge.toolbox.special; -import forge.Singletons; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.MouseWheelEvent; +import java.awt.event.MouseWheelListener; + +import javax.swing.JPanel; +import javax.swing.Timer; + +import net.miginfocom.swing.MigLayout; import forge.assets.FSkinProp; -import forge.card.CardCharacteristicName; -import forge.card.CardDetailUtil; -import forge.game.card.Card; import forge.gui.SOverlayUtils; import forge.toolbox.FOverlay; import forge.toolbox.FSkin; import forge.toolbox.FSkin.SkinnedLabel; import forge.toolbox.imaging.FImagePanel; -import forge.toolbox.imaging.FImageUtil; import forge.toolbox.imaging.FImagePanel.AutoSizeImageMode; -import net.miginfocom.swing.MigLayout; - -import javax.swing.*; - -import java.awt.event.*; +import forge.toolbox.imaging.FImageUtil; +import forge.view.CardView; +import forge.view.CardView.CardStateView; /** * Displays card image at its original size and correct orientation. @@ -46,30 +52,28 @@ import java.awt.event.*; * */ public enum CardZoomer { - SINGLETON_INSTANCE; + SINGLETON_INSTANCE; // Gui controls private final JPanel overlay = FOverlay.SINGLETON_INSTANCE.getPanel(); private JPanel pnlMain; private FImagePanel imagePanel; private SkinnedLabel lblFlipcard = new SkinnedLabel(); - + // Details about the current card being displayed. - private Card thisCard; - private CardCharacteristicName cardState = CardCharacteristicName.Original; - private boolean isImageFlipped = false; - private boolean isFaceDownCard = false; - + private CardView thisCard; + private boolean isInAltState; + // The zoomer is in button mode when it is activated by holding down the // middle mouse button or left and right mouse buttons simultaneously. private boolean isButtonMode = false; private boolean isOpen = false; private long lastClosedTime; - + // Used to ignore mouse wheel rotation for a short period of time. private Timer mouseWheelCoolDownTimer; private boolean isMouseWheelEnabled = false; - + // ctr private CardZoomer() { lblFlipcard.setIcon(FSkin.getIcon(FSkinProp.ICO_FLIPCARD)); @@ -77,7 +81,7 @@ public enum CardZoomer { setMouseWheelListener(); setKeyListeners(); } - + /** * Creates listener for keys that are recognised by zoomer. *