diff --git a/.gitattributes b/.gitattributes index 1153b71af8f..706f014cfb4 100644 --- a/.gitattributes +++ b/.gitattributes @@ -11330,15 +11330,9 @@ src/main/java/forge/control/ControlHomeUI.java -text src/main/java/forge/control/ControlMatchUI.java -text src/main/java/forge/control/FControl.java -text src/main/java/forge/control/KeyboardShortcuts.java -text +src/main/java/forge/control/RestartUtil.java -text src/main/java/forge/control/bazaar/ControlStall.java -text src/main/java/forge/control/bazaar/package-info.java -text svneol=native#text/plain -src/main/java/forge/control/home/ControlConstructed.java -text -src/main/java/forge/control/home/ControlDraft.java -text -src/main/java/forge/control/home/ControlQuest.java -text -src/main/java/forge/control/home/ControlSealed.java -text -src/main/java/forge/control/home/ControlSettings.java -text -src/main/java/forge/control/home/ControlUtilities.java -text -src/main/java/forge/control/home/package-info.java -text svneol=native#text/plain src/main/java/forge/control/input/Input.java svneol=native#text/plain src/main/java/forge/control/input/InputAttack.java svneol=native#text/plain src/main/java/forge/control/input/InputBlock.java svneol=native#text/plain @@ -11443,21 +11437,14 @@ src/main/java/forge/gui/game/CardPanel.java svneol=native#text/plain src/main/java/forge/gui/game/CardPicturePanel.java svneol=native#text/plain src/main/java/forge/gui/game/package-info.java svneol=native#text/plain src/main/java/forge/gui/home/EMenuGroup.java -text +src/main/java/forge/gui/home/EMenuItem.java -text src/main/java/forge/gui/home/ICSubmenu.java -text src/main/java/forge/gui/home/IVSubmenu.java -text -src/main/java/forge/gui/home/constructed/CSubmenuColors.java -text -src/main/java/forge/gui/home/constructed/CSubmenuCustom.java -text -src/main/java/forge/gui/home/constructed/CSubmenuQuestEvents.java -text -src/main/java/forge/gui/home/constructed/CSubmenuThemes.java -text -src/main/java/forge/gui/home/constructed/ESubmenuConstructedTypes.java -text -src/main/java/forge/gui/home/constructed/SubmenuConstructedUtil.java -text -src/main/java/forge/gui/home/constructed/VSubmenuColors.java -text -src/main/java/forge/gui/home/constructed/VSubmenuCustom.java -text -src/main/java/forge/gui/home/constructed/VSubmenuQuestEvents.java -text -src/main/java/forge/gui/home/constructed/VSubmenuThemes.java -text -src/main/java/forge/gui/home/constructed/package-info.java svneol=native#text/plain +src/main/java/forge/gui/home/StartButton.java -text +src/main/java/forge/gui/home/limited/CSubmenuConstructed.java -text src/main/java/forge/gui/home/limited/CSubmenuDraft.java -text src/main/java/forge/gui/home/limited/CSubmenuSealed.java -text +src/main/java/forge/gui/home/limited/VSubmenuConstructed.java -text src/main/java/forge/gui/home/limited/VSubmenuDraft.java -text src/main/java/forge/gui/home/limited/VSubmenuSealed.java -text src/main/java/forge/gui/home/limited/package-info.java svneol=native#text/plain @@ -11467,6 +11454,9 @@ src/main/java/forge/gui/home/quest/CSubmenuDuels.java -text src/main/java/forge/gui/home/quest/CSubmenuQuestData.java -text src/main/java/forge/gui/home/quest/CSubmenuQuestDecks.java -text src/main/java/forge/gui/home/quest/CSubmenuQuestPrefs.java -text +src/main/java/forge/gui/home/quest/IStatsAndPet.java -text +src/main/java/forge/gui/home/quest/QuestFileLister.java -text +src/main/java/forge/gui/home/quest/QuestPreferencesHandler.java -text src/main/java/forge/gui/home/quest/SubmenuQuestUtil.java -text src/main/java/forge/gui/home/quest/VSubmenuChallenges.java -text src/main/java/forge/gui/home/quest/VSubmenuDuels.java -text @@ -11576,18 +11566,6 @@ src/main/java/forge/view/ViewMatchUI.java -text src/main/java/forge/view/bazaar/ViewItem.java -text src/main/java/forge/view/bazaar/ViewStall.java svneol=native#text/plain src/main/java/forge/view/bazaar/package-info.java svneol=native#text/plain -src/main/java/forge/view/editor/package-info.java svneol=native#text/plain -src/main/java/forge/view/home/ConstructedDeckSelectPanel.java -text -src/main/java/forge/view/home/QuestFileLister.java -text -src/main/java/forge/view/home/QuestPreferencesHandler.java -text -src/main/java/forge/view/home/StartButton.java -text -src/main/java/forge/view/home/ViewConstructed.java -text -src/main/java/forge/view/home/ViewDraft.java -text -src/main/java/forge/view/home/ViewQuest.java -text -src/main/java/forge/view/home/ViewSealed.java -text -src/main/java/forge/view/home/ViewSettings.java -text -src/main/java/forge/view/home/ViewUtilities.java -text -src/main/java/forge/view/home/package-info.java svneol=native#text/plain src/main/java/forge/view/match/QuestWinLoseCardViewer.java -text src/main/java/forge/view/match/QuestWinLoseHandler.java -text src/main/java/forge/view/match/ViewBattlefield.java -text diff --git a/.gitignore b/.gitignore index 378ea999449..e4dc773a395 100644 --- a/.gitignore +++ b/.gitignore @@ -266,6 +266,7 @@ res/decks/Zac[!!-~]Hill's[!!-~]Kuldotha[!!-~]Red.dck res/decks/Zack[!!-~]Shaffner's[!!-~]Creatureless[!!-~]Control.dck res/decks/Zemox's[!!-~]Mono-Green[!!-~]Infect.dck res/decks/Zvi[!!-~]Mowshowitz's[!!-~]Mono-Black[!!-~]Control.dck +res/decks/constructed/*.dck res/decks/o1.bdk res/images/themes res/oracleScript.log diff --git a/src/main/java/forge/control/ControlHomeUI.java b/src/main/java/forge/control/ControlHomeUI.java index 302724b3664..7bee95869dc 100644 --- a/src/main/java/forge/control/ControlHomeUI.java +++ b/src/main/java/forge/control/ControlHomeUI.java @@ -1,10 +1,5 @@ package forge.control; -import forge.control.home.ControlConstructed; -import forge.control.home.ControlDraft; -import forge.control.home.ControlQuest; -import forge.control.home.ControlSealed; -import forge.control.home.ControlUtilities; import forge.view.ViewHomeUI; /** @@ -28,29 +23,4 @@ public class ControlHomeUI { public ViewHomeUI getView() { return view; } - - /** @return ControlConstructed */ - public ControlConstructed getControlConstructed() { - return view.getViewConstructed().getControl(); - } - - /** @return ControlDraft */ - public ControlDraft getControlDraft() { - return view.getViewDraft().getControl(); - } - - /** @return ControlSealed */ - public ControlSealed getControlSealed() { - return view.getViewSealed().getControl(); - } - - /** @return ControlQuest */ - public ControlQuest getControlQuest() { - return view.getViewQuest().getControl(); - } - - /** @return ControlUtilities */ - public ControlUtilities getControlUtilities() { - return view.getViewUtilities().getControl(); - } } diff --git a/src/main/java/forge/control/FControl.java b/src/main/java/forge/control/FControl.java index 9ea52443648..62e339a8dde 100644 --- a/src/main/java/forge/control/FControl.java +++ b/src/main/java/forge/control/FControl.java @@ -31,6 +31,8 @@ import javax.swing.WindowConstants; import forge.AllZone; import forge.Singletons; import forge.control.KeyboardShortcuts.Shortcut; +import forge.gui.home.quest.SubmenuQuestUtil; +import forge.view.ViewHomeUI; import forge.view.toolbox.CardFaceSymbols; import forge.view.toolbox.FSkin; @@ -85,8 +87,7 @@ public enum FControl { public void windowClosing(final WindowEvent e) { Singletons.getView().getFrame().setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); changeState(0); - Singletons.getControl().getControlHome().getControlQuest().refreshStats(); - Singletons.getView().getViewHome().showQuestMenu(); + SubmenuQuestUtil.updateStatsAndPet(); } }; @@ -146,7 +147,7 @@ public enum FControl { // Fire up new state switch (i0) { case HOME_SCREEN: - display.add(Singletons.getView().getViewHome(), JLayeredPane.DEFAULT_LAYER); + display.add(ViewHomeUI.SINGLETON_INSTANCE.getPanel(), JLayeredPane.DEFAULT_LAYER); sizeChildren(); break; @@ -189,7 +190,7 @@ public enum FControl { + "may only be called while the home UI is showing."); } - return Singletons.getView().getViewHome().getControl(); + throw new NullPointerException("Fix Me"); //return Singletons.getView().getViewHome().getControl(); } /** diff --git a/src/main/java/forge/control/KeyboardShortcuts.java b/src/main/java/forge/control/KeyboardShortcuts.java index d02aa44d09c..5aad94eddae 100644 --- a/src/main/java/forge/control/KeyboardShortcuts.java +++ b/src/main/java/forge/control/KeyboardShortcuts.java @@ -16,8 +16,8 @@ import javax.swing.KeyStroke; import org.apache.commons.lang3.StringUtils; import forge.Singletons; +import forge.gui.home.settings.VSubmenuPreferences.KeyboardShortcutField; import forge.properties.ForgePreferences.FPref; -import forge.view.home.ViewSettings.KeyboardShortcutField; /** * Consolidates keyboard shortcut assembly into one location diff --git a/src/main/java/forge/control/RestartUtil.java b/src/main/java/forge/control/RestartUtil.java new file mode 100644 index 00000000000..79c6f786e9f --- /dev/null +++ b/src/main/java/forge/control/RestartUtil.java @@ -0,0 +1,80 @@ +package forge.control; + +import java.io.File; +import java.io.IOException; +import java.lang.management.ManagementFactory; +import java.util.List; + +import forge.error.ErrorViewer; + +/** + * Restarts a java app. + * Credit: http://leolewis.website.org/wordpress/2011/07/06/programmatically-restart-a-java-application/ + */ +public class RestartUtil { + /** + * Sun property pointing the main class and its arguments. + * Might not be defined on non Hotspot VM implementations. + */ + public static final String SUN_JAVA_COMMAND = "sun.java.command"; + + /** + * Restart the current Java application. + * @param runBeforeRestart some custom code to be run before restarting + */ + public static void restartApplication(final Runnable runBeforeRestart) { + try { + // java binary + final String java = System.getProperty("java.home") + "/bin/java"; + // vm arguments + final List vmArguments = ManagementFactory.getRuntimeMXBean().getInputArguments(); + final StringBuffer vmArgsOneLine = new StringBuffer(); + for (final String arg : vmArguments) { + // if it's the agent argument : we ignore it otherwise the + // address of the old application and the new one will be in conflict + if (!arg.contains("-agentlib")) { + vmArgsOneLine.append(arg); + vmArgsOneLine.append(" "); + } + } + // init the command to execute, add the vm args + final StringBuffer cmd = new StringBuffer("\"" + java + "\" " + vmArgsOneLine); + + // program main and program arguments + final String[] mainCommand = System.getProperty(SUN_JAVA_COMMAND).split(" "); + // program main is a jar + if (mainCommand[0].endsWith(".jar")) { + // if it's a jar, add -jar mainJar + cmd.append("-jar " + new File(mainCommand[0]).getPath()); + } else { + // else it's a .class, add the classpath and mainClass + cmd.append("-cp \"" + System.getProperty("java.class.path") + "\" " + mainCommand[0]); + } + // finally add program arguments + for (int i = 1; i < mainCommand.length; i++) { + cmd.append(" "); + cmd.append(mainCommand[i]); + } + // execute the command in a shutdown hook, to be sure that all the + // resources have been disposed before restarting the application + Runtime.getRuntime().addShutdownHook(new Thread() { + @Override + public void run() { + try { + Runtime.getRuntime().exec(cmd.toString()); + } catch (final IOException e) { + e.printStackTrace(); + } + } + }); + // execute some custom code before restarting + if (runBeforeRestart != null) { + runBeforeRestart.run(); + } + // exit + System.exit(0); + } catch (final Exception ex) { + ErrorViewer.showError(ex, "Restart \"%s\" exception", ""); + } + } +} diff --git a/src/main/java/forge/control/home/ControlConstructed.java b/src/main/java/forge/control/home/ControlConstructed.java deleted file mode 100644 index a051e57ba39..00000000000 --- a/src/main/java/forge/control/home/ControlConstructed.java +++ /dev/null @@ -1,382 +0,0 @@ -package forge.control.home; - -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import javax.swing.JList; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.SwingUtilities; - -import org.apache.commons.lang3.ArrayUtils; - -import forge.CardList; -import forge.Constant; -import forge.PlayerType; -import forge.Singletons; -import forge.deck.Deck; -import forge.deck.generate.Generate2ColorDeck; -import forge.deck.generate.Generate3ColorDeck; -import forge.deck.generate.Generate5ColorDeck; -import forge.deck.generate.GenerateThemeDeck; -import forge.game.GameNew; -import forge.game.GameType; -import forge.properties.ForgePreferences.FPref; -import forge.quest.data.QuestEvent; -import forge.quest.data.QuestEventManager; -import forge.util.IStorage; -import forge.view.home.ViewConstructed; - -/** - * Controls logic and listeners for Constructed mode in home screen. - * - */ -public class ControlConstructed { - private final ViewConstructed view; - private JPanel selectedTab; - private final MouseListener madStartGame, madTabHuman, madTabAI, madSingletons, madArtifacts, madRemoveSmall; - - /** - * - * Controls logic and listeners for "constructed" mode in home screen. - * - * @param v0   ViewConstructed - */ - public ControlConstructed(final ViewConstructed v0) { - this.view = v0; - - // Set action listeners - madTabHuman = new MouseAdapter() { @Override - public void mouseClicked(final MouseEvent e) { view.showHumanTab(); } }; - - madTabAI = new MouseAdapter() { @Override - public void mouseClicked(final MouseEvent e) { view.showAITab(); } }; - - // Game start logic must happen outside of the EDT. - madStartGame = new MouseAdapter() { - @Override - public void mouseReleased(final MouseEvent e) { - final Thread t = new Thread() { - @Override - public void run() { - startGame(); - } - }; - t.start(); - } - }; - - madSingletons = new MouseAdapter() { - @Override - public void mouseClicked(final MouseEvent e) { - Singletons.getModel().getPreferences().setPref( - FPref.DECKGEN_SINGLETONS, String.valueOf(view.getCbSingletons().isSelected())); - } - }; - - madArtifacts = new MouseAdapter() { - @Override - public void mouseClicked(final MouseEvent e) { - Singletons.getModel().getPreferences().setPref( - FPref.DECKGEN_ARTIFACTS, String.valueOf(view.getCbArtifacts().isSelected())); - } - }; - - madRemoveSmall = new MouseAdapter() { - @Override - public void mouseClicked(final MouseEvent e) { - Singletons.getModel().getPreferences().setPref( - FPref.DECKGEN_NOSMALL, String.valueOf(view.getCbRemoveSmall().isSelected())); - } - }; - - //Everything is defined; can now init. - updateDeckLists(); - addListeners(); - - view.getPnlHuman().getLstColorDecks().setSelectedIndices(new int[] {0, 1}); - view.getPnlHuman().listSelectManager(view.getPnlHuman().getLstColorDecks()); - - view.getPnlAI().getLstColorDecks().setSelectedIndices(new int[] {0, 1}); - view.getPnlAI().listSelectManager(view.getPnlAI().getLstColorDecks()); - } - - /** @return ViewConstructed */ - public ViewConstructed getView() { - return view; - } - - /** - * Updates visual state of tabber. - * @param tab0   JPanel tab object (can pass SubTab too). - */ - public void updateTabber(final JPanel tab0) { - if (selectedTab != null) { - selectedTab.setEnabled(false); - } - - tab0.setEnabled(true); - selectedTab = tab0; - } - - /** */ - public void updateDeckSelectionCheckboxes() { - view.getCbSingletons().setSelected( - Singletons.getModel().getPreferences().getPrefBoolean(FPref.DECKGEN_SINGLETONS)); - view.getCbArtifacts().setSelected( - Singletons.getModel().getPreferences().getPrefBoolean(FPref.DECKGEN_ARTIFACTS)); - view.getCbRemoveSmall().setSelected( - Singletons.getModel().getPreferences().getPrefBoolean(FPref.DECKGEN_NOSMALL)); - } - - /** */ - public void addListeners() { - view.getBtnStart().removeMouseListener(madStartGame); - view.getBtnStart().addMouseListener(madStartGame); - - view.getTabHuman().removeMouseListener(madTabHuman); - view.getTabHuman().addMouseListener(madTabHuman); - - view.getTabAI().removeMouseListener(madTabAI); - view.getTabAI().addMouseListener(madTabAI); - - view.getCbSingletons().removeMouseListener(madSingletons); - view.getCbArtifacts().removeMouseListener(madArtifacts); - view.getCbRemoveSmall().removeMouseListener(madRemoveSmall); - - view.getCbSingletons().addMouseListener(madSingletons); - view.getCbArtifacts().addMouseListener(madArtifacts); - view.getCbRemoveSmall().addMouseListener(madRemoveSmall); - } - - /** */ - public void updateDeckLists() { - view.getPnlHuman().getLstColorDecks().setListData(getColorNames()); - view.getPnlAI().getLstColorDecks().setListData(getColorNames()); - - view.getPnlHuman().getLstThemeDecks().setListData(getThemeNames()); - view.getPnlAI().getLstThemeDecks().setListData(getThemeNames()); - - view.getPnlHuman().getLstCustomDecks().setListData(getCustomNames()); - view.getPnlAI().getLstCustomDecks().setListData(getCustomNames()); - - view.getPnlHuman().getLstQuestDecks().setListData(getEventNames()); - view.getPnlAI().getLstQuestDecks().setListData(getEventNames()); - } - - //========= DECK GENERATION - - /** Generates deck from current list selection(s). */ - private Deck generateDeck(final JList lst0, final PlayerType player0) { - CardList cards = null; - final String[] selection = Arrays.copyOf(lst0.getSelectedValues(), lst0.getSelectedValues().length, String[].class); - final Deck deck; - - // Color deck - if (lst0.getName().equals("lstColor") && colorCheck(selection)) { - final Map colorVals = new HashMap(); - colorVals.put("Random 1", "AI"); - colorVals.put("Random 2", "AI"); - colorVals.put("Random 3", "AI"); - colorVals.put("Random 4", "AI"); - colorVals.put("Black", "black"); - colorVals.put("Blue", "blue"); - colorVals.put("Green", "green"); - colorVals.put("Red", "red"); - colorVals.put("White", "white"); - - // Replace "random" with "AI" for deck generation code - for (int i = 0; i < selection.length; i++) { - selection[i] = colorVals.get(selection[i]); - } - - // 2, 3, and 5 colors. - if (selection.length == 2) { - final Generate2ColorDeck gen = new Generate2ColorDeck( - selection[0], selection[1]); - cards = gen.get2ColorDeck(60, player0); - } - else if (selection.length == 3) { - final Generate3ColorDeck gen = new Generate3ColorDeck( - selection[0], selection[1], selection[2]); - cards = gen.get3ColorDeck(60, player0); - } - else { - final Generate5ColorDeck gen = new Generate5ColorDeck( - selection[0], selection[1], selection[2], selection[3], selection[4]); - cards = gen.get5ColorDeck(60, player0); - } - - // After generating card lists, build deck. - deck = new Deck(); - deck.getMain().add(cards); - colorVals.clear(); - } - - // Theme deck - else if (lst0.getName().equals("lstTheme")) { - final GenerateThemeDeck gen = new GenerateThemeDeck(); - cards = gen.getThemeDeck(selection[0], 60); - - // After generating card lists, build deck. - deck = new Deck(); - deck.getMain().add(cards); - } - else if (lst0.getName().equals("lstQuest")) { - deck = Singletons.getModel().getQuestEventManager().getEvent(selection[0]).getEventDeck(); - } - // Custom deck - else { - deck = Singletons.getModel().getDecks().getConstructed().get(selection[0]); - } - - return deck; - } - - /** Fired when start button is pressed; checks various conditions from lists and starts game. */ - private void startGame() { - if (SwingUtilities.isEventDispatchThread()) { - throw new IllegalStateException( - "ControlConstructed() > startGame() must be accessed from outside the event dispatch thread."); - } - - // If everything is OK, show progress bar and start inits. - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - view.getBarProgress().setMaximum(2); - view.getBarProgress().reset(); - view.getBarProgress().setShowETA(false); - view.getBarProgress().setShowCount(false); - view.getBarProgress().setDescription("Starting New Game"); - view.getBarProgress().setVisible(true); - view.getBtnStart().setVisible(false); - } - }); - - SwingUtilities.invokeLater(new Runnable() { @Override - public void run() { view.getBarProgress().increment(); } }); - - Constant.Runtime.HUMAN_DECK[0] = generateDeck(view.getPnlHuman().getLstCurrentSelected(), PlayerType.HUMAN); - - SwingUtilities.invokeLater(new Runnable() { @Override - public void run() { view.getBarProgress().increment(); } }); - - Constant.Runtime.COMPUTER_DECK[0] = generateDeck(view.getPnlAI().getLstCurrentSelected(), PlayerType.COMPUTER); - - Constant.Runtime.setGameType(GameType.Constructed); - - if (Constant.Runtime.COMPUTER_DECK[0] == null || Constant.Runtime.HUMAN_DECK[0] == null) { - SwingUtilities.invokeLater(new Runnable() { @Override - public void run() { - view.getBarProgress().setVisible(false); - view.getBtnStart().setVisible(true); - } - }); - } - - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - view.getBtnStart().setVisible(true); - view.getBarProgress().setVisible(false); - - GameNew.newGame(Constant.Runtime.HUMAN_DECK[0], Constant.Runtime.COMPUTER_DECK[0], - new CardList(), new CardList(), 20, 20); - } - }); - } - - /** - * - * Array of color selections present in list boxes. Values - * correspond to colorVals hash map. - * - * @return Object[] - */ - // Four randoms are included which should cover all possibilities. - private String[] getColorNames() { - return new String[] {"Random 1", "Random 2", "Random 3", - "Random 4", "Black", "Blue", "Green", "Red", "White"}; - } - - /** - * Array of theme names, usually used in list boxes. - * - * @return Object[] - */ - private String[] getThemeNames() { - final List themeNames = new ArrayList(); - themeNames.clear(); - - for (final String s : GenerateThemeDeck.getThemeNames()) { - themeNames.add(s); - } - - return themeNames.toArray(ArrayUtils.EMPTY_STRING_ARRAY); - } - - private String[] getCustomNames() { - final List customNames = new ArrayList(); - customNames.clear(); - - final IStorage allDecks = Singletons.getModel().getDecks().getConstructed(); - for (final Deck d : allDecks) { customNames.add(d.getName()); } - - return customNames.toArray(ArrayUtils.EMPTY_STRING_ARRAY); - } - - private String[] getEventNames() { - final List eventNames = new ArrayList(); - final QuestEventManager qm = Singletons.getModel().getQuestEventManager(); - - for (final QuestEvent e : qm.getAllChallenges()) { - eventNames.add(e.getEventDeck().getName()); - } - - for (final QuestEvent e : qm.getAllDuels()) { - eventNames.add(e.getEventDeck().getName()); - } - - return eventNames.toArray(ArrayUtils.EMPTY_STRING_ARRAY); - } - - /** - * Checks lengths of selected values for color lists - * to see if a deck generator exists. Alert and visual reminder if fail. - * - * @param colors0   String[] of color names - * @return boolean - */ - private boolean colorCheck(final String[] colors0) { - boolean result = true; - - if (colors0.length == 1) { - JOptionPane.showMessageDialog(null, - "Sorry, single color generated decks aren't supported yet." - + "\n\rPlease choose at least one more color for this deck.", - "Generate deck: 1 color", JOptionPane.ERROR_MESSAGE); - result = false; - } - else if (colors0.length == 4) { - JOptionPane.showMessageDialog(null, - "Sorry, four color generated decks aren't supported yet." - + "\n\rPlease use 2, 3, or 5 colors for this deck.", - "Generate deck: 4 colors", JOptionPane.ERROR_MESSAGE); - result = false; - } - else if (colors0.length > 5) { - JOptionPane.showMessageDialog(null, - "Generate deck: maximum five colors!", - "Generate deck: too many colors", JOptionPane.ERROR_MESSAGE); - result = false; - } - return result; - } -} diff --git a/src/main/java/forge/control/home/ControlDraft.java b/src/main/java/forge/control/home/ControlDraft.java deleted file mode 100644 index 7ebcb881e5d..00000000000 --- a/src/main/java/forge/control/home/ControlDraft.java +++ /dev/null @@ -1,189 +0,0 @@ -package forge.control.home; - -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.util.ArrayList; -import java.util.List; - -import javax.swing.JOptionPane; -import javax.swing.SwingUtilities; - -import forge.Constant; -import forge.Singletons; -import forge.deck.Deck; -import forge.deck.DeckGroup; -import forge.game.GameNew; -import forge.game.GameType; -import forge.game.limited.BoosterDraft; -import forge.game.limited.CardPoolLimitation; -import forge.gui.GuiUtils; -import forge.gui.deckeditor.DraftingProcess; -import forge.view.home.ViewDraft; -import forge.view.toolbox.FSkin; - -/** - * TODO: Write javadoc for this type. - * - */ -public class ControlDraft { - private final ViewDraft view; - private final MouseListener madBuildDeck, madDirections, madStartGame; - - /** @param v0   ViewDraft */ - public ControlDraft(ViewDraft v0) { - this.view = v0; - updateHumanDecks(); - view.getLstAIDecks().setSelectedIndex(0); - - // Action listeners - madDirections = new MouseAdapter() { - @Override - public void mouseClicked(MouseEvent e) { - view.showDirections(); - } - @Override - public void mouseEntered(MouseEvent e) { - view.getLblDirections().setForeground(FSkin.getColor(FSkin.Colors.CLR_HOVER)); - } - @Override - public void mouseExited(MouseEvent e) { - view.getLblDirections().setForeground(FSkin.getColor(FSkin.Colors.CLR_TEXT)); - } - }; - - madBuildDeck = new MouseAdapter() { - @Override - public void mousePressed(MouseEvent e) { setupDraft(); } - }; - - madStartGame = new MouseAdapter() { - @Override - public void mouseReleased(MouseEvent e) { - final Thread t = new Thread() { - @Override - public void run() { - startGame(); - } - }; - t.start(); - } - }; - - addListeners(); - } - - private void addListeners() { - view.getBtnBuildDeck().removeMouseListener(madBuildDeck); - view.getBtnBuildDeck().addMouseListener(madBuildDeck); - - view.getLblDirections().removeMouseListener(madDirections); - view.getLblDirections().addMouseListener(madDirections); - - view.getBtnStart().removeMouseListener(madStartGame); - view.getBtnStart().addMouseListener(madStartGame); - } - - /** */ - private void startGame() { - if (SwingUtilities.isEventDispatchThread()) { - throw new IllegalStateException( - "ControlDraft() > startGame() must be accessed from outside the event dispatch thread."); - } - - Deck human = view.getLstHumanDecks().getSelectedDeck(); - int aiIndex = view.getLstAIDecks().getSelectedIndex(); - - if (human == null) { - JOptionPane.showMessageDialog(null, - "No deck selected for human!\r\n(You may need to build a new deck.)", - "No deck", JOptionPane.ERROR_MESSAGE); - return; - } - else if (human.getMain().countAll() < 40) { - JOptionPane.showMessageDialog(null, - "The selected deck doesn't have enough cards to play (minimum 40)." - + "\r\nUse the deck editor to choose the cards you want before starting.", - "No deck", JOptionPane.ERROR_MESSAGE); - return; - } - - // If everything is OK, show progress bar and start inits. - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - view.getBarProgress().setMaximum(2); - view.getBarProgress().reset(); - view.getBarProgress().setShowETA(false); - view.getBarProgress().setShowCount(false); - view.getBarProgress().setDescription("Starting New Game"); - view.getBarProgress().setVisible(true); - view.getBtnStart().setVisible(false); - } - }); - - DeckGroup opponentDecks = Singletons.getModel().getDecks().getDraft().get(human.getName()); - - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - view.getBarProgress().increment(); - } - }); - - Constant.Runtime.HUMAN_DECK[0] = human; - Constant.Runtime.COMPUTER_DECK[0] = opponentDecks.getAiDecks().get(aiIndex); //zero is human deck, so it must be +1 - - if (Constant.Runtime.COMPUTER_DECK[0] == null) { - throw new IllegalStateException("startButton() error - computer deck is null"); - } - - Constant.Runtime.setGameType(GameType.Draft); - - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - view.getBtnStart().setVisible(true); - view.getBarProgress().setVisible(false); - GameNew.newGame(Constant.Runtime.HUMAN_DECK[0], Constant.Runtime.COMPUTER_DECK[0]); - } - }); - } - - /** */ - public void setupDraft() { - final DraftingProcess draft = new DraftingProcess(); - - // Determine what kind of booster draft to run - final ArrayList draftTypes = new ArrayList(); - draftTypes.add("Full Cardpool"); - draftTypes.add("Block / Set"); - draftTypes.add("Custom"); - - final String prompt = "Choose Draft Format:"; - final Object o = GuiUtils.chooseOne(prompt, draftTypes.toArray()); - - if (o.toString().equals(draftTypes.get(0))) { - draft.showGui(new BoosterDraft(CardPoolLimitation.Full)); - } - - else if (o.toString().equals(draftTypes.get(1))) { - draft.showGui(new BoosterDraft(CardPoolLimitation.Block)); - } - - else if (o.toString().equals(draftTypes.get(2))) { - draft.showGui(new BoosterDraft(CardPoolLimitation.Custom)); - } - - } - - /** Updates deck list in view. */ - public void updateHumanDecks() { - - List human = new ArrayList(); - for (DeckGroup d : Singletons.getModel().getDecks().getDraft()) { - human.add(d.getHumanDeck()); - } - view.getLstHumanDecks().setDecks(human); - } -} diff --git a/src/main/java/forge/control/home/ControlQuest.java b/src/main/java/forge/control/home/ControlQuest.java deleted file mode 100644 index 91459f518c4..00000000000 --- a/src/main/java/forge/control/home/ControlQuest.java +++ /dev/null @@ -1,647 +0,0 @@ -package forge.control.home; - -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.io.File; -import java.io.FilenameFilter; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; - -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.SwingUtilities; - -import forge.AllZone; -import forge.Command; -import forge.Constant; -import forge.Singletons; -import forge.control.FControl; -import forge.deck.Deck; -import forge.game.GameNew; -import forge.game.GameType; -import forge.gui.GuiUtils; -import forge.gui.deckeditor.DeckEditorQuest; -import forge.gui.deckeditor.QuestCardShop; -import forge.properties.ForgeProps; -import forge.properties.NewConstants; -import forge.quest.data.QuestChallenge; -import forge.quest.data.QuestData; -import forge.quest.data.QuestDataIO; -import forge.quest.data.QuestEvent; -import forge.quest.data.QuestEventManager; -import forge.quest.data.QuestPreferences; -import forge.quest.data.QuestPreferences.QPref; -import forge.quest.data.QuestUtil; -import forge.quest.data.item.QuestItemZeppelin; -import forge.quest.data.pet.QuestPetAbstract; -import forge.view.home.ViewQuest; - -/** - * Controls logic and listeners for Quest mode in home screen. - * - */ -public class ControlQuest { - private final ViewQuest view; - private QuestEvent event; - private QuestData qData; - private final QuestPreferences qPrefs; - private final QuestEventManager qem; - private JPanel selectedTab; - - private final MouseListener madStartGame, madDuels, madChallenges, - madQuests, madDecks, madPreferences; - private final ActionListener actPetSelect, actPlantSelect; - private final Command cmdSpellShop, cmdBazaar, - cmdEmbark, cmdNewDeck, cmdCurrentDeck, cmdResetPrefs, cmdDeckExit, - cmdDeckDelete, cmdDeckSelect, cmdQuestSelect, cmdQuestDelete; - private Deck currentDeck; - private Map arrQuests; - - /** - * Controls logic and listeners for quest mode in home screen. - * - * @param v0   ViewQuest - */ - @SuppressWarnings("serial") - public ControlQuest(ViewQuest v0) { - // Inits - this.view = v0; - this.qem = Singletons.getModel().getQuestEventManager(); - this.qPrefs = Singletons.getModel().getQuestPreferences(); - - //========= Listener inits - - // Game start logic must happen outside of the EDT. - madStartGame = new MouseAdapter() { - @Override - public void mouseReleased(MouseEvent e) { - final Thread t = new Thread() { - @Override - public void run() { - startGame(); - } - }; - t.start(); - } - }; - - madDuels = new MouseAdapter() { @Override - public void mouseClicked(MouseEvent e) { view.showDuelsTab(); } }; - - madChallenges = new MouseAdapter() { @Override - public void mouseClicked(MouseEvent e) { view.showChallengesTab(); } }; - - madQuests = new MouseAdapter() { @Override - public void mouseClicked(MouseEvent e) { view.showQuestsTab(); } }; - - madDecks = new MouseAdapter() { @Override - public void mouseClicked(MouseEvent e) { - view.showDecksTab(); - if (ControlQuest.this.qem != null) { refreshDecks(); } - } - }; - - madPreferences = new MouseAdapter() { @Override - public void mouseClicked(MouseEvent e) { view.showPrefsTab(); } }; - - actPetSelect = new ActionListener() { - @Override - public void actionPerformed(final ActionEvent actionEvent) { - if (view.getCbxPet().getSelectedIndex() > 0) { - qData.getPetManager().setSelectedPet( - view.getCbxPet().getSelectedItem().toString().substring(7)); - } else { - qData.getPetManager().setSelectedPet(null); - } - } - }; - - actPlantSelect = new ActionListener() { - @Override - public void actionPerformed(final ActionEvent actionEvent) { - qData.getPetManager() - .setUsePlant(view.getCbPlant().isSelected()); - } - }; - - cmdSpellShop = new Command() { @Override - public void execute() { showSpellShop(); } }; - - cmdBazaar = new Command() { @Override - public void execute() { showBazaar(); } }; - - cmdEmbark = new Command() { @Override - public void execute() { newQuest(); } }; - - cmdCurrentDeck = new Command() { @Override - public void execute() { view.showDecksTab(); } }; - - cmdNewDeck = new Command() { @Override - public void execute() { - final DeckEditorQuest editor = new DeckEditorQuest(qData); - editor.show(cmdDeckExit); - editor.setVisible(true); - } - }; - - cmdResetPrefs = new Command() { - @Override - public void execute() { - qPrefs.reset(); - qPrefs.save(); - view.resetPrefs(); - } - }; - - cmdDeckExit = new Command() { - @Override - public void execute() { - AllZone.getQuestData().saveData(); - refreshDecks(); - Singletons.getView().getViewHome().getBtnQuest().grabFocus(); - } - }; - - cmdDeckSelect = new Command() { - @Override - public void execute() { - currentDeck = view.getLstDecks().getSelectedDeck(); - qPrefs.setPreference(QPref.CURRENT_DECK, currentDeck.toString()); - qPrefs.save(); - view.setCurrentDeckStatus(); - } - }; - - cmdDeckDelete = new Command() { @Override - public void execute() { refreshDecks(); } }; - - cmdQuestSelect = new Command() { @Override - public void execute() { changeQuest(); } }; - - cmdQuestDelete = new Command() { @Override - public void execute() { refreshQuests(); } }; - - addListeners(); - } - - /** @return ViewQuest */ - public ViewQuest getView() { - return view; - } - - /** @return {@link forge.quest.gui.main.QuestEventManager} */ - public QuestEventManager getQEM() { - return this.qem; - } - - /** @return {@link forge.Command} What to do when the deck editor exits. */ - public Command getExitCommand() { - return cmdDeckExit; - } - - /** @return String   indicates the rank of this current quest */ - public String getRankString() { - return qData.getRank(); - } - - /** @return forge.deck.Deck */ - public Deck getCurrentDeck() { - return this.currentDeck; - } - - /** @return */ - public Map getAllQuests() { - return arrQuests; - } - - /** - * Updates visual state of tabber. - * @param tab0   JPanel tab object (can pass SubTab too). - */ - public void updateTabber(JPanel tab0) { - if (selectedTab != null) { - selectedTab.setEnabled(false); - } - - tab0.setEnabled(true); - selectedTab = tab0; - } - - private void addListeners() { - view.getTabDuels().removeMouseListener(madDuels); - view.getTabDuels().addMouseListener(madDuels); - - view.getTabChallenges().removeMouseListener(madChallenges); - view.getTabChallenges().addMouseListener(madChallenges); - - view.getTabDecks().removeMouseListener(madDecks); - view.getTabDecks().addMouseListener(madDecks); - - view.getTabQuests().removeMouseListener(madQuests); - view.getTabQuests().addMouseListener(madQuests); - - view.getTabPreferences().removeMouseListener(madPreferences); - view.getTabPreferences().addMouseListener(madPreferences); - - view.getLstQuests().setSelectCommand(cmdQuestSelect); - view.getLstQuests().setEditCommand(cmdQuestDelete); - view.getLstQuests().setDeleteCommand(cmdQuestDelete); - - view.getBtnEmbark().setCommand(cmdEmbark); - view.getBtnResetPrefs().setCommand(cmdResetPrefs); - - if (this.qem != null) { - view.getBtnStart().removeMouseListener(madStartGame); - view.getBtnStart().addMouseListener(madStartGame); - - view.getBtnBazaar().setCommand(cmdBazaar); - - view.getBtnNewDeck().setCommand(cmdNewDeck); - - view.getBtnCurrentDeck().setCommand(cmdCurrentDeck); - - view.getBtnSpellShop().setCommand(cmdSpellShop); - - view.getCbxPet().addActionListener(actPetSelect); - - view.getCbPlant().addActionListener(actPlantSelect); - - view.getLstDecks().setSelectCommand(cmdDeckSelect); - view.getLstDecks().setDeleteCommand(cmdDeckDelete); - - view.getLstDecks().setExitCommand(cmdDeckExit); - } - } - - /** - * The actuator for new quests. - */ - private void newQuest() { - int difficulty = 0; - QuestData newdata = new QuestData(); - - final String mode = view.getRadFantasy().isSelected() - ? forge.quest.data.QuestData.FANTASY - : forge.quest.data.QuestData.CLASSIC; - - if (view.getRadEasy().isSelected()) { - difficulty = 0; - } else if (view.getRadMedium().isSelected()) { - difficulty = 1; - } else if (view.getRadHard().isSelected()) { - difficulty = 2; - } else if (view.getRadExpert().isSelected()) { - difficulty = 3; - } else { - throw new IllegalStateException( - "ControlQuest() > newQuest(): Error starting new quest!"); - } - - final Object o = JOptionPane.showInputDialog(null, "Poets will remember your quest as:", "Quest Name", JOptionPane.OK_CANCEL_OPTION); - - if (o == null) { return; } - - final String questName = GuiUtils.cleanString(o.toString()); - - if (getAllQuests().get(questName) != null || questName.equals("")) { - JOptionPane.showMessageDialog(null, "Please pick another quest name, a quest already has that name."); - return; - } - - // Give the user a few cards to build a deck - newdata.newGame(difficulty, mode, view.getCbStandardStart().isSelected()); - newdata.setName(questName); - newdata.saveData(); - - // Save in preferences. - qPrefs.setPreference(QPref.CURRENT_QUEST, questName + ".dat"); - Singletons.getModel().getQuestPreferences().save(); - - Singletons.getView().getViewHome().resetQuest(); - } // New Quest - - /** Changes between quest data files. */ - private void changeQuest() { - AllZone.setQuestData(view.getLstQuests().getSelectedQuest()); - this.qData = AllZone.getQuestData(); - - // Save in preferences. - qPrefs.setPreference(QPref.CURRENT_QUEST, qData.getName() + ".dat"); - Singletons.getModel().getQuestPreferences().save(); - - refreshDecks(); - refreshStats(); - } - - /** Resets quests, then retrieves and sets current quest. */ - public void refreshQuests() { - File dirQuests = ForgeProps.getFile(NewConstants.Quest.DATA_DIR); - - // Temporary transition code between v1.2.2 and v1.2.3. - // Can be safely deleted after release of 1.2.3. - if (!dirQuests.exists()) { - dirQuests.mkdirs(); - } - File olddata = new File("res/quest/questData.dat"); - File newpath = new File(dirQuests.getPath() + "/questData.dat"); - - if (olddata.exists()) { olddata.renameTo(newpath); } - // end block which can be deleted - - // Iterate over files and load quest datas for each. - FilenameFilter takeDatFiles = new FilenameFilter() { - @Override - public boolean accept(final File dir, final String name) { - return name.endsWith(".dat"); - } - }; - File[] arrFiles = dirQuests.listFiles(takeDatFiles); - arrQuests = new HashMap(); - for (File f : arrFiles) { - arrQuests.put(f.getName(), QuestDataIO.loadData(f)); - } - - // Populate list with available quest datas. - view.getLstQuests().setQuests(arrQuests.values().toArray(new QuestData[0])); - - // If there are quests available, force select. - if (arrQuests.size() > 0) { - final String questname = qPrefs.getPreference(QPref.CURRENT_QUEST); - - // Attempt to select previous quest. - if (arrQuests.get(questname) != null) { - view.getLstQuests().setSelectedQuestData(arrQuests.get(questname)); - } - else { - view.getLstQuests().setSelectedIndex(0); - } - - // Drop into AllZone. - AllZone.setQuestData(view.getLstQuests().getSelectedQuest()); - } - else { - AllZone.setQuestData(null); - } - - this.qData = AllZone.getQuestData(); - } - - /** Resets decks, then retrieves and sets current deck. */ - public void refreshDecks() { - // Retrieve and set all decks - view.getLstDecks().setDecks(qData != null ? qData.getMyDecks() : new ArrayList()); - - // Look through list for preferred deck from prefs - currentDeck = null; - - if (qData != null) { - final String cd = qPrefs.getPreference(QPref.CURRENT_DECK); - for (Deck d : qData.getMyDecks()) { - if (d.getName().equals(cd)) { - currentDeck = d; - view.getLstDecks().setSelectedDeck(d); - break; - } - } - } - - // Not found? Set first one. Still not found? OK, throw to setCurrentDeckStatus(). - if (currentDeck == null) { view.getLstDecks().setSelectedIndex(0); } - view.setCurrentDeckStatus(); - } - - /** Updates all statistics in several panels. */ - public void refreshStats() { - if (qData == null) { return; } - - // Stats panel - view.getLblCredits().setText("Credits: " + qData.getCredits()); - view.getLblLife().setText("Life: " + qData.getLife()); - view.getLblWins().setText("Wins: " + qData.getWin()); - view.getLblLosses().setText("Losses: " + qData.getLost()); - view.getBarProgress().setVisible(false); - view.setCurrentDeckStatus(); - - final int num = nextChallengeInWins(); - if (num == 0) { - view.getLblNextChallengeInWins().setText("Next challenge available now."); - } - else { - view.getLblNextChallengeInWins().setText("Next challenge available in " + num + " wins."); - } - - view.getLblWinStreak().setText( - "Win streak: " + qData.getWinStreakCurrent() - + " (Best:" + qData.getWinStreakBest() + ")"); - - // Start panel: pet, plant, zep. - if (this.qData.getMode().equals(QuestData.FANTASY)) { - final Set petList = this.qData.getPetManager().getAvailablePetNames(); - final QuestPetAbstract currentPet = this.qData.getPetManager().getSelectedPet(); - - view.getCbxPet().removeAllItems(); - // Pet list visibility - if (petList.size() > 0) { - view.getCbxPet().setEnabled(true); - view.getCbxPet().addItem("Don't summon a pet"); - for (final String pet : petList) { - view.getCbxPet().addItem("Summon " + pet); - } - - if (currentPet != null) { view.getCbxPet().setSelectedItem("Summon " + currentPet.getName()); } - } else { - view.getCbxPet().setVisible(false); - } - - // Plant visiblity - if (this.qData.getPetManager().getPlant().getLevel() == 0) { - view.getCbPlant().setVisible(false); - } - else { - view.getCbPlant().setVisible(true); - view.getCbPlant().setSelected(this.qData.getPetManager().shouldPlantBeUsed()); - } - - // Zeppelin visibility - final QuestItemZeppelin zeppelin = (QuestItemZeppelin) this.qData.getInventory().getItem("Zeppelin"); - view.getCbZep().setVisible(zeppelin.hasBeenUsed()); - } - else { - view.getCbxPet().setVisible(false); - view.getCbPlant().setVisible(false); - view.getCbZep().setVisible(false); - } - } - - /** */ - @SuppressWarnings("serial") - private void showSpellShop() { - final Command exit = new Command() { - @Override - public void execute() { - AllZone.getQuestData().saveData(); - refreshStats(); - } - }; - - QuestCardShop g = new QuestCardShop(AllZone.getQuestData()); - g.show(exit); - g.setVisible(true); - } - - /** */ - private void showBazaar() { - Singletons.getControl().changeState(FControl.QUEST_BAZAAR); - Singletons.getView().getFrame().validate(); - } - - /** */ - private void startGame() { - if (SwingUtilities.isEventDispatchThread()) { - throw new IllegalStateException( - "ControlQuest() > startGame() must be accessed from outside the event dispatch thread."); - } - - if (currentDeck == null) { - JOptionPane.showMessageDialog(null, - "A mysterious wall blocks your way." - + "\n\rAn unseen sepulchral voice booms:" - + "\n\r\"Entrance Forbidden Without A Deck\"", - "No deck", JOptionPane.ERROR_MESSAGE); - return; - } - - view.getBarProgress().setVisible(true); - - // If everything is OK, show progress bar and start inits. - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - view.getBarProgress().setMaximum(2); - view.getBarProgress().reset(); - view.getBarProgress().setShowETA(false); - view.getBarProgress().setShowCount(false); - view.getBarProgress().setDescription("Starting New Game"); - view.getBarProgress().setVisible(true); - view.getBtnStart().setVisible(false); - } - }); - - event = view.getSelectedOpponent().getEvent(); - AllZone.getQuestData().setCurrentEvent(event); - Constant.Runtime.setGameType(GameType.Quest); - final QuestItemZeppelin zeppelin = (QuestItemZeppelin) qData.getInventory().getItem("Zeppelin"); - zeppelin.setZeppelinUsed(false); - qData.randomizeOpponents(); - - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - view.getBarProgress().increment(); - } - }); - - Constant.Runtime.HUMAN_DECK[0] = currentDeck; - Constant.Runtime.COMPUTER_DECK[0] = event.getEventDeck(); - Constant.Quest.OPP_ICON_NAME[0] = event.getIconFilename(); - - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - view.getBarProgress().increment(); - } - }); - - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - view.getBtnStart().setVisible(true); - view.getBarProgress().setVisible(false); - - if (event.getEventType().equals("challenge")) { - setupChallenge(currentDeck); - } else { - setupDuel(currentDeck); - } - qData.saveData(); - } - }); - } - - /** - *

- * setupDuel. - *

- * - * @param humanDeck - * a {@link forge.deck.Deck} object. - */ - private void setupDuel(final Deck humanDeck) { - final Deck computer = event.getEventDeck(); - Constant.Runtime.COMPUTER_DECK[0] = computer; - - GameNew.newGame( - Constant.Runtime.HUMAN_DECK[0], Constant.Runtime.COMPUTER_DECK[0], - QuestUtil.getHumanStartingCards(qData), - QuestUtil.getComputerStartingCards(qData), - qData.getLife(), 20); - } - - /** - *

- * setupChallenge. - *

- * - * @param humanDeck - * a {@link forge.deck.Deck} object. - */ - private void setupChallenge(final Deck humanDeck) { - int extraLife = 0; - - if (qData.getInventory().getItemLevel("Gear") == 2) { - extraLife = 3; - } - - GameNew.newGame( - Constant.Runtime.HUMAN_DECK[0], Constant.Runtime.COMPUTER_DECK[0], - QuestUtil.getHumanStartingCards(qData, event), - QuestUtil.getComputerStartingCards(qData, event), - qData.getLife() + extraLife, ((QuestChallenge) event).getAILife()); - - } - - /** - *

- * nextChallengeInWins. - *

- * - * @return a int. - */ - private int nextChallengeInWins() { - // Number of wins was 25, lowering the number to 20 to help short term - // questers. - if (qData.getWin() < 20) { - return 20 - qData.getWin(); - } - - // The int mul has been lowered by one, should face special opps more - // frequently. - final int challengesPlayed = qData.getChallengesPlayed(); - int mul = 5; - - if (qData.getInventory().hasItem("Zeppelin")) { - mul = 3; - } else if (qData.getInventory().hasItem("Map")) { - mul = 4; - } - - final int delta = (challengesPlayed * mul) - qData.getWin(); - - return (delta > 0) ? delta : 0; - } -} diff --git a/src/main/java/forge/control/home/ControlSealed.java b/src/main/java/forge/control/home/ControlSealed.java deleted file mode 100644 index 3746019f421..00000000000 --- a/src/main/java/forge/control/home/ControlSealed.java +++ /dev/null @@ -1,220 +0,0 @@ -package forge.control.home; - -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import javax.swing.JOptionPane; -import javax.swing.SwingUtilities; - -import net.slightlymagic.braids.util.UtilFunctions; - -import org.apache.commons.lang3.StringUtils; - -import forge.Command; -import forge.Constant; -import forge.Singletons; -import forge.deck.Deck; -import forge.deck.DeckGroup; -import forge.game.GameNew; -import forge.game.GameType; -import forge.game.limited.SealedDeck; -import forge.gui.GuiUtils; -import forge.item.CardPrinted; -import forge.item.ItemPool; -import forge.properties.ForgeProps; -import forge.properties.NewConstants; -import forge.view.home.ViewSealed; - -/** - * Controls behavior of swing components in "sealed" mode menu. - * - */ -public class ControlSealed { - private ViewSealed view; - private Map aiDecks; - private final MouseListener madBuildDeck, madStartGame; - - /** - * Controls behavior of swing components in "sealed" mode menu. - * - * @param v0   ViewSealed - */ - public ControlSealed(ViewSealed v0) { - view = v0; - Constant.Runtime.setGameType(GameType.Sealed); - - madBuildDeck = new MouseAdapter() { - @Override - public void mousePressed(MouseEvent e) { setupSealed(); } - }; - - // Game start logic must happen outside of the EDT. - madStartGame = new MouseAdapter() { - @Override - public void mouseReleased(MouseEvent e) { - final Thread t = new Thread() { - @Override - public void run() { - startGame(); - } - }; - t.start(); - } - }; - } - - /** */ - public void addListeners() { - view.getBtnBuild().removeMouseListener(madBuildDeck); - view.getBtnBuild().addMouseListener(madBuildDeck); - - view.getBtnStart().removeMouseListener(madStartGame); - view.getBtnStart().addMouseListener(madStartGame); - } - - /** Start button has been pressed. */ - public void startGame() { - if (SwingUtilities.isEventDispatchThread()) { - throw new IllegalStateException( - "ControlSealed() > startGame() must be accessed from outside the event dispatch thread."); - } - - Deck human = view.getLstHumanDecks().getSelectedDeck(); - - if (human == null) { - JOptionPane.showMessageDialog(null, - "Please build and/or select a deck for yourself.", - "No deck", JOptionPane.ERROR_MESSAGE); - return; - } - - // If everything is OK, show progress bar and start inits. - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - view.getBarProgress().setMaximum(2); - view.getBarProgress().reset(); - view.getBarProgress().setShowETA(false); - view.getBarProgress().setShowCount(false); - view.getBarProgress().setDescription("Starting New Game"); - view.getBarProgress().setVisible(true); - view.getBtnStart().setVisible(false); - } - }); - - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - view.getBarProgress().increment(); - } - }); - - Constant.Runtime.HUMAN_DECK[0] = human; - Constant.Runtime.COMPUTER_DECK[0] = Singletons.getModel().getDecks().getSealed().get(human.getName()).getAiDecks().get(0); - - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - view.getBtnStart().setVisible(true); - view.getBarProgress().setVisible(false); - - GameNew.newGame(Constant.Runtime.HUMAN_DECK[0], Constant.Runtime.COMPUTER_DECK[0]); - } - }); - } - - /** */ - public void updateDeckLists() { - List humanDecks = new ArrayList(); - aiDecks = new HashMap(); - - // Since AI decks are tied directly to the human choice, - // they're just mapped in a parallel map and grabbed when the game starts. - for (DeckGroup d : Singletons.getModel().getDecks().getSealed()) { - aiDecks.put(d.getName(), d.getAiDecks().get(0)); - humanDecks.add(d.getHumanDeck()); - } - - view.getLstHumanDecks().setDecks(humanDecks); - } - - /** Build button has been pressed. */ - public void setupSealed() { - ArrayList sealedTypes = new ArrayList(); - sealedTypes.add("Full Cardpool"); - sealedTypes.add("Block / Set"); - sealedTypes.add("Custom"); - - final String prompt = "Choose Sealed Deck Format:"; - final Object o = GuiUtils.chooseOne(prompt, sealedTypes.toArray()); - - SealedDeck sd = null; - - if (o.toString().equals(sealedTypes.get(0))) { - sd = new SealedDeck("Full"); - } - - else if (o.toString().equals(sealedTypes.get(1))) { - sd = new SealedDeck("Block"); - } - - else if (o.toString().equals(sealedTypes.get(2))) { - sd = new SealedDeck("Custom"); - } - else { - throw new IllegalStateException("choice <<" + UtilFunctions.safeToString(o) - + ">> does not equal any of the sealedTypes."); - } - - if (sd.getCardpool().isEmpty()) { - return; - } - - final String sDeckName = JOptionPane.showInputDialog(null, - ForgeProps.getLocalized(NewConstants.Lang.OldGuiNewGame.NewGameText.SAVE_SEALED_MSG), - ForgeProps.getLocalized(NewConstants.Lang.OldGuiNewGame.NewGameText.SAVE_SEALED_TTL), - JOptionPane.QUESTION_MESSAGE); - - if (StringUtils.isBlank(sDeckName)) { - return; - } - - // May check for name uniqueness here - - final ItemPool sDeck = sd.getCardpool(); - - Deck deck = new Deck(sDeckName); - deck.getSideboard().addAll(sDeck); - - for (final String element : Constant.Color.BASIC_LANDS) { - deck.getSideboard().add(element, sd.getLandSetCode()[0], 18); - } - - DeckGroup sealed = new DeckGroup(sDeckName); - sealed.setHumanDeck(deck); - sealed.addAiDeck(sd.buildAIDeck(sDeck.toForgeCardList())); - Singletons.getModel().getDecks().getSealed().add(sealed); - - Singletons.getControl().getControlHome().getControlUtilities().showDeckEditor(GameType.Sealed, sealed); - - } - - /** @return {@link forge.Command} What to do when the deck editor exits. */ - public Command getExitCommand() { - Command exit = new Command() { - private static final long serialVersionUID = -9133358399503226853L; - - @Override - public void execute() { - updateDeckLists(); - } - }; - - return exit; - } -} diff --git a/src/main/java/forge/control/home/ControlSettings.java b/src/main/java/forge/control/home/ControlSettings.java deleted file mode 100644 index b3eef177dc1..00000000000 --- a/src/main/java/forge/control/home/ControlSettings.java +++ /dev/null @@ -1,238 +0,0 @@ -package forge.control.home; - -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; - -import javax.swing.ImageIcon; -import javax.swing.JPanel; -import javax.swing.SwingWorker; -import javax.swing.event.ListSelectionEvent; -import javax.swing.event.ListSelectionListener; - -import forge.Command; -import forge.Constant; -import forge.Singletons; -import forge.control.FControl; -import forge.properties.ForgePreferences; -import forge.properties.ForgePreferences.FPref; -import forge.view.home.ViewSettings; -import forge.view.toolbox.FSkin; - -/** - * Controls logic and listeners for Settings panel of the home screen. - * - * Saving of preferences happens at every state change in FControl. - */ -public class ControlSettings { - private ViewSettings view; - private ForgePreferences prefs; - private JPanel selectedTab; - private final MouseListener madPreferences, madAvatars; - - /** - * - * Controls logic and listeners for Settings panel of the home screen. - * - * @param v0   ViewSettings - */ - public ControlSettings(ViewSettings v0) { - this.view = v0; - view.updateSkinNames(); - - addListeners(); - prefs = Singletons.getModel().getPreferences(); - - view.getCbRemoveSmall().setSelected(prefs.getPrefBoolean(FPref.DECKGEN_NOSMALL)); - view.getCbSingletons().setSelected(prefs.getPrefBoolean(FPref.DECKGEN_SINGLETONS)); - view.getCbRemoveArtifacts().setSelected(prefs.getPrefBoolean(FPref.DECKGEN_ARTIFACTS)); - view.getCbAnte().setSelected(prefs.getPrefBoolean(FPref.UI_ANTE)); - view.getCbUploadDraft().setSelected(prefs.getPrefBoolean(FPref.UI_UPLOAD_DRAFT)); - view.getCbStackLand().setSelected(prefs.getPrefBoolean(FPref.UI_SMOOTH_LAND)); - view.getCbDevMode().setSelected(prefs.getPrefBoolean(FPref.DEV_MODE_ENABLED)); - view.getCbRandomFoil().setSelected(prefs.getPrefBoolean(FPref.UI_RANDOM_FOIL)); - view.getCbScaleLarger().setSelected(prefs.getPrefBoolean(FPref.UI_SCALE_LARGER)); - view.getCbTextMana().setSelected(prefs.getPrefBoolean(FPref.UI_CARD_OVERLAY)); - - madPreferences = new MouseAdapter() { @Override - public void mouseClicked(MouseEvent e) { view.showPrefsTab(); } }; - - madAvatars = new MouseAdapter() { @Override - public void mouseClicked(MouseEvent e) { view.showAvatarsTab(); } }; - - view.getTabPrefs().removeMouseListener(madPreferences); - view.getTabPrefs().addMouseListener(madPreferences); - - view.getTabAvatars().removeMouseListener(madAvatars); - view.getTabAvatars().addMouseListener(madAvatars); - } - - /** @return ViewSettings */ - public ViewSettings getView() { - return view; - } - - /** */ - @SuppressWarnings("serial") - public void addListeners() { - this.view.getLstChooseSkin().addListSelectionListener(new ListSelectionListener() { - @Override - public void valueChanged(ListSelectionEvent e) { - if (e.getValueIsAdjusting()) { return; } - updateSkin(); - } - }); - - this.view.getCbAnte().addActionListener(new ActionListener() { - @Override - public void actionPerformed(final ActionEvent arg0) { - final boolean toggle = ControlSettings.this.view.getCbAnte().isSelected(); - prefs.setPref(FPref.UI_ANTE, String.valueOf(toggle)); - prefs.save(); - } - }); - - this.view.getCbScaleLarger().addActionListener(new ActionListener() { - @Override - public void actionPerformed(final ActionEvent arg0) { - final boolean toggle = ControlSettings.this.view.getCbScaleLarger().isSelected(); - prefs.setPref(FPref.UI_SCALE_LARGER, String.valueOf(toggle)); - prefs.save(); - } - }); - - this.view.getCbDevMode().addActionListener(new ActionListener() { - @Override - public void actionPerformed(final ActionEvent arg0) { - final boolean toggle = ControlSettings.this.view.getCbDevMode().isSelected(); - prefs.setPref(FPref.DEV_MODE_ENABLED, String.valueOf(toggle)); - Constant.Runtime.DEV_MODE[0] = toggle; - prefs.save(); - } - }); - - this.view.getCbRemoveSmall().addActionListener(new ActionListener() { - @Override - public void actionPerformed(final ActionEvent arg0) { - final boolean toggle = ControlSettings.this.view.getCbRemoveSmall().isSelected(); - prefs.setPref(FPref.DECKGEN_NOSMALL, String.valueOf(toggle)); - prefs.save(); - } - }); - - this.view.getCbRemoveArtifacts().addActionListener(new ActionListener() { - @Override - public void actionPerformed(final ActionEvent arg0) { - final boolean toggle = ControlSettings.this.view.getCbRemoveArtifacts().isSelected(); - prefs.setPref(FPref.DECKGEN_ARTIFACTS, String.valueOf(toggle)); - prefs.save(); - } - }); - - this.view.getCbSingletons().addActionListener(new ActionListener() { - @Override - public void actionPerformed(final ActionEvent arg0) { - final boolean toggle = ControlSettings.this.view.getCbSingletons().isSelected(); - prefs.setPref(FPref.DECKGEN_SINGLETONS, String.valueOf(toggle)); - prefs.save(); - } - }); - - this.view.getCbUploadDraft().addActionListener(new ActionListener() { - @Override - public void actionPerformed(final ActionEvent arg0) { - final boolean toggle = ControlSettings.this.view.getCbUploadDraft().isSelected(); - prefs.setPref(FPref.UI_UPLOAD_DRAFT , String.valueOf(toggle)); - Constant.Runtime.UPLOAD_DRAFT[0] = toggle; - prefs.save(); - } - }); - - this.view.getCbStackLand().addActionListener(new ActionListener() { - @Override - public void actionPerformed(final ActionEvent arg0) { - final boolean toggle = ControlSettings.this.view.getCbStackLand().isSelected(); - prefs.setPref(FPref.UI_SMOOTH_LAND, String.valueOf(toggle)); - Constant.Runtime.SMOOTH[0] = toggle; - prefs.save(); - } - }); - - this.view.getCbRandomFoil().addActionListener(new ActionListener() { - @Override - public void actionPerformed(final ActionEvent arg0) { - final boolean toggle = ControlSettings.this.view.getCbRandomFoil().isSelected(); - prefs.setPref(FPref.UI_RANDOM_FOIL, String.valueOf(toggle)); - Constant.Runtime.RANDOM_FOIL[0] = toggle; - prefs.save(); - } - }); - - this.view.getCbTextMana().addActionListener(new ActionListener() { - @Override - public void actionPerformed(final ActionEvent arg0) { - final boolean toggle = ControlSettings.this.view.getCbTextMana().isSelected(); - prefs.setPref(FPref.UI_CARD_OVERLAY, String.valueOf(toggle)); - prefs.save(); - } - }); - - this.view.getBtnReset().setCommand(new Command() { - @Override - public void execute() { - Singletons.getModel().getPreferences().reset(); - Singletons.getView().getViewHome().resetSettings(); - } - }); - } - - /** - * Updates visual state of tabber. - * @param tab0   JPanel tab object (can pass SubTab too). - */ - public void updateTabber(JPanel tab0) { - if (selectedTab != null) { - selectedTab.setEnabled(false); - } - - tab0.setEnabled(true); - selectedTab = tab0; - } - - private void updateSkin() { - view.getLblTitleSkin().setText(" Loading..."); - view.getLblTitleSkin().setIcon(new ImageIcon("res/images/skins/default/loader.gif")); - - final String name = view.getLstChooseSkin().getSelectedValue().toString(); - - final SwingWorker w = new SwingWorker() { - @Override - public String doInBackground() { - FSkin.loadLight(name); - FSkin.loadFull(); - - prefs.setPref(FPref.UI_SKIN, name); - prefs.save(); - return null; - } - - @Override - protected void done() { - Singletons.getView().instantiateCachedUIStates(); - Singletons.getControl().changeState(FControl.HOME_SCREEN); - Singletons.getView().getViewHome().showSettingsMenu(); - } - }; - w.execute(); - } - - /** @param rad0   JRadioButton - * @throws Exception */ - /*public void updateCardSize(JRadioButton rad0) throws Exception { - CardSizeType cst = CardSizeType.valueOf(rad0.getText().toLowerCase()); - Singletons.getModel().getPreferences().setPref(FPref.UI_CARD_SIZE, cst.toString()); - prefs.save(); - }*/ -} diff --git a/src/main/java/forge/control/home/ControlUtilities.java b/src/main/java/forge/control/home/ControlUtilities.java deleted file mode 100644 index fc46c292303..00000000000 --- a/src/main/java/forge/control/home/ControlUtilities.java +++ /dev/null @@ -1,230 +0,0 @@ -/* - * Forge: Play Magic: the Gathering. - * Copyright (C) 2011 Nate - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package forge.control.home; - -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; - -import javax.swing.JOptionPane; -import javax.swing.JScrollPane; -import javax.swing.JTextArea; - -import forge.Command; -import forge.GuiDownloadPicturesLQ; -import forge.GuiDownloadPrices; -import forge.GuiDownloadQuestImages; -import forge.GuiDownloadSetPicturesLQ; -import forge.GuiImportPicture; -import forge.Singletons; -import forge.deck.DeckBase; -import forge.error.BugzReporter; -import forge.game.GameType; -import forge.gui.deckeditor.DeckEditorBase; -import forge.gui.deckeditor.DeckEditorConstructed; -import forge.gui.deckeditor.DeckEditorLimited; -import forge.properties.ForgeProps; -import forge.properties.NewConstants.Lang; -import forge.view.home.ViewUtilities; -import forge.view.toolbox.FSkin; - -/** - * Controls logic and listeners for Utilities panel of the home screen. - * - */ -public class ControlUtilities { - private final ViewUtilities view; - private final MouseListener madLicensing; - private final Command cmdDeckEditor, cmdPicDownload, cmdSetDownload, cmdQuestImages, cmdReportBug, - cmdImportPictures, cmdHowToPlay, cmdDownloadPrices; - - /** - * - * Controls logic and listeners for Utilities panel of the home screen. - * - * @param v0 - *   ViewUtilities - */ - @SuppressWarnings("serial") - public ControlUtilities(final ViewUtilities v0) { - this.view = v0; - - this.madLicensing = new MouseAdapter() { - @Override - public void mouseClicked(final MouseEvent e) { - ControlUtilities.this.view.showLicensing(); - } - - @Override - public void mouseEntered(final MouseEvent e) { - ControlUtilities.this.view.getLblLicensing().setForeground(FSkin.getColor(FSkin.Colors.CLR_HOVER)); - } - - @Override - public void mouseExited(final MouseEvent e) { - ControlUtilities.this.view.getLblLicensing().setForeground(FSkin.getColor(FSkin.Colors.CLR_TEXT)); - } - }; - - this.cmdDeckEditor = new Command() { - @Override - public void execute() { - ControlUtilities.this.showDeckEditor(GameType.Constructed, null); - } - }; - - this.cmdPicDownload = new Command() { - @Override - public void execute() { - ControlUtilities.this.doDownloadPics(); - } - }; - - this.cmdSetDownload = new Command() { - @Override - public void execute() { - ControlUtilities.this.doDownloadSetPics(); - } - }; - - this.cmdQuestImages = new Command() { - @Override - public void execute() { - ControlUtilities.this.doDownloadQuestImages(); - } - }; - - this.cmdReportBug = new Command() { - @Override - public void execute() { - final BugzReporter br = new BugzReporter(); - br.setVisible(true); - } - }; - - this.cmdImportPictures = new Command() { - @Override - public void execute() { - final GuiImportPicture ip = new GuiImportPicture(null); - ip.setVisible(true); - } - }; - - this.cmdHowToPlay = new Command() { - @Override - public void execute() { - final String text = ForgeProps.getLocalized(Lang.HowTo.MESSAGE); - - final JTextArea area = new JTextArea(text, 25, 40); - area.setWrapStyleWord(true); - area.setLineWrap(true); - area.setEditable(false); - area.setOpaque(false); - - JOptionPane.showMessageDialog(null, new JScrollPane(area), ForgeProps.getLocalized(Lang.HowTo.TITLE), - JOptionPane.INFORMATION_MESSAGE); - } - }; - - this.cmdDownloadPrices = new Command() { - @Override - public void execute() { - final GuiDownloadPrices gdp = new GuiDownloadPrices(); - gdp.setVisible(true); - } - }; - - this.addListeners(); - } - - /** - * Gets the view. - * - * @return ViewUtilities - */ - public ViewUtilities getView() { - return this.view; - } - - /** - * Adds the listeners. - */ - public void addListeners() { - this.view.getBtnDownloadPics().setCommand(this.cmdPicDownload); - this.view.getBtnDownloadSetPics().setCommand(this.cmdSetDownload); - this.view.getBtnDownloadQuestImages().setCommand(this.cmdQuestImages); - this.view.getBtnReportBug().setCommand(this.cmdReportBug); - this.view.getBtnImportPictures().setCommand(this.cmdImportPictures); - this.view.getBtnHowToPlay().setCommand(this.cmdHowToPlay); - this.view.getBtnDownloadPrices().setCommand(this.cmdDownloadPrices); - this.view.getBtnDeckEditor().setCommand(this.cmdDeckEditor); - - this.view.getLblLicensing().removeMouseListener(this.madLicensing); - this.view.getLblLicensing().addMouseListener(this.madLicensing); - } - - private void doDownloadPics() { - new GuiDownloadPicturesLQ(null); - } - - private void doDownloadSetPics() { - new GuiDownloadSetPicturesLQ(null); - } - - private void doDownloadQuestImages() { - new GuiDownloadQuestImages(null); - } - - /** - * Show deck editor. - * - * @param the generic type - * @param gt0   GameType - * @param d0   Deck - */ - @SuppressWarnings("unchecked") - public void showDeckEditor(final GameType gt0, final T d0) { - - DeckEditorBase editor = null; - if (gt0 == GameType.Constructed) { - editor = (DeckEditorBase) new DeckEditorConstructed(); - } else if (gt0 == GameType.Draft) { - editor = (DeckEditorBase) new DeckEditorLimited(Singletons.getModel().getDecks().getDraft()); - } else if (gt0 == GameType.Sealed) { - editor = (DeckEditorBase) new DeckEditorLimited(Singletons.getModel().getDecks().getSealed()); - } - - final Command exit = new Command() { - private static final long serialVersionUID = -9133358399503226853L; - - @Override - public void execute() { - Singletons.getControl().getControlHome().getControlConstructed().updateDeckLists(); - // view.getParentView().getControlSealed().updateDeckLists(); - } - }; - - editor.show(exit); - - if (d0 != null) { - editor.getController().setModel(d0); - } - - editor.setVisible(true); - } -} diff --git a/src/main/java/forge/control/home/package-info.java b/src/main/java/forge/control/home/package-info.java deleted file mode 100644 index c661e02554a..00000000000 --- a/src/main/java/forge/control/home/package-info.java +++ /dev/null @@ -1,3 +0,0 @@ -/** Controller (as in model-view-controller) for Forge. */ -package forge.control.home; - diff --git a/src/main/java/forge/game/limited/SealedDeck.java b/src/main/java/forge/game/limited/SealedDeck.java index 8bfdbbd03b5..48e66a46aca 100644 --- a/src/main/java/forge/game/limited/SealedDeck.java +++ b/src/main/java/forge/game/limited/SealedDeck.java @@ -423,7 +423,7 @@ public class SealedDeck { if (deck.get(i).getName().equals("Plains") || deck.get(i).getName().equals("Island") || deck.get(i).getName().equals("Swamp") || deck.get(i).getName().equals("Mountain") || deck.get(i).getName().equals("Forest")) { - System.out.println("Heyo!"); + //System.out.println("Heyo!"); } aiDeck.getMain().add(deck.get(i)); } diff --git a/src/main/java/forge/gui/GuiUtils.java b/src/main/java/forge/gui/GuiUtils.java index fee241003f0..9ab3f1d300f 100644 --- a/src/main/java/forge/gui/GuiUtils.java +++ b/src/main/java/forge/gui/GuiUtils.java @@ -36,9 +36,11 @@ import java.util.List; import javax.swing.Box; import javax.swing.ImageIcon; import javax.swing.JButton; +import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.SwingUtilities; +import javax.swing.Timer; import javax.swing.border.LineBorder; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; @@ -62,6 +64,7 @@ import forge.view.toolbox.FSkin; * @version $Id$ */ public final class GuiUtils { + private static int counter = 0; private GuiUtils() { throw new AssertionError(); @@ -427,6 +430,43 @@ public final class GuiUtils { return overlay; } + /** @param msg0   {@link java.lang.String} + @return {@forge.view.toolbox.FOverlay} */ + // NOTE: This animation happens on the EDT; if the EDT is tied up doing something + // else, the animation is effectively frozen. So, this needs some work. + public static FOverlay loadingOverlay(final String msg0) { + final FOverlay overlay = GuiUtils.genericOverlay(); + final FPanel pnlLoading = new FPanel(); + final int w = overlay.getWidth(); + final int h = overlay.getHeight(); + + final JLabel lblLoading = new JLabel(""); + lblLoading.setOpaque(true); + lblLoading.setBackground(FSkin.getColor(FSkin.Colors.CLR_TEXT)); + lblLoading.setMinimumSize(new Dimension(0, 20)); + + pnlLoading.setBounds((int) ((w - 170) / 2), (int) ((h - 80) / 2), 170, 80); + pnlLoading.setLayout(new MigLayout("wrap, align center")); + pnlLoading.add(new FLabel.Builder().fontSize(18) + .fontScaleAuto(false).text(msg0).build(), "h 20px!, w 140px!, gap 0 0 5px 0"); + pnlLoading.add(lblLoading, "gap 0 0 0 10px"); + + overlay.add(pnlLoading); + + GuiUtils.counter = 0; + final Timer timer = new Timer(300, new ActionListener() { + @Override + public void actionPerformed(ActionEvent arg0) { + lblLoading.setMinimumSize(new Dimension(10 * (GuiUtils.counter++), 20)); + lblLoading.revalidate(); + if (GuiUtils.counter > 13) { GuiUtils.counter = 0; } + } + }); + timer.start(); + + return overlay; + } + /** @return {@forge.view.toolbox.FOverlay} */ public static FOverlay genericOverlay() { final FOverlay overlay = Singletons.getView().getOverlay(); diff --git a/src/main/java/forge/gui/deckeditor/DeckEditorConstructed.java b/src/main/java/forge/gui/deckeditor/DeckEditorConstructed.java index fb2e378ee9d..16381be3023 100644 --- a/src/main/java/forge/gui/deckeditor/DeckEditorConstructed.java +++ b/src/main/java/forge/gui/deckeditor/DeckEditorConstructed.java @@ -91,7 +91,9 @@ public final class DeckEditorConstructed extends DeckEditorBase { ForgeProps.getLocalized(GuiBoosterDraft.CLOSE_MESSAGE), "", JOptionPane.YES_NO_OPTION); if (n == JOptionPane.YES_OPTION) { DraftingProcess.this.dispose(); - Singletons.getControl().getControlHome().getControlDraft().updateHumanDecks(); + CSubmenuDraft.SINGLETON_INSTANCE.update(); + GuiUtils.closeOverlay(); } } // windowClosing() }); @@ -336,10 +337,9 @@ public class DraftingProcess extends DeckEditorBase { // here // close and open next screen - this.dispose(); - - Singletons.getControl().getControlHome().getControlDraft().updateHumanDecks(); - + DraftingProcess.this.dispose(); + CSubmenuDraft.SINGLETON_INSTANCE.update(); + GuiUtils.closeOverlay(); } /* saveDraft() */ /* @@ -386,5 +386,6 @@ public class DraftingProcess extends DeckEditorBase { this.getBottomTableWithCards().sort(1, true); this.setVisible(true); + this.setAlwaysOnTop(true); } } diff --git a/src/main/java/forge/gui/home/EMenuGroup.java b/src/main/java/forge/gui/home/EMenuGroup.java index 3d07c5e93ac..4b2c8f1d59c 100644 --- a/src/main/java/forge/gui/home/EMenuGroup.java +++ b/src/main/java/forge/gui/home/EMenuGroup.java @@ -6,9 +6,16 @@ package forge.gui.home; * and collapsing in the menu. */ public enum EMenuGroup { /** */ - CONSTRUCTED, /** */ - LIMITED, /** */ - QUEST, /** */ - SETTINGS, /** */ - UTILITIES; + SANCTIONED ("Sanctioned Game Formats"), /** */ + QUEST ("Quest Mode"), /** */ + SETTINGS ("Game Settings"), /** */ + UTILITIES ("Tools"); + + private final String strTitle; + + /** @param {@link java.lang.String} */ + private EMenuGroup(final String s0) { strTitle = s0; } + + /** @return {@link java.lang.String} */ + public String getTitle() { return this.strTitle; } } diff --git a/src/main/java/forge/gui/home/EMenuItem.java b/src/main/java/forge/gui/home/EMenuItem.java new file mode 100644 index 00000000000..d8e457c1bfd --- /dev/null +++ b/src/main/java/forge/gui/home/EMenuItem.java @@ -0,0 +1,23 @@ +package forge.gui.home; + +/** + * TODO: Write javadoc for this type. + * + */ +public enum EMenuItem { /** */ + CONSTRUCTED, /** */ + LIMITED_DRAFT, /** */ + LIMITED_SEALED, /** */ + + QUEST_CHALLENGES, /** */ + QUEST_DUELS, /** */ + QUEST_DATA, /** */ + QUEST_DECKS, /** */ + QUEST_PREFS, /** */ + + SETTINGS_PREFS, /** */ + SETTINGS_AVATARS, /** */ + + UTILITIES_EDITOR, /** */ + UTILITIES_DOWNLOADS +} diff --git a/src/main/java/forge/gui/home/ICSubmenu.java b/src/main/java/forge/gui/home/ICSubmenu.java index 003cb25e758..c55fc64ca89 100644 --- a/src/main/java/forge/gui/home/ICSubmenu.java +++ b/src/main/java/forge/gui/home/ICSubmenu.java @@ -2,9 +2,15 @@ package forge.gui.home; import forge.Command; + /** Dictates methods required for a submenu controller. */ public interface ICSubmenu { - /** @return {@link forge.Command} */ + /** Fires when a menu is selected. Avoid any reference + * referring to ViewHomeUI in this method, because + * it is triggered when ViewHomeUI is initialized, which + * will create an NPE. + * + * @return {@link forge.Command} */ Command getMenuCommand(); /** Call this method after the view singleton has been fully realized diff --git a/src/main/java/forge/gui/home/IVSubmenu.java b/src/main/java/forge/gui/home/IVSubmenu.java index 41dbef9e7f4..dea1c9748e0 100644 --- a/src/main/java/forge/gui/home/IVSubmenu.java +++ b/src/main/java/forge/gui/home/IVSubmenu.java @@ -8,11 +8,24 @@ public interface IVSubmenu { * @return {@link javax.swing.JPanel} */ JPanel getPanel(); + /** Retrives control object associated with this instance. + * @return {@link forge.gui.home.ICSubmenu} + */ + ICSubmenu getControl(); + /** Returns parent menu grouping of this submenu, useful for * functions such as expanding and collapsing in the menu area. * * @return {@link javax.swing.JPanel} */ - EMenuGroup getGroup(); + EMenuGroup getGroupEnum(); + + /** Display title string for this menu item. + * @return {@link java.lang.String} */ + String getMenuTitle(); + + /** Enum registration for this menu item, in EMenuItem. + * @return {@link java.lang.String} */ + String getItemEnum(); /** Removes all children and (re)populates panel components, independent of constructor.*/ void populate(); diff --git a/src/main/java/forge/view/home/StartButton.java b/src/main/java/forge/gui/home/StartButton.java similarity index 92% rename from src/main/java/forge/view/home/StartButton.java rename to src/main/java/forge/gui/home/StartButton.java index e245de5da1d..f6c2705c833 100644 --- a/src/main/java/forge/view/home/StartButton.java +++ b/src/main/java/forge/gui/home/StartButton.java @@ -1,4 +1,4 @@ -package forge.view.home; +package forge.gui.home; import javax.swing.JButton; diff --git a/src/main/java/forge/gui/home/constructed/CSubmenuColors.java b/src/main/java/forge/gui/home/constructed/CSubmenuColors.java deleted file mode 100644 index 89879ff9fa0..00000000000 --- a/src/main/java/forge/gui/home/constructed/CSubmenuColors.java +++ /dev/null @@ -1,81 +0,0 @@ -package forge.gui.home.constructed; - -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.util.HashMap; -import java.util.Map; - -import javax.swing.JList; -import javax.swing.SwingUtilities; - -import forge.Command; -import forge.gui.home.ICSubmenu; - -/** - * TODO: Write javadoc for this type. - * - */ -public enum CSubmenuColors implements ICSubmenu { - /** */ - SINGLETON_INSTANCE; - - private final Map colorVals = new HashMap(); - - private CSubmenuColors() { - colorVals.clear(); - colorVals.put("Random 1", "AI"); - colorVals.put("Random 2", "AI"); - colorVals.put("Random 3", "AI"); - colorVals.put("Random 4", "AI"); - colorVals.put("Black", "black"); - colorVals.put("Blue", "blue"); - colorVals.put("Green", "green"); - colorVals.put("Red", "red"); - colorVals.put("White", "white"); - } - - /* (non-Javadoc) - * @see forge.control.home.IControlSubmenu#update() - */ - @Override - public void initialize() { - VSubmenuColors.SINGLETON_INSTANCE.populate(); - CSubmenuColors.SINGLETON_INSTANCE.update(); - - for (final JList lst : VSubmenuColors.SINGLETON_INSTANCE.getLists()) { - SubmenuConstructedUtil.randomSelect(lst); - } - - VSubmenuColors.SINGLETON_INSTANCE.getBtnStart().addMouseListener( - new MouseAdapter() { - @Override - public void mouseReleased(final MouseEvent e) { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - SubmenuConstructedUtil.startGame(VSubmenuColors.SINGLETON_INSTANCE.getLists()); - } - }); - } - }); - } - - /* (non-Javadoc) - * @see forge.control.home.IControlSubmenu#getCommand() - */ - @Override - public Command getMenuCommand() { - return null; - } - - /* (non-Javadoc) - * @see forge.control.home.IControlSubmenu#update() - */ - @Override - public void update() { - for (final JList lst : VSubmenuColors.SINGLETON_INSTANCE.getLists()) { - lst.setListData(new String[] {"Random 1", "Random 2", "Random 3", - "Random 4", "Black", "Blue", "Green", "Red", "White"}); - } - } -} diff --git a/src/main/java/forge/gui/home/constructed/CSubmenuCustom.java b/src/main/java/forge/gui/home/constructed/CSubmenuCustom.java deleted file mode 100644 index ec572b26e74..00000000000 --- a/src/main/java/forge/gui/home/constructed/CSubmenuCustom.java +++ /dev/null @@ -1,78 +0,0 @@ -package forge.gui.home.constructed; - -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.util.ArrayList; -import java.util.List; - -import javax.swing.JList; -import javax.swing.SwingUtilities; - -import forge.Command; -import forge.Singletons; -import forge.deck.Deck; -import forge.gui.home.ICSubmenu; -import forge.util.IStorage; - -/** - * TODO: Write javadoc for this type. - * - */ -public enum CSubmenuCustom implements ICSubmenu { - /** */ - SINGLETON_INSTANCE; - - /* (non-Javadoc) - * @see forge.control.home.IControlSubmenu#getMenuCommand() - */ - @Override - public Command getMenuCommand() { - return null; - } - - /* (non-Javadoc) - * @see forge.control.home.IControlSubmenu#initialize() - */ - @Override - public void initialize() { - VSubmenuCustom.SINGLETON_INSTANCE.populate(); - CSubmenuCustom.SINGLETON_INSTANCE.update(); - - for (JList lst : VSubmenuCustom.SINGLETON_INSTANCE.getLists()) { - SubmenuConstructedUtil.randomSelect(lst); - - lst.addMouseListener(new MouseAdapter() { @Override - public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) { - final String deckName = ((JList) e.getSource()).getSelectedValue().toString(); - SubmenuConstructedUtil.showDecklist(Singletons.getModel().getDecks().getConstructed().get(deckName)); - } } }); - } - - VSubmenuCustom.SINGLETON_INSTANCE.getBtnStart().addMouseListener( - new MouseAdapter() { - @Override - public void mouseReleased(final MouseEvent e) { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - SubmenuConstructedUtil.startGame(VSubmenuCustom.SINGLETON_INSTANCE.getLists()); - } - }); - } - }); - } - - /* (non-Javadoc) - * @see forge.control.home.IControlSubmenu#update() - */ - @Override - public void update() { - final List customNames = new ArrayList(); - final IStorage allDecks = Singletons.getModel().getDecks().getConstructed(); - for (final Deck d : allDecks) { customNames.add(d.getName()); } - - for (JList lst : VSubmenuCustom.SINGLETON_INSTANCE.getLists()) { - lst.setListData(SubmenuConstructedUtil.oa2sa(customNames.toArray())); - } - } -} diff --git a/src/main/java/forge/gui/home/constructed/CSubmenuQuestEvents.java b/src/main/java/forge/gui/home/constructed/CSubmenuQuestEvents.java deleted file mode 100644 index 37680fac22d..00000000000 --- a/src/main/java/forge/gui/home/constructed/CSubmenuQuestEvents.java +++ /dev/null @@ -1,85 +0,0 @@ -package forge.gui.home.constructed; - -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.util.ArrayList; -import java.util.List; - -import javax.swing.JList; -import javax.swing.SwingUtilities; - -import forge.Command; -import forge.Singletons; -import forge.gui.home.ICSubmenu; -import forge.quest.data.QuestEvent; - -/** - * TODO: Write javadoc for this type. - * - */ -public enum CSubmenuQuestEvents implements ICSubmenu { - /** */ - SINGLETON_INSTANCE; - - /* (non-Javadoc) - * @see forge.control.home.IControlSubmenu#getMenuCommand() - */ - @Override - public Command getMenuCommand() { - return null; - } - - /* (non-Javadoc) - * @see forge.control.home.IControlSubmenu#initialize() - */ - @Override - public void initialize() { - VSubmenuQuestEvents.SINGLETON_INSTANCE.populate(); - CSubmenuQuestEvents.SINGLETON_INSTANCE.update(); - - for (JList lst : VSubmenuQuestEvents.SINGLETON_INSTANCE.getLists()) { - SubmenuConstructedUtil.randomSelect(lst); - - lst.addMouseListener(new MouseAdapter() { @Override - public void mouseClicked(MouseEvent e) { - if (e.getClickCount() == 2) { - final String deckName = ((JList) e.getSource()).getSelectedValue().toString(); - Singletons.getModel().getQuestEventManager().getEvent(deckName); - SubmenuConstructedUtil.showDecklist(Singletons.getModel().getQuestEventManager().getEvent(deckName).getEventDeck()); - } } }); - } - - VSubmenuQuestEvents.SINGLETON_INSTANCE.getBtnStart().addMouseListener( - new MouseAdapter() { - @Override - public void mouseReleased(final MouseEvent e) { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - SubmenuConstructedUtil.startGame(VSubmenuQuestEvents.SINGLETON_INSTANCE.getLists()); - } - }); - } - }); - } - - /* (non-Javadoc) - * @see forge.control.home.IControlSubmenu#update() - */ - @Override - public void update() { - final List eventNames = new ArrayList(); - - for (final QuestEvent e : Singletons.getModel().getQuestEventManager().getAllChallenges()) { - eventNames.add(e.getEventDeck().getName()); - } - - for (final QuestEvent e : Singletons.getModel().getQuestEventManager().getAllDuels()) { - eventNames.add(e.getEventDeck().getName()); - } - - for (JList lst : VSubmenuQuestEvents.SINGLETON_INSTANCE.getLists()) { - lst.setListData(SubmenuConstructedUtil.oa2sa(eventNames.toArray())); - } - } -} diff --git a/src/main/java/forge/gui/home/constructed/CSubmenuThemes.java b/src/main/java/forge/gui/home/constructed/CSubmenuThemes.java deleted file mode 100644 index c0860884751..00000000000 --- a/src/main/java/forge/gui/home/constructed/CSubmenuThemes.java +++ /dev/null @@ -1,68 +0,0 @@ -package forge.gui.home.constructed; - -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.util.ArrayList; -import java.util.List; - -import javax.swing.JList; -import javax.swing.SwingUtilities; - -import forge.Command; -import forge.deck.generate.GenerateThemeDeck; -import forge.gui.home.ICSubmenu; -/** - * TODO: Write javadoc for this type. - * - */ -public enum CSubmenuThemes implements ICSubmenu { - /** */ - SINGLETON_INSTANCE; - - /* (non-Javadoc) - * @see forge.control.home.IControlSubmenu#getMenuCommand() - */ - @Override - public Command getMenuCommand() { - return null; - } - - /* (non-Javadoc) - * @see forge.control.home.IControlSubmenu#initialize() - */ - @Override - public void initialize() { - VSubmenuThemes.SINGLETON_INSTANCE.populate(); - CSubmenuThemes.SINGLETON_INSTANCE.update(); - - for (final JList lst : VSubmenuThemes.SINGLETON_INSTANCE.getLists()) { - SubmenuConstructedUtil.randomSelect(lst); - } - - VSubmenuThemes.SINGLETON_INSTANCE.getBtnStart().addMouseListener( - new MouseAdapter() { - @Override - public void mouseReleased(final MouseEvent e) { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - SubmenuConstructedUtil.startGame(VSubmenuThemes.SINGLETON_INSTANCE.getLists()); - } - }); - } - }); - } - - /* (non-Javadoc) - * @see forge.control.home.IControlSubmenu#update() - */ - @Override - public void update() { - final List themeNames = new ArrayList(); - for (final String s : GenerateThemeDeck.getThemeNames()) { themeNames.add(s); } - - for (JList lst : VSubmenuThemes.SINGLETON_INSTANCE.getLists()) { - lst.setListData(SubmenuConstructedUtil.oa2sa(themeNames.toArray())); - } - } -} diff --git a/src/main/java/forge/gui/home/constructed/ESubmenuConstructedTypes.java b/src/main/java/forge/gui/home/constructed/ESubmenuConstructedTypes.java deleted file mode 100644 index cd5a8e1069b..00000000000 --- a/src/main/java/forge/gui/home/constructed/ESubmenuConstructedTypes.java +++ /dev/null @@ -1,12 +0,0 @@ -package forge.gui.home.constructed; - -/** - * TODO: Write javadoc for this type. - * - */ -public enum ESubmenuConstructedTypes { /** */ - COLORS, /** */ - THEMES, /** */ - CUSTOM, /** */ - QUESTEVENTS -} diff --git a/src/main/java/forge/gui/home/constructed/SubmenuConstructedUtil.java b/src/main/java/forge/gui/home/constructed/SubmenuConstructedUtil.java deleted file mode 100644 index a3d62996010..00000000000 --- a/src/main/java/forge/gui/home/constructed/SubmenuConstructedUtil.java +++ /dev/null @@ -1,386 +0,0 @@ -package forge.gui.home.constructed; - -import java.awt.Toolkit; -import java.awt.datatransfer.StringSelection; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Random; - -import javax.swing.JButton; -import javax.swing.JList; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.ListSelectionModel; - -import net.miginfocom.swing.MigLayout; -import forge.AllZone; -import forge.CardList; -import forge.Command; -import forge.Player; -import forge.PlayerType; -import forge.Singletons; -import forge.deck.Deck; -import forge.deck.generate.Generate2ColorDeck; -import forge.deck.generate.Generate3ColorDeck; -import forge.deck.generate.Generate5ColorDeck; -import forge.deck.generate.GenerateThemeDeck; -import forge.game.GameNew; -import forge.item.CardPrinted; -import forge.properties.ForgePreferences.FPref; -import forge.view.toolbox.FCheckBox; -import forge.view.toolbox.FLabel; -import forge.view.toolbox.FList; -import forge.view.toolbox.FOverlay; -import forge.view.toolbox.FPanel; -import forge.view.toolbox.FScrollPane; -import forge.view.toolbox.FSkin; - - - -/** - * Utilities for the constructed submenu, all over the MVC spectrum. - * If a piece of code can be reused, it's dumped here. - */ -public class SubmenuConstructedUtil { - /** - * @param pnlParent   JPanel, where to put the finished lists - * @param btnStart   Start button for the panel - * @return List completed collection of JLists - */ - public static List populateConstructedSubmenuView(final JPanel pnlParent, final JButton btnStart) { - final List generatedJLists = new ArrayList(); - final String constraintsLst = "w 41%!, h 320px, gap 6% 0 4% 2%"; - final String constraintsBtn = "newline, ax center, gap 6% 0 0 0, span 2 1"; - final List players = AllZone.getPlayersInGame(); - pnlParent.removeAll(); - - pnlParent.setOpaque(false); - pnlParent.setLayout(new MigLayout("insets 0, gap 0")); - - final List storage = new ArrayList(); - for (int i = 0; i < players.size(); i++) { - storage.add(new CustomSelectPanel(players.get(i))); - generatedJLists.add(storage.get(storage.size() - 1).getList()); - - if (i % 2 == 1) { - pnlParent.add(storage.get(storage.size() - 1), constraintsLst + ", wrap"); - } - else { - pnlParent.add(storage.get(storage.size() - 1), constraintsLst); - } - } - storage.clear(); - - if (pnlParent.getName().equals(ESubmenuConstructedTypes.COLORS.toString()) - || pnlParent.getName() .equals(ESubmenuConstructedTypes.THEMES.toString())) { - final JPanel pnlOptions = new JPanel(); - pnlOptions.setOpaque(false); - SubmenuConstructedUtil.populateOptionsPanel(pnlOptions); - pnlParent.add(pnlOptions, "span 2 1, align center, gap 6% 0 0 0"); - } - - pnlParent.add(btnStart, constraintsBtn); - - return generatedJLists; - } - - /** Shows decklist dialog for a given deck. - * @param d0   {@link forge.deck.Deck} */ - public static void showDecklist(final Deck d0) { - final HashMap deckMap = new HashMap(); - - for (final Entry s : d0.getMain()) { - deckMap.put(s.getKey().getName(), s.getValue()); - } - - final String nl = System.getProperty("line.separator"); - final StringBuilder deckList = new StringBuilder(); - final String dName = d0.getName(); - - deckList.append(dName == null ? "" : dName + nl + nl); - - final ArrayList dmKeys = new ArrayList(); - for (final String s : deckMap.keySet()) { - dmKeys.add(s); - } - - Collections.sort(dmKeys); - - for (final String s : dmKeys) { - deckList.append(deckMap.get(s) + " x " + s + nl); - } - - final StringBuilder msg = new StringBuilder(); - if (deckMap.keySet().size() <= 32) { - msg.append(deckList.toString() + nl); - } else { - msg.append("Decklist too long for dialog." + nl + nl); - } - - msg.append("Copy Decklist to Clipboard?"); - - // Output - final int rcMsg = JOptionPane.showConfirmDialog(null, msg, "Decklist", JOptionPane.OK_CANCEL_OPTION); - if (rcMsg == JOptionPane.OK_OPTION) { - final StringSelection ss = new StringSelection(deckList.toString()); - Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss, null); - } - } // End showDecklist - - /** - * Exhaustively converts object array to string array. - * Probably a much easier way to do this. - * And, there must be a better place for this. - * - * @param o0   Object[] - * @return String[] - */ - public static String[] oa2sa(final Object[] o0) { - final String[] output = new String[o0.length]; - - for (int i = 0; i < o0.length; i++) { - output[i] = o0[i].toString(); - } - - return output; - } - - /** @param lst0   {@link javax.swing.JList} */ - public static void randomSelect(final JList lst0) { - if (lst0.getName().equals(ESubmenuConstructedTypes.COLORS.toString())) { - // Color select algorithm - int x = -1; - // HACK because 1 and 4 color decks are not supported yet. :( - while (x == -1 || x == 1 || x == 4) { - x = (int) Math.ceil(Math.random() * 5); - } - final int colorCount = x; - - final int maxCount = lst0.getModel().getSize(); - int[] selectedIndices = new int[colorCount]; - - x = -1; - for (int i = 0; i < colorCount; i++) { - while (x == -1) { - x = (int) Math.floor(Math.random() * maxCount); - if (Arrays.asList(selectedIndices).contains(x)) { x = -1; } - else { selectedIndices[i] = x; } - } - x = -1; - } - lst0.setSelectedIndices(selectedIndices); - selectedIndices = null; - } - else { - final int size = lst0.getModel().getSize(); - - if (size > 0) { - final Random r = new Random(); - final int i = r.nextInt(size); - - lst0.setSelectedIndex(i); - lst0.ensureIndexIsVisible(lst0.getSelectedIndex()); - } - } - } - - /** Generates deck from current list selection(s). */ - private static Deck generateDeck(final JList lst0, final PlayerType player0) { - CardList cards = null; - final String[] selection = oa2sa(lst0.getSelectedValues()); - final Deck deck; - - // Color deck - if (lst0.getName().equals("lstColor") && colorCheck(selection)) { - final Map colorVals = new HashMap(); - colorVals.put("Random 1", "AI"); - colorVals.put("Random 2", "AI"); - colorVals.put("Random 3", "AI"); - colorVals.put("Random 4", "AI"); - colorVals.put("Black", "black"); - colorVals.put("Blue", "blue"); - colorVals.put("Green", "green"); - colorVals.put("Red", "red"); - colorVals.put("White", "white"); - - // Replace "random" with "AI" for deck generation code - for (int i = 0; i < selection.length; i++) { - selection[i] = colorVals.get(selection[i]); - } - - // 2, 3, and 5 colors. - if (selection.length == 2) { - final Generate2ColorDeck gen = new Generate2ColorDeck( - selection[0], selection[1]); - cards = gen.get2ColorDeck(60, player0); - } - else if (selection.length == 3) { - final Generate3ColorDeck gen = new Generate3ColorDeck( - selection[0], selection[1], selection[2]); - cards = gen.get3ColorDeck(60, player0); - } - else { - final Generate5ColorDeck gen = new Generate5ColorDeck( - selection[0], selection[1], selection[2], selection[3], selection[4]); - cards = gen.get5ColorDeck(60, player0); - } - - // After generating card lists, build deck. - deck = new Deck(); - deck.getMain().add(cards); - colorVals.clear(); - } - - // Theme deck - else if (lst0.getName().equals(ESubmenuConstructedTypes.THEMES.toString())) { - final GenerateThemeDeck gen = new GenerateThemeDeck(); - cards = gen.getThemeDeck(selection[0], 60); - - // After generating card lists, build deck. - deck = new Deck(); - deck.getMain().add(cards); - } - else if (lst0.getName().equals(ESubmenuConstructedTypes.QUESTEVENTS.toString())) { - deck = Singletons.getModel().getQuestEventManager().getEvent(selection[0]).getEventDeck(); - } - // Custom deck - else { - deck = Singletons.getModel().getDecks().getConstructed().get(selection[0]); - } - - return deck; - } - - @SuppressWarnings("serial") - private static void populateOptionsPanel(final JPanel pnlParent) { - final FCheckBox cbSingletons = new FCheckBox("Singleton Mode"); - final FCheckBox cbArtifacts = new FCheckBox("Remove Artifacts"); - final FCheckBox cbRemoveSmall = new FCheckBox("Remove Small Creatures"); - final String constraints = "ax center, gap 0 0 0 5px"; - - cbSingletons.setSelected(Singletons.getModel() - .getPreferences().getPrefBoolean(FPref.DECKGEN_SINGLETONS)); - cbArtifacts.setSelected(Singletons.getModel() - .getPreferences().getPrefBoolean(FPref.DECKGEN_ARTIFACTS)); - cbRemoveSmall.setSelected(Singletons.getModel() - .getPreferences().getPrefBoolean(FPref.DECKGEN_NOSMALL)); - - // Event handling must occur here, unfortunately. - cbSingletons.setCommand(new Command() { - @Override - public void execute() { - Singletons.getModel().getPreferences().setPref( - FPref.DECKGEN_SINGLETONS, String.valueOf(cbSingletons.isSelected())); - } - }); - - cbArtifacts.setCommand(new Command() { - @Override - public void execute() { - Singletons.getModel().getPreferences().setPref( - FPref.DECKGEN_ARTIFACTS, String.valueOf(cbArtifacts.isSelected())); - } - }); - - cbRemoveSmall.setCommand(new Command() { - @Override - public void execute() { - Singletons.getModel().getPreferences().setPref( - FPref.DECKGEN_NOSMALL, String.valueOf(cbRemoveSmall.isSelected())); - } - }); - - pnlParent.removeAll(); - pnlParent.setLayout(new MigLayout("inset 0, gap 0, wrap")); - pnlParent.add(cbSingletons, constraints); - pnlParent.add(cbArtifacts, constraints); - pnlParent.add(cbRemoveSmall, constraints); - } - - /** - * Checks lengths of selected values for color lists - * to see if a deck generator exists. Alert and visual reminder if fail. - * - * @param colors0   String[] of color names - * @return boolean - */ - private static boolean colorCheck(final String[] colors0) { - boolean result = true; - - if (colors0.length == 1) { - JOptionPane.showMessageDialog(null, - "Sorry, single color generated decks aren't supported yet." - + "\n\rPlease choose at least one more color for this deck.", - "Generate deck: 1 color", JOptionPane.ERROR_MESSAGE); - result = false; - } - else if (colors0.length == 4) { - JOptionPane.showMessageDialog(null, - "Sorry, four color generated decks aren't supported yet." - + "\n\rPlease use 2, 3, or 5 colors for this deck.", - "Generate deck: 4 colors", JOptionPane.ERROR_MESSAGE); - result = false; - } - else if (colors0.length > 5) { - JOptionPane.showMessageDialog(null, - "Generate deck: maximum five colors!", - "Generate deck: too many colors", JOptionPane.ERROR_MESSAGE); - result = false; - } - return result; - } - - /** @param lists0   {@link java.util.List}<{@link javax.swing.JList}> */ - public static void startGame(final List lists0) { - final FOverlay overlay = Singletons.getView().getOverlay(); - overlay.setLayout(new MigLayout("insets 0, gap 0, align center")); - - final FPanel pnl = new FPanel(); - pnl.setLayout(new MigLayout("insets 0, gap 0, ax center, wrap")); - pnl.setBackground(FSkin.getColor(FSkin.Colors.CLR_ACTIVE)); - - pnl.add(new FLabel.Builder().icon(FSkin.getIcon(FSkin.ForgeIcons.ICO_LOGO)).build(), - "h 200px!, align center"); - pnl.add(new FLabel.Builder().text("Loading new game...") - .fontScaleAuto(false).fontSize(22).build(), "h 40px!, align center"); - - overlay.add(pnl, "h 300px!, w 400px!"); - - overlay.showOverlay(); - GameNew.newGame( - generateDeck(lists0.get(0), PlayerType.HUMAN), - generateDeck(lists0.get(1), PlayerType.COMPUTER)); - overlay.hideOverlay(); - } - - @SuppressWarnings("serial") - private static class CustomSelectPanel extends JPanel { - private final FList lst; - private final Command cmd = new Command() { @Override - public void execute() { randomSelect(lst); } }; - - public CustomSelectPanel(final Player p0) { - lst = new FList(); - lst.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - - this.setOpaque(false); - this.setLayout(new MigLayout("insets 0, gap 0, wrap")); - this.add(new FLabel.Builder().text(p0.getName()).fontSize(14) - .fontScaleAuto(false).build(), - "w 100%!, h 25px!, gap 0 0 0 8px"); - this.add(new FScrollPane(lst), "w 100%!, pushy, growy"); - this.add(new FLabel.Builder().text("Random").fontSize(14).opaque(true) - .cmdClick(cmd).hoverable(true).fontScaleAuto(false).build(), - "w 100%!, h 25px!, gap 0 0 8px 0"); - } - - public FList getList() { - return lst; - } - } -} diff --git a/src/main/java/forge/gui/home/constructed/VSubmenuColors.java b/src/main/java/forge/gui/home/constructed/VSubmenuColors.java deleted file mode 100644 index 23a1c95a895..00000000000 --- a/src/main/java/forge/gui/home/constructed/VSubmenuColors.java +++ /dev/null @@ -1,70 +0,0 @@ -package forge.gui.home.constructed; - -import java.util.ArrayList; -import java.util.List; - -import javax.swing.JButton; -import javax.swing.JList; -import javax.swing.JPanel; -import javax.swing.ListSelectionModel; - -import forge.gui.home.EMenuGroup; -import forge.gui.home.IVSubmenu; -import forge.view.home.StartButton; - -/** - * Singleton instance of "Colors" submenu in "Constructed" group. - * - */ -public enum VSubmenuColors implements IVSubmenu { - /** */ - SINGLETON_INSTANCE; - - /** */ - private final JPanel pnl = new JPanel(); - private final StartButton btnStart = new StartButton(); - private final List allLists = new ArrayList(); - - /* (non-Javadoc) - * @see forge.view.home.IViewSubmenu#populate() - */ - @Override - public void populate() { - pnl.setName(ESubmenuConstructedTypes.COLORS.toString()); - final List generatedLists = - SubmenuConstructedUtil.populateConstructedSubmenuView(pnl, btnStart); - - allLists.clear(); - for (JList lst : generatedLists) { - lst.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); - lst.setName(ESubmenuConstructedTypes.COLORS.toString()); - allLists.add(lst); - } - } - - /* (non-Javadoc) - * @see forge.view.home.IViewSubmenu#getGroup() - */ - @Override - public EMenuGroup getGroup() { - return EMenuGroup.CONSTRUCTED; - } - - /* (non-Javadoc) - * @see forge.view.home.IViewSubmenu#getPanel() - */ - @Override - public JPanel getPanel() { - return pnl; - } - - /** @return {@link javax.swing.JButton} */ - public JButton getBtnStart() { - return this.btnStart; - } - - /** @return {@link java.util.List}<{@link javax.swing.JList}> */ - public List getLists() { - return allLists; - } -} diff --git a/src/main/java/forge/gui/home/constructed/VSubmenuCustom.java b/src/main/java/forge/gui/home/constructed/VSubmenuCustom.java deleted file mode 100644 index 035cfe8f173..00000000000 --- a/src/main/java/forge/gui/home/constructed/VSubmenuCustom.java +++ /dev/null @@ -1,68 +0,0 @@ -package forge.gui.home.constructed; - -import java.util.ArrayList; -import java.util.List; - -import javax.swing.JButton; -import javax.swing.JList; -import javax.swing.JPanel; - -import forge.gui.home.EMenuGroup; -import forge.gui.home.IVSubmenu; -import forge.view.home.StartButton; - -/** - * Singleton instance of "Colors" submenu in "Constructed" group. - * - */ -public enum VSubmenuCustom implements IVSubmenu { - /** */ - SINGLETON_INSTANCE; - - /** */ - private final JPanel pnl = new JPanel(); - private final StartButton btnStart = new StartButton(); - private final List allLists = new ArrayList(); - - /* (non-Javadoc) - * @see forge.view.home.IViewSubmenu#populate() - */ - @Override - public void populate() { - pnl.setName(ESubmenuConstructedTypes.CUSTOM.toString()); - final List generatedLists = - SubmenuConstructedUtil.populateConstructedSubmenuView(pnl, btnStart); - - allLists.clear(); - for (JList lst : generatedLists) { - lst.setName(ESubmenuConstructedTypes.CUSTOM.toString()); - allLists.add(lst); - } - } - - /* (non-Javadoc) - * @see forge.view.home.IViewSubmenu#getGroup() - */ - @Override - public EMenuGroup getGroup() { - return EMenuGroup.CONSTRUCTED; - } - - /* (non-Javadoc) - * @see forge.view.home.IViewSubmenu#getPanel() - */ - @Override - public JPanel getPanel() { - return pnl; - } - - /** @return {@link javax.swing.JButton} */ - public JButton getBtnStart() { - return this.btnStart; - } - - /** @return {@link java.util.List}<{@link javax.swing.JList}> */ - public List getLists() { - return allLists; - } -} diff --git a/src/main/java/forge/gui/home/constructed/VSubmenuQuestEvents.java b/src/main/java/forge/gui/home/constructed/VSubmenuQuestEvents.java deleted file mode 100644 index 0b2c0bfe7f7..00000000000 --- a/src/main/java/forge/gui/home/constructed/VSubmenuQuestEvents.java +++ /dev/null @@ -1,68 +0,0 @@ -package forge.gui.home.constructed; - -import java.util.ArrayList; -import java.util.List; - -import javax.swing.JButton; -import javax.swing.JList; -import javax.swing.JPanel; - -import forge.gui.home.EMenuGroup; -import forge.gui.home.IVSubmenu; -import forge.view.home.StartButton; - -/** - * Singleton instance of "Colors" submenu in "Constructed" group. - * - */ -public enum VSubmenuQuestEvents implements IVSubmenu { - /** */ - SINGLETON_INSTANCE; - - /** */ - private final JPanel pnl = new JPanel(); - private final StartButton btnStart = new StartButton(); - private final List allLists = new ArrayList(); - - /* (non-Javadoc) - * @see forge.view.home.IViewSubmenu#populate() - */ - @Override - public void populate() { - pnl.setName(ESubmenuConstructedTypes.QUESTEVENTS.toString()); - final List generatedLists = - SubmenuConstructedUtil.populateConstructedSubmenuView(pnl, btnStart); - - allLists.clear(); - for (final JList lst : generatedLists) { - lst.setName(ESubmenuConstructedTypes.QUESTEVENTS.toString()); - allLists.add(lst); - } - } - - /* (non-Javadoc) - * @see forge.view.home.IViewSubmenu#getGroup() - */ - @Override - public EMenuGroup getGroup() { - return EMenuGroup.CONSTRUCTED; - } - - /* (non-Javadoc) - * @see forge.view.home.IViewSubmenu#getPanel() - */ - @Override - public JPanel getPanel() { - return pnl; - } - - /** @return {@link javax.swing.JButton} */ - public JButton getBtnStart() { - return this.btnStart; - } - - /** @return {@link java.util.List}<{@link javax.swing.JList}> */ - public List getLists() { - return allLists; - } -} diff --git a/src/main/java/forge/gui/home/constructed/VSubmenuThemes.java b/src/main/java/forge/gui/home/constructed/VSubmenuThemes.java deleted file mode 100644 index 4d6dc4db5de..00000000000 --- a/src/main/java/forge/gui/home/constructed/VSubmenuThemes.java +++ /dev/null @@ -1,69 +0,0 @@ -package forge.gui.home.constructed; - -import java.util.ArrayList; -import java.util.List; - -import javax.swing.JButton; -import javax.swing.JList; -import javax.swing.JPanel; - -import forge.gui.home.EMenuGroup; -import forge.gui.home.IVSubmenu; -import forge.view.home.StartButton; - -/** - * Singleton instance of "Colors" submenu in "Constructed" group. - * - */ -public enum VSubmenuThemes implements IVSubmenu { - /** */ - SINGLETON_INSTANCE; - - /** */ - private final JPanel pnl = new JPanel(); - private final StartButton btnStart = new StartButton(); - private final List allLists = new ArrayList(); - - /* (non-Javadoc) - * @see forge.view.home.IViewSubmenu#populate() - */ - @Override - public void populate() { - pnl.setName(ESubmenuConstructedTypes.THEMES.toString()); - final List generatedLists = - SubmenuConstructedUtil.populateConstructedSubmenuView(pnl, btnStart); - - allLists.clear(); - for (JList lst : generatedLists) { - lst.setName(ESubmenuConstructedTypes.THEMES.toString()); - allLists.add(lst); - } - } - - /* (non-Javadoc) - * @see forge.view.home.IViewSubmenu#getGroup() - */ - @Override - public EMenuGroup getGroup() { - return EMenuGroup.CONSTRUCTED; - } - - /* (non-Javadoc) - * @see forge.view.home.IViewSubmenu#getPanel() - */ - @Override - public JPanel getPanel() { - return pnl; - } - - - /** @return {@link javax.swing.JButton} */ - public JButton getBtnStart() { - return this.btnStart; - } - - /** @return {@link java.util.List}<{@link javax.swing.JList}> */ - public List getLists() { - return allLists; - } -} diff --git a/src/main/java/forge/gui/home/constructed/package-info.java b/src/main/java/forge/gui/home/constructed/package-info.java deleted file mode 100644 index 94b817cd02d..00000000000 --- a/src/main/java/forge/gui/home/constructed/package-info.java +++ /dev/null @@ -1,3 +0,0 @@ -/** Forge Card Game. */ -package forge.gui.home.constructed; - diff --git a/src/main/java/forge/gui/home/limited/CSubmenuConstructed.java b/src/main/java/forge/gui/home/limited/CSubmenuConstructed.java new file mode 100644 index 00000000000..ca1c6a5dfa7 --- /dev/null +++ b/src/main/java/forge/gui/home/limited/CSubmenuConstructed.java @@ -0,0 +1,515 @@ +package forge.gui.home.limited; + +import java.awt.Toolkit; +import java.awt.datatransfer.StringSelection; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Random; + +import javax.swing.JList; +import javax.swing.JOptionPane; +import javax.swing.ListSelectionModel; + +import net.miginfocom.swing.MigLayout; + +import org.apache.commons.lang3.ArrayUtils; + +import forge.CardList; +import forge.Command; +import forge.PlayerType; +import forge.Singletons; +import forge.deck.Deck; +import forge.deck.generate.Generate2ColorDeck; +import forge.deck.generate.Generate3ColorDeck; +import forge.deck.generate.Generate5ColorDeck; +import forge.deck.generate.GenerateThemeDeck; +import forge.game.GameNew; +import forge.gui.home.ICSubmenu; +import forge.item.CardPrinted; +import forge.properties.ForgePreferences; +import forge.properties.ForgePreferences.FPref; +import forge.quest.data.QuestEvent; +import forge.util.IStorage; +import forge.view.toolbox.FLabel; +import forge.view.toolbox.FOverlay; +import forge.view.toolbox.FPanel; +import forge.view.toolbox.FSkin; + +/** + * TODO: Write javadoc for this type. + * + */ +@SuppressWarnings("serial") +public enum CSubmenuConstructed implements ICSubmenu { + /** */ + SINGLETON_INSTANCE; + + private enum ESubmenuConstructedTypes { /** */ + COLORS, /** */ + THEMES, /** */ + CUSTOM, /** */ + QUESTEVENTS + } + + private static final Map COLOR_VALS = new HashMap(); + + private final MouseAdapter madDecklist = new MouseAdapter() { + @Override + public void mouseClicked(final MouseEvent e) { + if (e.getClickCount() == 2) { showDecklist(((JList) e.getSource())); } + } + }; + + static { + COLOR_VALS.clear(); + COLOR_VALS.put("Random 1", "AI"); + COLOR_VALS.put("Random 2", "AI"); + COLOR_VALS.put("Random 3", "AI"); + COLOR_VALS.put("Random 4", "AI"); + COLOR_VALS.put("Black", "black"); + COLOR_VALS.put("Blue", "blue"); + COLOR_VALS.put("Green", "green"); + COLOR_VALS.put("Red", "red"); + COLOR_VALS.put("White", "white"); + } + /* (non-Javadoc) + * @see forge.gui.home.ICSubmenu#getMenuCommand() + */ + @Override + public Command getMenuCommand() { + return null; + } + + /* (non-Javadoc) + * @see forge.gui.home.ICSubmenu#initialize() + */ + @Override + public void update() { + // Nothing to see here... + } + + /* (non-Javadoc) + * @see forge.gui.home.ICSubmenu#initialize() + */ + @Override + public void initialize() { + final ForgePreferences prefs = Singletons.getModel().getPreferences(); + final VSubmenuConstructed view = VSubmenuConstructed.SINGLETON_INSTANCE; + + VSubmenuConstructed.SINGLETON_INSTANCE.populate(); + CSubmenuConstructed.SINGLETON_INSTANCE.update(); + + // Radio button event handling + view.getRadColorsAI().addActionListener(new ActionListener() { @Override + public void actionPerformed(final ActionEvent arg0) { + updateColors(PlayerType.COMPUTER); } }); + + view.getRadColorsHuman().addActionListener(new ActionListener() { @Override + public void actionPerformed(final ActionEvent arg0) { + updateColors(PlayerType.HUMAN); } }); + + view.getRadThemesAI().addActionListener(new ActionListener() { @Override + public void actionPerformed(final ActionEvent arg0) { + updateThemes(PlayerType.COMPUTER); } }); + + view.getRadThemesHuman().addActionListener(new ActionListener() { @Override + public void actionPerformed(final ActionEvent arg0) { + updateThemes(PlayerType.HUMAN); } }); + + view.getRadCustomAI().addActionListener(new ActionListener() { @Override + public void actionPerformed(final ActionEvent arg0) { + updateCustom(PlayerType.COMPUTER); } }); + + view.getRadCustomHuman().addActionListener(new ActionListener() { @Override + public void actionPerformed(final ActionEvent arg0) { + updateCustom(PlayerType.HUMAN); } }); + + view.getRadQuestsAI().addActionListener(new ActionListener() { @Override + public void actionPerformed(final ActionEvent arg0) { + updateQuestEvents(PlayerType.COMPUTER); } }); + + view.getRadQuestsHuman().addActionListener(new ActionListener() { @Override + public void actionPerformed(final ActionEvent arg0) { + updateQuestEvents(PlayerType.HUMAN); } }); + + // Checkbox event handling + view.getBtnStart().addActionListener(new ActionListener() { + @Override + public void actionPerformed(final ActionEvent arg0) { + startGame(); + } + }); + + // Checkbox event handling + view.getCbSingletons().addActionListener(new ActionListener() { + @Override + public void actionPerformed(final ActionEvent arg0) { + prefs.setPref(FPref.DECKGEN_SINGLETONS, + String.valueOf(view.getCbSingletons().isSelected())); + prefs.save(); + } + }); + + view.getCbArtifacts().addActionListener(new ActionListener() { + @Override + public void actionPerformed(final ActionEvent arg0) { + prefs.setPref( + FPref.DECKGEN_ARTIFACTS, String.valueOf(view.getCbArtifacts().isSelected())); + prefs.save(); + } + }); + + view.getCbRemoveSmall().addActionListener(new ActionListener() { + @Override + public void actionPerformed(final ActionEvent arg0) { + prefs.setPref( + FPref.DECKGEN_NOSMALL, String.valueOf(view.getCbRemoveSmall().isSelected())); + prefs.save(); + } + }); + + // Pre-select checkboxes + view.getCbSingletons().setSelected(prefs.getPrefBoolean(FPref.DECKGEN_SINGLETONS)); + view.getCbArtifacts().setSelected(prefs.getPrefBoolean(FPref.DECKGEN_ARTIFACTS)); + view.getCbRemoveSmall().setSelected(prefs.getPrefBoolean(FPref.DECKGEN_NOSMALL)); + + // First run: colors + view.getRadColorsAI().setSelected(true); + view.getRadColorsHuman().setSelected(true); + + updateColors(PlayerType.COMPUTER); + updateColors(PlayerType.HUMAN); + } + + /** Handles all control for "colors" radio button click. */ + private void updateColors(final PlayerType player0) { + final JList lst = (player0.equals(PlayerType.HUMAN) + ? VSubmenuConstructed.SINGLETON_INSTANCE.getLstHumanDecks() + : VSubmenuConstructed.SINGLETON_INSTANCE.getLstAIDecks()); + lst.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); + + lst.setListData(new String[] {"Random 1", "Random 2", "Random 3", + "Random 4", "Black", "Blue", "Green", "Red", "White"}); + lst.setName(ESubmenuConstructedTypes.COLORS.toString()); + lst.removeMouseListener(madDecklist); + lst.addMouseListener(madDecklist); + + final FLabel btn = (player0.equals(PlayerType.HUMAN) + ? VSubmenuConstructed.SINGLETON_INSTANCE.getBtnHumanRandom() + : VSubmenuConstructed.SINGLETON_INSTANCE.getBtnAIRandom()); + + btn.setCommand(new Command() { @Override + public void execute() { randomSelectColors(lst); } }); + + // Init with a random select. + randomSelectColors(lst); + } + + /** Handles all control for "themes" radio button click. */ + private void updateThemes(final PlayerType player0) { + final JList lst = (player0.equals(PlayerType.HUMAN) + ? VSubmenuConstructed.SINGLETON_INSTANCE.getLstHumanDecks() + : VSubmenuConstructed.SINGLETON_INSTANCE.getLstAIDecks()); + lst.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + + lst.setName(ESubmenuConstructedTypes.COLORS.toString()); + lst.removeMouseListener(madDecklist); + lst.addMouseListener(madDecklist); + + final List themeNames = new ArrayList(); + for (final String s : GenerateThemeDeck.getThemeNames()) { themeNames.add(s); } + + lst.setListData(themeNames.toArray(ArrayUtils.EMPTY_STRING_ARRAY)); + lst.setName(ESubmenuConstructedTypes.THEMES.toString()); + lst.removeMouseListener(madDecklist); + + final FLabel btn = (player0.equals(PlayerType.HUMAN) + ? VSubmenuConstructed.SINGLETON_INSTANCE.getBtnHumanRandom() + : VSubmenuConstructed.SINGLETON_INSTANCE.getBtnAIRandom()); + + btn.setCommand(new Command() { @Override + public void execute() { randomSelectRegular(lst); } }); + + // Init with a random select. + randomSelectRegular(lst); + } + + /** Handles all control for "custom" radio button click. */ + private void updateCustom(final PlayerType player0) { + final JList lst = (player0.equals(PlayerType.HUMAN) + ? VSubmenuConstructed.SINGLETON_INSTANCE.getLstHumanDecks() + : VSubmenuConstructed.SINGLETON_INSTANCE.getLstAIDecks()); + lst.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + + final List customNames = new ArrayList(); + final IStorage allDecks = Singletons.getModel().getDecks().getConstructed(); + for (final Deck d : allDecks) { customNames.add(d.getName()); } + + lst.setListData(customNames.toArray(ArrayUtils.EMPTY_STRING_ARRAY)); + lst.setName(ESubmenuConstructedTypes.CUSTOM.toString()); + lst.removeMouseListener(madDecklist); + lst.addMouseListener(madDecklist); + + final FLabel btn = (player0.equals(PlayerType.HUMAN) + ? VSubmenuConstructed.SINGLETON_INSTANCE.getBtnHumanRandom() + : VSubmenuConstructed.SINGLETON_INSTANCE.getBtnAIRandom()); + + btn.setCommand(new Command() { @Override + public void execute() { randomSelectRegular(lst); } }); + + // Init with a random select. + randomSelectRegular(lst); + } + + /** Handles all control for "quest event" radio button click. */ + private void updateQuestEvents(final PlayerType player0) { + final JList lst = (player0.equals(PlayerType.HUMAN) + ? VSubmenuConstructed.SINGLETON_INSTANCE.getLstHumanDecks() + : VSubmenuConstructed.SINGLETON_INSTANCE.getLstAIDecks()); + lst.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + + final List eventNames = new ArrayList(); + + for (final QuestEvent e : Singletons.getModel().getQuestEventManager().getAllChallenges()) { + eventNames.add(e.getEventDeck().getName()); + } + + for (final QuestEvent e : Singletons.getModel().getQuestEventManager().getAllDuels()) { + eventNames.add(e.getEventDeck().getName()); + } + + lst.setListData(eventNames.toArray(ArrayUtils.EMPTY_STRING_ARRAY)); + lst.setName(ESubmenuConstructedTypes.QUESTEVENTS.toString()); + lst.removeMouseListener(madDecklist); + lst.addMouseListener(madDecklist); + + final FLabel btn = (player0.equals(PlayerType.HUMAN) + ? VSubmenuConstructed.SINGLETON_INSTANCE.getBtnHumanRandom() + : VSubmenuConstructed.SINGLETON_INSTANCE.getBtnAIRandom()); + + btn.setCommand(new Command() { @Override + public void execute() { randomSelectRegular(lst); } }); + + // Init with a random select. + randomSelectRegular(lst); + } + /** + * Checks lengths of selected values for color lists + * to see if a deck generator exists. Alert and visual reminder if fail. + * + * @param colors0   String[] of color names + * @return boolean + */ + private static boolean colorCheck(final String[] colors0) { + boolean result = true; + + if (colors0.length == 1) { + JOptionPane.showMessageDialog(null, + "Sorry, single color generated decks aren't supported yet." + + "\n\rPlease choose at least one more color for this deck.", + "Generate deck: 1 color", JOptionPane.ERROR_MESSAGE); + result = false; + } + else if (colors0.length == 4) { + JOptionPane.showMessageDialog(null, + "Sorry, four color generated decks aren't supported yet." + + "\n\rPlease use 2, 3, or 5 colors for this deck.", + "Generate deck: 4 colors", JOptionPane.ERROR_MESSAGE); + result = false; + } + else if (colors0.length > 5) { + JOptionPane.showMessageDialog(null, + "Generate deck: maximum five colors!", + "Generate deck: too many colors", JOptionPane.ERROR_MESSAGE); + result = false; + } + return result; + } + + /** @param lists0   {@link java.util.List}<{@link javax.swing.JList}> */ + private void startGame() { + final FOverlay overlay = Singletons.getView().getOverlay(); + overlay.setLayout(new MigLayout("insets 0, gap 0, align center")); + + final FPanel pnl = new FPanel(); + pnl.setLayout(new MigLayout("insets 0, gap 0, ax center, wrap")); + pnl.setBackground(FSkin.getColor(FSkin.Colors.CLR_ACTIVE)); + + pnl.add(new FLabel.Builder().icon(FSkin.getIcon(FSkin.ForgeIcons.ICO_LOGO)).build(), + "h 200px!, align center"); + pnl.add(new FLabel.Builder().text("Loading new game...") + .fontScaleAuto(false).fontSize(22).build(), "h 40px!, align center"); + + overlay.add(pnl, "h 300px!, w 400px!"); + + overlay.showOverlay(); + GameNew.newGame( + generateDeck(VSubmenuConstructed.SINGLETON_INSTANCE.getLstHumanDecks(), PlayerType.HUMAN), + generateDeck(VSubmenuConstructed.SINGLETON_INSTANCE.getLstAIDecks(), PlayerType.COMPUTER)); + overlay.hideOverlay(); + } + + /** Generates deck from current list selection(s). */ + private static Deck generateDeck(final JList lst0, final PlayerType player0) { + CardList cards = null; + final String[] selection = Arrays.copyOf(lst0.getSelectedValues(), + lst0.getSelectedValues().length, String[].class); + + final Deck deck; + + // Color deck + if (lst0.getName().equals(ESubmenuConstructedTypes.COLORS.toString()) && colorCheck(selection)) { + // Replace "random" with "AI" for deck generation code + for (int i = 0; i < selection.length; i++) { + selection[i] = COLOR_VALS.get(selection[i]); + } + + // 2, 3, and 5 colors. + if (selection.length == 2) { + final Generate2ColorDeck gen = new Generate2ColorDeck( + selection[0], selection[1]); + cards = gen.get2ColorDeck(60, player0); + } + else if (selection.length == 3) { + final Generate3ColorDeck gen = new Generate3ColorDeck( + selection[0], selection[1], selection[2]); + cards = gen.get3ColorDeck(60, player0); + } + else { + final Generate5ColorDeck gen = new Generate5ColorDeck( + selection[0], selection[1], selection[2], selection[3], selection[4]); + cards = gen.get5ColorDeck(60, player0); + } + + // After generating card lists, build deck. + deck = new Deck(); + deck.getMain().add(cards); + } + + // Theme deck + else if (lst0.getName().equals(ESubmenuConstructedTypes.THEMES.toString())) { + final GenerateThemeDeck gen = new GenerateThemeDeck(); + cards = gen.getThemeDeck(selection[0], 60); + + // After generating card lists, build deck. + deck = new Deck(); + deck.getMain().add(cards); + } + else if (lst0.getName().equals(ESubmenuConstructedTypes.QUESTEVENTS.toString())) { + deck = Singletons.getModel().getQuestEventManager().getEvent(selection[0]).getEventDeck(); + } + // Custom deck + else if (lst0.getName().equals(ESubmenuConstructedTypes.CUSTOM.toString())) { + deck = Singletons.getModel().getDecks().getConstructed().get(selection[0]); + } + // Failure, for some reason + else { + deck = null; + } + + return deck; + } + + /** Shows decklist dialog for a given deck. + * @param d0   {@link forge.deck.Deck} */ + private void showDecklist(final JList lst0) { + final String deckName = lst0.getSelectedValue().toString(); + final Deck deck; + + // Retrieve from custom or quest deck maps + if (lst0.getName().equals(ESubmenuConstructedTypes.CUSTOM.toString())) { + deck = Singletons.getModel().getDecks().getConstructed().get(deckName); + } + else { + deck = Singletons.getModel().getQuestEventManager().getEvent(deckName).getEventDeck(); + } + + // Dump into map and display. + final HashMap deckMap = new HashMap(); + + for (final Entry s : deck.getMain()) { + deckMap.put(s.getKey().getName(), s.getValue()); + } + + final String nl = System.getProperty("line.separator"); + final StringBuilder deckList = new StringBuilder(); + final String dName = deck.getName(); + + deckList.append(dName == null ? "" : dName + nl + nl); + + final ArrayList dmKeys = new ArrayList(); + for (final String s : deckMap.keySet()) { + dmKeys.add(s); + } + + Collections.sort(dmKeys); + + for (final String s : dmKeys) { + deckList.append(deckMap.get(s) + " x " + s + nl); + } + + final StringBuilder msg = new StringBuilder(); + if (deckMap.keySet().size() <= 32) { + msg.append(deckList.toString() + nl); + } else { + msg.append("Decklist too long for dialog." + nl + nl); + } + + msg.append("Copy Decklist to Clipboard?"); + + // Output + final int rcMsg = JOptionPane.showConfirmDialog(null, msg, "Decklist", JOptionPane.OK_CANCEL_OPTION); + if (rcMsg == JOptionPane.OK_OPTION) { + final StringSelection ss = new StringSelection(deckList.toString()); + Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss, null); + } + } // End showDecklist + + /** @param lst0   {@link javax.swing.JList} */ + private void randomSelectColors(final JList lst0) { + // Color select algorithm + int x = -1; + // HACK because 1 and 4 color decks are not supported yet. :( + while (x == -1 || x == 1 || x == 4) { + x = (int) Math.ceil(Math.random() * 5); + } + final int colorCount = x; + + final int maxCount = lst0.getModel().getSize(); + int[] selectedIndices = new int[colorCount]; + + x = -1; + for (int i = 0; i < colorCount; i++) { + while (x == -1) { + x = (int) Math.floor(Math.random() * maxCount); + if (Arrays.asList(selectedIndices).contains(x)) { x = -1; } + else { selectedIndices[i] = x; } + } + x = -1; + } + lst0.setSelectedIndices(selectedIndices); + selectedIndices = null; + } + + /** @param lst0   {@link javax.swing.JList} */ + private void randomSelectRegular(final JList lst0) { + final int size = lst0.getModel().getSize(); + + if (size > 0) { + final Random r = new Random(); + final int i = r.nextInt(size); + + lst0.setSelectedIndex(i); + lst0.ensureIndexIsVisible(lst0.getSelectedIndex()); + } + } +} diff --git a/src/main/java/forge/gui/home/limited/CSubmenuDraft.java b/src/main/java/forge/gui/home/limited/CSubmenuDraft.java index f25132cbe68..68bacaf8ed9 100644 --- a/src/main/java/forge/gui/home/limited/CSubmenuDraft.java +++ b/src/main/java/forge/gui/home/limited/CSubmenuDraft.java @@ -21,12 +21,14 @@ import forge.game.limited.CardPoolLimitation; import forge.gui.GuiUtils; import forge.gui.deckeditor.DraftingProcess; import forge.gui.home.ICSubmenu; +import forge.view.toolbox.FOverlay; import forge.view.toolbox.FSkin; /** * TODO: Write javadoc for this type. * */ +@SuppressWarnings("serial") public enum CSubmenuDraft implements ICSubmenu { /** */ SINGLETON_INSTANCE; @@ -72,6 +74,21 @@ public enum CSubmenuDraft implements ICSubmenu { "Walter", "Wilfred", "William", "Winston" }; + private final Command cmdDeckExit = new Command() { + @Override + public void execute() { + update(); + GuiUtils.closeOverlay(); + } + }; + + private final Command cmdDeckSelect = new Command() { + @Override + public void execute() { + VSubmenuDraft.SINGLETON_INSTANCE.getBtnStart().setEnabled(true); + } + }; + /* (non-Javadoc) * @see forge.control.home.IControlSubmenu#update() */ @@ -82,11 +99,14 @@ public enum CSubmenuDraft implements ICSubmenu { view.populate(); CSubmenuDraft.SINGLETON_INSTANCE.update(); - VSubmenuDraft.SINGLETON_INSTANCE.getBtnBuildDeck().addMouseListener( + view.getLstHumanDecks().setExitCommand(cmdDeckExit); + view.getLstHumanDecks().setSelectCommand(cmdDeckSelect); + + view.getBtnBuildDeck().addMouseListener( new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { setupDraft(); } }); - VSubmenuDraft.SINGLETON_INSTANCE.getBtnStart().addMouseListener( + view.getBtnStart().addMouseListener( new MouseAdapter() { @Override public void mouseReleased(final MouseEvent e) { @@ -99,7 +119,7 @@ public enum CSubmenuDraft implements ICSubmenu { } }); - VSubmenuDraft.SINGLETON_INSTANCE.getBtnDirections().addMouseListener(new MouseAdapter() { + view.getBtnDirections().addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { view.showDirections(); @@ -136,6 +156,7 @@ public enum CSubmenuDraft implements ICSubmenu { for (DeckGroup d : Singletons.getModel().getDecks().getDraft()) { human.add(d.getHumanDeck()); } + VSubmenuDraft.SINGLETON_INSTANCE.getLstHumanDecks().setDecks(human); if (human.size() > 1) { @@ -178,6 +199,9 @@ public enum CSubmenuDraft implements ICSubmenu { /** */ private void setupDraft() { + final FOverlay overlay = Singletons.getView().getOverlay(); + overlay.showOverlay(); + final DraftingProcess draft = new DraftingProcess(); // Determine what kind of booster draft to run @@ -200,7 +224,6 @@ public enum CSubmenuDraft implements ICSubmenu { else if (o.toString().equals(draftTypes.get(2))) { draft.showGui(new BoosterDraft(CardPoolLimitation.Custom)); } - } private String[] generateNames() { diff --git a/src/main/java/forge/gui/home/limited/CSubmenuSealed.java b/src/main/java/forge/gui/home/limited/CSubmenuSealed.java index fae4d02bb73..65884950222 100644 --- a/src/main/java/forge/gui/home/limited/CSubmenuSealed.java +++ b/src/main/java/forge/gui/home/limited/CSubmenuSealed.java @@ -24,6 +24,7 @@ import forge.game.GameType; import forge.game.limited.SealedDeck; import forge.gui.GuiUtils; import forge.gui.home.ICSubmenu; +import forge.gui.home.utilities.CSubmenuDeckEditor; import forge.item.CardPrinted; import forge.item.ItemPool; import forge.properties.ForgeProps; @@ -34,12 +35,28 @@ import forge.view.toolbox.FSkin; * TODO: Write javadoc for this type. * */ +@SuppressWarnings("serial") public enum CSubmenuSealed implements ICSubmenu { /** */ SINGLETON_INSTANCE; private Map aiDecks; + private final Command cmdDeckExit = new Command() { + @Override + public void execute() { + update(); + GuiUtils.closeOverlay(); + } + }; + + private final Command cmdDeckSelect = new Command() { + @Override + public void execute() { + VSubmenuSealed.SINGLETON_INSTANCE.getBtnStart().setEnabled(true); + } + }; + /* (non-Javadoc) * @see forge.control.home.IControlSubmenu#update() */ @@ -50,6 +67,9 @@ public enum CSubmenuSealed implements ICSubmenu { view.populate(); CSubmenuSealed.SINGLETON_INSTANCE.update(); + VSubmenuSealed.SINGLETON_INSTANCE.getLstDecks().setExitCommand(cmdDeckExit); + VSubmenuSealed.SINGLETON_INSTANCE.getLstDecks().setSelectCommand(cmdDeckSelect); + VSubmenuSealed.SINGLETON_INSTANCE.getBtnBuildDeck().addMouseListener( new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { setupSealed(); } }); @@ -184,6 +204,6 @@ public enum CSubmenuSealed implements ICSubmenu { sealed.addAiDeck(sd.buildAIDeck(sDeck.toForgeCardList())); Singletons.getModel().getDecks().getSealed().add(sealed); - Singletons.getControl().getControlHome().getControlUtilities().showDeckEditor(GameType.Sealed, sealed); + CSubmenuDeckEditor.SINGLETON_INSTANCE.showDeckEditor(GameType.Sealed, sealed); } } diff --git a/src/main/java/forge/gui/home/limited/VSubmenuConstructed.java b/src/main/java/forge/gui/home/limited/VSubmenuConstructed.java new file mode 100644 index 00000000000..01a610662a5 --- /dev/null +++ b/src/main/java/forge/gui/home/limited/VSubmenuConstructed.java @@ -0,0 +1,267 @@ +package forge.gui.home.limited; + +import java.awt.Font; + +import javax.swing.ButtonGroup; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JList; +import javax.swing.JPanel; +import javax.swing.JRadioButton; +import javax.swing.JScrollPane; +import javax.swing.SwingConstants; + +import net.miginfocom.swing.MigLayout; +import forge.gui.home.EMenuGroup; +import forge.gui.home.EMenuItem; +import forge.gui.home.ICSubmenu; +import forge.gui.home.IVSubmenu; +import forge.gui.home.StartButton; +import forge.view.toolbox.FCheckBox; +import forge.view.toolbox.FLabel; +import forge.view.toolbox.FList; +import forge.view.toolbox.FRadioButton; +import forge.view.toolbox.FScrollPane; + +/** + * TODO: Write javadoc for this type. + * + */ +public enum VSubmenuConstructed implements IVSubmenu { + /** */ + SINGLETON_INSTANCE; + + /** */ + private final JPanel pnl = new JPanel(); + private final StartButton btnStart = new StartButton(); + private final JList lstHumanDecks = new FList(); + private final JList lstAIDecks = new FList(); + + private final JRadioButton radColorsHuman = new FRadioButton("Fully random color deck"); + private final JRadioButton radThemesHuman = new FRadioButton("Semi-random theme deck"); + private final JRadioButton radCustomHuman = new FRadioButton("Custom user deck"); + private final JRadioButton radQuestsHuman = new FRadioButton("Quest event deck"); + + private final JRadioButton radColorsAI = new FRadioButton("Fully random color deck"); + private final JRadioButton radThemesAI = new FRadioButton("Semi-random theme deck"); + private final JRadioButton radCustomAI = new FRadioButton("Custom user deck"); + private final JRadioButton radQuestsAI = new FRadioButton("Quest event deck"); + + private final JCheckBox cbSingletons = new FCheckBox("Singleton Mode"); + private final JCheckBox cbArtifacts = new FCheckBox("Remove Artifacts"); + private final JCheckBox cbRemoveSmall = new FCheckBox("Remove Small Creatures"); + + private final JScrollPane scrHumanDecks = new FScrollPane(lstHumanDecks, + JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); + + private final JScrollPane scrAIDecks = new FScrollPane(lstAIDecks, + JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); + + private final FLabel btnHumanRandom = new FLabel.Builder().text("Random").fontSize(14).opaque(true) + .hoverable(true).fontScaleAuto(false).build(); + + private final FLabel btnAIRandom = new FLabel.Builder().text("Random").fontSize(14).opaque(true) + .hoverable(true).fontScaleAuto(false).build(); + + private VSubmenuConstructed() { + // Radio button group: Human + final ButtonGroup grpRadiosHuman = new ButtonGroup(); + grpRadiosHuman.add(radColorsHuman); + grpRadiosHuman.add(radThemesHuman); + grpRadiosHuman.add(radCustomHuman); + grpRadiosHuman.add(radQuestsHuman); + + // Radio button group: AI + final ButtonGroup grpRadiosAI = new ButtonGroup(); + grpRadiosAI.add(radColorsAI); + grpRadiosAI.add(radThemesAI); + grpRadiosAI.add(radCustomAI); + grpRadiosAI.add(radQuestsAI); + } + + /* (non-Javadoc) + * @see forge.gui.home.IVSubmenu#getPanel() + */ + @Override + public JPanel getPanel() { + return pnl; + } + + /* (non-Javadoc) + * @see forge.gui.home.IVSubmenu#getControl() + */ + @Override + public ICSubmenu getControl() { + return CSubmenuConstructed.SINGLETON_INSTANCE; + } + + /* (non-Javadoc) + * @see forge.gui.home.IVSubmenu#getGroupEnum() + */ + @Override + public EMenuGroup getGroupEnum() { + return EMenuGroup.SANCTIONED; + } + + /* (non-Javadoc) + * @see forge.gui.home.IVSubmenu#getMenuTitle() + */ + @Override + public String getMenuTitle() { + return "Constructed"; + } + + /* (non-Javadoc) + * @see forge.gui.home.IVSubmenu#getItemEnum() + */ + @Override + public String getItemEnum() { + return EMenuItem.CONSTRUCTED.toString(); + } + + /* (non-Javadoc) + * @see forge.gui.home.IVSubmenu#populate() + */ + @Override + public void populate() { + // Deck panels: Human and AI + final JPanel pnlDecksHuman = new JPanel(new MigLayout("insets 0, gap 0, wrap")); + final JPanel pnlDecksAI = new JPanel(new MigLayout("insets 0, gap 0, wrap")); + + // Add deck scrollers and random buttons: Human and AI + pnlDecksHuman.setOpaque(false); + pnlDecksHuman.add(scrHumanDecks, "w 100%!, pushy, growy"); + pnlDecksHuman.add(btnHumanRandom, "w 100%!, h 30px!, gap 0 0 10px 10px"); + + pnlDecksAI.setOpaque(false); + pnlDecksAI.add(scrAIDecks, "w 100%!, pushy, growy"); + pnlDecksAI.add(btnAIRandom, "w 100%!, h 30px!, gap 0 0 10px 0"); + + // Radio button panels: Human and AI + final JPanel pnlRadiosHuman = new JPanel(new MigLayout("insets 0, gap 0, wrap")); + final JPanel pnlRadiosAI = new JPanel(new MigLayout("insets 0, gap 0, wrap")); + final String strRadioConstraints = "w 100%!, h 30px!"; + + // Add radio buttons: Human + pnlRadiosHuman.setOpaque(false); + pnlRadiosHuman.add(new FLabel.Builder().text("Select your deck:") + .fontStyle(Font.BOLD).fontScaleAuto(false).fontSize(16) + .fontAlign(SwingConstants.LEFT).build(), strRadioConstraints); + pnlRadiosHuman.add(radColorsHuman, strRadioConstraints); + pnlRadiosHuman.add(radThemesHuman, strRadioConstraints); + pnlRadiosHuman.add(radCustomHuman, strRadioConstraints); + pnlRadiosHuman.add(radQuestsHuman, strRadioConstraints); + + // Add radio buttons: AI + pnlRadiosAI.setOpaque(false); + pnlRadiosAI.add(new FLabel.Builder().text("Select an AI deck:") + .fontStyle(Font.BOLD).fontScaleAuto(false).fontSize(16) + .fontAlign(SwingConstants.LEFT).build(), strRadioConstraints); + pnlRadiosAI.add(radColorsAI, strRadioConstraints); + pnlRadiosAI.add(radThemesAI, strRadioConstraints); + pnlRadiosAI.add(radCustomAI, strRadioConstraints); + pnlRadiosAI.add(radQuestsAI, strRadioConstraints); + + final JPanel pnlStart = new JPanel(new MigLayout("insets 0, gap 0, wrap 2")); + final String strCheckboxConstraints = "w 200px!, h 30px!, gap 0 20px 0 0"; + pnlStart.setOpaque(false); + pnlStart.add(cbSingletons, strCheckboxConstraints); + pnlStart.add(btnStart, "span 1 3, growx, pushx, align center"); + pnlStart.add(cbArtifacts, strCheckboxConstraints); + pnlStart.add(cbRemoveSmall, strCheckboxConstraints); + + pnl.removeAll(); + pnl.setOpaque(false); + pnl.setLayout(new MigLayout("insets 0, gap 0, wrap 2, align center")); + + final String strLeftConstraints = "w 200px, pushy, growy, gap 0 20px 25px 25px"; + final String strRightConstraints = "w 30%!, pushy, growy, gap 0 20px 25px 25px"; + + pnl.add(pnlRadiosAI, strLeftConstraints); + pnl.add(pnlDecksAI, strRightConstraints); + pnl.add(pnlRadiosHuman, strLeftConstraints); + pnl.add(pnlDecksHuman, strRightConstraints); + + pnl.add(pnlStart, "w 220px + 30%, span 2 1, gap 0 0 0 50px"); + } + + /** @return {@link javax.swing.JList} */ + public JList getLstHumanDecks() { + return this.lstHumanDecks; + } + + /** @return {@link javax.swing.JList} */ + public JList getLstAIDecks() { + return this.lstAIDecks; + } + + /** @return {@link javax.swing.JButton} */ + public JButton getBtnStart() { + return this.btnStart; + } + + /** @return {@link forge.view.toolbox.FLabel} */ + public FLabel getBtnHumanRandom() { + return this.btnHumanRandom; + } + + /** @return {@link forge.view.toolbox.FLabel} */ + public FLabel getBtnAIRandom() { + return this.btnAIRandom; + } + + /** @return {@link javax.swing.JRadioButton} */ + public JRadioButton getRadColorsHuman() { + return this.radColorsHuman; + } + + /** @return {@link javax.swing.JRadioButton} */ + public JRadioButton getRadThemesHuman() { + return this.radThemesHuman; + } + + /** @return {@link javax.swing.JRadioButton} */ + public JRadioButton getRadCustomHuman() { + return this.radCustomHuman; + } + + /** @return {@link javax.swing.JRadioButton} */ + public JRadioButton getRadQuestsHuman() { + return this.radQuestsHuman; + } + + /** @return {@link javax.swing.JRadioButton} */ + public JRadioButton getRadColorsAI() { + return this.radColorsAI; + } + + /** @return {@link javax.swing.JRadioButton} */ + public JRadioButton getRadThemesAI() { + return this.radThemesAI; + } + + /** @return {@link javax.swing.JRadioButton} */ + public JRadioButton getRadCustomAI() { + return this.radCustomAI; + } + + /** @return {@link javax.swing.JRadioButton} */ + public JRadioButton getRadQuestsAI() { + return this.radQuestsAI; + } + + /** @return {@link javax.swing.JCheckBox} */ + public JCheckBox getCbSingletons() { + return cbSingletons; + } + + /** @return {@link javax.swing.JCheckBox} */ + public JCheckBox getCbArtifacts() { + return cbArtifacts; + } + + /** @return {@link javax.swing.JCheckBox} */ + public JCheckBox getCbRemoveSmall() { + return cbRemoveSmall; + } +} diff --git a/src/main/java/forge/gui/home/limited/VSubmenuDraft.java b/src/main/java/forge/gui/home/limited/VSubmenuDraft.java index 6db0fe25c27..4df0bdee2fb 100644 --- a/src/main/java/forge/gui/home/limited/VSubmenuDraft.java +++ b/src/main/java/forge/gui/home/limited/VSubmenuDraft.java @@ -16,12 +16,13 @@ import javax.swing.text.StyleConstants; import javax.swing.text.StyledDocument; import net.miginfocom.swing.MigLayout; -import forge.Command; import forge.game.GameType; import forge.gui.GuiUtils; import forge.gui.home.EMenuGroup; +import forge.gui.home.EMenuItem; +import forge.gui.home.ICSubmenu; import forge.gui.home.IVSubmenu; -import forge.view.home.StartButton; +import forge.gui.home.StartButton; import forge.view.toolbox.DeckLister; import forge.view.toolbox.FButton; import forge.view.toolbox.FLabel; @@ -38,14 +39,10 @@ public enum VSubmenuDraft implements IVSubmenu { /** */ SINGLETON_INSTANCE; - @SuppressWarnings("serial") - private final Command cmdExit = new Command() { @Override - public void execute() { CSubmenuDraft.SINGLETON_INSTANCE.update(); } }; - /** */ private final JPanel pnl = new JPanel(); private final StartButton btnStart = new StartButton(); - private final DeckLister lstHumanDecks = new DeckLister(GameType.Draft, cmdExit); + private final DeckLister lstHumanDecks = new DeckLister(GameType.Draft); private final JList lstAI = new FList(); private final JLabel btnBuildDeck = new FLabel.Builder() .fontScaleAuto(false).fontSize(16) @@ -94,8 +91,8 @@ public enum VSubmenuDraft implements IVSubmenu { * @see forge.view.home.IViewSubmenu#getGroup() */ @Override - public EMenuGroup getGroup() { - return EMenuGroup.LIMITED; + public EMenuGroup getGroupEnum() { + return EMenuGroup.SANCTIONED; } /* (non-Javadoc) @@ -106,6 +103,30 @@ public enum VSubmenuDraft implements IVSubmenu { return pnl; } + /* (non-Javadoc) + * @see forge.gui.home.IVSubmenu#getMenuTitle() + */ + @Override + public String getMenuTitle() { + return "Draft Mode"; + } + + /* (non-Javadoc) + * @see forge.gui.home.IVSubmenu#getMenuName() + */ + @Override + public String getItemEnum() { + return EMenuItem.LIMITED_DRAFT.toString(); + } + + /* (non-Javadoc) + * @see forge.gui.home.IVSubmenu#getControl() + */ + @Override + public ICSubmenu getControl() { + return CSubmenuDraft.SINGLETON_INSTANCE; + } + /** @return {@link javax.swing.JLabel} */ public JLabel getBtnDirections() { return this.btnDirections; diff --git a/src/main/java/forge/gui/home/limited/VSubmenuSealed.java b/src/main/java/forge/gui/home/limited/VSubmenuSealed.java index ac914269d93..1793512d1bb 100644 --- a/src/main/java/forge/gui/home/limited/VSubmenuSealed.java +++ b/src/main/java/forge/gui/home/limited/VSubmenuSealed.java @@ -14,12 +14,13 @@ import javax.swing.text.StyleConstants; import javax.swing.text.StyledDocument; import net.miginfocom.swing.MigLayout; -import forge.Command; import forge.game.GameType; import forge.gui.GuiUtils; import forge.gui.home.EMenuGroup; +import forge.gui.home.EMenuItem; +import forge.gui.home.ICSubmenu; import forge.gui.home.IVSubmenu; -import forge.view.home.StartButton; +import forge.gui.home.StartButton; import forge.view.toolbox.DeckLister; import forge.view.toolbox.FButton; import forge.view.toolbox.FLabel; @@ -35,14 +36,10 @@ public enum VSubmenuSealed implements IVSubmenu { /** */ SINGLETON_INSTANCE; - @SuppressWarnings("serial") - private final Command cmdExit = new Command() { @Override - public void execute() { CSubmenuDraft.SINGLETON_INSTANCE.update(); } }; - /** */ private final JPanel pnl = new JPanel(); private final StartButton btnStart = new StartButton(); - private final DeckLister lstDecks = new DeckLister(GameType.Draft, cmdExit); + private final DeckLister lstDecks = new DeckLister(GameType.Sealed); private final JLabel btnBuildDeck = new FLabel.Builder() .fontScaleAuto(false).fontSize(16) .opaque(true).hoverable(true).text("Build a Sealed Deck").build(); @@ -78,8 +75,32 @@ public enum VSubmenuSealed implements IVSubmenu { * @see forge.view.home.IViewSubmenu#getGroup() */ @Override - public EMenuGroup getGroup() { - return EMenuGroup.LIMITED; + public EMenuGroup getGroupEnum() { + return EMenuGroup.SANCTIONED; + } + + /* (non-Javadoc) + * @see forge.gui.home.IVSubmenu#getMenuTitle() + */ + @Override + public String getMenuTitle() { + return "Sealed Mode"; + } + + /* (non-Javadoc) + * @see forge.gui.home.IVSubmenu#getMenuName() + */ + @Override + public String getItemEnum() { + return EMenuItem.LIMITED_SEALED.toString(); + } + + /* (non-Javadoc) + * @see forge.gui.home.IVSubmenu#getControl() + */ + @Override + public ICSubmenu getControl() { + return CSubmenuSealed.SINGLETON_INSTANCE; } /* (non-Javadoc) diff --git a/src/main/java/forge/gui/home/quest/CSubmenuChallenges.java b/src/main/java/forge/gui/home/quest/CSubmenuChallenges.java index 50a02be9e0e..f6768e912df 100644 --- a/src/main/java/forge/gui/home/quest/CSubmenuChallenges.java +++ b/src/main/java/forge/gui/home/quest/CSubmenuChallenges.java @@ -1,6 +1,8 @@ package forge.gui.home.quest; import java.awt.Color; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.util.List; import javax.swing.SwingConstants; @@ -9,9 +11,11 @@ import javax.swing.border.EmptyBorder; import forge.AllZone; import forge.Command; import forge.Singletons; +import forge.gui.home.EMenuItem; import forge.gui.home.ICSubmenu; import forge.gui.home.quest.SubmenuQuestUtil.SelectablePanel; import forge.quest.data.QuestChallenge; +import forge.view.ViewHomeUI; import forge.view.toolbox.FLabel; /** @@ -23,25 +27,47 @@ public enum CSubmenuChallenges implements ICSubmenu { SINGLETON_INSTANCE; /* (non-Javadoc) - * @see forge.control.home.IControlSubmenu#getMenuCommand() + * @see forge.control.home.IControlSubmenu#getCommand() */ + @SuppressWarnings("serial") @Override public Command getMenuCommand() { - return null; + return new Command() { + public void execute() { + if (AllZone.getQuestData() == null) { + ViewHomeUI.SINGLETON_INSTANCE.itemClick(EMenuItem.QUEST_DATA); + } + } + }; } /* (non-Javadoc) * @see forge.control.home.IControlSubmenu#initialize() */ + @SuppressWarnings("serial") @Override public void initialize() { - /// TEMPORARY - VSubmenuDuels.SINGLETON_INSTANCE.populate(); - CSubmenuDuels.SINGLETON_INSTANCE.update(); - ///////////// - VSubmenuChallenges.SINGLETON_INSTANCE.populate(); CSubmenuChallenges.SINGLETON_INSTANCE.update(); + + VSubmenuChallenges.SINGLETON_INSTANCE.getBtnSpellShop().setCommand( + new Command() { @Override + public void execute() { SubmenuQuestUtil.showSpellShop(); } }); + + VSubmenuChallenges.SINGLETON_INSTANCE.getBtnBazaar().setCommand( + new Command() { @Override + public void execute() { SubmenuQuestUtil.showBazaar(); } }); + + VSubmenuChallenges.SINGLETON_INSTANCE.getBtnStart().addActionListener( + new ActionListener() { @Override + public void actionPerformed(final ActionEvent e) { SubmenuQuestUtil.startGame(); } }); + + VSubmenuChallenges.SINGLETON_INSTANCE.getBtnCurrentDeck().setCommand( + new Command() { @Override + public void execute() { + ViewHomeUI.SINGLETON_INSTANCE.itemClick(EMenuItem.QUEST_DECKS); + } + }); } /* (non-Javadoc) @@ -52,10 +78,9 @@ public enum CSubmenuChallenges implements ICSubmenu { SubmenuQuestUtil.updateStatsAndPet(); final VSubmenuChallenges view = VSubmenuChallenges.SINGLETON_INSTANCE; - VSubmenuDuels.SINGLETON_INSTANCE.getBtnStart().setEnabled(false); if (AllZone.getQuestData() != null) { - VSubmenuDuels.SINGLETON_INSTANCE.getLblTitle().setText("Challenges: " + AllZone.getQuestData().getRank()); + view.getLblTitle().setText("Challenges: " + AllZone.getQuestData().getRank()); view.getPnlChallenges().removeAll(); final List challenges = @@ -68,7 +93,7 @@ public enum CSubmenuChallenges implements ICSubmenu { if (challenges.size() == 0) { final FLabel lbl = new FLabel.Builder() - .text(VSubmenuDuels.SINGLETON_INSTANCE.getLblNextChallengeInWins().getText()) + .text(VSubmenuChallenges.SINGLETON_INSTANCE.getLblNextChallengeInWins().getText()) .fontAlign(SwingConstants.CENTER).build(); lbl.setForeground(Color.red); lbl.setBackground(Color.white); @@ -78,4 +103,39 @@ public enum CSubmenuChallenges implements ICSubmenu { } } } + + /* (non-Javadoc) + * @see forge.control.home.IControlSubmenu#update() + */ + /* @Override + public void update() { + SubmenuQuestUtil.updateStatsAndPet(); + + final VSubmenuChallenges view = VSubmenuChallenges.SINGLETON_INSTANCE; + VSubmenuChallenges.SINGLETON_INSTANCE.getBtnStart().setEnabled(false); + + if (AllZone.getQuestData() != null) { + VSubmenuChallenges.SINGLETON_INSTANCE.getLblTitle().setText("Challenges: " + AllZone.getQuestData().getRank()); + + view.getPnlChallenges().removeAll(); + final List challenges = + Singletons.getModel().getQuestEventManager().generateChallenges(AllZone.getQuestData()); + + for (final QuestChallenge c : challenges) { + final SelectablePanel temp = new SelectablePanel(c); + view.getPnlChallenges().add(temp, "w 96%!, h 86px!, gap 2% 0 5px 5px"); + } + + if (challenges.size() == 0) { + final FLabel lbl = new FLabel.Builder() + .text(VSubmenuChallenges.SINGLETON_INSTANCE.getLblNextChallengeInWins().getText()) + .fontAlign(SwingConstants.CENTER).build(); + lbl.setForeground(Color.red); + lbl.setBackground(Color.white); + lbl.setBorder(new EmptyBorder(10, 10, 10, 10)); + lbl.setOpaque(true); + view.getPnlChallenges().add(lbl, "w 50%!, h 30px!, gap 25% 0 50px 0"); + } + } + }*/ } diff --git a/src/main/java/forge/gui/home/quest/CSubmenuDuels.java b/src/main/java/forge/gui/home/quest/CSubmenuDuels.java index 34da4fc6870..7fa69b31224 100644 --- a/src/main/java/forge/gui/home/quest/CSubmenuDuels.java +++ b/src/main/java/forge/gui/home/quest/CSubmenuDuels.java @@ -7,9 +7,11 @@ import java.util.List; import forge.AllZone; import forge.Command; import forge.Singletons; +import forge.gui.home.EMenuItem; import forge.gui.home.ICSubmenu; import forge.gui.home.quest.SubmenuQuestUtil.SelectablePanel; import forge.quest.data.QuestDuel; +import forge.view.ViewHomeUI; /** * TODO: Write javadoc for this type. @@ -20,11 +22,18 @@ public enum CSubmenuDuels implements ICSubmenu { SINGLETON_INSTANCE; /* (non-Javadoc) - * @see forge.control.home.IControlSubmenu#getMenuCommand() + * @see forge.control.home.IControlSubmenu#getCommand() */ + @SuppressWarnings("serial") @Override public Command getMenuCommand() { - return null; + return new Command() { + public void execute() { + if (AllZone.getQuestData() == null) { + ViewHomeUI.SINGLETON_INSTANCE.itemClick(EMenuItem.QUEST_DATA); + } + } + }; } /* (non-Javadoc) @@ -40,13 +49,20 @@ public enum CSubmenuDuels implements ICSubmenu { new Command() { @Override public void execute() { SubmenuQuestUtil.showSpellShop(); } }); - VSubmenuDuels.SINGLETON_INSTANCE.getBtnSpellShop().setCommand( + VSubmenuDuels.SINGLETON_INSTANCE.getBtnBazaar().setCommand( new Command() { @Override public void execute() { SubmenuQuestUtil.showBazaar(); } }); VSubmenuDuels.SINGLETON_INSTANCE.getBtnStart().addActionListener( new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { SubmenuQuestUtil.startGame(); } }); + + VSubmenuDuels.SINGLETON_INSTANCE.getBtnCurrentDeck().setCommand( + new Command() { @Override + public void execute() { + ViewHomeUI.SINGLETON_INSTANCE.itemClick(EMenuItem.QUEST_DECKS); + } + }); } /* (non-Javadoc) diff --git a/src/main/java/forge/gui/home/quest/CSubmenuQuestData.java b/src/main/java/forge/gui/home/quest/CSubmenuQuestData.java index c0ce07ff03c..0024986237c 100644 --- a/src/main/java/forge/gui/home/quest/CSubmenuQuestData.java +++ b/src/main/java/forge/gui/home/quest/CSubmenuQuestData.java @@ -22,16 +22,22 @@ import forge.quest.data.QuestPreferences.QPref; * TODO: Write javadoc for this type. * */ +@SuppressWarnings("serial") public enum CSubmenuQuestData implements ICSubmenu { /** */ SINGLETON_INSTANCE; private final Map arrQuests = new HashMap(); + private final Command cmdQuestSelect = new Command() { @Override + public void execute() { changeQuest(); } }; + + private final Command cmdQuestDelete = new Command() { @Override + public void execute() { update(); } }; + /* (non-Javadoc) * @see forge.control.home.IControlSubmenu#update() */ - @SuppressWarnings("serial") @Override public void initialize() { VSubmenuQuestData.SINGLETON_INSTANCE.populate(); @@ -54,75 +60,8 @@ public enum CSubmenuQuestData implements ICSubmenu { */ @Override public void update() { - refreshQuests(); - } - - /** - * The actuator for new quests. - */ - private void newQuest() { final VSubmenuQuestData view = VSubmenuQuestData.SINGLETON_INSTANCE; - int difficulty = 0; - QuestData newdata = new QuestData(); - - final String mode = view.getRadFantasy().isSelected() - ? forge.quest.data.QuestData.FANTASY - : forge.quest.data.QuestData.CLASSIC; - - if (view.getRadEasy().isSelected()) { - difficulty = 0; - } else if (view.getRadMedium().isSelected()) { - difficulty = 1; - } else if (view.getRadHard().isSelected()) { - difficulty = 2; - } else if (view.getRadExpert().isSelected()) { - difficulty = 3; - } else { - throw new IllegalStateException( - "ControlQuest() > newQuest(): Error starting new quest!"); - } - - final Object o = JOptionPane.showInputDialog(null, "Poets will remember your quest as:", "Quest Name", JOptionPane.OK_CANCEL_OPTION); - - if (o == null) { return; } - - final String questName = GuiUtils.cleanString(o.toString()); - - if (getAllQuests().get(questName) != null || questName.equals("")) { - JOptionPane.showMessageDialog(null, "Please pick another quest name, a quest already has that name."); - return; - } - - // Give the user a few cards to build a deck - newdata.newGame(difficulty, mode, view.getCbStandardStart().isSelected()); - newdata.setName(questName); - newdata.saveData(); - - // Save in preferences. - Singletons.getModel().getQuestPreferences().setPreference(QPref.CURRENT_QUEST, questName + ".dat"); - Singletons.getModel().getQuestPreferences().save(); - - Singletons.getView().getViewHome().resetQuest(); - } // New Quest - - /** Changes between quest data files. */ - private void changeQuest() { - AllZone.setQuestData(VSubmenuQuestData.SINGLETON_INSTANCE - .getLstQuests().getSelectedQuest()); - - // Save in preferences. - Singletons.getModel().getQuestPreferences().setPreference(QPref.CURRENT_QUEST, - AllZone.getQuestData().getName() + ".dat"); - Singletons.getModel().getQuestPreferences().save(); - - //refreshDecks(); - //refreshStats(); - } - - /** Resets quests, then retrieves and sets current quest. */ - public void refreshQuests() { - final VSubmenuQuestData view = VSubmenuQuestData.SINGLETON_INSTANCE; - File dirQuests = ForgeProps.getFile(NewConstants.Quest.DATA_DIR); + final File dirQuests = ForgeProps.getFile(NewConstants.Quest.DATA_DIR); // Temporary transition code between v1.2.2 and v1.2.3. // Can be safely deleted after release of 1.2.3. @@ -170,6 +109,74 @@ public enum CSubmenuQuestData implements ICSubmenu { else { AllZone.setQuestData(null); } + + view.getLstQuests().setSelectCommand(cmdQuestSelect); + view.getLstQuests().setDeleteCommand(cmdQuestDelete); + } + + /** + * The actuator for new quests. + */ + private void newQuest() { + final VSubmenuQuestData view = VSubmenuQuestData.SINGLETON_INSTANCE; + int difficulty = 0; + QuestData newdata = new QuestData(); + + final String mode = view.getRadFantasy().isSelected() + ? forge.quest.data.QuestData.FANTASY + : forge.quest.data.QuestData.CLASSIC; + + if (view.getRadEasy().isSelected()) { + difficulty = 0; + } else if (view.getRadMedium().isSelected()) { + difficulty = 1; + } else if (view.getRadHard().isSelected()) { + difficulty = 2; + } else if (view.getRadExpert().isSelected()) { + difficulty = 3; + } else { + throw new IllegalStateException( + "ControlQuest() > newQuest(): Error starting new quest!"); + } + + final Object o = JOptionPane.showInputDialog(null, "Poets will remember your quest as:", "Quest Name", JOptionPane.OK_CANCEL_OPTION); + + if (o == null) { return; } + + final String questName = GuiUtils.cleanString(o.toString()); + + if (getAllQuests().get(questName) != null || questName.equals("")) { + JOptionPane.showMessageDialog(null, "Please pick another quest name, a quest already has that name."); + return; + } + + // Give the user a few cards to build a deck + newdata.newGame(difficulty, mode, view.getCbStandardStart().isSelected()); + newdata.setName(questName); + newdata.saveData(); + + // Save in preferences. + Singletons.getModel().getQuestPreferences().setPreference(QPref.CURRENT_QUEST, questName + ".dat"); + Singletons.getModel().getQuestPreferences().save(); + + update(); + } // New Quest + + /** Changes between quest data files. */ + private void changeQuest() { + AllZone.setQuestData(VSubmenuQuestData.SINGLETON_INSTANCE + .getLstQuests().getSelectedQuest()); + + // Save in preferences. + Singletons.getModel().getQuestPreferences().setPreference(QPref.CURRENT_QUEST, + AllZone.getQuestData().getName() + ".dat"); + Singletons.getModel().getQuestPreferences().save(); + + SubmenuQuestUtil.updateStatsAndPet(); + + CSubmenuDuels.SINGLETON_INSTANCE.update(); + CSubmenuChallenges.SINGLETON_INSTANCE.update(); + CSubmenuQuestDecks.SINGLETON_INSTANCE.update(); } /** @return */ diff --git a/src/main/java/forge/gui/home/quest/CSubmenuQuestDecks.java b/src/main/java/forge/gui/home/quest/CSubmenuQuestDecks.java index 598806b258a..285b53ef0b0 100644 --- a/src/main/java/forge/gui/home/quest/CSubmenuQuestDecks.java +++ b/src/main/java/forge/gui/home/quest/CSubmenuQuestDecks.java @@ -7,9 +7,11 @@ import forge.Command; import forge.Singletons; import forge.deck.Deck; import forge.gui.deckeditor.DeckEditorQuest; +import forge.gui.home.EMenuItem; import forge.gui.home.ICSubmenu; import forge.quest.data.QuestData; import forge.quest.data.QuestPreferences.QPref; +import forge.view.ViewHomeUI; /** * TODO: Write javadoc for this type. @@ -26,7 +28,6 @@ public enum CSubmenuQuestDecks implements ICSubmenu { public void execute() { AllZone.getQuestData().saveData(); update(); - Singletons.getView().getViewHome().getBtnQuest().grabFocus(); } }; @@ -35,13 +36,29 @@ public enum CSubmenuQuestDecks implements ICSubmenu { public void execute() { currentDeck = VSubmenuQuestDecks.SINGLETON_INSTANCE.getLstDecks().getSelectedDeck(); Singletons.getModel().getQuestPreferences().setPreference(QPref.CURRENT_DECK, currentDeck.toString()); - VSubmenuDuels.SINGLETON_INSTANCE.setCurrentDeckStatus(); + Singletons.getModel().getQuestPreferences().save(); + VSubmenuDuels.SINGLETON_INSTANCE.updateCurrentDeckStatus(); + VSubmenuChallenges.SINGLETON_INSTANCE.updateCurrentDeckStatus(); } }; private final Command cmdDeckDelete = new Command() { @Override public void execute() { update(); } }; + /* (non-Javadoc) + * @see forge.control.home.IControlSubmenu#getCommand() + */ + @Override + public Command getMenuCommand() { + return new Command() { + public void execute() { + if (AllZone.getQuestData() == null) { + ViewHomeUI.SINGLETON_INSTANCE.itemClick(EMenuItem.QUEST_DATA); + } + } + }; + } + /* (non-Javadoc) * @see forge.control.home.IControlSubmenu#update() */ @@ -60,14 +77,6 @@ public enum CSubmenuQuestDecks implements ICSubmenu { }); } - /* (non-Javadoc) - * @see forge.control.home.IControlSubmenu#getCommand() - */ - @Override - public Command getMenuCommand() { - return null; - } - /* (non-Javadoc) * @see forge.control.home.IControlSubmenu#update() */ @@ -83,8 +92,9 @@ public enum CSubmenuQuestDecks implements ICSubmenu { if (qData != null) { final String cd = Singletons.getModel().getQuestPreferences().getPreference(QPref.CURRENT_DECK); + for (Deck d : qData.getMyDecks()) { - if (d.getName().equals(cd)) { + if (d.getName() != null && d.getName().equals(cd)) { currentDeck = d; view.getLstDecks().setSelectedDeck(d); break; @@ -99,7 +109,15 @@ public enum CSubmenuQuestDecks implements ICSubmenu { view.getLstDecks().setDeleteCommand(cmdDeckDelete); view.getLstDecks().setExitCommand(cmdDeckExit); - VSubmenuDuels.SINGLETON_INSTANCE.setCurrentDeckStatus(); + if (view.getLstDecks().getSelectedDeck() != null) { + Singletons.getModel().getQuestPreferences().setPreference(QPref.CURRENT_DECK, view.getLstDecks().getSelectedDeck().getName()); + } + else { + Singletons.getModel().getQuestPreferences().setPreference(QPref.CURRENT_DECK, QPref.CURRENT_DECK.getDefault()); + } + + VSubmenuDuels.SINGLETON_INSTANCE.updateCurrentDeckStatus(); + VSubmenuChallenges.SINGLETON_INSTANCE.updateCurrentDeckStatus(); } /** @return forge.deck.Deck */ diff --git a/src/main/java/forge/gui/home/quest/CSubmenuQuestPrefs.java b/src/main/java/forge/gui/home/quest/CSubmenuQuestPrefs.java index 74cc46413b7..6381d2f8428 100644 --- a/src/main/java/forge/gui/home/quest/CSubmenuQuestPrefs.java +++ b/src/main/java/forge/gui/home/quest/CSubmenuQuestPrefs.java @@ -24,14 +24,6 @@ public enum CSubmenuQuestPrefs implements ICSubmenu { CSubmenuQuestPrefs.SINGLETON_INSTANCE.update(); } - /* (non-Javadoc) - * @see forge.control.home.IControlSubmenu#getCommand() - */ - @Override - public Command getMenuCommand() { - return null; - } - /* (non-Javadoc) * @see forge.control.home.IControlSubmenu#update() */ @@ -40,6 +32,14 @@ public enum CSubmenuQuestPrefs implements ICSubmenu { } + /* (non-Javadoc) + * @see forge.control.home.IControlSubmenu#getCommand() + */ + @Override + public Command getMenuCommand() { + return null; + } + /** * Checks validity of values entered into prefInputs. * @param i0   a PrefInput object diff --git a/src/main/java/forge/gui/home/quest/IStatsAndPet.java b/src/main/java/forge/gui/home/quest/IStatsAndPet.java new file mode 100644 index 00000000000..0bed04b09be --- /dev/null +++ b/src/main/java/forge/gui/home/quest/IStatsAndPet.java @@ -0,0 +1,47 @@ +package forge.gui.home.quest; + +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JLabel; + +import forge.view.toolbox.FLabel; + +/** Dictates methods required for a panel with stats/pet display. */ + +public interface IStatsAndPet { + /** @return {@link forge.view.toolbox.FLabel} */ + FLabel getBtnBazaar(); + + /** @return {@link forge.view.toolbox.FLabel} */ + FLabel getBtnSpellShop(); + + /** @return {@link javax.swing.JLabel} */ + JLabel getLblCredits(); + + /** @return {@link javax.swing.JLabel} */ + JLabel getLblLife(); + + /** @return {@link javax.swing.JLabel} */ + JLabel getLblWins(); + + /** @return {@link javax.swing.JLabel} */ + JLabel getLblLosses(); + + /** @return {@link javax.swing.JLabel} */ + JLabel getLblNextChallengeInWins(); + + /** @return {@link javax.swing.JLabel} */ + JLabel getLblWinStreak(); + + /** @return {@link javax.swing.JComboBox} */ + JComboBox getCbxPet(); + + /** @return {@link javax.swing.JCheckBox} */ + JCheckBox getCbPlant(); + + /** @return {@link javax.swing.JCheckBox} */ + JCheckBox getCbZep(); + + /** */ + void updateCurrentDeckStatus(); +} diff --git a/src/main/java/forge/view/home/QuestFileLister.java b/src/main/java/forge/gui/home/quest/QuestFileLister.java similarity index 97% rename from src/main/java/forge/view/home/QuestFileLister.java rename to src/main/java/forge/gui/home/quest/QuestFileLister.java index 4847d9a94b1..c0037ad459c 100644 --- a/src/main/java/forge/view/home/QuestFileLister.java +++ b/src/main/java/forge/gui/home/quest/QuestFileLister.java @@ -1,4 +1,4 @@ -package forge.view.home; +package forge.gui.home.quest; import java.awt.Color; import java.awt.event.MouseAdapter; diff --git a/src/main/java/forge/view/home/QuestPreferencesHandler.java b/src/main/java/forge/gui/home/quest/QuestPreferencesHandler.java similarity index 97% rename from src/main/java/forge/view/home/QuestPreferencesHandler.java rename to src/main/java/forge/gui/home/quest/QuestPreferencesHandler.java index 38df7224691..f8c765e2f23 100644 --- a/src/main/java/forge/view/home/QuestPreferencesHandler.java +++ b/src/main/java/forge/gui/home/quest/QuestPreferencesHandler.java @@ -1,4 +1,4 @@ -package forge.view.home; +package forge.gui.home.quest; import java.awt.Color; import java.awt.Font; diff --git a/src/main/java/forge/gui/home/quest/SubmenuQuestUtil.java b/src/main/java/forge/gui/home/quest/SubmenuQuestUtil.java index 532c4634254..be70e0887e5 100644 --- a/src/main/java/forge/gui/home/quest/SubmenuQuestUtil.java +++ b/src/main/java/forge/gui/home/quest/SubmenuQuestUtil.java @@ -19,7 +19,6 @@ import forge.properties.ForgeProps; import forge.properties.NewConstants; import forge.quest.data.QuestChallenge; import forge.quest.data.QuestData; -import forge.quest.data.QuestDataIO; import forge.quest.data.QuestEvent; import forge.quest.data.QuestPreferences.QPref; import forge.quest.data.QuestUtil; @@ -37,7 +36,6 @@ import forge.view.toolbox.FTextArea; */ public class SubmenuQuestUtil { private static SelectablePanel selectedOpponent; - private static Deck currentDeck; /** *

@@ -66,79 +64,184 @@ public class SubmenuQuestUtil { /** Updates stats, pets panels for both duels and challenges. */ public static void updateStatsAndPet() { - final QuestData qData; - final VSubmenuDuels view = VSubmenuDuels.SINGLETON_INSTANCE; + final QuestData qData = AllZone.getQuestData(); - ////////// TODO - THIS SHOULD NOT BE HERE AND WILL BE MOVED EVENTUALLY. - if (AllZone.getQuestData() == null) { - final String questname = Singletons.getModel() - .getQuestPreferences().getPreference(QPref.CURRENT_QUEST); + if (qData == null) { return; } - qData = QuestDataIO.loadData(new File( - ForgeProps.getFile(NewConstants.Quest.DATA_DIR) + questname + ".dat")); - AllZone.setQuestData(qData); - } - else { - qData = AllZone.getQuestData(); - } - //////////////////////////////////////////////////////////////////////// + final IStatsAndPet[] viewsToUpdate = new IStatsAndPet[] { + VSubmenuDuels.SINGLETON_INSTANCE, + VSubmenuChallenges.SINGLETON_INSTANCE + }; - // Stats panel - view.getLblCredits().setText("Credits: " + qData.getCredits()); - view.getLblLife().setText("Life: " + qData.getLife()); - view.getLblWins().setText("Wins: " + qData.getWin()); - view.getLblLosses().setText("Losses: " + qData.getLost()); - view.setCurrentDeckStatus(); - final int num = SubmenuQuestUtil.nextChallengeInWins(); - if (num == 0) { - view.getLblNextChallengeInWins().setText("Next challenge available now."); - } - else { - view.getLblNextChallengeInWins().setText("Next challenge available in " + num + " wins."); - } + for (final IStatsAndPet view : viewsToUpdate) { + // Fantasy UI display + view.getLblNextChallengeInWins().setVisible(true); + view.getBtnBazaar().setVisible(true); + view.getLblLife().setVisible(true); - view.getLblWinStreak().setText( - "Win streak: " + qData.getWinStreakCurrent() - + " (Best:" + qData.getWinStreakBest() + ")"); + // Stats panel + view.getLblCredits().setText("Credits: " + qData.getCredits()); + view.getLblLife().setText("Life: " + qData.getLife()); + view.getLblWins().setText("Wins: " + qData.getWin()); + view.getLblLosses().setText("Losses: " + qData.getLost()); + view.updateCurrentDeckStatus(); - // Start panel: pet, plant, zep. - if (qData.getMode().equals(QuestData.FANTASY)) { - final Set petList = qData.getPetManager().getAvailablePetNames(); - final QuestPetAbstract currentPet = qData.getPetManager().getSelectedPet(); - - view.getCbxPet().removeAllItems(); - // Pet list visibility - if (petList.size() > 0) { - view.getCbxPet().setEnabled(true); - view.getCbxPet().addItem("Don't summon a pet"); - for (final String pet : petList) { - view.getCbxPet().addItem("Summon " + pet); - } - - if (currentPet != null) { view.getCbxPet().setSelectedItem("Summon " + currentPet.getName()); } - } else { - view.getCbxPet().setVisible(false); - } - - // Plant visiblity - if (qData.getPetManager().getPlant().getLevel() == 0) { - view.getCbPlant().setVisible(false); + final int num = SubmenuQuestUtil.nextChallengeInWins(); + if (num == 0) { + view.getLblNextChallengeInWins().setText("Next challenge available now."); } else { - view.getCbPlant().setVisible(true); - view.getCbPlant().setSelected(qData.getPetManager().shouldPlantBeUsed()); + view.getLblNextChallengeInWins().setText("Next challenge available in " + num + " wins."); } - // Zeppelin visibility - final QuestItemZeppelin zeppelin = (QuestItemZeppelin) qData.getInventory().getItem("Zeppelin"); - view.getCbZep().setVisible(zeppelin.hasBeenUsed()); + view.getLblWinStreak().setText( + "Win streak: " + qData.getWinStreakCurrent() + + " (Best:" + qData.getWinStreakBest() + ")"); + + // Start panel: pet, plant, zep. + if (qData.getMode().equals(QuestData.FANTASY)) { + final Set petList = qData.getPetManager().getAvailablePetNames(); + final QuestPetAbstract currentPet = qData.getPetManager().getSelectedPet(); + + view.getCbxPet().removeAllItems(); + // Pet list visibility + if (petList.size() > 0) { + view.getCbxPet().setEnabled(true); + view.getCbxPet().addItem("Don't summon a pet"); + for (final String pet : petList) { + view.getCbxPet().addItem("Summon " + pet); + } + + if (currentPet != null) { view.getCbxPet().setSelectedItem("Summon " + currentPet.getName()); } + } else { + view.getCbxPet().setVisible(false); + } + + // Plant visiblity + if (qData.getPetManager().getPlant().getLevel() == 0) { + view.getCbPlant().setVisible(false); + } + else { + view.getCbPlant().setVisible(true); + view.getCbPlant().setSelected(qData.getPetManager().shouldPlantBeUsed()); + } + + // Zeppelin visibility + final QuestItemZeppelin zeppelin = (QuestItemZeppelin) qData.getInventory().getItem("Zeppelin"); + view.getCbZep().setVisible(zeppelin.hasBeenUsed()); + } + else { + // Classic mode display changes + view.getCbxPet().setVisible(false); + view.getCbPlant().setVisible(false); + view.getCbZep().setVisible(false); + view.getLblNextChallengeInWins().setVisible(false); + view.getBtnBazaar().setVisible(false); + view.getLblLife().setVisible(false); + } } + } + + /** @return {@link forge.view.home.ViewQuest.SelectablePanel} */ + public static SelectablePanel getSelectedOpponent() { + return selectedOpponent; + } + + /** @return {@link forge.deck.Deck} */ + public static Deck getCurrentDeck() { + Deck d = null; + + if (AllZone.getQuestData() != null) { + d = AllZone.getQuestData().getMyDecks().get( + Singletons.getModel().getQuestPreferences().getPreference(QPref.CURRENT_DECK)); + } + + return d; + } + + /** */ + @SuppressWarnings("serial") + public static void showSpellShop() { + final Command exit = new Command() { + @Override + public void execute() { + AllZone.getQuestData().saveData(); + updateStatsAndPet(); + } + }; + + final QuestCardShop g = new QuestCardShop(AllZone.getQuestData()); + g.show(exit); + g.setAlwaysOnTop(true); + g.setVisible(true); + } + + /** */ + public static void showBazaar() { + Singletons.getControl().changeState(FControl.QUEST_BAZAAR); + Singletons.getView().getFrame().validate(); + } + + /** */ + public static void startGame() { + final QuestData qData = AllZone.getQuestData(); + final QuestEvent event = selectedOpponent.getEvent(); + final FOverlay overlay = Singletons.getView().getOverlay(); + final FPanel pnl = new FPanel(); + + // Overlay layout + overlay.setLayout(new MigLayout("insets 0, gap 0, align center")); + + pnl.setLayout(new MigLayout("insets 0, gap 0, ax center, wrap")); + pnl.setBackground(FSkin.getColor(FSkin.Colors.CLR_ACTIVE)); + pnl.add(new FLabel.Builder().icon(FSkin.getIcon(FSkin.ForgeIcons.ICO_LOGO)).build(), + "h 200px!, align center"); + pnl.add(new FLabel.Builder().text("Loading new game...") + .fontScaleAuto(false).fontSize(22).build(), "h 40px!, align center"); + + overlay.add(pnl, "h 300px!, w 400px!"); + overlay.showOverlay(); + + // Logic + final QuestItemZeppelin zeppelin = (QuestItemZeppelin) qData.getInventory().getItem("Zeppelin"); + zeppelin.setZeppelinUsed(false); + qData.randomizeOpponents(); + + Constant.Runtime.HUMAN_DECK[0] = SubmenuQuestUtil.getCurrentDeck(); + Constant.Runtime.COMPUTER_DECK[0] = event.getEventDeck(); + Constant.Quest.OPP_ICON_NAME[0] = event.getIconFilename(); + Constant.Runtime.setGameType(GameType.Quest); + qData.setCurrentEvent(event); + qData.saveData(); + + if (qData.isFantasy()) { + Constant.Quest.FANTASY_QUEST[0] = true; + int lifeAI = 20; + int lifeHuman = 20; + + if (selectedOpponent.getEvent().getEventType().equals("challenge")) { + int extraLife = 0; + + if (qData.getInventory().getItemLevel("Gear") == 2) { + extraLife = 3; + } + lifeAI = ((QuestChallenge) event).getAILife(); + lifeHuman = qData.getLife() + extraLife; + } + + GameNew.newGame( + Constant.Runtime.HUMAN_DECK[0], Constant.Runtime.COMPUTER_DECK[0], + QuestUtil.getHumanStartingCards(qData), + QuestUtil.getComputerStartingCards(qData), + lifeHuman, lifeAI); + } // End isFantasy else { - view.getCbxPet().setVisible(false); - view.getCbPlant().setVisible(false); - view.getCbZep().setVisible(false); + GameNew.newGame(SubmenuQuestUtil.getCurrentDeck(), event.getEventDeck()); } + + // Start transisiton to match UI. + overlay.hideOverlay(); } /** Selectable panels for duels and challenges. */ @@ -158,7 +261,12 @@ public class SubmenuQuestUtil { @Override public void execute() { if (selectedOpponent != null) { selectedOpponent.setSelected(false); } - else { VSubmenuDuels.SINGLETON_INSTANCE.getBtnStart().setEnabled(true); } + else if (VSubmenuDuels.SINGLETON_INSTANCE.getPanel().isShowing() && getCurrentDeck() != null) { + VSubmenuDuels.SINGLETON_INSTANCE.getBtnStart().setEnabled(true); + } + else if (getCurrentDeck() != null) { + VSubmenuChallenges.SINGLETON_INSTANCE.getBtnStart().setEnabled(true); + } selectedOpponent = SubmenuQuestUtil.SelectablePanel.this; } @@ -194,102 +302,4 @@ public class SubmenuQuestUtil { return event; } } - - /** @return {@link forge.view.home.ViewQuest.SelectablePanel} */ - public static SelectablePanel getSelectedOpponent() { - return selectedOpponent; - } - - /** @param deck0   {@link forge.deck.Deck} */ - public static void setCurrentDeck(final Deck deck0) { - currentDeck = deck0; - } - - /** @return {@link forge.deck.Deck} */ - public static Deck getCurrentDeck() { - return currentDeck; - } - - /** */ - @SuppressWarnings("serial") - public static void showSpellShop() { - final Command exit = new Command() { - @Override - public void execute() { - AllZone.getQuestData().saveData(); - updateStatsAndPet(); - } - }; - - QuestCardShop g = new QuestCardShop(AllZone.getQuestData()); - g.show(exit); - g.setVisible(true); - } - - /** */ - public static void showBazaar() { - Singletons.getControl().changeState(FControl.QUEST_BAZAAR); - Singletons.getView().getFrame().validate(); - } - - /** */ - public static void startGame() { - final QuestData qData = AllZone.getQuestData(); - final QuestEvent event = selectedOpponent.getEvent(); - final FOverlay overlay = Singletons.getView().getOverlay(); - final FPanel pnl = new FPanel(); - - // Overlay layout - overlay.setLayout(new MigLayout("insets 0, gap 0, align center")); - - pnl.setLayout(new MigLayout("insets 0, gap 0, ax center, wrap")); - pnl.setBackground(FSkin.getColor(FSkin.Colors.CLR_ACTIVE)); - pnl.add(new FLabel.Builder().icon(FSkin.getIcon(FSkin.ForgeIcons.ICO_LOGO)).build(), - "h 200px!, align center"); - pnl.add(new FLabel.Builder().text("Loading new game...") - .fontScaleAuto(false).fontSize(22).build(), "h 40px!, align center"); - - overlay.add(pnl, "h 300px!, w 400px!"); - overlay.showOverlay(); - - // Logic - final QuestItemZeppelin zeppelin = (QuestItemZeppelin) qData.getInventory().getItem("Zeppelin"); - zeppelin.setZeppelinUsed(false); - qData.randomizeOpponents(); - - Constant.Runtime.HUMAN_DECK[0] = currentDeck; - Constant.Runtime.COMPUTER_DECK[0] = event.getEventDeck(); - Constant.Quest.OPP_ICON_NAME[0] = event.getIconFilename(); - Constant.Runtime.setGameType(GameType.Quest); - qData.setCurrentEvent(event); - qData.saveData(); - - if (qData.isFantasy()) { - Constant.Quest.FANTASY_QUEST[0] = true; - int lifeAI = 20; - int lifeHuman = 20; - - if (selectedOpponent.getEvent().getEventType().equals("challenge")) { - int extraLife = 0; - - if (qData.getInventory().getItemLevel("Gear") == 2) { - extraLife = 3; - } - lifeAI = ((QuestChallenge) event).getAILife(); - lifeHuman = qData.getLife() + extraLife; - } - - GameNew.newGame( - Constant.Runtime.HUMAN_DECK[0], Constant.Runtime.COMPUTER_DECK[0], - QuestUtil.getHumanStartingCards(qData), - QuestUtil.getComputerStartingCards(qData), - lifeHuman, lifeAI); - } // End isFantasy - else { - GameNew.newGame(currentDeck, event.getEventDeck()); - } - - // Start transisiton to match UI. - overlay.hideOverlay(); - } } diff --git a/src/main/java/forge/gui/home/quest/VSubmenuChallenges.java b/src/main/java/forge/gui/home/quest/VSubmenuChallenges.java index 01dab7e8527..a9c0528b5ee 100644 --- a/src/main/java/forge/gui/home/quest/VSubmenuChallenges.java +++ b/src/main/java/forge/gui/home/quest/VSubmenuChallenges.java @@ -1,22 +1,72 @@ package forge.gui.home.quest; +import java.awt.Color; + +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; +import javax.swing.SwingConstants; import net.miginfocom.swing.MigLayout; import forge.gui.home.EMenuGroup; +import forge.gui.home.EMenuItem; +import forge.gui.home.ICSubmenu; import forge.gui.home.IVSubmenu; +import forge.gui.home.StartButton; +import forge.view.toolbox.FCheckBox; +import forge.view.toolbox.FLabel; import forge.view.toolbox.FPanel; import forge.view.toolbox.FScrollPane; +import forge.view.toolbox.FSkin; /** */ -public enum VSubmenuChallenges implements IVSubmenu { +public enum VSubmenuChallenges implements IVSubmenu, IStatsAndPet { /** */ SINGLETON_INSTANCE; //========== INSTANTIATION private final JPanel pnl = new JPanel(); - private final JPanel pnlChallenges = new JPanel(); + private final JPanel pnlChallenges = new JPanel(); + private final FPanel pnlTitle = new FPanel(); + private final JPanel pnlStats = new JPanel(); + private final JPanel pnlStart = new JPanel(); + + private final JButton btnStart = new StartButton(); + private final JComboBox cbxPet = new JComboBox(); + private final JCheckBox cbPlant = new FCheckBox("Summon Plant"); + private final JCheckBox cbZep = new FCheckBox("Launch Zeppelin"); + + private final FLabel lblLife = new FLabel.Builder() + .icon(FSkin.getIcon(FSkin.QuestIcons.ICO_LIFE)) + .fontScaleAuto(false).fontSize(15).build(); + private final FLabel lblCredits = new FLabel.Builder() + .icon(FSkin.getIcon(FSkin.QuestIcons.ICO_COINSTACK)) + .fontScaleAuto(false).fontSize(15).build(); + private final FLabel lblWins = new FLabel.Builder() + .icon(FSkin.getIcon(FSkin.QuestIcons.ICO_PLUS)) + .fontScaleAuto(false).fontSize(15).build(); + private final FLabel lblLosses = new FLabel.Builder() + .icon(FSkin.getIcon(FSkin.QuestIcons.ICO_MINUS)) + .fontScaleAuto(false).fontSize(15).build(); + private final FLabel lblWinStreak = new FLabel.Builder() + .icon(FSkin.getIcon(FSkin.QuestIcons.ICO_PLUSPLUS)) + .fontScaleAuto(false).fontSize(15).build(); + private final FLabel lblTitle = new FLabel.Builder() + .text("Title Hasn't Been Set Yet").fontAlign(SwingConstants.CENTER) + .fontScaleAuto(false).fontSize(16).build(); + private final FLabel lblNextChallengeInWins = new FLabel.Builder() + .fontScaleAuto(false).fontSize(15).build(); + private final FLabel btnCurrentDeck = new FLabel.Builder() + .fontScaleAuto(false).fontSize(15).opaque(true).hoverable(true).build(); + private final FLabel btnBazaar = new FLabel.Builder() + .opaque(true).hoverable(true).text("Bazaar") + .fontScaleAuto(false).fontSize(14).tooltip("Peruse the Bazaar").build(); + private final FLabel btnSpellShop = new FLabel.Builder() + .opaque(true).hoverable(true).text("Spell Shop") + .fontScaleAuto(false).fontSize(14).tooltip("Travel to the Spell Shop").build(); /* (non-Javadoc) * @see forge.view.home.IViewSubmenu#getPanel() @@ -30,22 +80,46 @@ public enum VSubmenuChallenges implements IVSubmenu { * @see forge.view.home.IViewSubmenu#getGroup() */ @Override - public EMenuGroup getGroup() { + public EMenuGroup getGroupEnum() { return EMenuGroup.QUEST; } + /* (non-Javadoc) + * @see forge.gui.home.IVSubmenu#getMenuTitle() + */ + @Override + public String getMenuTitle() { + return "Challenges"; + } + + /* (non-Javadoc) + * @see forge.gui.home.IVSubmenu#getMenuName() + */ + @Override + public String getItemEnum() { + return EMenuItem.QUEST_CHALLENGES.toString(); + } + + /* (non-Javadoc) + * @see forge.gui.home.IVSubmenu#getControl() + */ + @Override + public ICSubmenu getControl() { + return CSubmenuChallenges.SINGLETON_INSTANCE; + } + /* (non-Javadoc) * @see forge.view.home.IViewSubmenu#populate() */ @Override public void populate() { - // Note: "Challenges" submenu uses the instances of - // title, stats, and start panels from "Duels" submenu. - final FPanel pnlTitle = VSubmenuDuels.SINGLETON_INSTANCE.getPnlTitle(); - final JPanel pnlStats = VSubmenuDuels.SINGLETON_INSTANCE.getPnlStats(); - final JPanel pnlStart = VSubmenuDuels.SINGLETON_INSTANCE.getPnlStart(); - VSubmenuDuels.SINGLETON_INSTANCE.getBtnStart().setEnabled(false); - //// + pnlTitle.setLayout(new MigLayout("insets 0, gap 0")); + pnlTitle.setBackground(FSkin.getColor(FSkin.Colors.CLR_THEME2)); + pnlTitle.add(lblTitle, "w 100%, h 100%, gap 0 0 0 0"); + + populateStats(); + populateStart(); + btnStart.setEnabled(false); final FScrollPane scrChallenges = new FScrollPane(pnlChallenges, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); @@ -61,8 +135,137 @@ public enum VSubmenuChallenges implements IVSubmenu { pnl.add(pnlStart, "w 94%, gap 3% 0 15px 5%"); } + @Override + public void updateCurrentDeckStatus() { + final JLabel btnCurrentDeck = VSubmenuChallenges.SINGLETON_INSTANCE.getBtnCurrentDeck(); + if (SubmenuQuestUtil.getCurrentDeck() == null) { + btnCurrentDeck.setBackground(Color.red.darker()); + btnCurrentDeck.setText(" Build, then select a deck in the \"Decks\" submenu. "); + } + else { + btnCurrentDeck.setBackground(FSkin.getColor(FSkin.Colors.CLR_INACTIVE)); + btnCurrentDeck.setText("Current deck: " + + SubmenuQuestUtil.getCurrentDeck().getName()); + } + } + /** @return {@link javax.swing.JPanel} */ public JPanel getPnlChallenges() { return pnlChallenges; } + + /** @return {@link javax.swing.JPanel} */ + public FPanel getPnlTitle() { + return pnlTitle; + } + + /** @return {@link forge.view.toolbox.FPanel} */ + public JPanel getPnlStats() { + return pnlStats; + } + + /** @return {@link forge.view.toolbox.FPanel} */ + public JPanel getPnlStart() { + return pnlStart; + } + + /** @return {@link javax.swing.JLabel} */ + public JLabel getLblTitle() { + return lblTitle; + } + + @Override + public FLabel getLblLife() { + return lblLife; + } + + @Override + public FLabel getLblCredits() { + return lblCredits; + } + + @Override + public FLabel getLblWins() { + return lblWins; + } + + @Override + public FLabel getLblLosses() { + return lblLosses; + } + + @Override + public FLabel getLblNextChallengeInWins() { + return lblNextChallengeInWins; + } + + @Override + public FLabel getLblWinStreak() { + return lblWinStreak; + } + + /** @return {@link forge.view.toolbox.FLabel} */ + public FLabel getBtnCurrentDeck() { + return btnCurrentDeck; + } + + @Override + public FLabel getBtnBazaar() { + return btnBazaar; + } + + @Override + public FLabel getBtnSpellShop() { + return btnSpellShop; + } + + @Override + public JCheckBox getCbPlant() { + return cbPlant; + } + + @Override + public JCheckBox getCbZep() { + return cbZep; + } + + @Override + public JComboBox getCbxPet() { + return cbxPet; + } + + /** @return {@link javax.swing.JButton} */ + public JButton getBtnStart() { + return btnStart; + } + + private void populateStats() { + final String constraints = "w 23%!, h 35px!, gap 1% 1% 5px 5px"; + pnlStats.removeAll(); + pnlStats.setOpaque(false); + pnlStats.setLayout(new MigLayout("insets 0, gap 0, hidemode 0")); + pnlStats.add(btnSpellShop, constraints); + pnlStats.add(lblWins, constraints); + pnlStats.add(lblLosses, constraints); + pnlStats.add(lblCredits, constraints + ", wrap"); + + pnlStats.add(btnBazaar, constraints); + pnlStats.add(lblWinStreak, "w 48%!, h 35px!, gap 1% 1% 5px 5px, span 2 1"); + pnlStats.add(lblLife, constraints + ", wrap"); + + pnlStats.add(lblNextChallengeInWins, "span 4 1, h 20px!, gap 0 0 5px 5px, ax center, wrap"); + pnlStats.add(btnCurrentDeck, "span 4 1, w 350px!, h 30px!, gap 0 0 0 5px, ax center"); + } + + private void populateStart() { + final String constraints = "w 200px!, h 20px!, gap 0 10px 5px 5px"; + pnlStart.removeAll(); + pnlStart.setOpaque(false); + pnlStart.setLayout(new MigLayout("insets 0, gap 0, align center, hidemode 3")); + + pnlStart.add(cbxPet, constraints); + pnlStart.add(btnStart, "ax center, span 1 3, wrap"); + pnlStart.add(cbPlant, constraints + ", wrap"); + pnlStart.add(cbZep, constraints); + } } diff --git a/src/main/java/forge/gui/home/quest/VSubmenuDuels.java b/src/main/java/forge/gui/home/quest/VSubmenuDuels.java index 1824b0a9d26..d9abb40efde 100644 --- a/src/main/java/forge/gui/home/quest/VSubmenuDuels.java +++ b/src/main/java/forge/gui/home/quest/VSubmenuDuels.java @@ -12,8 +12,10 @@ import javax.swing.SwingConstants; import net.miginfocom.swing.MigLayout; import forge.gui.home.EMenuGroup; +import forge.gui.home.EMenuItem; +import forge.gui.home.ICSubmenu; import forge.gui.home.IVSubmenu; -import forge.view.home.StartButton; +import forge.gui.home.StartButton; import forge.view.toolbox.FCheckBox; import forge.view.toolbox.FLabel; import forge.view.toolbox.FPanel; @@ -21,7 +23,7 @@ import forge.view.toolbox.FScrollPane; import forge.view.toolbox.FSkin; /** */ -public enum VSubmenuDuels implements IVSubmenu { +public enum VSubmenuDuels implements IVSubmenu, IStatsAndPet { /** */ SINGLETON_INSTANCE; @@ -60,7 +62,7 @@ public enum VSubmenuDuels implements IVSubmenu { private final FLabel btnCurrentDeck = new FLabel.Builder() .fontScaleAuto(false).fontSize(15).opaque(true).hoverable(true).build(); private final FLabel btnBazaar = new FLabel.Builder() - .selectable(true).opaque(true).hoverable(true).text("Bazaar") + .opaque(true).hoverable(true).text("Bazaar") .fontScaleAuto(false).fontSize(14).tooltip("Peruse the Bazaar").build(); private final FLabel btnSpellShop = new FLabel.Builder() .opaque(true).hoverable(true).text("Spell Shop") @@ -78,10 +80,34 @@ public enum VSubmenuDuels implements IVSubmenu { * @see forge.view.home.IViewSubmenu#getGroup() */ @Override - public EMenuGroup getGroup() { + public EMenuGroup getGroupEnum() { return EMenuGroup.QUEST; } + /* (non-Javadoc) + * @see forge.gui.home.IVSubmenu#getMenuTitle() + */ + @Override + public String getMenuTitle() { + return "Duels"; + } + + /* (non-Javadoc) + * @see forge.gui.home.IVSubmenu#getMenuName() + */ + @Override + public String getItemEnum() { + return EMenuItem.QUEST_DUELS.toString(); + } + + /* (non-Javadoc) + * @see forge.gui.home.IVSubmenu#getControl() + */ + @Override + public ICSubmenu getControl() { + return CSubmenuDuels.SINGLETON_INSTANCE; + } + /* (non-Javadoc) * @see forge.view.home.IViewSubmenu#populate() */ @@ -110,7 +136,7 @@ public enum VSubmenuDuels implements IVSubmenu { } /** */ - public void setCurrentDeckStatus() { + public void updateCurrentDeckStatus() { final JLabel btnCurrentDeck = VSubmenuDuels.SINGLETON_INSTANCE.getBtnCurrentDeck(); if (SubmenuQuestUtil.getCurrentDeck() == null) { btnCurrentDeck.setBackground(Color.red.darker()); @@ -133,12 +159,12 @@ public enum VSubmenuDuels implements IVSubmenu { return pnlTitle; } - /** @return {@link javax.swing.JPanel} */ + /** @return {@link forge.view.toolbox.FPanel} */ public JPanel getPnlStats() { return pnlStats; } - /** @return {@link javax.swing.JPanel} */ + /** @return {@link forge.view.toolbox.FPanel} */ public JPanel getPnlStart() { return pnlStart; } @@ -147,32 +173,33 @@ public enum VSubmenuDuels implements IVSubmenu { public JLabel getLblTitle() { return lblTitle; } - /** @return {@link javax.swing.FLabel} */ + + @Override public FLabel getLblLife() { return lblLife; } - /** @return {@link javax.swing.FLabel} */ + @Override public FLabel getLblCredits() { return lblCredits; } - /** @return {@link javax.swing.FLabel} */ + @Override public FLabel getLblWins() { return lblWins; } - /** @return {@link javax.swing.FLabel} */ + @Override public FLabel getLblLosses() { return lblLosses; } - /** @return {@link javax.swing.FLabel} */ + @Override public FLabel getLblNextChallengeInWins() { return lblNextChallengeInWins; } - /** @return {@link javax.swing.FLabel} */ + @Override public FLabel getLblWinStreak() { return lblWinStreak; } @@ -182,27 +209,27 @@ public enum VSubmenuDuels implements IVSubmenu { return btnCurrentDeck; } - /** @return {@link forge.view.toolbox.FLabel} */ + @Override public FLabel getBtnBazaar() { return btnBazaar; } - /** @return {@link forge.view.toolbox.FLabel} */ + @Override public FLabel getBtnSpellShop() { return btnSpellShop; } - /** @return {@link javax.swing.JCheckBox} */ + @Override public JCheckBox getCbPlant() { return cbPlant; } - /** @return {@link javax.swing.JCheckBox} */ + @Override public JCheckBox getCbZep() { return cbZep; } - /** @return {@link javax.swing.JComboBox} */ + @Override public JComboBox getCbxPet() { return cbxPet; } @@ -217,15 +244,15 @@ public enum VSubmenuDuels implements IVSubmenu { pnlStats.removeAll(); pnlStats.setOpaque(false); pnlStats.setLayout(new MigLayout("insets 0, gap 0, hidemode 0")); - pnlStats.add(btnBazaar, constraints); + pnlStats.add(btnSpellShop, constraints); pnlStats.add(lblWins, constraints); pnlStats.add(lblLosses, constraints); - pnlStats.add(lblLife, constraints + ", wrap"); - - pnlStats.add(btnSpellShop, constraints); - pnlStats.add(lblWinStreak, "w 48%!, h 35px!, gap 1% 1% 5px 5px, span 2 1"); pnlStats.add(lblCredits, constraints + ", wrap"); + pnlStats.add(btnBazaar, constraints); + pnlStats.add(lblWinStreak, "w 48%!, h 35px!, gap 1% 1% 5px 5px, span 2 1"); + pnlStats.add(lblLife, constraints + ", wrap"); + pnlStats.add(lblNextChallengeInWins, "span 4 1, h 20px!, gap 0 0 5px 5px, ax center, wrap"); pnlStats.add(btnCurrentDeck, "span 4 1, w 350px!, h 30px!, gap 0 0 0 5px, ax center"); } diff --git a/src/main/java/forge/gui/home/quest/VSubmenuQuestData.java b/src/main/java/forge/gui/home/quest/VSubmenuQuestData.java index 1eae23458f9..b1ff12ef929 100644 --- a/src/main/java/forge/gui/home/quest/VSubmenuQuestData.java +++ b/src/main/java/forge/gui/home/quest/VSubmenuQuestData.java @@ -8,8 +8,9 @@ import javax.swing.SwingConstants; import net.miginfocom.swing.MigLayout; import forge.gui.home.EMenuGroup; +import forge.gui.home.EMenuItem; +import forge.gui.home.ICSubmenu; import forge.gui.home.IVSubmenu; -import forge.view.home.QuestFileLister; import forge.view.toolbox.FCheckBox; import forge.view.toolbox.FLabel; import forge.view.toolbox.FPanel; @@ -119,7 +120,7 @@ public enum VSubmenuQuestData implements IVSubmenu { * @see forge.view.home.IViewSubmenu#getGroup() */ @Override - public EMenuGroup getGroup() { + public EMenuGroup getGroupEnum() { return EMenuGroup.QUEST; } @@ -131,7 +132,32 @@ public enum VSubmenuQuestData implements IVSubmenu { return pnl; } - /** @return {@link forge.view.home.QuestFileLister} */ + + /* (non-Javadoc) + * @see forge.gui.home.IVSubmenu#getMenuTitle() + */ + @Override + public String getMenuTitle() { + return "New / Load Quest"; + } + + /* (non-Javadoc) + * @see forge.gui.home.IVSubmenu#getMenuName() + */ + @Override + public String getItemEnum() { + return EMenuItem.QUEST_DATA.toString(); + } + + /* (non-Javadoc) + * @see forge.gui.home.IVSubmenu#getControl() + */ + @Override + public ICSubmenu getControl() { + return CSubmenuQuestData.SINGLETON_INSTANCE; + } + + /** @return {@link forge.gui.home.quest.QuestFileLister} */ public QuestFileLister getLstQuests() { return this.lstQuests; } diff --git a/src/main/java/forge/gui/home/quest/VSubmenuQuestDecks.java b/src/main/java/forge/gui/home/quest/VSubmenuQuestDecks.java index 4d538bd4271..b7ea59d3908 100644 --- a/src/main/java/forge/gui/home/quest/VSubmenuQuestDecks.java +++ b/src/main/java/forge/gui/home/quest/VSubmenuQuestDecks.java @@ -5,6 +5,8 @@ import javax.swing.JPanel; import net.miginfocom.swing.MigLayout; import forge.game.GameType; import forge.gui.home.EMenuGroup; +import forge.gui.home.EMenuItem; +import forge.gui.home.ICSubmenu; import forge.gui.home.IVSubmenu; import forge.view.toolbox.DeckLister; import forge.view.toolbox.FLabel; @@ -50,7 +52,7 @@ public enum VSubmenuQuestDecks implements IVSubmenu { * @see forge.view.home.IViewSubmenu#getGroup() */ @Override - public EMenuGroup getGroup() { + public EMenuGroup getGroupEnum() { return EMenuGroup.QUEST; } @@ -62,6 +64,30 @@ public enum VSubmenuQuestDecks implements IVSubmenu { return pnl; } + /* (non-Javadoc) + * @see forge.gui.home.IVSubmenu#getMenuTitle() + */ + @Override + public String getMenuTitle() { + return "Quest Decks"; + } + + /* (non-Javadoc) + * @see forge.gui.home.IVSubmenu#getMenuName() + */ + @Override + public String getItemEnum() { + return EMenuItem.QUEST_DECKS.toString(); + } + + /* (non-Javadoc) + * @see forge.gui.home.IVSubmenu#getControl() + */ + @Override + public ICSubmenu getControl() { + return CSubmenuQuestDecks.SINGLETON_INSTANCE; + } + /** @return {@link forge.view.toolbox.DeckLister} */ public DeckLister getLstDecks() { return this.lstDecks; diff --git a/src/main/java/forge/gui/home/quest/VSubmenuQuestPrefs.java b/src/main/java/forge/gui/home/quest/VSubmenuQuestPrefs.java index dde9eca82cd..f54e2418afd 100644 --- a/src/main/java/forge/gui/home/quest/VSubmenuQuestPrefs.java +++ b/src/main/java/forge/gui/home/quest/VSubmenuQuestPrefs.java @@ -16,6 +16,8 @@ import javax.swing.SwingConstants; import net.miginfocom.swing.MigLayout; import forge.Singletons; import forge.gui.home.EMenuGroup; +import forge.gui.home.EMenuItem; +import forge.gui.home.ICSubmenu; import forge.gui.home.IVSubmenu; import forge.quest.data.QuestPreferences; import forge.quest.data.QuestPreferences.QPref; @@ -129,7 +131,7 @@ public enum VSubmenuQuestPrefs implements IVSubmenu { * @see forge.view.home.IViewSubmenu#getGroup() */ @Override - public EMenuGroup getGroup() { + public EMenuGroup getGroupEnum() { return EMenuGroup.QUEST; } @@ -141,6 +143,30 @@ public enum VSubmenuQuestPrefs implements IVSubmenu { return pnl; } + /* (non-Javadoc) + * @see forge.gui.home.IVSubmenu#getMenuTitle() + */ + @Override + public String getMenuTitle() { + return "Quest Preferences"; + } + + /* (non-Javadoc) + * @see forge.gui.home.IVSubmenu#getMenuName() + */ + @Override + public String getItemEnum() { + return EMenuItem.QUEST_PREFS.toString(); + } + + /* (non-Javadoc) + * @see forge.gui.home.IVSubmenu#getControl() + */ + @Override + public ICSubmenu getControl() { + return CSubmenuQuestPrefs.SINGLETON_INSTANCE; + } + /** @return {@link javax.swing.JLabel} */ public JLabel getLblErrRewards() { return lblErrRewards; diff --git a/src/main/java/forge/gui/home/settings/CSubmenuPreferences.java b/src/main/java/forge/gui/home/settings/CSubmenuPreferences.java index b9f05754acf..be04bc400bd 100644 --- a/src/main/java/forge/gui/home/settings/CSubmenuPreferences.java +++ b/src/main/java/forge/gui/home/settings/CSubmenuPreferences.java @@ -2,18 +2,15 @@ package forge.gui.home.settings; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; - -import javax.swing.ImageIcon; -import javax.swing.SwingWorker; -import javax.swing.event.ListSelectionEvent; -import javax.swing.event.ListSelectionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; import org.apache.commons.lang3.text.WordUtils; import forge.Command; import forge.Constant; import forge.Singletons; -import forge.control.FControl; +import forge.control.RestartUtil; import forge.gui.home.ICSubmenu; import forge.properties.ForgePreferences; import forge.properties.ForgePreferences.FPref; @@ -39,10 +36,9 @@ public enum CSubmenuPreferences implements ICSubmenu { final VSubmenuPreferences view = VSubmenuPreferences.SINGLETON_INSTANCE; final ForgePreferences prefs = Singletons.getModel().getPreferences(); - view.getLstChooseSkin().addListSelectionListener(new ListSelectionListener() { + view.getLstChooseSkin().addMouseListener(new MouseAdapter() { @Override - public void valueChanged(ListSelectionEvent e) { - if (e.getValueIsAdjusting()) { return; } + public void mouseClicked(final MouseEvent e) { updateSkin(); } }); @@ -145,7 +141,7 @@ public enum CSubmenuPreferences implements ICSubmenu { @Override public void execute() { Singletons.getModel().getPreferences().reset(); - Singletons.getView().getViewHome().resetSettings(); + update(); } }); } @@ -199,30 +195,16 @@ public enum CSubmenuPreferences implements ICSubmenu { private void updateSkin() { final VSubmenuPreferences view = VSubmenuPreferences.SINGLETON_INSTANCE; final ForgePreferences prefs = Singletons.getModel().getPreferences(); - - view.getLblTitleSkin().setText(" Loading..."); - view.getLblTitleSkin().setIcon(new ImageIcon("res/images/skins/default/loader.gif")); - final String name = view.getLstChooseSkin().getSelectedValue().toString(); - final SwingWorker w = new SwingWorker() { - @Override - public String doInBackground() { - FSkin.loadLight(name); - FSkin.loadFull(); + if (name.equals(prefs.getPref(FPref.UI_SKIN))) { return; } + RestartUtil.restartApplication(new Runnable() { + @Override + public void run() { prefs.setPref(FPref.UI_SKIN, name); prefs.save(); - return null; } - - @Override - protected void done() { - Singletons.getView().instantiateCachedUIStates(); - Singletons.getControl().changeState(FControl.HOME_SCREEN); - Singletons.getView().getViewHome().showSettingsMenu(); - } - }; - w.execute(); + }); } } diff --git a/src/main/java/forge/gui/home/settings/VSubmenuAvatars.java b/src/main/java/forge/gui/home/settings/VSubmenuAvatars.java index c5c32819874..ba9b19a517e 100644 --- a/src/main/java/forge/gui/home/settings/VSubmenuAvatars.java +++ b/src/main/java/forge/gui/home/settings/VSubmenuAvatars.java @@ -1,23 +1,22 @@ package forge.gui.home.settings; import java.awt.Dimension; -import java.awt.Graphics; import java.awt.Image; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.util.ArrayList; -import java.util.List; +import java.util.Map; -import javax.swing.JLabel; +import javax.swing.ImageIcon; import javax.swing.JPanel; import javax.swing.JScrollPane; import net.miginfocom.swing.MigLayout; -import forge.PlayerType; +import forge.Command; import forge.Singletons; import forge.gui.home.EMenuGroup; +import forge.gui.home.EMenuItem; +import forge.gui.home.ICSubmenu; import forge.gui.home.IVSubmenu; import forge.properties.ForgePreferences.FPref; +import forge.view.toolbox.FLabel; import forge.view.toolbox.FScrollPane; import forge.view.toolbox.FSkin; import forge.view.toolbox.WrapLayout; @@ -33,8 +32,10 @@ public enum VSubmenuAvatars implements IVSubmenu { private final JPanel pnl = new JPanel(); private final JPanel pnlAvatars = new JPanel(); - private AvatarLabel avatarHuman, avatarAI; - private List lstAvatars; + private final FLabel lblAvatarHuman = new FLabel.Builder().hoverable(true).selectable(true) + .iconScaleFactor(0.99f).iconInBackground(true).build(); + private final FLabel lblAvatarAI = new FLabel.Builder().hoverable(true).selectable(true) + .iconScaleFactor(0.99f).iconInBackground(true).build(); /* (non-Javadoc) * @see forge.view.home.IViewSubmenu#populate() @@ -55,7 +56,7 @@ public enum VSubmenuAvatars implements IVSubmenu { * @see forge.view.home.IViewSubmenu#getGroup() */ @Override - public EMenuGroup getGroup() { + public EMenuGroup getGroupEnum() { return EMenuGroup.SETTINGS; } @@ -67,162 +68,117 @@ public enum VSubmenuAvatars implements IVSubmenu { return pnl; } - private void populateAvatars() { - pnlAvatars.removeAll(); - pnlAvatars.setLayout(new WrapLayout()); - pnlAvatars.setOpaque(false); + /* (non-Javadoc) + * @see forge.gui.home.IVSubmenu#getMenuTitle() + */ + @Override + public String getMenuTitle() { + return "Avatars"; + } - lstAvatars = new ArrayList(); - int counter = 0; - for (final Image i : FSkin.getAvatars().values()) { - lstAvatars.add(new AvatarLabel(i, counter++)); - pnlAvatars.add(lstAvatars.get(lstAvatars.size() - 1)); + /* (non-Javadoc) + * @see forge.gui.home.IVSubmenu#getMenuName() + */ + @Override + public String getItemEnum() { + return EMenuItem.SETTINGS_AVATARS.toString(); + } + + /* (non-Javadoc) + * @see forge.gui.home.IVSubmenu#getControl() + */ + @Override + public ICSubmenu getControl() { + return CSubmenuAvatars.SINGLETON_INSTANCE; + } + + @SuppressWarnings("serial") + private void populateAvatars() { + final Map avatarMap = FSkin.getAvatars(); + final JPanel pnlAvatarPics = new JPanel(new WrapLayout()); + final JPanel pnlAvatarUsers = new JPanel(new MigLayout("insets 0, gap 0, align center")); + + pnlAvatars.setOpaque(false); + pnlAvatarUsers.setOpaque(false); + pnlAvatarPics.setOpaque(false); + + pnlAvatarUsers.add(new FLabel.Builder().fontSize(12).text("Human").build(), + "w 100px!, h 20px!, gap 0 20px 0 0"); + pnlAvatarUsers.add(new FLabel.Builder().fontSize(12).text("AI").build(), + "w 100px!, h 20px!, wrap"); + + pnlAvatarUsers.add(lblAvatarHuman, "w 100px!, h 100px!, gap 0 20px 0 0"); + pnlAvatarUsers.add(lblAvatarAI, "w 100px!, h 100px!"); + + for (final Integer i : avatarMap.keySet()) { + pnlAvatarPics.add(makeAvatarLabel(avatarMap.get(i), i)); } + pnlAvatars.removeAll(); + pnlAvatars.setLayout(new MigLayout("insets 0, gap 0")); + pnlAvatars.add(pnlAvatarUsers, "w 90%!, h 150px!, wrap"); + pnlAvatars.add(new FScrollPane(pnlAvatarPics, + JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER), + "w 90%!, pushy, growy, gap 5% 0 0 0"); + + final Command cmdHuman = new Command() { @Override + public void execute() { lblAvatarAI.setSelected(false); } }; + + final Command cmdAI = new Command() { @Override + public void execute() { lblAvatarHuman.setSelected(false); } }; + + lblAvatarHuman.setCommand(cmdHuman); + lblAvatarAI.setCommand(cmdAI); + + lblAvatarHuman.setSelected(true); + final String[] indexes = Singletons.getModel().getPreferences().getPref(FPref.UI_AVATARS).split(","); int humanIndex = Integer.parseInt(indexes[0]); int aiIndex = Integer.parseInt(indexes[1]); - // Set human avatar from preferences - if (humanIndex >= lstAvatars.size()) { - humanIndex = (int) (Math.random() * (lstAvatars.size() - 1)); - } + if (humanIndex >= FSkin.getAvatars().size()) { humanIndex = 0; } + if (aiIndex >= FSkin.getAvatars().size()) { aiIndex = 0; } - avatarHuman = lstAvatars.get(humanIndex); - avatarHuman.setOwner(PlayerType.HUMAN); - avatarHuman.repaintOnlyThisLabel(); + lblAvatarHuman.setIcon(new ImageIcon(FSkin.getAvatars().get(humanIndex))); + lblAvatarAI.setIcon(new ImageIcon(FSkin.getAvatars().get(aiIndex))); - if (humanIndex == aiIndex || aiIndex >= lstAvatars.size()) { - aiIndex = humanIndex; - while (aiIndex == humanIndex) { - aiIndex = (int) (Math.random() * (lstAvatars.size() - 1)); - } - } - - avatarAI = lstAvatars.get(aiIndex); - avatarAI.setOwner(PlayerType.COMPUTER); - avatarAI.repaintOnlyThisLabel(); + Singletons.getModel().getPreferences().setPref(FPref.UI_AVATARS, aiIndex + "," + humanIndex); + Singletons.getModel().getPreferences().save(); } @SuppressWarnings("serial") - private class AvatarLabel extends JLabel { - private final Image img; - private final int index; - private PlayerType owner; - private boolean hovered = false; + private FLabel makeAvatarLabel(final Image img0, final int index0) { + final FLabel lbl = new FLabel.Builder().icon(new ImageIcon(img0)).iconScaleFactor(1.0) + .iconAlpha(0.7f).iconInBackground(true).hoverable(true).build(); - public AvatarLabel(final Image img0, final int index0) { - super(); - img = img0; - index = index0; - setMaximumSize(new Dimension(100, 120)); - setMinimumSize(new Dimension(100, 120)); - setPreferredSize(new Dimension(100, 120)); + final Dimension size = new Dimension(100, 100); + lbl.setPreferredSize(size); + lbl.setMaximumSize(size); + lbl.setMinimumSize(size); - this.addMouseListener(new MouseAdapter() { - @Override - public void mouseEntered(final MouseEvent evt) { hovered = true; repaintOnlyThisLabel(); } + final Command cmd = new Command() { + @Override + public void execute() { + String[] indices = Singletons.getModel().getPreferences() + .getPref(FPref.UI_AVATARS).split(","); - @Override - public void mouseExited(final MouseEvent evt) { hovered = false; repaintOnlyThisLabel(); } - - @Override - public void mouseClicked(final MouseEvent evt) { cycleOwner(AvatarLabel.this); repaintOnlyThisLabel(); } - }); - } - - public void setOwner(final PlayerType player0) { - this.owner = player0; - } - - public PlayerType getOwner() { - return this.owner; - } - - public int getIndex() { - return this.index; - } - - public void repaintOnlyThisLabel() { - final Dimension d = AvatarLabel.this.getSize(); - repaint(0, 0, d.width, d.height); - } - - @Override - protected void paintComponent(final Graphics graphics0) { - if (hovered) { - graphics0.setColor(FSkin.getColor(FSkin.Colors.CLR_HOVER)); - graphics0.fillRect(0, 0, 100, 120); - } - - graphics0.drawImage(img, 0, 20, null); - if (owner == null) { return; } - - graphics0.setColor(FSkin.getColor(FSkin.Colors.CLR_TEXT)); - graphics0.drawRect(0, 0, 99, 119); - graphics0.setFont(FSkin.getBoldFont(14)); - graphics0.drawString(owner.toString(), 5, 15); - } - } - - /** Surprisingly complicated - be careful when modifying! */ - private void cycleOwner(final AvatarLabel lbl0) { - if (lbl0.getOwner() == null) { - lbl0.setOwner(PlayerType.HUMAN); - lbl0.repaintOnlyThisLabel(); - - if (avatarHuman != null) { - avatarHuman.setOwner(null); - avatarHuman.repaintOnlyThisLabel(); - } - - avatarHuman = lbl0; - } - else if (lbl0.getOwner() == PlayerType.HUMAN) { - // Re-assign avatar to human - avatarHuman.setOwner(null); - avatarHuman.repaintOnlyThisLabel(); - - for (int i = 0; i < lstAvatars.size(); i++) { - if (lstAvatars.get(i) != lbl0) { - avatarHuman = lstAvatars.get(i); - avatarHuman.setOwner(PlayerType.HUMAN); - avatarHuman.repaintOnlyThisLabel(); - break; + if (lblAvatarAI.isSelected()) { + lblAvatarAI.setIcon(new ImageIcon(FSkin.getAvatars().get(index0))); + lblAvatarAI.repaintOnlyThisLabel(); + indices[0] = String.valueOf(index0); } - } - - // Assign computer - lbl0.setOwner(PlayerType.COMPUTER); - lbl0.repaintOnlyThisLabel(); - - if (avatarAI != null) { - avatarAI.setOwner(null); - avatarAI.repaintOnlyThisLabel(); - } - - avatarAI = lbl0; - } - else { - lbl0.setOwner(null); - lbl0.repaintOnlyThisLabel(); - - // Re-assign avatar to computer - avatarAI.setOwner(null); - avatarAI.repaintOnlyThisLabel(); - - for (int i = 0; i < lstAvatars.size(); i++) { - if (lstAvatars.get(i) != avatarHuman) { - avatarAI = lstAvatars.get(i); - avatarAI.setOwner(PlayerType.COMPUTER); - avatarAI.repaintOnlyThisLabel(); - break; + else { + lblAvatarHuman.setIcon(new ImageIcon(FSkin.getAvatars().get(index0))); + lblAvatarHuman.repaintOnlyThisLabel(); + indices[1] = String.valueOf(index0); } - } - } - Singletons.getModel().getPreferences().setPref( - FPref.UI_AVATARS, avatarHuman.getIndex() + "," + avatarAI.getIndex()); - Singletons.getModel().getPreferences().save(); + Singletons.getModel().getPreferences().setPref(FPref.UI_AVATARS, indices[0] + "," + indices[1]); + Singletons.getModel().getPreferences().save(); + } + }; + + lbl.setCommand(cmd); + return lbl; } } diff --git a/src/main/java/forge/gui/home/settings/VSubmenuPreferences.java b/src/main/java/forge/gui/home/settings/VSubmenuPreferences.java index 0dac86a40a1..6733a757450 100644 --- a/src/main/java/forge/gui/home/settings/VSubmenuPreferences.java +++ b/src/main/java/forge/gui/home/settings/VSubmenuPreferences.java @@ -29,6 +29,8 @@ import forge.Singletons; import forge.control.KeyboardShortcuts; import forge.control.KeyboardShortcuts.Shortcut; import forge.gui.home.EMenuGroup; +import forge.gui.home.EMenuItem; +import forge.gui.home.ICSubmenu; import forge.gui.home.IVSubmenu; import forge.properties.ForgeProps; import forge.properties.NewConstants.Lang.OldGuiNewGame.NewGameText; @@ -154,7 +156,7 @@ public enum VSubmenuPreferences implements IVSubmenu { * @see forge.view.home.IViewSubmenu#getGroup() */ @Override - public EMenuGroup getGroup() { + public EMenuGroup getGroupEnum() { return EMenuGroup.SETTINGS; } @@ -166,6 +168,30 @@ public enum VSubmenuPreferences implements IVSubmenu { return pnl; } + /* (non-Javadoc) + * @see forge.gui.home.IVSubmenu#getMenuTitle() + */ + @Override + public String getMenuTitle() { + return "Preferences"; + } + + /* (non-Javadoc) + * @see forge.gui.home.IVSubmenu#getMenuName() + */ + @Override + public String getItemEnum() { + return EMenuItem.SETTINGS_PREFS.toString(); + } + + /* (non-Javadoc) + * @see forge.gui.home.IVSubmenu#getControl() + */ + @Override + public ICSubmenu getControl() { + return CSubmenuPreferences.SINGLETON_INSTANCE; + } + /** Consolidates checkbox styling in one place. */ @SuppressWarnings("serial") private class OptionsCheckBox extends JCheckBox { @@ -349,11 +375,6 @@ public enum VSubmenuPreferences implements IVSubmenu { return cbDevMode; } - /** @return {@link javax.swing.FLabel} */ - public FLabel getLblTitleSkin() { - return lblTitleSkin; - } - /** @return {@link forge.view.toolbox.FLabel} */ public FLabel getBtnReset() { return btnReset; diff --git a/src/main/java/forge/gui/home/utilities/CSubmenuDeckEditor.java b/src/main/java/forge/gui/home/utilities/CSubmenuDeckEditor.java index 30c4d6bf806..fd55e2bf461 100644 --- a/src/main/java/forge/gui/home/utilities/CSubmenuDeckEditor.java +++ b/src/main/java/forge/gui/home/utilities/CSubmenuDeckEditor.java @@ -59,22 +59,13 @@ public enum CSubmenuDeckEditor implements ICSubmenu { editor = (DeckEditorBase) new DeckEditorLimited(Singletons.getModel().getDecks().getSealed()); } - - final Command exit = new Command() { - private static final long serialVersionUID = -9133358399503226853L; - - @Override - public void execute() { - Singletons.getControl().getControlHome().getControlConstructed().updateDeckLists(); - } - }; - - editor.show(exit); + editor.show(null); if (d0 != null) { editor.getController().setModel(d0); } + editor.setAlwaysOnTop(true); editor.setVisible(true); } } diff --git a/src/main/java/forge/gui/home/utilities/VSubmenuDeckEditor.java b/src/main/java/forge/gui/home/utilities/VSubmenuDeckEditor.java index b5ad71c6dd7..a28c23cd591 100644 --- a/src/main/java/forge/gui/home/utilities/VSubmenuDeckEditor.java +++ b/src/main/java/forge/gui/home/utilities/VSubmenuDeckEditor.java @@ -4,6 +4,8 @@ import javax.swing.JPanel; import net.miginfocom.swing.MigLayout; import forge.gui.home.EMenuGroup; +import forge.gui.home.EMenuItem; +import forge.gui.home.ICSubmenu; import forge.gui.home.IVSubmenu; import forge.view.toolbox.FLabel; @@ -35,7 +37,7 @@ public enum VSubmenuDeckEditor implements IVSubmenu { * @see forge.view.home.IViewSubmenu#getGroup() */ @Override - public EMenuGroup getGroup() { + public EMenuGroup getGroupEnum() { return EMenuGroup.UTILITIES; } @@ -46,4 +48,28 @@ public enum VSubmenuDeckEditor implements IVSubmenu { public JPanel getPanel() { return pnl; } + + /* (non-Javadoc) + * @see forge.gui.home.IVSubmenu#getMenuTitle() + */ + @Override + public String getMenuTitle() { + return "Deck Editor"; + } + + /* (non-Javadoc) + * @see forge.gui.home.IVSubmenu#getMenuName() + */ + @Override + public String getItemEnum() { + return EMenuItem.UTILITIES_EDITOR.toString(); + } + + /* (non-Javadoc) + * @see forge.gui.home.IVSubmenu#getControl() + */ + @Override + public ICSubmenu getControl() { + return CSubmenuDeckEditor.SINGLETON_INSTANCE; + } } diff --git a/src/main/java/forge/gui/home/utilities/VSubmenuUtilities.java b/src/main/java/forge/gui/home/utilities/VSubmenuUtilities.java index 465c01a173b..64b92a1b0d1 100644 --- a/src/main/java/forge/gui/home/utilities/VSubmenuUtilities.java +++ b/src/main/java/forge/gui/home/utilities/VSubmenuUtilities.java @@ -20,6 +20,8 @@ import javax.swing.text.StyledDocument; import net.miginfocom.swing.MigLayout; import forge.gui.GuiUtils; import forge.gui.home.EMenuGroup; +import forge.gui.home.EMenuItem; +import forge.gui.home.ICSubmenu; import forge.gui.home.IVSubmenu; import forge.properties.ForgeProps; import forge.properties.NewConstants.Lang; @@ -123,7 +125,7 @@ public enum VSubmenuUtilities implements IVSubmenu { * @see forge.view.home.IViewSubmenu#getGroup() */ @Override - public EMenuGroup getGroup() { + public EMenuGroup getGroupEnum() { return EMenuGroup.UTILITIES; } @@ -265,4 +267,28 @@ public enum VSubmenuUtilities implements IVSubmenu { overlay.add(scr); overlay.showOverlay(); } + + /* (non-Javadoc) + * @see forge.gui.home.IVSubmenu#getMenuTitle() + */ + @Override + public String getMenuTitle() { + return "Content Downloaders"; + } + + /* (non-Javadoc) + * @see forge.gui.home.IVSubmenu#getMenuName() + */ + @Override + public String getItemEnum() { + return EMenuItem.UTILITIES_DOWNLOADS.toString(); + } + + /* (non-Javadoc) + * @see forge.gui.home.IVSubmenu#getControl() + */ + @Override + public ICSubmenu getControl() { + return CSubmenuUtilities.SINGLETON_INSTANCE; + } } diff --git a/src/main/java/forge/model/FModel.java b/src/main/java/forge/model/FModel.java index a3d118681a6..e5d0f4468ae 100644 --- a/src/main/java/forge/model/FModel.java +++ b/src/main/java/forge/model/FModel.java @@ -50,9 +50,9 @@ import forge.properties.NewConstants; import forge.quest.data.QuestEventManager; import forge.quest.data.QuestPreferences; import forge.util.FileUtil; -import forge.util.StorageView; import forge.util.HttpUtil; import forge.util.IStorageView; +import forge.util.StorageView; import forge.view.match.ViewField; import forge.view.match.ViewTabber; import forge.view.toolbox.FSkin; @@ -108,7 +108,7 @@ public enum FModel { final boolean deleteSucceeded = logFile.delete(); if (logFile.exists() && !deleteSucceeded && (logFile.length() != 0)) { - throw new IllegalStateException("Could not delete existing logFile:" + logFile.getAbsolutePath()); + // throw new IllegalStateException("Could not delete existing logFile:" + logFile.getAbsolutePath()); } try { diff --git a/src/main/java/forge/properties/ForgePreferences.java b/src/main/java/forge/properties/ForgePreferences.java index c68f726a892..0989836f955 100644 --- a/src/main/java/forge/properties/ForgePreferences.java +++ b/src/main/java/forge/properties/ForgePreferences.java @@ -26,6 +26,8 @@ import java.io.IOException; import java.util.HashMap; import java.util.Map; +import forge.gui.home.EMenuItem; + /** * Holds default preference values in an enum. * Loads preferred values when instantiated. @@ -60,7 +62,12 @@ public class ForgePreferences { UI_BUGZ_PWD (""), /** */ UI_ANTE ("false"), /** */ UI_SKIN ("default"), /** */ - UI_HOMEMENU (HomeMenus.constructed.toString()), /** */ + + SUBMENU_CURRENTMENU (EMenuItem.CONSTRUCTED.toString()), /** */ + SUBMENU_SANCTIONED ("false"), /** */ + SUBMENU_QUEST ("false"), /** */ + SUBMENU_SETTINGS ("false"), /** */ + SUBMENU_UTILITIES ("false"), /** */ DEV_MODE_ENABLED ("false"), /** */ DEV_MILLING_LOSS ("true"), /** */ diff --git a/src/main/java/forge/view/FView.java b/src/main/java/forge/view/FView.java index 228ab511e36..4c33f3899bd 100644 --- a/src/main/java/forge/view/FView.java +++ b/src/main/java/forge/view/FView.java @@ -26,8 +26,6 @@ import javax.swing.SwingUtilities; import forge.Singletons; import forge.control.FControl; -import forge.properties.ForgePreferences; -import forge.properties.ForgePreferences.FPref; import forge.view.toolbox.FOverlay; import forge.view.toolbox.FSkin; @@ -44,14 +42,10 @@ public enum FView { private final FOverlay overlay = new FOverlay(); private SplashFrame splash; - private ViewHomeUI home = null; private ViewMatchUI match = null; private ViewEditorUI editor = null; private ViewBazaarUI bazaar = null; - //private static final JLayeredPane lpnContent; - //private static final FControl control; - /** The splash frame is guaranteed to exist when this constructor exits. */ private FView() { SwingUtilities.invokeLater(new Runnable() { @@ -94,21 +88,6 @@ public enum FView { FView.this.splash = null; frame.setVisible(true); - - // Open previous menu on first run, or constructed. - // Focus is reset when the frame becomes visible, - // so the call to show the menu must happen here. - final ForgePreferences.HomeMenus lastMenu = - ForgePreferences.HomeMenus.valueOf(Singletons.getModel().getPreferences().getPref(FPref.UI_HOMEMENU)); - - switch(lastMenu) { - case draft: Singletons.getView().getViewHome().showDraftMenu(); break; - case sealed: Singletons.getView().getViewHome().showSealedMenu(); break; - case quest: Singletons.getView().getViewHome().showQuestMenu(); break; - case settings: Singletons.getView().getViewHome().showSettingsMenu(); break; - case utilities: Singletons.getView().getViewHome().showUtilitiesMenu(); break; - default: Singletons.getView().getViewHome().showConstructedMenu(); - } } /** @return {@link javax.swing.JLayeredPane} */ @@ -126,15 +105,6 @@ public enum FView { return FView.this.overlay; } - /** @return {@link forge.view.ViewHomeUI} */ - public ViewHomeUI getViewHome() { - if (Singletons.getControl().getState() != FControl.HOME_SCREEN) { - throw new IllegalArgumentException("FView$getViewHome\n" - + "may only be called while the home UI is showing."); - } - return FView.this.home; - } - /** @return {@link forge.view.ViewMatchUI} */ public ViewMatchUI getViewMatch() { if (Singletons.getControl().getState() != FControl.MATCH_SCREEN) { @@ -164,9 +134,9 @@ public enum FView { /** Like it says. */ public void instantiateCachedUIStates() { - FView.this.home = new ViewHomeUI(); FView.this.match = new ViewMatchUI(); FView.this.editor = new ViewEditorUI(); FView.this.bazaar = new ViewBazaarUI(); + ViewHomeUI.SINGLETON_INSTANCE.initialize(); } } diff --git a/src/main/java/forge/view/ViewHomeUI.java b/src/main/java/forge/view/ViewHomeUI.java index de10a46a863..45c5ed2b057 100644 --- a/src/main/java/forge/view/ViewHomeUI.java +++ b/src/main/java/forge/view/ViewHomeUI.java @@ -17,371 +17,303 @@ */ package forge.view; +import java.awt.CardLayout; +import java.awt.Component; import java.awt.Rectangle; -import java.awt.event.ActionEvent; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.SortedMap; +import java.util.TreeMap; -import javax.swing.AbstractAction; -import javax.swing.JButton; +import javax.swing.BorderFactory; import javax.swing.JLabel; import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.SwingConstants; import javax.swing.SwingUtilities; +import javax.swing.border.EmptyBorder; +import javax.swing.border.MatteBorder; import net.miginfocom.swing.MigLayout; +import forge.AllZone; +import forge.Command; import forge.Singletons; -import forge.control.ControlHomeUI; -import forge.game.GameType; +import forge.gui.home.EMenuGroup; +import forge.gui.home.EMenuItem; +import forge.gui.home.IVSubmenu; +import forge.gui.home.limited.VSubmenuConstructed; +import forge.gui.home.limited.VSubmenuDraft; +import forge.gui.home.limited.VSubmenuSealed; +import forge.gui.home.quest.VSubmenuChallenges; +import forge.gui.home.quest.VSubmenuDuels; +import forge.gui.home.quest.VSubmenuQuestData; +import forge.gui.home.quest.VSubmenuQuestDecks; +import forge.gui.home.quest.VSubmenuQuestPrefs; +import forge.gui.home.settings.VSubmenuAvatars; +import forge.gui.home.settings.VSubmenuPreferences; +import forge.gui.home.utilities.VSubmenuDeckEditor; +import forge.gui.home.utilities.VSubmenuUtilities; import forge.properties.ForgePreferences; import forge.properties.ForgePreferences.FPref; -import forge.view.home.ViewConstructed; -import forge.view.home.ViewDraft; -import forge.view.home.ViewQuest; -import forge.view.home.ViewSealed; -import forge.view.home.ViewSettings; -import forge.view.home.ViewUtilities; -import forge.view.toolbox.FButton; +import forge.properties.ForgeProps; +import forge.properties.NewConstants; +import forge.quest.data.QuestDataIO; +import forge.quest.data.QuestPreferences.QPref; +import forge.view.toolbox.FLabel; import forge.view.toolbox.FPanel; +import forge.view.toolbox.FScrollPane; import forge.view.toolbox.FSkin; -/** - * - Lays out containers and borders for main menu and submenus
- * - Instantiates top-level controller for submenus.
- * - Has access methods for all child controllers
- * +/** Singleton instance of home screen UI. + * Use "getPanel()" to work with the main container. + *

+ * Generates a card layout with grouped submenus automatically.
+ * To add a menu to the home UI:
+ * - Register its name in the EMenuItem enum
+ * - Build a view implementing IVSubmenu
+ * - Build a controller impelementing ICSubmenu
+ * - Add its singleton instance to the map storing the views for the card layout. */ -@SuppressWarnings("serial") -public class ViewHomeUI extends FPanel { - private JPanel pnlMenu, pnlContent; - private FButton btnDraft, btnConstructed, btnSealed, btnQuest, btnSettings, btnUtilities, btnExit, btnDeckEditor; - private String constraints; - private ControlHomeUI control; +public enum ViewHomeUI { + /** */ + SINGLETON_INSTANCE; - private ViewConstructed constructed; - private ViewSealed sealed; - private ViewDraft draft; - private ViewQuest quest; - private ViewSettings settings; - private ViewUtilities utilities; + private final CardLayout cards = new CardLayout(); + private final FPanel pnlParent = new FPanel(); + private final FPanel pnlLeft = new FPanel(); + private final FPanel pnlRight = new FPanel(cards); + private final JPanel pnlMenu = new JPanel(); private final int insets = 10; - private final int menuWidthPx = 350; + private final int leftWidthPx = 250; + private final List allSubmenus = new ArrayList(); + private final Map allSubmenuLabels = new HashMap(); + private FLabel lblPreviousSelected; - /** - * Instantiates a new home top level. - */ - public ViewHomeUI() { - super(); + /** Mostly, assembles child singletons for the home screen UI. */ + public void initialize() { + // There's d a better home for this (model?) + final File dirQuests = ForgeProps.getFile(NewConstants.Quest.DATA_DIR); + final String questname = Singletons.getModel() + .getQuestPreferences().getPreference(QPref.CURRENT_QUEST); + final File data = new File(dirQuests.getPath() + File.separator + questname); - constructed = new ViewConstructed(); - sealed = new ViewSealed(); - draft = new ViewDraft(); - quest = new ViewQuest(); - settings = new ViewSettings(); - utilities = new ViewUtilities(); + if (data.exists()) { + AllZone.setQuestData(QuestDataIO.loadData(data)); + } ////////////////////////////// + - this.setCornerDiameter(0); - this.setBorderToggle(false); - this.setBackgroundTexture(FSkin.getIcon(FSkin.Backgrounds.BG_TEXTURE)); - this.setLayout(null); - this.addComponentListener(new ComponentAdapter() { + // Add new menu items here (order doesn't matter). + allSubmenus.clear(); + allSubmenus.add(VSubmenuConstructed.SINGLETON_INSTANCE); + allSubmenus.add(VSubmenuDraft.SINGLETON_INSTANCE); + allSubmenus.add(VSubmenuSealed.SINGLETON_INSTANCE); + + allSubmenus.add(VSubmenuDuels.SINGLETON_INSTANCE); + allSubmenus.add(VSubmenuChallenges.SINGLETON_INSTANCE); + allSubmenus.add(VSubmenuQuestDecks.SINGLETON_INSTANCE); + allSubmenus.add(VSubmenuQuestData.SINGLETON_INSTANCE); + allSubmenus.add(VSubmenuQuestPrefs.SINGLETON_INSTANCE); + + allSubmenus.add(VSubmenuPreferences.SINGLETON_INSTANCE); + allSubmenus.add(VSubmenuAvatars.SINGLETON_INSTANCE); + + allSubmenus.add(VSubmenuDeckEditor.SINGLETON_INSTANCE); + allSubmenus.add(VSubmenuUtilities.SINGLETON_INSTANCE); + + // Parent layout + pnlParent.setCornerDiameter(0); + pnlParent.setBorderToggle(false); + pnlParent.setBackgroundTexture(FSkin.getIcon(FSkin.Backgrounds.BG_TEXTURE)); + pnlParent.setLayout(null); + + pnlParent.add(pnlLeft); + pnlParent.add(pnlRight); + + // Left pane holds scroller with menu panel. + final FScrollPane scrMenu = new FScrollPane(pnlMenu, + JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); + scrMenu.setBorder(null); + + pnlLeft.setLayout(new MigLayout("insets 0, gap 0, align center, wrap")); + pnlLeft.add(new FLabel.Builder().icon(FSkin.getIcon(FSkin.ForgeIcons.ICO_LOGO)) + .iconScaleFactor(1.0f).build(), "w 150px!, h 150px!, align center"); + + pnlLeft.add(scrMenu, "pushy, growy, w 98%!, gap 1% 0 1% 0"); + + populateMenu(); + + // Select previous + EMenuItem selected = null; + try { + selected = EMenuItem.valueOf(Singletons.getModel() + .getPreferences().getPref(FPref.SUBMENU_CURRENTMENU)); + } catch (final Exception e) { } + + if (selected != null && allSubmenuLabels.get(selected) != null) { + itemClick(selected); + } + else { + itemClick(EMenuItem.CONSTRUCTED); + } + + pnlParent.addComponentListener(new ComponentAdapter() { @Override - public void componentResized(ComponentEvent e) { - int w = getWidth(); - int h = getHeight(); - pnlContent.setBounds(new Rectangle( - 2 * insets + menuWidthPx, insets, - w - menuWidthPx - 3 * insets, h - 2 * insets)); - pnlMenu.setBounds(new Rectangle( + public void componentResized(final ComponentEvent e) { + final int w = pnlParent.getWidth(); + final int h = pnlParent.getHeight(); + pnlRight.setBounds(new Rectangle( + 2 * insets + leftWidthPx, insets, + w - leftWidthPx - 3 * insets, h - 2 * insets)); + pnlLeft.setBounds(new Rectangle( insets, insets, - menuWidthPx, h - 2 * insets + leftWidthPx, h - 2 * insets )); - revalidate(); - } - }); - - pnlMenu = new FPanel(); - pnlMenu.setLayout(new MigLayout("insets 0, gap 0, wrap")); - - pnlContent = new FPanel(); - pnlContent.setLayout(new MigLayout("insets 0, gap 0")); - - btnConstructed = new FButton(); - btnConstructed.setAction(new AbstractAction() { - public void actionPerformed(ActionEvent arg0) { showConstructedMenu(); } - }); - btnConstructed.setText("Constructed"); - - btnSealed = new FButton(); - btnSealed.setAction(new AbstractAction() { - public void actionPerformed(ActionEvent arg0) { showSealedMenu(); } - }); - btnSealed.setText("Sealed"); - - btnDraft = new FButton(); - btnDraft.setAction(new AbstractAction() { - public void actionPerformed(ActionEvent arg0) { showDraftMenu(); } - }); - btnDraft.setText("Draft"); - - btnQuest = new FButton(); - btnQuest.setAction(new AbstractAction() { - public void actionPerformed(ActionEvent arg0) { showQuestMenu(); } - }); - btnQuest.setText("Quest"); - - btnDeckEditor = new FButton(); - btnDeckEditor.setAction(new AbstractAction() { - public void actionPerformed(ActionEvent arg0) { - Singletons.getControl().getControlHome().getControlUtilities().showDeckEditor(GameType.Constructed, null); - } - }); - btnDeckEditor.setText("Deck Editor"); - - btnSettings = new FButton(); - btnSettings.setAction(new AbstractAction() { - public void actionPerformed(ActionEvent arg0) { showSettingsMenu(); } - }); - btnSettings.setText("Settings"); - - btnUtilities = new FButton(); - btnUtilities.setAction(new AbstractAction() { - public void actionPerformed(ActionEvent arg0) { showUtilitiesMenu(); } - }); - btnUtilities.setText("Utilities"); - - btnExit = new FButton(); - btnExit.setAction(new AbstractAction() { - public void actionPerformed(ActionEvent arg0) { control.exit(); } - }); - btnExit.setText("Exit"); - - add(pnlMenu, "w 36%!, h 96%!, gap 2% 2% 2% 2%"); - add(pnlContent, "w 58%!, h 96%!, gap 0% 2% 2% 2%"); - - JLabel lblIcon = new JLabel(FSkin.getIcon(FSkin.ForgeIcons.ICO_LOGO)); - pnlMenu.add(lblIcon, "gapleft 10%, ax center"); - - constraints = "w 80%!, gapleft 10%, gaptop 1%, gapbottom 1%, h 40px!"; - pnlMenu.add(btnConstructed, constraints); - pnlMenu.add(btnSealed, constraints); - pnlMenu.add(btnDraft, constraints); - pnlMenu.add(btnQuest, constraints); - //pnlMenu.add(btnDeckEditor, constraints); - pnlMenu.add(btnSettings, constraints); - pnlMenu.add(btnUtilities, constraints); - pnlMenu.add(btnExit, constraints); - - control = new ControlHomeUI(this); - } - - /** Opens menu for constructed mode. */ - public void showConstructedMenu() { - clearToggles(); - pnlContent.removeAll(); - pnlContent.add(constructed, "w 100%!, h 100%!"); - pnlContent.revalidate(); - pnlContent.repaint(); - - Singletons.getControl().getControlHome().getControlConstructed().updateDeckSelectionCheckboxes(); - - SwingUtilities.invokeLater(new Runnable() { @Override - public void run() { - btnConstructed.setToggled(true); - btnConstructed.grabFocus(); - } - }); - - Singletons.getModel().getPreferences().setPref(FPref.UI_HOMEMENU, - ForgePreferences.HomeMenus.constructed.toString()); - Singletons.getModel().getPreferences().save(); - } - - /** Opens menu for draft mode. */ - public void showDraftMenu() { - clearToggles(); - pnlContent.removeAll(); - pnlContent.add(draft, "w 100%!, h 100%!"); - pnlContent.revalidate(); - pnlContent.repaint(); - - SwingUtilities.invokeLater(new Runnable() { @Override - public void run() { - btnDraft.setToggled(true); - btnDraft.grabFocus(); - } - }); - - Singletons.getModel().getPreferences().setPref(FPref.UI_HOMEMENU, - ForgePreferences.HomeMenus.draft.toString()); - Singletons.getModel().getPreferences().save(); - } - - /** Opens menu for sealed mode. */ - public void showSealedMenu() { - clearToggles(); - pnlContent.removeAll(); - pnlContent.add(sealed, "w 100%!, h 100%!"); - pnlContent.revalidate(); - pnlContent.repaint(); - - SwingUtilities.invokeLater(new Runnable() { @Override - public void run() { - btnSealed.setToggled(true); - btnSealed.grabFocus(); - } - }); - - Singletons.getModel().getPreferences().setPref(FPref.UI_HOMEMENU, - ForgePreferences.HomeMenus.sealed.toString()); - Singletons.getModel().getPreferences().save(); - } - - /** Opens menu for quest mode. */ - public void showQuestMenu() { - clearToggles(); - pnlContent.removeAll(); - pnlContent.add(quest, "w 99%!, h 95%!, gaptop 2.5%, gapleft 0.5%"); - pnlContent.revalidate(); - pnlContent.repaint(); - - Singletons.getModel().getPreferences().setPref(FPref.UI_HOMEMENU, - ForgePreferences.HomeMenus.quest.toString()); - Singletons.getModel().getPreferences().save(); - - SwingUtilities.invokeLater(new Runnable() { @Override - public void run() { - btnQuest.setToggled(true); - btnQuest.grabFocus(); + pnlParent.revalidate(); } }); } - /** Opens menu for settings. */ - public void showSettingsMenu() { - clearToggles(); - pnlContent.removeAll(); - pnlContent.add(settings, "w 99%!, h 95%!, gaptop 2.5%, gapleft 0.5%"); - pnlContent.revalidate(); - pnlContent.repaint(); + /** Generates expand/collapse menu using cards in layout, and EMenuGroup enum. + * No further hardcoding should be required in this method. */ + private void populateMenu() { + final SortedMap allGroupPanels = new TreeMap(); + final Map allGroupLabels = new HashMap(); - Singletons.getModel().getPreferences().setPref(FPref.UI_HOMEMENU, - ForgePreferences.HomeMenus.settings.toString()); - Singletons.getModel().getPreferences().save(); + final ForgePreferences prefs = Singletons.getModel().getPreferences(); + final String strTitleConstraints = "w 90%!, gap 5% 0 5px 10px"; + final String strGroupConstraints = "w 85%!, gap 10% 0 0 0"; + final String strItemConstraints = "w 100%!, h 26px!, gap 0 0 1px 1px"; - SwingUtilities.invokeLater(new Runnable() { @Override - public void run() { - btnSettings.setToggled(true); - btnSettings.grabFocus(); + pnlMenu.removeAll(); + pnlMenu.setLayout(new MigLayout("insets 0, gap 0, wrap, hidemode 3")); + pnlMenu.setOpaque(false); + + // For each group: init its panel + for (final EMenuGroup e : EMenuGroup.values()) { + allGroupPanels.put(e, new JPanel()); + allGroupPanels.get(e).setOpaque(false); + allGroupPanels.get(e).setVisible(false); + allGroupPanels.get(e).setLayout(new MigLayout("insets 0, gap 0, wrap")); + allGroupPanels.get(e).setName(e.toString()); + } + + // For each item: Add to its group, and add to the card layout in right panel. + allSubmenuLabels.clear(); + for (final IVSubmenu item : allSubmenus) { + allSubmenuLabels.put(EMenuItem.valueOf(item.getItemEnum()), makeItemLabel(item)); + pnlRight.add(item.getItemEnum(), item.getPanel()); + allGroupPanels.get(item.getGroupEnum()).add( + allSubmenuLabels.get(EMenuItem.valueOf(item.getItemEnum())), strItemConstraints); + item.getControl().initialize(); + } + + // For each group: add its title, then its panel, then "click" if necessary. + for (final EMenuGroup e : allGroupPanels.keySet()) { + allGroupLabels.put(e, makeTitleLabel(e)); + pnlMenu.add(allGroupLabels.get(e), strTitleConstraints); + pnlMenu.add(allGroupPanels.get(e), strGroupConstraints); + + // Expand groups expanded from previous session + if (prefs.getPrefBoolean(FPref.valueOf("SUBMENU_" + e.toString()))) { + groupClick(e, allGroupLabels.get(e)); } - }); + } } - /** Opens menu for utilities. */ - public void showUtilitiesMenu() { - clearToggles(); - pnlContent.removeAll(); - pnlContent.add(utilities, "w 100%!, h 100%!"); - pnlContent.revalidate(); - pnlContent.repaint(); + private void groupClick(final EMenuGroup e0, final JLabel lbl0) { + final Component[] menuObjects = pnlMenu.getComponents(); + for (final Component c : menuObjects) { + if (c.getName() != null && c.getName().equals(e0.toString())) { + if (c.isVisible()) { + lbl0.setText("+ " + e0.getTitle()); + c.setVisible(false); + Singletons.getModel().getPreferences().setPref( + FPref.valueOf("SUBMENU_" + e0.toString()), "false"); + } + else { + lbl0.setText("- " + e0.getTitle()); + c.setVisible(true); + Singletons.getModel().getPreferences().setPref( + FPref.valueOf("SUBMENU_" + e0.toString()), "true"); + } - SwingUtilities.invokeLater(new Runnable() { @Override - public void run() { - btnUtilities.setToggled(true); - btnUtilities.grabFocus(); + Singletons.getModel().getPreferences().save(); + break; } - }); - - Singletons.getModel().getPreferences().setPref(FPref.UI_HOMEMENU, - ForgePreferences.HomeMenus.utilities.toString()); - Singletons.getModel().getPreferences().save(); + } } - private void clearToggles() { - btnConstructed.setToggled(false); - btnSealed.setToggled(false); - btnDraft.setToggled(false); - btnQuest.setToggled(false); - btnDeckEditor.setToggled(false); - btnSettings.setToggled(false); - btnUtilities.setToggled(false); + /** Custom title label styling. */ + @SuppressWarnings("serial") + private JLabel makeTitleLabel(final EMenuGroup e0) { + final FLabel lbl = new FLabel.Builder().fontScaleAuto(false).fontSize(16) + .hoverable(true).fontAlign(SwingConstants.LEFT).build(); + + lbl.setBorder(BorderFactory.createCompoundBorder( + new MatteBorder(0, 0, 1, 0, FSkin.getColor(FSkin.Colors.CLR_BORDERS)), + new EmptyBorder(2, 2, 2, 2))); + + lbl.setCommand(new Command() { @Override + public void execute() { groupClick(e0, lbl); } }); + + lbl.setText("+ " + e0.getTitle()); + return lbl; } - /** @return {@link forge.view.home.ViewConstructed} */ - public ViewConstructed getViewConstructed() { - return this.constructed; + /** Custom subsection label styling. */ + @SuppressWarnings("serial") + private FLabel makeItemLabel(final IVSubmenu item) { + final ForgePreferences prefs = Singletons.getModel().getPreferences(); + + final FLabel lbl = new FLabel.Builder().fontScaleAuto(false).fontSize(15) + .hoverable(true).selectable(true).text(item.getMenuTitle()) + .fontAlign(SwingConstants.LEFT).build(); + + final Command cmdOnClick = new Command() { + @Override + public void execute() { + if (lblPreviousSelected != null) { lblPreviousSelected.setSelected(false); } + + cards.show(pnlRight, item.getItemEnum()); + lblPreviousSelected = lbl; + + prefs.setPref(FPref.SUBMENU_CURRENTMENU, item.getItemEnum()); + Singletons.getModel().getPreferences().save(); + + // Make sure this is called last, so it doesn't interfere + // with the selection display process. + SwingUtilities.invokeLater(new Runnable() { + public void run() { + if (item.getControl().getMenuCommand() != null) { + item.getControl().getMenuCommand().execute(); + } + } + }); + } + }; + + lbl.setCommand(cmdOnClick); + lbl.setBorder(new EmptyBorder(0, 10, 0, 0)); + + return lbl; } - /** @return {@link forge.view.home.ViewDraft} */ - public ViewDraft getViewDraft() { - return this.draft; + /** Programatically selects a menu item. + * @param e0   {@forge.gui.home.EMenuItem} */ + public void itemClick(final EMenuItem e0) { + allSubmenuLabels.get(e0).getCommand().execute(); + allSubmenuLabels.get(e0).setSelected(true); } - /** @return {@link forge.view.home.ViewSealed} */ - public ViewSealed getViewSealed() { - return this.sealed; - } - - /** @return {@link forge.view.home.ViewQuest} */ - public ViewQuest getViewQuest() { - return this.quest; - } - - /** @return {@link forge.view.home.ViewSettings} */ - public ViewSettings getViewSettings() { - return this.settings; - } - - /** @return {@link forge.view.home.ViewUtilities} */ - public ViewUtilities getViewUtilities() { - return this.utilities; - } - - /** */ - public void resetQuest() { - quest = new ViewQuest(); - showQuestMenu(); - } - - /** */ - public void resetSettings() { - settings = new ViewSettings(); - showSettingsMenu(); - } - - /** @return ControlHomeUI */ - public ControlHomeUI getControl() { - return control; - } - - /** @return {@link javax.swing.JButton} */ - public JButton getBtnConstructed() { - return this.btnConstructed; - } - - /** @return {@link javax.swing.JButton} */ - public JButton getBtnSealed() { - return this.btnSealed; - } - - /** @return {@link javax.swing.JButton} */ - public JButton getBtnDraft() { - return this.btnDraft; - } - - /** @return {@link javax.swing.JButton} */ - public JButton getBtnQuest() { - return this.btnQuest; - } - - /** @return {@link javax.swing.JButton} */ - public JButton getBtnSettings() { - return this.btnSettings; - } - - /** @return {@link javax.swing.JButton} */ - public JButton getBtnUtilities() { - return this.btnUtilities; + /** @return {@link javax.swing.JPanel} the parent panel containing the home UI. */ + public JPanel getPanel() { + return pnlParent; } } diff --git a/src/main/java/forge/view/editor/package-info.java b/src/main/java/forge/view/editor/package-info.java deleted file mode 100644 index 059003608fb..00000000000 --- a/src/main/java/forge/view/editor/package-info.java +++ /dev/null @@ -1,3 +0,0 @@ -/** Views (as in model-view-controller) for Forge. */ -package forge.view.editor; - diff --git a/src/main/java/forge/view/home/ConstructedDeckSelectPanel.java b/src/main/java/forge/view/home/ConstructedDeckSelectPanel.java deleted file mode 100644 index 9a0935845ed..00000000000 --- a/src/main/java/forge/view/home/ConstructedDeckSelectPanel.java +++ /dev/null @@ -1,278 +0,0 @@ -package forge.view.home; - -import java.awt.Dimension; -import java.awt.FlowLayout; -import java.awt.Toolkit; -import java.awt.datatransfer.StringSelection; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map.Entry; -import java.util.Random; - -import javax.swing.JList; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.ListSelectionModel; -import javax.swing.border.LineBorder; - -import net.miginfocom.swing.MigLayout; -import forge.Command; -import forge.Singletons; -import forge.deck.Deck; -import forge.item.CardPrinted; -import forge.view.toolbox.FLabel; -import forge.view.toolbox.FList; -import forge.view.toolbox.FScrollPane; -import forge.view.toolbox.FSkin; -import forge.view.toolbox.WrapLayout; - -/** - * Shows and manages list selectors for each type of deck - * possible in constructed mode. This panel is fully self-contained, - * there should be no need for further control. - * - *

The current selected deck can be retrieved using getLstCurrentSelected(). - */ -@SuppressWarnings("serial") -public class ConstructedDeckSelectPanel extends JPanel { - private final JList lstCustomDecks, lstQuestDecks, lstColorDecks, lstThemeDecks; - private final String multi = System.getProperty("os.name").equals("Mac OS X") ? "CMD" : "CTRL"; - private final String colorsTT = "Generate deck (Multi-select: " + multi + ")"; - private final String themeTT = "Generate deck with a theme"; - private final String userTT = "Custom decks (Decklist: Double Click)"; - private final String questTT = "Quest event decks (Decklist: Double Click)"; - private final FLabel btnRandomTheme, btnRandomCustom, btnRandomQuest; - private final MouseListener madDeckList; - private JList lstCurrentSelected; - - /** - * - * Basic container for deck choices available in constructed mode. - * Can (should, will be) applied to multiple AIs or humans. - * @param c0 - */ - public ConstructedDeckSelectPanel() { - this.setLayout(new WrapLayout(FlowLayout.CENTER, 10, 10)); - this.setOpaque(false); - final Dimension size = new Dimension(170, 250); - - final Command cmdRandomTheme = new Command() { @Override - public void execute() { randomDeckPick(lstThemeDecks); } }; - final Command cmdRandomUser = new Command() { @Override - public void execute() { randomDeckPick(lstCustomDecks); } }; - final Command cmdRandomQuest = new Command() { @Override - public void execute() { randomDeckPick(lstQuestDecks); } }; - - btnRandomTheme = new FLabel.Builder().text("Random").fontScaleAuto(false) - .hoverable(true).cmdClick(cmdRandomTheme).opaque(true).build(); - - btnRandomCustom = new FLabel.Builder().text("Random").fontScaleAuto(false) - .hoverable(true).cmdClick(cmdRandomUser).opaque(true).build(); - - btnRandomQuest = new FLabel.Builder().text("Random").fontScaleAuto(false) - .hoverable(true).cmdClick(cmdRandomQuest).opaque(true).build(); - - lstCustomDecks = new FList("lstCustom"); - lstQuestDecks = new FList("lstQuest"); - lstColorDecks = new FList("lstColor"); - lstThemeDecks = new FList("lstTheme"); - - lstCustomDecks.setToolTipText(userTT); - lstQuestDecks.setToolTipText(questTT); - lstColorDecks.setToolTipText(colorsTT); - lstThemeDecks.setToolTipText(themeTT); - - lstColorDecks.setBorder(new LineBorder(FSkin.getColor(FSkin.Colors.CLR_BORDERS))); - lstCustomDecks.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - lstQuestDecks.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - lstThemeDecks.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - - final JPanel pnlCustom = new JPanel(new MigLayout("insets 0, gap 0, wrap")); - final FScrollPane scrCustom = new FScrollPane(lstCustomDecks); - scrCustom.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); - scrCustom.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); - - pnlCustom.setOpaque(false); - pnlCustom.add(scrCustom, "w 100%!, h 89%!"); - pnlCustom.add(btnRandomCustom, "w 100%!, h 9%!, gap 0 0 1% 1%, ax center"); - - final JPanel pnlQuest = new JPanel(new MigLayout("insets 0, gap 0, wrap")); - final FScrollPane scrQuest = new FScrollPane(lstQuestDecks); - scrQuest.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); - scrQuest.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); - - pnlQuest.setOpaque(false); - pnlQuest.add(scrQuest, "w 100%!, h 89%!"); - pnlQuest.add(btnRandomQuest, "w 100%!, h 9%!, gap 0 0 1% 1%, ax center"); - - final JPanel pnlTheme = new JPanel(new MigLayout("insets 0, gap 0, wrap")); - final FScrollPane scrTheme = new FScrollPane(lstThemeDecks); - scrTheme.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); - scrTheme.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); - - pnlTheme.setOpaque(false); - pnlTheme.add(scrTheme, "w 100%!, h 89%!"); - pnlTheme.add(btnRandomTheme, "w 100%!, h 9%!, gap 0 0 1% 1%, ax center"); - - // Sizing and adding - pnlCustom.setMinimumSize(size); - pnlCustom.setMaximumSize(size); - pnlCustom.setPreferredSize(size); - - pnlQuest.setMinimumSize(size); - pnlQuest.setMaximumSize(size); - pnlQuest.setPreferredSize(size); - - lstColorDecks.setMinimumSize(size); - lstColorDecks.setMaximumSize(size); - lstColorDecks.setPreferredSize(size); - - pnlTheme.setMinimumSize(size); - pnlTheme.setMaximumSize(size); - pnlTheme.setPreferredSize(size); - - this.add(lstColorDecks); - this.add(pnlCustom); - this.add(pnlTheme); - this.add(pnlQuest); - - // Listener init - madDeckList = new MouseAdapter() { - @Override - public void mouseClicked(MouseEvent e) { - listSelectManager((JList) e.getSource()); - - if (e.getClickCount() == 2 && ((JList) e.getSource()).getName().equals("lstCustom")) { - final String deckName = ((JList) e.getSource()).getSelectedValue().toString(); - showDecklist(Singletons.getModel().getDecks().getConstructed().get(deckName)); - } - else if (e.getClickCount() == 2 && ((JList) e.getSource()).getName().equals("lstQuest")) { - final String deckName = ((JList) e.getSource()).getSelectedValue().toString(); - Singletons.getModel().getQuestEventManager().getEvent(deckName); - showDecklist(Singletons.getModel().getQuestEventManager().getEvent(deckName).getEventDeck()); - } - } - }; - - lstColorDecks.removeMouseListener(madDeckList); - lstColorDecks.addMouseListener(madDeckList); - - lstThemeDecks.removeMouseListener(madDeckList); - lstThemeDecks.addMouseListener(madDeckList); - - lstQuestDecks.removeMouseListener(madDeckList); - lstQuestDecks.addMouseListener(madDeckList); - - lstCustomDecks.removeMouseListener(madDeckList); - lstCustomDecks.addMouseListener(madDeckList); - } - - /** @return {@link javax.swing.JList} */ - public JList getLstCustomDecks() { - return this.lstCustomDecks; - } - - /** @return {@link javax.swing.JList} */ - public JList getLstQuestDecks() { - return this.lstQuestDecks; - } - - /** @return {@link javax.swing.JList} */ - public JList getLstColorDecks() { - return this.lstColorDecks; - } - - /** @return {@link javax.swing.JList} */ - public JList getLstThemeDecks() { - return this.lstThemeDecks; - } - - /** @return {@link javax.swing.JList} */ - public JList getLstCurrentSelected() { - return this.lstCurrentSelected; - } - - /** - * Prevents decks from different lists being selected simultaneously. - * Also, sets lstCurrentSelected, for use when the game is started. - * - * @param src0   {@link javax.swing.JList} - */ - public void listSelectManager(final JList src0) { - if (src0.getSelectedValues().length == 0) { return; } - - // Clear any previous selection. - if (src0 != lstCustomDecks) { lstCustomDecks.clearSelection(); } - if (src0 != lstQuestDecks) { lstQuestDecks.clearSelection(); } - if (src0 != lstColorDecks) { lstColorDecks.clearSelection(); } - if (src0 != lstThemeDecks) { lstThemeDecks.clearSelection(); } - - lstCurrentSelected = src0; - } - - /** Shows decklist dialog for a given deck. */ - private void showDecklist(Deck d0) { - HashMap deckMap = new HashMap(); - - for (Entry s : d0.getMain()) { - deckMap.put(s.getKey().getName(), s.getValue()); - } - - String nl = System.getProperty("line.separator"); - StringBuilder deckList = new StringBuilder(); - String dName = d0.getName(); - - deckList.append(dName == null ? "" : dName + nl + nl); - - ArrayList dmKeys = new ArrayList(); - for (final String s : deckMap.keySet()) { - dmKeys.add(s); - } - - Collections.sort(dmKeys); - - for (String s : dmKeys) { - deckList.append(deckMap.get(s) + " x " + s + nl); - } - - final StringBuilder msg = new StringBuilder(); - if (deckMap.keySet().size() <= 32) { - msg.append(deckList.toString() + nl); - } else { - msg.append("Decklist too long for dialog." + nl + nl); - } - - msg.append("Copy Decklist to Clipboard?"); - - // Output - int rcMsg = JOptionPane.showConfirmDialog(null, msg, "Decklist", JOptionPane.OK_CANCEL_OPTION); - if (rcMsg == JOptionPane.OK_OPTION) { - final StringSelection ss = new StringSelection(deckList.toString()); - Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss, null); - } - } // End showDecklist - - /** - * Random chooser for theme decks. - * - * @param lst0 {@link javax.swing.JList} - */ - private void randomDeckPick(JList lst0) { - final int size = lst0.getModel().getSize(); - - if (size > 0) { - final Random r = new Random(); - final int i = r.nextInt(size); - - lst0.setSelectedIndex(i); - lst0.ensureIndexIsVisible(lst0.getSelectedIndex()); - } - - listSelectManager(lst0); - } -} diff --git a/src/main/java/forge/view/home/ViewConstructed.java b/src/main/java/forge/view/home/ViewConstructed.java deleted file mode 100644 index b453ca76485..00000000000 --- a/src/main/java/forge/view/home/ViewConstructed.java +++ /dev/null @@ -1,175 +0,0 @@ -package forge.view.home; - -import java.awt.Font; - -import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JScrollPane; - -import net.miginfocom.swing.MigLayout; -import forge.control.home.ControlConstructed; -import forge.view.toolbox.FCheckBox; -import forge.view.toolbox.FLabel; -import forge.view.toolbox.FProgressBar; -import forge.view.toolbox.FScrollPane; -import forge.view.toolbox.FSkin; -import forge.view.toolbox.SubTab; - -/** - * Assembles swing components for "Draft" mode menu. - */ -@SuppressWarnings("serial") -public class ViewConstructed extends JPanel { - private final JPanel pnlTabber, tabHuman, tabAI, pnlStart; - private final ConstructedDeckSelectPanel pnlHuman, pnlAI; - private final JCheckBox cbSingletons, cbArtifacts, cbRemoveSmall; - private final JScrollPane scrContent; - private final JButton btnStart; - private final FProgressBar barProgress; - private ControlConstructed control; - - /** Assembles swing components for "Constructed" mode menu. */ - public ViewConstructed() { - // Instantiation - pnlTabber = new JPanel(); - pnlStart = new JPanel(); - pnlHuman = new ConstructedDeckSelectPanel(); - pnlAI = new ConstructedDeckSelectPanel(); - - tabHuman = new SubTab("Human Deck Select"); - tabAI = new SubTab("AI Deck Select"); - - scrContent = new FScrollPane(null); - scrContent.setBorder(null); - scrContent.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); - scrContent.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); - - cbSingletons = new FCheckBox("Singleton Mode"); - cbArtifacts = new FCheckBox("Remove Artifacts"); - cbRemoveSmall = new FCheckBox("Remove Small Creatures"); - btnStart = new StartButton(); - barProgress = new FProgressBar(); - - // Population - populateTabber(); - populateStart(); - - // Styling and layout - this.setOpaque(false); - this.setLayout(new MigLayout("insets 0, gap 0, wrap")); - this.add(pnlTabber, "w 98%!, gap 1% 0 20px 10px"); - this.add(scrContent, "w 98%!, h 48%!, gap 1% 0 0 10px"); - this.add(pnlStart, "w 98%!, gap 1% 0 0 20px"); - - // After all components are instantiated, fire up control. - this.control = new ControlConstructed(this); - showHumanTab(); - } - - private void populateTabber() { - final String tabberConstraints = "w 50%!, h 20px!"; - - tabHuman.setToolTipText("Global preference options"); - tabAI.setToolTipText("Human and AI avatar select"); - - pnlTabber.setOpaque(false); - pnlTabber.setLayout(new MigLayout("insets 0, gap 0, align center")); - - pnlTabber.add(tabHuman, tabberConstraints); - pnlTabber.add(tabAI, tabberConstraints + ", wrap"); - } - - private void populateStart() { - final String rowConstraints = "ax center, gap 0 0 0 5px"; - - final JLabel lblBlurb1 = new FLabel.Builder() - .text("Mouse over a list above for more information.") - .fontScaleAuto(false).build(); - JLabel lblBlurb2 = new FLabel.Builder().fontStyle(Font.PLAIN) - .text("Deck generation options:") - .fontScaleAuto(false).build(); - - barProgress.setVisible(false); - pnlStart.setOpaque(false); - lblBlurb1.setFont(FSkin.getFont(12)); - lblBlurb2.setFont(FSkin.getFont(12)); - - pnlStart.setLayout(new MigLayout("insets 0, gap 0, wrap, align center, hidemode 3")); - - pnlStart.add(lblBlurb1, rowConstraints + ", h 12px!"); - pnlStart.add(lblBlurb2, rowConstraints + ", h 12px!"); - pnlStart.add(cbSingletons, rowConstraints); - pnlStart.add(cbArtifacts, rowConstraints); - pnlStart.add(cbRemoveSmall, rowConstraints); - pnlStart.add(btnStart, rowConstraints + ", gap 0 0 0 0"); - pnlStart.add(barProgress, rowConstraints + ", w 150px!, h 30px!"); - } - - /** */ - public final void showHumanTab() { - this.scrContent.setViewportView(pnlHuman); - control.updateTabber(tabHuman); - } - - /** */ - public final void showAITab() { - this.scrContent.setViewportView(pnlAI); - control.updateTabber(tabAI); - } - - /** @return {@link javax.swing.JButton} */ - public JButton getBtnStart() { - return this.btnStart; - } - - /** @return {@link javax.swing.JPanel} */ - public JPanel getTabHuman() { - return this.tabHuman; - } - - /** @return {@link javax.swing.JPanel} */ - public JPanel getTabAI() { - return this.tabAI; - } - - /** @return {@link forge.view.toolbox.FProgressBar} */ - public FProgressBar getBarProgress() { - return this.barProgress; - } - - /** @return {@link javax.swing.JPanel} */ - public ConstructedDeckSelectPanel getPnlHuman() { - return this.pnlHuman; - } - - /** @return {@link javax.swing.JPanel} */ - public ConstructedDeckSelectPanel getPnlAI() { - return this.pnlAI; - } - - /** @return {@link javax.swing.JCheckBox} */ - public JCheckBox getCbSingletons() { - return this.cbSingletons; - } - - /** @return {@link javax.swing.JCheckBox} */ - public JCheckBox getCbRemoveSmall() { - return this.cbRemoveSmall; - } - - /** @return {@link javax.swing.JCheckBox} */ - public JCheckBox getCbArtifacts() { - return this.cbArtifacts; - } - - /** - * - * TODO: Write javadoc for this method. - * @return {@link forge.control.home.ControlConstructed} - */ - public ControlConstructed getControl() { - return this.control; - } -} diff --git a/src/main/java/forge/view/home/ViewDraft.java b/src/main/java/forge/view/home/ViewDraft.java deleted file mode 100644 index 6ad24fd335f..00000000000 --- a/src/main/java/forge/view/home/ViewDraft.java +++ /dev/null @@ -1,247 +0,0 @@ -package forge.view.home; - -import java.awt.event.ActionEvent; -import java.util.Random; - -import javax.swing.AbstractAction; -import javax.swing.JButton; -import javax.swing.JLabel; -import javax.swing.JList; -import javax.swing.JPanel; -import javax.swing.JTextPane; -import javax.swing.SwingConstants; -import javax.swing.border.LineBorder; -import javax.swing.text.SimpleAttributeSet; -import javax.swing.text.StyleConstants; -import javax.swing.text.StyledDocument; - -import net.miginfocom.swing.MigLayout; -import forge.Command; -import forge.Singletons; -import forge.control.home.ControlDraft; -import forge.game.GameType; -import forge.view.toolbox.DeckLister; -import forge.view.toolbox.FButton; -import forge.view.toolbox.FLabel; -import forge.view.toolbox.FList; -import forge.view.toolbox.FPanel; -import forge.view.toolbox.FProgressBar; -import forge.view.toolbox.FScrollPane; -import forge.view.toolbox.FSkin; - -/** - * Assembles swing components for "Draft" mode menu. - * - */ -@SuppressWarnings("serial") -public class ViewDraft extends JPanel { - private final ControlDraft control; - private final JList lstAI; - private final FProgressBar barProgress; - private final DeckLister lstHumanDecks; - private final JTextPane tpnDirections; - private final JLabel lblDirections; - private final JButton btnStart; - private final FLabel btnBuildDeck; - - private String[] opponentNames = new String[] { - "Abigail", "Ada", "Adeline", "Adriana", "Agatha", "Agnes", "Aileen", "Alba", "Alcyon", - "Alethea", "Alice", "Alicia", "Alison", "Amanda", "Amelia", "Amy", "Andrea", "Angelina", - "Anita", "Ann", "Annabel", "Anne", "Audrey", "Barbara", "Belinda", "Bernice", "Bertha", - "Bonnie", "Brenda", "Bridget", "Bunny", "Carmen", "Carol", "Catherine", "Cheryl", - "Christine", "Cinderalla", "Claire", "Clarice", "Claudia", "Constance", "Cora", - "Corinne", "Cnythia", "Daisy", "Daphne", "Dawn", "Deborah", "Diana", "Dolly", "Dora", - "Doreen", "Doris", "Dorothy", "Eileen", "Elaine", "Elizabeth", "Emily", "Emma", "Ethel", - "Evelyn", "Fiona", "Florence", "Frances", "Geraldine", "Gertrude", "Gladys", "Gloria", - "Grace", "Greta", "Harriet", "Hazel", "Helen", "Hilda", "Ida", "Ingrid", "Irene", - "Isabel", "Jacinta", "Jackie", "Jane", "Janet", "Janice", "Jennifer", "Jessie", "Joan", - "Jocelyn", "Josephine", "Joyce", "Judith", "Julia", "Juliana", "Karina", "Kathleen", - "Laura", "Lilian", "Lily", "Linda", "Lisa", "Lilita", "Lora", "Lorna", "Lucy", "Lydia", - "Mabel", "Madeline", "Maggie", "Maria", "Mariam", "Marilyn", "Mary", "Matilda", "Mavis", - "Melanie", "Melinda", "Melody", "Michelle", "Mildred", "Molly", "Mona", "Monica", - "Nancy", "Nora", "Norma", "Olga", "Pamela", "Patricia", "Paula", "Pauline", "Pearl", - "Peggy", "Penny", "Phoebe", "Phyllis", "Polly", "Priscilla", "Rachel", "Rebecca", - "Rita", "Rosa", "Rosalind", "Rose", "Rosemary", "Rowena", "Ruby", "Sally", "Samantha", - "Sarah", "Selina", "Sharon", "Sheila", "Shirley", "Sonya", "Stella", "Sue", "Susan", - "Sylvia", "Tina", "Tracy", "Ursula", "Valentine", "Valerie", "Vanessa", "Veronica", - "Victoria", "Violet", "Vivian", "Wendy", "Winnie", "Yvonne", "Aaron", "Abraham", "Adam", - "Adrain", "Alain", "Alan", "Alban", "Albert", "Alec", "Alexander", "Alfonso", "Alfred", - "Allan", "Allen", "Alonso", "Aloysius", "Alphonso", "Alvin", "Andrew", "Andy", "Amadeus", - "Amselm", "Anthony", "Arnold", "Augusta", "Austin", "Barnaby", "Benedict", "Benjamin", - "Bertie", "Bertram", "Bill", "Bob", "Boris", "Brady", "Brian", "Bruce", "Burt", "Byron", - "Calvin", "Carl", "Carter", "Casey", "Cecil", "Charles", "Christian", "Christopher", - "Clarence", "Clement", "Colin", "Conan", "Dalton", "Damian", "Daniel", "David", "Denis", - "Derek", "Desmond", "Dick", "Dominic", "Donald", "Douglas", "Duncan", "Edmund", - "Edward", "Ellen", "Elton", "Elvis", "Eric", "Eugene", "Felix", "Francis", "Frank", - "Frederick", "Gary", "Geoffrey", "George", "Gerald", "Gerry", "Gordon", "Hamish", - "Hardy", "Harold", "Harry", "Henry", "Herbert", "Ignatius", "Jack", "James", "Jeffrey", - "Jim", "Joe", "John", "Joseph", "Karl", "Keith", "Kenneth", "Kevin", "Larry", "Lawrence", - "Leonard", "Lionel", "Louis", "Lucas", "Malcolm", "Mark", "Martin", "Mathew", "Maurice", - "Max", "Melvin", "Michael", "Milton", "Morgan", "Morris", "Murphy", "Neville", - "Nicholas", "Noel", "Norman", "Oliver", "Oscar", "Patrick", "Paul", "Perkin", "Peter", - "Philip", "Ralph", "Randy", "Raymond", "Richard", "Ricky", "Robert", "Robin", "Rodney", - "Roger", "Roland", "Ronald", "Roy", "Sam", "Sebastian", "Simon", "Stanley", "Stephen", - "Stuart", "Terence", "Thomas", "Tim", "Tom", "Tony", "Victor", "Vincent", "Wallace", - "Walter", "Wilfred", "William", "Winston" - }; - - private final String instructions = "BOOSTER DRAFT MODE INSTRUCTIONS" - + "\r\n\r\n" - + "In a booster draft, several players (usually eight) are seated " - + "around a table and each player is given three booster packs." - + "\r\n\r\n" - + "Each player opens a pack, selects a card from it and passes the remaining " - + "cards to his or her left. Each player then selects one of the 14 remaining " - + "cards from the pack that was just passed to him or her, and passes the " - + "remaining cards to the left again. This continues until all of the cards " - + "are depleted. The process is repeated with the second and third packs, " - + "except that the cards are passed to the right in the second pack." - + "\r\n\r\n" - + "Players then build decks out of any of the cards that they selected " - + "during the drafting and add as many basic lands as they want." - + "\r\n\r\n" - + "(Credit: Wikipedia )"; - - /** Assembles swing components for "Draft" mode menu. */ - public ViewDraft() { - super(); - this.setOpaque(false); - this.setLayout(new MigLayout("insets 0, gap 0, hidemode 2")); - - // Generate random selection of names for display - Random generator = new Random(); - int i = opponentNames.length; - String[] ai = { - opponentNames[generator.nextInt(i)], - opponentNames[generator.nextInt(i)], - opponentNames[generator.nextInt(i)], - opponentNames[generator.nextInt(i)], - opponentNames[generator.nextInt(i)], - opponentNames[generator.nextInt(i)], - opponentNames[generator.nextInt(i)] - }; - - // Init directions text pane - tpnDirections = new JTextPane(); - tpnDirections.setOpaque(false); - tpnDirections.setForeground(FSkin.getColor(FSkin.Colors.CLR_TEXT)); - tpnDirections.setFont(FSkin.getFont(15)); - tpnDirections.setAlignmentX(SwingConstants.CENTER); - tpnDirections.setFocusable(false); - tpnDirections.setEditable(false); - tpnDirections.setBorder(null); - tpnDirections.setText(instructions); - - StyledDocument doc = tpnDirections.getStyledDocument(); - SimpleAttributeSet center = new SimpleAttributeSet(); - StyleConstants.setAlignment(center, StyleConstants.ALIGN_CENTER); - doc.setParagraphAttributes(0, doc.getLength(), center, false); - - // Define exit command for deck editor (TODO put this in controller) - final Command exit = new Command() { - private static final long serialVersionUID = -9133358399503226853L; - - @Override - public void execute() { - control.updateHumanDecks(); - } - }; - - // Layout - final JLabel lblHuman = new JLabel("Select your deck: "); - lblHuman.setFont(FSkin.getBoldFont(16)); - lblHuman.setHorizontalAlignment(SwingConstants.CENTER); - lblHuman.setForeground(FSkin.getColor(FSkin.Colors.CLR_TEXT)); - this.add(lblHuman, "w 60%!, gap 5% 5% 2% 2%"); - - final JLabel lblAI = new JLabel("Who will you play?"); - lblAI.setFont(FSkin.getBoldFont(16)); - lblAI.setHorizontalAlignment(SwingConstants.CENTER); - lblAI.setForeground(FSkin.getColor(FSkin.Colors.CLR_TEXT)); - this.add(lblAI, "w 25%!, gap 0 0 2% 2%, wrap"); - - lstHumanDecks = new DeckLister(GameType.Draft, exit); - this.add(new FScrollPane(lstHumanDecks), "w 60%!, h 30%!, gap 5% 5% 2% 2%"); - - lstAI = new FList(ai); - this.add(new FScrollPane(lstAI), "w 25%!, h 37%!, gap 0 0 2% 0, span 1 2, wrap"); - - btnBuildDeck = new FLabel.Builder().opaque(true).hoverable(true).text("Start A New Draft").build(); - this.add(btnBuildDeck, "w 60%!, h 5%!, gap 5% 5% 0 0, wrap"); - - lblDirections = new JLabel("Click For Directions"); - lblDirections.setFont(FSkin.getFont(16)); - lblDirections.setHorizontalAlignment(SwingConstants.CENTER); - lblDirections.setForeground(FSkin.getColor(FSkin.Colors.CLR_TEXT)); - this.add(lblDirections, "alignx center, span 2 1, gap 5% 5% 5% 2%, wrap"); - - btnStart = new StartButton(); - this.add(btnStart, "gap 5% 5% 0 0, ax center, span 2 1, wrap"); - - barProgress = new FProgressBar(); - barProgress.setVisible(false); - this.add(barProgress, "w 150px!, h 30px!, gap 5% 5% 0 0, span 2 1, align center"); - - control = new ControlDraft(this); - } - - /** */ - public void showDirections() { - final FButton btnClose = new FButton(); - final FPanel pnlContainer = new FPanel(); - - btnClose.setAction(new AbstractAction() { - @Override - public void actionPerformed(ActionEvent e) { - Singletons.getView().getOverlay().hideOverlay(); - } - }); - btnClose.setText("Close"); - - pnlContainer.setBorder(new LineBorder(FSkin.getColor(FSkin.Colors.CLR_BORDERS), 1)); - pnlContainer.setBackground(FSkin.getColor(FSkin.Colors.CLR_THEME)); - pnlContainer.setLayout(new MigLayout("insets 0, wrap")); - pnlContainer.add(tpnDirections, "w 90%, gap 5% 0 20px 0, wrap"); - pnlContainer.add(btnClose, "w 300px!, h 40px!, gap 0 0 20px 20px, alignx center"); - - Singletons.getView().getOverlay().removeAll(); - Singletons.getView().getOverlay().setLayout(new MigLayout("insets 0")); - Singletons.getView().getOverlay().add(pnlContainer, "w 50%, gap 25% 0 5% 5%, wrap"); - Singletons.getView().getOverlay().showOverlay(); - } - - /** @return JList */ - public DeckLister getLstHumanDecks() { - return lstHumanDecks; - } - - /** @return JList */ - public JList getLstAIDecks() { - return lstAI; - } - - /** @return ControlDraft */ - public ControlDraft getControl() { - return control; - } - - /** @return JTextArea */ - public JLabel getLblDirections() { - return lblDirections; - } - - /** @return {@link forge.view.toolbox.FLabel} */ - public FLabel getBtnBuildDeck() { - return btnBuildDeck; - } - - /** @return JButton */ - public JButton getBtnStart() { - return btnStart; - } - - /** @return FProgressBar */ - public FProgressBar getBarProgress() { - return barProgress; - } -} diff --git a/src/main/java/forge/view/home/ViewQuest.java b/src/main/java/forge/view/home/ViewQuest.java deleted file mode 100644 index a10a65eacb8..00000000000 --- a/src/main/java/forge/view/home/ViewQuest.java +++ /dev/null @@ -1,787 +0,0 @@ -package forge.view.home; - -import java.awt.Color; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.io.File; -import java.util.List; - -import javax.swing.ButtonGroup; -import javax.swing.ImageIcon; -import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JComboBox; -import javax.swing.JPanel; -import javax.swing.JRadioButton; -import javax.swing.JScrollPane; -import javax.swing.SwingConstants; -import javax.swing.SwingUtilities; -import javax.swing.border.MatteBorder; - -import net.miginfocom.swing.MigLayout; -import forge.AllZone; -import forge.Command; -import forge.Singletons; -import forge.control.home.ControlQuest; -import forge.game.GameType; -import forge.properties.ForgeProps; -import forge.properties.NewConstants; -import forge.quest.data.QuestChallenge; -import forge.quest.data.QuestDuel; -import forge.quest.data.QuestEvent; -import forge.view.toolbox.DeckLister; -import forge.view.toolbox.FCheckBox; -import forge.view.toolbox.FLabel; -import forge.view.toolbox.FPanel; -import forge.view.toolbox.FProgressBar; -import forge.view.toolbox.FRadioButton; -import forge.view.toolbox.FScrollPane; -import forge.view.toolbox.FSkin; -import forge.view.toolbox.FTextArea; -import forge.view.toolbox.SubTab; - -/** - * Populates Swing components of Quest mode in home screen. - * - */ -@SuppressWarnings("serial") -public class ViewQuest extends JScrollPane { - private final ControlQuest control; - private final String eventPanelConstraints; - private final Color clrBorders; - private final JPanel pnlViewport, pnlTabber, pnlStats, - pnlDuels, pnlChallenges, pnlStart, pnlTitle, pnlNewQuest, - pnlDecks, pnlLoadQuest, pnlPrefs, - tabDuels, tabChallenges, tabDecks, tabQuests, tabPreferences; - private final FLabel lblTitle, lblLife, lblCredits, - lblWins, lblLosses, lblNextChallengeInWins, lblWinStreak, btnBazaar, btnSpellShop, btnEmbark, - btnResetPrefs, btnNewDeck, btnCurrentDeck; - - private final StartButton btnStart; - - private final JCheckBox cbPlant, cbZep, cbStandardStart; - private final JComboBox cbxPet; - private final JRadioButton radEasy, radMedium, radHard, radExpert, radFantasy, radClassic; - - private SelectablePanel selectedOpponent; - private DeckLister lstDecks; - private QuestFileLister lstQuests; - private final FProgressBar barProgress; - - /** Assembles swing components for "Quest" mode menu. */ - public ViewQuest() { - // Display - super(VERTICAL_SCROLLBAR_AS_NEEDED, HORIZONTAL_SCROLLBAR_AS_NEEDED); - this.setBorder(null); - this.setOpaque(false); - this.getViewport().setOpaque(false); - this.getVerticalScrollBar().setUnitIncrement(16); - - // Non-final inits - this.clrBorders = FSkin.getColor(FSkin.Colors.CLR_THEME2); - this.eventPanelConstraints = "w 100%!, h 86px!, gap 0 0 5px 5px"; - - // Final component inits - tabDuels = new SubTab("Duels"); - tabChallenges = new SubTab("Challenges"); - tabDecks = new SubTab("Decks"); - tabQuests = new SubTab("Quests"); - tabPreferences = new SubTab("Preferences"); - - pnlTabber = new JPanel(); - pnlTitle = new FPanel(); - pnlStats = new JPanel(); - pnlDuels = new JPanel(); - pnlChallenges = new JPanel(); - pnlStart = new JPanel(); - pnlDecks = new JPanel(); - pnlNewQuest = new JPanel(); - pnlLoadQuest = new JPanel(); - pnlPrefs = new JPanel(); - - lblTitle = new FLabel.Builder().text("New Quest").fontAlign(SwingConstants.CENTER) - .fontScaleBy(SwingConstants.HORIZONTAL).fontScaleFactor(0.035).build(); - lblLife = new FLabel.Builder().build(); - lblCredits = new FLabel.Builder().build(); - lblWins = new FLabel.Builder().build(); - lblLosses = new FLabel.Builder().build(); - lblNextChallengeInWins = new FLabel.Builder().build(); - lblWinStreak = new FLabel.Builder().build(); - - radEasy = new FRadioButton("Easy"); - radMedium = new FRadioButton("Medium"); - radHard = new FRadioButton("Hard"); - radExpert = new FRadioButton("Expert"); - radFantasy = new FRadioButton("Fantasy"); - radClassic = new FRadioButton("Classic"); - - btnCurrentDeck = new FLabel.Builder().opaque(true).hoverable(true).build(); - btnBazaar = new FLabel.Builder().selectable(true).opaque(true).hoverable(true).text("Bazaar") - .fontScaleAuto(false).tooltip("Peruse the Bazaar").build(); - btnBazaar.setFont(FSkin.getFont(14)); - btnSpellShop = new FLabel.Builder().opaque(true).hoverable(true).text("Spell Shop") - .fontScaleAuto(false).tooltip("Travel to the Spell Shop").build(); - btnSpellShop.setFont(FSkin.getFont(14)); - btnStart = new StartButton(); - btnEmbark = new FLabel.Builder().opaque(true).hoverable(true).text("Embark!").build(); - btnNewDeck = new FLabel.Builder().opaque(true).hoverable(true).text("Build a New Deck").build(); - btnResetPrefs = new FLabel.Builder().opaque(true).hoverable(true).text("Reset to Defaults").build(); - cbxPet = new JComboBox(); - cbStandardStart = new FCheckBox("Standard (Type 2) Starting Pool"); - cbPlant = new FCheckBox("Summon Plant"); - cbZep = new FCheckBox("Launch Zeppelin"); - barProgress = new FProgressBar(); - - lstDecks = new DeckLister(GameType.Quest); - lstQuests = new QuestFileLister(); - - // Final layout of parent panel - pnlViewport = new JPanel(); - pnlViewport.setOpaque(false); - pnlViewport.setLayout(new MigLayout("insets 0, gap 0, wrap, alignx center, hidemode 3")); - - final String constraints = "w 90%!, gap 0 0 0 20px, alignx center"; - pnlViewport.add(pnlTabber, constraints + ", h 20px!"); - pnlViewport.add(pnlTitle, constraints + ", h 7%:7%:60px"); - pnlViewport.add(pnlStats, constraints); - pnlViewport.add(pnlDuels, constraints); - pnlViewport.add(pnlChallenges, constraints); - pnlViewport.add(pnlStart, constraints); - pnlViewport.add(pnlLoadQuest, constraints + ", h 40%!"); - pnlViewport.add(pnlNewQuest, constraints + ", h 40%!"); - pnlViewport.add(pnlDecks, constraints); - pnlViewport.add(pnlPrefs, constraints); - - // Drop into scroll pane, init values from controller. - this.setViewportView(pnlViewport); - - // Lay out each child panel, starting with previous quests. - populateLoadQuest(); - populateTabber(); - populateTitle(); - populateStats(); - populateDuels(); - populateChallenges(); - populateStart(); - populateDecks(); - populateNewQuest(); - populatePrefs(); - - // If start when quest submenu is shown, - // it will need a few cycles to read the quest datas. - hideAllPanels(); - - // Init controller, select quest and deck. - this.control = new ControlQuest(this); - control.refreshQuests(); - control.refreshDecks(); - this.showDuelsTab(); - } - - //========= POPULATION METHODS - /** Layout and details for Swing components in title panel. */ - private void populateTabber() { - tabDuels.setToolTipText("Available Duels"); - tabChallenges.setToolTipText("Available Challenges"); - tabDecks.setToolTipText("Edit or create decks"); - tabQuests.setToolTipText("Load a Quest, or start a new Quest"); - tabPreferences.setToolTipText("Change Preference Settings"); - - final String constraints = "w 20%!, h 20px!"; - pnlTabber.setOpaque(false); - pnlTabber.setLayout(new MigLayout("insets 0, gap 0, align center")); - - pnlTabber.add(tabDuels, constraints); - pnlTabber.add(tabChallenges, constraints); - pnlTabber.add(tabDecks, constraints); - pnlTabber.add(tabQuests, constraints); - pnlTabber.add(tabPreferences, constraints); - } - - /** Layout and details for Swing components in title panel. */ - private void populateTitle() { - pnlTitle.setLayout(new MigLayout("insets 0, gap 0, align center")); - pnlTitle.setBackground(FSkin.getColor(FSkin.Colors.CLR_THEME2)); - - pnlTitle.add(lblTitle, "w 78%!, h 80%!, gap 0 0 15%! 15%!"); - } - - /** Layout permanent parts of stats panel. */ - private void populateStats() { - pnlStats.setOpaque(false); - pnlStats.setBorder(new MatteBorder(1, 0, 1, 0, clrBorders)); - - lblLife.setIcon(FSkin.getIcon(FSkin.QuestIcons.ICO_LIFE)); - lblCredits.setIcon(FSkin.getIcon(FSkin.QuestIcons.ICO_COINSTACK)); - lblWins.setIcon(FSkin.getIcon(FSkin.QuestIcons.ICO_PLUS)); - lblLosses.setIcon(FSkin.getIcon(FSkin.QuestIcons.ICO_MINUS)); - lblNextChallengeInWins.setText("No challenges available."); - } - - /** Layout permanent parts of duels panel. */ - private void populateDuels() { - pnlDuels.setOpaque(false); - pnlDuels.setLayout(new MigLayout("insets 0, wrap")); - } - - /** Layout permanent parts of challenges panel. */ - private void populateChallenges() { - pnlChallenges.setOpaque(false); - pnlChallenges.setLayout(new MigLayout("insets 0, wrap")); - } - - /** Layout permanent parts of start panel. */ - private void populateStart() { - pnlStart.setOpaque(false); - pnlStart.setLayout(new MigLayout("insets 0, wrap, align center, hidemode 3")); - pnlStart.add(cbxPet, "gap 0 0 0 5px, align center"); - pnlStart.add(cbPlant, "gap 0 0 5px 5px, align center"); - pnlStart.add(cbZep, "gap 0 0 5px 5px, align center"); - pnlStart.add(btnStart, ""); - } - - /** Layout permanent parts of decks panel. */ - private void populateDecks() { - final FScrollPane scr = new FScrollPane(lstDecks); - scr.setBorder(null); - scr.getViewport().setBorder(null); - - pnlDecks.setOpaque(false); - pnlDecks.setLayout(new MigLayout("insets 0, wrap, alignx center, wrap")); - - pnlDecks.add(btnNewDeck, "w 40%!, h 35px!, gap 25%! 0 0 20px"); - pnlDecks.add(scr, "w 90%!, h 350px!"); - } - - /** Layout permanent parts of quest load panel. */ - private void populateLoadQuest() { - // New quest notes - final FPanel pnl = new FPanel(); - pnl.setLayout(new MigLayout("insets 0, align center")); - pnl.setBackground(FSkin.getColor(FSkin.Colors.CLR_THEME2)); - pnl.add(new FLabel.Builder().text("Load a previous Quest").build(), "h 95%!, gap 0 0 2.5% 0"); - - final FLabel lbl = new FLabel.Builder().text("To use quest files " - + "from previous versions, put them into " - + "the res/quest/data directory, and restart Forge.") - .fontAlign(SwingConstants.CENTER).fontScaleFactor(0.8).build(); - - final FScrollPane scr = new FScrollPane(lstQuests); - scr.setBorder(null); - scr.getViewport().setBorder(null); - - pnlLoadQuest.setOpaque(false); - pnlLoadQuest.setLayout(new MigLayout("insets 0, gap 0, alignx center, wrap")); - pnlLoadQuest.add(pnl, "w 99%, h 8%!, gap 0 0 0 10px"); - pnlLoadQuest.add(lbl, "w 99%!, h 5%!, gap 2px 2px 0 4px"); - pnlLoadQuest.add(scr, "w 99%!, h 85%!, gap 0 0 0 30px"); - } - - /** Layout permanent parts of new quests panel. */ - private void populateNewQuest() { - // New quest notes - final FPanel pnl1 = new FPanel(); - pnl1.setLayout(new MigLayout("insets 0, align center")); - pnl1.setBackground(FSkin.getColor(FSkin.Colors.CLR_THEME2)); - pnl1.add(new FLabel.Builder().text("Start a new quest").build(), "h 95%!, gap 0 0 2.5% 0"); - - final ButtonGroup group1 = new ButtonGroup(); - group1.add(radEasy); - group1.add(radMedium); - group1.add(radHard); - group1.add(radExpert); - - radEasy.setSelected(true); - radClassic.setSelected(true); - - final ButtonGroup group2 = new ButtonGroup(); - group2.add(radFantasy); - group2.add(radClassic); - - final JPanel pnl2 = new JPanel(); - pnl2.setOpaque(false); - pnl2.setLayout(new MigLayout("insets 0, gap 0")); - - final String constraints = "w 30%!, h 40px!"; - pnl2.add(radEasy, constraints + ", gap 15% 5% 0 0"); - pnl2.add(radFantasy, constraints + ", wrap"); - pnl2.add(radMedium, constraints + ", gap 15% 5% 0 0"); - pnl2.add(radClassic, constraints + ", wrap"); - pnl2.add(radHard, constraints + ", gap 15% 5% 0 0"); - pnl2.add(cbStandardStart, constraints + ", wrap"); - pnl2.add(radExpert, constraints + ", gap 15% 5% 0 0, wrap"); - - pnl2.add(btnEmbark, "w 40%!, h 30px!, gapleft 30%, gaptop 3%, span 3 1"); - - pnlNewQuest.setLayout(new MigLayout("insets 0, gap 0, align center, wrap")); - pnlNewQuest.setOpaque(false); - pnlNewQuest.add(pnl1, "w 99%, h 8%!, gap 0 0 0 2%"); - pnlNewQuest.add(pnl2, "w 99%!, h 89%!"); - } - - /** Layout permanent parts of prefs panel. */ - private void populatePrefs() { - pnlPrefs.setOpaque(false); - pnlPrefs.setLayout(new MigLayout("insets 0, gap 0, wrap")); - - pnlPrefs.add(new QuestPreferencesHandler(), "w 100%!"); - pnlPrefs.add(btnResetPrefs, " w 60%!, h 30px!, gap 20% 0 20px 20px"); - } - - private void hideAllPanels() { - pnlTitle.setVisible(false); - pnlStats.setVisible(false); - pnlDuels.setVisible(false); - pnlChallenges.setVisible(false); - pnlStart.setVisible(false); - pnlDecks.setVisible(false); - pnlNewQuest.setVisible(false); - pnlLoadQuest.setVisible(false); - pnlPrefs.setVisible(false); - } - - //========= UPDATE METHODS - /** Update transitory parts of duels panel. */ - public void updateDuels() { - if (AllZone.getQuestData() == null) { return; } - - pnlDuels.removeAll(); - final List duels = control.getQEM().generateDuels(); - - for (QuestDuel d : duels) { - SelectablePanel temp = new SelectablePanel(d); - pnlDuels.add(temp, this.eventPanelConstraints); - } - } - - /** Update transitory parts of challenges panel. */ - public void updateChallenges() { - if (AllZone.getQuestData() == null) { return; } - - pnlChallenges.removeAll(); - final List challenges = control.getQEM().generateChallenges(AllZone.getQuestData()); - - for (QuestChallenge c : challenges) { - SelectablePanel temp = new SelectablePanel(c); - pnlChallenges.add(temp, this.eventPanelConstraints); - } - } - - /** Update transitory parts of stats panel. */ - public void updateStats() { - pnlStats.removeAll(); - - if (AllZone.getQuestData().isFantasy()) { - pnlStats.setLayout(new MigLayout("insets 0, gap 0")); - - pnlStats.add(btnBazaar, "w 15%!, h 70px!, gap 0 4% 10px 10px, span 1 2"); - pnlStats.add(lblWins, "w 30%!, h 25px!, gap 0 2% 12px 0"); - pnlStats.add(lblLosses, "w 30%!, h 25px!, gap 0 4% 12px 0"); - pnlStats.add(btnSpellShop, "w 14.5%!, h 70px!, gap 0 0 10px 10px, span 1 2, wrap"); - pnlStats.add(lblCredits, "w 30%!, h 25px!, gap 0 2% 0 0"); - pnlStats.add(lblLife, "w 30%!, h 25px!, gap 0 4% 0 0 0, wrap"); - pnlStats.add(lblWinStreak, "h 20px!, align center, span 4 1, wrap"); - pnlStats.add(lblNextChallengeInWins, "h 20px!, align center, span 4 1, wrap"); - pnlStats.add(btnCurrentDeck, "w 40%!, h 26px!, align center, span 4 1, gap 0 0 0 5px"); - } - else { - pnlStats.setLayout(new MigLayout("insets 0, gap 0, align center")); - lblCredits.setHorizontalAlignment(SwingConstants.CENTER); - - pnlStats.add(lblWins, "w 150px!, h 25px!, gap 0 50px 5px 5px, align center"); - pnlStats.add(lblCredits, "w 150px!, h 25px!, gap 0 0 5px 5px, align center, wrap"); - pnlStats.add(lblLosses, "w 150px!, h 25px!, gap 0 50px 0 5px, align center"); - pnlStats.add(btnSpellShop, "w 150px!, h 25px!, gap 0 0 0 5px, align center, wrap"); - pnlStats.add(lblWinStreak, "h 20px!, align center, span 4 1, wrap"); - pnlStats.add(lblNextChallengeInWins, "h 20px!, align center, span 4 1, gap 0 0 10px 5px, wrap"); - pnlStats.add(btnCurrentDeck, "w 40%!, h 26px!, align center, span 4 1, gap 0 0 0 5px"); - } - } - - /** */ - public void resetPrefs() { - pnlPrefs.removeAll(); - populatePrefs(); - pnlPrefs.revalidate(); - Singletons.getView().getViewHome().getBtnQuest().grabFocus(); - } - - //========= TAB SHOW METHODS - /** Display handler for duel tab click. */ - public void showDuelsTab() { - if (AllZone.getQuestData() == null) { - showQuestsTab(); - return; - } - - control.updateTabber(tabDuels); - hideAllPanels(); - pnlTitle.setVisible(true); - - setCurrentDeckStatus(); - updateDuels(); - updateStats(); - control.refreshStats(); - lblTitle.setText("Duels: " + control.getRankString()); - - // Select first event. - if (control.getCurrentDeck() != null) { - pnlStart.setVisible(true); - selectedOpponent = (SelectablePanel) pnlDuels.getComponent(0); - selectedOpponent.setSelected(true); - } - - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - pnlStats.setVisible(true); - pnlDuels.setVisible(true); - } - }); - } - - /** Display handler for duel tab click. */ - public void showChallengesTab() { - if (AllZone.getQuestData() == null) { - showQuestsTab(); - return; - } - - control.updateTabber(tabChallenges); - hideAllPanels(); - pnlTitle.setVisible(true); - - setCurrentDeckStatus(); - updateChallenges(); - updateStats(); - control.refreshStats(); - lblTitle.setText("Challenges: " + control.getRankString()); - - // Select first event. - if (pnlChallenges.getComponentCount() > 0) { - pnlStart.setVisible(true); - selectedOpponent = (SelectablePanel) pnlChallenges.getComponent(0); - selectedOpponent.setSelected(true); - } - - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - pnlStats.setVisible(true); - pnlChallenges.setVisible(true); - } - }); - } - - /** Display handler for decks tab click. */ - public void showDecksTab() { - if (AllZone.getQuestData() == null) { - showQuestsTab(); - return; - } - - control.updateTabber(tabDecks); - this.hideAllPanels(); - pnlTitle.setVisible(true); - lblTitle.setText("Quest Deck Manager"); - pnlDecks.setVisible(true); - } - - /** Display handler for quests tab click. */ - public void showQuestsTab() { - control.updateTabber(tabQuests); - this.hideAllPanels(); - - pnlNewQuest.setVisible(true); - pnlLoadQuest.setVisible(true); - } - - /** Display handler for quests tab click. */ - public void showPrefsTab() { - control.updateTabber(tabPreferences); - - this.hideAllPanels(); - - lblTitle.setText("Quest Preferences"); - pnlTitle.setVisible(true); - pnlPrefs.setVisible(true); - } - - /** Toggles red, bold font if no current deck. */ - public void setCurrentDeckStatus() { - if (control.getCurrentDeck() == null) { - btnCurrentDeck.setBackground(Color.red.darker()); - btnCurrentDeck.setText(" Build, then select a deck in the \"Decks\" tab. "); - } - else { - btnCurrentDeck.setBackground(FSkin.getColor(FSkin.Colors.CLR_INACTIVE)); - btnCurrentDeck.setText("Current deck: " + control.getCurrentDeck().getName()); - } - } - - /** Selectable panels for duels and challenges. */ - public class SelectablePanel extends FPanel { - private QuestEvent event; - - /** @param e0   QuestEvent */ - public SelectablePanel(QuestEvent e0) { - super(); - this.event = e0; - this.setSelectable(true); - this.setHoverable(true); - this.setLayout(new MigLayout("insets 0, gap 0")); - - this.setCommand(new Command() { - @Override - public void execute() { - if (selectedOpponent != null) { selectedOpponent.setSelected(false); } - selectedOpponent = ViewQuest.SelectablePanel.this; - } - }); - - // Icon - final File base = ForgeProps.getFile(NewConstants.IMAGE_ICON); - File file = new File(base, event.getIconFilename()); - - final FLabel lblIcon = new FLabel.Builder().iconScaleFactor(1).build(); - if (!file.exists()) { - lblIcon.setIcon(FSkin.getIcon(FSkin.ForgeIcons.ICO_UNKNOWN)); - } - else { - lblIcon.setIcon(new ImageIcon(file.toString())); - } - this.add(lblIcon, "h 60px!, w 60px!, gap 10px 10px 10px 0, span 1 2"); - - // Name - final FLabel lblName = new FLabel.Builder() - .text(event.getTitle() + ": " + event.getDifficulty()).hoverable(false).build(); - this.add(lblName, "h 31px!, gap 0 0 10px 5px, wrap"); - - // Description - final FTextArea tarDesc = new FTextArea(); - tarDesc.addMouseListener(new MouseAdapter() { - @Override - public void mouseEntered(MouseEvent e) { - SelectablePanel.this.setHovered(true); - SelectablePanel.this.repaint(); - } - }); - tarDesc.setText(event.getDescription()); - tarDesc.setFont(FSkin.getItalicFont(12)); - this.add(tarDesc, "w 80%!, h 30px!"); - } - - /** @return QuestEvent */ - public QuestEvent getEvent() { - return event; - } - } - - //========= RETRIEVAL FUNCTIONS - /** @return {@link javax.swing.JRadioButton} */ - public JRadioButton getRadEasy() { - return radEasy; - } - - /** @return {@link javax.swing.JRadioButton} */ - public JRadioButton getRadMedium() { - return radMedium; - } - - /** @return {@link javax.swing.JRadioButton} */ - public JRadioButton getRadHard() { - return radHard; - } - - /** @return {@link javax.swing.JRadioButton} */ - public JRadioButton getRadExpert() { - return radExpert; - } - - /** @return {@link javax.swing.JRadioButton} */ - public JRadioButton getRadFantasy() { - return radFantasy; - } - - /** @return {@link javax.swing.JRadioButton} */ - public JRadioButton getRadClassic() { - return radClassic; - } - - /** @return {@link javax.swing.JCheckBox} */ - public JCheckBox getCbStandardStart() { - return cbStandardStart; - } - - /** @return {@link javax.swing.JCheckBox} */ - public JCheckBox getCbPlant() { - return cbPlant; - } - - /** @return {@link javax.swing.JCheckBox} */ - public JCheckBox getCbZep() { - return cbZep; - } - - /** @return {@link javax.swing.JComboBox} */ - public JComboBox getCbxPet() { - return cbxPet; - } - - /** @return {@link forge.view.home.ViewQuest.SelectablePanel} */ - public SelectablePanel getSelectedOpponent() { - return selectedOpponent; - } - - /** @return {@link forge.control.home.ControlQuest} */ - public ControlQuest getControl() { - return control; - } - - /** @return {@link javax.swing.FLabel} */ - public FLabel getLblTitle() { - return lblTitle; - } - - /** @return {@link javax.swing.FLabel} */ - public FLabel getLblLife() { - return lblLife; - } - - /** @return {@link javax.swing.FLabel} */ - public FLabel getLblCredits() { - return lblCredits; - } - - /** @return {@link javax.swing.FLabel} */ - public FLabel getLblWins() { - return lblWins; - } - - /** @return {@link javax.swing.FLabel} */ - public FLabel getLblLosses() { - return lblLosses; - } - - /** @return {@link javax.swing.FLabel} */ - public FLabel getLblNextChallengeInWins() { - return lblNextChallengeInWins; - } - - /** @return {@link javax.swing.FLabel} */ - public FLabel getLblWinStreak() { - return lblWinStreak; - } - - /** @return {@link forge.view.toolbox.FLabel} */ - public FLabel getBtnCurrentDeck() { - return btnCurrentDeck; - } - - /** @return {@link javax.swing.JButton} */ - public JButton getBtnStart() { - return btnStart; - } - - /** @return {@link forge.view.toolbox.FLabel} */ - public FLabel getBtnBazaar() { - return btnBazaar; - } - - /** @return {@link forge.view.toolbox.FLabel} */ - public FLabel getBtnSpellShop() { - return btnSpellShop; - } - - /** @return {@link forge.view.toolbox.FLabel} */ - public FLabel getBtnEmbark() { - return btnEmbark; - } - - /** @return {@link forge.view.toolbox.FLabel} */ - public FLabel getBtnResetPrefs() { - return btnResetPrefs; - } - - /** @return {@link forge.view.toolbox.FLabel} */ - public FLabel getBtnNewDeck() { - return btnNewDeck; - } - - /** @return {@link forge.view.toolbox.FProgressBar} */ - public FProgressBar getBarProgress() { - return barProgress; - } - - //========== CONTAINER RETRIEVAL - /** @return {@link javax.swing.JPanel} */ - public JPanel getPnlStats() { - return this.pnlStats; - } - - /** @return {@link javax.swing.JPanel} */ - public JPanel getPnlTitle() { - return this.pnlTitle; - } - - /** @return {@link javax.swing.JPanel} */ - public JPanel getPnlDuels() { - return this.pnlDuels; - } - - /** @return {@link javax.swing.JPanel} */ - public JPanel getPnlChallenges() { - return this.pnlChallenges; - } - - /** @return {@link javax.swing.JPanel} */ - public JPanel getPnlStart() { - return this.pnlStart; - } - - /** @return {@link javax.swing.JPanel} */ - public JPanel getPnlLoadQuest() { - return pnlLoadQuest; - } - - /** @return {@link javax.swing.JPanel} */ - public JPanel getpnlPrefs() { - return pnlPrefs; - } - - /** @return {@link forge.view.toolbox.DeckLister} */ - public DeckLister getLstDecks() { - return this.lstDecks; - } - - /** @return {@link forge.view.home.QuestFileLister} */ - public QuestFileLister getLstQuests() { - return this.lstQuests; - } - - //========== TAB RETRIEVAL - /** @return {@link javax.swing.JPanel} */ - public JPanel getTabDuels() { - return tabDuels; - } - - /** @return {@link javax.swing.JPanel} */ - public JPanel getTabChallenges() { - return tabChallenges; - } - - /** @return {@link javax.swing.JPanel} */ - public JPanel getTabDecks() { - return tabDecks; - } - - /** @return {@link javax.swing.JPanel} */ - public JPanel getTabQuests() { - return tabQuests; - } - - /** @return {@link javax.swing.JPanel} */ - public JPanel getTabPreferences() { - return tabPreferences; - } -} diff --git a/src/main/java/forge/view/home/ViewSealed.java b/src/main/java/forge/view/home/ViewSealed.java deleted file mode 100644 index 626fae7c682..00000000000 --- a/src/main/java/forge/view/home/ViewSealed.java +++ /dev/null @@ -1,88 +0,0 @@ -package forge.view.home; - -import javax.swing.JButton; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.SwingConstants; - -import net.miginfocom.swing.MigLayout; -import forge.control.home.ControlSealed; -import forge.game.GameType; -import forge.view.toolbox.DeckLister; -import forge.view.toolbox.FLabel; -import forge.view.toolbox.FProgressBar; -import forge.view.toolbox.FScrollPane; -import forge.view.toolbox.FSkin; - -/** - * Assembles swing components for "Sealed" mode menu. - * - */ -@SuppressWarnings("serial") -public class ViewSealed extends JPanel { - private final ControlSealed control; - private DeckLister lstHumanDecks; - private final JButton btnStart; - private final FLabel btnBuild; - private final FProgressBar barProgress; - - /** Assembles swing components for "Sealed" mode menu. */ - public ViewSealed() { - super(); - this.setOpaque(false); - this.setLayout(new MigLayout("insets 0, gap 0, hidemode 2, wrap")); - control = new ControlSealed(this); - - // Title - JLabel lblTitle = new JLabel("Select a deck for yourself, or build a new one: "); - lblTitle.setFont(FSkin.getBoldFont(14)); - lblTitle.setForeground(FSkin.getColor(FSkin.Colors.CLR_TEXT)); - lblTitle.setHorizontalAlignment(SwingConstants.CENTER); - - // Deck lister - lstHumanDecks = new DeckLister(GameType.Sealed, control.getExitCommand()); - - // Build button - btnBuild = new FLabel.Builder().opaque(true).hoverable(true).text("Build A New Deck").build(); - - // Start button - btnStart = new StartButton(); - barProgress = new FProgressBar(); - barProgress.setVisible(false); - - // Add components - this.add(lblTitle, "w 100%!, gap 0 0 2% 2%"); - this.add(new FScrollPane(lstHumanDecks), "w 90%!, h 35%!, gap 5% 0 2% 2%"); - this.add(btnBuild, "w 50%!, h 5%!, gap 25% 0 0 0, wrap"); - this.add(btnStart, "ax center, gaptop 5%"); - this.add(barProgress, "w 150px!, h 30px!, align center"); - - control.updateDeckLists(); - control.addListeners(); - } - - /** @return {@link javax.swing.JList} */ - public DeckLister getLstHumanDecks() { - return lstHumanDecks; - } - - /** @return {@link forge.control.home.ControlSealed} */ - public ControlSealed getControl() { - return control; - } - - /** @return {@link forge.view.toolbox.FLabel} */ - public FLabel getBtnBuild() { - return btnBuild; - } - - /** @return {@link javax.swing.JButton} */ - public JButton getBtnStart() { - return btnStart; - } - - /** @return {@link forge.view.toolbox.FProgressBar} */ - public FProgressBar getBarProgress() { - return barProgress; - } -} diff --git a/src/main/java/forge/view/home/ViewSettings.java b/src/main/java/forge/view/home/ViewSettings.java deleted file mode 100644 index 534d896ee05..00000000000 --- a/src/main/java/forge/view/home/ViewSettings.java +++ /dev/null @@ -1,545 +0,0 @@ -package forge.view.home; - -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Font; -import java.awt.Image; -import java.awt.event.FocusAdapter; -import java.awt.event.FocusEvent; -import java.awt.event.KeyAdapter; -import java.awt.event.KeyEvent; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; - -import javax.swing.ImageIcon; -import javax.swing.JCheckBox; -import javax.swing.JLabel; -import javax.swing.JList; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTextField; -import javax.swing.SwingConstants; -import javax.swing.border.MatteBorder; - -import net.miginfocom.swing.MigLayout; - -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.text.WordUtils; - -import forge.Command; -import forge.Singletons; -import forge.control.KeyboardShortcuts; -import forge.control.KeyboardShortcuts.Shortcut; -import forge.control.home.ControlSettings; -import forge.properties.ForgePreferences.FPref; -import forge.properties.ForgeProps; -import forge.properties.NewConstants.Lang.OldGuiNewGame.NewGameText; -import forge.view.toolbox.FLabel; -import forge.view.toolbox.FList; -import forge.view.toolbox.FScrollPane; -import forge.view.toolbox.FSkin; -import forge.view.toolbox.SubTab; -import forge.view.toolbox.WrapLayout; - -/** - * Assembles swing components for "Settings" mode menu. - * - */ -@SuppressWarnings("serial") -public class ViewSettings extends JPanel { - private final ControlSettings control; - private final FLabel btnReset, lblTitleSkin; - - private final JList lstChooseSkin; - - private final JCheckBox cbAnte, cbScaleLarger, cbDevMode, cbRemoveSmall, cbRemoveArtifacts, - cbUploadDraft, cbStackLand, cbRandomFoil, cbTextMana, cbSingletons; - - private final JPanel pnlTabber, pnlPrefs, pnlAvatars, tabPrefs, tabAvatars; - private final JScrollPane scrContent; - - private String sectionConstraints, regularConstraints, tabberConstraints; - - private final FLabel lblAvatarHuman, lblAvatarAI; - - /** Assembles swing components for "Settings" mode menu. */ - public ViewSettings() { - // Display - super(); - this.setOpaque(false); - - // Final component inits: JPanels - pnlTabber = new JPanel(); - pnlTabber.setOpaque(false); - - pnlPrefs = new JPanel(); - pnlPrefs.setOpaque(false); - - pnlAvatars = new JPanel(); - pnlAvatars.setOpaque(false); - - tabPrefs = new SubTab("Preferences"); - tabAvatars = new SubTab("Avatars"); - - cbRemoveSmall = new OptionsCheckBox("Remove Small Creatures"); - cbSingletons = new OptionsCheckBox("Singleton Mode"); - cbRemoveArtifacts = new OptionsCheckBox("Remove Artifacts"); - cbAnte = new OptionsCheckBox("Play for Ante"); - cbUploadDraft = new OptionsCheckBox("Upload Draft Pics"); - cbStackLand = new OptionsCheckBox("Stack AI Land"); - cbDevMode = new OptionsCheckBox(ForgeProps.getLocalized(NewGameText.DEV_MODE)); - cbTextMana = new OptionsCheckBox("Text / Mana Overlay"); - cbScaleLarger = new OptionsCheckBox("Scale Image Larger"); - cbRandomFoil = new OptionsCheckBox("Random Foil"); - - // Final component inits: Various - scrContent = new JScrollPane( - JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, - JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); - scrContent.getViewport().setOpaque(false); - scrContent.setBorder(null); - scrContent.setOpaque(false); - scrContent.getVerticalScrollBar().setUnitIncrement(16); - - lstChooseSkin = new FList(); - - btnReset = new FLabel.Builder().opaque(true) - .hoverable(true).text("Reset to defaults").build(); - - lblTitleSkin = new FLabel.Builder().text("Choose Skin").fontScaleAuto(false).build(); - lblTitleSkin.setFont(FSkin.getBoldFont(14)); - - lblAvatarHuman = new FLabel.Builder().hoverable(true).selectable(true) - .iconScaleFactor(0.99f).iconInBackground(true).build(); - lblAvatarAI = new FLabel.Builder().hoverable(true).selectable(true) - .iconScaleFactor(0.99f).iconInBackground(true).build(); - - populateTabber(); - populatePrefs(); - populateAvatars(); - - this.setLayout(new MigLayout("insets 0, gap 0, wrap, hidemode 3")); - this.add(pnlTabber, "w 95%!, h 20px!, gap 2.5% 0 0 0"); - this.add(scrContent, "w 95%!, h 92%!, gap 2.5% 0 20px 0"); - - // After all components are instantiated, fire up control. - this.control = new ControlSettings(this); - showPrefsTab(); - } - - /** */ - public void updateSkinNames() { - final String[] uglyNames = FSkin.getSkins().toArray(new String[0]); - final String[] prettyNames = new String[uglyNames.length]; - - for (int i = 0; i < uglyNames.length; i++) { - prettyNames[i] = WordUtils.capitalize(uglyNames[i].replace('_', ' ')); - } - - lstChooseSkin.setListData(prettyNames); - lstChooseSkin.setSelectedValue(Singletons.getModel().getPreferences().getPref(FPref.UI_SKIN), true); - lstChooseSkin.ensureIndexIsVisible(lstChooseSkin.getSelectedIndex()); - } - - private void populateTabber() { - tabPrefs.setToolTipText("Global preference options"); - tabAvatars.setToolTipText("Human and AI avatar select"); - - tabberConstraints = "w 50%!, h 20px!"; - pnlTabber.setOpaque(false); - pnlTabber.setLayout(new MigLayout("insets 0, gap 0, align center")); - - pnlTabber.add(tabPrefs, tabberConstraints); - pnlTabber.add(tabAvatars, tabberConstraints); - } - - private void populatePrefs() { - pnlPrefs.setLayout(new MigLayout("insets 0, gap 0, wrap 2")); - - // Spacing between components is defined here. - sectionConstraints = "w 80%!, h 42px!, gap 10% 0 10px 10px, span 2 1"; - regularConstraints = "w 80%!, h 22px!, gap 10% 0 0 10px, span 2 1"; - - // Deck building options - pnlPrefs.add(new SectionLabel("Deck Building Options"), sectionConstraints + ", gaptop 2%"); - - pnlPrefs.add(cbRemoveSmall, regularConstraints); - pnlPrefs.add(new NoteLabel("Disables 1/1 and 0/X creatures in generated decks."), regularConstraints); - - pnlPrefs.add(cbSingletons, regularConstraints); - pnlPrefs.add(new NoteLabel("Disables non-land duplicates in generated decks."), regularConstraints); - - pnlPrefs.add(cbRemoveArtifacts, regularConstraints); - pnlPrefs.add(new NoteLabel("Disables artifact cards in generated decks."), regularConstraints); - - // Gameplay Options - pnlPrefs.add(new SectionLabel("Gameplay Options"), sectionConstraints); - - pnlPrefs.add(cbAnte, regularConstraints); - pnlPrefs.add(new NoteLabel("Determines whether or not the game is played for ante."), regularConstraints); - - pnlPrefs.add(cbUploadDraft, regularConstraints); - pnlPrefs.add(new NoteLabel("Sends draft picks to Forge servers for analysis, to improve draft AI."), regularConstraints); - - pnlPrefs.add(cbStackLand, regularConstraints); - pnlPrefs.add(new NoteLabel("Minimizes mana lock in AI hands, giving a slight advantage to computer."), regularConstraints); - - pnlPrefs.add(cbDevMode, regularConstraints); - pnlPrefs.add(new NoteLabel("Enables menu with functions for testing during development."), regularConstraints); - - // Graphic Options - pnlPrefs.add(new SectionLabel("Graphic Options"), sectionConstraints); - - pnlPrefs.add(lblTitleSkin, regularConstraints); - pnlPrefs.add(new NoteLabel("Various user-created themes for Forge backgrounds, fonts, and colors."), regularConstraints); - pnlPrefs.add(new FScrollPane(lstChooseSkin), "h 120px!, w 150px!, gap 10% 0 0 2%, wrap"); - - pnlPrefs.add(new FLabel.Builder().text("Card Size").fontStyle(Font.BOLD).build(), regularConstraints); - pnlPrefs.add(new NoteLabel("Size of cards in hand and playing field, when possible"), regularConstraints); - - pnlPrefs.add(cbRandomFoil, regularConstraints); - pnlPrefs.add(new NoteLabel("Adds foiled effects to random cards."), regularConstraints); - - pnlPrefs.add(cbScaleLarger, regularConstraints); - pnlPrefs.add(new NoteLabel("Allows card pictures to be expanded larger than their original size."), regularConstraints); - - pnlPrefs.add(cbTextMana, regularConstraints); - pnlPrefs.add(new NoteLabel("Overlays each card with basic card-specific information."), regularConstraints); - - // Keyboard shortcuts - final JLabel lblShortcuts = new SectionLabel("Keyboard Shortcuts"); - pnlPrefs.add(lblShortcuts, sectionConstraints); - - final List shortcuts = Singletons.getControl().getShortcuts(); - - FLabel lblTemp; - KeyboardShortcutField ksf; - for (final Shortcut s : shortcuts) { - lblTemp = new FLabel.Builder().text(s.getDescription()).build(); - ksf = new KeyboardShortcutField(s); - pnlPrefs.add(lblTemp, "w 40%!, h 22px!, gap 10%! 0 0 1%"); - pnlPrefs.add(ksf, "w 25%!"); - } - - // Reset button - pnlPrefs.add(new SectionLabel(" "), sectionConstraints); - pnlPrefs.add(btnReset, sectionConstraints); - } // End populatePrefs() - - private void populateAvatars() { - final Map avatarMap = FSkin.getAvatars(); - final JPanel pnlAvatarPics = new JPanel(new WrapLayout()); - final JPanel pnlAvatarUsers = new JPanel(new MigLayout("insets 0, gap 0, align center")); - - pnlAvatarUsers.setOpaque(false); - pnlAvatarPics.setOpaque(false); - - pnlAvatarUsers.add(new FLabel.Builder().fontSize(12).text("Human").build(), - "w 100px!, h 20px!, gap 0 20px 0 0"); - pnlAvatarUsers.add(new FLabel.Builder().fontSize(12).text("AI").build(), - "w 100px!, h 20px!, wrap"); - - pnlAvatarUsers.add(lblAvatarHuman, "w 100px!, h 100px!, gap 0 20px 0 0"); - pnlAvatarUsers.add(lblAvatarAI, "w 100px!, h 100px!"); - - for (final Integer i : avatarMap.keySet()) { - pnlAvatarPics.add(makeAvatarLabel(avatarMap.get(i), i)); - } - - pnlAvatars.removeAll(); - pnlAvatars.setLayout(new MigLayout("insets 0, gap 0")); - pnlAvatars.add(pnlAvatarUsers, "w 90%!, h 150px!, wrap"); - pnlAvatars.add(new FScrollPane(pnlAvatarPics, - JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER), - "w 90%!, pushy, growy, gap 5% 0 0 0"); - - final Command cmdHuman = new Command() { @Override - public void execute() { lblAvatarAI.setSelected(false); } }; - - final Command cmdAI = new Command() { @Override - public void execute() { lblAvatarHuman.setSelected(false); } }; - - lblAvatarHuman.setCommand(cmdHuman); - lblAvatarAI.setCommand(cmdAI); - - lblAvatarHuman.setSelected(true); - - final String[] indexes = Singletons.getModel().getPreferences().getPref(FPref.UI_AVATARS).split(","); - int humanIndex = Integer.parseInt(indexes[0]); - int aiIndex = Integer.parseInt(indexes[1]); - - if (humanIndex >= FSkin.getAvatars().size()) { humanIndex = 0; } - if (aiIndex >= FSkin.getAvatars().size()) { aiIndex = 0; } - - lblAvatarHuman.setIcon(new ImageIcon(FSkin.getAvatars().get(humanIndex))); - lblAvatarAI.setIcon(new ImageIcon(FSkin.getAvatars().get(aiIndex))); - - Singletons.getModel().getPreferences().setPref(FPref.UI_AVATARS, aiIndex + "," + humanIndex); - Singletons.getModel().getPreferences().save(); - } - - private FLabel makeAvatarLabel(final Image img0, final int index0) { - final FLabel lbl = new FLabel.Builder().icon(new ImageIcon(img0)).iconScaleFactor(1.0) - .iconAlpha(0.7f).iconInBackground(true).hoverable(true).build(); - - final Dimension size = new Dimension(100, 100); - lbl.setPreferredSize(size); - lbl.setMaximumSize(size); - lbl.setMinimumSize(size); - - final Command cmd = new Command() { - @Override - public void execute() { - String[] indices = Singletons.getModel().getPreferences() - .getPref(FPref.UI_AVATARS).split(","); - - if (lblAvatarAI.isSelected()) { - lblAvatarAI.setIcon(new ImageIcon(FSkin.getAvatars().get(index0))); - lblAvatarAI.repaintOnlyThisLabel(); - indices[0] = String.valueOf(index0); - } - else { - lblAvatarHuman.setIcon(new ImageIcon(FSkin.getAvatars().get(index0))); - lblAvatarHuman.repaintOnlyThisLabel(); - indices[1] = String.valueOf(index0); - } - - Singletons.getModel().getPreferences().setPref(FPref.UI_AVATARS, indices[0] + "," + indices[1]); - Singletons.getModel().getPreferences().save(); - } - }; - - lbl.setCommand(cmd); - return lbl; - } - - /** Consolidates checkbox styling in one place. */ - private class OptionsCheckBox extends JCheckBox { - public OptionsCheckBox(final String txt0) { - super(); - setText(txt0); - setFont(FSkin.getBoldFont(12)); - setForeground(FSkin.getColor(FSkin.Colors.CLR_TEXT)); - setBackground(FSkin.getColor(FSkin.Colors.CLR_HOVER)); - setOpaque(false); - - this.addMouseListener(new MouseAdapter() { - @Override - public void mouseEntered(final MouseEvent evt) { - setOpaque(true); - } - - @Override - public void mouseExited(final MouseEvent evt) { - setOpaque(false); - } - }); - } - } - - /** Consolidates section title label styling in one place. */ - private class SectionLabel extends JLabel { - public SectionLabel(final String txt0) { - super(txt0); - setBorder(new MatteBorder(0, 0, 1, 0, FSkin.getColor(FSkin.Colors.CLR_BORDERS))); - setHorizontalAlignment(SwingConstants.CENTER); - setFont(FSkin.getBoldFont(16)); - setForeground(FSkin.getColor(FSkin.Colors.CLR_TEXT)); - } - } - - /** Consolidates notation label styling in one place. */ - private class NoteLabel extends JLabel { - public NoteLabel(final String txt0) { - super(txt0); - setFont(FSkin.getItalicFont(12)); - setForeground(FSkin.getColor(FSkin.Colors.CLR_TEXT)); - } - } - - /** - * A JTextField plus a "codeString" property, that stores keycodes for the - * shortcut. Also, an action listener that handles translation of keycodes - * into characters and (dis)assembly of keycode stack. - */ - public class KeyboardShortcutField extends JTextField { - private String codeString; - - /** - * A JTextField plus a "codeString" property, that stores keycodes for - * the shortcut. Also, an action listener that handles translation of - * keycodes into characters and (dis)assembly of keycode stack. - * - * @param shortcut0   Shortcut object - */ - public KeyboardShortcutField(final Shortcut shortcut0) { - super(); - this.setEditable(false); - this.setFont(FSkin.getFont(14)); - this.setCodeString(Singletons.getModel().getPreferences().getPref(shortcut0.getPrefKey())); - - this.addKeyListener(new KeyAdapter() { - @Override - public void keyPressed(final KeyEvent evt) { - KeyboardShortcuts.addKeyCode(evt); - } - }); - - this.addFocusListener(new FocusAdapter() { - @Override - public void focusGained(final FocusEvent evt) { - KeyboardShortcutField.this.setBackground(FSkin.getColor(FSkin.Colors.CLR_ACTIVE)); - } - - @Override - public void focusLost(final FocusEvent evt) { - Singletons.getModel().getPreferences().setPref( - shortcut0.getPrefKey(), getCodeString()); - Singletons.getModel().getPreferences().save(); - shortcut0.attach(); - KeyboardShortcutField.this.setBackground(Color.white); - } - }); - } - - /** - * Gets the code string. - * - * @return String - */ - public final String getCodeString() { - return this.codeString; - } - - /** - * Sets the code string. - * - * @param str0 - *   The new code string (space delimited) - */ - public final void setCodeString(final String str0) { - if ("null".equals(str0)) { - return; - } - - this.codeString = str0.trim(); - - final List codes = new ArrayList(Arrays.asList(this.codeString.split(" "))); - final List displayText = new ArrayList(); - - for (final String s : codes) { - if (!s.isEmpty()) { - displayText.add(KeyEvent.getKeyText(Integer.valueOf(s))); - } - } - - this.setText(StringUtils.join(displayText, ' ')); - } - } - - /** @return {@link javax.swing.JPanel} */ - public final JPanel getPnlPrefs() { - return this.pnlPrefs; - } - - /** @return {@link javax.swing.JPanel} */ - public final JPanel getPnlAvatars() { - return this.pnlAvatars; - } - - /** @return {@link javax.swing.JList} */ - public final JList getLstChooseSkin() { - return lstChooseSkin; - } - - /** @return {@link javax.swing.JCheckBox} */ - public final JCheckBox getCbRemoveSmall() { - return cbRemoveSmall; - } - - /** @return {@link javax.swing.JCheckBox} */ - public final JCheckBox getCbSingletons() { - return cbSingletons; - } - - /** @return {@link javax.swing.JCheckBox} */ - public JCheckBox getCbRemoveArtifacts() { - return cbRemoveArtifacts; - } - - /** @return {@link javax.swing.JCheckBox} */ - public JCheckBox getCbUploadDraft() { - return cbUploadDraft; - } - - /** @return {@link javax.swing.JCheckBox} */ - public JCheckBox getCbStackLand() { - return cbStackLand; - } - - /** @return {@link javax.swing.JCheckBox} */ - public JCheckBox getCbTextMana() { - return cbTextMana; - } - - /** @return {@link javax.swing.JCheckBox} */ - public JCheckBox getCbRandomFoil() { - return cbRandomFoil; - } - - /** @return {@link javax.swing.JCheckBox} */ - public JCheckBox getCbAnte() { - return cbAnte; - } - - /** @return {@link javax.swing.JCheckBox} */ - public JCheckBox getCbScaleLarger() { - return cbScaleLarger; - } - - /** @return {@link javax.swing.JCheckBox} */ - public JCheckBox getCbDevMode() { - return cbDevMode; - } - - /** @return {@link javax.swing.FLabel} */ - public FLabel getLblTitleSkin() { - return lblTitleSkin; - } - - /** @return ControlSettings */ - public ControlSettings getControl() { - return ViewSettings.this.control; - } - - /** @return {@link forge.view.toolbox.FLabel} */ - public FLabel getBtnReset() { - return btnReset; - } - - /** @return {@link javax.swing.JPanel} */ - public JPanel getTabPrefs() { - return this.tabPrefs; - } - - /** @return {@link javax.swing.JPanel} */ - public JPanel getTabAvatars() { - return this.tabAvatars; - } - - /** */ - public final void showPrefsTab() { - this.scrContent.setViewportView(pnlPrefs); - control.updateTabber(tabPrefs); - } - - /** */ - public final void showAvatarsTab() { - this.scrContent.setViewportView(pnlAvatars); - control.updateTabber(tabAvatars); - } -} diff --git a/src/main/java/forge/view/home/ViewUtilities.java b/src/main/java/forge/view/home/ViewUtilities.java deleted file mode 100644 index a30af6ed642..00000000000 --- a/src/main/java/forge/view/home/ViewUtilities.java +++ /dev/null @@ -1,216 +0,0 @@ -package forge.view.home; - -import java.awt.Font; -import java.awt.event.ActionEvent; - -import javax.swing.AbstractAction; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JTextPane; -import javax.swing.SwingConstants; -import javax.swing.border.LineBorder; -import javax.swing.text.SimpleAttributeSet; -import javax.swing.text.StyleConstants; -import javax.swing.text.StyledDocument; - -import net.miginfocom.swing.MigLayout; -import forge.Singletons; -import forge.control.home.ControlUtilities; -import forge.view.toolbox.FButton; -import forge.view.toolbox.FLabel; -import forge.view.toolbox.FPanel; -import forge.view.toolbox.FSkin; - -/** - * Assembles swing components for "Utilities" mode menu. - * - */ -@SuppressWarnings("serial") -public class ViewUtilities extends JPanel { - private final ControlUtilities control; - private final JTextPane tpnLicensing; - private final JLabel lblLicensing; - - private FLabel btnDownloadSetPics, btnDownloadPics, btnDownloadQuestImages, btnReportBug, btnImportPictures, - btnHowToPlay, btnDownloadPrices, btnDeckEditor; - - private final String license = "Forge License Information" + "\r\n\r\n" - + "This program is free software : you can redistribute it and/or modify " - + "it under the terms of the GNU General Public License as published by " - + "the Free Software Foundation, either version 3 of the License, or " - + "(at your option) any later version." + "\r\n\r\n" - + "This program is distributed in the hope that it will be useful, " - + "but WITHOUT ANY WARRANTY; without even the implied warranty of " - + "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the " - + "GNU General Public License for more details." + "\r\n\r\n" - + "You should have received a copy of the GNU General Public License " - + "along with this program. If not, see ."; - - /** Assembles swing components for "Utilities" mode menu. */ - public ViewUtilities() { - super(); - this.setOpaque(false); - this.setLayout(new MigLayout("insets 0, gap 0, wrap, ay center")); - final String constraintsLBL = "w 90%!, h 20px!, gap 5% 0 3px 8px"; - final String constraintsBTN = "h 30px!, w 50%!, gap 25% 0 0 0"; - - btnDownloadPics = new FLabel.Builder().opaque(true).hoverable(true) - .text("Download LQ Card Pictures").fontScaleFactor(0.5).build(); - final FLabel lblPics = new FLabel.Builder().fontAlign(SwingConstants.CENTER) - .text("Download default card picture for each card.").fontStyle(Font.ITALIC).build(); - - this.add(btnDownloadPics, constraintsBTN); - this.add(lblPics, constraintsLBL); - - btnDownloadSetPics = new FLabel.Builder().opaque(true).hoverable(true) - .text("Download LQ Set Pictures").fontScaleFactor(0.5).build(); - final FLabel lblSets = new FLabel.Builder().fontAlign(SwingConstants.CENTER) - .text("Download full card picture sets for all cards from legacy releases of MTG.") - .fontStyle(Font.ITALIC).build(); - - this.add(btnDownloadSetPics, constraintsBTN); - this.add(lblSets, constraintsLBL); - - btnDownloadQuestImages = new FLabel.Builder().opaque(true).hoverable(true) - .text("Download Quest Images").fontScaleFactor(0.5).build(); - final FLabel lblQuest = new FLabel.Builder().fontAlign(SwingConstants.CENTER) - .text("Download tokens and icons used in Quest mode.").fontStyle(Font.ITALIC).build(); - - this.add(btnDownloadQuestImages, constraintsBTN); - this.add(lblQuest, constraintsLBL); - - btnDownloadPrices = new FLabel.Builder().opaque(true).hoverable(true) - .text("Download Card Prices").fontScaleFactor(0.5).build(); - final FLabel lblPrices = new FLabel.Builder().fontAlign(SwingConstants.CENTER) - .text("Download up-to-date price list for in-game card shops.") - .fontStyle(Font.ITALIC).build(); - - this.add(btnDownloadPrices, constraintsBTN); - this.add(lblPrices, constraintsLBL); - - btnImportPictures = new FLabel.Builder().opaque(true).hoverable(true) - .text("Import Pictures").fontScaleFactor(0.5).build(); - final FLabel lblImport = new FLabel.Builder().fontAlign(SwingConstants.CENTER) - .text("Import card pictures from a local version of Forge.") - .fontStyle(Font.ITALIC).build(); - this.add(btnImportPictures, constraintsBTN); - this.add(lblImport, constraintsLBL); - - btnReportBug = new FLabel.Builder().opaque(true).hoverable(true) - .text("Report a Bug").fontScaleFactor(0.5).build(); - final FLabel lblReport = new FLabel.Builder().fontAlign(SwingConstants.CENTER) - .text("Something broken?").fontStyle(Font.ITALIC).build(); - - this.add(btnReportBug, constraintsBTN); - this.add(lblReport, constraintsLBL); - - btnDeckEditor = new FLabel.Builder().opaque(true).hoverable(true) - .text("Deck Editor").fontScaleFactor(0.5).build(); - final FLabel lblEditor = new FLabel.Builder().fontAlign(SwingConstants.CENTER) - .text("Build or edit a deck using all cards available in Forge.") - .fontStyle(Font.ITALIC).build(); - this.add(btnDeckEditor, constraintsBTN); - this.add(lblEditor, constraintsLBL); - - btnHowToPlay = new FLabel.Builder().opaque(true).hoverable(true).text("How To Play"); - this.add(btnHowToPlay, constraintsBTN); - - tpnLicensing = new JTextPane(); - tpnLicensing.setOpaque(false); - tpnLicensing.setForeground(FSkin.getColor(FSkin.Colors.CLR_TEXT)); - tpnLicensing.setFont(FSkin.getFont(15)); - tpnLicensing.setAlignmentX(SwingConstants.CENTER); - tpnLicensing.setFocusable(false); - tpnLicensing.setEditable(false); - tpnLicensing.setBorder(null); - tpnLicensing.setText(license); - - StyledDocument doc = tpnLicensing.getStyledDocument(); - SimpleAttributeSet center = new SimpleAttributeSet(); - StyleConstants.setAlignment(center, StyleConstants.ALIGN_CENTER); - doc.setParagraphAttributes(0, doc.getLength(), center, false); - - lblLicensing = new JLabel("Click For License Information"); - lblLicensing.setFont(FSkin.getFont(16)); - lblLicensing.setHorizontalAlignment(SwingConstants.CENTER); - lblLicensing.setForeground(FSkin.getColor(FSkin.Colors.CLR_TEXT)); - this.add(lblLicensing, "alignx center, gap 5% 0 5% 0"); - - control = new ControlUtilities(this); - } - - /** */ - public void showLicensing() { - final FButton btnClose = new FButton(); - final FPanel pnlContainer = new FPanel(); - - btnClose.setAction(new AbstractAction() { - @Override - public void actionPerformed(ActionEvent e) { - Singletons.getView().getOverlay().hideOverlay(); - } - }); - btnClose.setText("Close"); - - pnlContainer.setBorder(new LineBorder(FSkin.getColor(FSkin.Colors.CLR_BORDERS), 1)); - pnlContainer.setBackground(FSkin.getColor(FSkin.Colors.CLR_THEME)); - pnlContainer.setLayout(new MigLayout("insets 0, wrap")); - pnlContainer.add(tpnLicensing, "w 90%, gap 5% 0 20px 0, wrap"); - pnlContainer.add(btnClose, "w 300px!, h 40px!, gap 0 0 20px 20px, alignx center"); - - Singletons.getView().getOverlay().removeAll(); - Singletons.getView().getOverlay().setLayout(new MigLayout("insets 0")); - Singletons.getView().getOverlay().add(pnlContainer, "w 50%, gap 25% 0 5% 5%, wrap"); - Singletons.getView().getOverlay().showOverlay(); - } - - /** @return {@link forge.view.toolbox.FLabel} */ - public FLabel getBtnDownloadPics() { - return btnDownloadPics; - } - - /** @return {@link forge.view.toolbox.FLabel} */ - public FLabel getBtnDownloadSetPics() { - return btnDownloadSetPics; - } - - /** @return {@link forge.view.toolbox.FLabel} */ - public FLabel getBtnDownloadQuestImages() { - return btnDownloadQuestImages; - } - - /** @return {@link forge.view.toolbox.FLabel} */ - public FLabel getBtnReportBug() { - return btnReportBug; - } - - /** @return {@link forge.view.toolbox.FLabel} */ - public FLabel getBtnImportPictures() { - return btnImportPictures; - } - - /** @return {@link forge.view.toolbox.FLabel} */ - public FLabel getBtnHowToPlay() { - return btnHowToPlay; - } - - /** @return {@link forge.view.toolbox.FLabel} */ - public FLabel getBtnDownloadPrices() { - return btnDownloadPrices; - } - - /** @return {@link forge.view.toolbox.FLabel} */ - public FLabel getBtnDeckEditor() { - return btnDeckEditor; - } - - /** @return JLabel */ - public JLabel getLblLicensing() { - return lblLicensing; - } - - /** @return ControlUtilities */ - public ControlUtilities getControl() { - return ViewUtilities.this.control; - } -} // end class ViewUtilities diff --git a/src/main/java/forge/view/home/package-info.java b/src/main/java/forge/view/home/package-info.java deleted file mode 100644 index 35d46c7c736..00000000000 --- a/src/main/java/forge/view/home/package-info.java +++ /dev/null @@ -1,3 +0,0 @@ -/** Views (as in model-view-controller) for Forge. */ -package forge.view.home; - diff --git a/src/main/java/forge/view/match/QuestWinLoseHandler.java b/src/main/java/forge/view/match/QuestWinLoseHandler.java index 361695a1961..b840d76cc54 100644 --- a/src/main/java/forge/view/match/QuestWinLoseHandler.java +++ b/src/main/java/forge/view/match/QuestWinLoseHandler.java @@ -296,15 +296,16 @@ public class QuestWinLoseHandler extends ControlWinLose { Singletons.getControl().changeState(FControl.HOME_SCREEN); // Update as necessary. - if ((Singletons.getView().getViewHome().getViewQuest().getPnlDuels().isVisible())) { + /* if ((Singletons.getView().getViewHome().getViewQuest().getPnlDuels().isVisible())) { Singletons.getView().getViewHome().getViewQuest().showDuelsTab(); } else if (Singletons.getView().getViewHome().getViewQuest().getPnlChallenges().isVisible()) { Singletons.getView().getViewHome().getViewQuest().showChallengesTab(); } - Singletons.getView().getViewHome().showQuestMenu(); + Singletons.getView().getViewHome().showQuestMenu();*/ GuiUtils.closeOverlay(); + throw new NullPointerException("Fix me"); } /** diff --git a/src/main/java/forge/view/toolbox/DeckLister.java b/src/main/java/forge/view/toolbox/DeckLister.java index 75485267b5f..e5dace45ae2 100644 --- a/src/main/java/forge/view/toolbox/DeckLister.java +++ b/src/main/java/forge/view/toolbox/DeckLister.java @@ -421,30 +421,36 @@ public class DeckLister extends JPanel { } private void editDeck(final Deck d0) { + Singletons.getView().getOverlay().showOverlay(); + switch (this.gametype) { case Quest: Constant.Runtime.HUMAN_DECK[0] = d0; final DeckEditorQuest editor = new DeckEditorQuest(AllZone.getQuestData()); editor.show(this.cmdEditorExit); editor.setVisible(true); + editor.setAlwaysOnTop(true); break; case Constructed: final DeckEditorConstructed cEditor = new DeckEditorConstructed(); cEditor.show(this.cmdEditorExit); cEditor.getController().load(d0.getName()); cEditor.setVisible(true); + cEditor.setAlwaysOnTop(true); break; case Sealed: final DeckEditorLimited sEditor = new DeckEditorLimited(Singletons.getModel().getDecks().getSealed()); sEditor.show(this.cmdEditorExit); sEditor.getController().load(d0.getName()); sEditor.setVisible(true); + sEditor.setAlwaysOnTop(true); break; case Draft: final DeckEditorLimited dEditor = new DeckEditorLimited(Singletons.getModel().getDecks().getDraft()); dEditor.show(this.cmdEditorExit); dEditor.getController().load(d0.getName()); dEditor.setVisible(true); + dEditor.setAlwaysOnTop(true); break; default: break; @@ -470,7 +476,6 @@ public class DeckLister extends JPanel { } else if (this.gametype.equals(GameType.Quest)) { AllZone.getQuestData().getMyDecks().delete(d0.getName()); AllZone.getQuestData().saveData(); - Singletons.getView().getViewHome().getBtnQuest().grabFocus(); } else { deckManager.getConstructed().delete(d0.getName()); } diff --git a/src/main/java/forge/view/toolbox/FLabel.java b/src/main/java/forge/view/toolbox/FLabel.java index 9f9424ac763..3c9cb2d982c 100644 --- a/src/main/java/forge/view/toolbox/FLabel.java +++ b/src/main/java/forge/view/toolbox/FLabel.java @@ -316,6 +316,11 @@ public class FLabel extends JLabel { return this.resizeTimer; } + /** @return {@link forge.Command} */ + public Command getCommand() { + return this.cmdClick; + } + /** @return boolean */ public boolean isSelected() { return selected; diff --git a/src/main/java/forge/view/toolbox/FPanel.java b/src/main/java/forge/view/toolbox/FPanel.java index 6791458893e..004a4b9b60c 100644 --- a/src/main/java/forge/view/toolbox/FPanel.java +++ b/src/main/java/forge/view/toolbox/FPanel.java @@ -18,9 +18,11 @@ package forge.view.toolbox; import java.awt.Color; +import java.awt.FlowLayout; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; +import java.awt.LayoutManager; import java.awt.RenderingHints; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; @@ -67,9 +69,16 @@ public class FPanel extends JPanel { // Image aspect ratio (width / height) private double iar; - /** Core panel used in UI. See class javadoc for more details. */ + /** */ public FPanel() { - super(); + this(new FlowLayout()); + } + + /** Core panel used in UI. See class javadoc for more details. + * @param lm0   {@link java.awt.LayoutManager} + */ + public FPanel(final LayoutManager lm0) { + super(lm0); // Opacity must be removed for proper rounded corner drawing this.setOpaque(false); diff --git a/src/main/java/forge/view/toolbox/FSkin.java b/src/main/java/forge/view/toolbox/FSkin.java index 96892cfb267..8f365cdbf16 100644 --- a/src/main/java/forge/view/toolbox/FSkin.java +++ b/src/main/java/forge/view/toolbox/FSkin.java @@ -720,8 +720,8 @@ public enum FSkin { final int aw = bimAvatars.getWidth(); final int ah = bimAvatars.getHeight(); - for (int j = 0; j < aw; j += 100) { - for (int i = 0; i < ah; i += 100) { + for (int j = 0; j < ah; j += 100) { + for (int i = 0; i < aw; i += 100) { if (i == 0 && j == 0) { continue; } pxTest = FSkin.getColorFromPixel(bimAvatars.getRGB(i + 50, j + 50)); if (pxTest.getAlpha() == 0) { continue; }