Move/rename FControl.Screens to FScreen and make that define the Navigation tab data instead of INavigationTabData

Make it so each Deck Editor type appears in its own tab
Make Bazaar screen act more like other screens
This commit is contained in:
drdev
2013-10-17 04:23:48 +00:00
parent 4dfab45544
commit 8b39b69bb7
45 changed files with 959 additions and 980 deletions

5
.gitattributes vendored
View File

@@ -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

View File

@@ -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();
}
});
}
}

View File

@@ -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.
* </p>
* 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<Shortcut> 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.
* </p>
* 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<Shortcut> 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);

View File

@@ -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();
}
};

View File

@@ -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 <i>single game</i>, a new instance is created for each game.
*/
public class Game implements INavigationTabData {
public class Game {
private final GameType type;
private final List<Player> roIngamePlayers;
private final List<Player> 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;
}
}

View File

@@ -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 &emsp; {@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 &emsp; {@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
}
}

View File

@@ -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;
}
}

View File

@@ -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;
*
* <br><br><i>(C at beginning of class name denotes a control class.)</i>
*/
public enum CDeckEditorUI implements ICDoc, IMenuProvider, INavigationTabData {
public enum CDeckEditorUI implements ICDoc, IMenuProvider {
/** */
SINGLETON_INSTANCE;
private final HashMap<FScreen, ACEditorBase<? extends InventoryItem, ? extends DeckBase>> screenChildControllers;
private ACEditorBase<? extends InventoryItem, ? extends DeckBase> childController;
private boolean isFindingAsYouType = false;
private CDeckEditorUI() {
screenChildControllers = new HashMap<FScreen, ACEditorBase<? extends InventoryItem, ? extends DeckBase>>();
}
/**
@@ -119,17 +122,10 @@ public enum CDeckEditorUI implements ICDoc, IMenuProvider, INavigationTabData {
* @param editor0 &emsp; {@link forge.gui.deckeditor.controllers.ACEditorBase}<?, ?>
*/
public void setCurrentEditorController(ACEditorBase<? extends InventoryItem, ? extends DeckBase> 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<? extends InventoryItem> catView = childController.getCatalogManager();
ItemManager<? extends InventoryItem> 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<? extends InventoryItem> catView = childController.getCatalogManager();
final ItemManager<? extends InventoryItem> deckView = childController.getDeckManager();
final ItemTable<? extends InventoryItem> catTable = catView.getTable();
final ItemTable<? extends InventoryItem> 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<? extends InventoryItem, ? extends DeckBase> 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
}
}

View File

@@ -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<DeckBase>) 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?",

View File

@@ -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();
}
}

View File

