Full home UI rebuild: singleton design pattern, better menu structure, improved resizing dynamics, constructed mode rebuild.

This commit is contained in:
Doublestrike
2012-03-03 12:18:31 +00:00
parent 6a04774fab
commit 336adca866
77 changed files with 2352 additions and 6205 deletions

38
.gitattributes vendored
View File

@@ -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/ControlMatchUI.java -text
src/main/java/forge/control/FControl.java -text src/main/java/forge/control/FControl.java -text
src/main/java/forge/control/KeyboardShortcuts.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/ControlStall.java -text
src/main/java/forge/control/bazaar/package-info.java -text svneol=native#text/plain 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/Input.java svneol=native#text/plain
src/main/java/forge/control/input/InputAttack.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 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/CardPicturePanel.java svneol=native#text/plain
src/main/java/forge/gui/game/package-info.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/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/ICSubmenu.java -text
src/main/java/forge/gui/home/IVSubmenu.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/StartButton.java -text
src/main/java/forge/gui/home/constructed/CSubmenuCustom.java -text src/main/java/forge/gui/home/limited/CSubmenuConstructed.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/limited/CSubmenuDraft.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/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/VSubmenuDraft.java -text
src/main/java/forge/gui/home/limited/VSubmenuSealed.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 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/CSubmenuQuestData.java -text
src/main/java/forge/gui/home/quest/CSubmenuQuestDecks.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/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/SubmenuQuestUtil.java -text
src/main/java/forge/gui/home/quest/VSubmenuChallenges.java -text src/main/java/forge/gui/home/quest/VSubmenuChallenges.java -text
src/main/java/forge/gui/home/quest/VSubmenuDuels.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/ViewItem.java -text
src/main/java/forge/view/bazaar/ViewStall.java svneol=native#text/plain 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/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/QuestWinLoseCardViewer.java -text
src/main/java/forge/view/match/QuestWinLoseHandler.java -text src/main/java/forge/view/match/QuestWinLoseHandler.java -text
src/main/java/forge/view/match/ViewBattlefield.java -text src/main/java/forge/view/match/ViewBattlefield.java -text

1
.gitignore vendored
View File

@@ -266,6 +266,7 @@ res/decks/Zac[!!-~]Hill's[!!-~]Kuldotha[!!-~]Red.dck
res/decks/Zack[!!-~]Shaffner's[!!-~]Creatureless[!!-~]Control.dck res/decks/Zack[!!-~]Shaffner's[!!-~]Creatureless[!!-~]Control.dck
res/decks/Zemox's[!!-~]Mono-Green[!!-~]Infect.dck res/decks/Zemox's[!!-~]Mono-Green[!!-~]Infect.dck
res/decks/Zvi[!!-~]Mowshowitz's[!!-~]Mono-Black[!!-~]Control.dck res/decks/Zvi[!!-~]Mowshowitz's[!!-~]Mono-Black[!!-~]Control.dck
res/decks/constructed/*.dck
res/decks/o1.bdk res/decks/o1.bdk
res/images/themes res/images/themes
res/oracleScript.log res/oracleScript.log

View File

@@ -1,10 +1,5 @@
package forge.control; 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; import forge.view.ViewHomeUI;
/** /**
@@ -28,29 +23,4 @@ public class ControlHomeUI {
public ViewHomeUI getView() { public ViewHomeUI getView() {
return view; 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();
}
} }

View File

@@ -31,6 +31,8 @@ import javax.swing.WindowConstants;
import forge.AllZone; import forge.AllZone;
import forge.Singletons; import forge.Singletons;
import forge.control.KeyboardShortcuts.Shortcut; import forge.control.KeyboardShortcuts.Shortcut;
import forge.gui.home.quest.SubmenuQuestUtil;
import forge.view.ViewHomeUI;
import forge.view.toolbox.CardFaceSymbols; import forge.view.toolbox.CardFaceSymbols;
import forge.view.toolbox.FSkin; import forge.view.toolbox.FSkin;
@@ -85,8 +87,7 @@ public enum FControl {
public void windowClosing(final WindowEvent e) { public void windowClosing(final WindowEvent e) {
Singletons.getView().getFrame().setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); Singletons.getView().getFrame().setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
changeState(0); changeState(0);
Singletons.getControl().getControlHome().getControlQuest().refreshStats(); SubmenuQuestUtil.updateStatsAndPet();
Singletons.getView().getViewHome().showQuestMenu();
} }
}; };
@@ -146,7 +147,7 @@ public enum FControl {
// Fire up new state // Fire up new state
switch (i0) { switch (i0) {
case HOME_SCREEN: case HOME_SCREEN:
display.add(Singletons.getView().getViewHome(), JLayeredPane.DEFAULT_LAYER); display.add(ViewHomeUI.SINGLETON_INSTANCE.getPanel(), JLayeredPane.DEFAULT_LAYER);
sizeChildren(); sizeChildren();
break; break;
@@ -189,7 +190,7 @@ public enum FControl {
+ "may only be called while the home UI is showing."); + "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();
} }
/** /**

View File

@@ -16,8 +16,8 @@ import javax.swing.KeyStroke;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import forge.Singletons; import forge.Singletons;
import forge.gui.home.settings.VSubmenuPreferences.KeyboardShortcutField;
import forge.properties.ForgePreferences.FPref; import forge.properties.ForgePreferences.FPref;
import forge.view.home.ViewSettings.KeyboardShortcutField;
/** /**
* Consolidates keyboard shortcut assembly into one location * Consolidates keyboard shortcut assembly into one location

View File

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

View File

@@ -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 &emsp; 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 &emsp; 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<String, String> colorVals = new HashMap<String, String>();
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<String> themeNames = new ArrayList<String>();
themeNames.clear();
for (final String s : GenerateThemeDeck.getThemeNames()) {
themeNames.add(s);
}
return themeNames.toArray(ArrayUtils.EMPTY_STRING_ARRAY);
}
private String[] getCustomNames() {
final List<String> customNames = new ArrayList<String>();
customNames.clear();
final IStorage<Deck> 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<String> eventNames = new ArrayList<String>();
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 &emsp; 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;
}
}

View File

@@ -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 &emsp; 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<String> draftTypes = new ArrayList<String>();
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<Deck> human = new ArrayList<Deck>();
for (DeckGroup d : Singletons.getModel().getDecks().getDraft()) {
human.add(d.getHumanDeck());
}
view.getLstHumanDecks().setDecks(human);
}
}

View File

@@ -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<String, QuestData> arrQuests;
/**
* Controls logic and listeners for quest mode in home screen.
*
* @param v0 &emsp; 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 &emsp; 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<String, QuestData> getAllQuests() {
return arrQuests;
}
/**
* Updates visual state of tabber.
* @param tab0 &emsp; 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<String, QuestData>();
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<Deck>());
// 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<String> 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();
}
});
}
/**
* <p>
* setupDuel.
* </p>
*
* @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);
}
/**
* <p>
* setupChallenge.
* </p>
*
* @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());
}
/**
* <p>
* nextChallengeInWins.
* </p>
*
* @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;
}
}

View File

@@ -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<String, Deck> aiDecks;
private final MouseListener madBuildDeck, madStartGame;
/**
* Controls behavior of swing components in "sealed" mode menu.
*
* @param v0 &emsp; 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<Deck> humanDecks = new ArrayList<Deck>();
aiDecks = new HashMap<String, Deck>();
// 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<String> sealedTypes = new ArrayList<String>();
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<CardPrinted> 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;
}
}

View File

@@ -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 &emsp; 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 &emsp; 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<Object, Object> w = new SwingWorker<Object, Object>() {
@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 &emsp; 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();
}*/
}

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
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
* &emsp; 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 <T> the generic type
* @param gt0 &emsp; GameType
* @param d0 &emsp; Deck
*/
@SuppressWarnings("unchecked")
public <T extends DeckBase> void showDeckEditor(final GameType gt0, final T d0) {
DeckEditorBase<?, T> editor = null;
if (gt0 == GameType.Constructed) {
editor = (DeckEditorBase<?, T>) new DeckEditorConstructed();
} else if (gt0 == GameType.Draft) {
editor = (DeckEditorBase<?, T>) new DeckEditorLimited(Singletons.getModel().getDecks().getDraft());
} else if (gt0 == GameType.Sealed) {
editor = (DeckEditorBase<?, T>) 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);
}
}

View File

@@ -1,3 +0,0 @@
/** Controller (as in model-view-controller) for Forge. */
package forge.control.home;

View File

@@ -423,7 +423,7 @@ public class SealedDeck {
if (deck.get(i).getName().equals("Plains") || deck.get(i).getName().equals("Island") 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("Swamp") || deck.get(i).getName().equals("Mountain")
|| deck.get(i).getName().equals("Forest")) { || deck.get(i).getName().equals("Forest")) {
System.out.println("Heyo!"); //System.out.println("Heyo!");
} }
aiDeck.getMain().add(deck.get(i)); aiDeck.getMain().add(deck.get(i));
} }

View File

@@ -36,9 +36,11 @@ import java.util.List;
import javax.swing.Box; import javax.swing.Box;
import javax.swing.ImageIcon; import javax.swing.ImageIcon;
import javax.swing.JButton; import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JList; import javax.swing.JList;
import javax.swing.JPanel; import javax.swing.JPanel;
import javax.swing.SwingUtilities; import javax.swing.SwingUtilities;
import javax.swing.Timer;
import javax.swing.border.LineBorder; import javax.swing.border.LineBorder;
import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener; import javax.swing.event.ListSelectionListener;
@@ -62,6 +64,7 @@ import forge.view.toolbox.FSkin;
* @version $Id$ * @version $Id$
*/ */
public final class GuiUtils { public final class GuiUtils {
private static int counter = 0;
private GuiUtils() { private GuiUtils() {
throw new AssertionError(); throw new AssertionError();
@@ -427,6 +430,43 @@ public final class GuiUtils {
return overlay; return overlay;
} }
/** @param msg0 &emsp; {@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} */ /** @return {@forge.view.toolbox.FOverlay} */
public static FOverlay genericOverlay() { public static FOverlay genericOverlay() {
final FOverlay overlay = Singletons.getView().getOverlay(); final FOverlay overlay = Singletons.getView().getOverlay();

View File

@@ -91,7 +91,9 @@ public final class DeckEditorConstructed extends DeckEditorBase<CardPrinted, Dec
@Override @Override
public void execute() { public void execute() {
DeckEditorConstructed.this.dispose(); DeckEditorConstructed.this.dispose();
exitCommand.execute(); if (exitCommand != null) {
exitCommand.execute();
}
} }
}; };

View File

@@ -36,7 +36,6 @@ import javax.swing.JOptionPane;
import javax.swing.JTable; import javax.swing.JTable;
import javax.swing.WindowConstants; import javax.swing.WindowConstants;
import forge.Command; import forge.Command;
import forge.Constant; import forge.Constant;
import forge.Singletons; import forge.Singletons;
@@ -49,6 +48,7 @@ import forge.gui.deckeditor.elements.CardPanelLite;
import forge.gui.deckeditor.elements.ManaCostRenderer; import forge.gui.deckeditor.elements.ManaCostRenderer;
import forge.gui.deckeditor.elements.TableColumnInfo; import forge.gui.deckeditor.elements.TableColumnInfo;
import forge.gui.deckeditor.elements.TableView; import forge.gui.deckeditor.elements.TableView;
import forge.gui.home.limited.CSubmenuDraft;
import forge.item.CardDb; import forge.item.CardDb;
import forge.item.CardPrinted; import forge.item.CardPrinted;
import forge.item.InventoryItem; import forge.item.InventoryItem;
@@ -128,7 +128,8 @@ public class DraftingProcess extends DeckEditorBase<CardPrinted, DeckGroup> {
ForgeProps.getLocalized(GuiBoosterDraft.CLOSE_MESSAGE), "", JOptionPane.YES_NO_OPTION); ForgeProps.getLocalized(GuiBoosterDraft.CLOSE_MESSAGE), "", JOptionPane.YES_NO_OPTION);
if (n == JOptionPane.YES_OPTION) { if (n == JOptionPane.YES_OPTION) {
DraftingProcess.this.dispose(); DraftingProcess.this.dispose();
Singletons.getControl().getControlHome().getControlDraft().updateHumanDecks(); CSubmenuDraft.SINGLETON_INSTANCE.update();
GuiUtils.closeOverlay();
} }
} // windowClosing() } // windowClosing()
}); });
@@ -336,10 +337,9 @@ public class DraftingProcess extends DeckEditorBase<CardPrinted, DeckGroup> {
// here // here
// close and open next screen // close and open next screen
this.dispose(); DraftingProcess.this.dispose();
CSubmenuDraft.SINGLETON_INSTANCE.update();
Singletons.getControl().getControlHome().getControlDraft().updateHumanDecks(); GuiUtils.closeOverlay();
} /* saveDraft() */ } /* saveDraft() */
/* /*
@@ -386,5 +386,6 @@ public class DraftingProcess extends DeckEditorBase<CardPrinted, DeckGroup> {
this.getBottomTableWithCards().sort(1, true); this.getBottomTableWithCards().sort(1, true);
this.setVisible(true); this.setVisible(true);
this.setAlwaysOnTop(true);
} }
} }

View File

@@ -6,9 +6,16 @@ package forge.gui.home;
* and collapsing in the menu. * and collapsing in the menu.
*/ */
public enum EMenuGroup { /** */ public enum EMenuGroup { /** */
CONSTRUCTED, /** */ SANCTIONED ("Sanctioned Game Formats"), /** */
LIMITED, /** */ QUEST ("Quest Mode"), /** */
QUEST, /** */ SETTINGS ("Game Settings"), /** */
SETTINGS, /** */ UTILITIES ("Tools");
UTILITIES;
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; }
} }

