diff --git a/.gitattributes b/.gitattributes index fe04e14a202..db5ce0d2552 100644 --- a/.gitattributes +++ b/.gitattributes @@ -12883,6 +12883,7 @@ src/main/java/forge/gui/toolbox/DeckLister.java -text src/main/java/forge/gui/toolbox/ExperimentalLabel.java -text src/main/java/forge/gui/toolbox/FButton.java -text src/main/java/forge/gui/toolbox/FCheckBox.java -text +src/main/java/forge/gui/toolbox/FDeckChooser.java -text src/main/java/forge/gui/toolbox/FLabel.java -text src/main/java/forge/gui/toolbox/FList.java -text src/main/java/forge/gui/toolbox/FOverlay.java -text diff --git a/src/main/java/forge/game/GameState.java b/src/main/java/forge/game/GameState.java index 98bc0aa756e..4069ec5e56f 100644 --- a/src/main/java/forge/game/GameState.java +++ b/src/main/java/forge/game/GameState.java @@ -461,7 +461,6 @@ public class GameState { do{ iPlayer = ( iPlayer + 1 ) % allPlayers.size(); iAlive = roIngamePlayers.indexOf(allPlayers.get(iPlayer)); - } while(iAlive < 0); iPlayer = iAlive; } else { // for the case noone has died diff --git a/src/main/java/forge/game/player/Player.java b/src/main/java/forge/game/player/Player.java index 8cf1def3600..37772eb7509 100644 --- a/src/main/java/forge/game/player/Player.java +++ b/src/main/java/forge/game/player/Player.java @@ -216,8 +216,13 @@ public abstract class Player extends GameEntity implements Comparable { * @return */ public final List getOpponents() { - Predicate enemy = com.google.common.base.Predicates.not(Player.Predicates.isType(this.getType())); - return Lists.newArrayList(Iterables.filter(Singletons.getModel().getGame().getPlayers(), enemy)); + List result = new ArrayList(); + for (Player p : Singletons.getModel().getGame().getPlayers()) { + if (p == this || p.getType() == this.getType()) + continue; + result.add(p); + } + return result; } /** @@ -226,8 +231,13 @@ public abstract class Player extends GameEntity implements Comparable { * @return */ public final List getAllies() { - Predicate enemy = Player.Predicates.isType(this.getType()); - return Lists.newArrayList(Iterables.filter(Singletons.getModel().getGame().getPlayers(), enemy)); + List result = new ArrayList(); + for (Player p : Singletons.getModel().getGame().getPlayers()) { + if (p == this || p.getType() != this.getType()) + continue; + result.add(p); + } + return result; } diff --git a/src/main/java/forge/gui/home/sanctioned/CSubmenuConstructed.java b/src/main/java/forge/gui/home/sanctioned/CSubmenuConstructed.java index 38b8628a125..049465966e4 100644 --- a/src/main/java/forge/gui/home/sanctioned/CSubmenuConstructed.java +++ b/src/main/java/forge/gui/home/sanctioned/CSubmenuConstructed.java @@ -2,36 +2,21 @@ package forge.gui.home.sanctioned; 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.List; -import javax.swing.JList; -import javax.swing.ListSelectionModel; import javax.swing.SwingUtilities; import javax.swing.SwingWorker; -import org.apache.commons.lang3.ArrayUtils; - import forge.Command; import forge.Singletons; import forge.control.Lobby; import forge.deck.Deck; -import forge.deck.DeckgenUtil; -import forge.deck.generate.GenerateThemeDeck; import forge.game.GameType; import forge.game.MatchController; import forge.game.MatchStartHelper; import forge.game.player.PlayerType; import forge.gui.SOverlayUtils; import forge.gui.framework.ICDoc; -import forge.gui.toolbox.ExperimentalLabel; import forge.properties.ForgePreferences; import forge.properties.ForgePreferences.FPref; -import forge.quest.QuestController; -import forge.quest.QuestEvent; -import forge.util.IStorage; /** * Controls the constructed submenu in the home UI. @@ -39,40 +24,11 @@ import forge.util.IStorage; *

(C at beginning of class name denotes a control class.) * */ -@SuppressWarnings("serial") public enum CSubmenuConstructed implements ICDoc { /** */ SINGLETON_INSTANCE; private final VSubmenuConstructed view = VSubmenuConstructed.SINGLETON_INSTANCE; - private enum ESubmenuConstructedTypes { /** */ - COLORS, /** */ - THEMES, /** */ - CUSTOM, /** */ - QUESTEVENTS - } - - private final MouseAdapter madDecklist = new MouseAdapter() { - @Override - public void mouseClicked(final MouseEvent e) { - if (e.getClickCount() == 2) { - final JList src = ((JList) e.getSource()); - if (src.equals(view.getLstDecksAI())) { - if (view.getRadColorsAI().isSelected()) { return; } - if (view.getRadThemesAI().isSelected()) { return; } - } - else { - if (view.getRadColorsHuman().isSelected()) { return; } - if (view.getRadThemesHuman().isSelected()) { return; } - } - - DeckgenUtil.showDecklist(src); - } - } - }; - - private final QuestController quest = Singletons.getModel().getQuest(); - /* (non-Javadoc) * @see forge.gui.home.ICSubmenu#initialize() @@ -88,39 +44,8 @@ public enum CSubmenuConstructed implements ICDoc { @Override public void initialize() { final ForgePreferences prefs = Singletons.getModel().getPreferences(); - - // 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); } }); + view.getDcAi().initialize(); + view.getDcHuman().initialize(); // Checkbox event handling view.getBtnStart().addActionListener(new ActionListener() { @@ -162,128 +87,9 @@ public enum CSubmenuConstructed implements ICDoc { 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.getLstUserDecks() - : VSubmenuConstructed.SINGLETON_INSTANCE.getLstDecksAI()); - 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 ExperimentalLabel btn = (player0.equals(PlayerType.HUMAN) - ? VSubmenuConstructed.SINGLETON_INSTANCE.getBtnHumanRandom() - : VSubmenuConstructed.SINGLETON_INSTANCE.getBtnAIRandom()); - - btn.setCommand(new Command() { @Override - public void execute() { lst.setSelectedIndices( - DeckgenUtil.randomSelectColors()); } }); - - // Init basic two color deck - lst.setSelectedIndices(new int[]{0, 1}); - } - - /** Handles all control for "themes" radio button click. */ - private void updateThemes(final PlayerType player0) { - final JList lst = (player0.equals(PlayerType.HUMAN) - ? VSubmenuConstructed.SINGLETON_INSTANCE.getLstUserDecks() - : VSubmenuConstructed.SINGLETON_INSTANCE.getLstDecksAI()); - 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 ExperimentalLabel btn = (player0.equals(PlayerType.HUMAN) - ? VSubmenuConstructed.SINGLETON_INSTANCE.getBtnHumanRandom() - : VSubmenuConstructed.SINGLETON_INSTANCE.getBtnAIRandom()); - - btn.setCommand(new Command() { @Override - public void execute() { DeckgenUtil.randomSelect(lst); } }); - - // Init first in list - lst.setSelectedIndex(0); - } - - /** Handles all control for "custom" radio button click. */ - private void updateCustom(final PlayerType player0) { - final JList lst = (player0.equals(PlayerType.HUMAN) - ? VSubmenuConstructed.SINGLETON_INSTANCE.getLstUserDecks() - : VSubmenuConstructed.SINGLETON_INSTANCE.getLstDecksAI()); - 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 ExperimentalLabel btn = (player0.equals(PlayerType.HUMAN) - ? VSubmenuConstructed.SINGLETON_INSTANCE.getBtnHumanRandom() - : VSubmenuConstructed.SINGLETON_INSTANCE.getBtnAIRandom()); - - btn.setCommand(new Command() { @Override - public void execute() { DeckgenUtil.randomSelect(lst); } }); - - // Init first in list - lst.setSelectedIndex(0); - } - - /** 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.getLstUserDecks() - : VSubmenuConstructed.SINGLETON_INSTANCE.getLstDecksAI()); - lst.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - - final List eventNames = new ArrayList(); - - for (final QuestEvent e : quest.getDuelsManager().getAllDuels()) { - eventNames.add(e.getEventDeck().getName()); - } - - for (final QuestEvent e : quest.getChallengesManager().getAllChallenges()) { - 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 ExperimentalLabel btn = (player0.equals(PlayerType.HUMAN) - ? VSubmenuConstructed.SINGLETON_INSTANCE.getBtnHumanRandom() - : VSubmenuConstructed.SINGLETON_INSTANCE.getBtnAIRandom()); - - btn.setCommand(new Command() { @Override - public void execute() { DeckgenUtil.randomSelect(lst); } }); - - // Init first in list - lst.setSelectedIndex(0); - } + /** @param lists0   {@link java.util.List}<{@link javax.swing.JList}> */ private void startGame() { @@ -298,8 +104,8 @@ public enum CSubmenuConstructed implements ICDoc { final SwingWorker worker = new SwingWorker() { @Override public Object doInBackground() { - Deck humanDeck = generateDeck(VSubmenuConstructed.SINGLETON_INSTANCE.getLstUserDecks(), PlayerType.HUMAN); - Deck aiDeck = generateDeck(VSubmenuConstructed.SINGLETON_INSTANCE.getLstDecksAI(), PlayerType.COMPUTER); + Deck humanDeck = VSubmenuConstructed.SINGLETON_INSTANCE.getDcHuman().getDeck(); + Deck aiDeck = VSubmenuConstructed.SINGLETON_INSTANCE.getDcAi().getDeck(); MatchStartHelper starter = new MatchStartHelper(); Lobby lobby = Singletons.getControl().getLobby(); @@ -321,35 +127,6 @@ public enum CSubmenuConstructed implements ICDoc { worker.execute(); } - /** Generates deck from current list selection(s). */ - private Deck generateDeck(final JList lst0, final PlayerType player0) { - final String[] selection = Arrays.copyOf(lst0.getSelectedValues(), - lst0.getSelectedValues().length, String[].class); - - final Deck deck; - - if (selection.length == 0) { return null; } - - if (lst0.getName().equals(ESubmenuConstructedTypes.COLORS.toString()) && DeckgenUtil.colorCheck(selection)) { - deck = DeckgenUtil.buildColorDeck(selection, player0); - } - else if (lst0.getName().equals(ESubmenuConstructedTypes.THEMES.toString())) { - deck = DeckgenUtil.buildThemeDeck(selection); - } - else if (lst0.getName().equals(ESubmenuConstructedTypes.QUESTEVENTS.toString())) { - deck = DeckgenUtil.buildQuestDeck(selection); - } - // Custom deck - else if (lst0.getName().equals(ESubmenuConstructedTypes.CUSTOM.toString())) { - deck = DeckgenUtil.buildCustomDeck(selection); - } - // Failure, for some reason - else { - deck = null; - } - - return deck; - } /* (non-Javadoc) * @see forge.gui.framework.ICDoc#getCommandOnSelect() diff --git a/src/main/java/forge/gui/home/sanctioned/VSubmenuConstructed.java b/src/main/java/forge/gui/home/sanctioned/VSubmenuConstructed.java index d28a9003e70..26b3d25f2f9 100644 --- a/src/main/java/forge/gui/home/sanctioned/VSubmenuConstructed.java +++ b/src/main/java/forge/gui/home/sanctioned/VSubmenuConstructed.java @@ -1,17 +1,10 @@ package forge.gui.home.sanctioned; -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.game.player.PlayerType; import forge.gui.framework.DragCell; import forge.gui.framework.DragTab; import forge.gui.framework.EDocID; @@ -20,12 +13,8 @@ import forge.gui.home.IVSubmenu; import forge.gui.home.LblHeader; import forge.gui.home.StartButton; import forge.gui.home.VHomeUI; -import forge.gui.toolbox.ExperimentalLabel; import forge.gui.toolbox.FCheckBox; -import forge.gui.toolbox.FLabel; -import forge.gui.toolbox.FList; -import forge.gui.toolbox.FRadioButton; -import forge.gui.toolbox.FScrollPane; +import forge.gui.toolbox.FDeckChooser; import forge.gui.toolbox.FSkin; /** @@ -45,86 +34,21 @@ public enum VSubmenuConstructed implements IVSubmenu { /** */ private final LblHeader lblTitle = new LblHeader("Sanctioned Format: Constructed"); - private final FLabel lblDecklist1 = new FLabel.Builder() - .text("Double click a non-random deck for its decklist.") - .fontSize(12).build(); - - private final FLabel lblDecklist2 = new FLabel.Builder() - .text("Double click a non-random deck for its decklist.") - .fontSize(12).build(); - - private final JPanel pnlRadiosHuman = new JPanel(new MigLayout("insets 0, gap 0, wrap")); - private final JPanel pnlRadiosAI = new JPanel(new MigLayout("insets 0, gap 0, wrap")); private final JPanel pnlStart = new JPanel(new MigLayout("insets 0, gap 0, wrap 2")); private final StartButton btnStart = new StartButton(); - private final JList lstDecksUser = new FList(); - private final JList lstDecksAI = 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 opponent 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 opponent 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 scrDecksUser = new FScrollPane(lstDecksUser, - JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); - - private final JScrollPane scrDecksAI = new FScrollPane(lstDecksAI, - JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); - - private final ExperimentalLabel btnHumanRandom = new ExperimentalLabel("Random"); - private final ExperimentalLabel btnAIRandom = new ExperimentalLabel("Random"); + private final FDeckChooser dcHuman = new FDeckChooser("Select your deck:", PlayerType.HUMAN); + private final FDeckChooser dcAi = new FDeckChooser("Select AI deck:", PlayerType.COMPUTER); private VSubmenuConstructed() { - // Radio button group: Human - final ButtonGroup grpRadiosHuman = new ButtonGroup(); - grpRadiosHuman.add(radCustomHuman); - grpRadiosHuman.add(radQuestsHuman); - grpRadiosHuman.add(radColorsHuman); - grpRadiosHuman.add(radThemesHuman); - - // Radio button group: AI - final ButtonGroup grpRadiosAI = new ButtonGroup(); - grpRadiosAI.add(radCustomAI); - grpRadiosAI.add(radQuestsAI); - grpRadiosAI.add(radColorsAI); - grpRadiosAI.add(radThemesAI); lblTitle.setBackground(FSkin.getColor(FSkin.Colors.CLR_THEME2)); - // Radio button panels: Human and AI - final String strRadioConstraints = "w 100%!, h 30px!"; - - pnlRadiosHuman.setOpaque(false); - pnlRadiosHuman.add(new FLabel.Builder().text("Select your deck:") - .fontStyle(Font.BOLD).fontSize(16) - .fontAlign(SwingConstants.LEFT).build(), strRadioConstraints); - pnlRadiosHuman.add(lblDecklist1, "h 20px!, gap 0 0 0 10px"); - pnlRadiosHuman.add(radCustomHuman, strRadioConstraints); - pnlRadiosHuman.add(radQuestsHuman, strRadioConstraints); - pnlRadiosHuman.add(radColorsHuman, strRadioConstraints); - pnlRadiosHuman.add(radThemesHuman, strRadioConstraints); - pnlRadiosHuman.add(btnHumanRandom, "w 200px!, h 30px!, gap 0 0 10px 0, ax center"); - - pnlRadiosAI.setOpaque(false); - pnlRadiosAI.add(new FLabel.Builder().text("Select an AI deck:") - .fontStyle(Font.BOLD).fontSize(16) - .fontAlign(SwingConstants.LEFT).build(), strRadioConstraints); - pnlRadiosAI.add(lblDecklist2, "h 20px!, gap 0 0 0 10px"); - pnlRadiosAI.add(radCustomAI, strRadioConstraints); - pnlRadiosAI.add(radQuestsAI, strRadioConstraints); - pnlRadiosAI.add(radColorsAI, strRadioConstraints); - pnlRadiosAI.add(radThemesAI, strRadioConstraints); - pnlRadiosAI.add(btnAIRandom, "w 200px!, h 30px!, gap 0 0 10px 0, ax center"); final String strCheckboxConstraints = "w 200px!, h 30px!, gap 0 20px 0 0"; pnlStart.setOpaque(false); @@ -142,6 +66,15 @@ public enum VSubmenuConstructed implements IVSubmenu { return EMenuGroup.SANCTIONED; } + public final FDeckChooser getDcHuman() { + return dcHuman; + } + + public final FDeckChooser getDcAi() { + return dcAi; + } + + /* (non-Javadoc) * @see forge.gui.home.IVSubmenu#getMenuTitle() */ @@ -165,81 +98,25 @@ public enum VSubmenuConstructed implements IVSubmenu { public void populate() { VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().removeAll(); VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().setLayout(new MigLayout("insets 0, gap 0, wrap 2, ax right")); + VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(lblTitle, "w 80%!, h 40px!, gap 0 0 15px 15px, span 2, ax right"); - VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(pnlRadiosAI, "w 44%!, gap 0 0 20px 20px"); - VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(pnlRadiosHuman, "w 44%!, gap 4% 4% 20px 20px"); - VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(scrDecksAI, "w 44%!, growy, pushy"); - VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(scrDecksUser, "w 44%!, gap 4% 4% 0 0, growy, pushy"); + + dcAi.populate(); + dcHuman.populate(); + VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(dcAi, "w 44%!, gap 0 0 20px 20px, growy, pushy"); + VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(dcHuman, "w 44%!, gap 4% 4% 20px 20px, growy, pushy"); VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(pnlStart, "span 2, gap 0 0 50px 50px, ax center"); VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().revalidate(); VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().repaintSelf(); } - /** @return {@link javax.swing.JList} */ - public JList getLstUserDecks() { - return this.lstDecksUser; - } - - /** @return {@link javax.swing.JList} */ - public JList getLstDecksAI() { - return this.lstDecksAI; - } /** @return {@link javax.swing.JButton} */ public JButton getBtnStart() { return this.btnStart; } - - /** @return {@link forge.gui.toolbox.ExperimentalLabel} */ - public ExperimentalLabel getBtnHumanRandom() { - return this.btnHumanRandom; - } - - /** @return {@link forge.gui.toolbox.ExperimentalLabel} */ - public ExperimentalLabel 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() { diff --git a/src/main/java/forge/gui/toolbox/FDeckChooser.java b/src/main/java/forge/gui/toolbox/FDeckChooser.java new file mode 100644 index 00000000000..b8e8bed1188 --- /dev/null +++ b/src/main/java/forge/gui/toolbox/FDeckChooser.java @@ -0,0 +1,304 @@ +package forge.gui.toolbox; + +import java.awt.Font; +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.List; + +import javax.swing.ButtonGroup; +import javax.swing.JList; +import javax.swing.JPanel; +import javax.swing.JRadioButton; +import javax.swing.JScrollPane; +import javax.swing.ListSelectionModel; +import javax.swing.SwingConstants; + +import org.apache.commons.lang3.ArrayUtils; + +import net.miginfocom.swing.MigLayout; + +import forge.Command; +import forge.Singletons; +import forge.deck.Deck; +import forge.deck.DeckgenUtil; +import forge.deck.generate.GenerateThemeDeck; +import forge.game.player.PlayerType; +import forge.gui.home.VHomeUI; +import forge.quest.QuestController; +import forge.quest.QuestEvent; +import forge.util.IStorage; + +/** + * TODO: Write javadoc for this type. + * + */ +@SuppressWarnings("serial") +public class FDeckChooser extends JPanel { + + private enum ESubmenuConstructedTypes { /** */ + COLORS, /** */ + THEMES, /** */ + CUSTOM, /** */ + QUESTEVENTS + } + + private final QuestController quest = Singletons.getModel().getQuest(); + + private final JRadioButton radColors = new FRadioButton("Fully random color deck"); + private final JRadioButton radThemes = new FRadioButton("Semi-random theme deck"); + private final JRadioButton radCustom = new FRadioButton("Custom user deck"); + private final JRadioButton radQuests = new FRadioButton("Quest opponent deck"); + + private final JList lstDecks = new FList(); + private final ExperimentalLabel btnRandom = new ExperimentalLabel("Random"); + + private final JScrollPane scrDecks = new FScrollPane(lstDecks, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); + + private final FLabel lblDecklist = new FLabel.Builder() + .text("Double click a non-random deck for its decklist.") + .fontSize(12).build(); + + private final JPanel pnlRadios = new JPanel(new MigLayout("insets 0, gap 0, wrap")); + private final PlayerType playerType; + + + private final MouseAdapter madDecklist = new MouseAdapter() { + @Override + public void mouseClicked(final MouseEvent e) { + if (e.getClickCount() == 2) { + final JList src = ((JList) e.getSource()); + if (getRadColors().isSelected()) { return; } + if (getRadThemes().isSelected()) { return; } + DeckgenUtil.showDecklist(src); + } + } + }; + + public FDeckChooser(String titleText, PlayerType pt) + { + playerType = pt; + + // Radio button panels: Human and AI + final String strRadioConstraints = "w 100%!, h 30px!"; + + this.setOpaque(false); + + // Radio button group: Human + final ButtonGroup grpRadios = new ButtonGroup(); + grpRadios.add(radCustom); + grpRadios.add(radQuests); + grpRadios.add(radColors); + grpRadios.add(radThemes); + + pnlRadios.setOpaque(false); + pnlRadios.add(new FLabel.Builder().text(titleText) + .fontStyle(Font.BOLD).fontSize(16) + .fontAlign(SwingConstants.LEFT).build(), strRadioConstraints); + pnlRadios.add(lblDecklist, "h 20px!, gap 0 0 0 10px"); + pnlRadios.add(radCustom, strRadioConstraints); + pnlRadios.add(radQuests, strRadioConstraints); + pnlRadios.add(radColors, strRadioConstraints); + pnlRadios.add(radThemes, strRadioConstraints); + pnlRadios.add(btnRandom, "w 200px!, h 30px!, gap 0 0 10px 0, ax center"); + + } + + public void initialize() { + // Radio button event handling + getRadColors().addActionListener(new ActionListener() { @Override + public void actionPerformed(final ActionEvent arg0) { + updateColors(); } }); + + getRadThemes().addActionListener(new ActionListener() { @Override + public void actionPerformed(final ActionEvent arg0) { + updateThemes(); } }); + + getRadCustom().addActionListener(new ActionListener() { @Override + public void actionPerformed(final ActionEvent arg0) { + updateCustom(); } }); + + getRadQuests().addActionListener(new ActionListener() { @Override + public void actionPerformed(final ActionEvent arg0) { + updateQuestEvents(); } }); + + // First run: colors + getRadColors().setSelected(true); + updateColors(); + } + + + /** @return {@link javax.swing.JList} */ + public JList getLstDecks() { + return this.lstDecks; + } + /** @return {@link forge.gui.toolbox.ExperimentalLabel} */ + public ExperimentalLabel getBtnRandom() { + return this.btnRandom; + } + + /** @return {@link javax.swing.JRadioButton} */ + public JRadioButton getRadColors() { + return this.radColors; + } + + /** @return {@link javax.swing.JRadioButton} */ + public JRadioButton getRadThemes() { + return this.radThemes; + } + + /** @return {@link javax.swing.JRadioButton} */ + public JRadioButton getRadCustom() { + return this.radCustom; + } + + /** @return {@link javax.swing.JRadioButton} */ + public JRadioButton getRadQuests() { + return this.radQuests; + } + + /** Handles all control for "colors" radio button click. */ + private void updateColors() { + final JList lst = getLstDecks(); + 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 ExperimentalLabel btn = getBtnRandom(); + + btn.setCommand(new Command() { @Override public void execute() { lst.setSelectedIndices( DeckgenUtil.randomSelectColors()); } }); + + // Init basic two color deck + lst.setSelectedIndices(new int[]{0, 1}); + } + + /** Handles all control for "themes" radio button click. */ + private void updateThemes() { + final JList lst = getLstDecks(); + 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 ExperimentalLabel btn = getBtnRandom(); + btn.setCommand(new Command() { @Override public void execute() { DeckgenUtil.randomSelect(lst); } }); + + // Init first in list + lst.setSelectedIndex(0); + } + + /** Handles all control for "custom" radio button click. */ + private void updateCustom() { + final JList lst = getLstDecks(); + 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 ExperimentalLabel btn = getBtnRandom(); + + btn.setCommand(new Command() { @Override public void execute() { DeckgenUtil.randomSelect(lst); } }); + + // Init first in list + lst.setSelectedIndex(0); + } + + /** Handles all control for "quest event" radio button click. */ + private void updateQuestEvents() { + final JList lst = getLstDecks(); + lst.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + + final List eventNames = new ArrayList(); + + for (final QuestEvent e : quest.getDuelsManager().getAllDuels()) { + eventNames.add(e.getEventDeck().getName()); + } + + for (final QuestEvent e : quest.getChallengesManager().getAllChallenges()) { + 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 ExperimentalLabel btn = getBtnRandom(); + btn.setCommand(new Command() { @Override public void execute() { DeckgenUtil.randomSelect(lst); } }); + + // Init first in list + lst.setSelectedIndex(0); + } + + /** Generates deck from current list selection(s). */ + public Deck getDeck() { + JList lst0 = getLstDecks(); + final String[] selection = Arrays.copyOf(lst0.getSelectedValues(), lst0.getSelectedValues().length, String[].class); + + final Deck deck; + + if (selection.length == 0) { return null; } + + if (lst0.getName().equals(ESubmenuConstructedTypes.COLORS.toString()) && DeckgenUtil.colorCheck(selection)) { + deck = DeckgenUtil.buildColorDeck(selection, getPlayerType()); + } + else if (lst0.getName().equals(ESubmenuConstructedTypes.THEMES.toString())) { + deck = DeckgenUtil.buildThemeDeck(selection); + } + else if (lst0.getName().equals(ESubmenuConstructedTypes.QUESTEVENTS.toString())) { + deck = DeckgenUtil.buildQuestDeck(selection); + } + // Custom deck + else if (lst0.getName().equals(ESubmenuConstructedTypes.CUSTOM.toString())) { + deck = DeckgenUtil.buildCustomDeck(selection); + } + // Failure, for some reason + else { + deck = null; + } + + return deck; + } + + /** + * TODO: Write javadoc for this method. + * @return + */ + private PlayerType getPlayerType() { + return playerType; + } + + /** + * TODO: Write javadoc for this method. + */ + public void populate() { + + this.setLayout(new MigLayout("insets 0, gap 0, flowy, ax right")); + + this.add(pnlRadios, "w 100%!, gap 0 0 20px 20px"); + this.add(scrDecks, "w 100%!, growy, pushy"); + + } + +}