Add ability to generate proxies from deck editor

This commit is contained in:
jendave
2011-10-05 23:01:03 +00:00
parent 03c0275fbb
commit a84e93cf16
5 changed files with 717 additions and 295 deletions

19
pom.xml
View File

@@ -198,7 +198,7 @@
<plugin>
<groupId>com.google.code.maven-replacer-plugin</groupId>
<artifactId>maven-replacer-plugin</artifactId>
<version>1.3.8</version>
<version>1.3.9</version>
<executions>
<execution>
<phase>package</phase>
@@ -275,7 +275,7 @@
<dependency>
<groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-ftp</artifactId>
<version>1.0</version>
<version>2.0</version>
</dependency>
</dependencies>
</plugin>
@@ -291,7 +291,7 @@
<dependency>
<groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-ftp</artifactId>
<version>1.0</version>
<version>2.0</version>
</dependency>
</dependencies>
</plugin>
@@ -535,17 +535,17 @@
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>r09</version>
<version>10.0</version>
</dependency>
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.3.1</version>
<version>1.4.1</version>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.1.1</version>
<version>6.2.1</version>
<scope>test</scope>
</dependency>
<dependency>
@@ -621,7 +621,12 @@
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.1</version>
<version>1.4.4</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.18</version>
</dependency>
</dependencies>

View File

