diff --git a/src/main/java/forge/Constant.java b/src/main/java/forge/Constant.java index 44282a7c214..050441d36a2 100644 --- a/src/main/java/forge/Constant.java +++ b/src/main/java/forge/Constant.java @@ -2,10 +2,7 @@ package forge; import forge.deck.Deck; - -import java.util.Arrays; -import java.util.Collections; -import java.util.List; +import forge.game.GameType; /** @@ -19,11 +16,11 @@ public interface Constant { public static final String ProgramName = "Forge - http://cardforge.org"; //used to pass information between the GUI screens - public interface Runtime { + public abstract class Runtime { public static final Deck[] HumanDeck = new Deck[1]; public static final Deck[] ComputerDeck = new Deck[1]; - public static final String[] GameType = new String[1]; - + public static GameType gameType = GameType.Constructed; + public static final boolean[] Smooth = new boolean[1]; public static final boolean[] Mill = new boolean[1]; public static final boolean[] DevMode = new boolean[1]; // one for normal mode one for quest mode @@ -40,14 +37,6 @@ public interface Constant { public static final int[] stackOffset = new int[1]; } - public interface GameType { - public static final String Constructed = "constructed"; - public static final String Sealed = "sealed"; - public static final String Draft = "draft"; - public static final List GameTypes = Collections.unmodifiableList(Arrays.asList(Constructed, - Sealed, Draft)); - } - //public interface IO { // probably should read this from a file, or set from GUI diff --git a/src/main/java/forge/FileUtil.java b/src/main/java/forge/FileUtil.java index e135c6366ae..9e701923f74 100644 --- a/src/main/java/forge/FileUtil.java +++ b/src/main/java/forge/FileUtil.java @@ -1,12 +1,20 @@ package forge; import forge.error.ErrorViewer; +import forge.properties.ForgeProps; +import forge.properties.NewConstants.LANG.Gui_DownloadPictures.ERRORS; +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; +import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; +import java.io.IOException; +import java.net.Proxy; +import java.net.URL; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -114,4 +122,30 @@ public final class FileUtil { return list; } //readFile() + + public static void downloadUrlIntoFile(final String url, final File target) + { + try{ + byte[] buf = new byte[1024]; + int len; + + Proxy p = Proxy.NO_PROXY; + BufferedInputStream in = new BufferedInputStream(new URL(url).openConnection(p).getInputStream()); + BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(target)); + + //while - read and write file + while ((len = in.read(buf)) != -1) { + out.write(buf, 0, len); + + }//while - read and write file + in.close(); + out.flush(); + out.close(); + } + catch (IOException ioex) + { + ErrorViewer.showError(ioex, ForgeProps.getLocalized(ERRORS.OTHER), "deck_temp.html", url); + } + + } } diff --git a/src/main/java/forge/GameAction.java b/src/main/java/forge/GameAction.java index 6ba5530eb5d..6aac8091705 100644 --- a/src/main/java/forge/GameAction.java +++ b/src/main/java/forge/GameAction.java @@ -21,6 +21,7 @@ import forge.card.trigger.Trigger; import forge.deck.Deck; import forge.game.GameEndReason; import forge.game.GameSummary; +import forge.game.GameType; import forge.game.PlayerIndex; import forge.gui.GuiUtils; import forge.gui.input.Input_Mulligan; @@ -1120,7 +1121,7 @@ public class GameAction { Card.resetUniqueNumber(); - boolean canRandomFoil = Constant.Runtime.RndCFoil[0] && Constant.Runtime.GameType[0].equals(Constant.GameType.Constructed); + boolean canRandomFoil = Constant.Runtime.RndCFoil[0] && Constant.Runtime.gameType.equals(GameType.Constructed); Random generator = MyRandom.random; for (Entry stackOfCards : humanDeck.getMain()) { diff --git a/src/main/java/forge/Gui_WinLose.java b/src/main/java/forge/Gui_WinLose.java index 85e9c1e4298..dbe1397b0a4 100644 --- a/src/main/java/forge/Gui_WinLose.java +++ b/src/main/java/forge/Gui_WinLose.java @@ -9,7 +9,6 @@ import forge.game.GamePlayerRating; import forge.game.GameSummary; import forge.game.PlayerIndex; import forge.gui.CardListViewer; -import forge.gui.GuiUtils; import forge.gui.ListChooser; import forge.properties.ForgeProps; import forge.properties.NewConstants; @@ -38,7 +37,6 @@ import java.awt.event.ActionEvent; import java.awt.event.WindowEvent; import java.io.File; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; /** diff --git a/src/main/java/forge/SetUtils.java b/src/main/java/forge/SetUtils.java index 4607c4e0578..f2bf99d5ba2 100644 --- a/src/main/java/forge/SetUtils.java +++ b/src/main/java/forge/SetUtils.java @@ -9,8 +9,6 @@ import java.util.Map; import org.apache.commons.lang3.StringUtils; -import net.slightlymagic.maxmtg.Predicate; - import forge.card.CardBlock; import forge.card.CardSet; import forge.game.GameFormat; diff --git a/src/main/java/forge/card/CardBlock.java b/src/main/java/forge/card/CardBlock.java index de2d49a3411..5a93f12df10 100644 --- a/src/main/java/forge/card/CardBlock.java +++ b/src/main/java/forge/card/CardBlock.java @@ -1,7 +1,6 @@ package forge.card; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import net.slightlymagic.maxmtg.Predicate; diff --git a/src/main/java/forge/card/CardPrinted.java b/src/main/java/forge/card/CardPrinted.java index 2740ea279ab..5d729ef2780 100644 --- a/src/main/java/forge/card/CardPrinted.java +++ b/src/main/java/forge/card/CardPrinted.java @@ -3,7 +3,6 @@ package forge.card; import java.util.Arrays; import java.util.List; -import org.apache.axis.utils.ArrayUtil; import org.apache.commons.lang3.ArrayUtils; import net.slightlymagic.braids.util.lambda.Lambda1; diff --git a/src/main/java/forge/deck/Deck.java b/src/main/java/forge/deck/Deck.java index c8d8ad0489a..72203155b16 100644 --- a/src/main/java/forge/deck/Deck.java +++ b/src/main/java/forge/deck/Deck.java @@ -1,11 +1,11 @@ package forge.deck; -import forge.Constant; import forge.PlayerType; import forge.card.CardDb; import forge.card.CardPool; import forge.card.CardPoolView; import forge.card.CardPrinted; +import forge.game.GameType; import java.io.Serializable; import java.util.*; @@ -22,10 +22,10 @@ public final class Deck implements Comparable, Serializable { */ private static final long serialVersionUID = -7478025567887481994L; - //gameType is from Constant.GameType, like Constant.GameType.Regular + //gameType is from Constant.GameType, like GameType.Regular private String name; - private String deckType; + private GameType deckType; private String comment = null; private PlayerType playerType = null; @@ -37,7 +37,7 @@ public final class Deck implements Comparable, Serializable { - //gameType is from Constant.GameType, like Constant.GameType.Regular + //gameType is from Constant.GameType, like GameType.Regular /** *

Constructor for Deck.