@@ -57,7 +57,8 @@ public abstract class ACEditorBase<TItem extends InventoryItem, TModel extends D
public void addMoveAlternateItems (String verb, String nounSingular, String nounPlural, String destination);
public void addTextFilterItem ();
}
public boolean listenersHooked;
private ItemManager<TItem> catalogManager;
private ItemManager<TItem> deckManager;
@@ -97,7 +98,7 @@ public abstract class ACEditorBase<TItem extends InventoryItem, TModel extends D
/**
* Resets and initializes the current editor.
*/
public abstract void init();
public abstract void update();
/**
* Gets the ItemManager holding the cards in the current deck.

View File

@@ -8,6 +8,7 @@ import javax.swing.SwingUtilities;
import javax.swing.filechooser.FileFilter;
import forge.Command;
import forge.Singletons;
import forge.deck.Deck;
import forge.deck.DeckBase;
import forge.deck.io.DeckSerializer;
@@ -123,7 +124,7 @@ public enum CCurrentDeck implements ICDoc {
/** */
@SuppressWarnings("unchecked")
private void newDeck() {
if (!SEditorIO.confirmSaveChanges()) { return; }
if (!SEditorIO.confirmSaveChanges(Singletons.getControl().getCurrentScreen())) { return; }
try {
SwingUtilities.invokeLater(new Runnable() {
@@ -143,7 +144,7 @@ public enum CCurrentDeck implements ICDoc {
/** */
@SuppressWarnings("unchecked")
private void openDeck() {
if (!SEditorIO.confirmSaveChanges()) { return; }
if (!SEditorIO.confirmSaveChanges(Singletons.getControl().getCurrentScreen())) { return; }
final File file = this.getImportFilename();

View File

@@ -6,6 +6,7 @@ import com.google.common.collect.Iterables;
import forge.Command;
import forge.Constant;
import forge.Singletons;
import forge.card.CardDb;
import forge.card.CardRulesPredicates;
import forge.deck.Deck;
@@ -76,7 +77,7 @@ public enum CDeckgen implements ICDoc {
//========== Other methods
@SuppressWarnings("unchecked")
private <TItem extends InventoryItem, TModel extends DeckBase> 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 <TItem extends InventoryItem, TModel extends DeckBase> void newGenerateConstructed(final int colorCount0) {
if (!SEditorIO.confirmSaveChanges()) { return; }
if (!SEditorIO.confirmSaveChanges(Singletons.getControl().getCurrentScreen())) { return; }
final Deck genConstructed = new Deck();

View File

@@ -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<PaperCard, Deck> {
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<Deck> newCreator = new Supplier<Deck>() {
@Override
@@ -187,7 +180,7 @@ public final class CEditorCommander extends ACEditorBase<PaperCard, Deck> {
* @see forge.gui.deckeditor.ACEditorBase#show(forge.Command)
*/
@Override
public void init() {
public void update() {
final List<TableColumnInfo<InventoryItem>> lstCatalogCols = SColumnUtil.getCatalogDefaultColumns();
lstCatalogCols.remove(SColumnUtil.getColumn(ColumnName.CAT_QUANTITY));
@@ -209,9 +202,9 @@ public final class CEditorCommander extends ACEditorBase<PaperCard, Deck> {
} });
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<PaperCard, Deck> {
*/
@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;
}

View File

@@ -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<PaperCard, Deck> {
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<Deck> newCreator = new Supplier<Deck>() {
@Override
@@ -181,7 +173,7 @@ public final class CEditorConstructed extends ACEditorBase<PaperCard, Deck> {
/*
* (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<PaperCard, Deck> {
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<PaperCard, Deck> {
*/
@SuppressWarnings("serial")
@Override
public void init() {
public void update() {
final List<TableColumnInfo<InventoryItem>> lstCatalogCols = SColumnUtil.getCatalogDefaultColumns();
lstCatalogCols.remove(SColumnUtil.getColumn(ColumnName.CAT_QUANTITY));
@@ -310,8 +303,8 @@ public final class CEditorConstructed extends ACEditorBase<PaperCard, Deck> {
public void run() {
cycleEditorMode();
} });
this.controller.newModel();
this.controller.refreshModel();
}
/* (non-Javadoc)
@@ -319,9 +312,6 @@ public final class CEditorConstructed extends ACEditorBase<PaperCard, Deck> {
*/
@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);
}
}

View File

@@ -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<PaperCard, DeckGroup> {
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<PaperCard, DeckGroup> {
this.boosterDraft = inBoosterDraft;
}
/**
* <p>
* setup.
* </p>
*/
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<PaperCard, DeckGroup> {
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<PaperCard, DeckGroup> {
* @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<InventoryItem>) null);

View File

@@ -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<PaperCard, DeckGroup> {
private final DeckController<DeckGroup> controller;
private final FScreen screen;
private DragCell allDecksParent = null;
private DragCell deckGenParent = null;
@@ -58,13 +60,12 @@ public final class CEditorLimited extends ACEditorBase<PaperCard, DeckGroup> {
*
* @param deckMap0 &emsp; {@link forge.deck.DeckGroup}<{@link forge.util.storage.IStorage}>
*/
public CEditorLimited(final IStorage<DeckGroup> deckMap0) {
public CEditorLimited(final IStorage<DeckGroup> 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<PaperCard, DeckGroup> {
* @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<PaperCard, DeckGroup> {
*/
@Override
public boolean exit() {
final boolean okToExit = SEditorIO.confirmSaveChanges();
final boolean okToExit = SEditorIO.confirmSaveChanges(this.screen);
if (okToExit) {
CSubmenuDraft.SINGLETON_INSTANCE.update();

View File

@@ -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<PaperCard, Deck> {
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<PaperCard, Deck> {
*/
@SuppressWarnings("serial")
@Override
public void init() {
public void update() {
final List<TableColumnInfo<InventoryItem>> columnsCatalog = SColumnUtil.getCatalogDefaultColumns();
final List<TableColumnInfo<InventoryItem>> columnsDeck = SColumnUtil.getDeckDefaultColumns();
@@ -281,8 +279,6 @@ public final class CEditorQuest extends ACEditorBase<PaperCard, Deck> {
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<PaperCard, Deck> {
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<PaperCard, Deck> {
*/
@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();

View File

@@ -133,9 +133,6 @@ public final class CEditorQuestCardShop extends ACEditorBase<InventoryItem, Deck
catalogManager.setAlwaysNonUnique(true);
deckManager.setAlwaysNonUnique(true);
VCardCatalog.SINGLETON_INSTANCE.setItemManager(catalogManager);
VCurrentDeck.SINGLETON_INSTANCE.setItemManager(deckManager);
this.setCatalogManager(catalogManager);
this.setDeckManager(deckManager);
}
@@ -157,62 +154,6 @@ public final class CEditorQuestCardShop extends ACEditorBase<InventoryItem, Deck
fullCatalogToggle.setText("See full catalog");
}
}
private void setup() {
final List<TableColumnInfo<InventoryItem>> columnsCatalog = SColumnUtil.getCatalogDefaultColumns();
final List<TableColumnInfo<InventoryItem>> 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<InventoryItem> countDecksForEachCard() {
@@ -485,8 +426,60 @@ public final class CEditorQuestCardShop extends ACEditorBase<InventoryItem, Deck
*/
@SuppressWarnings("serial")
@Override
public void init() {
setup();
public void update() {
final List<TableColumnInfo<InventoryItem>> columnsCatalog = SColumnUtil.getCatalogDefaultColumns();
final List<TableColumnInfo<InventoryItem>> 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();

View File

@@ -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<PaperCard, Deck> {
private final DeckController<Deck> controller;
private final FScreen screen;
private DragCell allDecksParent = null;
private DragCell deckGenParent = null;
private final Predicate<PaperCard> cardPoolCondition;
private final EDocID exitToScreen;
//=========== Constructor
/**
@@ -68,20 +66,14 @@ public final class CEditorVariant extends ACEditorBase<PaperCard, Deck> {
* This is the least restrictive mode;
* all cards are available.
*/
public CEditorVariant(final IStorage<Deck> folder, final Predicate<PaperCard> poolCondition, final EDocID exitTo) {
public CEditorVariant(final IStorage<Deck> folder, final Predicate<PaperCard> 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<Deck> newCreator = new Supplier<Deck>() {
@Override
@@ -161,7 +153,7 @@ public final class CEditorVariant extends ACEditorBase<PaperCard, Deck> {
* @see forge.gui.deckeditor.ACEditorBase#show(forge.Command)
*/
@Override
public void init() {
public void update() {
final List<TableColumnInfo<InventoryItem>> lstCatalogCols = SColumnUtil.getCatalogDefaultColumns();
lstCatalogCols.remove(SColumnUtil.getColumn(ColumnName.CAT_QUANTITY));
@@ -171,9 +163,9 @@ public final class CEditorVariant extends ACEditorBase<PaperCard, Deck> {
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<PaperCard, Deck> {
*/
@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;
}

View File

@@ -32,6 +32,11 @@ import forge.util.storage.IStorage;
*
* @param <T> the generic type
*/
/**
* TODO: Write javadoc for this type.
*
* @param <T>
*/
public class DeckController<T extends DeckBase> {
private T model;
@@ -291,12 +296,18 @@ public class DeckController<T extends DeckBase> {
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.

View File

@@ -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;
}
}

View File

@@ -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);
}

View File

@@ -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<LayoutInfo, EDocID> 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<LayoutInfo, EDocID> 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<LayoutInfo, Collection<EDocID>> 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<LayoutInfo, Collection<EDocID>> 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.");
}
}
}

View File

@@ -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;
* <br><br><i>(V at beginning of class name denotes a view class.)</i>
*
*/
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
}
}

View File

@@ -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
}
}

View File

@@ -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()));
}
});

View File

@@ -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();
}

View File

@@ -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);
}

View File

@@ -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<? extends InventoryItem, T> editor = (ACEditorBase<? extends InventoryItem, T>) 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);
}

View File

@@ -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<GameLogEntryType> panel = this.view.getGameLogVerbosityComboBoxPanel();

View File

@@ -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));
}
});

View File

@@ -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());
}

View File

@@ -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));
}
});

View File

@@ -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();
}

View File

@@ -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();
}

View File

@@ -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);

View File

@@ -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<VHand> 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;
}
}

View File

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

View File

@@ -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;

View File

@@ -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 <T extends DeckBase> void editDeck(final Deck d0) {
ACEditorBase<? extends InventoryItem, ? extends DeckBase> 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) {

View File

@@ -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/");

View File

@@ -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;
/**
* <p>
@@ -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<ViewItem> 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;
}
}

View File

@@ -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<NavigationTab> 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);
}
}

View File

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