From 8b39b69bb7572f172a2272000170e3ee4e8f84ae Mon Sep 17 00:00:00 2001 From: drdev Date: Thu, 17 Oct 2013 04:23:48 +0000 Subject: [PATCH] Move/rename FControl.Screens to FScreen and make that define the Navigation tab data instead of INavigationTabData Make it so each Deck Editor type appears in its own tab Make Bazaar screen act more like other screens --- .gitattributes | 5 +- .../java/forge/control/ControlBazaarUI.java | 65 ----- src/main/java/forge/control/FControl.java | 163 ++++------- .../java/forge/control/KeyboardShortcuts.java | 19 +- src/main/java/forge/game/Game.java | 63 +--- src/main/java/forge/gui/bazaar/CBazaarUI.java | 71 +++++ .../bazaar/VBazaarUI.java} | 106 +++---- .../forge/gui/deckeditor/CDeckEditorUI.java | 269 ++++++++---------- .../java/forge/gui/deckeditor/SEditorIO.java | 5 +- .../forge/gui/deckeditor/VDeckEditorUI.java | 25 +- .../deckeditor/controllers/ACEditorBase.java | 5 +- .../deckeditor/controllers/CCurrentDeck.java | 5 +- .../gui/deckeditor/controllers/CDeckgen.java | 5 +- .../controllers/CEditorCommander.java | 26 +- .../controllers/CEditorConstructed.java | 152 +++++----- .../controllers/CEditorDraftingProcess.java | 29 +- .../controllers/CEditorLimited.java | 13 +- .../deckeditor/controllers/CEditorQuest.java | 17 +- .../controllers/CEditorQuestCardShop.java | 115 ++++---- .../controllers/CEditorVariant.java | 35 +-- .../controllers/DeckController.java | 21 +- .../java/forge/gui/framework/FScreen.java | 197 +++++++++++++ .../forge/gui/framework/IVTopLevelUI.java | 14 + .../java/forge/gui/framework/SLayoutIO.java | 177 +++++------- src/main/java/forge/gui/home/CHomeUI.java | 57 +--- src/main/java/forge/gui/home/VHomeUI.java | 18 ++ .../gui/home/quest/CSubmenuQuestDecks.java | 4 +- .../gui/home/quest/SSubmenuQuestUtil.java | 7 +- .../gui/home/sanctioned/CSubmenuDraft.java | 4 +- .../gui/home/sanctioned/CSubmenuSealed.java | 6 +- .../home/settings/CSubmenuPreferences.java | 20 +- .../gui/home/variant/CSubmenuArchenemy.java | 7 +- .../gui/home/variant/CSubmenuCommander.java | 4 +- .../gui/home/variant/CSubmenuPlanechase.java | 7 +- .../java/forge/gui/match/ControlWinLose.java | 4 +- .../java/forge/gui/match/QuestWinLose.java | 4 +- .../forge/gui/match/TargetingOverlay.java | 4 +- src/main/java/forge/gui/match/VMatchUI.java | 24 +- .../forge/gui/match/controllers/CDock.java | 7 +- src/main/java/forge/gui/menus/LayoutMenu.java | 12 +- .../forge/gui/toolbox/special/DeckLister.java | 27 +- .../java/forge/properties/NewConstants.java | 1 - src/main/java/forge/quest/gui/ViewStall.java | 12 +- src/main/java/forge/view/FNavigationBar.java | 93 +++--- src/main/java/forge/view/FView.java | 15 +- 45 files changed, 959 insertions(+), 980 deletions(-) delete mode 100644 src/main/java/forge/control/ControlBazaarUI.java create mode 100644 src/main/java/forge/gui/bazaar/CBazaarUI.java rename src/main/java/forge/{view/ViewBazaarUI.java => gui/bazaar/VBazaarUI.java} (55%) create mode 100644 src/main/java/forge/gui/framework/FScreen.java diff --git a/.gitattributes b/.gitattributes index b8337230da5..ea617586b93 100644 --- a/.gitattributes +++ b/.gitattributes @@ -14916,7 +14916,6 @@ src/main/java/forge/card/trigger/WrappedAbility.java -text src/main/java/forge/card/trigger/ZCTrigger.java svneol=native#text/plain src/main/java/forge/card/trigger/package-info.java svneol=native#text/plain src/main/java/forge/control/ChatArea.java -text -src/main/java/forge/control/ControlBazaarUI.java -text src/main/java/forge/control/FControl.java -text src/main/java/forge/control/FControlGameEventHandler.java -text src/main/java/forge/control/FControlGamePlayback.java -text @@ -15085,6 +15084,8 @@ src/main/java/forge/gui/MultiLineLabelUI.java svneol=native#text/plain src/main/java/forge/gui/SOverlayUtils.java -text src/main/java/forge/gui/UnsortedListModel.java -text src/main/java/forge/gui/WrapLayout.java -text +src/main/java/forge/gui/bazaar/CBazaarUI.java -text +src/main/java/forge/gui/bazaar/VBazaarUI.java -text src/main/java/forge/gui/deckchooser/DecksComboBox.java -text src/main/java/forge/gui/deckchooser/DecksComboBoxEvent.java -text src/main/java/forge/gui/deckchooser/FDeckChooser.java -text @@ -15130,6 +15131,7 @@ src/main/java/forge/gui/events/UiEventBlockerAssigned.java -text src/main/java/forge/gui/framework/DragCell.java -text src/main/java/forge/gui/framework/DragTab.java -text src/main/java/forge/gui/framework/EDocID.java -text +src/main/java/forge/gui/framework/FScreen.java -text src/main/java/forge/gui/framework/ICDoc.java -text src/main/java/forge/gui/framework/IDocIdList.java -text src/main/java/forge/gui/framework/ILocalRepaint.java -text @@ -15514,7 +15516,6 @@ src/main/java/forge/view/FTitleBarBase.java -text src/main/java/forge/view/FView.java -text src/main/java/forge/view/Main.java -text src/main/java/forge/view/SplashFrame.java -text -src/main/java/forge/view/ViewBazaarUI.java -text src/main/java/forge/view/arcane/CardArea.java svneol=native#text/plain src/main/java/forge/view/arcane/CardPanel.java svneol=native#text/plain src/main/java/forge/view/arcane/CardPanelContainer.java svneol=native#text/plain diff --git a/src/main/java/forge/control/ControlBazaarUI.java b/src/main/java/forge/control/ControlBazaarUI.java deleted file mode 100644 index eda0db6840b..00000000000 --- a/src/main/java/forge/control/ControlBazaarUI.java +++ /dev/null @@ -1,65 +0,0 @@ -package forge.control; - -import java.awt.event.ComponentAdapter; -import java.awt.event.ComponentEvent; -import java.awt.event.ComponentListener; - -import javax.swing.SwingUtilities; - -import com.google.common.collect.Iterables; - -import forge.gui.toolbox.FLabel; -import forge.quest.bazaar.QuestBazaarManager; -import forge.view.ViewBazaarUI; - -/** - * TODO: Write javadoc for this type. - * - */ -public class ControlBazaarUI { - private final ViewBazaarUI view; - private final ComponentListener cadResize; - private final QuestBazaarManager model; - - /** - * Controls top-level instance of bazaar. - * @param v0   {@link forge.view.ViewBazaarUI} - * @param bazaar - */ - public ControlBazaarUI(ViewBazaarUI v0, QuestBazaarManager bazaar0) { - view = v0; - model = bazaar0; - - cadResize = new ComponentAdapter() { - @Override - public void componentResized(ComponentEvent e) { - view.revalidate(); - } - }; - - addListeners(); - } - - private void addListeners() { - this.view.removeComponentListener(cadResize); - this.view.addComponentListener(cadResize); - } - - /** Populate all stalls, and select first one. */ - public void initBazaar() { - view.populateStalls(); - ((FLabel) view.getPnlAllStalls().getComponent(0)).setSelected(true); - showStall(Iterables.get(model.getStallNames(), 0)); - } - - /** @param s0   {@link java.lang.String} */ - public void showStall(final String s0) { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - view.getPnlSingleStall().setStall(model.getStall(s0)); - view.getPnlSingleStall().updateStall(); - } - }); - } -} diff --git a/src/main/java/forge/control/FControl.java b/src/main/java/forge/control/FControl.java index a86131d623c..50a862c2842 100644 --- a/src/main/java/forge/control/FControl.java +++ b/src/main/java/forge/control/FControl.java @@ -52,15 +52,13 @@ import forge.game.player.Player; import forge.gui.GuiDialog; import forge.gui.SOverlayUtils; import forge.gui.deckeditor.CDeckEditorUI; -import forge.gui.deckeditor.VDeckEditorUI; 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.gui.home.CHomeUI; -import forge.gui.home.VHomeUI; import forge.gui.home.settings.GamePlayerUtil; import forge.gui.match.CMatchUI; import forge.gui.match.VMatchUI; @@ -72,7 +70,6 @@ import forge.gui.match.nonsingleton.VField; import forge.gui.match.views.VAntes; import forge.gui.menus.ForgeMenu; import forge.gui.menus.MenuUtil; -import forge.gui.toolbox.FAbsolutePositioner; import forge.gui.toolbox.FSkin; import forge.net.FServer; import forge.properties.ForgePreferences; @@ -90,8 +87,8 @@ import forge.view.FView; * FControl. *