*/ @@ -54,7 +54,7 @@ public final class Deck implements Comparable, Serializable { * @param sideboard a {@link java.util.List} object. * @param name a {@link java.lang.String} object. */ - public Deck(String deckType, List main, List sideboard, String name) { + public Deck(GameType deckType, List main, List sideboard, String name) { setDeckType(deckType); setName(name); @@ -67,7 +67,7 @@ public final class Deck implements Comparable, Serializable { * * @param type a {@link java.lang.String} object. */ - public Deck(final String type) { + public Deck(final GameType type) { this(); setDeckType(type); } @@ -95,7 +95,7 @@ public final class Deck implements Comparable, Serializable { * * @return a {@link java.lang.String} object. */ - public String getDeckType() { + public GameType getDeckType() { return deckType; } @@ -105,17 +105,12 @@ public final class Deck implements Comparable, Serializable { * * @param deckType a {@link java.lang.String} object. */ - void setDeckType(String deckType) { + void setDeckType(GameType deckType) { if (this.getDeckType() != null) { throw new IllegalStateException( "Deck : setDeckType() error, deck type has already been set"); } - if (!Constant.GameType.GameTypes.contains(deckType)) { - throw new RuntimeException( - "Deck : setDeckType() error, invalid deck type - " + deckType); - } - this.deckType = deckType; } @@ -202,7 +197,7 @@ public final class Deck implements Comparable, Serializable { * @return a boolean. */ public boolean isDraft() { - return getDeckType().equals(Constant.GameType.Draft); + return getDeckType().equals(GameType.Draft); } /** @@ -211,7 +206,7 @@ public final class Deck implements Comparable, Serializable { * @return a boolean. */ public boolean isSealed() { - return getDeckType().equals(Constant.GameType.Sealed); + return getDeckType().equals(GameType.Sealed); } /** @@ -220,7 +215,7 @@ public final class Deck implements Comparable, Serializable { * @return a boolean. */ public boolean isRegular() { - return getDeckType().equals(Constant.GameType.Constructed); + return getDeckType().equals(GameType.Constructed); } /** diff --git a/src/main/java/forge/deck/DeckManager.java b/src/main/java/forge/deck/DeckManager.java index f6b413a92bc..e92335f73ac 100644 --- a/src/main/java/forge/deck/DeckManager.java +++ b/src/main/java/forge/deck/DeckManager.java @@ -1,10 +1,12 @@ package forge.deck; -import forge.Constant; import forge.PlayerType; import forge.card.CardPrinted; import forge.error.ErrorViewer; +import forge.game.GameType; +import forge.properties.ForgeProps; +import forge.properties.NewConstants; import java.io.*; import java.util.*; @@ -13,12 +15,12 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.swing.JOptionPane; +import javax.swing.filechooser.FileFilter; import org.apache.commons.lang3.StringUtils; import static java.lang.Integer.parseInt; import static java.lang.String.format; -import static java.util.Arrays.asList; //reads and writeDeck Deck objects @@ -42,6 +44,18 @@ public class DeckManager { return name.endsWith(".dck"); } }; + + public static final FileFilter dckFilter = new FileFilter() { + @Override + public boolean accept(File f) { + return f.getName().endsWith(".dck") || f.isDirectory(); + } + + @Override + public String getDescription() { + return "Simple Deck File .dck"; + } + }; private static final String NAME = "Name"; private static final String DECK_TYPE = "Deck Type"; @@ -119,7 +133,7 @@ public class DeckManager { * @param deck a {@link forge.deck.Deck} object. */ public void addDeck(Deck deck) { - if (deck.getDeckType().equals(Constant.GameType.Draft)) { + if (deck.getDeckType().equals(GameType.Draft)) { throw new RuntimeException( "DeckManager : addDeck() error, deck type is Draft"); } @@ -174,6 +188,9 @@ public class DeckManager { } draftMap.remove(deckName); + // delete from disk as well + File f = makeFileName(deckName, GameType.Draft); + f.delete(); } /** @@ -183,37 +200,41 @@ public class DeckManager { */ private void checkDraftDeck(Deck[] deck) { if (deck == null || deck.length != 8 || deck[0].getName().equals("") - || (!deck[0].getDeckType().equals(Constant.GameType.Draft))) { + || (!deck[0].getDeckType().equals(GameType.Draft))) { throw new RuntimeException("DeckManager : checkDraftDeck() error, invalid deck"); } } - /** - *

getDecks.

- * - * @return a {@link java.util.Collection} object. - */ public Collection getDecks() { return deckMap.values(); } - /** - *

getDraftDecks.

- * - * @return a {@link java.util.Map} object. - */ + public Map getDraftDecks() { return new HashMap(draftMap); } + - /** - *

close.

- */ - public void close() { - writeAllDecks(); - } + public ArrayList getDeckNames(final GameType deckType) { + ArrayList list = new ArrayList(); + //only get decks according to the OldGuiNewGame screen option + if (deckType.equals(GameType.Draft)) { + for (String s : getDraftDecks().keySet()) { + list.add(s); + } + } else { + for (Deck deck : getDecks()) { + if (deckType.equals(deck.getDeckType())) { + list.add(deck.toString()); + } + } + } + + Collections.sort(list); + return list; + } /** *

readAllDecks.

@@ -305,7 +326,7 @@ public class DeckManager { } else if (COMMENT.equalsIgnoreCase(field)) { d.setComment(linedata[1]); } else if (DECK_TYPE.equalsIgnoreCase(field)) { - d.setDeckType(linedata[1]); + d.setDeckType(GameType.smartValueOf(linedata[1])); } else if (PLAYER.equalsIgnoreCase(field)) { if ("human".equalsIgnoreCase(linedata[1])) { d.setPlayerType(PlayerType.HUMAN); @@ -344,7 +365,7 @@ public class DeckManager { } //readDeck deck type - String deckType = iterator.next(); + GameType deckType = GameType.smartValueOf(iterator.next()); Deck d = new Deck(); d.setName(name); @@ -404,61 +425,52 @@ public class DeckManager { return result; } - /** - *

deriveFileName.

- * - * @param deckName a {@link java.lang.String} object. - * @return a {@link java.lang.String} object. - */ - private String deriveFileName(String deckName) { + private static String deriveFileName(String deckName) { //skips all but the listed characters return deckName.replaceAll("[^-_$#@.{[()]} a-zA-Z0-9]", ""); } + //only accepts numbers, letters or dashes up to 20 characters in length + public static String cleanDeckName(String in) + { + char[] c = in.toCharArray(); + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < c.length && i < 20; i++) { + if (Character.isLetterOrDigit(c[i]) || c[i] == '-') { + sb.append(c[i]); + } + } + return sb.toString(); + } + + public static File makeFileName(String deckName, GameType deckType) + { + File path = ForgeProps.getFile(NewConstants.NEW_DECKS); + if (deckType == GameType.Draft) + return new File(path, deriveFileName(deckName) + ".bdk"); + else + return new File(path, deriveFileName(deckName) + ".dck"); + } + + public static File makeFileName(Deck deck) + { + return makeFileName(deck.getName(), deck.getDeckType()); + } + /** *

writeAllDecks.

*/ - public void writeAllDecks() { + public static void writeDraftDecks(Deck[] drafts) { try { - //store the files that do exist - List files = new ArrayList(); - files.addAll(asList(deckDir.listFiles(DCKFileFilter))); - - //save the files and remove them from the list - for (Deck deck : deckMap.values()) { - File f = new File(deckDir, deriveFileName(deck.getName()) + ".dck"); - files.remove(f); - BufferedWriter out = new BufferedWriter(new FileWriter(f)); - writeDeck(deck, out); + File f = makeFileName(drafts[0]); + f.mkdir(); + for (int i = 0; i < drafts.length; i++) { + BufferedWriter out = new BufferedWriter(new FileWriter(new File(f, i + ".dck"))); + writeDeck(drafts[i], out); out.close(); } - //delete the files that were not written out: the decks that were deleted - for (File file : files) { - file.delete(); - } - //store the files that do exist - files.clear(); - files.addAll(asList(deckDir.listFiles(BDKFileFilter))); - //save the files and remove them from the list - for (Entry e : draftMap.entrySet()) { - File f = new File(deckDir, deriveFileName(e.getValue()[0].getName()) + ".bdk"); - f.mkdir(); - for (int i = 0; i < e.getValue().length; i++) { - BufferedWriter out = new BufferedWriter(new FileWriter(new File(f, i + ".dck"))); - writeDeck(e.getValue()[i], out); - out.close(); - } - } - /* - //delete the files that were not written out: the decks that were deleted - for(File file:files) { - for(int i = 0; i < 8; i++) - new File(file, i + ".dck").delete(); - file.delete(); - } - */ } catch (IOException ex) { ErrorViewer.showError(ex); throw new RuntimeException("DeckManager : writeDeck() error, " + ex.getMessage()); @@ -473,10 +485,10 @@ public class DeckManager { * @throws java.io.IOException if any. */ private static void writeDeck(final Deck d, final BufferedWriter out) throws IOException { - out.write("[metadata]\n"); + out.write(format("[metadata]%n")); out.write(format("%s=%s%n", NAME, d.getName().replaceAll("\n", ""))); - out.write(format("%s=%s%n", DECK_TYPE, d.getDeckType().replaceAll("\n", ""))); + out.write(format("%s=%s%n", DECK_TYPE, d.getDeckType())); // these are optional if (d.getComment() != null) { out.write(format("%s=%s%n", COMMENT, d.getComment().replaceAll("\n", ""))); } if (d.getPlayerType() != null) { out.write(format("%s=%s%n", PLAYER, d.getPlayerType())); } @@ -491,26 +503,6 @@ public class DeckManager { } } - /** - *

count.

- * - * @param src a {@link java.util.List} object. - * @return a {@link java.util.Map} object. - */ - /* - private static Map count(List src) { - Map result = new HashMap(); - for (String s : src) { - Integer dstValue = result.get(s); - if (dstValue == null) { - result.put(s, 1); - } else { - result.put(s, dstValue + 1); - } - } - return result; - } - */ /** *

writeDeck.

@@ -522,7 +514,6 @@ public class DeckManager { try { BufferedWriter writer = new BufferedWriter(new FileWriter(f)); writeDeck(d, writer); - writer.close(); } catch (IOException e) { throw new RuntimeException(e); diff --git a/src/main/java/forge/game/limited/BoosterDraftAI.java b/src/main/java/forge/game/limited/BoosterDraftAI.java index a5784471840..b7fabd2fd42 100644 --- a/src/main/java/forge/game/limited/BoosterDraftAI.java +++ b/src/main/java/forge/game/limited/BoosterDraftAI.java @@ -9,6 +9,7 @@ import forge.Constant; import forge.MyRandom; import forge.card.spellability.Ability_Mana; import forge.deck.Deck; +import forge.game.GameType; import java.util.*; @@ -295,7 +296,7 @@ public class BoosterDraftAI { * @return a {@link forge.deck.Deck} object. */ private Deck buildDeck(CardList dList, DeckColors pClrs) { - Deck out = new Deck(Constant.GameType.Draft); + Deck out = new Deck(GameType.Draft); CardList outList = new CardList(); int cardsNeeded = 22; int landsNeeded = 18; @@ -496,7 +497,7 @@ public class BoosterDraftAI { /* private Deck getDeck(CardList list) { - Deck out = new Deck(Constant.GameType.Draft); + Deck out = new Deck(GameType.Draft); for(int i = 0; i < list.size(); i++) out.addMain(list.get(i).getName()); diff --git a/src/main/java/forge/game/limited/SealedDeck.java b/src/main/java/forge/game/limited/SealedDeck.java index 94b4666a80c..704c410e59d 100644 --- a/src/main/java/forge/game/limited/SealedDeck.java +++ b/src/main/java/forge/game/limited/SealedDeck.java @@ -16,6 +16,7 @@ import forge.card.CardPool; import forge.card.CardSet; import forge.card.spellability.Ability_Mana; import forge.deck.Deck; +import forge.game.GameType; import forge.gui.GuiUtils; import javax.swing.*; @@ -397,7 +398,7 @@ public class SealedDeck { } } - Deck aiDeck = new Deck(Constant.GameType.Sealed); + Deck aiDeck = new Deck(GameType.Sealed); for (i = 0; i < deck.size(); i++) aiDeck.addMain(deck.get(i).getName() + "|" + deck.get(i).getCurSetCode()); diff --git a/src/main/java/forge/gui/deckeditor/DeckDisplay.java b/src/main/java/forge/gui/deckeditor/DeckDisplay.java index 2525b4bc234..5d1c3ae11a6 100644 --- a/src/main/java/forge/gui/deckeditor/DeckDisplay.java +++ b/src/main/java/forge/gui/deckeditor/DeckDisplay.java @@ -1,6 +1,8 @@ package forge.gui.deckeditor; import forge.card.CardPoolView; +import forge.deck.Deck; +import forge.game.GameType; /** * Created by IntelliJ IDEA. @@ -11,37 +13,19 @@ import forge.card.CardPoolView; * @version $Id$ */ public interface DeckDisplay { - /** - *

updateDisplay.

- * - * @param top a {@link forge.CardList} object. - * @param bottom a {@link forge.CardList} object. - */ - void setDecks(CardPoolView top, CardPoolView bottom); + void setDeck(CardPoolView top, CardPoolView bottom, GameType gameType); //top shows available card pool //if constructed, top shows all cards //if sealed, top shows 5 booster packs //if draft, top shows cards that were chosen - /** - *

getTop.

- * - * @return a {@link forge.CardList} object. - */ CardPoolView getTop(); //bottom shows cards that the user has chosen for his library - /** - *

getBottom.

- * - * @return a {@link forge.CardList} object. - */ CardPoolView getBottom(); - /** - *

setTitle.

- * - * @param message a {@link java.lang.String} object. - */ void setTitle(String message); + + Deck getDeck(); + GameType getGameType(); } diff --git a/src/main/java/forge/gui/deckeditor/DeckEditor.java b/src/main/java/forge/gui/deckeditor/DeckEditor.java index 83f4b15aa17..0c794d5ede7 100644 --- a/src/main/java/forge/gui/deckeditor/DeckEditor.java +++ b/src/main/java/forge/gui/deckeditor/DeckEditor.java @@ -4,6 +4,8 @@ import java.awt.Container; import java.awt.Font; import java.awt.Frame; import java.awt.event.ActionEvent; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; @@ -16,13 +18,14 @@ import javax.swing.JCheckBox; import javax.swing.JLabel; import net.miginfocom.swing.MigLayout; import net.slightlymagic.maxmtg.Predicate; +import forge.AllZone; import forge.Command; -import forge.Constant; import forge.card.CardDb; +import forge.card.CardPool; +import forge.card.CardPoolView; import forge.card.CardPrinted; -import forge.deck.Deck; import forge.error.ErrorViewer; -import forge.properties.NewConstants; +import forge.game.GameType; import forge.view.swing.OldGuiNewGame; /** @@ -33,7 +36,7 @@ import forge.view.swing.OldGuiNewGame; * @author Forge * @version $Id$ */ -public final class DeckEditor extends DeckEditorBase implements NewConstants { +public final class DeckEditor extends DeckEditorBase { /** Constant serialVersionUID=130339644136746796L */ private static final long serialVersionUID = 130339644136746796L; @@ -44,17 +47,9 @@ public final class DeckEditor extends DeckEditorBase implements NewConstants { private JButton analysisButton = new JButton(); private JButton clearFilterButton = new JButton(); - private JLabel jLabelAnalysisGap = new JLabel(); + private JLabel jLabelAnalysisGap = new JLabel(""); private FilterNameTypeSetPanel filterNameTypeSet; - private boolean isConstructed = false; - - /** {@inheritDoc} */ - @Override - public void setTitle(final String message) { - super.setTitle(message); - } - public void show(final Command exitCommand) { final Command exit = new Command() { private static final long serialVersionUID = 5210924838133689758L; @@ -65,7 +60,7 @@ public final class DeckEditor extends DeckEditorBase implements NewConstants { } }; - customMenu = new DeckEditorMenu(this, exit); + customMenu = new DeckEditorMenu(this, AllZone.getDeckManager(), exit); this.setJMenuBar(customMenu); // do not change this!!!! @@ -78,11 +73,11 @@ public final class DeckEditor extends DeckEditorBase implements NewConstants { setup(); - isConstructed = Constant.Runtime.GameType[0].equals(Constant.GameType.Constructed); + // show cards, makes this user friendly - if (isConstructed) { - customMenu.newConstructed(); + if (!getGameType().isLimited()) { + customMenu.newConstructed(false); } top.sort(1, true); @@ -115,12 +110,8 @@ public final class DeckEditor extends DeckEditorBase implements NewConstants { } - /** - *

- * Constructor for Gui_DeckEditor. - *

- */ - public DeckEditor() { + public DeckEditor(GameType gameType) { + super(gameType); try { filterBoxes = new FilterCheckBoxes(true); top = new TableWithCards("Avaliable Cards", true, true); @@ -136,44 +127,28 @@ public final class DeckEditor extends DeckEditorBase implements NewConstants { private void jbInit() { - // removeButton.setIcon(upIcon); + if (!OldGuiNewGame.useLAFFonts.isSelected()) { - removeButton.setFont(new java.awt.Font("Dialog", 0, 13)); + Font fButtons = new java.awt.Font("Dialog", 0, 13); + removeButton.setFont(fButtons); + addButton.setFont(fButtons); + clearFilterButton.setFont(fButtons); + analysisButton.setFont(fButtons); } + + addButton.setText("Add to Deck"); removeButton.setText("Remove from Deck"); - removeButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(final ActionEvent e) { - removeButtonClicked(e); - } - }); - addButton.setText("Add to Deck"); - addButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(final ActionEvent e) { - addButton_actionPerformed(e); - } - }); - // addButton.setIcon(downIcon); - if (!OldGuiNewGame.useLAFFonts.isSelected()) { - addButton.setFont(new java.awt.Font("Dialog", 0, 13)); - } clearFilterButton.setText("Clear Filter"); - clearFilterButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(final ActionEvent e) { - clearFilterButton_actionPerformed(e); - } - }); - if (!OldGuiNewGame.useLAFFonts.isSelected()) { - clearFilterButton.setFont(new java.awt.Font("Dialog", 0, 13)); - } analysisButton.setText("Deck Analysis"); + + removeButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(final ActionEvent e) { removeButtonClicked(e); } }); + addButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(final ActionEvent e) { addButton_actionPerformed(e); } }); + clearFilterButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(final ActionEvent e) { clearFilterButton_actionPerformed(e); } }); analysisButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(final ActionEvent e) { - analysisButton_actionPerformed(e); - } - }); - if (!OldGuiNewGame.useLAFFonts.isSelected()) { - analysisButton.setFont(new java.awt.Font("Dialog", 0, 13)); - } + public void actionPerformed(final ActionEvent e) { analysisButton_actionPerformed(e); } }); // Type filtering Font f = new Font("Tahoma", Font.PLAIN, 10); @@ -195,10 +170,7 @@ public final class DeckEditor extends DeckEditorBase implements NewConstants { MigLayout layout = new MigLayout("fill"); pane.setLayout(layout); - // this.getContentPane().add(landCheckBox, - // "cell 0 0, egx checkbox, split 16"); boolean isFirst = true; - for (JCheckBox box : filterBoxes.allTypes) { String growParameter = "grow"; if (isFirst) { @@ -214,36 +186,27 @@ public final class DeckEditor extends DeckEditorBase implements NewConstants { box.addItemListener(itemListenerUpdatesDisplay); } - //this.getContentPane().add(filterButton, "wmin 100, hmin 25, wmax 140, hmax 25, grow"); this.getContentPane().add(clearFilterButton, "wmin 100, hmin 25, wmax 140, hmax 25, grow"); this.getContentPane().add(filterNameTypeSet, "cell 0 1, grow"); this.getContentPane().add(top.getTableDecorated(), "cell 0 2 1 2, pushy, grow"); - - this.getContentPane().add(cardView, "cell 1 0 1 8, flowy, grow"); - - - this.getContentPane().add(top.getLabel(), "cell 0 4"); this.getContentPane().add(addButton, "w 100, h 49, sg button, cell 0 5, split 4"); this.getContentPane().add(removeButton, "w 100, h 49, sg button"); - - // jLabel4 is used to push the analysis button to the right - // This will separate this button from the add and remove card buttons - jLabelAnalysisGap.setText(""); + // Label is used to push the analysis button to the right to separate analysis button from add/remove card ones this.getContentPane().add(jLabelAnalysisGap, "wmin 100, grow"); - this.getContentPane().add(analysisButton, "w 100, h 49, wrap"); this.getContentPane().add(bottom.getTableDecorated(), "cell 0 6, grow"); this.getContentPane().add(bottom.getLabel(), "cell 0 7"); + this.getContentPane().add(cardView, "cell 1 0 1 8, flowy, grow"); + top.getTable().addMouseListener(new MouseAdapter() { - @Override public void mouseClicked(final MouseEvent e) { - if (e.getClickCount() == 2) { addCardToDeck(); } - } - }); + @Override public void mouseClicked(final MouseEvent e) { if (e.getClickCount() == 2) { addCardToDeck(); } } }); + top.getTable().addKeyListener(new KeyAdapter() { + @Override public void keyPressed(final KeyEvent e) { if (e.getKeyChar() == ' ') { addCardToDeck(); } } }); //javax.swing.JRootPane rootPane = this.getRootPane(); //rootPane.setDefaultButton(filterButton); @@ -254,6 +217,17 @@ public final class DeckEditor extends DeckEditorBase implements NewConstants { return Predicate.and(filterBoxes.buildFilter(), filterNameTypeSet.buildFilter()); } + @Override + public void setDeck(CardPoolView topParam, CardPoolView bottomParam, GameType gt) + { + boolean keepRecievedCards = gt.isLimited() || topParam != null; + // if constructed, can add the all cards above + CardPoolView top = keepRecievedCards ? topParam : new CardPool( CardDb.instance().getAllCards() ); + + super.setDeck(top, bottomParam, gt); + + } + void clearFilterButton_actionPerformed(ActionEvent e) { // disable automatic update triggered by listeners isFiltersChangeFiringUpdate = false; @@ -279,9 +253,11 @@ public final class DeckEditor extends DeckEditorBase implements NewConstants { setTitle("Deck Editor : " + customMenu.getDeckName() + " : unsaved"); bottom.addCard(card); - if (!isConstructed) { + if (getGameType().isLimited()) { top.removeCard(card); } + + customMenu.notifyDeckChange(); } void removeButtonClicked(ActionEvent e) { @@ -291,31 +267,10 @@ public final class DeckEditor extends DeckEditorBase implements NewConstants { setTitle("Deck Editor : " + customMenu.getDeckName() + " : unsaved"); bottom.removeCard(card); - if (!isConstructed) { + if (getGameType().isLimited()) { top.addCard(card); } + + customMenu.notifyDeckChange(); } - - // refresh Gui from deck, Gui shows the cards in the deck - /** - *

- * refreshGui. - *

- */ - @SuppressWarnings("unused") - // refreshGui - private void refreshGui() { - Deck deck = Constant.Runtime.HumanDeck[0]; - if (deck == null) // this is just a patch, i know - deck = new Deck(Constant.Runtime.GameType[0]); - - bottom.setDeck(deck.getMain()); - - if (deck.isSealed() || deck.isDraft()) { - top.setDeck(deck.getSideboard()); // add sideboard to GUI - } else { - top.setDeck(CardDb.instance().getAllUniqueCards()); - } - } - } diff --git a/src/main/java/forge/gui/deckeditor/DeckEditorBase.java b/src/main/java/forge/gui/deckeditor/DeckEditorBase.java index 79583c6ea24..0c7c4680205 100644 --- a/src/main/java/forge/gui/deckeditor/DeckEditorBase.java +++ b/src/main/java/forge/gui/deckeditor/DeckEditorBase.java @@ -14,6 +14,8 @@ import net.slightlymagic.maxmtg.Predicate; import forge.GUI_DeckAnalysis; import forge.card.CardPrinted; import forge.card.CardPoolView; +import forge.deck.Deck; +import forge.game.GameType; public abstract class DeckEditorBase extends JFrame implements DeckDisplay { private static final long serialVersionUID = -401223933343539977L; @@ -28,6 +30,10 @@ public abstract class DeckEditorBase extends JFrame implements DeckDisplay { // CardPools and Table data for top and bottom lists protected TableWithCards top; protected TableWithCards bottom; + + + private GameType gameType; + public GameType getGameType() { return gameType; } // top shows available card pool // if constructed, top shows all cards @@ -55,7 +61,13 @@ public abstract class DeckEditorBase extends JFrame implements DeckDisplay { } } - public void setDecks(CardPoolView topParam, CardPoolView bottomParam) { + public DeckEditorBase(GameType gametype) + { + gameType = gametype; + } + + public void setDeck(CardPoolView topParam, CardPoolView bottomParam, GameType gt) { + gameType = gt; top.setDeck(topParam); bottom.setDeck(bottomParam); } @@ -76,4 +88,16 @@ public abstract class DeckEditorBase extends JFrame implements DeckDisplay { @Override public void removeUpdate(DocumentEvent e) { onChange(); } @Override public void changedUpdate(DocumentEvent e) { } // Happend only on ENTER pressed } + + public Deck getDeck() { + Deck deck = new Deck(gameType); + deck.addMain(getBottom()); + + //if sealed or draft, move "top" to sideboard + if (gameType.isLimited() && gameType != GameType.Quest) { + deck.addSideboard(getTop()); + } + return deck; + }//getDeck() + } diff --git a/src/main/java/forge/gui/deckeditor/DeckEditorDraft.java b/src/main/java/forge/gui/deckeditor/DeckEditorDraft.java index 62fca031a96..69b6bb13e0b 100644 --- a/src/main/java/forge/gui/deckeditor/DeckEditorDraft.java +++ b/src/main/java/forge/gui/deckeditor/DeckEditorDraft.java @@ -10,6 +10,7 @@ import forge.card.CardPrinted; import forge.deck.Deck; import forge.deck.DeckManager; import forge.error.ErrorViewer; +import forge.game.GameType; import forge.game.limited.BoosterDraft; import forge.gui.GuiUtils; import forge.properties.ForgeProps; @@ -106,8 +107,7 @@ public class DeckEditorDraft extends DeckEditorBase implements NewConstants, New this.setResizable(false); top.getTable().addKeyListener(new KeyAdapter() { - @Override - public void keyPressed(final KeyEvent e) { + @Override public void keyPressed(final KeyEvent e) { if (e.getKeyChar() == ' ') { jButton1_actionPerformed(null); } } }); @@ -115,6 +115,7 @@ public class DeckEditorDraft extends DeckEditorBase implements NewConstants, New } public DeckEditorDraft() { + super(GameType.Draft); try { top = new TableWithCards("Choose one card", false); bottom = new TableWithCards("Previously picked cards", true); @@ -217,7 +218,7 @@ public class DeckEditorDraft extends DeckEditorBase implements NewConstants, New * @return a {@link forge.deck.Deck} object. */ private Deck getPlayersDeck() { - Deck deck = new Deck(Constant.GameType.Draft); + Deck deck = new Deck(GameType.Draft); Constant.Runtime.HumanDeck[0] = deck; //add sideboard to deck @@ -265,7 +266,7 @@ public class DeckEditorDraft extends DeckEditorBase implements NewConstants, New deckManager.addDraftDeck(all); //write file - deckManager.close(); + DeckManager.writeDraftDecks(all); //close and open next screen dispose(); diff --git a/src/main/java/forge/gui/deckeditor/DeckEditorMenu.java b/src/main/java/forge/gui/deckeditor/DeckEditorMenu.java index 7c957ff9e1e..17479d55a44 100644 --- a/src/main/java/forge/gui/deckeditor/DeckEditorMenu.java +++ b/src/main/java/forge/gui/deckeditor/DeckEditorMenu.java @@ -1,37 +1,33 @@ package forge.gui.deckeditor; - -import forge.AllZone; import forge.Card; import forge.CardList; import forge.Command; -import forge.Constant; import forge.card.CardDb; import forge.card.CardPool; -import forge.card.CardPoolView; import forge.deck.Deck; import forge.deck.DeckManager; -import forge.deck.DownloadDeck; import forge.deck.generate.GenerateConstructedDeck; -import forge.error.BugzReporter; import forge.error.ErrorViewer; +import forge.game.GameType; import forge.gui.GuiUtils; import forge.properties.ForgeProps; import forge.properties.NewConstants; -import forge.properties.NewConstants.LANG.Gui_DownloadPictures.ERRORS; - -import javax.swing.*; -import javax.swing.filechooser.FileFilter; +import org.apache.commons.lang3.StringUtils; +import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.*; -import java.net.Proxy; -import java.net.URL; import java.nio.channels.FileChannel; import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; + +import javax.swing.JFileChooser; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.JOptionPane; +import javax.swing.SwingUtilities; /** *

Gui_DeckEditor_Menu class.

@@ -44,69 +40,31 @@ public class DeckEditorMenu extends JMenuBar implements NewConstants { /** Constant serialVersionUID=-4037993759604768755L */ private static final long serialVersionUID = -4037993759604768755L; - //used by importConstructed() and exportConstructected() /** Constant previousDirectory */ private static File previousDirectory = null; - - /** Constant debugPrint=false */ - private static final boolean debugPrint = false; - - //private final DeckManager deckManager = new DeckManager(ForgeProps.getFile(NEW_DECKS)); - private DeckManager deckManager = AllZone.getDeckManager(); + private DeckManager deckManager; - //with the new IO, there's no reason to use different instances - - private boolean isDeckSaved; + private boolean isDeckSaved = true; private String currentDeckName; - private String currentGameType; - //private String currentDeckPlayerType; - - /** - *

Setter for the field currentGameType.

- * - * @param gameType a {@link java.lang.String} object. - * @since 1.0.15 - */ - public final void setCurrentGameType(final String gameType) { - currentGameType = gameType; - } - - //private JMenuItem newDraftItem; private DeckDisplay deckDisplay; private Command exitCommand; - /** - *

Constructor for Gui_DeckEditor_Menu.

- * - * @param in_display a {@link forge.gui.deckeditor.DeckDisplay} object. - * @param exit a {@link forge.Command} object. - */ - public DeckEditorMenu(final DeckDisplay in_display, final Command exit) { + + public DeckEditorMenu(final DeckDisplay in_display, final DeckManager dckManager, final Command exit) { deckDisplay = in_display; exitCommand = exit; - + deckManager = dckManager; + //this is added just to make save() and saveAs() work ok //when first started up, just a silly patch - currentGameType = Constant.GameType.Constructed; - setDeckData("", false); + setDeckData("", true); setupMenu(); setupSortMenu(); - - JMenu bugMenu = new JMenu("Report Bug"); - JMenuItem bugReport = new JMenuItem("Report Bug"); - bugReport.addActionListener(new ActionListener() { - public void actionPerformed(final ActionEvent ev) { - BugzReporter br = new BugzReporter(); - br.setVisible(true); - } - }); - bugMenu.add(bugReport); - this.add(bugMenu); } @@ -120,7 +78,6 @@ public class DeckEditorMenu extends JMenuBar implements NewConstants { JMenuItem type = new JMenuItem("Type"); JMenuItem stats = new JMenuItem("Power/Toughness"); JMenuItem rarity = new JMenuItem("Rarity"); - JMenuItem newFirst = new JMenuItem("Most recently added"); JMenu menu = new JMenu("Sort By"); menu.add(name); @@ -130,262 +87,94 @@ public class DeckEditorMenu extends JMenuBar implements NewConstants { menu.add(stats); menu.add(rarity); - // menu.add(newFirst); - /* - * The "Most recently added" menu now causes an error exception. This will prevent - * this option from appearing in the "Sort By" menu. There may be a way (or not) - * to sort the indivudual card files by the date created or the date last modified. - */ - this.add(menu); - //add listeners - - name.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent ev) { - //index 1 sorts by card name - for more info see TableSorter - // 0 1 2 3 4 5 6 - //private String column[] = {"Qty", "Name", "Cost", "Color", "Type", "Stats", "Rarity"}; - DeckEditor g = (DeckEditor) deckDisplay; - g.getTopTableModel().sort(1, true); - + ((DeckEditor) deckDisplay).getTopTableModel().sort(1, true); } }); + // 0 1 2 3 4 5 6 + //private String column[] = {"Qty", "Name", "Cost", "Color", "Type", "Stats", "Rarity"}; cost.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent ev) { - // 0 1 2 3 4 5 6 - //private String column[] = {"Qty", "Name", "Cost", "Color", "Type", "Stats", "Rarity"}; - DeckEditor g = (DeckEditor) deckDisplay; - - //sort by type, color, cost - g.getTopTableModel().sort(4, true); - g.getTopTableModel().sort(3, true); - g.getTopTableModel().sort(2, true); + ((DeckEditor) deckDisplay).getTopTableModel().sort(4).sort(3).sort(2); } }); color.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent ev) { - // 0 1 2 3 4 5 6 - //private String column[] = {"Qty", "Name", "Cost", "Color", "Type", "Stats", "Rarity"}; - DeckEditor g = (DeckEditor) deckDisplay; - - //sort by type, cost, color - g.getTopTableModel().sort(4, true); - g.getTopTableModel().sort(2, true); - g.getTopTableModel().sort(3, true); + ((DeckEditor) deckDisplay).getTopTableModel().sort(4).sort(2).sort(3); } }); type.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent ev) { - // 0 1 2 3 4 5 6 - //private String column[] = {"Qty", "Name", "Cost", "Color", "Type", "Stats", "Rarity"}; - DeckEditor g = (DeckEditor) deckDisplay; - - //sort by cost, color, type - g.getTopTableModel().sort(2, true); - g.getTopTableModel().sort(3, true); - g.getTopTableModel().sort(4, true); + ((DeckEditor) deckDisplay).getTopTableModel().sort(2).sort(3).sort(4); } }); stats.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent ev) { - // 0 1 2 3 4 5 6 - //private String column[] = {"Qty", "Name", "Cost", "Color", "Type", "Stats", "Rarity"}; - DeckEditor g = (DeckEditor) deckDisplay; - - g.getTopTableModel().sort(4, true); - g.getTopTableModel().sort(2, true); - g.getTopTableModel().sort(3, true); - g.getTopTableModel().sort(5, true); + ((DeckEditor) deckDisplay).getTopTableModel().sort(4).sort(2).sort(3).sort(5); } }); rarity.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent ev) { - // 0 1 2 3 4 5 6 - //private String column[] = {"Qty", "Name", "Cost", "Color", "Type", "Stats", "Rarity"}; - DeckEditor g = (DeckEditor) deckDisplay; - //sort by cost, type, color, rarity - g.getTopTableModel().sort(2, true); - g.getTopTableModel().sort(4, true); - g.getTopTableModel().sort(3, true); - g.getTopTableModel().sort(6, true); + ((DeckEditor) deckDisplay).getTopTableModel().sort(2).sort(4).sort(3).sort(6); } }); - - newFirst.addActionListener(new ActionListener() { - public void actionPerformed(final ActionEvent ev) { - // 0 1 2 3 4 5 6 - //private String column[] = {"Qty", "Name", "Cost", "Color", "Type", "Stats", "Rarity"}; - DeckEditor g = (DeckEditor) deckDisplay; - - g.getTopTableModel().sort(99, true); - } - }); - - }//setupSortMenu() + } //setupSortMenu() - /** - *

newConstructed.

- */ - public void newConstructed() { - if (debugPrint) { - System.out.println("New Constructed"); - } + public void newConstructed(boolean careAboutOldDeck) { + if (careAboutOldDeck && !canLeaveCurrentDeck()) return; -// if(! isDeckSaved) -// save(); + setDeckData("", true); - currentGameType = Constant.GameType.Constructed; - setDeckData("", false); + deckDisplay.setDeck(null, null, GameType.Constructed); + } - CardPool allCards = new CardPool(); - allCards.addAllCards(CardDb.instance().getAllCards()); - - deckDisplay.setDecks(allCards, null); - }//new constructed - - /** - *

newRandomConstructed.

- */ private void newRandomConstructed() { - if (debugPrint) { - System.out.println("Random Constructed"); - } + if (!canLeaveCurrentDeck()) return; -// if(! isDeckSaved) -// save(); - - currentGameType = Constant.GameType.Constructed; setDeckData("", false); - CardList random = new CardList(AllZone.getCardFactory().getRandomCombinationWithoutRepetition(15 * 5)); - random.add(AllZone.getCardFactory().getCard("Forest", AllZone.getHumanPlayer())); - random.add(AllZone.getCardFactory().getCard("Island", AllZone.getHumanPlayer())); - random.add(AllZone.getCardFactory().getCard("Plains", AllZone.getHumanPlayer())); - random.add(AllZone.getCardFactory().getCard("Mountain", AllZone.getHumanPlayer())); - random.add(AllZone.getCardFactory().getCard("Swamp", AllZone.getHumanPlayer())); - random.add(AllZone.getCardFactory().getCard("Terramorphic Expanse", AllZone.getHumanPlayer())); + // The only remaining reference to global variable! + CardList random = new CardList(forge.AllZone.getCardFactory().getRandomCombinationWithoutRepetition(15 * 5)); CardPool cpRandom = new CardPool(); for (Card c : random) { cpRandom.add(CardDb.instance().getCard(c)); } + cpRandom.add(CardDb.instance().getCard("Forest")); + cpRandom.add(CardDb.instance().getCard("Island")); + cpRandom.add(CardDb.instance().getCard("Plains")); + cpRandom.add(CardDb.instance().getCard("Swamp")); + cpRandom.add(CardDb.instance().getCard("Mountain")); + cpRandom.add(CardDb.instance().getCard("Terramorphic Expanse")); + deckDisplay.setDeck(cpRandom, null, GameType.Constructed); + } - deckDisplay.setDecks(cpRandom, new CardPoolView()); - }//new sealed - - - /** - *

newGenerateConstructed.

- */ private void newGenerateConstructed() { - if (debugPrint) { - System.out.println("Generate Constructed"); - } + if (!canLeaveCurrentDeck()) return; -// if(! isDeckSaved) -// save(); - - currentGameType = Constant.GameType.Constructed; setDeckData("", false); GenerateConstructedDeck gen = new GenerateConstructedDeck(); - // This is an expensive heap operation. - CardPool allCards = new CardPool( CardDb.instance().getAllCards() ); - CardPool generated = new CardPool(); for (Card c : gen.generateDeck()) { generated.add( CardDb.instance().getCard(c)); } - deckDisplay.setDecks(allCards, generated); - }//new sealed + deckDisplay.setDeck(null, generated, GameType.Constructed); + } -/* private void newSealed() { - if (debugPrint) { - System.out.println("New Sealed"); - } - -// if(! isDeckSaved) -// save(); - - currentGameType = Constant.GameType.Sealed; - setDeckData("", false); - - deckDisplay.updateDisplay(new ReadBoosterPack().getBoosterPack5(), new CardList()); - }//new sealed -*/ -/* private void newDraft() { - if (debugPrint) { - System.out.println("New Draft"); - } - -// if(! isDeckSaved) -// save(); - - currentGameType = Constant.GameType.Draft; - - //move all cards from deck main and sideboard to CardList - Deck deck = deckManager.getDraftDeck(currentDeckName)[0]; - setDeckData("", false); - - CardList top = new CardList(); - - for (int i = 0; i < deck.countMain(); i++) { - String cardName = deck.getMain(i); - - if (cardName.contains("|")) { - String s[] = cardName.split("\\|", 2); - cardName = s[0]; - } - - top.add(AllZone.getCardFactory().getCard(cardName, AllZone.getHumanPlayer())); - } - - for (int i = 0; i < deck.countSideboard(); i++) { - String cardName = deck.getMain(i); - String setCode = ""; - if (cardName.contains("|")) { - String s[] = cardName.split("\\|", 2); - cardName = s[0]; - setCode = s[1]; - } - - top.add(AllZone.getCardFactory().getCard(cardName, AllZone.getHumanPlayer())); - } - - deckDisplay.updateDisplay(top, new CardList()); - }//new draft -*/ - - private FileFilter dckFilter = new FileFilter() { - @Override - public boolean accept(File f) { - return f.getName().endsWith(".dck") || f.isDirectory(); - } - - @Override - public String getDescription() { - return "Simple Deck File .dck"; - } - }; - - - /** - *

getImportFilename.

- * - * @return a {@link java.io.File} object. - */ private File getImportFilename() { JFileChooser chooser = new JFileChooser(previousDirectory); - chooser.addChoosableFileFilter(dckFilter); + chooser.addChoosableFileFilter(DeckManager.dckFilter); int returnVal = chooser.showOpenDialog(null); if (returnVal == JFileChooser.APPROVE_OPTION) { @@ -393,36 +182,10 @@ public class DeckEditorMenu extends JMenuBar implements NewConstants { previousDirectory = file.getParentFile(); return file; } - - return null; + } //openFileDialog() - }//openFileDialog() - /** - *

showDeck.

- * - * @param deck a {@link forge.deck.Deck} object. - */ - private void showDeck(Deck deck) { - String gameType = deck.getDeckType(); - - if (gameType.equals(Constant.GameType.Constructed)) { - showConstructedDeck(deck); - } - - if (gameType.equals(Constant.GameType.Draft)) { - showDraftDeck(deck); - } - - if (gameType.equals(Constant.GameType.Sealed)) { - showSealedDeck(deck); - } - }//showDeck() - - /** - *

importDeck.

- */ private void importDeck() { File file = getImportFilename(); @@ -430,8 +193,7 @@ public class DeckEditorMenu extends JMenuBar implements NewConstants { } else if (file.getName().endsWith(".dck")) { try { FileChannel srcChannel = new FileInputStream(file).getChannel(); - File dst = new File(ForgeProps.getFile(NEW_DECKS).getAbsolutePath() + java.io.File.separator - + (file.getName())); + File dst = new File(ForgeProps.getFile(NEW_DECKS).getAbsolutePath(), file.getName()); if (!dst.createNewFile()) { JOptionPane.showMessageDialog(null, "Cannot import deck " + file.getName() + ", a deck currently has that name."); @@ -444,7 +206,7 @@ public class DeckEditorMenu extends JMenuBar implements NewConstants { Deck newDeck = DeckManager.readDeck(file); deckManager.addDeck(newDeck); - showDeck(newDeck); + showDeck(newDeck, newDeck.getDeckType()); } catch (Exception ex) { ErrorViewer.showError(ex); @@ -452,431 +214,157 @@ public class DeckEditorMenu extends JMenuBar implements NewConstants { } } - }//importDeck() - - /** - *

downloadDeck.

- */ - private void downloadDeck() { - - Object o = JOptionPane.showInputDialog(null, "URL(only from http://magic.tcgplayer.com):", - "Download Deck", JOptionPane.OK_CANCEL_OPTION); - if (o == null) { - return; - } - String url = o.toString(); - - if ((url.length() < 37) - || (url.substring(0, 39).equalsIgnoreCase("http://magic.tcgplayer.com/db/deck.asp"))) { - JOptionPane.showMessageDialog(null, "Bad URL." + "\n" - + "Support only deck from http://magic.tcgplayer.com" + "\n" - + "Example: http://magic.tcgplayer.com/db/deck.asp?deck_id=474146", "Information", - JOptionPane.INFORMATION_MESSAGE); - return; - } - Proxy p = null; - p = Proxy.NO_PROXY; - BufferedInputStream in; - BufferedOutputStream out; - try { - byte[] buf = new byte[1024]; - int len; - File f = new File("deck_temp.html"); - in = new BufferedInputStream(new URL(url).openConnection(p).getInputStream()); - out = new BufferedOutputStream(new FileOutputStream(f)); - //while - read and write file - while ((len = in.read(buf)) != -1) { - out.write(buf, 0, len); - - }//while - read and write file - in.close(); - out.flush(); - out.close(); - String fileName = "deck_temp.html"; - FileReader fr = new FileReader(fileName); - BufferedReader br = new BufferedReader(fr); - String s = ""; - String z = ""; - StringBuffer sb = new StringBuffer(); - while ((z = br.readLine()) != null) { - sb.append(z); - } - s = sb.toString(); - br.close(); - int start = s.indexOf("MAIN DECK"); - int finish = s.indexOf("SIDEBOARD"); - String rStr = ""; - rStr = s.substring(start + 9, finish); - int first; - int second; - while (rStr.indexOf("<") != -1) { - first = rStr.indexOf("<"); - second = rStr.indexOf(">", first); - if (first == 0) { - rStr = rStr.substring(second + 1); - } else { - rStr = rStr.substring(0, first) + " " + rStr.substring(second + 1); - } - } - first = rStr.indexOf("Creatures ["); - second = rStr.indexOf("]", first); - if (first != -1) { - rStr = rStr.substring(0, first) + rStr.substring(second + 1); - } - first = rStr.indexOf("Spells ["); - second = rStr.indexOf("]", first); - if (first != -1) { - rStr = rStr.substring(0, first) + rStr.substring(second + 1); - } - first = rStr.indexOf("Lands ["); - second = rStr.indexOf("]", first); - if (first != -1) { - rStr = rStr.substring(0, first) + rStr.substring(second + 1); - } - String number[] = new String[59]; - String name[] = new String[59]; - int count = 0; - DownloadDeck download = new DownloadDeck(); - while (rStr.length() != 0) { - rStr = download.removeSpace(rStr); - number[count] = download.foundNumberCard(rStr); - rStr = download.removeFoundNumberCard(rStr, number[count]); - rStr = download.removeSpace(rStr); - name[count] = download.foundNameCard(rStr); - name[count] = download.removeSpaceBack(name[count]); - rStr = download.removeFoundNameCard(rStr, name[count]); - rStr = download.removeSpace(rStr); - count = count + 1; - } - String trueName[] = new String[59]; - String trueNumber[] = new String[59]; - String falseName[] = new String[59]; - int trueCount = 0; - int falseCount = 0; - for (int i = 0; i < count; i++) { - if (download.isCardSupport(name[i]) == true) { - trueName[trueCount] = name[i]; - trueNumber[trueCount] = number[i]; - trueCount = trueCount + 1; - } else { - falseName[falseCount] = name[i]; - falseCount = falseCount + 1; - } - - } - - CardPool trueList = new CardPool(); - for (int i = 0; i < trueCount; i++) { - trueList.add(CardDb.instance().getCard(trueName[i]), Integer.parseInt(trueNumber[i])); - } - - StringBuffer falseCards = new StringBuffer(); - for (int i = 0; i < falseCount; i++) { - falseCards.append("\n").append(falseName[i]).append(","); - } - - - deckDisplay.setDecks(deckDisplay.getTop(), trueList); - - if (falseCount == 0) { - JOptionPane.showMessageDialog(null, "Deck downloads.", "Information", - JOptionPane.INFORMATION_MESSAGE); - } else { - JOptionPane.showMessageDialog(null, "Sorry, cards:" + falseCards - + "\nnot supported in this version MTGForge. \nDeck downloads without this cards.", - "Information", JOptionPane.INFORMATION_MESSAGE); - } - - f.delete(); - - } catch (Exception ex) { - ErrorViewer.showError(ex, ForgeProps.getLocalized(ERRORS.OTHER), "deck_temp.html", url); - - } - - } - /** *

exportDeck.

*/ private void exportDeck() { File filename = getExportFilename(); + if (filename == null) { return; } - if (filename == null) { - return; - } - - //write is an Object variable because you might just - //write one Deck object or - //many Deck objects if it is a draft deck Deck deck = getDeck(); - - deck.setName(filename.getName().substring(0, filename.getName().length() - 4)); - - //export Draft decks, this is a little hacky - //a Draft deck holds 8 decks, [0] is the player's deck - //and the other 7 are the computer's deck - if (currentGameType.equals(Constant.GameType.Draft)) { - //read all draft decks - Deck[] d = deckManager.getDraftDeck(currentDeckName); - - //replace your deck - d[0] = deck; - } - try { DeckManager.writeDeck(deck, filename); } catch (Exception ex) { ErrorViewer.showError(ex); throw new RuntimeException("Gui_DeckEditor_Menu : exportDeck() error, " + ex); } + } - }//exportDeck() - - /** - *

getExportFilename.

- * - * @return a {@link java.io.File} object. - */ private File getExportFilename() { - //Object o = null; // unused - JFileChooser save = new JFileChooser(previousDirectory); - save.setDialogTitle("Export Deck Filename"); save.setDialogType(JFileChooser.SAVE_DIALOG); - save.setFileFilter(dckFilter); + save.setFileFilter(DeckManager.dckFilter); - int returnVal = save.showSaveDialog(null); - - if (returnVal == JFileChooser.APPROVE_OPTION) { + if (save.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) { File file = save.getSelectedFile(); String check = file.getAbsolutePath(); previousDirectory = file.getParentFile(); - if (check.endsWith(".dck")) { - return file; - } else { - return new File(check + ".dck"); - } + return check.endsWith(".dck") ? file : new File(check + ".dck"); } - return null; } - /** - *

openConstructed.

- */ - private void openConstructed() { - if (debugPrint) { - System.out.println("Open Constructed"); - } + private void openDeck(GameType gameType) { + if (!canLeaveCurrentDeck()) { return; } + + String name = getUserInput_OpenDeck(gameType); -// if(! isDeckSaved) -// save(); + if (StringUtils.isBlank(name)) { return; } - String name = getUserInput_OpenDeck(Constant.GameType.Constructed); - - if (name.equals("")) { - return; - } - - //must be AFTER get user input, since user could cancel - currentGameType = Constant.GameType.Constructed; - //newDraftItem.setEnabled(false); - - Deck deck = deckManager.getDeck(name); - showConstructedDeck(deck); - }//open constructed - - /** - *

showConstructedDeck.

- * - * @param deck a {@link forge.deck.Deck} object. - */ - private void showConstructedDeck(final Deck deck) { + Deck deck = gameType == GameType.Draft ? deckManager.getDraftDeck(name)[0] : deckManager.getDeck(name); + showDeck(deck, gameType); + } + + public final void showDeck(final Deck deck, final GameType gameType) { setDeckData(deck.getName(), true); - - CardPool allCards = new CardPool(CardDb.instance().getAllUniqueCards()); - deckDisplay.setDecks(allCards, deck.getMain()); - }//showConstructedDeck() - - /** - *

openSealed.

- */ - private void openSealed() { - if (debugPrint) { - System.out.println("Open Sealed"); + if (gameType.isLimited()) { + deckDisplay.setDeck(deck.getSideboard(), deck.getMain(), gameType); + } else { + deckDisplay.setDeck(null, deck.getMain(), gameType); } + } + -// if(! isDeckSaved) -// save(); - String name = getUserInput_OpenDeck(Constant.GameType.Sealed); - - if (name.equals("")) { - return; - } - - //must be AFTER get user input, since user could cancel - currentGameType = Constant.GameType.Sealed; - - //newDraftItem.setEnabled(false); - - Deck deck = deckManager.getDeck(name); - showSealedDeck(deck); - }//open sealed - - /** - *

showSealedDeck.

- * - * @param deck a {@link forge.deck.Deck} object. - */ - public final void showSealedDeck(final Deck deck) { - setDeckData(deck.getName(), true); - //currentDeckPlayerType = deck.getMetadata("PlayerType"); - deckDisplay.setDecks(deck.getSideboard(), deck.getMain()); - }//showSealedDeck() - - /** - *

openDraft.

- */ - private void openDraft() { - if (debugPrint) { - System.out.println("Open Draft"); - } - - String name = getUserInput_OpenDeck(Constant.GameType.Draft); - - if (name.equals("")) { - return; - } - - //must be AFTER get user input, since user could cancel - currentGameType = Constant.GameType.Draft; - //newDraftItem.setEnabled(true); - - Deck deck = deckManager.getDraftDeck(name)[0]; - showDraftDeck(deck); - }//open draft - - /** - *

showDraftDeck.

- * - * @param deck a {@link forge.deck.Deck} object. - */ - private void showDraftDeck(final Deck deck) { - setDeckData(deck.getName(), true); - deckDisplay.setDecks(deck.getSideboard(), deck.getMain()); - }//showDraftDeck() - - /** - *

save.

- */ private void save() { - if (debugPrint) { - System.out.println("Save"); - } if (currentDeckName.equals("")) { saveAs(); - } else if (currentGameType.equals(Constant.GameType.Draft)) { + return; + } + + Deck deck = getDeck(); + if (deckDisplay.getGameType().equals(GameType.Draft)) { setDeckData(currentDeckName, true); //write booster deck Deck[] all = deckManager.getDraftDeck(currentDeckName); - all[0] = getDeck(); + all[0] = deck; deckManager.addDraftDeck(all); - } else//constructed or sealed - { + DeckManager.writeDraftDecks(all); + } else { //constructed or sealed setDeckData(currentDeckName, true); - deckManager.deleteDeck(currentDeckName); - deckManager.addDeck(getDeck()); + deckManager.addDeck(deck); + DeckManager.writeDeck(deck, DeckManager.makeFileName(deck)); } - }//save + isDeckSaved = true; + } - /** - *

saveAs.

- */ private void saveAs() { - if (debugPrint) { - System.out.println("Save As"); - } - String name = getUserInput_GetDeckName(); - if (name.equals("")) { - return; - } else if (currentGameType.equals(Constant.GameType.Draft)) { + if (name.equals("")) { return; } + setDeckData(name, true); + + Deck deck = getDeck(); + if (deckDisplay.getGameType().equals(GameType.Draft)) { //MUST copy array Deck[] read = deckManager.getDraftDeck(currentDeckName); Deck[] all = new Deck[read.length]; System.arraycopy(read, 0, all, 0, read.length); - setDeckData(name, true); - - all[0] = getDeck(); + all[0] = deck; deckManager.addDraftDeck(all); + DeckManager.writeDraftDecks(all); } else//constructed and sealed { - setDeckData(name, true); - deckManager.addDeck(getDeck()); + deckManager.addDeck(deck); + DeckManager.writeDeck(deck, DeckManager.makeFileName(deck)); } - }//save as + isDeckSaved = true; + } + - /** - *

delete.

- */ private void delete() { - if (debugPrint) { - System.out.println("Delete"); - } - - if (currentGameType.equals("") || currentDeckName.equals("")) { - return; - } + if (StringUtils.isBlank(currentDeckName)) { return; } int n = JOptionPane.showConfirmDialog(null, "Do you want to delete this deck " + currentDeckName + " ?", "Delete", JOptionPane.YES_NO_OPTION); - if (n == JOptionPane.NO_OPTION) { - return; - } + + if (n == JOptionPane.NO_OPTION) { return; } - if (currentGameType.equals(Constant.GameType.Draft)) { + if (deckDisplay.getGameType().equals(GameType.Draft)) { deckManager.deleteDraftDeck(currentDeckName); } else { deckManager.deleteDeck(currentDeckName); } setDeckData("", true); - deckDisplay.setDecks(new CardPoolView(), new CardPoolView()); - }//delete + deckDisplay.setDeck(null, null, deckDisplay.getGameType()); + } - /** - *

close.

- */ public final void close() { - if (debugPrint) { - System.out.println("Close"); - } - -// if(! isDeckSaved) -// save(); - - deckManager.close(); + if (!canLeaveCurrentDeck()) { return; } exitCommand.execute(); - }//close + } + + private boolean canLeaveCurrentDeck() { + if (isSaved()) return true; + String message = String.format("Do you wish to save changes you made to your current deck '%s'?", currentDeckName); + int choice = JOptionPane.showConfirmDialog((Component) deckDisplay, message, + "You have unsaved changes in your deck", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); + if (JOptionPane.CANCEL_OPTION == choice) { return false; } + if (JOptionPane.NO_OPTION == choice) { return true; } + + Deck deck = getDeck(); + deck.setName(currentDeckName); + DeckManager.writeDeck(deck, DeckManager.makeFileName(deck)); + return true; + } + + private Deck getDeck() + { + Deck deck = deckDisplay.getDeck(); + deck.setName(currentDeckName); + return deck; + } - /** - *

setDeckData.

- * - * @param deckName a {@link java.lang.String} object. - * @param in_isDeckSaved a boolean. - */ private void setDeckData(final String deckName, final boolean in_isDeckSaved) { currentDeckName = deckName; isDeckSaved = in_isDeckSaved; @@ -884,41 +372,8 @@ public class DeckEditorMenu extends JMenuBar implements NewConstants { deckDisplay.setTitle("Deck Editor : " + currentDeckName); } - /** - *

setTitle.

- * - * @param s a {@link java.lang.String} object. - */ - public final void setTitle(final String s) { - deckDisplay.setTitle(s); - } - - /** - *

getDeckName.

- * - * @return a {@link java.lang.String} object. - */ - public final String getDeckName() { - return currentDeckName; - } - - /** - *

getGameType.

- * - * @return a {@link java.lang.String} object. - */ - public final String getGameType() { - return currentGameType; - } - - /** - *

isDeckSaved.

- * - * @return a boolean. - */ - public final boolean isDeckSaved() { - return isDeckSaved; - } + public final String getDeckName() { return currentDeckName; } + public final boolean isSaved() { return isDeckSaved; } /** *

getUserInput_GetDeckName.

@@ -928,119 +383,37 @@ public class DeckEditorMenu extends JMenuBar implements NewConstants { private String getUserInput_GetDeckName() { Object o = JOptionPane.showInputDialog(null, "Save As", "Deck Name", JOptionPane.OK_CANCEL_OPTION); - if (o == null) { - return ""; + if (o == null) { return ""; } + + String deckName = DeckManager.cleanDeckName(o.toString()); + boolean isDraft = deckDisplay.getGameType() == GameType.Draft; + boolean isUniqueName = isDraft ? deckManager.isUniqueDraft(deckName) : deckManager.isUnique(deckName); + boolean isGoodName = isUniqueName && StringUtils.isNotBlank(deckName); + + if (isGoodName) { return deckName; } + + JOptionPane.showMessageDialog(null, "Please pick another deck name, another deck currently has that name."); + return getUserInput_GetDeckName(); + } + + private String getUserInput_OpenDeck(final GameType deckType) { + ArrayList choices = deckManager.getDeckNames(deckType); + if (choices.isEmpty()) { + JOptionPane.showMessageDialog(null, "No decks found", "Open Deck", JOptionPane.PLAIN_MESSAGE); + return null; } - String deckName = cleanString(o.toString()); - - boolean isUniqueName; - if (currentGameType.equals(Constant.GameType.Draft)) { - isUniqueName = deckManager.isUniqueDraft(deckName); - } else { - isUniqueName = deckManager.isUnique(deckName); - } - - if ((!isUniqueName) || deckName.equals("")) { - JOptionPane.showMessageDialog(null, "Please pick another deck name, a deck currently has that name."); - return getUserInput_GetDeckName(); - } - - return deckName; - }//getUserInput_GetDeckName() - - //only accepts numbers, letters or dashes up to 10 characters in length - /** - *

cleanString.

- * - * @param in a {@link java.lang.String} object. - * @return a {@link java.lang.String} object. - */ - private String cleanString(final String in) { - char[] c = in.toCharArray(); - - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < c.length && i < 20; i++) { - if (Character.isLetterOrDigit(c[i]) || c[i] == '-') { - sb.append(c[i]); - } - } - return sb.toString(); + Object o = GuiUtils.getChoiceOptional("Open Deck", choices.toArray()); + return o == null ? null : o.toString(); } - /** - *

getUserInput_OpenDeck.

- * - * @param deckType a {@link java.lang.String} object. - * @return a {@link java.lang.String} object. - */ - private String getUserInput_OpenDeck(final String deckType) { - ArrayList choices = getDeckNames(deckType); - if (choices.size() == 0) { - JOptionPane.showMessageDialog(null, "No decks found", "Open Deck", JOptionPane.PLAIN_MESSAGE); - return ""; - } - //Object o = JOptionPane.showInputDialog(null, "Deck Name", "Open Deck", JOptionPane.OK_CANCEL_OPTION, null, - // choices.toArray(), choices.toArray()[0]); - Object o = GuiUtils.getChoiceOptional("Open Deck", choices.toArray()); + // deck.setName(currentDeckName); + + public void notifyDeckChange() { + isDeckSaved = false; + } - if (o == null) { - return ""; - } - - return o.toString(); - }//getUserInput_OpenDeck() - - - /** - *

getDeckNames.

- * - * @param deckType a {@link java.lang.String} object. - * @return a {@link java.util.ArrayList} object. - */ - private ArrayList getDeckNames(final String deckType) { - ArrayList list = new ArrayList(); - - //only get decks according to the OldGuiNewGame screen option - if (deckType.equals(Constant.GameType.Draft)) { - - for (String s : deckManager.getDraftDecks().keySet()) { - list.add(s); - } - } else { - Collection decks = deckManager.getDecks(); - for (Deck deck : decks) { - if (deckType.equals(deck.getDeckType())) { - list.add(deck.toString()); - } - } - } - - Collections.sort(list); - return list; - }//getDecks() - - /** - *

getDeck.

- * - * @return a {@link forge.deck.Deck} object. - */ - private Deck getDeck() { - Deck deck = new Deck(currentGameType); - deck.setName(currentDeckName); - deck.addMain(deckDisplay.getBottom()); - - //if sealed or draft, move "top" to sideboard - if (!currentGameType.equals(Constant.GameType.Constructed)) { - deck.addSideboard(deckDisplay.getTop()); - } - return deck; - }//getDeck() - - /** - *

setupMenu.

- */ private void setupMenu() { JMenuItem newConstructed = new JMenuItem("New Deck - Constructed"); @@ -1053,7 +426,7 @@ public class DeckEditorMenu extends JMenuBar implements NewConstants { JMenuItem importDeck = new JMenuItem("Import Deck"); JMenuItem exportDeck = new JMenuItem("Export Deck"); - JMenuItem downloadDeck = new JMenuItem("Download Deck"); + // JMenuItem downloadDeck = new JMenuItem("Download Deck"); JMenuItem openConstructed = new JMenuItem("Open Deck - Constructed"); @@ -1082,7 +455,7 @@ public class DeckEditorMenu extends JMenuBar implements NewConstants { fileMenu.add(importDeck); fileMenu.add(exportDeck); - fileMenu.add(downloadDeck); + //fileMenu.add(downloadDeck); fileMenu.addSeparator(); fileMenu.add(newRandomConstructed); @@ -1130,7 +503,7 @@ public class DeckEditorMenu extends JMenuBar implements NewConstants { } }); - downloadDeck.addActionListener(new ActionListener() { +/* downloadDeck.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent ev) { try { SwingUtilities.invokeLater(new Runnable() { @@ -1144,13 +517,13 @@ public class DeckEditorMenu extends JMenuBar implements NewConstants { } } }); - +*/ newConstructed.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent ev) { try { SwingUtilities.invokeLater(new Runnable() { public void run() { - newConstructed(); + newConstructed(true); } }); } catch (Exception ex) { @@ -1192,43 +565,12 @@ public class DeckEditorMenu extends JMenuBar implements NewConstants { } }); - -/* newSealed.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ev) { - try { - SwingUtilities.invokeLater(new Runnable() { - public void run() { - newSealed(); - } - }); - } catch (Exception ex) { - ErrorViewer.showError(ex); - throw new RuntimeException("Gui_DeckEditor_Menu : newSealed() error - " + ex); - } - } - }); -*/ -/* newDraft.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ev) { - try { - SwingUtilities.invokeLater(new Runnable() { - public void run() { - newDraft(); - } - }); - } catch (Exception ex) { - ErrorViewer.showError(ex); - throw new RuntimeException("Gui_DeckEditor_Menu : newDraft() error - " + ex); - } - } - }); -*/ openConstructed.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent ev) { try { SwingUtilities.invokeLater(new Runnable() { public void run() { - openConstructed(); + openDeck(GameType.Constructed); } }); } catch (Exception ex) { @@ -1243,7 +585,7 @@ public class DeckEditorMenu extends JMenuBar implements NewConstants { try { SwingUtilities.invokeLater(new Runnable() { public void run() { - openSealed(); + openDeck(GameType.Sealed); } }); } catch (Exception ex) { @@ -1258,7 +600,7 @@ public class DeckEditorMenu extends JMenuBar implements NewConstants { try { SwingUtilities.invokeLater(new Runnable() { public void run() { - openDraft(); + openDeck(GameType.Draft); } }); } catch (Exception ex) { diff --git a/src/main/java/forge/gui/deckeditor/DeckEditorQuest.java b/src/main/java/forge/gui/deckeditor/DeckEditorQuest.java index 6e0524ee6c7..c93be6e9191 100644 --- a/src/main/java/forge/gui/deckeditor/DeckEditorQuest.java +++ b/src/main/java/forge/gui/deckeditor/DeckEditorQuest.java @@ -7,6 +7,7 @@ import forge.card.CardPoolView; import forge.card.CardPrinted; import forge.deck.Deck; import forge.error.ErrorViewer; +import forge.game.GameType; import forge.gui.GuiUtils; import forge.properties.NewConstants; import forge.quest.data.QuestData; @@ -26,8 +27,6 @@ import java.util.ArrayList; import javax.swing.JButton; import javax.swing.JCheckBox; -import javax.swing.JLabel; - import net.slightlymagic.maxmtg.Predicate; //import forge.quest.data.QuestBoosterPack; @@ -90,7 +89,7 @@ public final class DeckEditorQuest extends DeckEditorBase implements NewConstant && questData.getDeckNames().contains(Constant.Runtime.HumanDeck[0].getName())) { deck = questData.getDeck(Constant.Runtime.HumanDeck[0].getName()); } else { - deck = new Deck(Constant.GameType.Sealed); + deck = new Deck(GameType.Sealed); deck.setName(""); } @@ -105,7 +104,7 @@ public final class DeckEditorQuest extends DeckEditorBase implements NewConstant cardpool.removeAll(bottomPool); // show cards, makes this user friendly, lol, well may, ha - setDecks(cardpool, bottomPool); + setDeck(cardpool, bottomPool, GameType.Quest); // this affects the card pool top.sort(4, true);// sort by type @@ -152,6 +151,7 @@ public final class DeckEditorQuest extends DeckEditorBase implements NewConstant } // setupAndDisplay() public DeckEditorQuest(QuestData questData2) { + super(GameType.Quest); questData = questData2; try { filterBoxes = new FilterCheckBoxes(false); diff --git a/src/main/java/forge/gui/deckeditor/DeckEditorQuestMenu.java b/src/main/java/forge/gui/deckeditor/DeckEditorQuestMenu.java index ca8ed22049f..a18078f9295 100644 --- a/src/main/java/forge/gui/deckeditor/DeckEditorQuestMenu.java +++ b/src/main/java/forge/gui/deckeditor/DeckEditorQuestMenu.java @@ -11,6 +11,7 @@ import forge.card.CardPrinted; import forge.deck.Deck; import forge.deck.DeckManager; import forge.error.ErrorViewer; +import forge.game.GameType; import forge.gui.GuiUtils; import forge.gui.ListChooser; import forge.quest.data.QuestData; @@ -275,7 +276,7 @@ public class DeckEditorQuestMenu extends JMenuBar { cardpool.add(cp, s.getValue()); questData.getCards().getCardpool().add(cp, s.getValue()); } - deckDisplay.setDecks(cardpool, decklist); + deckDisplay.setDeck(cardpool, decklist, GameType.Quest); } catch (Exception ex) { ErrorViewer.showError(ex); @@ -339,13 +340,13 @@ public class DeckEditorQuestMenu extends JMenuBar { // show in pool all cards except ones used in deck cards.removeAll(deck); - deckDisplay.setDecks(cards, deck); + deckDisplay.setDeck(cards, deck, GameType.Quest); } }; private final ActionListener newDeckActionListener = new ActionListener() { public void actionPerformed(final ActionEvent a) { - deckDisplay.setDecks(questData.getCards().getCardpool().getView(), new CardPool()); + deckDisplay.setDeck(questData.getCards().getCardpool().getView(), new CardPool(), GameType.Quest); setPlayerDeckName(""); } }; @@ -428,7 +429,7 @@ public class DeckEditorQuestMenu extends JMenuBar { questData.removeDeck(currentDeck.getName()); //show card pool - deckDisplay.setDecks(questData.getCards().getCardpool().getView(), new CardPool()); + deckDisplay.setDeck(questData.getCards().getCardpool().getView(), new CardPool(), GameType.Quest); setPlayerDeckName(""); } @@ -498,7 +499,7 @@ public class DeckEditorQuestMenu extends JMenuBar { */ private Deck cardPoolToDeck(final CardPoolView list) { //put CardPool into Deck main - Deck deck = new Deck(Constant.GameType.Sealed); + Deck deck = new Deck(GameType.Sealed); deck.addMain(list); return deck; } @@ -511,7 +512,7 @@ public class DeckEditorQuestMenu extends JMenuBar { */ public final void setPlayerDeckName(final String deckName) { //the gui uses this, Gui_Quest_DeckEditor - currentDeck = new Deck(Constant.GameType.Sealed); + currentDeck = new Deck(GameType.Sealed); currentDeck.setName(deckName); deckDisplay.setTitle(deckEditorName + " - " + deckName); diff --git a/src/main/java/forge/gui/deckeditor/DeckEditorShop.java b/src/main/java/forge/gui/deckeditor/DeckEditorShop.java index 010bd2b87b9..87e096927e6 100644 --- a/src/main/java/forge/gui/deckeditor/DeckEditorShop.java +++ b/src/main/java/forge/gui/deckeditor/DeckEditorShop.java @@ -25,6 +25,7 @@ import forge.card.CardPoolView; import forge.card.CardPrinted; import forge.deck.Deck; import forge.error.ErrorViewer; +import forge.game.GameType; import forge.gui.GuiUtils; import forge.quest.data.QuestData; import forge.view.swing.OldGuiNewGame; @@ -93,7 +94,7 @@ public final class DeckEditorShop extends DeckEditorBase { CardPoolView owned = questData.getCards().getCardpool().getView(); //newCardsList = questData.getCards().getNewCards(); - setDecks(forSale, owned); + setDeck(forSale, owned, GameType.Quest); double multiPercent = multiplier * 100; NumberFormat formatter = new DecimalFormat("#0.00"); @@ -162,6 +163,7 @@ public final class DeckEditorShop extends DeckEditorBase { * a {@link forge.quest.data.QuestData} object. */ public DeckEditorShop(final QuestData qd) { + super(GameType.Quest); questData = qd; try { filterBoxes = null; diff --git a/src/main/java/forge/gui/deckeditor/TableWithCards.java b/src/main/java/forge/gui/deckeditor/TableWithCards.java index f8c8bc3d66d..432c841fb4f 100644 --- a/src/main/java/forge/gui/deckeditor/TableWithCards.java +++ b/src/main/java/forge/gui/deckeditor/TableWithCards.java @@ -105,8 +105,10 @@ public final class TableWithCards { return show.toString(); } // getStats() - public void sort(final int iCol, final boolean isAsc) { + public TableWithCards sort(final int iCol) { return sort(iCol, true); } + public TableWithCards sort(final int iCol, final boolean isAsc) { model.sort(iCol, isAsc); + return this; } // Call this after deleting an item from table diff --git a/src/main/java/forge/view/swing/ApplicationView.java b/src/main/java/forge/view/swing/ApplicationView.java index ee7dd1f1f37..8cf580f3d5f 100644 --- a/src/main/java/forge/view/swing/ApplicationView.java +++ b/src/main/java/forge/view/swing/ApplicationView.java @@ -14,6 +14,7 @@ import forge.ComputerAI_Input; import forge.Constant; import forge.ImageCache; import forge.error.ErrorViewer; +import forge.game.GameType; import forge.model.FModel; import forge.properties.ForgePreferences; import forge.view.FView; @@ -123,7 +124,7 @@ public class ApplicationView implements FView { if(!splashFrame.getSplashHasBeenClosed()) { try { - Constant.Runtime.GameType[0] = Constant.GameType.Constructed; + Constant.Runtime.gameType = GameType.Constructed; SwingUtilities.invokeLater(new Runnable() { // NOPMD by Braids on 8/7/11 1:07 PM: this isn't a web app public void run() { AllZone.setComputer(new ComputerAI_Input(new ComputerAI_General())); diff --git a/src/main/java/forge/view/swing/OldGuiNewGame.java b/src/main/java/forge/view/swing/OldGuiNewGame.java index d747a82cb4a..d32c6db56a3 100644 --- a/src/main/java/forge/view/swing/OldGuiNewGame.java +++ b/src/main/java/forge/view/swing/OldGuiNewGame.java @@ -9,6 +9,7 @@ import forge.deck.DeckManager; import forge.deck.generate.*; import forge.error.BugzReporter; import forge.error.ErrorViewer; +import forge.game.GameType; import forge.game.limited.BoosterDraft_1; import forge.game.limited.SealedDeck; import forge.gui.GuiUtils; @@ -58,8 +59,6 @@ public class OldGuiNewGame extends JFrame implements NewConstants, NewConstants. private final DeckManager deckManager = AllZone.getDeckManager(); // with the new IO, there's no reason to use different instances private List allDecks; - /** Constant editor. */ - private static DeckEditor editor; private JLabel titleLabel = new JLabel(); private JLabel jLabel2 = new JLabel(); @@ -131,7 +130,6 @@ public class OldGuiNewGame extends JFrame implements NewConstants, NewConstants. public OldGuiNewGame() { AllZone.setQuestData(null); - allDecks = getDecks(); if (Constant.Runtime.width[0] == 0) { Constant.Runtime.width[0] = 70; @@ -155,15 +153,15 @@ public class OldGuiNewGame extends JFrame implements NewConstants, NewConstants. ErrorViewer.showError(ex); } - if (Constant.Runtime.GameType[0].equals(Constant.GameType.Constructed)) { + if (Constant.Runtime.gameType.equals(GameType.Constructed)) { singleRadioButton.setSelected(true); updateDeckComboBoxes(); } - if (Constant.Runtime.GameType[0].equals(Constant.GameType.Sealed)) { + if (Constant.Runtime.gameType.equals(GameType.Sealed)) { sealedRadioButton.setSelected(true); updateDeckComboBoxes(); } - if (Constant.Runtime.GameType[0].equals(Constant.GameType.Draft)) { + if (Constant.Runtime.gameType.equals(GameType.Draft)) { draftRadioButton.setSelected(true); draftRadioButtonActionPerformed(null); } @@ -291,7 +289,7 @@ public class OldGuiNewGame extends JFrame implements NewConstants, NewConstants. *

*/ private void setupSealed() { - Deck deck = new Deck(Constant.GameType.Sealed); + Deck deck = new Deck(GameType.Sealed); // ReadBoosterPack booster = new ReadBoosterPack(); // CardList pack = booster.getBoosterPack5(); @@ -338,23 +336,22 @@ public class OldGuiNewGame extends JFrame implements NewConstants, NewConstants. String sDeckName = JOptionPane.showInputDialog(null, ForgeProps.getLocalized(NEW_GAME_TEXT.SAVE_SEALED_MSG), ForgeProps.getLocalized(NEW_GAME_TEXT.SAVE_SEALED_TTL), JOptionPane.QUESTION_MESSAGE); + deck.setName(sDeckName); deck.setPlayerType(PlayerType.HUMAN); Constant.Runtime.HumanDeck[0] = deck; - Constant.Runtime.GameType[0] = Constant.GameType.Sealed; + Constant.Runtime.gameType = GameType.Sealed; Deck aiDeck = sd.buildAIDeck(sDeck.toForgeCardList()); aiDeck.setName("AI_" + sDeckName); aiDeck.setPlayerType(PlayerType.COMPUTER); deckManager.addDeck(aiDeck); - deckManager.writeAllDecks(); - deckManager.readAllDecks(); + DeckManager.writeDeck(aiDeck, DeckManager.makeFileName(aiDeck)); updateDeckComboBoxes(); - deckEditorButtonActionPerformed(null); - editor.customMenu.setCurrentGameType(Constant.GameType.Sealed); - editor.customMenu.showSealedDeck(deck); + deckEditorButtonActionPerformed(GameType.Sealed, deck); + Constant.Runtime.ComputerDeck[0] = aiDeck; } else { @@ -456,12 +453,6 @@ public class OldGuiNewGame extends JFrame implements NewConstants, NewConstants. jLabel2.setText(ForgeProps.getLocalized(NEW_GAME_TEXT.YOURDECK)); jLabel3.setText(ForgeProps.getLocalized(NEW_GAME_TEXT.OPPONENT)); - humanComboBox.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(final ActionEvent e) { - humanComboBoxActionPerformed(e); - } - }); - /* * Settings Panel */ @@ -511,7 +502,7 @@ public class OldGuiNewGame extends JFrame implements NewConstants, NewConstants. deckEditorButton.setText(ForgeProps.getLocalized(NEW_GAME_TEXT.DECK_EDITOR)); deckEditorButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(final ActionEvent e) { - deckEditorButtonActionPerformed(e); + deckEditorButtonActionPerformed(GameType.Constructed, null); } }); @@ -626,35 +617,28 @@ public class OldGuiNewGame extends JFrame implements NewConstants, NewConstants. * @param e * a {@link java.awt.event.ActionEvent} object. */ - final void deckEditorButtonActionPerformed(final ActionEvent e) { - if (editor == null) { + final void deckEditorButtonActionPerformed(final GameType gt, final Deck deck) { - editor = new DeckEditor(); + DeckEditor editor = new DeckEditor(gt); - Command exit = new Command() { - private static final long serialVersionUID = -9133358399503226853L; - - public void execute() { - new OldGuiNewGame(); - } - }; - editor.show(exit); - editor.setVisible(true); - } // if - - // refresh decks: - allDecks = getDecks(); - - // TODO (TO have DOne) - this seems hacky. If someone knows how to do - // this for real, feel free. - // This make it so the second time you open the Deck Editor, typing a - // card name and pressing enter will filter - //javax.swing.JRootPane rootPane = editor.getRootPane(); - //rootPane.setDefaultButton(editor.filterButton); + Command exit = new Command() { + private static final long serialVersionUID = -9133358399503226853L; + public void execute() { + + updateDeckComboBoxes(); + OldGuiNewGame.this.setVisible(true); + } + }; + + editor.show(exit); + + if (deck != null) { + editor.customMenu.showDeck(deck, gt); + } + + this.setVisible(false); editor.setVisible(true); - - dispose(); } /** @@ -697,9 +681,7 @@ public class OldGuiNewGame extends JFrame implements NewConstants, NewConstants. if (draftRadioButton.isSelected()) { if (human.equals("New Draft")) { dispose(); - setupDraft(); - return; } else { @@ -732,9 +714,9 @@ public class OldGuiNewGame extends JFrame implements NewConstants, NewConstants. } } else { // non-draft decks - String format = Constant.Runtime.GameType[0]; - // boolean sealed = Constant.GameType.Sealed.equals(format); - boolean constructed = Constant.GameType.Constructed.equals(format); + GameType format = Constant.Runtime.gameType; + // boolean sealed = GameType.Sealed.equals(format); + boolean constructed = GameType.Constructed.equals(format); boolean humanGenerate = human.equals("Generate Deck"); boolean humanRandom = human.equals("Random"); @@ -857,7 +839,7 @@ public class OldGuiNewGame extends JFrame implements NewConstants, NewConstants. private Deck generateConstructedDeck() { GenerateConstructedDeck gen = new GenerateConstructedDeck(); CardList name = gen.generateDeck(); - Deck deck = new Deck(Constant.GameType.Constructed); + Deck deck = new Deck(GameType.Constructed); for (int i = 0; i < 60; i++) { deck.addMain(name.get(i).getName()); @@ -875,7 +857,7 @@ public class OldGuiNewGame extends JFrame implements NewConstants, NewConstants. private Deck generateConstructed3ColorDeck() { GenerateConstructedMultiColorDeck gen = new GenerateConstructedMultiColorDeck(); CardList name = gen.generate3ColorDeck(); - Deck deck = new Deck(Constant.GameType.Constructed); + Deck deck = new Deck(GameType.Constructed); for (int i = 0; i < 60; i++) { deck.addMain(name.get(i).getName()); @@ -893,7 +875,7 @@ public class OldGuiNewGame extends JFrame implements NewConstants, NewConstants. private Deck generateConstructed5ColorDeck() { GenerateConstructedMultiColorDeck gen = new GenerateConstructedMultiColorDeck(); CardList name = gen.generate5ColorDeck(); - Deck deck = new Deck(Constant.GameType.Constructed); + Deck deck = new Deck(GameType.Constructed); for (int i = 0; i < 60; i++) { deck.addMain(name.get(i).getName()); @@ -923,7 +905,7 @@ public class OldGuiNewGame extends JFrame implements NewConstants, NewConstants. } CardList td = gen.getThemeDeck(stDeck, 60); - Deck deck = new Deck(Constant.GameType.Constructed); + Deck deck = new Deck(GameType.Constructed); for (int i = 0; i < td.size(); i++) { deck.addMain(td.get(i).getName()); @@ -977,7 +959,7 @@ public class OldGuiNewGame extends JFrame implements NewConstants, NewConstants. Generate2ColorDeck gen = new Generate2ColorDeck(c1, c2); CardList d = gen.get2ColorDeck(60, p); - Deck deck = new Deck(Constant.GameType.Constructed); + Deck deck = new Deck(GameType.Constructed); for (int i = 0; i < d.size(); i++) { deck.addMain(d.get(i).getName()); @@ -1043,7 +1025,7 @@ public class OldGuiNewGame extends JFrame implements NewConstants, NewConstants. Generate3ColorDeck gen = new Generate3ColorDeck(c1, c2, c3); CardList d = gen.get3ColorDeck(60, p); - Deck deck = new Deck(Constant.GameType.Constructed); + Deck deck = new Deck(GameType.Constructed); for (int i = 0; i < d.size(); i++) { deck.addMain(d.get(i).getName()); @@ -1077,7 +1059,7 @@ public class OldGuiNewGame extends JFrame implements NewConstants, NewConstants. Generate5ColorDeck gen = new Generate5ColorDeck("white", "blue", "black", "red", "green"); CardList d = gen.get5ColorDeck(60, p); - Deck deck = new Deck(Constant.GameType.Constructed); + Deck deck = new Deck(GameType.Constructed); for (int i = 0; i < d.size(); i++) { deck.addMain(d.get(i).getName()); @@ -1096,7 +1078,7 @@ public class OldGuiNewGame extends JFrame implements NewConstants, NewConstants. * a {@link java.awt.event.ActionEvent} object. */ final void singleRadioButtonActionPerformed(final ActionEvent e) { - Constant.Runtime.GameType[0] = Constant.GameType.Constructed; + Constant.Runtime.gameType = GameType.Constructed; updateDeckComboBoxes(); } @@ -1109,7 +1091,7 @@ public class OldGuiNewGame extends JFrame implements NewConstants, NewConstants. * a {@link java.awt.event.ActionEvent} object. */ final void sealedRadioButtonActionPerformed(final ActionEvent e) { - Constant.Runtime.GameType[0] = Constant.GameType.Sealed; + Constant.Runtime.gameType = GameType.Sealed; updateDeckComboBoxes(); } @@ -1122,20 +1104,21 @@ public class OldGuiNewGame extends JFrame implements NewConstants, NewConstants. humanComboBox.removeAllItems(); computerComboBox.removeAllItems(); - if (Constant.GameType.Sealed.equals(Constant.Runtime.GameType[0])) { + allDecks = getDecks(); + switch(Constant.Runtime.gameType) + { + case Sealed: humanComboBox.addItem("New Sealed"); computerComboBox.addItem("New Sealed"); for (Deck allDeck : allDecks) { - if (allDeck.getDeckType().equals(Constant.GameType.Sealed)) { - if (allDeck.getPlayerType() == PlayerType.HUMAN) { - humanComboBox.addItem(allDeck.getName()); - } else if (allDeck.getPlayerType() == PlayerType.COMPUTER) { - computerComboBox.addItem(allDeck.getName()); - } + if (allDeck.getDeckType().equals(GameType.Sealed)) { + JComboBox boxToAdd = allDeck.getPlayerType() == PlayerType.COMPUTER ? computerComboBox : humanComboBox; + boxToAdd.addItem(allDeck.getName()); } } // for - } else if (Constant.GameType.Constructed.equals(Constant.Runtime.GameType[0])) { + break; + case Constructed: humanComboBox.addItem("Generate Deck"); computerComboBox.addItem("Generate Deck"); @@ -1143,11 +1126,25 @@ public class OldGuiNewGame extends JFrame implements NewConstants, NewConstants. computerComboBox.addItem("Random"); for (Deck allDeck : allDecks) { - if (allDeck.getDeckType().equals(Constant.GameType.Constructed)) { + if (allDeck.getDeckType().equals(GameType.Constructed)) { humanComboBox.addItem(allDeck.getName()); computerComboBox.addItem(allDeck.getName()); } } // for + break; + case Draft: + humanComboBox.addItem("New Draft"); + Object[] key = deckManager.getDraftDecks().keySet().toArray(); + Arrays.sort(key); + + for (Object aKey : key) { + humanComboBox.addItem(aKey); + } + + for (int i = 0; i < 7; i++) { + computerComboBox.addItem("" + (i + 1)); + } + break; } // not sure if the code below is useful or not // this will select the deck that you previously used @@ -1166,11 +1163,11 @@ public class OldGuiNewGame extends JFrame implements NewConstants, NewConstants. * a {@link java.lang.String} object. * @return an array of {@link forge.deck.Deck} objects. */ - final Deck[] getDecks(final String gameType) { + final Deck[] getDecks(final GameType gameType) { ArrayList list = new ArrayList(); Deck d; - for (Deck allDeck : allDecks) { + for (Deck allDeck : deckManager.getDecks()) { d = allDeck; if (d.getDeckType().equals(gameType)) { @@ -1185,44 +1182,12 @@ public class OldGuiNewGame extends JFrame implements NewConstants, NewConstants. return out; } // getDecks() - /** - *

- * draftRadioButton_actionPerformed. - *

- * - * @param e - * a {@link java.awt.event.ActionEvent} object. - */ + final void draftRadioButtonActionPerformed(final ActionEvent e) { - Constant.Runtime.GameType[0] = Constant.GameType.Draft; - humanComboBox.removeAllItems(); - computerComboBox.removeAllItems(); - - humanComboBox.addItem("New Draft"); - Object[] key = deckManager.getDraftDecks().keySet().toArray(); - Arrays.sort(key); - - for (Object aKey : key) { - humanComboBox.addItem(aKey); - } - - for (int i = 0; i < 7; i++) { - computerComboBox.addItem("" + (i + 1)); - } + Constant.Runtime.gameType = GameType.Draft; + updateDeckComboBoxes(); } - /** - *

- * humanComboBox_actionPerformed. - *

- * - * @param e - * a {@link java.awt.event.ActionEvent} object. - */ - void humanComboBoxActionPerformed(final ActionEvent e) { - - } /* draftRadioButton_actionPerformed() */ - /** * * @author dhudson diff --git a/src/test/java/forge/GuiBoosterDraftTest.java b/src/test/java/forge/GuiBoosterDraftTest.java index 733b1340302..07fb1b7bca3 100644 --- a/src/test/java/forge/GuiBoosterDraftTest.java +++ b/src/test/java/forge/GuiBoosterDraftTest.java @@ -1,6 +1,7 @@ package forge; import forge.deck.Deck; +import forge.game.GameType; import forge.game.limited.BoosterDraft_1; import forge.gui.deckeditor.DeckEditorDraft; @@ -20,8 +21,8 @@ public class GuiBoosterDraftTest { */ @Test(groups = {"UnitTest", "fast"}) public void GuiBoosterDraftTest1() { - Constant.Runtime.GameType[0] = Constant.GameType.Draft; - Constant.Runtime.HumanDeck[0] = new Deck(Constant.GameType.Sealed); + Constant.Runtime.gameType = GameType.Draft; + Constant.Runtime.HumanDeck[0] = new Deck(GameType.Sealed); DeckEditorDraft g = new DeckEditorDraft(); g.showGui(new BoosterDraft_1());