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() {