@@ -1,6 +1,37 @@
package forge.deck;
import static java.lang.Integer.parseInt;
import static java.lang.String.format;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.NoSuchElementException;
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 freemarker.template.TemplateException;
import freemarker.template.Template;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import forge.Card;
import forge.FileUtil;
import forge.PlayerType;
import forge.error.ErrorViewer;
@@ -11,46 +42,36 @@ import forge.item.ItemPoolView;
import forge.properties.ForgeProps;
import forge.properties.NewConstants;
import java.io.*;
import java.util.*;
import java.util.Map.Entry;
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;
//reads and writeDeck Deck objects
/**
* <p>DeckManager class.</p>
*
* <p>
* DeckManager class.
* </p>
*
* @author Forge
* @version $Id$
*/
public class DeckManager {
/** Constant <code>BDKFileFilter</code> */
private static FilenameFilter BDKFileFilter = new FilenameFilter() {
public boolean accept(File dir, String name) {
/** Constant <code>BDKFileFilter</code>. */
private static FilenameFilter bdkFileFilter = new FilenameFilter() {
public boolean accept(final File dir, final String name) {
return name.endsWith(".bdk");
}
};
/** Constant <code>DCKFileFilter</code> */
public static final FilenameFilter DCKFileFilter = new FilenameFilter() {
public boolean accept(File dir, String name) {
/** Constant <code>DCKFileFilter</code>. */
public static final FilenameFilter DCK_FILE_FILTER = new FilenameFilter() {
public boolean accept(final File dir, final String name) {
return name.endsWith(".dck");
}
};
public static final FileFilter dckFilter = new FileFilter() {
/**
*
*/
public static final FileFilter DCK_FILTER = new FileFilter() {
@Override
public boolean accept(File f) {
public boolean accept(final File f) {
return f.getName().endsWith(".dck") || f.isDirectory();
}
@@ -60,6 +81,21 @@ public class DeckManager {
}
};
/**
*
*/
public static final FileFilter HTML_FILTER = new FileFilter() {
@Override
public boolean accept(final File f) {
return f.getName().endsWith(".html") || f.isDirectory();
}
@Override
public String getDescription() {
return "Simple Deck File .html";
}
};
private static final String NAME = "Name";
private static final String DECK_TYPE = "Deck Type";
private static final String COMMENT = "Comment";
@@ -67,15 +103,18 @@ public class DeckManager {
private static final String CSTM_POOL = "Custom Pool";
private File deckDir;
Map<String, Deck> deckMap;
Map<String, Deck[]> draftMap;
private Map<String, Deck> deckMap;
private Map<String, Deck[]> draftMap;
/**
* <p>Constructor for DeckManager.</p>
*
* @param deckDir a {@link java.io.File} object.
* <p>
* Constructor for DeckManager.
* </p>
*
* @param deckDir
* a {@link java.io.File} object.
*/
public DeckManager(File deckDir) {
public DeckManager(final File deckDir) {
if (deckDir == null) {
throw new IllegalArgumentException("No deck directory specified");
}
@@ -99,96 +138,115 @@ public class DeckManager {
}
}
/**
* <p>isUnique.</p>
*
* @param deckName a {@link java.lang.String} object.
* <p>
* isUnique.
* </p>
*
* @param deckName
* a {@link java.lang.String} object.
* @return a boolean.
*/
public boolean isUnique(String deckName) {
public final boolean isUnique(final String deckName) {
return !deckMap.containsKey(deckName);
}
/**
* <p>isUniqueDraft.</p>
*
* @param deckName a {@link java.lang.String} object.
* <p>
* isUniqueDraft.
* </p>
*
* @param deckName
* a {@link java.lang.String} object.
* @return a boolean.
*/
public boolean isUniqueDraft(String deckName) {
public final boolean isUniqueDraft(final String deckName) {
return !draftMap.keySet().contains(deckName);
}
/**
* <p>getDeck.</p>
*
* @param deckName a {@link java.lang.String} object.
* <p>
* getDeck.
* </p>
*
* @param deckName
* a {@link java.lang.String} object.
* @return a {@link forge.deck.Deck} object.
*/
public Deck getDeck(String deckName) {
public final Deck getDeck(final String deckName) {
return deckMap.get(deckName);
}
/**
* <p>addDeck.</p>
*
* @param deck a {@link forge.deck.Deck} object.
* <p>
* addDeck.
* </p>
*
* @param deck
* a {@link forge.deck.Deck} object.
*/
public void addDeck(Deck deck) {
public final void addDeck(final Deck deck) {
if (deck.getDeckType().equals(GameType.Draft)) {
throw new RuntimeException(
"DeckManager : addDeck() error, deck type is Draft");
throw new RuntimeException("DeckManager : addDeck() error, deck type is Draft");
}
deckMap.put(deck.getName(), deck);
}
/**
* <p>deleteDeck.</p>
*
* @param deckName a {@link java.lang.String} object.
* <p>
* deleteDeck.
* </p>
*
* @param deckName
* a {@link java.lang.String} object.
*/
public void deleteDeck(String deckName) {
public final void deleteDeck(final String deckName) {
deckMap.remove(deckName);
}
/**
* <p>getDraftDeck.</p>
*
* @param deckName a {@link java.lang.String} object.
* <p>
* getDraftDeck.
* </p>
*
* @param deckName
* a {@link java.lang.String} object.
* @return an array of {@link forge.deck.Deck} objects.
*/
public Deck[] getDraftDeck(String deckName) {
public final Deck[] getDraftDeck(final String deckName) {
if (!draftMap.containsKey(deckName)) {
throw new RuntimeException(
"DeckManager : getDraftDeck() error, deck name not found - " + deckName);
throw new RuntimeException("DeckManager : getDraftDeck() error, deck name not found - " + deckName);
}
return draftMap.get(deckName);
}
/**
* <p>addDraftDeck.</p>
*
* @param deck an array of {@link forge.deck.Deck} objects.
* <p>
* addDraftDeck.
* </p>
*
* @param deck
* an array of {@link forge.deck.Deck} objects.
*/
public void addDraftDeck(Deck[] deck) {
public final void addDraftDeck(final Deck[] deck) {
checkDraftDeck(deck);
draftMap.put(deck[0].toString(), deck);
}
/**
* <p>deleteDraftDeck.</p>
*
* @param deckName a {@link java.lang.String} object.
* <p>
* deleteDraftDeck.
* </p>
*
* @param deckName
* a {@link java.lang.String} object.
*/
public void deleteDraftDeck(String deckName) {
public final void deleteDraftDeck(final String deckName) {
if (!draftMap.containsKey(deckName)) {
throw new RuntimeException(
"DeckManager : deleteDraftDeck() error, deck name not found - " + deckName);
throw new RuntimeException("DeckManager : deleteDraftDeck() error, deck name not found - " + deckName);
}
draftMap.remove(deckName);
@@ -198,32 +256,53 @@ public class DeckManager {
}
/**
* <p>checkDraftDeck.</p>
*
* @param deck an array of {@link forge.deck.Deck} objects.
* <p>
* checkDraftDeck.
* </p>
*
* @param deck
* an array of {@link forge.deck.Deck} objects.
*/
private void checkDraftDeck(Deck[] deck) {
private void checkDraftDeck(final Deck[] deck) {
if (deck == null || deck.length != 8 || deck[0].getName().equals("")
|| (!deck[0].getDeckType().equals(GameType.Draft))) {
|| (!deck[0].getDeckType().equals(GameType.Draft)))
{
throw new RuntimeException("DeckManager : checkDraftDeck() error, invalid deck");
}
}
public Collection<Deck> getDecks() {
/**
*
* Get Decks.
*
* @return a Collection<Deck>
*/
public final Collection<Deck> getDecks() {
return deckMap.values();
}
public Map<String, Deck[]> getDraftDecks() {
/**
*
* Get draft decks.
*
* @return a Map<String, Deck[]>
*/
public final Map<String, Deck[]> getDraftDecks() {
return new HashMap<String, Deck[]>(draftMap);
}
public ArrayList<String> getDeckNames(final GameType deckType) {
/**
*
* Get names of decks.
*
* @param deckType
* a GameType
* @return a ArrayList<String>
*/
public final ArrayList<String> getDeckNames(final GameType deckType) {
ArrayList<String> list = new ArrayList<String>();
//only get decks according to the OldGuiNewGame screen option
// only get decks according to the OldGuiNewGame screen option
if (deckType.equals(GameType.Draft)) {
for (String s : getDraftDecks().keySet()) {
list.add(s);
@@ -238,19 +317,21 @@ public class DeckManager {
Collections.sort(list);
return list;
}
}
/**
* <p>readAllDecks.</p>
* <p>
* readAllDecks.
* </p>
*/
public void readAllDecks() {
public final void readAllDecks() {
deckMap.clear();
draftMap.clear();
File[] files;
List<String> decksThatFailedToLoad = new ArrayList<String>();
files = deckDir.listFiles(DCKFileFilter);
files = deckDir.listFiles(DCK_FILE_FILTER);
for (File file : files) {
try {
Deck newDeck = readDeck(file);
@@ -262,45 +343,49 @@ public class DeckManager {
}
if (!decksThatFailedToLoad.isEmpty()) {
JOptionPane.showMessageDialog(null, StringUtils.join(decksThatFailedToLoad, System.getProperty("line.separator")),
"Some of your decks were not loaded.", JOptionPane.WARNING_MESSAGE);
JOptionPane.showMessageDialog(null,
StringUtils.join(decksThatFailedToLoad, System.getProperty("line.separator")),
"Some of your decks were not loaded.", JOptionPane.WARNING_MESSAGE);
}
files = deckDir.listFiles(BDKFileFilter);
files = deckDir.listFiles(bdkFileFilter);
for (File file : files) {
Deck[] d = new Deck[8];
boolean gotError = false;
for (int i = 0; i < d.length; i++) {
d[i] = readDeck(new File(file, i + ".dck"));
if(d[i] == null) {
if (d[i] == null) {
gotError = true;
break;
}
}
if (!gotError)
{
if (!gotError) {
draftMap.put(d[0].getName(), d);
}
}
}
/**
* <p>readDeck.</p>
*
* @param deckFile a {@link java.io.File} object.
* <p>
* readDeck.
* </p>
*
* @param deckFile
* a {@link java.io.File} object.
* @return a {@link forge.deck.Deck} object.
*/
public static Deck readDeck(File deckFile) {
List<String> lines = FileUtil.readFile(deckFile);
if (lines.isEmpty()) { return null; }
public static Deck readDeck(final File deckFile) {
List<String> lines = FileUtil.readFile(deckFile);
if (lines.isEmpty()) {
return null;
}
Deck d = new Deck();
String firstLine = lines.get(0);
String firstLine = lines.get(0);
if (!firstLine.startsWith("[") || firstLine.equalsIgnoreCase("[general]")) {
readDeckOldMetadata(lines.iterator(), d);
} else {
@@ -311,47 +396,50 @@ public class DeckManager {
return d;
}
private static Iterator<String> findSection(final Iterable<String> lines, final String sectionName)
{
private static Iterator<String> findSection(final Iterable<String> lines, final String sectionName) {
Iterator<String> lineIterator = lines.iterator();
String toSearch = String.format("[%s]", sectionName);
while(lineIterator.hasNext()) {
if (toSearch.equalsIgnoreCase(lineIterator.next())) { break; }
while (lineIterator.hasNext()) {
if (toSearch.equalsIgnoreCase(lineIterator.next())) {
break;
}
}
return lineIterator;
}
private static void readDeckMetadata(final Iterator<String> lineIterator, final Deck d)
{
private static void readDeckMetadata(final Iterator<String> lineIterator, final Deck d) {
while (lineIterator.hasNext()) {
String line = lineIterator.next();
if( line.startsWith("[") ) { break; }
if (line.startsWith("[")) {
break;
}
String[] linedata = line.split("=", 2);
String field = linedata[0].toLowerCase();
String value = "";
if (linedata.length > 1)
if (linedata.length > 1) {
value = linedata[1];
}
if (NAME.equalsIgnoreCase(field)) {
d.setName(value);
} else if (COMMENT.equalsIgnoreCase(field)) {
d.setComment(value);
} else if (DECK_TYPE.equalsIgnoreCase(field)) {
d.setDeckType(GameType.smartValueOf(value));
} else if (CSTM_POOL.equalsIgnoreCase(field)) {
d.setCustomPool(value.equalsIgnoreCase("true"));
} else if (PLAYER.equalsIgnoreCase(field)) {
if ("human".equalsIgnoreCase(value)) {
d.setPlayerType(PlayerType.HUMAN);
} else {
d.setPlayerType(PlayerType.COMPUTER);
}
@@ -360,18 +448,21 @@ public class DeckManager {
}
/**
* <p>readDeckOld.</p>
*
* @param iterator a {@link java.util.ListIterator} object.
* <p>
* readDeckOld.
* </p>
*
* @param iterator
* a {@link java.util.ListIterator} object.
* @return a {@link forge.deck.Deck} object.
*/
private static void readDeckOldMetadata(final Iterator<String> iterator, Deck d) {
private static void readDeckOldMetadata(final Iterator<String> iterator, final Deck d) {
String line;
//readDeck name
// readDeck name
String name = iterator.next();
//readDeck comments
// readDeck comments
String comment = null;
while (iterator.hasNext() && (line = iterator.next()) != null && !line.equals("[general]")) {
if (comment == null) {
@@ -381,9 +472,9 @@ public class DeckManager {
}
}
//readDeck deck type
GameType deckType = iterator.hasNext() ? GameType.smartValueOf(iterator.next()) : GameType.Constructed;
// readDeck deck type
GameType deckType = iterator.hasNext() ? GameType.smartValueOf(iterator.next()) : GameType.Constructed;
d.setName(name);
d.setComment(comment);
@@ -397,13 +488,17 @@ public class DeckManager {
while (lineIterator.hasNext()) {
String line = lineIterator.next();
if (line.startsWith("[")) { break; } // there comes another section
if (line.startsWith("[")) {
break;
} // there comes another section
Matcher m = p.matcher(line.trim());
m.matches();
String sCnt = m.group(2);
String cardName = m.group(3);
if (StringUtils.isBlank(cardName)) { continue; }
if (StringUtils.isBlank(cardName)) {
continue;
}
int count = sCnt == null ? 1 : parseInt(sCnt);
for (int i = 0; i < count; i++) {
@@ -413,14 +508,21 @@ public class DeckManager {
return result;
}
private static String deriveFileName(String deckName) {
//skips all but the listed characters
private static String deriveFileName(final 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)
{
// only accepts numbers, letters or dashes up to 20 characters in length
/**
*
* Clean deck name.
*
* @param in
* a String
* @return a String
*/
public static String cleanDeckName(final String in) {
char[] c = in.toCharArray();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < c.length && i < 20; i++) {
@@ -431,24 +533,45 @@ public class DeckManager {
return sb.toString();
}
public static File makeFileName(String deckName, GameType deckType)
{
/**
*
* Make file name.
*
* @param deckName
* a String
* @param deckType
* a GameType
* @return a File
*/
public static File makeFileName(final String deckName, final GameType deckType) {
File path = ForgeProps.getFile(NewConstants.NEW_DECKS);
if (deckType == GameType.Draft)
if (deckType == GameType.Draft) {
return new File(path, deriveFileName(deckName) + ".bdk");
else
} else {
return new File(path, deriveFileName(deckName) + ".dck");
}
}
public static File makeFileName(Deck deck)
{
/**
*
* Make file name.
*
* @param deck
* a Deck
* @return a File
*/
public static File makeFileName(final Deck deck) {
return makeFileName(deck.getName(), deck.getDeckType());
}
/**
* <p>writeAllDecks.</p>
*
* Write draft Decks.
*
* @param drafts
* a Deck[]
*/
public static void writeDraftDecks(Deck[] drafts) {
public static void writeDraftDecks(final Deck[] drafts) {
try {
File f = makeFileName(drafts[0]);
f.mkdir();
@@ -458,7 +581,6 @@ public class DeckManager {
out.close();
}
} catch (IOException ex) {
ErrorViewer.showError(ex);
throw new RuntimeException("DeckManager : writeDeck() error, " + ex.getMessage());
@@ -466,11 +588,16 @@ public class DeckManager {
}
/**
* <p>writeDeck.</p>
*
* @param d a {@link forge.deck.Deck} object.
* @param out a {@link java.io.BufferedWriter} object.
* @throws java.io.IOException if any.
* <p>
* writeDeck.
* </p>
*
* @param d
* a {@link forge.deck.Deck} object.
* @param out
* a {@link java.io.BufferedWriter} object.
* @throws java.io.IOException
* if any.
*/
private static void writeDeck(final Deck d, final BufferedWriter out) throws IOException {
out.write(format("[metadata]%n"));
@@ -478,10 +605,16 @@ public class DeckManager {
out.write(format("%s=%s%n", NAME, d.getName().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())); }
if (d.isCustomPool()) { out.write(format("%s=%s%n", CSTM_POOL, "true")); }
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()));
}
if (d.isCustomPool()) {
out.write(format("%s=%s%n", CSTM_POOL, "true"));
}
out.write(format("%s%n", "[main]"));
writeCardPool(d.getMain(), out);
@@ -490,8 +623,57 @@ public class DeckManager {
writeCardPool(d.getSideboard(), out);
}
private static void writeCardPool(final ItemPoolView<CardPrinted> pool, final BufferedWriter out) throws IOException
{
/**
* <p>
* writeDeck.
* </p>
*
* @param d
* a {@link forge.deck.Deck} object.
* @param out
* a {@link java.io.BufferedWriter} object.
* @throws java.io.IOException
* if any.
*/
private static void writeDeckHtml(final Deck d, final BufferedWriter out) throws IOException {
Template temp = null;
/* Create and adjust the configuration */
Configuration cfg = new Configuration();
try {
cfg.setClassForTemplateLoading(d.getClass(), "/");
cfg.setObjectWrapper(new DefaultObjectWrapper());
/* ------------------------------------------------------------------- */
/* You usually do these for many times in the application life-cycle: */
/* Get or create a template */
temp = cfg.getTemplate("proxy-template.ftl");
/* Create a data-model */
Map root = new HashMap();
root.put("title", d.getName());
List list = new ArrayList();
for (Card card : d.getMain().toForgeCardList().toArray()) {
//System.out.println(card.getSets().get(0).URL);
list.add(card.getSets().get(0).URL);
}
root.put("urls", list);
/* Merge data-model with template */
StringWriter sw = new StringWriter();
temp.process(root, out);
out.flush();
} catch (IOException e) {
System.out.println(e.toString());
} catch (TemplateException e) {
System.out.println(e.toString());
}
}
private static void writeCardPool(final ItemPoolView<CardPrinted> pool,
final BufferedWriter out) throws IOException {
List<Entry<CardPrinted, Integer>> main2sort = pool.getOrderedList();
Collections.sort(main2sort, TableSorter.byNameThenSet);
for (Entry<CardPrinted, Integer> e : main2sort) {
@@ -505,14 +687,17 @@ public class DeckManager {
}
}
/**
* <p>writeDeck.</p>
*
* @param d a {@link forge.deck.Deck} object.
* @param f a {@link java.io.File} object.
* <p>
* writeDeck.
* </p>
*
* @param d
* a {@link forge.deck.Deck} object.
* @param f
* a {@link java.io.File} object.
*/
public static void writeDeck(Deck d, File f) {
public static void writeDeck(final Deck d, final File f) {
try {
BufferedWriter writer = new BufferedWriter(new FileWriter(f));
writeDeck(d, writer);
@@ -523,4 +708,23 @@ public class DeckManager {
}
/**
* <p>
* Write deck to HTML.
* </p>
*
* @param d
* a {@link forge.deck.Deck} object.
* @param f
* a {@link java.io.File} object.
*/
public static void writeDeckHtml(final Deck d, final File f) {
try {
BufferedWriter writer = new BufferedWriter(new FileWriter(f));
writeDeckHtml(d, writer);
writer.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}

View File

@@ -1,5 +1,23 @@
package forge.gui.deckeditor;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.channels.FileChannel;
import java.util.ArrayList;
import javax.swing.JFileChooser;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import org.apache.commons.lang3.StringUtils;
import forge.Card;
import forge.CardList;
import forge.Command;
@@ -14,34 +32,21 @@ import forge.item.CardPrinted;
import forge.item.ItemPool;
import forge.properties.ForgeProps;
import forge.properties.NewConstants;
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.nio.channels.FileChannel;
import java.util.ArrayList;
import javax.swing.JFileChooser;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
/**
* <p>Gui_DeckEditor_Menu class.</p>
*
* <p>
* Gui_DeckEditor_Menu class.
* </p>
*
* @author Forge
* @version $Id$
*/
public final class DeckEditorCommonMenu extends JMenuBar implements NewConstants {
/** Constant <code>serialVersionUID=-4037993759604768755L</code> */
/** Constant <code>serialVersionUID=-4037993759604768755L</code>. */
private static final long serialVersionUID = -4037993759604768755L;
/** Constant <code>previousDirectory</code> */
/** Constant <code>previousDirectory</code>. */
private static File previousDirectory = null;
private DeckManager deckManager;
@@ -53,24 +58,34 @@ public final class DeckEditorCommonMenu extends JMenuBar implements NewConstants
private Command exitCommand;
public DeckEditorCommonMenu(final DeckDisplay in_display, final DeckManager dckManager, final Command exit) {
deckDisplay = in_display;
/**
*
* Menu for Deck Editor.
*
* @param inDisplay
* a DeckDisplay
* @param dckManager
* a DeckManager
* @param exit
* a Command
*/
public DeckEditorCommonMenu(final DeckDisplay inDisplay, final DeckManager dckManager, final Command exit) {
deckDisplay = inDisplay;
exitCommand = exit;
deckManager = dckManager;
//this is added just to make save() and saveAs() work ok
//when first started up, just a silly patch
// this is added just to make save() and saveAs() work ok
// when first started up, just a silly patch
setDeckData("", true);
setupMenu();
setupSortMenu();
}
/**
* <p>setupSortMenu.</p>
* <p>
* setupSortMenu.
* </p>
*/
private void setupSortMenu() {
JMenuItem name = new JMenuItem("Card Name");
@@ -96,11 +111,12 @@ public final class DeckEditorCommonMenu extends JMenuBar implements NewConstants
}
});
// 0 1 2 3 4 5 6
//private String column[] = {"Qty", "Name", "Cost", "Color", "Type", "Stats", "Rarity"};
// 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) {
((DeckEditorCommon) deckDisplay).getTopTableModel().sort(4).sort(3).sort(2);
((DeckEditorCommon) deckDisplay).getTopTableModel().sort(4).sort(3).sort(2);
}
});
@@ -124,15 +140,22 @@ public final class DeckEditorCommonMenu extends JMenuBar implements NewConstants
rarity.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent ev) {
//sort by cost, type, color, rarity
// sort by cost, type, color, rarity
((DeckEditorCommon) deckDisplay).getTopTableModel().sort(2).sort(4).sort(3).sort(6);
}
});
} //setupSortMenu()
} // setupSortMenu()
/**
*
*
* @param careAboutOldDeck
* a boolean
*/
public void newConstructed(final boolean careAboutOldDeck) {
if (careAboutOldDeck && !canLeaveCurrentDeck()) { return; }
if (careAboutOldDeck && !canLeaveCurrentDeck()) {
return;
}
setDeckData("", true);
@@ -140,7 +163,9 @@ public final class DeckEditorCommonMenu extends JMenuBar implements NewConstants
}
private void newRandomConstructed() {
if (!canLeaveCurrentDeck()) { return; }
if (!canLeaveCurrentDeck()) {
return;
}
setDeckData("", false);
@@ -148,7 +173,9 @@ public final class DeckEditorCommonMenu extends JMenuBar implements NewConstants
CardList random = new CardList(forge.AllZone.getCardFactory().getRandomCombinationWithoutRepetition(15 * 5));
ItemPool<CardPrinted> cpRandom = new ItemPool<CardPrinted>(CardPrinted.class);
for (Card c : random) { cpRandom.add(CardDb.instance().getCard(c)); }
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"));
@@ -160,22 +187,25 @@ public final class DeckEditorCommonMenu extends JMenuBar implements NewConstants
}
private void newGenerateConstructed() {
if (!canLeaveCurrentDeck()) { return; }
if (!canLeaveCurrentDeck()) {
return;
}
setDeckData("", false);
GenerateConstructedDeck gen = new GenerateConstructedDeck();
ItemPool<CardPrinted> generated = new ItemPool<CardPrinted>(CardPrinted.class);
for (Card c : gen.generateDeck()) { generated.add(CardDb.instance().getCard(c)); }
for (Card c : gen.generateDeck()) {
generated.add(CardDb.instance().getCard(c));
}
deckDisplay.setDeck(null, generated, GameType.Constructed);
}
private File getImportFilename() {
JFileChooser chooser = new JFileChooser(previousDirectory);
chooser.addChoosableFileFilter(DeckManager.dckFilter);
chooser.addChoosableFileFilter(DeckManager.DCK_FILTER);
int returnVal = chooser.showOpenDialog(null);
if (returnVal == JFileChooser.APPROVE_OPTION) {
@@ -184,8 +214,7 @@ public final class DeckEditorCommonMenu extends JMenuBar implements NewConstants
return file;
}
return null;
} //openFileDialog()
} // openFileDialog()
private void importDeck() {
File file = getImportFilename();
@@ -218,11 +247,15 @@ public final class DeckEditorCommonMenu extends JMenuBar implements NewConstants
}
/**
* <p>exportDeck.</p>
* <p>
* exportDeck.
* </p>
*/
private void exportDeck() {
File filename = getExportFilename();
if (filename == null) { return; }
if (filename == null) {
return;
}
Deck deck = getDeck();
try {
@@ -233,12 +266,11 @@ public final class DeckEditorCommonMenu extends JMenuBar implements NewConstants
}
}
private File getExportFilename() {
JFileChooser save = new JFileChooser(previousDirectory);
save.setDialogTitle("Export Deck Filename");
save.setDialogType(JFileChooser.SAVE_DIALOG);
save.setFileFilter(DeckManager.dckFilter);
save.setFileFilter(DeckManager.DCK_FILTER);
if (save.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) {
File file = save.getSelectedFile();
@@ -251,18 +283,68 @@ public final class DeckEditorCommonMenu extends JMenuBar implements NewConstants
return null;
}
private void openDeck(GameType gameType) {
if (!canLeaveCurrentDeck()) { return; }
String name = getUserInput_OpenDeck(gameType);
/**
* <p>
* Generate Proxy for a Deck.
* </p>
*/
private void generateProxies() {
File filename = getProxiesFilename();
if (filename == null) {
return;
}
if (StringUtils.isBlank(name)) { return; }
Deck deck = getDeck();
try {
DeckManager.writeDeckHtml(deck, filename);
} catch (Exception ex) {
ErrorViewer.showError(ex);
throw new RuntimeException("Gui_DeckEditor_Menu : printProxies() error, " + ex);
}
}
private File getProxiesFilename() {
JFileChooser save = new JFileChooser(previousDirectory);
save.setDialogTitle("Proxy HTML Filename");
save.setDialogType(JFileChooser.SAVE_DIALOG);
save.setFileFilter(DeckManager.HTML_FILTER);
if (save.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) {
File file = save.getSelectedFile();
String check = file.getAbsolutePath();
previousDirectory = file.getParentFile();
return check.endsWith(".html") ? file : new File(check + ".html");
}
return null;
}
private void openDeck(final GameType gameType) {
if (!canLeaveCurrentDeck()) {
return;
}
String name = getUserInputOpenDeck(gameType);
if (StringUtils.isBlank(name)) {
return;
}
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) {
/**
*
* showDeck.
*
* @param deck
* a Deck
* @param gameType
* a GameType
*/
public void showDeck(final Deck deck, final GameType gameType) {
setDeckData(deck.getName(), true);
if (gameType.isLimited()) {
deckDisplay.setDeck(deck.getSideboard(), deck.getMain(), gameType);
@@ -270,8 +352,6 @@ public final class DeckEditorCommonMenu extends JMenuBar implements NewConstants
deckDisplay.setDeck(null, deck.getMain(), gameType);
}
}
private void save() {
@@ -279,16 +359,16 @@ public final class DeckEditorCommonMenu extends JMenuBar implements NewConstants
saveAs();
return;
}
Deck deck = getDeck();
if (deckDisplay.getGameType().equals(GameType.Draft)) {
setDeckData(currentDeckName, true);
//write booster deck
// write booster deck
Deck[] all = deckManager.getDraftDeck(currentDeckName);
all[0] = deck;
deckManager.addDraftDeck(all);
DeckManager.writeDraftDecks(all);
} else { //constructed or sealed
} else { // constructed or sealed
setDeckData(currentDeckName, true);
deckManager.addDeck(deck);
DeckManager.writeDeck(deck, DeckManager.makeFileName(deck));
@@ -299,12 +379,14 @@ public final class DeckEditorCommonMenu extends JMenuBar implements NewConstants
private void saveAs() {
String name = getDeckNameFromDialog();
if (name.equals("")) { return; }
if (name.equals("")) {
return;
}
setDeckData(name, true);
Deck deck = getDeck();
if (deckDisplay.getGameType().equals(GameType.Draft)) {
//MUST copy array
// MUST copy array
Deck[] read = deckManager.getDraftDeck(currentDeckName);
Deck[] all = new Deck[read.length];
@@ -313,21 +395,24 @@ public final class DeckEditorCommonMenu extends JMenuBar implements NewConstants
all[0] = deck;
deckManager.addDraftDeck(all);
DeckManager.writeDraftDecks(all);
} else {//constructed and sealed
} else { // constructed and sealed
deckManager.addDeck(deck);
DeckManager.writeDeck(deck, DeckManager.makeFileName(deck));
}
isDeckSaved = true;
}
private void delete() {
if (StringUtils.isBlank(currentDeckName)) { 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 (deckDisplay.getGameType().equals(GameType.Draft)) {
deckManager.deleteDraftDeck(currentDeckName);
@@ -339,18 +424,32 @@ public final class DeckEditorCommonMenu extends JMenuBar implements NewConstants
deckDisplay.setDeck(null, null, deckDisplay.getGameType());
}
public final void close() {
if (!canLeaveCurrentDeck()) { return; }
/**
*
* close window.
*/
public void close() {
if (!canLeaveCurrentDeck()) {
return;
}
exitCommand.execute();
}
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; }
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);
@@ -371,31 +470,54 @@ public final class DeckEditorCommonMenu extends JMenuBar implements NewConstants
deckDisplay.setTitle("Deck Editor : " + currentDeckName);
}
public String getDeckName() { return currentDeckName; }
public boolean isSaved() { return isDeckSaved; }
/**
*
* Get Deck Name.
*
* @return a String
*/
public String getDeckName() {
return currentDeckName;
}
/**
* <p>getUserInput_GetDeckName.</p>
*
*
* Is Saved.
*
* @return a boolean
*/
public boolean isSaved() {
return isDeckSaved;
}
/**
* <p>
* getUserInput_GetDeckName.
* </p>
*
* @return a {@link java.lang.String} object.
*/
private String getDeckNameFromDialog() {
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; }
if (isGoodName) {
return deckName;
}
JOptionPane.showMessageDialog(null, "Please pick another deck name, another deck currently has that name.");
return getDeckNameFromDialog();
}
private String getUserInput_OpenDeck(final GameType deckType) {
private String getUserInputOpenDeck(final GameType deckType) {
ArrayList<String> choices = deckManager.getDeckNames(deckType);
if (choices.isEmpty()) {
JOptionPane.showMessageDialog(null, "No decks found", "Open Deck", JOptionPane.PLAIN_MESSAGE);
@@ -406,9 +528,12 @@ public final class DeckEditorCommonMenu extends JMenuBar implements NewConstants
return o == null ? null : o.toString();
}
// deck.setName(currentDeckName);
/**
*
* Notify of a Deck Change.
*/
public void notifyDeckChange() {
isDeckSaved = false;
}
@@ -416,24 +541,22 @@ public final class DeckEditorCommonMenu extends JMenuBar implements NewConstants
private void setupMenu() {
JMenuItem newConstructed = new JMenuItem("New Deck - Constructed");
//JMenuItem newSealed = new JMenuItem("New Deck - Sealed");
//JMenuItem newDraft = new JMenuItem("New Deck - Draft");
// JMenuItem newSealed = new JMenuItem("New Deck - Sealed");
// JMenuItem newDraft = new JMenuItem("New Deck - Draft");
JMenuItem newRandomConstructed = new JMenuItem("New Deck - Generate Random Constructed Cardpool");
JMenuItem newGenerateConstructed = new JMenuItem("New Deck - Generate Constructed Deck");
JMenuItem importDeck = new JMenuItem("Import Deck");
JMenuItem exportDeck = new JMenuItem("Export Deck");
// JMenuItem downloadDeck = new JMenuItem("Download Deck");
JMenuItem openConstructed = new JMenuItem("Open Deck - Constructed");
JMenuItem openSealed = new JMenuItem("Open Deck - Sealed");
JMenuItem openDraft = new JMenuItem("Open Deck - Draft");
//newDraftItem = newDraft;
//newDraftItem.setEnabled(false);
// newDraftItem = newDraft;
// newDraftItem.setEnabled(false);
JMenuItem save = new JMenuItem("Save");
JMenuItem saveAs = new JMenuItem("Save As");
@@ -443,8 +566,8 @@ public final class DeckEditorCommonMenu extends JMenuBar implements NewConstants
JMenu fileMenu = new JMenu("Deck Actions");
fileMenu.add(newConstructed);
//fileMenu.add(newSealed);
//fileMenu.add(newDraft);
// fileMenu.add(newSealed);
// fileMenu.add(newDraft);
fileMenu.addSeparator();
fileMenu.add(openConstructed);
@@ -454,7 +577,25 @@ public final class DeckEditorCommonMenu extends JMenuBar implements NewConstants
fileMenu.add(importDeck);
fileMenu.add(exportDeck);
//fileMenu.add(downloadDeck);
JMenuItem generateProxies = new JMenuItem("Generate Proxies...");
fileMenu.add(generateProxies);
generateProxies.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent ev) {
try {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
generateProxies();
}
});
} catch (Exception ex) {
ErrorViewer.showError(ex);
throw new RuntimeException("Gui_DeckEditor_Menu : generateProxies() error - " + ex);
}
}
});
// fileMenu.add(downloadDeck);
fileMenu.addSeparator();
fileMenu.add(newRandomConstructed);
@@ -470,7 +611,7 @@ public final class DeckEditorCommonMenu extends JMenuBar implements NewConstants
this.add(fileMenu);
//add listeners
// add listeners
exportDeck.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent ev) {
try {
@@ -486,7 +627,6 @@ public final class DeckEditorCommonMenu extends JMenuBar implements NewConstants
}
});
importDeck.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent ev) {
try {
@@ -502,21 +642,15 @@ public final class DeckEditorCommonMenu extends JMenuBar implements NewConstants
}
});
/* downloadDeck.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent ev) {
try {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
downloadDeck();
}
});
} catch (Exception ex) {
ErrorViewer.showError(ex);
throw new RuntimeException("Gui_DeckEditor_Menu : downloadDeck() error - " + ex);
}
}
});
*/
/*
* downloadDeck.addActionListener(new ActionListener() { public void
* actionPerformed(final ActionEvent ev) { try {
* SwingUtilities.invokeLater(new Runnable() { public void run() {
* downloadDeck(); } }); } catch (Exception ex) {
* ErrorViewer.showError(ex); throw new
* RuntimeException("Gui_DeckEditor_Menu : downloadDeck() error - " +
* ex); } } });
*/
newConstructed.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent ev) {
try {
@@ -532,7 +666,6 @@ public final class DeckEditorCommonMenu extends JMenuBar implements NewConstants
}
});
newRandomConstructed.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent ev) {
try {
@@ -548,7 +681,6 @@ public final class DeckEditorCommonMenu extends JMenuBar implements NewConstants
}
});
newGenerateConstructed.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent ev) {
try {
@@ -668,5 +800,5 @@ public final class DeckEditorCommonMenu extends JMenuBar implements NewConstants
}
}
});
}//setupMenu()
} // setupMenu()
}

View File

@@ -7,18 +7,40 @@ import java.util.Map.Entry;
/**
* <p>CardPool class.</p>
* Represents a list of cards with amount of each
*
*/
public final class ItemPool<T extends InventoryItem> extends ItemPoolView<T> {
// Constructors here
/**
*
* ItemPool Constructor.
* @param cls a T
*/
public ItemPool(final Class<T> cls) { super(cls); }
/**
*
* ItemPool Constructor.
* @param names a String
* @param cls a T
*/
@SuppressWarnings("unchecked") // conversion here must be safe
public ItemPool(final Iterable<String> names, final Class<T> cls) { super(cls); addAllCards((Iterable<T>) CardDb.instance().getCards(names)); }
public ItemPool(final Iterable<String> names, final Class<T> cls) {
super(cls);
addAllCards((Iterable<T>) CardDb.instance().getCards(names));
}
/**
*
* createFrom method.
* @param from a Tin
* @param clsHint a Tout
* @return InventoryItem
*/
@SuppressWarnings("unchecked")
public static <Tin extends InventoryItem, Tout extends InventoryItem> ItemPool<Tout>
createFrom(ItemPoolView<Tin> from, Class<Tout> clsHint)
public static <Tin extends InventoryItem, Tout extends InventoryItem> ItemPool<Tout>
createFrom(final ItemPoolView<Tin> from, final Class<Tout> clsHint)
{
ItemPool<Tout> result = new ItemPool<Tout>(clsHint);
if (from != null) {
@@ -31,10 +53,17 @@ public final class ItemPool<T extends InventoryItem> extends ItemPoolView<T> {
}
return result;
}
/**
*
* createFrom method.
* @param from a Iterable<Tin>
* @param clsHint a Class<Tout>
* @return InventoryItem
*/
@SuppressWarnings("unchecked")
public static <Tin extends InventoryItem, Tout extends InventoryItem> ItemPool<Tout>
createFrom(Iterable<Tin> from, Class<Tout> clsHint)
createFrom(final Iterable<Tin> from, final Class<Tout> clsHint)
{
ItemPool<Tout> result = new ItemPool<Tout>(clsHint);
if (from != null) {
@@ -48,26 +77,55 @@ public final class ItemPool<T extends InventoryItem> extends ItemPoolView<T> {
}
// get
/**
*
* Get item view.
* @return a ItemPoolView
*/
public ItemPoolView<T> getView() { return new ItemPoolView<T>(Collections.unmodifiableMap(cards), myClass); }
// Cards manipulation
public void add(final T card) { add(card, 1); }
/**
*
* Add Card.
* @param card a T
*/
public void add(final T card) {
add(card, 1);
}
/**
*
* add method.
* @param card a T
* @param amount a int
*/
public void add(final T card, final int amount) {
if (amount <= 0) { return; }
cards.put(card, count(card) + amount);
isListInSync = false;
}
private void put(final T card, final int amount) {
cards.put(card, amount);
isListInSync = false;
}
}
/**
*
* addAllCards.
* @param cards a <U>
*/
@SuppressWarnings("unchecked")
public <U extends InventoryItem> void addAllCards(final Iterable<U> cards) {
for (U cr : cards) { if (myClass.isInstance(cr)) { add((T) cr); } }
isListInSync = false;
}
/**
*
* addAll.
* @param map
*/
@SuppressWarnings("unchecked")
public <U extends InventoryItem> void addAll(final Iterable<Entry<U, Integer>> map) {
for (Entry<U, Integer> e : map) {
@@ -77,8 +135,22 @@ public final class ItemPool<T extends InventoryItem> extends ItemPoolView<T> {
}
isListInSync = false;
}
public void remove(final T card) { remove(card, 1); }
/**
*
* Remove.
* @param card a T
*/
public void remove(final T card) {
remove(card, 1);
}
/**
*
* Remove.
* @param card a T
* @param amount a int
*/
public void remove(final T card, final int amount) {
int count = count(card);
if (count == 0 || amount <= 0) { return; }
@@ -86,10 +158,19 @@ public final class ItemPool<T extends InventoryItem> extends ItemPoolView<T> {
else { cards.put(card, count - amount); }
isListInSync = false;
}
/**
*
* RemoveAll.
* @param map a T
*/
public void removeAll(final Iterable<Entry<T, Integer>> map) {
for (Entry<T, Integer> e : map) { remove(e.getKey(), e.getValue()); }
isListInSync = false;
}
/**
*
* Clear.
*/
public void clear() { cards.clear(); isListInSync = false; }
}

View File

@@ -46,7 +46,7 @@ public class QuestEventManager {
DeckManager manager = new DeckManager(file);
File[] allFiles = ForgeProps.getFile(NewConstants.QUEST.DECKS).listFiles(DeckManager.DCKFileFilter);
File[] allFiles = ForgeProps.getFile(NewConstants.QUEST.DECKS).listFiles(DeckManager.DCK_FILE_FILTER);
for(File f : allFiles) {
contents = FileUtil.readFile(f);