* Controls all Forge UI functionality inside one JFrame. This class switches - * between various display states in that JFrame. Controllers are instantiated - * separately by each state's top level view class. + * between various display screens in that JFrame. Controllers are instantiated + * separately by each screen's top level view class. */ public enum FControl implements KeyEventDispatcher { instance; @@ -99,22 +96,10 @@ public enum FControl implements KeyEventDispatcher { private ForgeMenu forgeMenu; private List shortcuts; private JLayeredPane display; - private Screens state = Screens.UNKNOWN; + private FScreen currentScreen; private boolean altKeyLastDown; private CloseAction closeAction; - public static enum Screens { - UNKNOWN, - HOME_SCREEN, - MATCH_SCREEN, - DECK_EDITOR_CONSTRUCTED, - QUEST_BAZAAR, - DECK_EDITOR_LIMITED, - DECK_EDITOR_QUEST, - QUEST_CARD_SHOP, - DRAFTING_PROCESS - } - public static enum CloseAction { NONE, CLOSE_SCREEN, @@ -128,8 +113,8 @@ public enum FControl implements KeyEventDispatcher { * FControl. *

* Controls all Forge UI functionality inside one JFrame. This class - * switches between various display states in that JFrame. Controllers are - * instantiated separately by each state's top level view class. + * switches between various display screens in that JFrame. Controllers are + * instantiated separately by each screen's top level view class. */ private FControl() { Singletons.getView().getFrame().addWindowListener(new WindowAdapter() { @@ -220,8 +205,6 @@ public enum FControl implements KeyEventDispatcher { // Preloads skin components (using progress bar). FSkin.loadFull(true); - this.forgeMenu = new ForgeMenu(); - this.shortcuts = KeyboardShortcuts.attachKeyboardShortcuts(); this.display = FView.SINGLETON_INSTANCE.getLpnDocument(); @@ -271,95 +254,70 @@ public enum FControl implements KeyEventDispatcher { } public ForgeMenu getForgeMenu() { + if (this.forgeMenu == null) { + this.forgeMenu = new ForgeMenu(); + } return this.forgeMenu; } - /** - * Switches between display states in top level JFrame. - */ - public void changeState(Screens screen) { - //TODO: Uncomment the line below if this function stops being used to refresh - //the current screen in some places (such as Continue and Restart in the match screen) - //if (this.state == screen) { return; } - - clearChildren(JLayeredPane.DEFAULT_LAYER); - this.state = screen; - - // Fire up new state - switch (screen) { - case HOME_SCREEN: - SOverlayUtils.hideTargetingOverlay(); - VHomeUI.SINGLETON_INSTANCE.populate(); - CHomeUI.SINGLETON_INSTANCE.initialize(); - FView.SINGLETON_INSTANCE.getPnlInsets().setVisible(true); - FView.SINGLETON_INSTANCE.getPnlInsets().setForegroundImage(new ImageIcon()); - break; - - case MATCH_SCREEN: - VMatchUI.SINGLETON_INSTANCE.populate(); - CMatchUI.SINGLETON_INSTANCE.initialize(); - FView.SINGLETON_INSTANCE.getPnlInsets().setVisible(true); - showMatchBackgroundImage(); - SOverlayUtils.showTargetingOverlay(); - Singletons.getView().getNavigationBar().setSelectedTab(this.game); - break; - - case DECK_EDITOR_CONSTRUCTED: - case DECK_EDITOR_LIMITED: - case DECK_EDITOR_QUEST: - case QUEST_CARD_SHOP: - case DRAFTING_PROCESS: - SOverlayUtils.hideTargetingOverlay(); - VDeckEditorUI.SINGLETON_INSTANCE.populate(); - CDeckEditorUI.SINGLETON_INSTANCE.initialize(); - FView.SINGLETON_INSTANCE.getPnlInsets().setVisible(true); - FView.SINGLETON_INSTANCE.getPnlInsets().setForegroundImage(new ImageIcon()); - break; - - case QUEST_BAZAAR: - SOverlayUtils.hideTargetingOverlay(); - FAbsolutePositioner.SINGLETON_INSTANCE.hideAll(); - display.add(Singletons.getView().getViewBazaar(), JLayeredPane.DEFAULT_LAYER); - FView.SINGLETON_INSTANCE.getPnlInsets().setVisible(false); - sizeChildren(); - Singletons.getView().getNavigationBar().setSelectedTab(Singletons.getView().getViewBazaar()); - break; - - default: - throw new RuntimeException("unhandled screen: " + screen); - } + public FScreen getCurrentScreen() { + return this.currentScreen; } - private void showMatchBackgroundImage() { - if (isMatchBackgroundImageVisible()) { - FView.SINGLETON_INSTANCE.getPnlInsets().setForegroundImage(FSkin.getIcon(FSkin.Backgrounds.BG_MATCH)); + /** + * Switches between display screens in top level JFrame. + */ + public void setCurrentScreen(FScreen screen) { + //TODO: Uncomment the line below if this function stops being used to refresh + //the current screen in some places (such as Continue and Restart in the match screen) + //if (this.currentScreen == screen) { return; } + + //give previous screen a chance to perform special switch handling and/or cancel switching away from screen + if (!Singletons.getView().getNavigationBar().canSwitchAway()) { return; } + + if (this.currentScreen == FScreen.MATCH_SCREEN) { //hide targeting overlay and reset image if was on match screen + SOverlayUtils.hideTargetingOverlay(); + if (isMatchBackgroundImageVisible()) { + FView.SINGLETON_INSTANCE.getPnlInsets().setForegroundImage(new ImageIcon()); + } } + + clearChildren(JLayeredPane.DEFAULT_LAYER); + SOverlayUtils.hideOverlay(); + + this.currentScreen = screen; + + //load layout for new current screen + try { + SLayoutIO.loadLayout(null); + } catch (InvalidLayoutFileException ex) { + GuiDialog.message("Your " + screen.getTabCaption() + " layout file could not be read. It will be deleted after you press OK.\nThe game will proceed with default layout."); + if (screen.deleteLayoutFile()) { + SLayoutIO.loadLayout(null); //try again + } + } + + screen.getView().populate(); + screen.getController().initialize(); + + if (screen == FScreen.MATCH_SCREEN) { + if (isMatchBackgroundImageVisible()) { + FView.SINGLETON_INSTANCE.getPnlInsets().setForegroundImage(FSkin.getIcon(FSkin.Backgrounds.BG_MATCH)); + } + SOverlayUtils.showTargetingOverlay(); + } + + Singletons.getView().getNavigationBar().updateSelectedTab(); } private boolean isMatchBackgroundImageVisible() { return Singletons.getModel().getPreferences().getPrefBoolean(FPref.UI_MATCH_IMAGE_VISIBLE); } - public void changeStateAutoFixLayout(Screens newState, String stateName) { - try { - changeState(newState); - } catch (InvalidLayoutFileException ex) { - GuiDialog.message("Your " + stateName + " layout file could not be read. It will be deleted after you press OK.\nThe game will proceed with default layout."); - File fLayout = new File(SLayoutIO.getFilePreferred(newState)); - fLayout.delete(); - // try again - changeState(newState); - } - } + public void ensureScreenActive(FScreen screen) { + if (this.currentScreen == screen) { return; } - /** - * Returns the int reflecting the current state of the top level frame - * (see field definitions and class methods for details). - * - * @return {@link java.lang.Integer} - * */ - public Screens getState() { - return this.state; + setCurrentScreen(screen); } /** @return List A list of attached keyboard shortcut descriptions and properties. */ @@ -455,10 +413,9 @@ public enum FControl implements KeyEventDispatcher { return inputQueue; } - public final void startGameWithUi(Match match) { if (this.game != null) { - this.changeState(Screens.MATCH_SCREEN); + this.setCurrentScreen(FScreen.MATCH_SCREEN); SOverlayUtils.hideOverlay(); JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), "Cannot start a new game while another game is already in progress."); return; //TODO: See if it's possible to run multiple games at once without crashing @@ -471,7 +428,7 @@ public enum FControl implements KeyEventDispatcher { public final void endCurrentGame() { if (this.game == null) { return; } - Singletons.getView().getNavigationBar().closeTab(this.game); + Singletons.getView().getNavigationBar().closeTab(FScreen.MATCH_SCREEN); this.game = null; } @@ -502,7 +459,7 @@ public enum FControl implements KeyEventDispatcher { Singletons.getModel().getPreferences().actuateMatchPreferences(); - changeStateAutoFixLayout(Screens.MATCH_SCREEN, "match"); + setCurrentScreen(FScreen.MATCH_SCREEN); SDisplayUtil.showTab(EDocID.REPORT_LOG.getDoc()); CMessage.SINGLETON_INSTANCE.getInputControl().setGame(game); diff --git a/src/main/java/forge/control/KeyboardShortcuts.java b/src/main/java/forge/control/KeyboardShortcuts.java index 6d689e17e47..f914fee4542 100644 --- a/src/main/java/forge/control/KeyboardShortcuts.java +++ b/src/main/java/forge/control/KeyboardShortcuts.java @@ -18,6 +18,7 @@ import org.apache.commons.lang3.StringUtils; import forge.Singletons; import forge.gui.framework.EDocID; +import forge.gui.framework.FScreen; import forge.gui.framework.SDisplayUtil; import forge.gui.home.settings.VSubmenuPreferences.KeyboardShortcutField; import forge.gui.match.controllers.CDock; @@ -50,7 +51,7 @@ public class KeyboardShortcuts { final Action actShowStack = new AbstractAction() { @Override public void actionPerformed(final ActionEvent e) { - if (Singletons.getControl().getState() != FControl.Screens.MATCH_SCREEN) { return; } + if (Singletons.getControl().getCurrentScreen() != FScreen.MATCH_SCREEN) { return; } SDisplayUtil.showTab(EDocID.REPORT_STACK.getDoc()); } }; @@ -59,7 +60,7 @@ public class KeyboardShortcuts { final Action actShowCombat = new AbstractAction() { @Override public void actionPerformed(final ActionEvent e) { - if (Singletons.getControl().getState() != FControl.Screens.MATCH_SCREEN) { return; } + if (Singletons.getControl().getCurrentScreen() != FScreen.MATCH_SCREEN) { return; } SDisplayUtil.showTab(EDocID.REPORT_COMBAT.getDoc()); } }; @@ -68,7 +69,7 @@ public class KeyboardShortcuts { final Action actShowConsole = new AbstractAction() { @Override public void actionPerformed(final ActionEvent e) { - if (Singletons.getControl().getState() != FControl.Screens.MATCH_SCREEN) { return; } + if (Singletons.getControl().getCurrentScreen() != FScreen.MATCH_SCREEN) { return; } SDisplayUtil.showTab(EDocID.REPORT_LOG.getDoc()); } }; @@ -77,7 +78,7 @@ public class KeyboardShortcuts { final Action actShowPlayers = new AbstractAction() { @Override public void actionPerformed(final ActionEvent e) { - if (Singletons.getControl().getState() != FControl.Screens.MATCH_SCREEN) { return; } + if (Singletons.getControl().getCurrentScreen() != FScreen.MATCH_SCREEN) { return; } SDisplayUtil.showTab(EDocID.REPORT_PLAYERS.getDoc()); } }; @@ -86,7 +87,7 @@ public class KeyboardShortcuts { final Action actShowDev = new AbstractAction() { @Override public void actionPerformed(final ActionEvent e) { - if (Singletons.getControl().getState() != FControl.Screens.MATCH_SCREEN) { return; } + if (Singletons.getControl().getCurrentScreen() != FScreen.MATCH_SCREEN) { return; } if (Singletons.getModel().getPreferences().getPrefBoolean(FPref.DEV_MODE_ENABLED)) { SDisplayUtil.showTab(EDocID.DEV_MODE.getDoc()); } @@ -97,7 +98,7 @@ public class KeyboardShortcuts { final Action actConcede = new AbstractAction() { @Override public void actionPerformed(final ActionEvent e) { - if (Singletons.getControl().getState() != FControl.Screens.MATCH_SCREEN) { return; } + if (Singletons.getControl().getCurrentScreen() != FScreen.MATCH_SCREEN) { return; } CDock.SINGLETON_INSTANCE.concede(); } }; @@ -106,7 +107,7 @@ public class KeyboardShortcuts { final Action actEndTurn = new AbstractAction() { @Override public void actionPerformed(final ActionEvent e) { - if (Singletons.getControl().getState() != FControl.Screens.MATCH_SCREEN) { return; } + if (Singletons.getControl().getCurrentScreen() != FScreen.MATCH_SCREEN) { return; } CDock.SINGLETON_INSTANCE.endTurn(); } }; @@ -115,7 +116,7 @@ public class KeyboardShortcuts { final Action actAllAttack = new AbstractAction() { @Override public void actionPerformed(final ActionEvent e) { - if (Singletons.getControl().getState() != FControl.Screens.MATCH_SCREEN) { return; } + if (Singletons.getControl().getCurrentScreen() != FScreen.MATCH_SCREEN) { return; } CDock.SINGLETON_INSTANCE.alphaStrike(); } }; @@ -124,7 +125,7 @@ public class KeyboardShortcuts { final Action actTgtOverlay = new AbstractAction() { @Override public void actionPerformed(final ActionEvent e) { - if (Singletons.getControl().getState() != FControl.Screens.MATCH_SCREEN) { return; } + if (Singletons.getControl().getCurrentScreen() != FScreen.MATCH_SCREEN) { return; } CDock.SINGLETON_INSTANCE.toggleTargeting(); } }; diff --git a/src/main/java/forge/game/Game.java b/src/main/java/forge/game/Game.java index e70954128ec..09b99050bba 100644 --- a/src/main/java/forge/game/Game.java +++ b/src/main/java/forge/game/Game.java @@ -30,14 +30,11 @@ import forge.CardLists; import forge.ColorChanger; import forge.FThreads; import forge.GameLog; -import forge.Singletons; import forge.StaticEffects; import forge.card.replacement.ReplacementHandler; import forge.card.spellability.SpellAbilityStackInstance; import forge.card.trigger.TriggerHandler; import forge.card.trigger.TriggerType; -import forge.control.FControl; -import forge.control.FControl.Screens; import forge.game.combat.Combat; import forge.game.event.GameEvent; import forge.game.event.GameEventGameOutcome; @@ -51,15 +48,11 @@ import forge.game.player.Player; import forge.game.zone.MagicStack; import forge.game.zone.Zone; import forge.game.zone.ZoneType; -import forge.gui.SOverlayUtils; -import forge.gui.toolbox.FSkin; -import forge.gui.toolbox.FSkin.SkinImage; -import forge.view.FNavigationBar.INavigationTabData; /** * Represents the state of a single game, a new instance is created for each game. */ -public class Game implements INavigationTabData { +public class Game { private final GameType type; private final List roIngamePlayers; private final List allPlayers; @@ -593,58 +586,4 @@ public class Game implements INavigationTabData { // TODO Auto-generated method stub return ++cardIdCounter; } - - /* (non-Javadoc) - * @see forge.view.FNavigationBar.INavigationTabData#getTabCaption() - */ - @Override - public String getTabCaption() { - return "Game - " + type.getDecksFormat().name(); //TODO: Consider including more info, such as game number, match record, etc. - } - - /* (non-Javadoc) - * @see forge.view.FNavigationBar.INavigationTabData#getTabIcon() - */ - @Override - public SkinImage getTabIcon() { - return FSkin.getIcon(FSkin.DockIcons.ICO_ALPHASTRIKE); - } - - /* (non-Javadoc) - * @see forge.view.FNavigationBar.INavigationTabData#getTabDestScreen() - */ - @Override - public Screens getTabDestScreen() { - return Screens.MATCH_SCREEN; - } - - /* (non-Javadoc) - * @see forge.view.FNavigationBar.INavigationTabData#allowTabClose() - */ - @Override - public boolean allowTabClose() { - return true; - } - - /* (non-Javadoc) - * @see forge.view.FNavigationBar.INavigationTabData#canCloseTab() - */ - @Override - public String getCloseButtonTooltip() { - return "Concede Game"; - } - - /* (non-Javadoc) - * @see forge.view.FNavigationBar.INavigationTabData#onClosing() - */ - @Override - public boolean onClosing() { - if (!isGameOver()) { - Singletons.getControl().stopGame(); - return false; //delay hiding tab - } - Singletons.getControl().changeState(FControl.Screens.HOME_SCREEN); - SOverlayUtils.hideOverlay(); - return true; - } } diff --git a/src/main/java/forge/gui/bazaar/CBazaarUI.java b/src/main/java/forge/gui/bazaar/CBazaarUI.java new file mode 100644 index 00000000000..fd35b3157e6 --- /dev/null +++ b/src/main/java/forge/gui/bazaar/CBazaarUI.java @@ -0,0 +1,71 @@ +package forge.gui.bazaar; + +import javax.swing.SwingUtilities; + +import com.google.common.collect.Iterables; + +import forge.Command; +import forge.gui.framework.ICDoc; +import forge.gui.toolbox.FLabel; +import forge.quest.bazaar.QuestBazaarManager; + +/** + * TODO: Write javadoc for this type. + * + */ +public enum CBazaarUI implements ICDoc { + SINGLETON_INSTANCE; + + /** + * Controls top-level instance of bazaar. + * @param v0   {@link forge.gui.bazaar.VBazaarUI} + * @param bazaar + */ + private CBazaarUI() { + } + + /** Populate all stalls, and select first one. */ + public void initBazaar(QuestBazaarManager bazaar) { + VBazaarUI.SINGLETON_INSTANCE.populateStalls(); + ((FLabel) VBazaarUI.SINGLETON_INSTANCE.getPnlAllStalls().getComponent(0)).setSelected(true); + showStall(Iterables.get(bazaar.getStallNames(), 0), bazaar); + } + + /** @param s0   {@link java.lang.String} */ + public void showStall(final String s0, final QuestBazaarManager bazaar) { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + VBazaarUI.SINGLETON_INSTANCE.getPnlSingleStall().setStall(bazaar.getStall(s0)); + VBazaarUI.SINGLETON_INSTANCE.getPnlSingleStall().updateStall(); + } + }); + } + + /* (non-Javadoc) + * @see forge.gui.framework.ICDoc#getCommandOnSelect() + */ + @Override + public Command getCommandOnSelect() { + // TODO Auto-generated method stub + return null; + } + + /* (non-Javadoc) + * @see forge.gui.framework.ICDoc#initialize() + */ + @Override + public void initialize() { + // TODO Auto-generated method stub + + } + + /* (non-Javadoc) + * @see forge.gui.framework.ICDoc#update() + */ + @Override + public void update() { + // TODO Auto-generated method stub + + } +} diff --git a/src/main/java/forge/view/ViewBazaarUI.java b/src/main/java/forge/gui/bazaar/VBazaarUI.java similarity index 55% rename from src/main/java/forge/view/ViewBazaarUI.java rename to src/main/java/forge/gui/bazaar/VBazaarUI.java index eb379b90f93..d9767a731e7 100644 --- a/src/main/java/forge/view/ViewBazaarUI.java +++ b/src/main/java/forge/gui/bazaar/VBazaarUI.java @@ -1,4 +1,4 @@ -package forge.view; +package forge.gui.bazaar; import javax.swing.JPanel; import javax.swing.SwingConstants; @@ -7,58 +7,35 @@ import javax.swing.SwingUtilities; import net.miginfocom.swing.MigLayout; import forge.Command; import forge.Singletons; -import forge.control.ControlBazaarUI; -import forge.control.FControl; -import forge.control.FControl.Screens; +import forge.gui.framework.FScreen; +import forge.gui.framework.IVTopLevelUI; import forge.gui.toolbox.FLabel; import forge.gui.toolbox.FPanel; import forge.gui.toolbox.FSkin; -import forge.gui.toolbox.FSkin.SkinImage; import forge.quest.bazaar.QuestBazaarManager; import forge.quest.gui.ViewStall; -import forge.view.FNavigationBar.INavigationTabData; +import forge.view.FView; /** Lays out containers and borders for resizeable layout and * instantiates top-level controller for bazaar UI. */ -@SuppressWarnings("serial") -public class ViewBazaarUI extends FPanel implements INavigationTabData { - private final JPanel pnlAllStalls; - private final ViewStall pnlSingleStall; - private final ControlBazaarUI control; +public enum VBazaarUI implements IVTopLevelUI { + /** */ + SINGLETON_INSTANCE; + + private JPanel pnlAllStalls; + private ViewStall pnlSingleStall; private FLabel previousSelected; - private final QuestBazaarManager bazaar; + private QuestBazaarManager bazaar; /** Lays out containers and borders for resizeable layout and * instantiates top-level controller for bazaar UI. * @param bazaar0 */ - public ViewBazaarUI(QuestBazaarManager bazaar0) { - super(); - - // Final inits - this.pnlAllStalls = new JPanel(); - this.pnlSingleStall = new ViewStall(this); - this.bazaar = bazaar0; - - // Component styling - this.setCornerDiameter(0); - this.setBorderToggle(false); - this.skin.setBackgroundTexture(FSkin.getIcon(FSkin.Backgrounds.BG_TEXTURE)); - this.setLayout(new MigLayout("insets 0, gap 0")); - pnlAllStalls.setOpaque(false); - pnlAllStalls.setLayout(new MigLayout("insets 0, gap 0, wrap, align center")); - - // Layout - this.add(pnlAllStalls, "w 25%!, h 100%!"); - this.add(pnlSingleStall, "w 75%!, h 100%!"); - - // Instantiate control - control = new ControlBazaarUI(this, bazaar); - control.initBazaar(); - previousSelected = ((FLabel) pnlAllStalls.getComponent(0)); + private VBazaarUI() { } /** */ + @SuppressWarnings("serial") public void populateStalls() { for (final String s : bazaar.getStallNames()) { @@ -74,7 +51,7 @@ public class ViewBazaarUI extends FPanel implements INavigationTabData { if (previousSelected != null) { previousSelected.setSelected(false); } lbl.setSelected(true); previousSelected = lbl; - control.showStall(s); + CBazaarUI.SINGLETON_INSTANCE.showStall(s, bazaar); } }); } @@ -105,53 +82,52 @@ public class ViewBazaarUI extends FPanel implements INavigationTabData { public ViewStall getPnlSingleStall() { return this.pnlSingleStall; } - + /* (non-Javadoc) - * @see forge.view.FNavigationBar.INavigationTabData#getTabCaption() + * @see forge.gui.framework.IVTopLevelUI#instantiate() */ @Override - public String getTabCaption() { - return "Bazaar"; + public void instantiate() { + // Final inits + this.pnlAllStalls = new JPanel(); + this.pnlSingleStall = new ViewStall(this); + this.bazaar = Singletons.getModel().getQuest().getBazaar(); + + pnlAllStalls.setOpaque(false); + pnlAllStalls.setLayout(new MigLayout("insets 0, gap 0, wrap, align center")); + + // Instantiate control + CBazaarUI.SINGLETON_INSTANCE.initBazaar(this.bazaar); + previousSelected = ((FLabel) pnlAllStalls.getComponent(0)); } /* (non-Javadoc) - * @see forge.view.FNavigationBar.INavigationTabData#getTabIcon() + * @see forge.gui.framework.IVTopLevelUI#populate() */ @Override - public SkinImage getTabIcon() { - return FSkin.getIcon(FSkin.QuestIcons.ICO_BOTTLES); + public void populate() { + FPanel pnl = FView.SINGLETON_INSTANCE.getPnlInsets(); + pnl.setBorder(null); + pnl.setLayout(new MigLayout("insets 0, gap 0")); + FSkin.get(pnl).setBackgroundTexture(FSkin.getIcon(FSkin.Backgrounds.BG_TEXTURE)); + + pnl.add(pnlAllStalls, "w 25%!, h 100%!"); + pnl.add(pnlSingleStall, "w 75%!, h 100%!"); } /* (non-Javadoc) - * @see forge.view.FNavigationBar.INavigationTabData#getTabDestScreen() + * @see forge.gui.framework.IVTopLevelUI#onSwitching(forge.gui.framework.FScreen) */ @Override - public Screens getTabDestScreen() { - return Screens.QUEST_BAZAAR; - } - - /* (non-Javadoc) - * @see forge.view.FNavigationBar.INavigationTabData#allowTabClose() - */ - @Override - public boolean allowTabClose() { + public boolean onSwitching(FScreen screen) { return true; } - - /* (non-Javadoc) - * @see forge.view.FNavigationBar.INavigationTabData#canCloseTab() - */ - @Override - public String getCloseButtonTooltip() { - return "Leave Bazaar"; - } - + /* (non-Javadoc) * @see forge.view.FNavigationBar.INavigationTabData#onClosingTab() */ @Override - public boolean onClosing() { - Singletons.getControl().changeState(FControl.Screens.HOME_SCREEN); + public boolean onClosing(FScreen screen) { return true; } } diff --git a/src/main/java/forge/gui/deckeditor/CDeckEditorUI.java b/src/main/java/forge/gui/deckeditor/CDeckEditorUI.java index 9abdd311d4b..c62fc8b5dd0 100644 --- a/src/main/java/forge/gui/deckeditor/CDeckEditorUI.java +++ b/src/main/java/forge/gui/deckeditor/CDeckEditorUI.java @@ -29,6 +29,7 @@ import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; +import java.util.HashMap; import java.util.List; import javax.swing.JMenu; @@ -48,7 +49,6 @@ import com.google.common.primitives.Ints; import forge.Command; import forge.Singletons; -import forge.control.FControl.Screens; import forge.deck.DeckBase; import forge.gui.GuiUtils; import forge.gui.deckeditor.controllers.ACEditorBase; @@ -57,19 +57,20 @@ import forge.gui.deckeditor.controllers.CEditorConstructed; import forge.gui.deckeditor.controllers.CProbabilities; import forge.gui.deckeditor.controllers.CStatistics; import forge.gui.deckeditor.views.VCardCatalog; +import forge.gui.deckeditor.views.VCurrentDeck; +import forge.gui.framework.FScreen; import forge.gui.framework.ICDoc; import forge.gui.match.controllers.CDetail; import forge.gui.match.controllers.CPicture; import forge.gui.menus.IMenuProvider; import forge.gui.toolbox.FLabel; import forge.gui.toolbox.FSkin; -import forge.gui.toolbox.FSkin.SkinImage; import forge.gui.toolbox.itemmanager.ItemManager; import forge.gui.toolbox.itemmanager.SItemManagerIO; import forge.gui.toolbox.itemmanager.SItemManagerIO.EditorPreference; +import forge.gui.toolbox.itemmanager.table.ItemTable; import forge.gui.toolbox.itemmanager.table.ItemTableModel; import forge.item.InventoryItem; -import forge.view.FNavigationBar.INavigationTabData; /** * Constructs instance of deck editor UI controller, used as a single point of @@ -79,14 +80,16 @@ import forge.view.FNavigationBar.INavigationTabData; * *

(C at beginning of class name denotes a control class.) */ -public enum CDeckEditorUI implements ICDoc, IMenuProvider, INavigationTabData { +public enum CDeckEditorUI implements ICDoc, IMenuProvider { /** */ SINGLETON_INSTANCE; + private final HashMap> screenChildControllers; private ACEditorBase childController; private boolean isFindingAsYouType = false; private CDeckEditorUI() { + screenChildControllers = new HashMap>(); } /** @@ -119,17 +122,10 @@ public enum CDeckEditorUI implements ICDoc, IMenuProvider, INavigationTabData { * @param editor0   {@link forge.gui.deckeditor.controllers.ACEditorBase} */ public void setCurrentEditorController(ACEditorBase editor0) { + if (this.childController == editor0) { return; } this.childController = editor0; + screenChildControllers.put(Singletons.getControl().getCurrentScreen(), editor0); updateController(); - if (childController != null) { - boolean wantElastic = SItemManagerIO.getPref(EditorPreference.elastic_columns); - boolean wantUnique = SItemManagerIO.getPref(EditorPreference.display_unique_only); - childController.getCatalogManager().getTable().setWantElasticColumns(wantElastic); - childController.getDeckManager().getTable().setWantElasticColumns(wantElastic); - childController.getCatalogManager().setWantUnique(wantUnique); - childController.getDeckManager().setWantUnique(wantUnique); - CCardCatalog.SINGLETON_INSTANCE.applyCurrentFilter(); - } } private interface _MoveAction { @@ -302,98 +298,116 @@ public enum CDeckEditorUI implements ICDoc, IMenuProvider, INavigationTabData { } /** - * Updates listeners for current controller. + * Updates UI and listeners for current controller. */ private void updateController() { - ItemManager catView = childController.getCatalogManager(); - ItemManager deckView = childController.getDeckManager(); - final JTable catTable = catView.getTable(); - final JTable deckTable = deckView.getTable(); - final _FindAsYouType catFind = new _FindAsYouType(catView); - final _FindAsYouType deckFind = new _FindAsYouType(deckView); + if (childController == null) { return; } - catTable.addKeyListener(new KeyAdapter() { - @Override - public void keyPressed(KeyEvent e) { - if (!isFindingAsYouType && KeyEvent.VK_SPACE == e.getKeyCode()) { - addSelectedCards(e.isControlDown() || e.isMetaDown(), e.isShiftDown() ? 4: 1); - } else if (KeyEvent.VK_LEFT == e.getKeyCode() || KeyEvent.VK_RIGHT == e.getKeyCode()) { - deckTable.requestFocusInWindow(); - } else if (KeyEvent.VK_F == e.getKeyCode()) { - // let ctrl/cmd-F set focus to the text filter box - if (e.isControlDown() || e.isMetaDown()) { - VCardCatalog.SINGLETON_INSTANCE.getTxfSearch().requestFocusInWindow(); + final ItemManager catView = childController.getCatalogManager(); + final ItemManager deckView = childController.getDeckManager(); + final ItemTable catTable = catView.getTable(); + final ItemTable deckTable = deckView.getTable(); + + VCardCatalog.SINGLETON_INSTANCE.setItemManager(catView); + VCurrentDeck.SINGLETON_INSTANCE.setItemManager(deckView); + + if (!childController.listenersHooked) { //hook listeners the first time the controller is updated + catTable.addKeyListener(new KeyAdapter() { + @Override + public void keyPressed(KeyEvent e) { + if (!isFindingAsYouType && KeyEvent.VK_SPACE == e.getKeyCode()) { + addSelectedCards(e.isControlDown() || e.isMetaDown(), e.isShiftDown() ? 4: 1); + } else if (KeyEvent.VK_LEFT == e.getKeyCode() || KeyEvent.VK_RIGHT == e.getKeyCode()) { + deckTable.requestFocusInWindow(); + } else if (KeyEvent.VK_F == e.getKeyCode()) { + // let ctrl/cmd-F set focus to the text filter box + if (e.isControlDown() || e.isMetaDown()) { + VCardCatalog.SINGLETON_INSTANCE.getTxfSearch().requestFocusInWindow(); + } } } - } - }); - - deckTable.addKeyListener(new KeyAdapter() { - @Override - public void keyPressed(KeyEvent e) { - if (!isFindingAsYouType && KeyEvent.VK_SPACE == e.getKeyCode()) { - removeSelectedCards(e.isControlDown() || e.isMetaDown(), e.isShiftDown() ? 4: 1); - } else if (KeyEvent.VK_LEFT == e.getKeyCode() || KeyEvent.VK_RIGHT == e.getKeyCode()) { - catTable.requestFocusInWindow(); + }); + + deckTable.addKeyListener(new KeyAdapter() { + @Override + public void keyPressed(KeyEvent e) { + if (!isFindingAsYouType && KeyEvent.VK_SPACE == e.getKeyCode()) { + removeSelectedCards(e.isControlDown() || e.isMetaDown(), e.isShiftDown() ? 4: 1); + } else if (KeyEvent.VK_LEFT == e.getKeyCode() || KeyEvent.VK_RIGHT == e.getKeyCode()) { + catTable.requestFocusInWindow(); + } } - } - }); - - final _MoveCard onAdd = new _MoveCard() { - @Override - public void moveCard(boolean toAlternate, int qty) { - addSelectedCards(toAlternate, qty); - } - }; - final _MoveCard onRemove = new _MoveCard() { - @Override - public void moveCard(boolean toAlternate, int qty) { - removeSelectedCards(toAlternate, qty); - } - }; - - catTable.addMouseListener(new MouseAdapter() { - @Override - public void mouseClicked(MouseEvent e) { - if (MouseEvent.BUTTON1 == e.getButton() && 2 == e.getClickCount()) { addSelectedCards(false, 1); } - else if (MouseEvent.BUTTON3 == e.getButton()) { - _ContextMenuBuilder cmb = new _ContextMenuBuilder(e, catTable, deckTable, onAdd); - childController.buildAddContextMenu(cmb); - cmb.show(); + }); + + final _MoveCard onAdd = new _MoveCard() { + @Override + public void moveCard(boolean toAlternate, int qty) { + addSelectedCards(toAlternate, qty); } - } - }); - - deckTable.addMouseListener(new MouseAdapter() { - @Override - public void mouseClicked(MouseEvent e) { - if (MouseEvent.BUTTON1 == e.getButton() && 2 == e.getClickCount()) { removeSelectedCards(false, 1); } - else if (MouseEvent.BUTTON3 == e.getButton()) { - _ContextMenuBuilder cmb = new _ContextMenuBuilder(e, deckTable, catTable, onRemove); - childController.buildRemoveContextMenu(cmb); - cmb.show(); + }; + final _MoveCard onRemove = new _MoveCard() { + @Override + public void moveCard(boolean toAlternate, int qty) { + removeSelectedCards(toAlternate, qty); } - } - }); + }; + + catTable.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + if (MouseEvent.BUTTON1 == e.getButton() && 2 == e.getClickCount()) { addSelectedCards(false, 1); } + else if (MouseEvent.BUTTON3 == e.getButton()) { + _ContextMenuBuilder cmb = new _ContextMenuBuilder(e, catTable, deckTable, onAdd); + childController.buildAddContextMenu(cmb); + cmb.show(); + } + } + }); + + deckTable.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + if (MouseEvent.BUTTON1 == e.getButton() && 2 == e.getClickCount()) { removeSelectedCards(false, 1); } + else if (MouseEvent.BUTTON3 == e.getButton()) { + _ContextMenuBuilder cmb = new _ContextMenuBuilder(e, deckTable, catTable, onRemove); + childController.buildRemoveContextMenu(cmb); + cmb.show(); + } + } + }); - catTable.addFocusListener(new FocusAdapter() { - @Override - public void focusLost(FocusEvent arg0) { - catFind.cancel(); - } - }); - deckTable.addFocusListener(new FocusAdapter() { - @Override - public void focusLost(FocusEvent arg0) { - deckFind.cancel(); - } - }); - - // highlight items as the user types a portion of their names - catTable.addKeyListener(catFind); - deckTable.addKeyListener(deckFind); - - childController.init(); + final _FindAsYouType catFind = new _FindAsYouType(catView); + final _FindAsYouType deckFind = new _FindAsYouType(deckView); + + catTable.addFocusListener(new FocusAdapter() { + @Override + public void focusLost(FocusEvent arg0) { + catFind.cancel(); + } + }); + deckTable.addFocusListener(new FocusAdapter() { + @Override + public void focusLost(FocusEvent arg0) { + deckFind.cancel(); + } + }); + + // highlight items as the user types a portion of their names + catTable.addKeyListener(catFind); + deckTable.addKeyListener(deckFind); + + childController.listenersHooked = true; + } + + childController.update(); + + boolean wantElastic = SItemManagerIO.getPref(EditorPreference.elastic_columns); + boolean wantUnique = SItemManagerIO.getPref(EditorPreference.display_unique_only); + catTable.setWantElasticColumns(wantElastic); + deckTable.setWantElasticColumns(wantElastic); + catView.setWantUnique(wantUnique); + deckView.setWantUnique(wantUnique); + CCardCatalog.SINGLETON_INSTANCE.applyCurrentFilter(); } private class _FindAsYouType extends KeyAdapter { @@ -566,10 +580,16 @@ public enum CDeckEditorUI implements ICDoc, IMenuProvider, INavigationTabData { @Override public void initialize() { Singletons.getControl().getForgeMenu().setProvider(this); - if (this.childController == null) { //ensure child controller set - setCurrentEditorController(new CEditorConstructed()); + + //change to previously open child controller based on screen + FScreen screen = Singletons.getControl().getCurrentScreen(); + ACEditorBase screenChildController = screenChildControllers.get(screen); + if (screenChildController != null) { + setCurrentEditorController(screenChildController); + } + else if (screen == FScreen.DECK_EDITOR_CONSTRUCTED) { + setCurrentEditorController(new CEditorConstructed()); //ensure Constructed deck editor controller initialized } - Singletons.getView().getNavigationBar().setSelectedTab(this); } /* (non-Javadoc) @@ -577,56 +597,5 @@ public enum CDeckEditorUI implements ICDoc, IMenuProvider, INavigationTabData { */ @Override public void update() { } - - /* (non-Javadoc) - * @see forge.view.FNavigationBar.INavigationTabData#getTabCaption() - */ - @Override - public String getTabCaption() { - return "Deck Editor"; - } - - /* (non-Javadoc) - * @see forge.view.FNavigationBar.INavigationTabData#getTabIcon() - */ - @Override - public SkinImage getTabIcon() { - return FSkin.getImage(FSkin.EditorImages.IMG_PACK); - } - - /* (non-Javadoc) - * @see forge.view.FNavigationBar.INavigationTabData#getTabDestScreen() - */ - @Override - public Screens getTabDestScreen() { - return Screens.DECK_EDITOR_CONSTRUCTED; - } - - /* (non-Javadoc) - * @see forge.view.FNavigationBar.INavigationTabData#allowTabClose() - */ - @Override - public boolean allowTabClose() { - return false; - } - - /* (non-Javadoc) - * @see forge.view.FNavigationBar.INavigationTabData#canCloseTab() - */ - @Override - public String getCloseButtonTooltip() { - return "Close Editor"; - } - - /* (non-Javadoc) - * @see forge.view.FNavigationBar.INavigationTabData#onClosingTab() - */ - @Override - public boolean onClosing() { - if (canExit()) { - Singletons.getControl().changeState(Screens.HOME_SCREEN); - } - return false; //don't allow closing Deck Editor tab - } } diff --git a/src/main/java/forge/gui/deckeditor/SEditorIO.java b/src/main/java/forge/gui/deckeditor/SEditorIO.java index 611aadf7cdf..764084db694 100644 --- a/src/main/java/forge/gui/deckeditor/SEditorIO.java +++ b/src/main/java/forge/gui/deckeditor/SEditorIO.java @@ -8,6 +8,7 @@ import forge.Singletons; import forge.deck.DeckBase; import forge.gui.deckeditor.controllers.DeckController; import forge.gui.deckeditor.views.VCurrentDeck; +import forge.gui.framework.FScreen; /** * Handles editor preferences saving and loading. @@ -82,9 +83,9 @@ public class SEditorIO { * @return boolean, true if success */ @SuppressWarnings("unchecked") - public static boolean confirmSaveChanges() { + public static boolean confirmSaveChanges(FScreen screen) { if (!((DeckController) CDeckEditorUI.SINGLETON_INSTANCE.getCurrentEditorController().getDeckController()).isSaved()) { - Singletons.getView().getNavigationBar().ensureTabActive(CDeckEditorUI.SINGLETON_INSTANCE); //ensure Deck Editor is active before showing dialog + Singletons.getControl().ensureScreenActive(screen); //ensure Deck Editor is active before showing dialog final int choice = JOptionPane.showConfirmDialog(JOptionPane.getRootFrame(), "Save changes to current deck?", "Save Changes?", diff --git a/src/main/java/forge/gui/deckeditor/VDeckEditorUI.java b/src/main/java/forge/gui/deckeditor/VDeckEditorUI.java index e2837981f11..9350f5be0fb 100644 --- a/src/main/java/forge/gui/deckeditor/VDeckEditorUI.java +++ b/src/main/java/forge/gui/deckeditor/VDeckEditorUI.java @@ -2,9 +2,10 @@ package forge.gui.deckeditor; import javax.swing.SwingUtilities; +import forge.Singletons; import forge.gui.deckeditor.views.VCardCatalog; +import forge.gui.framework.FScreen; import forge.gui.framework.IVTopLevelUI; -import forge.gui.framework.SLayoutIO; /** /** @@ -32,7 +33,6 @@ public enum VDeckEditorUI implements IVTopLevelUI { */ @Override public void populate() { - SLayoutIO.loadLayout(null); SwingUtilities.invokeLater(new Runnable() { @Override public void run() { @@ -40,4 +40,25 @@ public enum VDeckEditorUI implements IVTopLevelUI { } }); } + + /* (non-Javadoc) + * @see forge.gui.framework.IVTopLevelUI#onSwitching(forge.gui.framework.FScreen) + */ + @Override + public boolean onSwitching(FScreen screen) { + return CDeckEditorUI.SINGLETON_INSTANCE.canExit(); //ensure deck saved before switching away + } + + /* (non-Javadoc) + * @see forge.gui.framework.IVTopLevelUI#onClosing() + */ + @Override + public boolean onClosing(FScreen screen) { + if (screen == FScreen.DECK_EDITOR_CONSTRUCTED) { + //don't close tab if Constructed editor, but return to home screen if this called + Singletons.getControl().setCurrentScreen(FScreen.HOME_SCREEN); + return false; + } + return CDeckEditorUI.SINGLETON_INSTANCE.canExit(); + } } diff --git a/src/main/java/forge/gui/deckeditor/controllers/ACEditorBase.java b/src/main/java/forge/gui/deckeditor/controllers/ACEditorBase.java index 37c6394edfa..1aed6e6f893 100644 --- a/src/main/java/forge/gui/deckeditor/controllers/ACEditorBase.java +++ b/src/main/java/forge/gui/deckeditor/controllers/ACEditorBase.java @@ -57,7 +57,8 @@ public abstract class ACEditorBase catalogManager; private ItemManager deckManager; @@ -97,7 +98,7 @@ public abstract class ACEditorBase void newRandomConstructed() { - if (!SEditorIO.confirmSaveChanges()) { return; } + if (!SEditorIO.confirmSaveChanges(Singletons.getControl().getCurrentScreen())) { return; } final Deck randomDeck = new Deck(); @@ -97,7 +98,7 @@ public enum CDeckgen implements ICDoc { @SuppressWarnings("unchecked") private void newGenerateConstructed(final int colorCount0) { - if (!SEditorIO.confirmSaveChanges()) { return; } + if (!SEditorIO.confirmSaveChanges(Singletons.getControl().getCurrentScreen())) { return; } final Deck genConstructed = new Deck(); diff --git a/src/main/java/forge/gui/deckeditor/controllers/CEditorCommander.java b/src/main/java/forge/gui/deckeditor/controllers/CEditorCommander.java index 27fc9c7552d..01cc771a0c9 100644 --- a/src/main/java/forge/gui/deckeditor/controllers/CEditorCommander.java +++ b/src/main/java/forge/gui/deckeditor/controllers/CEditorCommander.java @@ -37,7 +37,7 @@ import forge.gui.deckeditor.views.VCardCatalog; import forge.gui.deckeditor.views.VCurrentDeck; import forge.gui.deckeditor.views.VDeckgen; import forge.gui.framework.DragCell; -import forge.gui.framework.EDocID; +import forge.gui.framework.FScreen; import forge.gui.toolbox.FLabel; import forge.gui.toolbox.itemmanager.CardManager; import forge.gui.toolbox.itemmanager.SItemManagerIO; @@ -50,7 +50,6 @@ import forge.item.ItemPoolView; import forge.item.PaperCard; import forge.item.InventoryItem; import forge.item.ItemPool; -import forge.properties.ForgePreferences.FPref; /** * Child controller for constructed deck editor UI. @@ -89,14 +88,8 @@ public final class CEditorCommander extends ACEditorBase { boolean wantUnique = SItemManagerIO.getPref(EditorPreference.display_unique_only); - final CardManager catalogManager = new CardManager(VCardCatalog.SINGLETON_INSTANCE.getStatLabels(), wantUnique); - final CardManager deckManager = new CardManager(VCurrentDeck.SINGLETON_INSTANCE.getStatLabels(), wantUnique); - - VCardCatalog.SINGLETON_INSTANCE.setItemManager(catalogManager); - VCurrentDeck.SINGLETON_INSTANCE.setItemManager(deckManager); - - this.setCatalogManager(catalogManager); - this.setDeckManager(deckManager); + this.setCatalogManager(new CardManager(VCardCatalog.SINGLETON_INSTANCE.getStatLabels(), wantUnique)); + this.setDeckManager(new CardManager(VCurrentDeck.SINGLETON_INSTANCE.getStatLabels(), wantUnique)); final Supplier newCreator = new Supplier() { @Override @@ -187,7 +180,7 @@ public final class CEditorCommander extends ACEditorBase { * @see forge.gui.deckeditor.ACEditorBase#show(forge.Command) */ @Override - public void init() { + public void update() { final List> lstCatalogCols = SColumnUtil.getCatalogDefaultColumns(); lstCatalogCols.remove(SColumnUtil.getColumn(ColumnName.CAT_QUANTITY)); @@ -209,9 +202,9 @@ public final class CEditorCommander extends ACEditorBase { } }); deckGenParent = removeTab(VDeckgen.SINGLETON_INSTANCE); - allDecksParent = removeTab(VAllDecks.SINGLETON_INSTANCE); - - this.controller.newModel(); + allDecksParent = removeTab(VAllDecks.SINGLETON_INSTANCE); + + this.controller.refreshModel(); } /* (non-Javadoc) @@ -219,10 +212,7 @@ public final class CEditorCommander extends ACEditorBase { */ @Override public boolean exit() { - // Override the submenu save choice - tell it to go to "constructed". - Singletons.getModel().getPreferences().setPref(FPref.SUBMENU_CURRENTMENU, EDocID.HOME_COMMANDER.toString()); - - if (!SEditorIO.confirmSaveChanges()) + if (!SEditorIO.confirmSaveChanges(FScreen.DECK_EDITOR_COMMANDER)) { return false; } diff --git a/src/main/java/forge/gui/deckeditor/controllers/CEditorConstructed.java b/src/main/java/forge/gui/deckeditor/controllers/CEditorConstructed.java index 3751f5055ed..e53d3bc5d53 100644 --- a/src/main/java/forge/gui/deckeditor/controllers/CEditorConstructed.java +++ b/src/main/java/forge/gui/deckeditor/controllers/CEditorConstructed.java @@ -33,7 +33,7 @@ import forge.deck.DeckSection; import forge.gui.deckeditor.SEditorIO; import forge.gui.deckeditor.views.VCardCatalog; import forge.gui.deckeditor.views.VCurrentDeck; -import forge.gui.framework.EDocID; +import forge.gui.framework.FScreen; import forge.gui.toolbox.FLabel; import forge.gui.toolbox.itemmanager.CardManager; import forge.gui.toolbox.itemmanager.SItemManagerIO; @@ -46,7 +46,6 @@ import forge.item.PaperCard; import forge.item.InventoryItem; import forge.item.ItemPool; import forge.item.ItemPoolView; -import forge.properties.ForgePreferences.FPref; /** * Child controller for constructed deck editor UI. @@ -84,22 +83,15 @@ public final class CEditorConstructed extends ACEditorBase { allSections.add(DeckSection.Schemes); allSections.add(DeckSection.Planes); //allSections.add(DeckSection.Commander); - - + avatarPool = ItemPool.createFrom(CardDb.variants().getAllCards(Predicates.compose(CardRulesPredicates.Presets.IS_VANGUARD, PaperCard.FN_GET_RULES)),PaperCard.class); planePool = ItemPool.createFrom(CardDb.variants().getAllCards(Predicates.compose(CardRulesPredicates.Presets.IS_PLANE_OR_PHENOMENON, PaperCard.FN_GET_RULES)),PaperCard.class); schemePool = ItemPool.createFrom(CardDb.variants().getAllCards(Predicates.compose(CardRulesPredicates.Presets.IS_SCHEME, PaperCard.FN_GET_RULES)),PaperCard.class); boolean wantUnique = SItemManagerIO.getPref(EditorPreference.display_unique_only); - final CardManager catalogManager = new CardManager(VCardCatalog.SINGLETON_INSTANCE.getStatLabels(), wantUnique); - final CardManager deckManager = new CardManager(VCurrentDeck.SINGLETON_INSTANCE.getStatLabels(), wantUnique); - - VCardCatalog.SINGLETON_INSTANCE.setItemManager(catalogManager); - VCurrentDeck.SINGLETON_INSTANCE.setItemManager(deckManager); - - this.setCatalogManager(catalogManager); - this.setDeckManager(deckManager); + this.setCatalogManager(new CardManager(VCardCatalog.SINGLETON_INSTANCE.getStatLabels(), wantUnique)); + this.setDeckManager(new CardManager(VCurrentDeck.SINGLETON_INSTANCE.getStatLabels(), wantUnique)); final Supplier newCreator = new Supplier() { @Override @@ -181,7 +173,7 @@ public final class CEditorConstructed extends ACEditorBase { /* * (non-Javadoc) * - * @see forge.gui.deckeditor.ACEditorBase#updateView() + * @see forge.gui.deckeditor.ACEditorBase#resetTables() */ @Override public void resetTables() { @@ -214,67 +206,68 @@ public final class CEditorConstructed extends ACEditorBase { String title = ""; String tabtext = ""; Boolean showOptions = true; - switch(sectionMode) - { - case Main: - lstCatalogCols.remove(SColumnUtil.getColumn(ColumnName.CAT_QUANTITY)); - this.getCatalogManager().getTable().setAvailableColumns(lstCatalogCols); - this.getCatalogManager().setPool(ItemPool.createFrom(CardDb.instance().getAllCards(), PaperCard.class), true); - this.getDeckManager().setPool(this.controller.getModel().getMain()); - showOptions = true; - title = "Title: "; - tabtext = "Main Deck"; - break; - case Sideboard: - this.getCatalogManager().getTable().setAvailableColumns(lstCatalogCols); - this.getCatalogManager().setPool(this.controller.getModel().getMain()); - this.getDeckManager().setPool(this.controller.getModel().getOrCreate(DeckSection.Sideboard)); - showOptions = false; - title = "Sideboard"; - tabtext = "Card Catalog"; - break; - case Avatar: - lstCatalogCols.remove(SColumnUtil.getColumn(ColumnName.CAT_QUANTITY)); - lstCatalogCols.remove(SColumnUtil.getColumn(ColumnName.CAT_COST)); - lstCatalogCols.remove(SColumnUtil.getColumn(ColumnName.CAT_COLOR)); - lstCatalogCols.remove(SColumnUtil.getColumn(ColumnName.CAT_CMC)); - lstCatalogCols.remove(SColumnUtil.getColumn(ColumnName.CAT_POWER)); - lstCatalogCols.remove(SColumnUtil.getColumn(ColumnName.CAT_TOUGHNESS)); - this.getCatalogManager().getTable().setAvailableColumns(lstCatalogCols); - this.getCatalogManager().setPool(avatarPool, true); - this.getDeckManager().setPool(this.controller.getModel().getOrCreate(DeckSection.Avatar)); - showOptions = false; - title = "Vanguard"; - tabtext = "Card Catalog"; - break; - case Planes: - lstCatalogCols.remove(SColumnUtil.getColumn(ColumnName.CAT_QUANTITY)); - lstCatalogCols.remove(SColumnUtil.getColumn(ColumnName.CAT_COST)); - lstCatalogCols.remove(SColumnUtil.getColumn(ColumnName.CAT_CMC)); - lstCatalogCols.remove(SColumnUtil.getColumn(ColumnName.CAT_COLOR)); - lstCatalogCols.remove(SColumnUtil.getColumn(ColumnName.CAT_POWER)); - lstCatalogCols.remove(SColumnUtil.getColumn(ColumnName.CAT_TOUGHNESS)); - this.getCatalogManager().getTable().setAvailableColumns(lstCatalogCols); - this.getCatalogManager().setPool(planePool,true); - this.getDeckManager().setPool(this.controller.getModel().getOrCreate(DeckSection.Planes)); - showOptions = false; - title = "Planar"; - tabtext = "Card Catalog"; - break; - case Schemes: - lstCatalogCols.remove(SColumnUtil.getColumn(ColumnName.CAT_QUANTITY)); - lstCatalogCols.remove(SColumnUtil.getColumn(ColumnName.CAT_CMC)); - lstCatalogCols.remove(SColumnUtil.getColumn(ColumnName.CAT_COST)); - lstCatalogCols.remove(SColumnUtil.getColumn(ColumnName.CAT_COLOR)); - lstCatalogCols.remove(SColumnUtil.getColumn(ColumnName.CAT_POWER)); - lstCatalogCols.remove(SColumnUtil.getColumn(ColumnName.CAT_TOUGHNESS)); - this.getCatalogManager().getTable().setAvailableColumns(lstCatalogCols); - this.getCatalogManager().setPool(schemePool,true); - this.getDeckManager().setPool(this.controller.getModel().getOrCreate(DeckSection.Schemes)); - showOptions = false; - title = "Scheme"; - tabtext = "Card Catalog"; - break; + switch(sectionMode) { + case Main: + lstCatalogCols.remove(SColumnUtil.getColumn(ColumnName.CAT_QUANTITY)); + this.getCatalogManager().getTable().setAvailableColumns(lstCatalogCols); + this.getCatalogManager().setPool(ItemPool.createFrom(CardDb.instance().getAllCards(), PaperCard.class), true); + this.getDeckManager().setPool(this.controller.getModel().getMain()); + showOptions = true; + title = "Title: "; + tabtext = "Main Deck"; + break; + case Sideboard: + this.getCatalogManager().getTable().setAvailableColumns(lstCatalogCols); + this.getCatalogManager().setPool(this.controller.getModel().getMain()); + this.getDeckManager().setPool(this.controller.getModel().getOrCreate(DeckSection.Sideboard)); + showOptions = false; + title = "Sideboard"; + tabtext = "Card Catalog"; + break; + case Avatar: + lstCatalogCols.remove(SColumnUtil.getColumn(ColumnName.CAT_QUANTITY)); + lstCatalogCols.remove(SColumnUtil.getColumn(ColumnName.CAT_COST)); + lstCatalogCols.remove(SColumnUtil.getColumn(ColumnName.CAT_COLOR)); + lstCatalogCols.remove(SColumnUtil.getColumn(ColumnName.CAT_CMC)); + lstCatalogCols.remove(SColumnUtil.getColumn(ColumnName.CAT_POWER)); + lstCatalogCols.remove(SColumnUtil.getColumn(ColumnName.CAT_TOUGHNESS)); + this.getCatalogManager().getTable().setAvailableColumns(lstCatalogCols); + this.getCatalogManager().setPool(avatarPool, true); + this.getDeckManager().setPool(this.controller.getModel().getOrCreate(DeckSection.Avatar)); + showOptions = false; + title = "Vanguard"; + tabtext = "Card Catalog"; + break; + case Planes: + lstCatalogCols.remove(SColumnUtil.getColumn(ColumnName.CAT_QUANTITY)); + lstCatalogCols.remove(SColumnUtil.getColumn(ColumnName.CAT_COST)); + lstCatalogCols.remove(SColumnUtil.getColumn(ColumnName.CAT_CMC)); + lstCatalogCols.remove(SColumnUtil.getColumn(ColumnName.CAT_COLOR)); + lstCatalogCols.remove(SColumnUtil.getColumn(ColumnName.CAT_POWER)); + lstCatalogCols.remove(SColumnUtil.getColumn(ColumnName.CAT_TOUGHNESS)); + this.getCatalogManager().getTable().setAvailableColumns(lstCatalogCols); + this.getCatalogManager().setPool(planePool,true); + this.getDeckManager().setPool(this.controller.getModel().getOrCreate(DeckSection.Planes)); + showOptions = false; + title = "Planar"; + tabtext = "Card Catalog"; + break; + case Schemes: + lstCatalogCols.remove(SColumnUtil.getColumn(ColumnName.CAT_QUANTITY)); + lstCatalogCols.remove(SColumnUtil.getColumn(ColumnName.CAT_CMC)); + lstCatalogCols.remove(SColumnUtil.getColumn(ColumnName.CAT_COST)); + lstCatalogCols.remove(SColumnUtil.getColumn(ColumnName.CAT_COLOR)); + lstCatalogCols.remove(SColumnUtil.getColumn(ColumnName.CAT_POWER)); + lstCatalogCols.remove(SColumnUtil.getColumn(ColumnName.CAT_TOUGHNESS)); + this.getCatalogManager().getTable().setAvailableColumns(lstCatalogCols); + this.getCatalogManager().setPool(schemePool,true); + this.getDeckManager().setPool(this.controller.getModel().getOrCreate(DeckSection.Schemes)); + showOptions = false; + title = "Scheme"; + tabtext = "Card Catalog"; + break; + case Commander: + break; //do nothing for Commander here } VCardCatalog.SINGLETON_INSTANCE.getTabLabel().setText(tabtext); @@ -295,7 +288,7 @@ public final class CEditorConstructed extends ACEditorBase { */ @SuppressWarnings("serial") @Override - public void init() { + public void update() { final List> lstCatalogCols = SColumnUtil.getCatalogDefaultColumns(); lstCatalogCols.remove(SColumnUtil.getColumn(ColumnName.CAT_QUANTITY)); @@ -310,8 +303,8 @@ public final class CEditorConstructed extends ACEditorBase { public void run() { cycleEditorMode(); } }); - - this.controller.newModel(); + + this.controller.refreshModel(); } /* (non-Javadoc) @@ -319,9 +312,6 @@ public final class CEditorConstructed extends ACEditorBase { */ @Override public boolean exit() { - // Override the submenu save choice - tell it to go to "constructed". - Singletons.getModel().getPreferences().setPref(FPref.SUBMENU_CURRENTMENU, EDocID.HOME_CONSTRUCTED.toString()); - - return SEditorIO.confirmSaveChanges(); + return SEditorIO.confirmSaveChanges(FScreen.DECK_EDITOR_CONSTRUCTED); } } diff --git a/src/main/java/forge/gui/deckeditor/controllers/CEditorDraftingProcess.java b/src/main/java/forge/gui/deckeditor/controllers/CEditorDraftingProcess.java index 2a2b3196a3c..f0efe930614 100644 --- a/src/main/java/forge/gui/deckeditor/controllers/CEditorDraftingProcess.java +++ b/src/main/java/forge/gui/deckeditor/controllers/CEditorDraftingProcess.java @@ -24,7 +24,6 @@ import forge.Constant; import forge.Singletons; import forge.card.CardDb; import forge.card.CardEdition; -import forge.control.FControl; import forge.deck.CardPool; import forge.deck.Deck; import forge.deck.DeckGroup; @@ -36,6 +35,7 @@ import forge.gui.deckeditor.views.VCardCatalog; import forge.gui.deckeditor.views.VCurrentDeck; import forge.gui.deckeditor.views.VDeckgen; import forge.gui.framework.DragCell; +import forge.gui.framework.FScreen; import forge.gui.home.sanctioned.CSubmenuDraft; import forge.gui.toolbox.itemmanager.CardManager; import forge.gui.toolbox.itemmanager.table.SColumnUtil; @@ -67,9 +67,6 @@ public class CEditorDraftingProcess extends ACEditorBase { final CardManager catalogManager = new CardManager(VCardCatalog.SINGLETON_INSTANCE.getStatLabels(), false); final CardManager deckManager = new CardManager(VCurrentDeck.SINGLETON_INSTANCE.getStatLabels(), false); - VCardCatalog.SINGLETON_INSTANCE.setItemManager(catalogManager); - VCurrentDeck.SINGLETON_INSTANCE.setItemManager(deckManager); - catalogManager.setAlwaysNonUnique(true); deckManager.setAlwaysNonUnique(true); @@ -87,19 +84,6 @@ public class CEditorDraftingProcess extends ACEditorBase { this.boosterDraft = inBoosterDraft; } - /** - *

- * setup. - *

- */ - private void setup() { - this.getCatalogManager().getTable().setup(SColumnUtil.getCatalogDefaultColumns()); - this.getDeckManager().getTable().setup(SColumnUtil.getDeckDefaultColumns()); - - ccAddLabel = VCardCatalog.SINGLETON_INSTANCE.getBtnAdd().getText(); - VCardCatalog.SINGLETON_INSTANCE.getBtnAdd().setText("Choose Card"); - } - /* (non-Javadoc) * @see forge.gui.deckeditor.ACEditorBase#addCard() */ @@ -230,7 +214,7 @@ public class CEditorDraftingProcess extends ACEditorBase { Singletons.getModel().getDecks().getDraft().add(finishedDraft); } - Singletons.getControl().changeState(FControl.Screens.HOME_SCREEN); + Singletons.getControl().setCurrentScreen(FScreen.HOME_SCREEN); } //========== Overridden from ACEditorBase @@ -260,8 +244,13 @@ public class CEditorDraftingProcess extends ACEditorBase { * @see forge.gui.deckeditor.ACEditorBase#show(forge.Command) */ @Override - public void init() { - this.setup(); + public void update() { + this.getCatalogManager().getTable().setup(SColumnUtil.getCatalogDefaultColumns()); + this.getDeckManager().getTable().setup(SColumnUtil.getDeckDefaultColumns()); + + ccAddLabel = VCardCatalog.SINGLETON_INSTANCE.getBtnAdd().getText(); + VCardCatalog.SINGLETON_INSTANCE.getBtnAdd().setText("Choose Card"); + this.showChoices(this.boosterDraft.nextChoice()); this.getDeckManager().setPool((Iterable) null); diff --git a/src/main/java/forge/gui/deckeditor/controllers/CEditorLimited.java b/src/main/java/forge/gui/deckeditor/controllers/CEditorLimited.java index fb384b7495e..4fec488297d 100644 --- a/src/main/java/forge/gui/deckeditor/controllers/CEditorLimited.java +++ b/src/main/java/forge/gui/deckeditor/controllers/CEditorLimited.java @@ -28,6 +28,7 @@ import forge.gui.deckeditor.views.VCardCatalog; import forge.gui.deckeditor.views.VCurrentDeck; import forge.gui.deckeditor.views.VDeckgen; import forge.gui.framework.DragCell; +import forge.gui.framework.FScreen; import forge.gui.home.sanctioned.CSubmenuDraft; import forge.gui.home.sanctioned.CSubmenuSealed; import forge.gui.toolbox.itemmanager.CardManager; @@ -48,6 +49,7 @@ import forge.util.storage.IStorage; public final class CEditorLimited extends ACEditorBase { private final DeckController controller; + private final FScreen screen; private DragCell allDecksParent = null; private DragCell deckGenParent = null; @@ -58,13 +60,12 @@ public final class CEditorLimited extends ACEditorBase { * * @param deckMap0   {@link forge.deck.DeckGroup}<{@link forge.util.storage.IStorage}> */ - public CEditorLimited(final IStorage deckMap0) { + public CEditorLimited(final IStorage deckMap0, FScreen screen0) { + this.screen = screen0; + final CardManager catalogManager = new CardManager(VCardCatalog.SINGLETON_INSTANCE.getStatLabels(), false); final CardManager deckManager = new CardManager(VCurrentDeck.SINGLETON_INSTANCE.getStatLabels(), false); - VCardCatalog.SINGLETON_INSTANCE.setItemManager(catalogManager); - VCurrentDeck.SINGLETON_INSTANCE.setItemManager(deckManager); - catalogManager.setAlwaysNonUnique(true); deckManager.setAlwaysNonUnique(true); @@ -159,7 +160,7 @@ public final class CEditorLimited extends ACEditorBase { * @see forge.gui.deckeditor.ACEditorBase#show(forge.Command) */ @Override - public void init() { + public void update() { this.getCatalogManager().getTable().setup(SColumnUtil.getCatalogDefaultColumns()); this.getDeckManager().getTable().setup(SColumnUtil.getDeckDefaultColumns()); @@ -183,7 +184,7 @@ public final class CEditorLimited extends ACEditorBase { */ @Override public boolean exit() { - final boolean okToExit = SEditorIO.confirmSaveChanges(); + final boolean okToExit = SEditorIO.confirmSaveChanges(this.screen); if (okToExit) { CSubmenuDraft.SINGLETON_INSTANCE.update(); diff --git a/src/main/java/forge/gui/deckeditor/controllers/CEditorQuest.java b/src/main/java/forge/gui/deckeditor/controllers/CEditorQuest.java index c88848a706c..3346bdf0af5 100644 --- a/src/main/java/forge/gui/deckeditor/controllers/CEditorQuest.java +++ b/src/main/java/forge/gui/deckeditor/controllers/CEditorQuest.java @@ -36,6 +36,7 @@ import forge.gui.deckeditor.views.VCardCatalog; import forge.gui.deckeditor.views.VCurrentDeck; import forge.gui.deckeditor.views.VDeckgen; import forge.gui.framework.DragCell; +import forge.gui.framework.FScreen; import forge.gui.home.quest.CSubmenuQuestDecks; import forge.gui.toolbox.FLabel; import forge.gui.toolbox.itemmanager.CardManager; @@ -101,9 +102,6 @@ public final class CEditorQuest extends ACEditorBase { catalogManager.setAlwaysNonUnique(true); deckManager.setAlwaysNonUnique(true); - VCardCatalog.SINGLETON_INSTANCE.setItemManager(catalogManager); - VCurrentDeck.SINGLETON_INSTANCE.setItemManager(deckManager); - this.setCatalogManager(catalogManager); this.setDeckManager(deckManager); @@ -257,7 +255,7 @@ public final class CEditorQuest extends ACEditorBase { */ @SuppressWarnings("serial") @Override - public void init() { + public void update() { final List> columnsCatalog = SColumnUtil.getCatalogDefaultColumns(); final List> columnsDeck = SColumnUtil.getDeckDefaultColumns(); @@ -281,8 +279,6 @@ public final class CEditorQuest extends ACEditorBase { this.getCatalogManager().getTable().setup(columnsCatalog); this.getDeckManager().getTable().setup(columnsDeck); - Deck deck = new Deck(); - SItemManagerUtil.resetUI(); VCurrentDeck.SINGLETON_INSTANCE.getBtnSave().setVisible(true); @@ -297,7 +293,12 @@ public final class CEditorQuest extends ACEditorBase { deckGenParent = removeTab(VDeckgen.SINGLETON_INSTANCE); allDecksParent = removeTab(VAllDecks.SINGLETON_INSTANCE); - this.getDeckController().setModel(deck); + if (this.controller.getModel() == null) { + this.getDeckController().setModel(new Deck()); + } + else { + this.controller.refreshModel(); + } } /* (non-Javadoc) @@ -305,7 +306,7 @@ public final class CEditorQuest extends ACEditorBase { */ @Override public boolean exit() { - final boolean okToExit = SEditorIO.confirmSaveChanges(); + final boolean okToExit = SEditorIO.confirmSaveChanges(FScreen.DECK_EDITOR_QUEST); if (okToExit) { Singletons.getModel().getQuest().save(); CSubmenuQuestDecks.SINGLETON_INSTANCE.update(); diff --git a/src/main/java/forge/gui/deckeditor/controllers/CEditorQuestCardShop.java b/src/main/java/forge/gui/deckeditor/controllers/CEditorQuestCardShop.java index 241bf0121fe..caab7072a74 100644 --- a/src/main/java/forge/gui/deckeditor/controllers/CEditorQuestCardShop.java +++ b/src/main/java/forge/gui/deckeditor/controllers/CEditorQuestCardShop.java @@ -133,9 +133,6 @@ public final class CEditorQuestCardShop extends ACEditorBase> columnsCatalog = SColumnUtil.getCatalogDefaultColumns(); - final List> columnsDeck = SColumnUtil.getDeckDefaultColumns(); - - // Add spell shop-specific columns - columnsCatalog.add(SColumnUtil.getColumn(ColumnName.CAT_PURCHASE_PRICE)); - columnsCatalog.get(columnsCatalog.size() - 1).setSortAndDisplayFunctions( - this.fnPriceCompare, this.fnPriceGet); - - columnsCatalog.add(1, SColumnUtil.getColumn(ColumnName.CAT_OWNED)); - columnsCatalog.get(1).setSortAndDisplayFunctions( - questData.getCards().getFnOwnedCompare(), questData.getCards().getFnOwnedGet()); - - columnsDeck.add(SColumnUtil.getColumn(ColumnName.DECK_SALE_PRICE)); - columnsDeck.get(columnsDeck.size() - 1).setSortAndDisplayFunctions( - this.fnPriceCompare, this.fnPriceSellGet); - - columnsDeck.add(SColumnUtil.getColumn(ColumnName.DECK_NEW)); - columnsDeck.get(columnsDeck.size() - 1).setSortAndDisplayFunctions( - this.questData.getCards().getFnNewCompare(), this.questData.getCards().getFnNewGet()); - - columnsDeck.add(SColumnUtil.getColumn(ColumnName.DECK_DECKS)); - columnsDeck.get(columnsDeck.size() - 1).setSortAndDisplayFunctions( - this.fnDeckCompare, this.fnDeckGet); - - // don't need AI column for either table - columnsCatalog.remove(SColumnUtil.getColumn(ColumnName.CAT_AI)); - columnsDeck.remove(SColumnUtil.getColumn(ColumnName.DECK_AI)); - - // Setup with current column set - this.getCatalogManager().getTable().setup(columnsCatalog); - this.getDeckManager().getTable().setup(columnsDeck); - - SItemManagerUtil.resetUI(); - - CCTabLabel = VCardCatalog.SINGLETON_INSTANCE.getTabLabel().getText(); - VCardCatalog.SINGLETON_INSTANCE.getTabLabel().setText("Cards for sale"); - - CCAddLabel = VCardCatalog.SINGLETON_INSTANCE.getBtnAdd().getText(); - VCardCatalog.SINGLETON_INSTANCE.getBtnAdd().setText("Buy Card"); - - CDTabLabel = VCurrentDeck.SINGLETON_INSTANCE.getTabLabel().getText(); - VCurrentDeck.SINGLETON_INSTANCE.getTabLabel().setText("Your Cards"); - - CDRemLabel = VCurrentDeck.SINGLETON_INSTANCE.getBtnRemove().getText(); - VCurrentDeck.SINGLETON_INSTANCE.getBtnRemove().setText("Sell Card"); - - VProbabilities.SINGLETON_INSTANCE.getTabLabel().setVisible(false); - - prevRem4Label = VCurrentDeck.SINGLETON_INSTANCE.getBtnRemove4().getText(); - prevRem4Tooltip = VCurrentDeck.SINGLETON_INSTANCE.getBtnRemove4().getToolTipText(); - prevRem4Cmd = VCurrentDeck.SINGLETON_INSTANCE.getBtnRemove4().getCommand(); - - VCurrentDeck.SINGLETON_INSTANCE.getPnlHeader().setVisible(false); - } // fills number of decks using each card private ItemPool countDecksForEachCard() { @@ -485,8 +426,60 @@ public final class CEditorQuestCardShop extends ACEditorBase> columnsCatalog = SColumnUtil.getCatalogDefaultColumns(); + final List> columnsDeck = SColumnUtil.getDeckDefaultColumns(); + + // Add spell shop-specific columns + columnsCatalog.add(SColumnUtil.getColumn(ColumnName.CAT_PURCHASE_PRICE)); + columnsCatalog.get(columnsCatalog.size() - 1).setSortAndDisplayFunctions( + this.fnPriceCompare, this.fnPriceGet); + + columnsCatalog.add(1, SColumnUtil.getColumn(ColumnName.CAT_OWNED)); + columnsCatalog.get(1).setSortAndDisplayFunctions( + questData.getCards().getFnOwnedCompare(), questData.getCards().getFnOwnedGet()); + + columnsDeck.add(SColumnUtil.getColumn(ColumnName.DECK_SALE_PRICE)); + columnsDeck.get(columnsDeck.size() - 1).setSortAndDisplayFunctions( + this.fnPriceCompare, this.fnPriceSellGet); + + columnsDeck.add(SColumnUtil.getColumn(ColumnName.DECK_NEW)); + columnsDeck.get(columnsDeck.size() - 1).setSortAndDisplayFunctions( + this.questData.getCards().getFnNewCompare(), this.questData.getCards().getFnNewGet()); + + columnsDeck.add(SColumnUtil.getColumn(ColumnName.DECK_DECKS)); + columnsDeck.get(columnsDeck.size() - 1).setSortAndDisplayFunctions( + this.fnDeckCompare, this.fnDeckGet); + + // don't need AI column for either table + columnsCatalog.remove(SColumnUtil.getColumn(ColumnName.CAT_AI)); + columnsDeck.remove(SColumnUtil.getColumn(ColumnName.DECK_AI)); + + // Setup with current column set + this.getCatalogManager().getTable().setup(columnsCatalog); + this.getDeckManager().getTable().setup(columnsDeck); + + SItemManagerUtil.resetUI(); + + CCTabLabel = VCardCatalog.SINGLETON_INSTANCE.getTabLabel().getText(); + VCardCatalog.SINGLETON_INSTANCE.getTabLabel().setText("Cards for sale"); + + CCAddLabel = VCardCatalog.SINGLETON_INSTANCE.getBtnAdd().getText(); + VCardCatalog.SINGLETON_INSTANCE.getBtnAdd().setText("Buy Card"); + + CDTabLabel = VCurrentDeck.SINGLETON_INSTANCE.getTabLabel().getText(); + VCurrentDeck.SINGLETON_INSTANCE.getTabLabel().setText("Your Cards"); + + CDRemLabel = VCurrentDeck.SINGLETON_INSTANCE.getBtnRemove().getText(); + VCurrentDeck.SINGLETON_INSTANCE.getBtnRemove().setText("Sell Card"); + + VProbabilities.SINGLETON_INSTANCE.getTabLabel().setVisible(false); + + prevRem4Label = VCurrentDeck.SINGLETON_INSTANCE.getBtnRemove4().getText(); + prevRem4Tooltip = VCurrentDeck.SINGLETON_INSTANCE.getBtnRemove4().getToolTipText(); + prevRem4Cmd = VCurrentDeck.SINGLETON_INSTANCE.getBtnRemove4().getCommand(); + + VCurrentDeck.SINGLETON_INSTANCE.getPnlHeader().setVisible(false); this.decksUsingMyCards = this.countDecksForEachCard(); this.multiplier = this.questData.getCards().getSellMultiplier(); diff --git a/src/main/java/forge/gui/deckeditor/controllers/CEditorVariant.java b/src/main/java/forge/gui/deckeditor/controllers/CEditorVariant.java index 53f45041308..61a2237d1d7 100644 --- a/src/main/java/forge/gui/deckeditor/controllers/CEditorVariant.java +++ b/src/main/java/forge/gui/deckeditor/controllers/CEditorVariant.java @@ -23,7 +23,6 @@ import com.google.common.base.Predicate; import com.google.common.base.Supplier; import com.google.common.collect.Iterables; -import forge.Singletons; import forge.card.CardDb; import forge.deck.Deck; import forge.deck.DeckSection; @@ -33,7 +32,7 @@ import forge.gui.deckeditor.views.VCardCatalog; import forge.gui.deckeditor.views.VCurrentDeck; import forge.gui.deckeditor.views.VDeckgen; import forge.gui.framework.DragCell; -import forge.gui.framework.EDocID; +import forge.gui.framework.FScreen; import forge.gui.toolbox.itemmanager.CardManager; import forge.gui.toolbox.itemmanager.SItemManagerUtil; import forge.gui.toolbox.itemmanager.table.TableColumnInfo; @@ -42,7 +41,6 @@ import forge.gui.toolbox.itemmanager.table.SColumnUtil.ColumnName; import forge.item.PaperCard; import forge.item.InventoryItem; import forge.item.ItemPool; -import forge.properties.ForgePreferences.FPref; import forge.util.storage.IStorage; /** @@ -57,10 +55,10 @@ import forge.util.storage.IStorage; */ public final class CEditorVariant extends ACEditorBase { private final DeckController controller; + private final FScreen screen; private DragCell allDecksParent = null; private DragCell deckGenParent = null; private final Predicate cardPoolCondition; - private final EDocID exitToScreen; //=========== Constructor /** @@ -68,20 +66,14 @@ public final class CEditorVariant extends ACEditorBase { * This is the least restrictive mode; * all cards are available. */ - public CEditorVariant(final IStorage folder, final Predicate poolCondition, final EDocID exitTo) { + public CEditorVariant(final IStorage folder, final Predicate poolCondition, final FScreen screen0) { super(); - cardPoolCondition = poolCondition; - exitToScreen = exitTo; + this.cardPoolCondition = poolCondition; + this.screen = screen0; - final CardManager catalogManager = new CardManager(VCardCatalog.SINGLETON_INSTANCE.getStatLabels(), true); - final CardManager deckManager = new CardManager(VCurrentDeck.SINGLETON_INSTANCE.getStatLabels(), true); - - VCardCatalog.SINGLETON_INSTANCE.setItemManager(catalogManager); - VCurrentDeck.SINGLETON_INSTANCE.setItemManager(deckManager); - - this.setCatalogManager(catalogManager); - this.setDeckManager(deckManager); + this.setCatalogManager(new CardManager(VCardCatalog.SINGLETON_INSTANCE.getStatLabels(), true)); + this.setDeckManager(new CardManager(VCurrentDeck.SINGLETON_INSTANCE.getStatLabels(), true)); final Supplier newCreator = new Supplier() { @Override @@ -161,7 +153,7 @@ public final class CEditorVariant extends ACEditorBase { * @see forge.gui.deckeditor.ACEditorBase#show(forge.Command) */ @Override - public void init() { + public void update() { final List> lstCatalogCols = SColumnUtil.getCatalogDefaultColumns(); lstCatalogCols.remove(SColumnUtil.getColumn(ColumnName.CAT_QUANTITY)); @@ -171,9 +163,9 @@ public final class CEditorVariant extends ACEditorBase { SItemManagerUtil.resetUI(); deckGenParent = removeTab(VDeckgen.SINGLETON_INSTANCE); - allDecksParent = removeTab(VAllDecks.SINGLETON_INSTANCE); - - this.controller.newModel(); + allDecksParent = removeTab(VAllDecks.SINGLETON_INSTANCE); + + this.controller.refreshModel(); } /* (non-Javadoc) @@ -181,10 +173,7 @@ public final class CEditorVariant extends ACEditorBase { */ @Override public boolean exit() { - // Override the submenu save choice - tell it to go to "constructed". - Singletons.getModel().getPreferences().setPref(FPref.SUBMENU_CURRENTMENU, exitToScreen.toString()); - - if (!SEditorIO.confirmSaveChanges()) + if (!SEditorIO.confirmSaveChanges(this.screen)) { return false; } diff --git a/src/main/java/forge/gui/deckeditor/controllers/DeckController.java b/src/main/java/forge/gui/deckeditor/controllers/DeckController.java index 63ed17fe3b7..21781430b39 100644 --- a/src/main/java/forge/gui/deckeditor/controllers/DeckController.java +++ b/src/main/java/forge/gui/deckeditor/controllers/DeckController.java @@ -32,6 +32,11 @@ import forge.util.storage.IStorage; * * @param the generic type */ +/** + * TODO: Write javadoc for this type. + * + * @param + */ public class DeckController { private T model; @@ -291,12 +296,18 @@ public class DeckController { public boolean isModelInStore() { return this.modelInStore; } - - /* - * (non-Javadoc) - * - * @see forge.gui.deckeditor.IDeckController#newModel() + + /** + * Refresh current model or create new one if none */ + public void refreshModel() { + if (this.model == null) { + newModel(); + } + else { + setModel(this.model, this.modelInStore); + } + } /** * New model. diff --git a/src/main/java/forge/gui/framework/FScreen.java b/src/main/java/forge/gui/framework/FScreen.java new file mode 100644 index 00000000000..5002110ec02 --- /dev/null +++ b/src/main/java/forge/gui/framework/FScreen.java @@ -0,0 +1,197 @@ +package forge.gui.framework; + +import java.io.File; + +import javax.swing.JOptionPane; + +import forge.gui.bazaar.CBazaarUI; +import forge.gui.bazaar.VBazaarUI; +import forge.gui.deckeditor.CDeckEditorUI; +import forge.gui.deckeditor.VDeckEditorUI; +import forge.gui.home.CHomeUI; +import forge.gui.home.VHomeUI; +import forge.gui.match.VMatchUI; +import forge.gui.toolbox.FSkin; +import forge.gui.toolbox.FSkin.SkinImage; +import forge.properties.FileLocation; +import forge.properties.NewConstants; + +/** + * Definitions for Forge screens + * + */ +public enum FScreen { + HOME_SCREEN( + VHomeUI.SINGLETON_INSTANCE, + CHomeUI.SINGLETON_INSTANCE, + "Home", + FSkin.getIcon(FSkin.InterfaceIcons.ICO_FAVICON), + false, + "Exit Forge", + null), + MATCH_SCREEN( + VMatchUI.SINGLETON_INSTANCE, + CHomeUI.SINGLETON_INSTANCE, + "Game", + FSkin.getIcon(FSkin.DockIcons.ICO_ALPHASTRIKE), + true, + "Concede Game", + NewConstants.MATCH_LAYOUT_FILE), + DECK_EDITOR_CONSTRUCTED( + VDeckEditorUI.SINGLETON_INSTANCE, + CDeckEditorUI.SINGLETON_INSTANCE, + "Deck Editor", + FSkin.getImage(FSkin.EditorImages.IMG_PACK), + false, + "Back to Home", + NewConstants.EDITOR_LAYOUT_FILE), + DECK_EDITOR_ARCHENEMY( + VDeckEditorUI.SINGLETON_INSTANCE, + CDeckEditorUI.SINGLETON_INSTANCE, + "Scheme Deck Editor", + FSkin.getImage(FSkin.EditorImages.IMG_PACK), + true, + "Close Editor", + NewConstants.EDITOR_LAYOUT_FILE), + DECK_EDITOR_COMMANDER( + VDeckEditorUI.SINGLETON_INSTANCE, + CDeckEditorUI.SINGLETON_INSTANCE, + "Commander Deck Editor", + FSkin.getImage(FSkin.EditorImages.IMG_PACK), + true, + "Close Editor", + NewConstants.EDITOR_LAYOUT_FILE), + DECK_EDITOR_PLANECHASE( + VDeckEditorUI.SINGLETON_INSTANCE, + CDeckEditorUI.SINGLETON_INSTANCE, + "Planar Deck Editor", + FSkin.getImage(FSkin.EditorImages.IMG_PACK), + true, + "Close Editor", + NewConstants.EDITOR_LAYOUT_FILE), + DECK_EDITOR_VANGUARD( + VDeckEditorUI.SINGLETON_INSTANCE, + CDeckEditorUI.SINGLETON_INSTANCE, + "Vanguard Deck Editor", + FSkin.getImage(FSkin.EditorImages.IMG_PACK), + true, + "Close Editor", + NewConstants.EDITOR_LAYOUT_FILE), + DECK_EDITOR_DRAFT( + VDeckEditorUI.SINGLETON_INSTANCE, + CDeckEditorUI.SINGLETON_INSTANCE, + "Draft Deck Editor", + FSkin.getImage(FSkin.EditorImages.IMG_PACK), + true, + "Close Editor", + NewConstants.EDITOR_LAYOUT_FILE), + DECK_EDITOR_SEALED( + VDeckEditorUI.SINGLETON_INSTANCE, + CDeckEditorUI.SINGLETON_INSTANCE, + "Sealed Deck Editor", + FSkin.getImage(FSkin.EditorImages.IMG_PACK), + true, + "Close Editor", + NewConstants.EDITOR_LAYOUT_FILE), + DECK_EDITOR_QUEST( + VDeckEditorUI.SINGLETON_INSTANCE, + CDeckEditorUI.SINGLETON_INSTANCE, + "Quest Deck Editor", + FSkin.getImage(FSkin.EditorImages.IMG_PACK), + true, + "Close Editor", + NewConstants.EDITOR_LAYOUT_FILE), + QUEST_CARD_SHOP( + VDeckEditorUI.SINGLETON_INSTANCE, + CDeckEditorUI.SINGLETON_INSTANCE, + "Spell Shop", + FSkin.getIcon(FSkin.QuestIcons.ICO_BOOK), + true, + "Leave Shop", + NewConstants.EDITOR_LAYOUT_FILE), + DRAFTING_PROCESS( + VDeckEditorUI.SINGLETON_INSTANCE, + CDeckEditorUI.SINGLETON_INSTANCE, + "Draft", + FSkin.getImage(FSkin.ZoneImages.ICO_HAND), + true, + "Leave Draft", + NewConstants.EDITOR_LAYOUT_FILE), + QUEST_BAZAAR( + VBazaarUI.SINGLETON_INSTANCE, + CBazaarUI.SINGLETON_INSTANCE, + "Bazaar", + FSkin.getIcon(FSkin.QuestIcons.ICO_BOTTLES), + true, + "Leave Bazaar", + null); + + private final IVTopLevelUI view; + private final ICDoc controller; + private final String tabCaption; + private final SkinImage tabIcon; + private final boolean allowTabClose; + private final String closeButtonTooltip; + private final FileLocation layoutFile; + + private FScreen(IVTopLevelUI view0, ICDoc controller0, String tabCaption0, SkinImage tabIcon0, boolean allowTabClose0, String closeButtonTooltip0, FileLocation layoutFile0) { + this.view = view0; + this.controller = controller0; + this.tabCaption = tabCaption0; + this.tabIcon = tabIcon0; + this.allowTabClose = allowTabClose0; + this.closeButtonTooltip = closeButtonTooltip0; + this.layoutFile = layoutFile0; + } + + public IVTopLevelUI getView() { + return view; + } + + public ICDoc getController() { + return controller; + } + + public String getTabCaption() { + return tabCaption; + } + + public SkinImage getTabIcon() { + return tabIcon; + } + + public boolean allowTabClose() { + return allowTabClose; + } + + public String getCloseButtonTooltip() { + return closeButtonTooltip; + } + + public boolean onSwitching() { + return view.onSwitching(this); + } + + public boolean onClosing() { + return view.onClosing(this); + } + + public FileLocation getLayoutFile() { + return layoutFile; + } + + public boolean deleteLayoutFile() { + if (layoutFile == null) { return false; } + + try { + File file = new File(layoutFile.userPrefLoc); + file.delete(); + return true; + } + catch (final Exception e) { + e.printStackTrace(); + JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), "Failed to delete layout file."); + } + return false; + } +} diff --git a/src/main/java/forge/gui/framework/IVTopLevelUI.java b/src/main/java/forge/gui/framework/IVTopLevelUI.java index 076750cd2f3..9bde2e757c6 100644 --- a/src/main/java/forge/gui/framework/IVTopLevelUI.java +++ b/src/main/java/forge/gui/framework/IVTopLevelUI.java @@ -1,5 +1,7 @@ package forge.gui.framework; +import forge.gui.framework.FScreen; + /** * This interface provides a unifying type for all top-level * UI components. @@ -24,4 +26,16 @@ public interface IVTopLevelUI { * a completely fresh layout on the component. */ void populate(); + + /** + * Fires when this view's tab is being switched away from. + * + * @return true to allow switching away from tab, false otherwise */ + boolean onSwitching(FScreen screen); + + /** + * Fires when this view's tab is closing. + * + * @return true to allow closing tab, false otherwise */ + boolean onClosing(FScreen screen); } diff --git a/src/main/java/forge/gui/framework/SLayoutIO.java b/src/main/java/forge/gui/framework/SLayoutIO.java index 3b027571d4d..21a41c27866 100644 --- a/src/main/java/forge/gui/framework/SLayoutIO.java +++ b/src/main/java/forge/gui/framework/SLayoutIO.java @@ -28,7 +28,6 @@ import javax.xml.stream.events.XMLEvent; import forge.FThreads; import forge.Singletons; -import forge.control.FControl.Screens; import forge.gui.toolbox.FAbsolutePositioner; import forge.properties.FileLocation; import forge.properties.NewConstants; @@ -222,14 +221,6 @@ public final class SLayoutIO { } } - /** - * Gets preferred layout file corresponding to current state of UI. - * @return {@link java.lang.String} - */ - public static String getFilePreferred(Screens mode) { - return SLayoutIO.getFileForState(mode).userPrefLoc; - } - private final static AtomicBoolean saveRequested = new AtomicBoolean(false); /** Publicly-accessible save method, to neatly handle exception handling. @@ -251,10 +242,10 @@ public final class SLayoutIO { private synchronized static void save(final File f0) { final String fWriteTo; - FileLocation file = SLayoutIO.getFileForState(Singletons.getControl().getState()); + FileLocation file = Singletons.getControl().getCurrentScreen().getLayoutFile(); if (f0 == null) { - if (null == file) { + if (file == null) { return; } fWriteTo = file.userPrefLoc; @@ -318,83 +309,89 @@ public final class SLayoutIO { public static void loadLayout(final File f) { final FView view = FView.SINGLETON_INSTANCE; - final XMLInputFactory inputFactory = XMLInputFactory.newInstance(); - FileLocation file = SLayoutIO.getFileForState(Singletons.getControl().getState()); - FAbsolutePositioner.SINGLETON_INSTANCE.hideAll(); view.getPnlInsets().removeAll(); view.getPnlInsets().setLayout(new BorderLayout()); view.getPnlInsets().add(view.getPnlContent(), BorderLayout.CENTER); view.getPnlInsets().setBorder(new EmptyBorder(SLayoutConstants.BORDER_T, SLayoutConstants.BORDER_T, 0, 0)); - view.removeAllDragCells(); - - // Read a model for new layout - MapOfLists model = null; - - boolean usedCustomPrefsFile = false; - - FileInputStream fis = null; - try { - if (f != null && f.exists()) - fis = new FileInputStream(f); - else { - File userSetting = new File(file.userPrefLoc); - if ( userSetting.exists() ) { - usedCustomPrefsFile = true; - fis = new FileInputStream(userSetting); - } else { - fis = new FileInputStream(file.defaultLoc); - } - } - - XMLEventReader xer = null; + FileLocation file = Singletons.getControl().getCurrentScreen().getLayoutFile(); + if (file != null) { + // Read a model for new layout + MapOfLists model = null; + boolean usedCustomPrefsFile = false; + FileInputStream fis = null; + try { - xer = inputFactory.createXMLEventReader(fis); - model = readLayout(xer); - } catch (final Exception e) { // I don't care what happened inside, the layout is wrong - try { - if ( xer != null ) xer.close(); - } catch (final XMLStreamException x) { - e.printStackTrace(); + if (f != null && f.exists()) { + fis = new FileInputStream(f); } - e.printStackTrace(); - if ( usedCustomPrefsFile ) // the one we can safely delete - throw new InvalidLayoutFileException(); - else - throw new RuntimeException(e); + else { + File userSetting = new File(file.userPrefLoc); + if (userSetting.exists()) { + usedCustomPrefsFile = true; + fis = new FileInputStream(userSetting); + } + else { + fis = new FileInputStream(file.defaultLoc); + } + } + + final XMLInputFactory inputFactory = XMLInputFactory.newInstance(); + XMLEventReader xer = null; + try { + xer = inputFactory.createXMLEventReader(fis); + model = readLayout(xer); + } catch (final Exception e) { // I don't care what happened inside, the layout is wrong + try { + if (xer != null) { xer.close(); } + } + catch (final XMLStreamException x) { + x.printStackTrace(); + } + e.printStackTrace(); + if (usedCustomPrefsFile) { // the one we can safely delete + throw new InvalidLayoutFileException(); + } + else { + throw new RuntimeException(e); + } + } + } - - } catch (FileNotFoundException e) { - throw new RuntimeException(e); - } finally { - if ( fis != null ) - try { - fis.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - - - // Apply new layout - for(Entry> kv : model.entrySet()) { - LayoutInfo layoutInfo = kv.getKey(); - DragCell cell = new DragCell(); - cell.setRoughBounds(layoutInfo.getBounds()); - FView.SINGLETON_INSTANCE.addDragCell(cell); - for(EDocID edoc : kv.getValue()) { - try { - //System.out.println(String.format("adding doc %s -> %s", edoc, edoc.getDoc())); - cell.addDoc(edoc.getDoc()); - } - catch (IllegalArgumentException e) { - System.err.println("Failed to get doc for " + edoc); + catch (FileNotFoundException e) { + throw new RuntimeException(e); + } + finally { + if (fis != null) { + try { + fis.close(); + } + catch (IOException e) { + e.printStackTrace(); + } } } - if (layoutInfo.getSelectedId() != null) { - cell.setSelected(layoutInfo.getSelectedId().getDoc()); + + // Apply new layout + for (Entry> kv : model.entrySet()) { + LayoutInfo layoutInfo = kv.getKey(); + DragCell cell = new DragCell(); + cell.setRoughBounds(layoutInfo.getBounds()); + FView.SINGLETON_INSTANCE.addDragCell(cell); + for(EDocID edoc : kv.getValue()) { + try { + //System.out.println(String.format("adding doc %s -> %s", edoc, edoc.getDoc())); + cell.addDoc(edoc.getDoc()); + } + catch (IllegalArgumentException e) { + System.err.println("Failed to get doc for " + edoc); + } + } + if (layoutInfo.getSelectedId() != null) { + cell.setSelected(layoutInfo.getSelectedId().getDoc()); + } } } @@ -470,33 +467,5 @@ public final class SLayoutIO { writer0.add(EF.createEndElement("", "", propertyName)); writer0.add(NEWLINE); } - - /** - * Updates preferred / default layout addresses particular to each UI state. - * Always called before a load or a save, to ensure file addresses are correct. - * @return - */ - private static FileLocation getFileForState(Screens state) { - switch(state) { - case HOME_SCREEN: - return NewConstants.HOME_LAYOUT_FILE; - - case MATCH_SCREEN: - return NewConstants.MATCH_LAYOUT_FILE; - - case DECK_EDITOR_CONSTRUCTED: - case DECK_EDITOR_LIMITED: - case DECK_EDITOR_QUEST: - case DRAFTING_PROCESS: - case QUEST_CARD_SHOP: - return NewConstants.EDITOR_LAYOUT_FILE; - - case QUEST_BAZAAR: - return null; - - default: - throw new IllegalStateException("Layout load failed; UI state unknown."); - } - } } \ No newline at end of file diff --git a/src/main/java/forge/gui/home/CHomeUI.java b/src/main/java/forge/gui/home/CHomeUI.java index b7a0a5dd646..0cfb6eaed13 100644 --- a/src/main/java/forge/gui/home/CHomeUI.java +++ b/src/main/java/forge/gui/home/CHomeUI.java @@ -6,21 +6,17 @@ import javax.swing.JMenu; import forge.Command; import forge.Singletons; -import forge.control.FControl.Screens; import forge.gui.FNetOverlay; import forge.gui.framework.EDocID; import forge.gui.framework.ICDoc; import forge.gui.home.sanctioned.VSubmenuConstructed; import forge.gui.menus.IMenuProvider; import forge.gui.menus.MenuUtil; -import forge.gui.toolbox.FSkin; -import forge.gui.toolbox.FSkin.SkinImage; import forge.net.FServer; import forge.net.NetServer; import forge.properties.ForgePreferences; import forge.properties.ForgePreferences.FPref; import forge.properties.NewConstants; -import forge.view.FNavigationBar.INavigationTabData; /** * Assembles Swing components of exit submenu option singleton. @@ -28,7 +24,7 @@ import forge.view.FNavigationBar.INavigationTabData; *

(V at beginning of class name denotes a view class.) * */ -public enum CHomeUI implements ICDoc, IMenuProvider, INavigationTabData { +public enum CHomeUI implements ICDoc, IMenuProvider { /** */ SINGLETON_INSTANCE; @@ -106,8 +102,6 @@ public enum CHomeUI implements ICDoc, IMenuProvider, INavigationTabData { FNetOverlay.SINGLETON_INSTANCE.getPanel().setVisible(false); } }); - - Singletons.getView().getNavigationBar().setSelectedTab(this); } /* (non-Javadoc) @@ -152,53 +146,4 @@ public enum CHomeUI implements ICDoc, IMenuProvider, INavigationTabData { // No specific menus associated with Home screen. return null; } - - /* (non-Javadoc) - * @see forge.view.FNavigationBar.INavigationTabData#getTabCaption() - */ - @Override - public String getTabCaption() { - return "Home"; - } - - /* (non-Javadoc) - * @see forge.view.FNavigationBar.INavigationTabData#getTabIcon() - */ - @Override - public SkinImage getTabIcon() { - return FSkin.getIcon(FSkin.InterfaceIcons.ICO_FAVICON); - } - - /* (non-Javadoc) - * @see forge.view.FNavigationBar.INavigationTabData#getTabDestScreen() - */ - @Override - public Screens getTabDestScreen() { - return Screens.HOME_SCREEN; - } - - /* (non-Javadoc) - * @see forge.view.FNavigationBar.INavigationTabData#allowTabClose() - */ - @Override - public boolean allowTabClose() { - return false; - } - - /* (non-Javadoc) - * @see forge.view.FNavigationBar.INavigationTabData#getTabCloseButtonTooltip() - */ - @Override - public String getCloseButtonTooltip() { - return "Exit Forge"; - } - - /* (non-Javadoc) - * @see forge.view.FNavigationBar.INavigationTabData#onClosingTab() - */ - @Override - public boolean onClosing() { - Singletons.getControl().exitForge(); - return false; //don't allow closing Home tab - } } diff --git a/src/main/java/forge/gui/home/VHomeUI.java b/src/main/java/forge/gui/home/VHomeUI.java index b5c0164e01d..d4d87aff38e 100644 --- a/src/main/java/forge/gui/home/VHomeUI.java +++ b/src/main/java/forge/gui/home/VHomeUI.java @@ -35,6 +35,7 @@ import javax.swing.SwingConstants; import net.miginfocom.swing.MigLayout; import forge.Singletons; import forge.gui.framework.EDocID; +import forge.gui.framework.FScreen; import forge.gui.framework.ICDoc; import forge.gui.framework.ILocalRepaint; import forge.gui.framework.IVTopLevelUI; @@ -320,4 +321,21 @@ public enum VHomeUI implements IVTopLevelUI { g2d.dispose(); } } + + /* (non-Javadoc) + * @see forge.gui.framework.IVTopLevelUI#onSwitching(forge.gui.framework.FScreen) + */ + @Override + public boolean onSwitching(FScreen screen) { + return true; + } + + /* (non-Javadoc) + * @see forge.gui.framework.IVTopLevelUI#onClosing(forge.control.FControl.Screens) + */ + @Override + public boolean onClosing(FScreen screen) { + Singletons.getControl().exitForge(); + return false; //don't allow closing Home tab + } } diff --git a/src/main/java/forge/gui/home/quest/CSubmenuQuestDecks.java b/src/main/java/forge/gui/home/quest/CSubmenuQuestDecks.java index 6cf0f6f3150..460653b0467 100644 --- a/src/main/java/forge/gui/home/quest/CSubmenuQuestDecks.java +++ b/src/main/java/forge/gui/home/quest/CSubmenuQuestDecks.java @@ -6,11 +6,11 @@ import javax.swing.SwingUtilities; import forge.Command; import forge.Singletons; -import forge.control.FControl; import forge.deck.Deck; import forge.gui.deckeditor.CDeckEditorUI; import forge.gui.deckeditor.controllers.CEditorQuest; import forge.gui.framework.EDocID; +import forge.gui.framework.FScreen; import forge.gui.framework.ICDoc; import forge.gui.home.CHomeUI; import forge.quest.QuestController; @@ -51,7 +51,7 @@ public enum CSubmenuQuestDecks implements ICDoc { if (!SSubmenuQuestUtil.checkActiveQuest("Create a Deck.")) { return; } - Singletons.getControl().changeStateAutoFixLayout(FControl.Screens.DECK_EDITOR_QUEST, "deck editor"); + Singletons.getControl().setCurrentScreen(FScreen.DECK_EDITOR_QUEST); CDeckEditorUI.SINGLETON_INSTANCE.setCurrentEditorController(new CEditorQuest(Singletons.getModel().getQuest())); } }); diff --git a/src/main/java/forge/gui/home/quest/SSubmenuQuestUtil.java b/src/main/java/forge/gui/home/quest/SSubmenuQuestUtil.java index 9e6866cbc66..88de4c3272e 100644 --- a/src/main/java/forge/gui/home/quest/SSubmenuQuestUtil.java +++ b/src/main/java/forge/gui/home/quest/SSubmenuQuestUtil.java @@ -10,10 +10,10 @@ import javax.swing.SwingUtilities; import javax.swing.SwingWorker; import org.apache.commons.lang3.tuple.ImmutablePair; + import forge.FThreads; import forge.Singletons; import forge.card.CardEdition; -import forge.control.FControl; import forge.deck.Deck; import forge.game.GameType; import forge.game.Match; @@ -23,6 +23,7 @@ import forge.gui.GuiChoose; import forge.gui.SOverlayUtils; import forge.gui.deckeditor.CDeckEditorUI; import forge.gui.deckeditor.controllers.CEditorQuestCardShop; +import forge.gui.framework.FScreen; import forge.gui.toolbox.FSkin; import forge.net.FServer; import forge.net.Lobby; @@ -252,7 +253,7 @@ public class SSubmenuQuestUtil { if (!checkActiveQuest("Visit the Spell Shop.")) { return; } - Singletons.getControl().changeState(FControl.Screens.DECK_EDITOR_QUEST); + Singletons.getControl().setCurrentScreen(FScreen.QUEST_CARD_SHOP); CDeckEditorUI.SINGLETON_INSTANCE.setCurrentEditorController( new CEditorQuestCardShop(Singletons.getModel().getQuest())); } @@ -262,7 +263,7 @@ public class SSubmenuQuestUtil { if (!checkActiveQuest("Visit the Bazaar.")) { return; } - Singletons.getControl().changeState(FControl.Screens.QUEST_BAZAAR); + Singletons.getControl().setCurrentScreen(FScreen.QUEST_BAZAAR); Singletons.getView().getFrame().validate(); } diff --git a/src/main/java/forge/gui/home/sanctioned/CSubmenuDraft.java b/src/main/java/forge/gui/home/sanctioned/CSubmenuDraft.java index e6aea304604..5d9765c5e80 100644 --- a/src/main/java/forge/gui/home/sanctioned/CSubmenuDraft.java +++ b/src/main/java/forge/gui/home/sanctioned/CSubmenuDraft.java @@ -12,7 +12,6 @@ import javax.swing.SwingUtilities; import forge.Command; import forge.FThreads; import forge.Singletons; -import forge.control.FControl; import forge.deck.Deck; import forge.deck.DeckGroup; import forge.game.GameType; @@ -24,6 +23,7 @@ import forge.gui.GuiChoose; import forge.gui.SOverlayUtils; import forge.gui.deckeditor.CDeckEditorUI; import forge.gui.deckeditor.controllers.CEditorDraftingProcess; +import forge.gui.framework.FScreen; import forge.gui.framework.ICDoc; import forge.net.FServer; import forge.net.Lobby; @@ -159,7 +159,7 @@ public enum CSubmenuDraft implements ICDoc { final CEditorDraftingProcess draft = new CEditorDraftingProcess(); draft.showGui(new BoosterDraft(o)); - Singletons.getControl().changeState(FControl.Screens.DRAFTING_PROCESS); + Singletons.getControl().setCurrentScreen(FScreen.DRAFTING_PROCESS); CDeckEditorUI.SINGLETON_INSTANCE.setCurrentEditorController(draft); } diff --git a/src/main/java/forge/gui/home/sanctioned/CSubmenuSealed.java b/src/main/java/forge/gui/home/sanctioned/CSubmenuSealed.java index 0faa124d4ab..c2f121d7d12 100644 --- a/src/main/java/forge/gui/home/sanctioned/CSubmenuSealed.java +++ b/src/main/java/forge/gui/home/sanctioned/CSubmenuSealed.java @@ -17,7 +17,6 @@ import org.apache.commons.lang3.StringUtils; import forge.Command; import forge.Constant; import forge.Singletons; -import forge.control.FControl; import forge.deck.Deck; import forge.deck.DeckBase; import forge.deck.DeckGroup; @@ -31,6 +30,7 @@ import forge.gui.GuiChoose; import forge.gui.deckeditor.CDeckEditorUI; import forge.gui.deckeditor.controllers.ACEditorBase; import forge.gui.deckeditor.controllers.CEditorLimited; +import forge.gui.framework.FScreen; import forge.gui.framework.ICDoc; import forge.item.PaperCard; import forge.item.InventoryItem; @@ -205,9 +205,9 @@ public enum CSubmenuSealed implements ICDoc { Singletons.getModel().getDecks().getSealed().add(sealed); final ACEditorBase editor = (ACEditorBase) new CEditorLimited( - Singletons.getModel().getDecks().getSealed()); + Singletons.getModel().getDecks().getSealed(), FScreen.DECK_EDITOR_SEALED); - Singletons.getControl().changeStateAutoFixLayout(FControl.Screens.DECK_EDITOR_LIMITED, "deck editor"); + Singletons.getControl().setCurrentScreen(FScreen.DECK_EDITOR_SEALED); CDeckEditorUI.SINGLETON_INSTANCE.setCurrentEditorController(editor); editor.getDeckController().setModel((T) sealed); } diff --git a/src/main/java/forge/gui/home/settings/CSubmenuPreferences.java b/src/main/java/forge/gui/home/settings/CSubmenuPreferences.java index 60724b3e115..07a31b6316d 100644 --- a/src/main/java/forge/gui/home/settings/CSubmenuPreferences.java +++ b/src/main/java/forge/gui/home/settings/CSubmenuPreferences.java @@ -2,7 +2,6 @@ package forge.gui.home.settings; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; -import java.io.File; import java.util.ArrayList; import java.util.List; @@ -19,11 +18,10 @@ import forge.Constant.Preferences; import forge.GameLogEntryType; import forge.Singletons; import forge.control.FControl.CloseAction; -import forge.control.FControl.Screens; import forge.control.RestartUtil; import forge.game.ai.AiProfileUtil; +import forge.gui.framework.FScreen; import forge.gui.framework.ICDoc; -import forge.gui.framework.SLayoutIO; import forge.gui.toolbox.FComboBoxPanel; import forge.gui.toolbox.FLabel; import forge.properties.ForgePreferences; @@ -174,8 +172,9 @@ public enum CSubmenuPreferences implements ICDoc { "Reset layout?"; int reply = JOptionPane.showConfirmDialog(JOptionPane.getRootFrame(), userPrompt, "Reset Deck Editor Layout", JOptionPane.YES_NO_OPTION); if (reply == JOptionPane.YES_OPTION) { - deleteScreenLayoutFile(Screens.DECK_EDITOR_CONSTRUCTED); - JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), "Deck Editor layout has been reset."); + if (FScreen.DECK_EDITOR_CONSTRUCTED.deleteLayoutFile()) { + JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), "Deck Editor layout has been reset."); + } } } @@ -187,17 +186,12 @@ public enum CSubmenuPreferences implements ICDoc { "Reset layout?"; int reply = JOptionPane.showConfirmDialog(JOptionPane.getRootFrame(), userPrompt, "Reset Match Screen Layout", JOptionPane.YES_NO_OPTION); if (reply == JOptionPane.YES_OPTION) { - deleteScreenLayoutFile(Screens.MATCH_SCREEN); - JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), "Match Screen layout has been reset."); + if (FScreen.MATCH_SCREEN.deleteLayoutFile()) { + JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), "Match Screen layout has been reset."); + } } } - private void deleteScreenLayoutFile(Screens screen) { - String fd = SLayoutIO.getFilePreferred(screen); - File f = new File(fd); - f.delete(); - } - private void initializeGameLogVerbosityComboBox() { FPref userSetting = FPref.DEV_LOG_ENTRY_TYPE; FComboBoxPanel panel = this.view.getGameLogVerbosityComboBoxPanel(); diff --git a/src/main/java/forge/gui/home/variant/CSubmenuArchenemy.java b/src/main/java/forge/gui/home/variant/CSubmenuArchenemy.java index 9414ac14abf..8c0901c6381 100644 --- a/src/main/java/forge/gui/home/variant/CSubmenuArchenemy.java +++ b/src/main/java/forge/gui/home/variant/CSubmenuArchenemy.java @@ -13,7 +13,6 @@ import com.google.common.base.Predicate; import forge.Command; import forge.FThreads; import forge.Singletons; -import forge.control.FControl; import forge.deck.Deck; import forge.deck.DeckSection; import forge.deck.DeckgenUtil; @@ -25,7 +24,7 @@ import forge.gui.SOverlayUtils; import forge.gui.deckchooser.FDeckChooser; import forge.gui.deckeditor.CDeckEditorUI; import forge.gui.deckeditor.controllers.CEditorVariant; -import forge.gui.framework.EDocID; +import forge.gui.framework.FScreen; import forge.gui.framework.ICDoc; import forge.gui.toolbox.FList; import forge.item.PaperCard; @@ -100,9 +99,9 @@ public enum CSubmenuArchenemy implements ICDoc { } }; - Singletons.getControl().changeStateAutoFixLayout(FControl.Screens.DECK_EDITOR_CONSTRUCTED, "deck editor"); + Singletons.getControl().setCurrentScreen(FScreen.DECK_EDITOR_ARCHENEMY); CDeckEditorUI.SINGLETON_INSTANCE.setCurrentEditorController( - new CEditorVariant(Singletons.getModel().getDecks().getScheme(),predSchemes,EDocID.HOME_ARCHENEMY)); + new CEditorVariant(Singletons.getModel().getDecks().getScheme(), predSchemes, FScreen.DECK_EDITOR_ARCHENEMY)); } }); diff --git a/src/main/java/forge/gui/home/variant/CSubmenuCommander.java b/src/main/java/forge/gui/home/variant/CSubmenuCommander.java index c3b211378d6..a8194c52a11 100644 --- a/src/main/java/forge/gui/home/variant/CSubmenuCommander.java +++ b/src/main/java/forge/gui/home/variant/CSubmenuCommander.java @@ -13,7 +13,6 @@ import javax.swing.SwingUtilities; import forge.Command; import forge.FThreads; import forge.Singletons; -import forge.control.FControl; import forge.deck.Deck; import forge.game.GameType; import forge.game.Match; @@ -23,6 +22,7 @@ import forge.gui.GuiDialog; import forge.gui.SOverlayUtils; import forge.gui.deckeditor.CDeckEditorUI; import forge.gui.deckeditor.controllers.CEditorCommander; +import forge.gui.framework.FScreen; import forge.gui.framework.ICDoc; import forge.gui.toolbox.FList; import forge.net.FServer; @@ -94,7 +94,7 @@ public enum CSubmenuCommander implements ICDoc { @Override public void run() { - Singletons.getControl().changeStateAutoFixLayout(FControl.Screens.DECK_EDITOR_CONSTRUCTED, "deck editor"); + Singletons.getControl().setCurrentScreen(FScreen.DECK_EDITOR_COMMANDER); CDeckEditorUI.SINGLETON_INSTANCE.setCurrentEditorController( new CEditorCommander()); } diff --git a/src/main/java/forge/gui/home/variant/CSubmenuPlanechase.java b/src/main/java/forge/gui/home/variant/CSubmenuPlanechase.java index e1a8e5f27cd..2dbebdef4a6 100644 --- a/src/main/java/forge/gui/home/variant/CSubmenuPlanechase.java +++ b/src/main/java/forge/gui/home/variant/CSubmenuPlanechase.java @@ -13,7 +13,6 @@ import com.google.common.base.Predicate; import forge.Command; import forge.FThreads; import forge.Singletons; -import forge.control.FControl; import forge.deck.Deck; import forge.deck.DeckSection; import forge.deck.DeckgenUtil; @@ -26,7 +25,7 @@ import forge.gui.SOverlayUtils; import forge.gui.deckchooser.FDeckChooser; import forge.gui.deckeditor.CDeckEditorUI; import forge.gui.deckeditor.controllers.CEditorVariant; -import forge.gui.framework.EDocID; +import forge.gui.framework.FScreen; import forge.gui.framework.ICDoc; import forge.gui.toolbox.FList; import forge.item.PaperCard; @@ -101,9 +100,9 @@ public enum CSubmenuPlanechase implements ICDoc { } }; - Singletons.getControl().changeStateAutoFixLayout(FControl.Screens.DECK_EDITOR_CONSTRUCTED, "deck editor"); + Singletons.getControl().setCurrentScreen(FScreen.DECK_EDITOR_PLANECHASE); CDeckEditorUI.SINGLETON_INSTANCE.setCurrentEditorController( - new CEditorVariant(Singletons.getModel().getDecks().getPlane(), predPlanes, EDocID.HOME_PLANECHASE)); + new CEditorVariant(Singletons.getModel().getDecks().getPlane(), predPlanes, FScreen.DECK_EDITOR_PLANECHASE)); } }); diff --git a/src/main/java/forge/gui/match/ControlWinLose.java b/src/main/java/forge/gui/match/ControlWinLose.java index 49ec7456792..b24fdab8669 100644 --- a/src/main/java/forge/gui/match/ControlWinLose.java +++ b/src/main/java/forge/gui/match/ControlWinLose.java @@ -10,7 +10,6 @@ import javax.swing.JButton; import forge.Card; import forge.Singletons; import forge.card.CardDb; -import forge.control.FControl; import forge.deck.Deck; import forge.game.Game; import forge.game.GameOutcome; @@ -21,6 +20,7 @@ import forge.game.player.Player; import forge.game.zone.ZoneType; import forge.gui.GuiChoose; import forge.gui.SOverlayUtils; +import forge.gui.framework.FScreen; import forge.item.PaperCard; import forge.net.FServer; import forge.properties.ForgePreferences.FPref; @@ -98,7 +98,7 @@ public class ControlWinLose { // Reset other stuff saveOptions(); Singletons.getControl().endCurrentGame(); - Singletons.getControl().changeState(FControl.Screens.HOME_SCREEN); + Singletons.getControl().setCurrentScreen(FScreen.HOME_SCREEN); SOverlayUtils.hideOverlay(); } diff --git a/src/main/java/forge/gui/match/QuestWinLose.java b/src/main/java/forge/gui/match/QuestWinLose.java index 5d24f6caf43..92e20198ded 100644 --- a/src/main/java/forge/gui/match/QuestWinLose.java +++ b/src/main/java/forge/gui/match/QuestWinLose.java @@ -37,7 +37,6 @@ import forge.card.CardEdition; import forge.card.IUnOpenedProduct; import forge.card.SealedProductTemplate; import forge.card.UnOpenedProduct; -import forge.control.FControl; import forge.game.Game; import forge.game.GameEndReason; import forge.game.GameFormat; @@ -50,6 +49,7 @@ import forge.game.player.PlayerStatistics; import forge.game.zone.ZoneType; import forge.gui.GuiChoose; import forge.gui.SOverlayUtils; +import forge.gui.framework.FScreen; import forge.gui.home.quest.CSubmenuChallenges; import forge.gui.home.quest.CSubmenuDuels; import forge.gui.toolbox.FSkin; @@ -300,7 +300,7 @@ public class QuestWinLose extends ControlWinLose { Singletons.getModel().getPreferences().save(); Singletons.getControl().endCurrentGame(); - Singletons.getControl().changeState(FControl.Screens.HOME_SCREEN); + Singletons.getControl().setCurrentScreen(FScreen.HOME_SCREEN); SOverlayUtils.hideOverlay(); } diff --git a/src/main/java/forge/gui/match/TargetingOverlay.java b/src/main/java/forge/gui/match/TargetingOverlay.java index c2972568501..f1de298d670 100644 --- a/src/main/java/forge/gui/match/TargetingOverlay.java +++ b/src/main/java/forge/gui/match/TargetingOverlay.java @@ -35,8 +35,8 @@ import javax.swing.JPanel; import forge.Card; import forge.Singletons; -import forge.control.FControl; import forge.game.combat.Combat; +import forge.gui.framework.FScreen; import forge.gui.match.controllers.CDock; import forge.gui.match.nonsingleton.VField; import forge.gui.toolbox.FSkin; @@ -330,7 +330,7 @@ public enum TargetingOverlay { public void paintComponent(final Graphics g) { final Combat combat = Singletons.getControl().getObservedGame().getCombat(); // this will get deprecated too // No need for this except in match view - if (Singletons.getControl().getState() != FControl.Screens.MATCH_SCREEN) { return; } + if (Singletons.getControl().getCurrentScreen() != FScreen.MATCH_SCREEN) { return; } super.paintComponent(g); diff --git a/src/main/java/forge/gui/match/VMatchUI.java b/src/main/java/forge/gui/match/VMatchUI.java index 3bbaa500751..8bafc7a084b 100644 --- a/src/main/java/forge/gui/match/VMatchUI.java +++ b/src/main/java/forge/gui/match/VMatchUI.java @@ -9,8 +9,8 @@ import javax.swing.SwingUtilities; import forge.Singletons; import forge.gui.framework.DragCell; import forge.gui.framework.EDocID; +import forge.gui.framework.FScreen; import forge.gui.framework.IVTopLevelUI; -import forge.gui.framework.SLayoutIO; import forge.gui.framework.SRearrangingUtil; import forge.gui.framework.VEmptyDoc; import forge.gui.match.nonsingleton.VCommand; @@ -54,8 +54,6 @@ public enum VMatchUI implements IVTopLevelUI { /** */ @Override public void populate() { - SLayoutIO.loadLayout(null); - // Dev mode disabled? Remove from parent cell if exists. if (!Singletons.getModel().getPreferences().getPrefBoolean(FPref.DEV_MODE_ENABLED)) { if (VDev.SINGLETON_INSTANCE.getParentCell() != null) { @@ -166,4 +164,24 @@ public enum VMatchUI implements IVTopLevelUI { public List getHands() { return lstHands; } + + /* (non-Javadoc) + * @see forge.gui.framework.IVTopLevelUI#onSwitching(forge.gui.framework.FScreen) + */ + @Override + public boolean onSwitching(FScreen screen) { + return true; + } + + /* (non-Javadoc) + * @see forge.gui.framework.IVTopLevelUI#onClosing(forge.control.FControl.Screens) + */ + @Override + public boolean onClosing(FScreen screen) { + if (!Singletons.getControl().getObservedGame().isGameOver()) { + Singletons.getControl().stopGame(); + return false; //delay hiding tab + } + return true; + } } diff --git a/src/main/java/forge/gui/match/controllers/CDock.java b/src/main/java/forge/gui/match/controllers/CDock.java index a6eb1b7c1f0..256448821bd 100644 --- a/src/main/java/forge/gui/match/controllers/CDock.java +++ b/src/main/java/forge/gui/match/controllers/CDock.java @@ -52,6 +52,7 @@ import forge.gui.toolbox.FSkin; import forge.gui.toolbox.SaveOpenDialog; import forge.gui.toolbox.SaveOpenDialog.Filetypes; import forge.item.PaperCard; +import forge.properties.FileLocation; import forge.properties.ForgePreferences.FPref; import forge.view.FView; @@ -109,7 +110,8 @@ public enum CDock implements ICDoc { public void saveLayout() { final SaveOpenDialog dlgSave = new SaveOpenDialog(); - final File defFile = new File(SLayoutIO.getFilePreferred(Singletons.getControl().getState())); + final FileLocation layoutFile = Singletons.getControl().getCurrentScreen().getLayoutFile(); + final File defFile = layoutFile != null ? new File(layoutFile.userPrefLoc) : null; final File saveFile = dlgSave.SaveDialog(defFile, Filetypes.LAYOUT); if (saveFile != null) { SLayoutIO.saveLayout(saveFile); @@ -120,7 +122,8 @@ public enum CDock implements ICDoc { SOverlayUtils.genericOverlay(); final SaveOpenDialog dlgOpen = new SaveOpenDialog(); - final File defFile = new File(SLayoutIO.getFilePreferred(Singletons.getControl().getState())); + final FileLocation layoutFile = Singletons.getControl().getCurrentScreen().getLayoutFile(); + final File defFile = layoutFile != null ? new File(layoutFile.userPrefLoc) : null; final File loadFile = dlgOpen.OpenDialog(defFile, Filetypes.LAYOUT); if (loadFile != null) { diff --git a/src/main/java/forge/gui/menus/LayoutMenu.java b/src/main/java/forge/gui/menus/LayoutMenu.java index 6b14dbb63ef..7622f263256 100644 --- a/src/main/java/forge/gui/menus/LayoutMenu.java +++ b/src/main/java/forge/gui/menus/LayoutMenu.java @@ -13,10 +13,10 @@ import javax.swing.JRadioButtonMenuItem; import javax.swing.KeyStroke; import forge.Singletons; -import forge.control.FControl.Screens; import forge.gui.GuiChoose; import forge.gui.MouseUtil; import forge.gui.MouseUtil.MouseCursor; +import forge.gui.framework.FScreen; import forge.gui.match.controllers.CDock; import forge.gui.toolbox.FSkin; import forge.properties.ForgePreferences; @@ -33,16 +33,16 @@ public final class LayoutMenu { private LayoutMenu() { } private static final CDock controller = CDock.SINGLETON_INSTANCE; - private static Screens currentScreen; + private static FScreen currentScreen; private static final ForgePreferences prefs = Singletons.getModel().getPreferences(); private static boolean showIcons = false; public static JMenu getMenu() { - currentScreen = Singletons.getControl().getState(); + currentScreen = Singletons.getControl().getCurrentScreen(); JMenu menu = new JMenu("Layout"); menu.setMnemonic(KeyEvent.VK_L); - if (currentScreen != Screens.HOME_SCREEN) { + if (currentScreen != FScreen.HOME_SCREEN) { menu.add(getMenu_ViewOptions()); menu.add(getMenu_FileOptions()); } @@ -50,7 +50,7 @@ public final class LayoutMenu { menu.addSeparator(); menu.add(getMenuItem_FullScreen()); menu.add(getMenuItem_SetWindowSize()); - if (currentScreen != Screens.HOME_SCREEN) { + if (currentScreen != FScreen.HOME_SCREEN) { menu.add(getMenuItem_RevertLayout()); } return menu; @@ -59,7 +59,7 @@ public final class LayoutMenu { private static JMenu getMenu_ViewOptions() { JMenu menu = new JMenu("View"); menu.add(getMenuItem_ShowTabs()); - if (currentScreen == Screens.MATCH_SCREEN) { + if (currentScreen == FScreen.MATCH_SCREEN) { menu.add(getMenuItem_ShowBackgroundImage()); } return menu; diff --git a/src/main/java/forge/gui/toolbox/special/DeckLister.java b/src/main/java/forge/gui/toolbox/special/DeckLister.java index 3267e9846c3..a0c8427ef39 100644 --- a/src/main/java/forge/gui/toolbox/special/DeckLister.java +++ b/src/main/java/forge/gui/toolbox/special/DeckLister.java @@ -36,7 +36,6 @@ import javax.swing.SwingConstants; import net.miginfocom.swing.MigLayout; import forge.Command; import forge.Singletons; -import forge.control.FControl; import forge.deck.CardCollections; import forge.deck.Deck; import forge.deck.DeckBase; @@ -44,9 +43,9 @@ import forge.deck.DeckSection; import forge.game.GameType; import forge.gui.deckeditor.CDeckEditorUI; import forge.gui.deckeditor.controllers.ACEditorBase; -import forge.gui.deckeditor.controllers.CEditorConstructed; import forge.gui.deckeditor.controllers.CEditorLimited; import forge.gui.deckeditor.controllers.CEditorQuest; +import forge.gui.framework.FScreen; import forge.gui.framework.ILocalRepaint; import forge.gui.toolbox.FLabel; import forge.gui.toolbox.FSkin; @@ -436,33 +435,35 @@ public class DeckLister extends JPanel implements ILocalRepaint { private void editDeck(final Deck d0) { ACEditorBase editorCtrl = null; - FControl.Screens newState = null; + FScreen screen = null; switch (this.gametype) { case Quest: + screen = FScreen.DECK_EDITOR_QUEST; editorCtrl = new CEditorQuest(Singletons.getModel().getQuest()); - newState = FControl.Screens.DECK_EDITOR_QUEST; break; case Constructed: - newState = FControl.Screens.DECK_EDITOR_CONSTRUCTED; - editorCtrl = new CEditorConstructed(); + screen = FScreen.DECK_EDITOR_CONSTRUCTED; + //re-use constructed controller break; case Sealed: - editorCtrl = new CEditorLimited(Singletons.getModel().getDecks().getSealed()); - newState = FControl.Screens.DECK_EDITOR_LIMITED; + screen = FScreen.DECK_EDITOR_SEALED; + editorCtrl = new CEditorLimited(Singletons.getModel().getDecks().getSealed(), screen); break; case Draft: - editorCtrl = new CEditorLimited(Singletons.getModel().getDecks().getDraft()); - newState = FControl.Screens.DECK_EDITOR_LIMITED; + screen = FScreen.DECK_EDITOR_DRAFT; + editorCtrl = new CEditorLimited(Singletons.getModel().getDecks().getDraft(), screen); break; default: return; } - Singletons.getControl().changeStateAutoFixLayout(newState, "deck editor"); - CDeckEditorUI.SINGLETON_INSTANCE.setCurrentEditorController(editorCtrl); - editorCtrl.getDeckController().load(d0.getName()); + Singletons.getControl().setCurrentScreen(screen); + if (editorCtrl != null) { + CDeckEditorUI.SINGLETON_INSTANCE.setCurrentEditorController(editorCtrl); + } + CDeckEditorUI.SINGLETON_INSTANCE.getCurrentEditorController().getDeckController().load(d0.getName()); } private void deleteDeck(final RowPanel r0) { diff --git a/src/main/java/forge/properties/NewConstants.java b/src/main/java/forge/properties/NewConstants.java index f3a1abdeddc..124ec2e4496 100644 --- a/src/main/java/forge/properties/NewConstants.java +++ b/src/main/java/forge/properties/NewConstants.java @@ -87,7 +87,6 @@ public final class NewConstants { private static final String _DEFAULTS_DIR = _RES_ROOT + "defaults/"; public static final FileLocation EDITOR_PREFERENCES_FILE = new FileLocation(_DEFAULTS_DIR, USER_PREFS_DIR, "editor.preferences"); public static final FileLocation WINDOW_LAYOUT_FILE = new FileLocation(_DEFAULTS_DIR, USER_PREFS_DIR, "window.xml"); - public static final FileLocation HOME_LAYOUT_FILE = new FileLocation(_DEFAULTS_DIR, USER_PREFS_DIR, "home.xml"); public static final FileLocation MATCH_LAYOUT_FILE = new FileLocation(_DEFAULTS_DIR, USER_PREFS_DIR, "match.xml"); public static final FileLocation EDITOR_LAYOUT_FILE = new FileLocation(_DEFAULTS_DIR, USER_PREFS_DIR, "editor.xml"); public static final FileLocation GAUNTLET_DIR = new FileLocation(_DEFAULTS_DIR, USER_DIR, "gauntlet/"); diff --git a/src/main/java/forge/quest/gui/ViewStall.java b/src/main/java/forge/quest/gui/ViewStall.java index a069c7ee4d2..bbae21aea3a 100644 --- a/src/main/java/forge/quest/gui/ViewStall.java +++ b/src/main/java/forge/quest/gui/ViewStall.java @@ -31,6 +31,7 @@ import javax.swing.text.StyledDocument; import net.miginfocom.swing.MigLayout; import forge.Singletons; +import forge.gui.bazaar.VBazaarUI; import forge.gui.toolbox.FLabel; import forge.gui.toolbox.FScrollPane; import forge.gui.toolbox.FSkin; @@ -39,7 +40,6 @@ import forge.quest.QuestController; import forge.quest.bazaar.IQuestBazaarItem; import forge.quest.bazaar.QuestStallDefinition; import forge.quest.data.QuestAssets; -import forge.view.ViewBazaarUI; /** *

@@ -55,15 +55,15 @@ public class ViewStall extends JPanel { private final JTextPane tpnFluff; private final JPanel pnlInventory; private final FScrollPane scrInventory; - private final ViewBazaarUI parentView; + private final VBazaarUI parentView; private final List lstItemPanels; private QuestStallDefinition stall; /** * @param v0 - * {@link forge.view.ViewBazaarUI} + * {@link forge.gui.bazaar.VBazaarUI} */ - public ViewStall(final ViewBazaarUI v0) { + public ViewStall(final VBazaarUI v0) { // Final/component inits this.lblStallName = new FLabel.Builder().text("").fontAlign(SwingConstants.CENTER).build(); this.lblEmpty = new FLabel.Builder().text("The merchant does not have anything useful for sale.") @@ -179,8 +179,8 @@ public class ViewStall extends JPanel { } } - /** @return {@link forge.view.ViewBazaarUI} */ - public ViewBazaarUI getParentView() { + /** @return {@link forge.gui.bazaar.VBazaarUI} */ + public VBazaarUI getParentView() { return this.parentView; } } diff --git a/src/main/java/forge/view/FNavigationBar.java b/src/main/java/forge/view/FNavigationBar.java index c83a3a1d2d5..93e1dbf7a7b 100644 --- a/src/main/java/forge/view/FNavigationBar.java +++ b/src/main/java/forge/view/FNavigationBar.java @@ -24,10 +24,8 @@ import javax.swing.Timer; import javax.swing.border.EmptyBorder; import forge.Singletons; -import forge.control.FControl.Screens; -import forge.gui.deckeditor.CDeckEditorUI; +import forge.gui.framework.FScreen; import forge.gui.framework.ILocalRepaint; -import forge.gui.home.CHomeUI; import forge.gui.menus.ForgeMenu; import forge.gui.menus.LayoutMenu; import forge.gui.toolbox.FButton; @@ -35,7 +33,6 @@ import forge.gui.toolbox.FDigitalClock; import forge.gui.toolbox.FSkin; import forge.gui.toolbox.FSkin.JLabelSkin; import forge.gui.toolbox.FSkin.SkinColor; -import forge.gui.toolbox.FSkin.SkinImage; import forge.util.TypeUtil; @SuppressWarnings("serial") @@ -75,7 +72,7 @@ public class FNavigationBar extends FTitleBarBase { btnClose.setToolTipText("Close"); break; case CLOSE_SCREEN: - btnClose.setToolTipText(this.selectedTab.data.getCloseButtonTooltip()); + btnClose.setToolTipText(this.selectedTab.screen.getCloseButtonTooltip()); break; case EXIT_FORGE: btnClose.setToolTipText("Exit Forge"); @@ -90,8 +87,8 @@ public class FNavigationBar extends FTitleBarBase { layout.putConstraint(SpringLayout.SOUTH, btnForge, -1, SpringLayout.SOUTH, this); addForgeButtonListeners(); - addNavigationTab(CHomeUI.SINGLETON_INSTANCE); - addNavigationTab(CDeckEditorUI.SINGLETON_INSTANCE); + addNavigationTab(FScreen.HOME_SCREEN); + addNavigationTab(FScreen.DECK_EDITOR_CONSTRUCTED); super.addControls(); @@ -101,8 +98,8 @@ public class FNavigationBar extends FTitleBarBase { updateClockVisibility(); } - private NavigationTab addNavigationTab(INavigationTabData data) { - NavigationTab tab = new NavigationTab(data); + private NavigationTab addNavigationTab(FScreen screen) { + NavigationTab tab = new NavigationTab(screen); if (tabs.size() == 0) { tab.setSelected(true); selectedTab = tab; @@ -117,48 +114,41 @@ public class FNavigationBar extends FTitleBarBase { return tab; } - private NavigationTab getTab(INavigationTabData data) { + private NavigationTab getTab(FScreen screen) { for (NavigationTab tab : tabs) { - if (tab.data == data) { + if (tab.screen == screen) { return tab; } } return null; } - - public void ensureTabActive(INavigationTabData data) { - NavigationTab tab = getTab(data); - if (tab != null && !tab.selected) { - setSelectedTab(tab); - Singletons.getControl().changeStateAutoFixLayout(data.getTabDestScreen(), tab.getText()); - } + + public boolean canSwitchAway() { + return (selectedTab == null || selectedTab.screen.onSwitching()); } - public void setSelectedTab(INavigationTabData data) { - NavigationTab tab = getTab(data); + public void updateSelectedTab() { + FScreen screen = Singletons.getControl().getCurrentScreen(); + NavigationTab tab = getTab(screen); if (tab == null) { - tab = addNavigationTab(data); //if tab not found, add and select it + tab = addNavigationTab(screen); //if tab not found, add and select it } - setSelectedTab(tab); - } - - private void setSelectedTab(NavigationTab tab) { - if (tab != null && tab != selectedTab) { - if (selectedTab != null) { - selectedTab.setSelected(false); - } - tab.setSelected(true); - selectedTab = tab; - updateBtnCloseTooltip(); + else if (tab == selectedTab) { return; } + + if (selectedTab != null) { + selectedTab.setSelected(false); } + tab.setSelected(true); + selectedTab = tab; + updateBtnCloseTooltip(); } public void closeSelectedTab() { closeTab(selectedTab); } - public void closeTab(INavigationTabData data) { - NavigationTab tab = getTab(data); + public void closeTab(FScreen screen) { + NavigationTab tab = getTab(screen); if (tab != null) { closeTab(tab); } @@ -166,10 +156,13 @@ public class FNavigationBar extends FTitleBarBase { private void closeTab(NavigationTab tab) { if (tab == null) { return; } - if (!tab.data.onClosing()) { return; } //give data a chance to perform special close handling and/or cancel closing tab + if (!tab.screen.onClosing()) { return; } //give screen a chance to perform special close handling and/or cancel closing tab if (tab.selected) { - setSelectedTab(tabs.get(0)); //select home tab if selected tab closed (TODO: support navigation history and go to previous tab instead) + //return to Home screen if selected tab closed + //TODO: support navigation history and go to previous tab instead + this.selectedTab = null; //prevent raising onSwitching for tab being closed + Singletons.getControl().setCurrentScreen(FScreen.HOME_SCREEN); } int index = tabs.indexOf(tab); if (index != -1) { @@ -350,39 +343,30 @@ public class FNavigationBar extends FTitleBarBase { @Override public void setIconImage(Image image) { } - - public interface INavigationTabData { - public String getTabCaption(); - public SkinImage getTabIcon(); - public Screens getTabDestScreen(); - public boolean allowTabClose(); - public String getCloseButtonTooltip(); - public boolean onClosing(); - } private final class NavigationTab extends JLabel implements ILocalRepaint { private static final int fontSize = 14; private static final int unhoveredAlpha = 150; private final FSkin.JLabelSkin skin; - private final INavigationTabData data; + private final FScreen screen; private final CloseButton btnClose; private SkinColor backColor; private boolean selected = false; private boolean hovered = false; - private NavigationTab(final INavigationTabData data0) { - super(data0.getTabCaption()); - this.data = data0; + private NavigationTab(final FScreen screen0) { + super(screen0.getTabCaption()); + this.screen = screen0; setOpaque(false); skin = FSkin.get(this); - skin.setIcon(data0.getTabIcon()); + skin.setIcon(screen0.getTabIcon()); skin.setForeground(foreColor.alphaColor(unhoveredAlpha)); skin.setFont(FSkin.getFont(fontSize)); int closeButtonOffset; - if (data.allowTabClose()) { + if (screen.allowTabClose()) { btnClose = new CloseButton(); - btnClose.setToolTipText(data.getCloseButtonTooltip()); + btnClose.setToolTipText(screen.getCloseButtonTooltip()); closeButtonOffset = btnClose.getPreferredSize().width; SpringLayout tabLayout = new SpringLayout(); setLayout(tabLayout); @@ -402,11 +386,10 @@ public class FNavigationBar extends FTitleBarBase { if (!NavigationTab.this.isEnabled()) { return; } if (SwingUtilities.isLeftMouseButton(e)) { if (!selected) { - FNavigationBar.this.setSelectedTab(NavigationTab.this); - Singletons.getControl().changeStateAutoFixLayout(data.getTabDestScreen(), NavigationTab.this.getText()); + Singletons.getControl().setCurrentScreen(screen); } } - else if (SwingUtilities.isMiddleMouseButton(e) && data.allowTabClose()) { + else if (SwingUtilities.isMiddleMouseButton(e) && screen.allowTabClose()) { FNavigationBar.this.closeTab(NavigationTab.this); } } diff --git a/src/main/java/forge/view/FView.java b/src/main/java/forge/view/FView.java index b009a1a183f..6ad8e133847 100644 --- a/src/main/java/forge/view/FView.java +++ b/src/main/java/forge/view/FView.java @@ -33,14 +33,15 @@ import org.apache.commons.lang3.StringUtils; import com.google.common.collect.Lists; import forge.Singletons; -import forge.control.FControl; import forge.control.RestartUtil; import forge.gui.FNetOverlay; import forge.gui.ImportDialog; import forge.gui.SOverlayUtils; +import forge.gui.bazaar.VBazaarUI; import forge.gui.deckeditor.VDeckEditorUI; import forge.gui.framework.DragCell; import forge.gui.framework.EDocID; +import forge.gui.framework.FScreen; import forge.gui.framework.SLayoutConstants; import forge.gui.framework.SLayoutIO; import forge.gui.home.VHomeUI; @@ -74,7 +75,7 @@ public enum FView { private SplashFrame frmSplash; // Non-singleton instances (deprecated, but not updated yet) - private ViewBazaarUI bazaar = null; + private VBazaarUI bazaar = null; // Top-level UI components; all have getters. private final FFrame frmDocument = new FFrame(); @@ -152,7 +153,7 @@ public enum FView { } // All is ready to go - fire up home screen and discard splash frame. - Singletons.getControl().changeState(FControl.Screens.HOME_SCREEN); + Singletons.getControl().setCurrentScreen(FScreen.HOME_SCREEN); FView.this.frmSplash.dispose(); FView.this.frmSplash = null; @@ -408,9 +409,9 @@ public enum FView { } } - /** @return {@link forge.view.ViewBazaarUI} */ - public ViewBazaarUI getViewBazaar() { - if (Singletons.getControl().getState() != FControl.Screens.QUEST_BAZAAR) { + /** @return {@link forge.gui.bazaar.VBazaarUI} */ + public VBazaarUI getViewBazaar() { + if (Singletons.getControl().getCurrentScreen() != FScreen.QUEST_BAZAAR) { throw new IllegalArgumentException("FView$getViewBazaar\n" + "may only be called while the bazaar UI is showing."); } @@ -420,10 +421,10 @@ public enum FView { /** */ private void cacheUIStates() { - FView.this.bazaar = new ViewBazaarUI(Singletons.getModel().getQuest().getBazaar()); VMatchUI.SINGLETON_INSTANCE.instantiate(); VHomeUI.SINGLETON_INSTANCE.instantiate(); VDeckEditorUI.SINGLETON_INSTANCE.instantiate(); + VBazaarUI.SINGLETON_INSTANCE.instantiate(); } public void incrementSplashProgessBar() {