View File

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

View File

@@ -2,9 +2,15 @@ package forge.gui.home;
import forge.Command; import forge.Command;
/** Dictates methods required for a submenu controller. */ /** Dictates methods required for a submenu controller. */
public interface ICSubmenu { 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(); Command getMenuCommand();
/** Call this method after the view singleton has been fully realized /** Call this method after the view singleton has been fully realized

View File

@@ -8,11 +8,24 @@ public interface IVSubmenu {
* @return {@link javax.swing.JPanel} */ * @return {@link javax.swing.JPanel} */
JPanel getPanel(); 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 /** Returns parent menu grouping of this submenu, useful for
* functions such as expanding and collapsing in the menu area. * functions such as expanding and collapsing in the menu area.
* *
* @return {@link javax.swing.JPanel} */ * @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.*/ /** Removes all children and (re)populates panel components, independent of constructor.*/
void populate(); void populate();

View File

@@ -1,4 +1,4 @@
package forge.view.home; package forge.gui.home;
import javax.swing.JButton; import javax.swing.JButton;

View File

@@ -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<String, String> colorVals = new HashMap<String, String>();
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"});
}
}
}

View File

@@ -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<String> customNames = new ArrayList<String>();
final IStorage<Deck> 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()));
}
}
}

View File

@@ -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<String> eventNames = new ArrayList<String>();
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()));
}
}
}

View File

@@ -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<String> themeNames = new ArrayList<String>();
for (final String s : GenerateThemeDeck.getThemeNames()) { themeNames.add(s); }
for (JList lst : VSubmenuThemes.SINGLETON_INSTANCE.getLists()) {
lst.setListData(SubmenuConstructedUtil.oa2sa(themeNames.toArray()));
}
}
}

View File

@@ -1,12 +0,0 @@
package forge.gui.home.constructed;
/**
* TODO: Write javadoc for this type.
*
*/
public enum ESubmenuConstructedTypes { /** */
COLORS, /** */
THEMES, /** */
CUSTOM, /** */
QUESTEVENTS
}

View File

