diff --git a/.gitattributes b/.gitattributes index ba7f97d4e3e..3f5b045ee9a 100644 --- a/.gitattributes +++ b/.gitattributes @@ -11218,7 +11218,6 @@ 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/IControlSubmenu.java -text src/main/java/forge/control/home/constructed/ControlSubmenuColors.java -text src/main/java/forge/control/home/constructed/ControlSubmenuCustom.java -text src/main/java/forge/control/home/package-info.java -text svneol=native#text/plain @@ -11327,6 +11326,19 @@ src/main/java/forge/gui/game/CardDetailPanel.java svneol=native#text/plain 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/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/package-info.java svneol=native#text/plain src/main/java/forge/item/BoosterPack.java -text src/main/java/forge/item/CardDb.java -text @@ -11418,7 +11430,6 @@ 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/IViewSubmenu.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 diff --git a/src/main/java/forge/gui/home/EMenuGroup.java b/src/main/java/forge/gui/home/EMenuGroup.java new file mode 100644 index 00000000000..1effb5f3bba --- /dev/null +++ b/src/main/java/forge/gui/home/EMenuGroup.java @@ -0,0 +1,15 @@ +package forge.gui.home; + +/** + * Submenus each belong to a menu group, which + * is used for several functions, such as expanding + * and collapsing in the menu. + */ +public enum EMenuGroup { /** */ + CONSTRUCTED, /** */ + SEALED, /** */ + DRAFT, /** */ + QUEST, /** */ + SETTINGS, /** */ + UTILITIES; +} diff --git a/src/main/java/forge/control/home/IControlSubmenu.java b/src/main/java/forge/gui/home/ICSubmenu.java similarity index 83% rename from src/main/java/forge/control/home/IControlSubmenu.java rename to src/main/java/forge/gui/home/ICSubmenu.java index b5e5aa11ffc..003cb25e758 100644 --- a/src/main/java/forge/control/home/IControlSubmenu.java +++ b/src/main/java/forge/gui/home/ICSubmenu.java @@ -1,9 +1,9 @@ -package forge.control.home; +package forge.gui.home; import forge.Command; /** Dictates methods required for a submenu controller. */ -public interface IControlSubmenu { +public interface ICSubmenu { /** @return {@link forge.Command} */ Command getMenuCommand(); diff --git a/src/main/java/forge/view/home/IViewSubmenu.java b/src/main/java/forge/gui/home/IVSubmenu.java similarity index 64% rename from src/main/java/forge/view/home/IViewSubmenu.java rename to src/main/java/forge/gui/home/IVSubmenu.java index 2275e405501..41dbef9e7f4 100644 --- a/src/main/java/forge/view/home/IViewSubmenu.java +++ b/src/main/java/forge/gui/home/IVSubmenu.java @@ -1,15 +1,9 @@ -package forge.view.home; +package forge.gui.home; import javax.swing.JPanel; -import forge.control.home.IControlSubmenu; -import forge.model.home.MenuGroup; - /** Dictates methods required for a submenu view. */ -public interface IViewSubmenu { - /** @return {@link forge.control.home.IControlSubmenu} */ - IControlSubmenu getControl(); - +public interface IVSubmenu { /** Allows static factory creation by decoupling UI components. * @return {@link javax.swing.JPanel} */ JPanel getPanel(); @@ -18,7 +12,7 @@ public interface IViewSubmenu { * functions such as expanding and collapsing in the menu area. * * @return {@link javax.swing.JPanel} */ - MenuGroup getGroup(); + EMenuGroup getGroup(); /** Removes all children and (re)populates panel components, independent of constructor.*/ void populate(); diff --git a/src/main/java/forge/gui/home/constructed/CSubmenuColors.java b/src/main/java/forge/gui/home/constructed/CSubmenuColors.java new file mode 100644 index 00000000000..89879ff9fa0 --- /dev/null +++ b/src/main/java/forge/gui/home/constructed/CSubmenuColors.java @@ -0,0 +1,81 @@ +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 new file mode 100644 index 00000000000..a828ac193f9 --- /dev/null +++ b/src/main/java/forge/gui/home/constructed/CSubmenuCustom.java @@ -0,0 +1,78 @@ +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.IFolderMap; + +/** + * 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 IFolderMap 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 new file mode 100644 index 00000000000..37680fac22d --- /dev/null +++ b/src/main/java/forge/gui/home/constructed/CSubmenuQuestEvents.java @@ -0,0 +1,85 @@ +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 new file mode 100644 index 00000000000..c0860884751 --- /dev/null +++ b/src/main/java/forge/gui/home/constructed/CSubmenuThemes.java @@ -0,0 +1,68 @@ +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 new file mode 100644 index 00000000000..cd5a8e1069b --- /dev/null +++ b/src/main/java/forge/gui/home/constructed/ESubmenuConstructedTypes.java @@ -0,0 +1,12 @@ +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 new file mode 100644 index 00000000000..5f59f5b1b44 --- /dev/null +++ b/src/main/java/forge/gui/home/constructed/SubmenuConstructedUtil.java @@ -0,0 +1,387 @@ +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. + * + */ +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.getSelectedValuesList().toArray()); + 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 Deck deckHuman = generateDeck(lists0.get(0), PlayerType.HUMAN); + final Deck deckAI = generateDeck(lists0.get(1), PlayerType.COMPUTER); + + 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(deckHuman, deckAI); + 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 new file mode 100644 index 00000000000..1bc8c1d59cc --- /dev/null +++ b/src/main/java/forge/gui/home/constructed/VSubmenuColors.java @@ -0,0 +1,70 @@ +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 null; + } + + /* (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 new file mode 100644 index 00000000000..8baeb41af30 --- /dev/null +++ b/src/main/java/forge/gui/home/constructed/VSubmenuCustom.java @@ -0,0 +1,68 @@ +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 null; + } + + /* (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 new file mode 100644 index 00000000000..a9de371f0d2 --- /dev/null +++ b/src/main/java/forge/gui/home/constructed/VSubmenuQuestEvents.java @@ -0,0 +1,68 @@ +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 null; + } + + /* (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 new file mode 100644 index 00000000000..44cfd322069 --- /dev/null +++ b/src/main/java/forge/gui/home/constructed/VSubmenuThemes.java @@ -0,0 +1,69 @@ +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 null; + } + + /* (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; + } +}