@@ -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 &emsp; JPanel, where to put the finished lists
* @param btnStart &emsp; Start button for the panel
* @return List<JList> completed collection of JLists
*/
public static List<JList> populateConstructedSubmenuView(final JPanel pnlParent, final JButton btnStart) {
final List<JList> generatedJLists = new ArrayList<JList>();
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<Player> players = AllZone.getPlayersInGame();
pnlParent.removeAll();
pnlParent.setOpaque(false);
pnlParent.setLayout(new MigLayout("insets 0, gap 0"));
final List<CustomSelectPanel> storage = new ArrayList<CustomSelectPanel>();
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 &emsp; {@link forge.deck.Deck} */
public static void showDecklist(final Deck d0) {
final HashMap<String, Integer> deckMap = new HashMap<String, Integer>();
for (final Entry<CardPrinted, Integer> 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<String> dmKeys = new ArrayList<String>();
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 &emsp; 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 &emsp; {@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<String, String> colorVals = new HashMap<String, String>();
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 &emsp; 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 &emsp; {@link java.util.List}<{@link javax.swing.JList}> */
public static void startGame(final List<JList> 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;
}
}
}

View File

@@ -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<JList> allLists = new ArrayList<JList>();
/* (non-Javadoc)
* @see forge.view.home.IViewSubmenu#populate()
*/
@Override
public void populate() {
pnl.setName(ESubmenuConstructedTypes.COLORS.toString());
final List<JList> 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<JList> getLists() {
return allLists;
}
}

View File

@@ -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<JList> allLists = new ArrayList<JList>();
/* (non-Javadoc)
* @see forge.view.home.IViewSubmenu#populate()
*/
@Override
public void populate() {
pnl.setName(ESubmenuConstructedTypes.CUSTOM.toString());
final List<JList> 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<JList> getLists() {
return allLists;
}
}

View File

@@ -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<JList> allLists = new ArrayList<JList>();
/* (non-Javadoc)
* @see forge.view.home.IViewSubmenu#populate()
*/
@Override
public void populate() {
pnl.setName(ESubmenuConstructedTypes.QUESTEVENTS.toString());
final List<JList> 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<JList> getLists() {
return allLists;
}
}

View File

@@ -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<JList> allLists = new ArrayList<JList>();
/* (non-Javadoc)
* @see forge.view.home.IViewSubmenu#populate()
*/
@Override
public void populate() {
pnl.setName(ESubmenuConstructedTypes.THEMES.toString());
final List<JList> 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<JList> getLists() {
return allLists;
}
}

View File

@@ -1,3 +0,0 @@
/** Forge Card Game. */
package forge.gui.home.constructed;

View File

@@ -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<String, String> COLOR_VALS = new HashMap<String, String>();
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<String> themeNames = new ArrayList<String>();
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<String> customNames = new ArrayList<String>();
final IStorage<Deck> 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<String> eventNames = new ArrayList<String>();
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 &emsp; 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 &emsp; {@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 &emsp; {@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<String, Integer> deckMap = new HashMap<String, Integer>();
for (final Entry<CardPrinted, Integer> 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<String> dmKeys = new ArrayList<String>();
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 &emsp; {@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 &emsp; {@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());
}
}
}

View File

@@ -21,12 +21,14 @@ import forge.game.limited.CardPoolLimitation;
import forge.gui.GuiUtils; import forge.gui.GuiUtils;
import forge.gui.deckeditor.DraftingProcess; import forge.gui.deckeditor.DraftingProcess;
import forge.gui.home.ICSubmenu; import forge.gui.home.ICSubmenu;
import forge.view.toolbox.FOverlay;
import forge.view.toolbox.FSkin; import forge.view.toolbox.FSkin;
/** /**
* TODO: Write javadoc for this type. * TODO: Write javadoc for this type.
* *
*/ */
@SuppressWarnings("serial")
public enum CSubmenuDraft implements ICSubmenu { public enum CSubmenuDraft implements ICSubmenu {
/** */ /** */
SINGLETON_INSTANCE; SINGLETON_INSTANCE;
@@ -72,6 +74,21 @@ public enum CSubmenuDraft implements ICSubmenu {
"Walter", "Wilfred", "William", "Winston" "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) /* (non-Javadoc)
* @see forge.control.home.IControlSubmenu#update() * @see forge.control.home.IControlSubmenu#update()
*/ */
@@ -82,11 +99,14 @@ public enum CSubmenuDraft implements ICSubmenu {
view.populate(); view.populate();
CSubmenuDraft.SINGLETON_INSTANCE.update(); CSubmenuDraft.SINGLETON_INSTANCE.update();
VSubmenuDraft.SINGLETON_INSTANCE.getBtnBuildDeck().addMouseListener( view.getLstHumanDecks().setExitCommand(cmdDeckExit);
view.getLstHumanDecks().setSelectCommand(cmdDeckSelect);
view.getBtnBuildDeck().addMouseListener(
new MouseAdapter() { @Override new MouseAdapter() { @Override
public void mousePressed(MouseEvent e) { setupDraft(); } }); public void mousePressed(MouseEvent e) { setupDraft(); } });
VSubmenuDraft.SINGLETON_INSTANCE.getBtnStart().addMouseListener( view.getBtnStart().addMouseListener(
new MouseAdapter() { new MouseAdapter() {
@Override @Override
public void mouseReleased(final MouseEvent e) { 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 @Override
public void mouseClicked(MouseEvent e) { public void mouseClicked(MouseEvent e) {
view.showDirections(); view.showDirections();
@@ -136,6 +156,7 @@ public enum CSubmenuDraft implements ICSubmenu {
for (DeckGroup d : Singletons.getModel().getDecks().getDraft()) { for (DeckGroup d : Singletons.getModel().getDecks().getDraft()) {
human.add(d.getHumanDeck()); human.add(d.getHumanDeck());
} }
VSubmenuDraft.SINGLETON_INSTANCE.getLstHumanDecks().setDecks(human); VSubmenuDraft.SINGLETON_INSTANCE.getLstHumanDecks().setDecks(human);
if (human.size() > 1) { if (human.size() > 1) {
@@ -178,6 +199,9 @@ public enum CSubmenuDraft implements ICSubmenu {
/** */ /** */
private void setupDraft() { private void setupDraft() {
final FOverlay overlay = Singletons.getView().getOverlay();
overlay.showOverlay();
final DraftingProcess draft = new DraftingProcess(); final DraftingProcess draft = new DraftingProcess();
// Determine what kind of booster draft to run // 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))) { else if (o.toString().equals(draftTypes.get(2))) {
draft.showGui(new BoosterDraft(CardPoolLimitation.Custom)); draft.showGui(new BoosterDraft(CardPoolLimitation.Custom));
} }
} }
private String[] generateNames() { private String[] generateNames() {

View File

@@ -24,6 +24,7 @@ import forge.game.GameType;
import forge.game.limited.SealedDeck; import forge.game.limited.SealedDeck;
import forge.gui.GuiUtils; import forge.gui.GuiUtils;
import forge.gui.home.ICSubmenu; import forge.gui.home.ICSubmenu;
import forge.gui.home.utilities.CSubmenuDeckEditor;
import forge.item.CardPrinted; import forge.item.CardPrinted;
import forge.item.ItemPool; import forge.item.ItemPool;
import forge.properties.ForgeProps; import forge.properties.ForgeProps;
@@ -34,12 +35,28 @@ import forge.view.toolbox.FSkin;
* TODO: Write javadoc for this type. * TODO: Write javadoc for this type.
* *
*/ */
@SuppressWarnings("serial")
public enum CSubmenuSealed implements ICSubmenu { public enum CSubmenuSealed implements ICSubmenu {
/** */ /** */
SINGLETON_INSTANCE; SINGLETON_INSTANCE;
private Map<String, Deck> aiDecks; private Map<String, Deck> 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) /* (non-Javadoc)
* @see forge.control.home.IControlSubmenu#update() * @see forge.control.home.IControlSubmenu#update()
*/ */
@@ -50,6 +67,9 @@ public enum CSubmenuSealed implements ICSubmenu {
view.populate(); view.populate();
CSubmenuSealed.SINGLETON_INSTANCE.update(); CSubmenuSealed.SINGLETON_INSTANCE.update();
VSubmenuSealed.SINGLETON_INSTANCE.getLstDecks().setExitCommand(cmdDeckExit);
VSubmenuSealed.SINGLETON_INSTANCE.getLstDecks().setSelectCommand(cmdDeckSelect);
VSubmenuSealed.SINGLETON_INSTANCE.getBtnBuildDeck().addMouseListener( VSubmenuSealed.SINGLETON_INSTANCE.getBtnBuildDeck().addMouseListener(
new MouseAdapter() { @Override new MouseAdapter() { @Override
public void mousePressed(MouseEvent e) { setupSealed(); } }); public void mousePressed(MouseEvent e) { setupSealed(); } });
@@ -184,6 +204,6 @@ public enum CSubmenuSealed implements ICSubmenu {
sealed.addAiDeck(sd.buildAIDeck(sDeck.toForgeCardList())); sealed.addAiDeck(sd.buildAIDeck(sDeck.toForgeCardList()));
Singletons.getModel().getDecks().getSealed().add(sealed); Singletons.getModel().getDecks().getSealed().add(sealed);
Singletons.getControl().getControlHome().getControlUtilities().showDeckEditor(GameType.Sealed, sealed); CSubmenuDeckEditor.SINGLETON_INSTANCE.showDeckEditor(GameType.Sealed, sealed);
} }
} }

View File

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

View File

@@ -16,12 +16,13 @@ import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument; import javax.swing.text.StyledDocument;
import net.miginfocom.swing.MigLayout; import net.miginfocom.swing.MigLayout;
import forge.Command;
import forge.game.GameType; import forge.game.GameType;
import forge.gui.GuiUtils; import forge.gui.GuiUtils;
import forge.gui.home.EMenuGroup; import forge.gui.home.EMenuGroup;
import forge.gui.home.EMenuItem;
import forge.gui.home.ICSubmenu;
import forge.gui.home.IVSubmenu; import forge.gui.home.IVSubmenu;
import forge.view.home.StartButton; import forge.gui.home.StartButton;
import forge.view.toolbox.DeckLister; import forge.view.toolbox.DeckLister;
import forge.view.toolbox.FButton; import forge.view.toolbox.FButton;
import forge.view.toolbox.FLabel; import forge.view.toolbox.FLabel;
@@ -38,14 +39,10 @@ public enum VSubmenuDraft implements IVSubmenu {
/** */ /** */
SINGLETON_INSTANCE; 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 JPanel pnl = new JPanel();
private final StartButton btnStart = new StartButton(); 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 JList lstAI = new FList();
private final JLabel btnBuildDeck = new FLabel.Builder() private final JLabel btnBuildDeck = new FLabel.Builder()
.fontScaleAuto(false).fontSize(16) .fontScaleAuto(false).fontSize(16)
@@ -94,8 +91,8 @@ public enum VSubmenuDraft implements IVSubmenu {
* @see forge.view.home.IViewSubmenu#getGroup() * @see forge.view.home.IViewSubmenu#getGroup()
*/ */
@Override @Override
public EMenuGroup getGroup() { public EMenuGroup getGroupEnum() {
return EMenuGroup.LIMITED; return EMenuGroup.SANCTIONED;
} }
/* (non-Javadoc) /* (non-Javadoc)
@@ -106,6 +103,30 @@ public enum VSubmenuDraft implements IVSubmenu {
return pnl; 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} */ /** @return {@link javax.swing.JLabel} */
public JLabel getBtnDirections() { public JLabel getBtnDirections() {
return this.btnDirections; return this.btnDirections;

View File

@@ -14,12 +14,13 @@ import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument; import javax.swing.text.StyledDocument;
import net.miginfocom.swing.MigLayout; import net.miginfocom.swing.MigLayout;
import forge.Command;
import forge.game.GameType; import forge.game.GameType;
import forge.gui.GuiUtils; import forge.gui.GuiUtils;
import forge.gui.home.EMenuGroup; import forge.gui.home.EMenuGroup;
import forge.gui.home.EMenuItem;
import forge.gui.home.ICSubmenu;
import forge.gui.home.IVSubmenu; import forge.gui.home.IVSubmenu;
import forge.view.home.StartButton; import forge.gui.home.StartButton;
import forge.view.toolbox.DeckLister; import forge.view.toolbox.DeckLister;
import forge.view.toolbox.FButton; import forge.view.toolbox.FButton;
import forge.view.toolbox.FLabel; import forge.view.toolbox.FLabel;
@@ -35,14 +36,10 @@ public enum VSubmenuSealed implements IVSubmenu {
/** */ /** */
SINGLETON_INSTANCE; 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 JPanel pnl = new JPanel();
private final StartButton btnStart = new StartButton(); 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() private final JLabel btnBuildDeck = new FLabel.Builder()
.fontScaleAuto(false).fontSize(16) .fontScaleAuto(false).fontSize(16)
.opaque(true).hoverable(true).text("Build a Sealed Deck").build(); .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() * @see forge.view.home.IViewSubmenu#getGroup()
*/ */
@Override @Override
public EMenuGroup getGroup() { public EMenuGroup getGroupEnum() {
return EMenuGroup.LIMITED; 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) /* (non-Javadoc)

View File

@@ -1,6 +1,8 @@
package forge.gui.home.quest; package forge.gui.home.quest;
import java.awt.Color; import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List; import java.util.List;
import javax.swing.SwingConstants; import javax.swing.SwingConstants;
@@ -9,9 +11,11 @@ import javax.swing.border.EmptyBorder;
import forge.AllZone; import forge.AllZone;
import forge.Command; import forge.Command;
import forge.Singletons; import forge.Singletons;
import forge.gui.home.EMenuItem;
import forge.gui.home.ICSubmenu; import forge.gui.home.ICSubmenu;
import forge.gui.home.quest.SubmenuQuestUtil.SelectablePanel; import forge.gui.home.quest.SubmenuQuestUtil.SelectablePanel;
import forge.quest.data.QuestChallenge; import forge.quest.data.QuestChallenge;
import forge.view.ViewHomeUI;
import forge.view.toolbox.FLabel; import forge.view.toolbox.FLabel;
/** /**
@@ -23,25 +27,47 @@ public enum CSubmenuChallenges implements ICSubmenu {
SINGLETON_INSTANCE; SINGLETON_INSTANCE;
/* (non-Javadoc) /* (non-Javadoc)
* @see forge.control.home.IControlSubmenu#getMenuCommand() * @see forge.control.home.IControlSubmenu#getCommand()
*/ */
@SuppressWarnings("serial")
@Override @Override
public Command getMenuCommand() { public Command getMenuCommand() {
return null; return new Command() {
public void execute() {
if (AllZone.getQuestData() == null) {
ViewHomeUI.SINGLETON_INSTANCE.itemClick(EMenuItem.QUEST_DATA);
}
}
};
} }
/* (non-Javadoc) /* (non-Javadoc)
* @see forge.control.home.IControlSubmenu#initialize() * @see forge.control.home.IControlSubmenu#initialize()
*/ */
@SuppressWarnings("serial")
@Override @Override
public void initialize() { public void initialize() {
/// TEMPORARY
VSubmenuDuels.SINGLETON_INSTANCE.populate();
CSubmenuDuels.SINGLETON_INSTANCE.update();
/////////////
VSubmenuChallenges.SINGLETON_INSTANCE.populate(); VSubmenuChallenges.SINGLETON_INSTANCE.populate();
CSubmenuChallenges.SINGLETON_INSTANCE.update(); 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) /* (non-Javadoc)
@@ -52,10 +78,9 @@ public enum CSubmenuChallenges implements ICSubmenu {
SubmenuQuestUtil.updateStatsAndPet(); SubmenuQuestUtil.updateStatsAndPet();
final VSubmenuChallenges view = VSubmenuChallenges.SINGLETON_INSTANCE; final VSubmenuChallenges view = VSubmenuChallenges.SINGLETON_INSTANCE;
VSubmenuDuels.SINGLETON_INSTANCE.getBtnStart().setEnabled(false);
if (AllZone.getQuestData() != null) { if (AllZone.getQuestData() != null) {
VSubmenuDuels.SINGLETON_INSTANCE.getLblTitle().setText("Challenges: " + AllZone.getQuestData().getRank()); view.getLblTitle().setText("Challenges: " + AllZone.getQuestData().getRank());
view.getPnlChallenges().removeAll(); view.getPnlChallenges().removeAll();
final List<QuestChallenge> challenges = final List<QuestChallenge> challenges =
@@ -68,7 +93,7 @@ public enum CSubmenuChallenges implements ICSubmenu {
if (challenges.size() == 0) { if (challenges.size() == 0) {
final FLabel lbl = new FLabel.Builder() final FLabel lbl = new FLabel.Builder()
.text(VSubmenuDuels.SINGLETON_INSTANCE.getLblNextChallengeInWins().getText()) .text(VSubmenuChallenges.SINGLETON_INSTANCE.getLblNextChallengeInWins().getText())
.fontAlign(SwingConstants.CENTER).build(); .fontAlign(SwingConstants.CENTER).build();
lbl.setForeground(Color.red); lbl.setForeground(Color.red);
lbl.setBackground(Color.white); 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<QuestChallenge> 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");
}
}
}*/
} }

View File

@@ -7,9 +7,11 @@ import java.util.List;
import forge.AllZone; import forge.AllZone;
import forge.Command; import forge.Command;
import forge.Singletons; import forge.Singletons;
import forge.gui.home.EMenuItem;
import forge.gui.home.ICSubmenu; import forge.gui.home.ICSubmenu;
import forge.gui.home.quest.SubmenuQuestUtil.SelectablePanel; import forge.gui.home.quest.SubmenuQuestUtil.SelectablePanel;
import forge.quest.data.QuestDuel; import forge.quest.data.QuestDuel;
import forge.view.ViewHomeUI;
/** /**
* TODO: Write javadoc for this type. * TODO: Write javadoc for this type.
@@ -20,11 +22,18 @@ public enum CSubmenuDuels implements ICSubmenu {
SINGLETON_INSTANCE; SINGLETON_INSTANCE;
/* (non-Javadoc) /* (non-Javadoc)
* @see forge.control.home.IControlSubmenu#getMenuCommand() * @see forge.control.home.IControlSubmenu#getCommand()
*/ */
@SuppressWarnings("serial")
@Override @Override
public Command getMenuCommand() { public Command getMenuCommand() {
return null; return new Command() {
public void execute() {
if (AllZone.getQuestData() == null) {
ViewHomeUI.SINGLETON_INSTANCE.itemClick(EMenuItem.QUEST_DATA);
}
}
};
} }
/* (non-Javadoc) /* (non-Javadoc)
@@ -40,13 +49,20 @@ public enum CSubmenuDuels implements ICSubmenu {
new Command() { @Override new Command() { @Override
public void execute() { SubmenuQuestUtil.showSpellShop(); } }); public void execute() { SubmenuQuestUtil.showSpellShop(); } });
VSubmenuDuels.SINGLETON_INSTANCE.getBtnSpellShop().setCommand( VSubmenuDuels.SINGLETON_INSTANCE.getBtnBazaar().setCommand(
new Command() { @Override new Command() { @Override
public void execute() { SubmenuQuestUtil.showBazaar(); } }); public void execute() { SubmenuQuestUtil.showBazaar(); } });
VSubmenuDuels.SINGLETON_INSTANCE.getBtnStart().addActionListener( VSubmenuDuels.SINGLETON_INSTANCE.getBtnStart().addActionListener(
new ActionListener() { @Override new ActionListener() { @Override
public void actionPerformed(final ActionEvent e) { SubmenuQuestUtil.startGame(); } }); 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) /* (non-Javadoc)

View File

@@ -22,16 +22,22 @@ import forge.quest.data.QuestPreferences.QPref;
* TODO: Write javadoc for this type. * TODO: Write javadoc for this type.
* *
*/ */
@SuppressWarnings("serial")
public enum CSubmenuQuestData implements ICSubmenu { public enum CSubmenuQuestData implements ICSubmenu {
/** */ /** */
SINGLETON_INSTANCE; SINGLETON_INSTANCE;
private final Map<String, QuestData> arrQuests = new HashMap<String, QuestData>(); private final Map<String, QuestData> arrQuests = new HashMap<String, QuestData>();
private final Command cmdQuestSelect = new Command() { @Override
public void execute() { changeQuest(); } };
private final Command cmdQuestDelete = new Command() { @Override
public void execute() { update(); } };
/* (non-Javadoc) /* (non-Javadoc)
* @see forge.control.home.IControlSubmenu#update() * @see forge.control.home.IControlSubmenu#update()
*/ */
@SuppressWarnings("serial")
@Override @Override
public void initialize() { public void initialize() {
VSubmenuQuestData.SINGLETON_INSTANCE.populate(); VSubmenuQuestData.SINGLETON_INSTANCE.populate();
@@ -54,75 +60,8 @@ public enum CSubmenuQuestData implements ICSubmenu {
*/ */
@Override @Override
public void update() { public void update() {
refreshQuests();
}
/**
* The actuator for new quests.
*/
private void newQuest() {
final VSubmenuQuestData view = VSubmenuQuestData.SINGLETON_INSTANCE; final VSubmenuQuestData view = VSubmenuQuestData.SINGLETON_INSTANCE;
int difficulty = 0; final File dirQuests = ForgeProps.getFile(NewConstants.Quest.DATA_DIR);
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);
// Temporary transition code between v1.2.2 and v1.2.3. // Temporary transition code between v1.2.2 and v1.2.3.
// Can be safely deleted after release of 1.2.3. // Can be safely deleted after release of 1.2.3.
@@ -170,6 +109,74 @@ public enum CSubmenuQuestData implements ICSubmenu {
else { else {
AllZone.setQuestData(null); 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 */ /** @return */

View File

@@ -7,9 +7,11 @@ import forge.Command;
import forge.Singletons; import forge.Singletons;
import forge.deck.Deck; import forge.deck.Deck;
import forge.gui.deckeditor.DeckEditorQuest; import forge.gui.deckeditor.DeckEditorQuest;
import forge.gui.home.EMenuItem;
import forge.gui.home.ICSubmenu; import forge.gui.home.ICSubmenu;
import forge.quest.data.QuestData; import forge.quest.data.QuestData;
import forge.quest.data.QuestPreferences.QPref; import forge.quest.data.QuestPreferences.QPref;
import forge.view.ViewHomeUI;
/** /**
* TODO: Write javadoc for this type. * TODO: Write javadoc for this type.
@@ -26,7 +28,6 @@ public enum CSubmenuQuestDecks implements ICSubmenu {
public void execute() { public void execute() {
AllZone.getQuestData().saveData(); AllZone.getQuestData().saveData();
update(); update();
Singletons.getView().getViewHome().getBtnQuest().grabFocus();
} }
}; };
@@ -35,13 +36,29 @@ public enum CSubmenuQuestDecks implements ICSubmenu {
public void execute() { public void execute() {
currentDeck = VSubmenuQuestDecks.SINGLETON_INSTANCE.getLstDecks().getSelectedDeck(); currentDeck = VSubmenuQuestDecks.SINGLETON_INSTANCE.getLstDecks().getSelectedDeck();
Singletons.getModel().getQuestPreferences().setPreference(QPref.CURRENT_DECK, currentDeck.toString()); 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 private final Command cmdDeckDelete = new Command() { @Override
public void execute() { update(); } }; 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) /* (non-Javadoc)
* @see forge.control.home.IControlSubmenu#update() * @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) /* (non-Javadoc)
* @see forge.control.home.IControlSubmenu#update() * @see forge.control.home.IControlSubmenu#update()
*/ */
@@ -83,8 +92,9 @@ public enum CSubmenuQuestDecks implements ICSubmenu {
if (qData != null) { if (qData != null) {
final String cd = Singletons.getModel().getQuestPreferences().getPreference(QPref.CURRENT_DECK); final String cd = Singletons.getModel().getQuestPreferences().getPreference(QPref.CURRENT_DECK);
for (Deck d : qData.getMyDecks()) { for (Deck d : qData.getMyDecks()) {
if (d.getName().equals(cd)) { if (d.getName() != null && d.getName().equals(cd)) {
currentDeck = d; currentDeck = d;
view.getLstDecks().setSelectedDeck(d); view.getLstDecks().setSelectedDeck(d);
break; break;
@@ -99,7 +109,15 @@ public enum CSubmenuQuestDecks implements ICSubmenu {
view.getLstDecks().setDeleteCommand(cmdDeckDelete); view.getLstDecks().setDeleteCommand(cmdDeckDelete);
view.getLstDecks().setExitCommand(cmdDeckExit); 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 */ /** @return forge.deck.Deck */

View File

@@ -24,14 +24,6 @@ public enum CSubmenuQuestPrefs implements ICSubmenu {
CSubmenuQuestPrefs.SINGLETON_INSTANCE.update(); CSubmenuQuestPrefs.SINGLETON_INSTANCE.update();
} }
/* (non-Javadoc)
* @see forge.control.home.IControlSubmenu#getCommand()
*/
@Override
public Command getMenuCommand() {
return null;
}
/* (non-Javadoc) /* (non-Javadoc)
* @see forge.control.home.IControlSubmenu#update() * @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. * Checks validity of values entered into prefInputs.
* @param i0 &emsp; a PrefInput object * @param i0 &emsp; a PrefInput object

View File

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

View File

@@ -1,4 +1,4 @@
package forge.view.home; package forge.gui.home.quest;
import java.awt.Color; import java.awt.Color;
import java.awt.event.MouseAdapter; import java.awt.event.MouseAdapter;

View File

@@ -1,4 +1,4 @@
package forge.view.home; package forge.gui.home.quest;
import java.awt.Color; import java.awt.Color;
import java.awt.Font; import java.awt.Font;

View File

@@ -19,7 +19,6 @@ import forge.properties.ForgeProps;
import forge.properties.NewConstants; import forge.properties.NewConstants;
import forge.quest.data.QuestChallenge; import forge.quest.data.QuestChallenge;
import forge.quest.data.QuestData; import forge.quest.data.QuestData;
import forge.quest.data.QuestDataIO;
import forge.quest.data.QuestEvent; import forge.quest.data.QuestEvent;
import forge.quest.data.QuestPreferences.QPref; import forge.quest.data.QuestPreferences.QPref;
import forge.quest.data.QuestUtil; import forge.quest.data.QuestUtil;
@@ -37,7 +36,6 @@ import forge.view.toolbox.FTextArea;
*/ */
public class SubmenuQuestUtil { public class SubmenuQuestUtil {
private static SelectablePanel selectedOpponent; private static SelectablePanel selectedOpponent;
private static Deck currentDeck;
/** /**
* <p> * <p>
@@ -66,79 +64,184 @@ public class SubmenuQuestUtil {
/** Updates stats, pets panels for both duels and challenges. */ /** Updates stats, pets panels for both duels and challenges. */
public static void updateStatsAndPet() { public static void updateStatsAndPet() {
final QuestData qData; final QuestData qData = AllZone.getQuestData();
final VSubmenuDuels view = VSubmenuDuels.SINGLETON_INSTANCE;
////////// TODO - THIS SHOULD NOT BE HERE AND WILL BE MOVED EVENTUALLY. if (qData == null) { return; }
if (AllZone.getQuestData() == null) {
final String questname = Singletons.getModel()
.getQuestPreferences().getPreference(QPref.CURRENT_QUEST);
qData = QuestDataIO.loadData(new File( final IStatsAndPet[] viewsToUpdate = new IStatsAndPet[] {
ForgeProps.getFile(NewConstants.Quest.DATA_DIR) + questname + ".dat")); VSubmenuDuels.SINGLETON_INSTANCE,
AllZone.setQuestData(qData); VSubmenuChallenges.SINGLETON_INSTANCE
} };
else {
qData = AllZone.getQuestData();
}
////////////////////////////////////////////////////////////////////////
// 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(); for (final IStatsAndPet view : viewsToUpdate) {
if (num == 0) { // Fantasy UI display
view.getLblNextChallengeInWins().setText("Next challenge available now."); view.getLblNextChallengeInWins().setVisible(true);
} view.getBtnBazaar().setVisible(true);
else { view.getLblLife().setVisible(true);
view.getLblNextChallengeInWins().setText("Next challenge available in " + num + " wins.");
}
view.getLblWinStreak().setText( // Stats panel
"Win streak: " + qData.getWinStreakCurrent() view.getLblCredits().setText("Credits: " + qData.getCredits());
+ " (Best:" + qData.getWinStreakBest() + ")"); 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. final int num = SubmenuQuestUtil.nextChallengeInWins();
if (qData.getMode().equals(QuestData.FANTASY)) { if (num == 0) {
final Set<String> petList = qData.getPetManager().getAvailablePetNames(); view.getLblNextChallengeInWins().setText("Next challenge available now.");
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 { else {
view.getCbPlant().setVisible(true); view.getLblNextChallengeInWins().setText("Next challenge available in " + num + " wins.");
view.getCbPlant().setSelected(qData.getPetManager().shouldPlantBeUsed());
} }
// Zeppelin visibility view.getLblWinStreak().setText(
final QuestItemZeppelin zeppelin = (QuestItemZeppelin) qData.getInventory().getItem("Zeppelin"); "Win streak: " + qData.getWinStreakCurrent()
view.getCbZep().setVisible(zeppelin.hasBeenUsed()); + " (Best:" + qData.getWinStreakBest() + ")");
// Start panel: pet, plant, zep.
if (qData.getMode().equals(QuestData.FANTASY)) {
final Set<String> 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 { else {
view.getCbxPet().setVisible(false); GameNew.newGame(SubmenuQuestUtil.getCurrentDeck(), event.getEventDeck());
view.getCbPlant().setVisible(false);
view.getCbZep().setVisible(false);
} }
// Start transisiton to match UI.
overlay.hideOverlay();
} }
/** Selectable panels for duels and challenges. */ /** Selectable panels for duels and challenges. */
@@ -158,7 +261,12 @@ public class SubmenuQuestUtil {
@Override @Override
public void execute() { public void execute() {
if (selectedOpponent != null) { selectedOpponent.setSelected(false); } 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; selectedOpponent = SubmenuQuestUtil.SelectablePanel.this;
} }
@@ -194,102 +302,4 @@ public class SubmenuQuestUtil {
return event; return event;
} }
} }
/** @return {@link forge.view.home.ViewQuest.SelectablePanel} */
public static SelectablePanel getSelectedOpponent() {
return selectedOpponent;
}
/** @param deck0 &emsp; {@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();
}
} }

View File

@@ -1,22 +1,72 @@
package forge.gui.home.quest; 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.JPanel;
import javax.swing.JScrollPane; import javax.swing.JScrollPane;
import javax.swing.SwingConstants;
import net.miginfocom.swing.MigLayout; import net.miginfocom.swing.MigLayout;
import forge.gui.home.EMenuGroup; import forge.gui.home.EMenuGroup;
import forge.gui.home.EMenuItem;
import forge.gui.home.ICSubmenu;
import forge.gui.home.IVSubmenu; 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.FPanel;
import forge.view.toolbox.FScrollPane; import forge.view.toolbox.FScrollPane;
import forge.view.toolbox.FSkin;
/** */ /** */
public enum VSubmenuChallenges implements IVSubmenu { public enum VSubmenuChallenges implements IVSubmenu, IStatsAndPet {
/** */ /** */
SINGLETON_INSTANCE; SINGLETON_INSTANCE;
//========== INSTANTIATION //========== INSTANTIATION
private final JPanel pnl = new JPanel(); 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) /* (non-Javadoc)
* @see forge.view.home.IViewSubmenu#getPanel() * @see forge.view.home.IViewSubmenu#getPanel()
@@ -30,22 +80,46 @@ public enum VSubmenuChallenges implements IVSubmenu {
* @see forge.view.home.IViewSubmenu#getGroup() * @see forge.view.home.IViewSubmenu#getGroup()
*/ */
@Override @Override
public EMenuGroup getGroup() { public EMenuGroup getGroupEnum() {
return EMenuGroup.QUEST; 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) /* (non-Javadoc)
* @see forge.view.home.IViewSubmenu#populate() * @see forge.view.home.IViewSubmenu#populate()
*/ */
@Override @Override
public void populate() { public void populate() {
// Note: "Challenges" submenu uses the instances of pnlTitle.setLayout(new MigLayout("insets 0, gap 0"));
// title, stats, and start panels from "Duels" submenu. pnlTitle.setBackground(FSkin.getColor(FSkin.Colors.CLR_THEME2));
final FPanel pnlTitle = VSubmenuDuels.SINGLETON_INSTANCE.getPnlTitle(); pnlTitle.add(lblTitle, "w 100%, h 100%, gap 0 0 0 0");
final JPanel pnlStats = VSubmenuDuels.SINGLETON_INSTANCE.getPnlStats();
final JPanel pnlStart = VSubmenuDuels.SINGLETON_INSTANCE.getPnlStart(); populateStats();
VSubmenuDuels.SINGLETON_INSTANCE.getBtnStart().setEnabled(false); populateStart();
//// btnStart.setEnabled(false);
final FScrollPane scrChallenges = new FScrollPane(pnlChallenges, final FScrollPane scrChallenges = new FScrollPane(pnlChallenges,
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 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%"); 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} */ /** @return {@link javax.swing.JPanel} */
public JPanel getPnlChallenges() { public JPanel getPnlChallenges() {
return pnlChallenges; 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);
}
} }

View File

@@ -12,8 +12,10 @@ import javax.swing.SwingConstants;
import net.miginfocom.swing.MigLayout; import net.miginfocom.swing.MigLayout;
import forge.gui.home.EMenuGroup; import forge.gui.home.EMenuGroup;
import forge.gui.home.EMenuItem;
import forge.gui.home.ICSubmenu;
import forge.gui.home.IVSubmenu; import forge.gui.home.IVSubmenu;
import forge.view.home.StartButton; import forge.gui.home.StartButton;
import forge.view.toolbox.FCheckBox; import forge.view.toolbox.FCheckBox;
import forge.view.toolbox.FLabel; import forge.view.toolbox.FLabel;
import forge.view.toolbox.FPanel; import forge.view.toolbox.FPanel;
@@ -21,7 +23,7 @@ import forge.view.toolbox.FScrollPane;
import forge.view.toolbox.FSkin; import forge.view.toolbox.FSkin;
/** */ /** */
public enum VSubmenuDuels implements IVSubmenu { public enum VSubmenuDuels implements IVSubmenu, IStatsAndPet {
/** */ /** */
SINGLETON_INSTANCE; SINGLETON_INSTANCE;
@@ -60,7 +62,7 @@ public enum VSubmenuDuels implements IVSubmenu {
private final FLabel btnCurrentDeck = new FLabel.Builder() private final FLabel btnCurrentDeck = new FLabel.Builder()
.fontScaleAuto(false).fontSize(15).opaque(true).hoverable(true).build(); .fontScaleAuto(false).fontSize(15).opaque(true).hoverable(true).build();
private final FLabel btnBazaar = new FLabel.Builder() 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(); .fontScaleAuto(false).fontSize(14).tooltip("Peruse the Bazaar").build();
private final FLabel btnSpellShop = new FLabel.Builder() private final FLabel btnSpellShop = new FLabel.Builder()
.opaque(true).hoverable(true).text("Spell Shop") .opaque(true).hoverable(true).text("Spell Shop")
@@ -78,10 +80,34 @@ public enum VSubmenuDuels implements IVSubmenu {
* @see forge.view.home.IViewSubmenu#getGroup() * @see forge.view.home.IViewSubmenu#getGroup()
*/ */
@Override @Override
public EMenuGroup getGroup() { public EMenuGroup getGroupEnum() {
return EMenuGroup.QUEST; 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) /* (non-Javadoc)
* @see forge.view.home.IViewSubmenu#populate() * @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(); final JLabel btnCurrentDeck = VSubmenuDuels.SINGLETON_INSTANCE.getBtnCurrentDeck();
if (SubmenuQuestUtil.getCurrentDeck() == null) { if (SubmenuQuestUtil.getCurrentDeck() == null) {
btnCurrentDeck.setBackground(Color.red.darker()); btnCurrentDeck.setBackground(Color.red.darker());
@@ -133,12 +159,12 @@ public enum VSubmenuDuels implements IVSubmenu {
return pnlTitle; return pnlTitle;
} }
/** @return {@link javax.swing.JPanel} */ /** @return {@link forge.view.toolbox.FPanel} */
public JPanel getPnlStats() { public JPanel getPnlStats() {
return pnlStats; return pnlStats;
} }
/** @return {@link javax.swing.JPanel} */ /** @return {@link forge.view.toolbox.FPanel} */
public JPanel getPnlStart() { public JPanel getPnlStart() {
return pnlStart; return pnlStart;
} }
@@ -147,32 +173,33 @@ public enum VSubmenuDuels implements IVSubmenu {
public JLabel getLblTitle() { public JLabel getLblTitle() {
return lblTitle; return lblTitle;
} }
/** @return {@link javax.swing.FLabel} */
@Override
public FLabel getLblLife() { public FLabel getLblLife() {
return lblLife; return lblLife;
} }
/** @return {@link javax.swing.FLabel} */ @Override
public FLabel getLblCredits() { public FLabel getLblCredits() {
return lblCredits; return lblCredits;
} }
/** @return {@link javax.swing.FLabel} */ @Override
public FLabel getLblWins() { public FLabel getLblWins() {
return lblWins; return lblWins;
} }
/** @return {@link javax.swing.FLabel} */ @Override
public FLabel getLblLosses() { public FLabel getLblLosses() {
return lblLosses; return lblLosses;
} }
/** @return {@link javax.swing.FLabel} */ @Override
public FLabel getLblNextChallengeInWins() { public FLabel getLblNextChallengeInWins() {
return lblNextChallengeInWins; return lblNextChallengeInWins;
} }
/** @return {@link javax.swing.FLabel} */ @Override
public FLabel getLblWinStreak() { public FLabel getLblWinStreak() {
return lblWinStreak; return lblWinStreak;
} }
@@ -182,27 +209,27 @@ public enum VSubmenuDuels implements IVSubmenu {
return btnCurrentDeck; return btnCurrentDeck;
} }
/** @return {@link forge.view.toolbox.FLabel} */ @Override
public FLabel getBtnBazaar() { public FLabel getBtnBazaar() {
return btnBazaar; return btnBazaar;
} }
/** @return {@link forge.view.toolbox.FLabel} */ @Override
public FLabel getBtnSpellShop() { public FLabel getBtnSpellShop() {
return btnSpellShop; return btnSpellShop;
} }
/** @return {@link javax.swing.JCheckBox} */ @Override
public JCheckBox getCbPlant() { public JCheckBox getCbPlant() {
return cbPlant; return cbPlant;
} }
/** @return {@link javax.swing.JCheckBox} */ @Override
public JCheckBox getCbZep() { public JCheckBox getCbZep() {
return cbZep; return cbZep;
} }
/** @return {@link javax.swing.JComboBox} */ @Override
public JComboBox getCbxPet() { public JComboBox getCbxPet() {
return cbxPet; return cbxPet;
} }
@@ -217,15 +244,15 @@ public enum VSubmenuDuels implements IVSubmenu {
pnlStats.removeAll(); pnlStats.removeAll();
pnlStats.setOpaque(false); pnlStats.setOpaque(false);
pnlStats.setLayout(new MigLayout("insets 0, gap 0, hidemode 0")); pnlStats.setLayout(new MigLayout("insets 0, gap 0, hidemode 0"));
pnlStats.add(btnBazaar, constraints); pnlStats.add(btnSpellShop, constraints);
pnlStats.add(lblWins, constraints); pnlStats.add(lblWins, constraints);
pnlStats.add(lblLosses, 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(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(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"); pnlStats.add(btnCurrentDeck, "span 4 1, w 350px!, h 30px!, gap 0 0 0 5px, ax center");
} }

View File

@@ -8,8 +8,9 @@ import javax.swing.SwingConstants;
import net.miginfocom.swing.MigLayout; import net.miginfocom.swing.MigLayout;
import forge.gui.home.EMenuGroup; import forge.gui.home.EMenuGroup;
import forge.gui.home.EMenuItem;
import forge.gui.home.ICSubmenu;
import forge.gui.home.IVSubmenu; import forge.gui.home.IVSubmenu;
import forge.view.home.QuestFileLister;
import forge.view.toolbox.FCheckBox; import forge.view.toolbox.FCheckBox;
import forge.view.toolbox.FLabel; import forge.view.toolbox.FLabel;
import forge.view.toolbox.FPanel; import forge.view.toolbox.FPanel;
@@ -119,7 +120,7 @@ public enum VSubmenuQuestData implements IVSubmenu {
* @see forge.view.home.IViewSubmenu#getGroup() * @see forge.view.home.IViewSubmenu#getGroup()
*/ */
@Override @Override
public EMenuGroup getGroup() { public EMenuGroup getGroupEnum() {
return EMenuGroup.QUEST; return EMenuGroup.QUEST;
} }
@@ -131,7 +132,32 @@ public enum VSubmenuQuestData implements IVSubmenu {
return pnl; 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() { public QuestFileLister getLstQuests() {
return this.lstQuests; return this.lstQuests;
} }

View File

@@ -5,6 +5,8 @@ import javax.swing.JPanel;
import net.miginfocom.swing.MigLayout; import net.miginfocom.swing.MigLayout;
import forge.game.GameType; import forge.game.GameType;
import forge.gui.home.EMenuGroup; import forge.gui.home.EMenuGroup;
import forge.gui.home.EMenuItem;
import forge.gui.home.ICSubmenu;
import forge.gui.home.IVSubmenu; import forge.gui.home.IVSubmenu;
import forge.view.toolbox.DeckLister; import forge.view.toolbox.DeckLister;
import forge.view.toolbox.FLabel; import forge.view.toolbox.FLabel;
@@ -50,7 +52,7 @@ public enum VSubmenuQuestDecks implements IVSubmenu {
* @see forge.view.home.IViewSubmenu#getGroup() * @see forge.view.home.IViewSubmenu#getGroup()
*/ */
@Override @Override
public EMenuGroup getGroup() { public EMenuGroup getGroupEnum() {
return EMenuGroup.QUEST; return EMenuGroup.QUEST;
} }
@@ -62,6 +64,30 @@ public enum VSubmenuQuestDecks implements IVSubmenu {
return pnl; 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} */ /** @return {@link forge.view.toolbox.DeckLister} */
public DeckLister getLstDecks() { public DeckLister getLstDecks() {
return this.lstDecks; return this.lstDecks;

View File

@@ -16,6 +16,8 @@ import javax.swing.SwingConstants;
import net.miginfocom.swing.MigLayout; import net.miginfocom.swing.MigLayout;
import forge.Singletons; import forge.Singletons;
import forge.gui.home.EMenuGroup; import forge.gui.home.EMenuGroup;
import forge.gui.home.EMenuItem;
import forge.gui.home.ICSubmenu;
import forge.gui.home.IVSubmenu; import forge.gui.home.IVSubmenu;
import forge.quest.data.QuestPreferences; import forge.quest.data.QuestPreferences;
import forge.quest.data.QuestPreferences.QPref; import forge.quest.data.QuestPreferences.QPref;
@@ -129,7 +131,7 @@ public enum VSubmenuQuestPrefs implements IVSubmenu {
* @see forge.view.home.IViewSubmenu#getGroup() * @see forge.view.home.IViewSubmenu#getGroup()
*/ */
@Override @Override
public EMenuGroup getGroup() { public EMenuGroup getGroupEnum() {
return EMenuGroup.QUEST; return EMenuGroup.QUEST;
} }
@@ -141,6 +143,30 @@ public enum VSubmenuQuestPrefs implements IVSubmenu {
return pnl; 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} */ /** @return {@link javax.swing.JLabel} */
public JLabel getLblErrRewards() { public JLabel getLblErrRewards() {
return lblErrRewards; return lblErrRewards;

View File

@@ -2,18 +2,15 @@ package forge.gui.home.settings;
import java.awt.event.ItemEvent; import java.awt.event.ItemEvent;
import java.awt.event.ItemListener; import java.awt.event.ItemListener;
import java.awt.event.MouseAdapter;
import javax.swing.ImageIcon; import java.awt.event.MouseEvent;
import javax.swing.SwingWorker;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import org.apache.commons.lang3.text.WordUtils; import org.apache.commons.lang3.text.WordUtils;
import forge.Command; import forge.Command;
import forge.Constant; import forge.Constant;
import forge.Singletons; import forge.Singletons;
import forge.control.FControl; import forge.control.RestartUtil;
import forge.gui.home.ICSubmenu; import forge.gui.home.ICSubmenu;
import forge.properties.ForgePreferences; import forge.properties.ForgePreferences;
import forge.properties.ForgePreferences.FPref; import forge.properties.ForgePreferences.FPref;
@@ -39,10 +36,9 @@ public enum CSubmenuPreferences implements ICSubmenu {
final VSubmenuPreferences view = VSubmenuPreferences.SINGLETON_INSTANCE; final VSubmenuPreferences view = VSubmenuPreferences.SINGLETON_INSTANCE;
final ForgePreferences prefs = Singletons.getModel().getPreferences(); final ForgePreferences prefs = Singletons.getModel().getPreferences();
view.getLstChooseSkin().addListSelectionListener(new ListSelectionListener() { view.getLstChooseSkin().addMouseListener(new MouseAdapter() {
@Override @Override
public void valueChanged(ListSelectionEvent e) { public void mouseClicked(final MouseEvent e) {
if (e.getValueIsAdjusting()) { return; }
updateSkin(); updateSkin();
} }
}); });
@@ -145,7 +141,7 @@ public enum CSubmenuPreferences implements ICSubmenu {
@Override @Override
public void execute() { public void execute() {
Singletons.getModel().getPreferences().reset(); Singletons.getModel().getPreferences().reset();
Singletons.getView().getViewHome().resetSettings(); update();
} }
}); });
} }
@@ -199,30 +195,16 @@ public enum CSubmenuPreferences implements ICSubmenu {
private void updateSkin() { private void updateSkin() {
final VSubmenuPreferences view = VSubmenuPreferences.SINGLETON_INSTANCE; final VSubmenuPreferences view = VSubmenuPreferences.SINGLETON_INSTANCE;
final ForgePreferences prefs = Singletons.getModel().getPreferences(); 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 String name = view.getLstChooseSkin().getSelectedValue().toString();
final SwingWorker<Object, Object> w = new SwingWorker<Object, Object>() { if (name.equals(prefs.getPref(FPref.UI_SKIN))) { return; }
@Override
public String doInBackground() {
FSkin.loadLight(name);
FSkin.loadFull();
RestartUtil.restartApplication(new Runnable() {
@Override
public void run() {
prefs.setPref(FPref.UI_SKIN, name); prefs.setPref(FPref.UI_SKIN, name);
prefs.save(); prefs.save();
return null;
} }
});
@Override
protected void done() {
Singletons.getView().instantiateCachedUIStates();
Singletons.getControl().changeState(FControl.HOME_SCREEN);
Singletons.getView().getViewHome().showSettingsMenu();
}
};
w.execute();
} }
} }

View File

@@ -1,23 +1,22 @@
package forge.gui.home.settings; package forge.gui.home.settings;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image; import java.awt.Image;
import java.awt.event.MouseAdapter; import java.util.Map;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JLabel; import javax.swing.ImageIcon;
import javax.swing.JPanel; import javax.swing.JPanel;
import javax.swing.JScrollPane; import javax.swing.JScrollPane;
import net.miginfocom.swing.MigLayout; import net.miginfocom.swing.MigLayout;
import forge.PlayerType; import forge.Command;
import forge.Singletons; import forge.Singletons;
import forge.gui.home.EMenuGroup; import forge.gui.home.EMenuGroup;
import forge.gui.home.EMenuItem;
import forge.gui.home.ICSubmenu;
import forge.gui.home.IVSubmenu; import forge.gui.home.IVSubmenu;
import forge.properties.ForgePreferences.FPref; import forge.properties.ForgePreferences.FPref;
import forge.view.toolbox.FLabel;
import forge.view.toolbox.FScrollPane; import forge.view.toolbox.FScrollPane;
import forge.view.toolbox.FSkin; import forge.view.toolbox.FSkin;
import forge.view.toolbox.WrapLayout; import forge.view.toolbox.WrapLayout;
@@ -33,8 +32,10 @@ public enum VSubmenuAvatars implements IVSubmenu {
private final JPanel pnl = new JPanel(); private final JPanel pnl = new JPanel();
private final JPanel pnlAvatars = new JPanel(); private final JPanel pnlAvatars = new JPanel();
private AvatarLabel avatarHuman, avatarAI; private final FLabel lblAvatarHuman = new FLabel.Builder().hoverable(true).selectable(true)
private List<AvatarLabel> lstAvatars; .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) /* (non-Javadoc)
* @see forge.view.home.IViewSubmenu#populate() * @see forge.view.home.IViewSubmenu#populate()
@@ -55,7 +56,7 @@ public enum VSubmenuAvatars implements IVSubmenu {
* @see forge.view.home.IViewSubmenu#getGroup() * @see forge.view.home.IViewSubmenu#getGroup()
*/ */
@Override @Override
public EMenuGroup getGroup() { public EMenuGroup getGroupEnum() {
return EMenuGroup.SETTINGS; return EMenuGroup.SETTINGS;
} }
@@ -67,162 +68,117 @@ public enum VSubmenuAvatars implements IVSubmenu {
return pnl; return pnl;
} }
private void populateAvatars() { /* (non-Javadoc)
pnlAvatars.removeAll(); * @see forge.gui.home.IVSubmenu#getMenuTitle()
pnlAvatars.setLayout(new WrapLayout()); */
pnlAvatars.setOpaque(false); @Override
public String getMenuTitle() {
return "Avatars";
}
lstAvatars = new ArrayList<AvatarLabel>(); /* (non-Javadoc)
int counter = 0; * @see forge.gui.home.IVSubmenu#getMenuName()
for (final Image i : FSkin.getAvatars().values()) { */
lstAvatars.add(new AvatarLabel(i, counter++)); @Override
pnlAvatars.add(lstAvatars.get(lstAvatars.size() - 1)); 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<Integer, Image> 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(","); final String[] indexes = Singletons.getModel().getPreferences().getPref(FPref.UI_AVATARS).split(",");
int humanIndex = Integer.parseInt(indexes[0]); int humanIndex = Integer.parseInt(indexes[0]);
int aiIndex = Integer.parseInt(indexes[1]); int aiIndex = Integer.parseInt(indexes[1]);
// Set human avatar from preferences if (humanIndex >= FSkin.getAvatars().size()) { humanIndex = 0; }
if (humanIndex >= lstAvatars.size()) { if (aiIndex >= FSkin.getAvatars().size()) { aiIndex = 0; }
humanIndex = (int) (Math.random() * (lstAvatars.size() - 1));
}
avatarHuman = lstAvatars.get(humanIndex); lblAvatarHuman.setIcon(new ImageIcon(FSkin.getAvatars().get(humanIndex)));
avatarHuman.setOwner(PlayerType.HUMAN); lblAvatarAI.setIcon(new ImageIcon(FSkin.getAvatars().get(aiIndex)));
avatarHuman.repaintOnlyThisLabel();
if (humanIndex == aiIndex || aiIndex >= lstAvatars.size()) { Singletons.getModel().getPreferences().setPref(FPref.UI_AVATARS, aiIndex + "," + humanIndex);
aiIndex = humanIndex; Singletons.getModel().getPreferences().save();
while (aiIndex == humanIndex) {
aiIndex = (int) (Math.random() * (lstAvatars.size() - 1));
}
}
avatarAI = lstAvatars.get(aiIndex);
avatarAI.setOwner(PlayerType.COMPUTER);
avatarAI.repaintOnlyThisLabel();
} }
@SuppressWarnings("serial") @SuppressWarnings("serial")
private class AvatarLabel extends JLabel { private FLabel makeAvatarLabel(final Image img0, final int index0) {
private final Image img; final FLabel lbl = new FLabel.Builder().icon(new ImageIcon(img0)).iconScaleFactor(1.0)
private final int index; .iconAlpha(0.7f).iconInBackground(true).hoverable(true).build();
private PlayerType owner;
private boolean hovered = false;
public AvatarLabel(final Image img0, final int index0) { final Dimension size = new Dimension(100, 100);
super(); lbl.setPreferredSize(size);
img = img0; lbl.setMaximumSize(size);
index = index0; lbl.setMinimumSize(size);
setMaximumSize(new Dimension(100, 120));
setMinimumSize(new Dimension(100, 120));
setPreferredSize(new Dimension(100, 120));
this.addMouseListener(new MouseAdapter() { final Command cmd = new Command() {
@Override @Override
public void mouseEntered(final MouseEvent evt) { hovered = true; repaintOnlyThisLabel(); } public void execute() {
String[] indices = Singletons.getModel().getPreferences()
.getPref(FPref.UI_AVATARS).split(",");
@Override if (lblAvatarAI.isSelected()) {
public void mouseExited(final MouseEvent evt) { hovered = false; repaintOnlyThisLabel(); } lblAvatarAI.setIcon(new ImageIcon(FSkin.getAvatars().get(index0)));
lblAvatarAI.repaintOnlyThisLabel();
@Override indices[0] = String.valueOf(index0);
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;
} }
} else {
lblAvatarHuman.setIcon(new ImageIcon(FSkin.getAvatars().get(index0)));
// Assign computer lblAvatarHuman.repaintOnlyThisLabel();
lbl0.setOwner(PlayerType.COMPUTER); indices[1] = String.valueOf(index0);
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;
} }
}
}
Singletons.getModel().getPreferences().setPref( Singletons.getModel().getPreferences().setPref(FPref.UI_AVATARS, indices[0] + "," + indices[1]);
FPref.UI_AVATARS, avatarHuman.getIndex() + "," + avatarAI.getIndex()); Singletons.getModel().getPreferences().save();
Singletons.getModel().getPreferences().save(); }
};
lbl.setCommand(cmd);
return lbl;
} }
} }

View File

@@ -29,6 +29,8 @@ import forge.Singletons;
import forge.control.KeyboardShortcuts; import forge.control.KeyboardShortcuts;
import forge.control.KeyboardShortcuts.Shortcut; import forge.control.KeyboardShortcuts.Shortcut;
import forge.gui.home.EMenuGroup; import forge.gui.home.EMenuGroup;
import forge.gui.home.EMenuItem;
import forge.gui.home.ICSubmenu;
import forge.gui.home.IVSubmenu; import forge.gui.home.IVSubmenu;
import forge.properties.ForgeProps; import forge.properties.ForgeProps;
import forge.properties.NewConstants.Lang.OldGuiNewGame.NewGameText; import forge.properties.NewConstants.Lang.OldGuiNewGame.NewGameText;
@@ -154,7 +156,7 @@ public enum VSubmenuPreferences implements IVSubmenu {
* @see forge.view.home.IViewSubmenu#getGroup() * @see forge.view.home.IViewSubmenu#getGroup()
*/ */
@Override @Override
public EMenuGroup getGroup() { public EMenuGroup getGroupEnum() {
return EMenuGroup.SETTINGS; return EMenuGroup.SETTINGS;
} }
@@ -166,6 +168,30 @@ public enum VSubmenuPreferences implements IVSubmenu {
return pnl; 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. */ /** Consolidates checkbox styling in one place. */
@SuppressWarnings("serial") @SuppressWarnings("serial")
private class OptionsCheckBox extends JCheckBox { private class OptionsCheckBox extends JCheckBox {
@@ -349,11 +375,6 @@ public enum VSubmenuPreferences implements IVSubmenu {
return cbDevMode; return cbDevMode;
} }
/** @return {@link javax.swing.FLabel} */
public FLabel getLblTitleSkin() {
return lblTitleSkin;
}
/** @return {@link forge.view.toolbox.FLabel} */ /** @return {@link forge.view.toolbox.FLabel} */
public FLabel getBtnReset() { public FLabel getBtnReset() {
return btnReset; return btnReset;

View File

@@ -59,22 +59,13 @@ public enum CSubmenuDeckEditor implements ICSubmenu {
editor = (DeckEditorBase<?, T>) new DeckEditorLimited(Singletons.getModel().getDecks().getSealed()); editor = (DeckEditorBase<?, T>) new DeckEditorLimited(Singletons.getModel().getDecks().getSealed());
} }
editor.show(null);
final Command exit = new Command() {
private static final long serialVersionUID = -9133358399503226853L;
@Override
public void execute() {
Singletons.getControl().getControlHome().getControlConstructed().updateDeckLists();
}
};
editor.show(exit);
if (d0 != null) { if (d0 != null) {
editor.getController().setModel(d0); editor.getController().setModel(d0);
} }
editor.setAlwaysOnTop(true);
editor.setVisible(true); editor.setVisible(true);
} }
} }

View File

@@ -4,6 +4,8 @@ import javax.swing.JPanel;
import net.miginfocom.swing.MigLayout; import net.miginfocom.swing.MigLayout;
import forge.gui.home.EMenuGroup; import forge.gui.home.EMenuGroup;
import forge.gui.home.EMenuItem;
import forge.gui.home.ICSubmenu;
import forge.gui.home.IVSubmenu; import forge.gui.home.IVSubmenu;
import forge.view.toolbox.FLabel; import forge.view.toolbox.FLabel;
@@ -35,7 +37,7 @@ public enum VSubmenuDeckEditor implements IVSubmenu {
* @see forge.view.home.IViewSubmenu#getGroup() * @see forge.view.home.IViewSubmenu#getGroup()
*/ */
@Override @Override
public EMenuGroup getGroup() { public EMenuGroup getGroupEnum() {
return EMenuGroup.UTILITIES; return EMenuGroup.UTILITIES;
} }
@@ -46,4 +48,28 @@ public enum VSubmenuDeckEditor implements IVSubmenu {
public JPanel getPanel() { public JPanel getPanel() {
return pnl; 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;
}
} }

View File

@@ -20,6 +20,8 @@ import javax.swing.text.StyledDocument;
import net.miginfocom.swing.MigLayout; import net.miginfocom.swing.MigLayout;
import forge.gui.GuiUtils; import forge.gui.GuiUtils;
import forge.gui.home.EMenuGroup; import forge.gui.home.EMenuGroup;
import forge.gui.home.EMenuItem;
import forge.gui.home.ICSubmenu;
import forge.gui.home.IVSubmenu; import forge.gui.home.IVSubmenu;
import forge.properties.ForgeProps; import forge.properties.ForgeProps;
import forge.properties.NewConstants.Lang; import forge.properties.NewConstants.Lang;
@@ -123,7 +125,7 @@ public enum VSubmenuUtilities implements IVSubmenu {
* @see forge.view.home.IViewSubmenu#getGroup() * @see forge.view.home.IViewSubmenu#getGroup()
*/ */
@Override @Override
public EMenuGroup getGroup() { public EMenuGroup getGroupEnum() {
return EMenuGroup.UTILITIES; return EMenuGroup.UTILITIES;
} }
@@ -265,4 +267,28 @@ public enum VSubmenuUtilities implements IVSubmenu {
overlay.add(scr); overlay.add(scr);
overlay.showOverlay(); 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;
}
} }

View File

@@ -50,9 +50,9 @@ import forge.properties.NewConstants;
import forge.quest.data.QuestEventManager; import forge.quest.data.QuestEventManager;
import forge.quest.data.QuestPreferences; import forge.quest.data.QuestPreferences;
import forge.util.FileUtil; import forge.util.FileUtil;
import forge.util.StorageView;
import forge.util.HttpUtil; import forge.util.HttpUtil;
import forge.util.IStorageView; import forge.util.IStorageView;
import forge.util.StorageView;
import forge.view.match.ViewField; import forge.view.match.ViewField;
import forge.view.match.ViewTabber; import forge.view.match.ViewTabber;
import forge.view.toolbox.FSkin; import forge.view.toolbox.FSkin;
@@ -108,7 +108,7 @@ public enum FModel {
final boolean deleteSucceeded = logFile.delete(); final boolean deleteSucceeded = logFile.delete();
if (logFile.exists() && !deleteSucceeded && (logFile.length() != 0)) { 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 { try {

View File

@@ -26,6 +26,8 @@ import java.io.IOException;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import forge.gui.home.EMenuItem;
/** /**
* Holds default preference values in an enum. * Holds default preference values in an enum.
* Loads preferred values when instantiated. * Loads preferred values when instantiated.
@@ -60,7 +62,12 @@ public class ForgePreferences {
UI_BUGZ_PWD (""), /** */ UI_BUGZ_PWD (""), /** */
UI_ANTE ("false"), /** */ UI_ANTE ("false"), /** */
UI_SKIN ("default"), /** */ 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_MODE_ENABLED ("false"), /** */
DEV_MILLING_LOSS ("true"), /** */ DEV_MILLING_LOSS ("true"), /** */

View File

@@ -26,8 +26,6 @@ import javax.swing.SwingUtilities;
import forge.Singletons; import forge.Singletons;
import forge.control.FControl; import forge.control.FControl;
import forge.properties.ForgePreferences;
import forge.properties.ForgePreferences.FPref;
import forge.view.toolbox.FOverlay; import forge.view.toolbox.FOverlay;
import forge.view.toolbox.FSkin; import forge.view.toolbox.FSkin;
@@ -44,14 +42,10 @@ public enum FView {
private final FOverlay overlay = new FOverlay(); private final FOverlay overlay = new FOverlay();
private SplashFrame splash; private SplashFrame splash;
private ViewHomeUI home = null;
private ViewMatchUI match = null; private ViewMatchUI match = null;
private ViewEditorUI editor = null; private ViewEditorUI editor = null;
private ViewBazaarUI bazaar = 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. */ /** The splash frame is guaranteed to exist when this constructor exits. */
private FView() { private FView() {
SwingUtilities.invokeLater(new Runnable() { SwingUtilities.invokeLater(new Runnable() {
@@ -94,21 +88,6 @@ public enum FView {
FView.this.splash = null; FView.this.splash = null;
frame.setVisible(true); 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} */ /** @return {@link javax.swing.JLayeredPane} */
@@ -126,15 +105,6 @@ public enum FView {
return FView.this.overlay; 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} */ /** @return {@link forge.view.ViewMatchUI} */
public ViewMatchUI getViewMatch() { public ViewMatchUI getViewMatch() {
if (Singletons.getControl().getState() != FControl.MATCH_SCREEN) { if (Singletons.getControl().getState() != FControl.MATCH_SCREEN) {
@@ -164,9 +134,9 @@ public enum FView {
/** Like it says. */ /** Like it says. */
public void instantiateCachedUIStates() { public void instantiateCachedUIStates() {
FView.this.home = new ViewHomeUI();
FView.this.match = new ViewMatchUI(); FView.this.match = new ViewMatchUI();
FView.this.editor = new ViewEditorUI(); FView.this.editor = new ViewEditorUI();
FView.this.bazaar = new ViewBazaarUI(); FView.this.bazaar = new ViewBazaarUI();
ViewHomeUI.SINGLETON_INSTANCE.initialize();
} }
} }

View File

@@ -17,371 +17,303 @@
*/ */
package forge.view; package forge.view;
import java.awt.CardLayout;
import java.awt.Component;
import java.awt.Rectangle; import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ComponentAdapter; import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent; 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.BorderFactory;
import javax.swing.JButton;
import javax.swing.JLabel; import javax.swing.JLabel;
import javax.swing.JPanel; import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities; import javax.swing.SwingUtilities;
import javax.swing.border.EmptyBorder;
import javax.swing.border.MatteBorder;
import net.miginfocom.swing.MigLayout; import net.miginfocom.swing.MigLayout;
import forge.AllZone;
import forge.Command;
import forge.Singletons; import forge.Singletons;
import forge.control.ControlHomeUI; import forge.gui.home.EMenuGroup;
import forge.game.GameType; 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;
import forge.properties.ForgePreferences.FPref; import forge.properties.ForgePreferences.FPref;
import forge.view.home.ViewConstructed; import forge.properties.ForgeProps;
import forge.view.home.ViewDraft; import forge.properties.NewConstants;
import forge.view.home.ViewQuest; import forge.quest.data.QuestDataIO;
import forge.view.home.ViewSealed; import forge.quest.data.QuestPreferences.QPref;
import forge.view.home.ViewSettings; import forge.view.toolbox.FLabel;
import forge.view.home.ViewUtilities;
import forge.view.toolbox.FButton;
import forge.view.toolbox.FPanel; import forge.view.toolbox.FPanel;
import forge.view.toolbox.FScrollPane;
import forge.view.toolbox.FSkin; import forge.view.toolbox.FSkin;
/** /** Singleton instance of home screen UI.
* - Lays out containers and borders for main menu and submenus<br> * Use "getPanel()" to work with the main container.
* - Instantiates top-level controller for submenus.<br> * <br><br>
* - Has access methods for all child controllers<br> * Generates a card layout with grouped submenus automatically.<br>
* * To add a menu to the home UI:<br>
* - Register its name in the EMenuItem enum<br>
* - Build a view implementing IVSubmenu<br>
* - Build a controller impelementing ICSubmenu<br>
* - Add its singleton instance to the map storing the views for the card layout.
*/ */
@SuppressWarnings("serial") public enum ViewHomeUI {
public class ViewHomeUI extends FPanel { /** */
private JPanel pnlMenu, pnlContent; SINGLETON_INSTANCE;
private FButton btnDraft, btnConstructed, btnSealed, btnQuest, btnSettings, btnUtilities, btnExit, btnDeckEditor;
private String constraints;
private ControlHomeUI control;
private ViewConstructed constructed; private final CardLayout cards = new CardLayout();
private ViewSealed sealed; private final FPanel pnlParent = new FPanel();
private ViewDraft draft; private final FPanel pnlLeft = new FPanel();
private ViewQuest quest; private final FPanel pnlRight = new FPanel(cards);
private ViewSettings settings; private final JPanel pnlMenu = new JPanel();
private ViewUtilities utilities;
private final int insets = 10; private final int insets = 10;
private final int menuWidthPx = 350; private final int leftWidthPx = 250;
private final List<IVSubmenu> allSubmenus = new ArrayList<IVSubmenu>();
private final Map<EMenuItem, FLabel> allSubmenuLabels = new HashMap<EMenuItem, FLabel>();
private FLabel lblPreviousSelected;
/** /** Mostly, assembles child singletons for the home screen UI. */
* Instantiates a new home top level. public void initialize() {
*/ // There's d a better home for this (model?)
public ViewHomeUI() { final File dirQuests = ForgeProps.getFile(NewConstants.Quest.DATA_DIR);
super(); final String questname = Singletons.getModel()
.getQuestPreferences().getPreference(QPref.CURRENT_QUEST);
final File data = new File(dirQuests.getPath() + File.separator + questname);
constructed = new ViewConstructed(); if (data.exists()) {
sealed = new ViewSealed(); AllZone.setQuestData(QuestDataIO.loadData(data));
draft = new ViewDraft(); }
quest = new ViewQuest(); //////////////////////////////
settings = new ViewSettings();
utilities = new ViewUtilities();
this.setCornerDiameter(0);
this.setBorderToggle(false); // Add new menu items here (order doesn't matter).
this.setBackgroundTexture(FSkin.getIcon(FSkin.Backgrounds.BG_TEXTURE)); allSubmenus.clear();
this.setLayout(null); allSubmenus.add(VSubmenuConstructed.SINGLETON_INSTANCE);
this.addComponentListener(new ComponentAdapter() { 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() { pnlParent.addComponentListener(new ComponentAdapter() {
public void componentResized(ComponentEvent e) { @Override
int w = getWidth(); public void componentResized(final ComponentEvent e) {
int h = getHeight(); final int w = pnlParent.getWidth();
pnlContent.setBounds(new Rectangle( final int h = pnlParent.getHeight();
2 * insets + menuWidthPx, insets, pnlRight.setBounds(new Rectangle(
w - menuWidthPx - 3 * insets, h - 2 * insets)); 2 * insets + leftWidthPx, insets,
pnlMenu.setBounds(new Rectangle( w - leftWidthPx - 3 * insets, h - 2 * insets));
pnlLeft.setBounds(new Rectangle( pnlLeft.setBounds(new Rectangle(
menuWidthPx, h - 2 * insets insets, insets,
leftWidthPx, 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(); pnlParent.revalidate();
} }
}); });
} }
/** Opens menu for settings. */
public void showSettingsMenu() { /** Generates expand/collapse menu using cards in layout, and EMenuGroup enum.
clearToggles(); * No further hardcoding should be required in this method. */
pnlContent.removeAll(); private void populateMenu() {
pnlContent.add(settings, "w 99%!, h 95%!, gaptop 2.5%, gapleft 0.5%"); final SortedMap<EMenuGroup, JPanel> allGroupPanels = new TreeMap<EMenuGroup, JPanel>();
pnlContent.revalidate();
pnlContent.repaint();
final Map<EMenuGroup, JLabel> allGroupLabels = new HashMap<EMenuGroup, JLabel>(); final Map<EMenuGroup, JLabel> allGroupLabels = new HashMap<EMenuGroup, JLabel>();
Singletons.getModel().getPreferences().setPref(FPref.UI_HOMEMENU,
ForgePreferences.HomeMenus.settings.toString()); final ForgePreferences prefs = Singletons.getModel().getPreferences();
Singletons.getModel().getPreferences().save(); 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"; final String strItemConstraints = "w 100%!, h 26px!, gap 0 0 1px 1px";
SwingUtilities.invokeLater(new Runnable() { @Override
public void run() { pnlMenu.removeAll();
btnSettings.setToggled(true); pnlMenu.setLayout(new MigLayout("insets 0, gap 0, wrap, hidemode 3"));
btnSettings.grabFocus(); 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)); groupClick(e, allGroupLabels.get(e));
}); }
} }
} }
/** Opens menu for utilities. */
public void showUtilitiesMenu() { private void groupClick(final EMenuGroup e0, final JLabel lbl0) {
clearToggles(); final Component[] menuObjects = pnlMenu.getComponents();
pnlContent.removeAll(); for (final Component c : menuObjects) {
pnlContent.add(utilities, "w 100%!, h 100%!"); if (c.getName() != null && c.getName().equals(e0.toString())) {
pnlContent.revalidate(); if (c.isVisible()) {
pnlContent.repaint(); 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() { Singletons.getModel().getPreferences().save();
btnUtilities.setToggled(true);
btnUtilities.grabFocus();
break; break;
}); }
Singletons.getModel().getPreferences().setPref(FPref.UI_HOMEMENU,
ForgePreferences.HomeMenus.utilities.toString());
Singletons.getModel().getPreferences().save();
} }
} }
private void clearToggles() {
btnConstructed.setToggled(false); /** Custom title label styling. */
btnSealed.setToggled(false); @SuppressWarnings("serial")
btnDraft.setToggled(false); private JLabel makeTitleLabel(final EMenuGroup e0) {
btnQuest.setToggled(false); final FLabel lbl = new FLabel.Builder().fontScaleAuto(false).fontSize(16)
btnDeckEditor.setToggled(false); .hoverable(true).fontAlign(SwingConstants.LEFT).build();
btnSettings.setToggled(false);
btnUtilities.setToggled(false); 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 lbl;
} }
/** @return {@link forge.view.home.ViewConstructed} */
public ViewConstructed getViewConstructed() { /** Custom subsection label styling. */
return this.constructed; @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 lbl;
} }
/** @return {@link forge.view.home.ViewDraft} */
public ViewDraft getViewDraft() { /** Programatically selects a menu item.
return this.draft; * @param e0 &emsp; {@forge.gui.home.EMenuItem} */
public void itemClick(final EMenuItem e0) {
allSubmenuLabels.get(e0).getCommand().execute();
allSubmenuLabels.get(e0).setSelected(true); allSubmenuLabels.get(e0).setSelected(true);
} }
/** @return {@link forge.view.home.ViewSealed} */
public ViewSealed getViewSealed() { /** @return {@link javax.swing.JPanel} the parent panel containing the home UI. */
return this.sealed; public JPanel getPanel() {
}
/** @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 pnlParent; return pnlParent;
} }

View File

@@ -1,3 +0,0 @@
/** Views (as in model-view-controller) for Forge. */
package forge.view.editor;

View File

@@ -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.
*
* <br><br>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 &emsp; {@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<String, Integer> deckMap = new HashMap<String, Integer>();
for (Entry<CardPrinted, Integer> 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<String> dmKeys = new ArrayList<String>();
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);
}
}

View File

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

View File

@@ -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 <http://en.wikipedia.org/wiki/Magic:_The_Gathering_formats#Booster_Draft>)";
/** 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;
}
}

View File

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

View File

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

View File

@@ -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<Shortcut> 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<Integer, Image> 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 &emsp; 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
* &emsp; The new code string (space delimited)
*/
public final void setCodeString(final String str0) {
if ("null".equals(str0)) {
return;
}
this.codeString = str0.trim();
final List<String> codes = new ArrayList<String>(Arrays.asList(this.codeString.split(" ")));
final List<String> displayText = new ArrayList<String>();
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);
}
}

View File

@@ -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 <http://www.gnu.org/licenses/>.";
/** 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

View File

@@ -1,3 +0,0 @@
/** Views (as in model-view-controller) for Forge. */
package forge.view.home;

View File

@@ -296,15 +296,16 @@ public class QuestWinLoseHandler extends ControlWinLose {
Singletons.getControl().changeState(FControl.HOME_SCREEN); Singletons.getControl().changeState(FControl.HOME_SCREEN);
// Update as necessary. // Update as necessary.
if ((Singletons.getView().getViewHome().getViewQuest().getPnlDuels().isVisible())) { /* if ((Singletons.getView().getViewHome().getViewQuest().getPnlDuels().isVisible())) {
Singletons.getView().getViewHome().getViewQuest().showDuelsTab(); Singletons.getView().getViewHome().getViewQuest().showDuelsTab();
} }
else if (Singletons.getView().getViewHome().getViewQuest().getPnlChallenges().isVisible()) { else if (Singletons.getView().getViewHome().getViewQuest().getPnlChallenges().isVisible()) {
Singletons.getView().getViewHome().getViewQuest().showChallengesTab(); Singletons.getView().getViewHome().getViewQuest().showChallengesTab();
} }
Singletons.getView().getViewHome().showQuestMenu(); Singletons.getView().getViewHome().showQuestMenu();*/
GuiUtils.closeOverlay(); GuiUtils.closeOverlay();
throw new NullPointerException("Fix me");
} }
/** /**

View File

@@ -421,30 +421,36 @@ public class DeckLister extends JPanel {
} }
private void editDeck(final Deck d0) { private void editDeck(final Deck d0) {
Singletons.getView().getOverlay().showOverlay();
switch (this.gametype) { switch (this.gametype) {
case Quest: case Quest:
Constant.Runtime.HUMAN_DECK[0] = d0; Constant.Runtime.HUMAN_DECK[0] = d0;
final DeckEditorQuest editor = new DeckEditorQuest(AllZone.getQuestData()); final DeckEditorQuest editor = new DeckEditorQuest(AllZone.getQuestData());
editor.show(this.cmdEditorExit); editor.show(this.cmdEditorExit);
editor.setVisible(true); editor.setVisible(true);
editor.setAlwaysOnTop(true);
break; break;
case Constructed: case Constructed:
final DeckEditorConstructed cEditor = new DeckEditorConstructed(); final DeckEditorConstructed cEditor = new DeckEditorConstructed();
cEditor.show(this.cmdEditorExit); cEditor.show(this.cmdEditorExit);
cEditor.getController().load(d0.getName()); cEditor.getController().load(d0.getName());
cEditor.setVisible(true); cEditor.setVisible(true);
cEditor.setAlwaysOnTop(true);
break; break;
case Sealed: case Sealed:
final DeckEditorLimited sEditor = new DeckEditorLimited(Singletons.getModel().getDecks().getSealed()); final DeckEditorLimited sEditor = new DeckEditorLimited(Singletons.getModel().getDecks().getSealed());
sEditor.show(this.cmdEditorExit); sEditor.show(this.cmdEditorExit);
sEditor.getController().load(d0.getName()); sEditor.getController().load(d0.getName());
sEditor.setVisible(true); sEditor.setVisible(true);
sEditor.setAlwaysOnTop(true);
break; break;
case Draft: case Draft:
final DeckEditorLimited dEditor = new DeckEditorLimited(Singletons.getModel().getDecks().getDraft()); final DeckEditorLimited dEditor = new DeckEditorLimited(Singletons.getModel().getDecks().getDraft());
dEditor.show(this.cmdEditorExit); dEditor.show(this.cmdEditorExit);
dEditor.getController().load(d0.getName()); dEditor.getController().load(d0.getName());
dEditor.setVisible(true); dEditor.setVisible(true);
dEditor.setAlwaysOnTop(true);
break; break;
default: default:
break; break;
@@ -470,7 +476,6 @@ public class DeckLister extends JPanel {
} else if (this.gametype.equals(GameType.Quest)) { } else if (this.gametype.equals(GameType.Quest)) {
AllZone.getQuestData().getMyDecks().delete(d0.getName()); AllZone.getQuestData().getMyDecks().delete(d0.getName());
AllZone.getQuestData().saveData(); AllZone.getQuestData().saveData();
Singletons.getView().getViewHome().getBtnQuest().grabFocus();
} else { } else {
deckManager.getConstructed().delete(d0.getName()); deckManager.getConstructed().delete(d0.getName());
} }

View File

@@ -316,6 +316,11 @@ public class FLabel extends JLabel {
return this.resizeTimer; return this.resizeTimer;
} }
/** @return {@link forge.Command} */
public Command getCommand() {
return this.cmdClick;
}
/** @return boolean */ /** @return boolean */
public boolean isSelected() { public boolean isSelected() {
return selected; return selected;

View File

@@ -18,9 +18,11 @@
package forge.view.toolbox; package forge.view.toolbox;
import java.awt.Color; import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Graphics; import java.awt.Graphics;
import java.awt.Graphics2D; import java.awt.Graphics2D;
import java.awt.Image; import java.awt.Image;
import java.awt.LayoutManager;
import java.awt.RenderingHints; import java.awt.RenderingHints;
import java.awt.event.MouseAdapter; import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
@@ -67,9 +69,16 @@ public class FPanel extends JPanel {
// Image aspect ratio (width / height) // Image aspect ratio (width / height)
private double iar; private double iar;
/** Core panel used in UI. See class javadoc for more details. */ /** */
public FPanel() { public FPanel() {
super(); this(new FlowLayout());
}
/** Core panel used in UI. See class javadoc for more details.
* @param lm0 &emsp; {@link java.awt.LayoutManager}
*/
public FPanel(final LayoutManager lm0) {
super(lm0);
// Opacity must be removed for proper rounded corner drawing // Opacity must be removed for proper rounded corner drawing
this.setOpaque(false); this.setOpaque(false);

View File

@@ -720,8 +720,8 @@ public enum FSkin {
final int aw = bimAvatars.getWidth(); final int aw = bimAvatars.getWidth();
final int ah = bimAvatars.getHeight(); final int ah = bimAvatars.getHeight();
for (int j = 0; j < aw; j += 100) { for (int j = 0; j < ah; j += 100) {
for (int i = 0; i < ah; i += 100) { for (int i = 0; i < aw; i += 100) {
if (i == 0 && j == 0) { continue; } if (i == 0 && j == 0) { continue; }
pxTest = FSkin.getColorFromPixel(bimAvatars.getRGB(i + 50, j + 50)); pxTest = FSkin.getColorFromPixel(bimAvatars.getRGB(i + 50, j + 50));
if (pxTest.getAlpha() == 0) { continue; } if (pxTest.getAlpha() == 0) { continue; }