From 173b0c94909e85fd91204d0c26000a2e687abb60 Mon Sep 17 00:00:00 2001 From: myk Date: Fri, 15 Mar 2013 03:13:33 +0000 Subject: [PATCH] get gauntlets working, including fixing all the malformed data in the contest files --- .../gauntlet/LOCKED_DotP Preconstructed.dat | Bin 3021 -> 3275 bytes .../gauntlet/LOCKED_Swimming With Sharks.dat | Bin 6406 -> 7084 bytes src/main/java/forge/ImageCache.java | 6 +- src/main/java/forge/deck/Deck.java | 12 +-- src/main/java/forge/deck/DeckSection.java | 7 +- .../java/forge/gauntlet/GauntletData.java | 30 ++---- src/main/java/forge/gauntlet/GauntletIO.java | 89 ++++++------------ .../java/forge/gui/DialogMigrateProfile.java | 23 +++-- .../home/gauntlet/CSubmenuGauntletBuild.java | 21 ++--- .../gauntlet/CSubmenuGauntletContests.java | 5 +- .../home/gauntlet/CSubmenuGauntletLoad.java | 17 ++-- .../home/gauntlet/CSubmenuGauntletQuick.java | 13 ++- .../home/gauntlet/ContestGauntletLister.java | 7 +- .../home/gauntlet/QuickGauntletLister.java | 17 ++-- .../gui/home/quest/CSubmenuQuestData.java | 15 +-- .../java/forge/gui/match/GauntletWinLose.java | 8 +- src/main/java/forge/quest/io/QuestDataIO.java | 3 +- 17 files changed, 103 insertions(+), 170 deletions(-) diff --git a/res/defaults/gauntlet/LOCKED_DotP Preconstructed.dat b/res/defaults/gauntlet/LOCKED_DotP Preconstructed.dat index e07cc44ff0e20fa772ac62034ed48044ff4de2ea..3b869fdb4104812fc52a02bea06a8a63f1751a10 100644 GIT binary patch literal 3275 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 Jv>01L000C=bgKXW literal 3021 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 WX3p=r7qKwn`s53$KfBYU90351xUh%- literal 6406 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 UGbldvQHnnN2T=l#1T)qE0JP;wKL7v# diff --git a/src/main/java/forge/ImageCache.java b/src/main/java/forge/ImageCache.java index 61a6e3b7ee8..1902b86697e 100644 --- a/src/main/java/forge/ImageCache.java +++ b/src/main/java/forge/ImageCache.java @@ -22,6 +22,8 @@ import java.util.concurrent.ExecutionException; import javax.swing.ImageIcon; +import org.apache.commons.lang3.StringUtils; + import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader.InvalidCacheLoadException; import com.google.common.cache.LoadingCache; @@ -93,8 +95,8 @@ public class ImageCache { } private static BufferedImage scaleImage(String key, final int width, final int height) { - if ((3 > width && -1 != width) || (3 > height && -1 != height)) { - // picture too small; return a blank + if (StringUtils.isEmpty(key) || (3 > width && -1 != width) || (3 > height && -1 != height)) { + // picture too small or key not defined; return a blank return null; } diff --git a/src/main/java/forge/deck/Deck.java b/src/main/java/forge/deck/Deck.java index 7e0746ac57d..7d73c5b87e6 100644 --- a/src/main/java/forge/deck/Deck.java +++ b/src/main/java/forge/deck/Deck.java @@ -53,19 +53,11 @@ import forge.util.FileUtil; * The set of MTG legal cards that become player's library when the game starts. * Any other data is not part of a deck and should be stored elsewhere. Current * fields allowed for deck metadata are Name, Title, Description and Deck Type. - * - * @author Forge - * @version $Id$ */ +@SuppressWarnings("serial") public class Deck extends DeckBase implements Iterable> { - /** - * - */ - private static final long serialVersionUID = -7478025567887481994L; - private final Map parts = new EnumMap(DeckSection.class); - - private final Set tags = new TreeSet(String.CASE_INSENSITIVE_ORDER); + private final Set tags = new TreeSet(String.CASE_INSENSITIVE_ORDER); // gameType is from Constant.GameType, like GameType.Regular /** diff --git a/src/main/java/forge/deck/DeckSection.java b/src/main/java/forge/deck/DeckSection.java index b0716ab6647..8e3772a7549 100644 --- a/src/main/java/forge/deck/DeckSection.java +++ b/src/main/java/forge/deck/DeckSection.java @@ -1,11 +1,6 @@ package forge.deck; -/** - * TODO: Write javadoc for this type. - * - */ public enum DeckSection { - Avatar(1), Commander(1), Main(60), @@ -24,12 +19,14 @@ public enum DeckSection { if (value == null) { return null; } + final String valToCompate = value.trim(); for (final DeckSection v : DeckSection.values()) { if (v.name().compareToIgnoreCase(valToCompate) == 0) { return v; } } + return null; } } diff --git a/src/main/java/forge/gauntlet/GauntletData.java b/src/main/java/forge/gauntlet/GauntletData.java index caf75666af0..b7d4f282887 100644 --- a/src/main/java/forge/gauntlet/GauntletData.java +++ b/src/main/java/forge/gauntlet/GauntletData.java @@ -1,12 +1,13 @@ package forge.gauntlet; -import java.io.File; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; +import com.thoughtworks.xstream.annotations.XStreamOmitField; + import forge.deck.Deck; @@ -16,8 +17,10 @@ import forge.deck.Deck; *

(S at beginning of class name denotes a static factory.) */ public final class GauntletData { + @XStreamOmitField + private String name; // set based on the the filename on load + private int completed; - private File activeFile; private String timestamp; private List eventRecords = new ArrayList(); private List eventNames = new ArrayList(); @@ -31,17 +34,14 @@ public final class GauntletData { //========== Mutator / accessor methods - /** @param file0 {@link java.io.File} */ - public void setActiveFile(final File file0) { - this.activeFile = file0; + public void setName(String name0) { + name = name0; } - /** @return {@link java.io.File} */ - public File getActiveFile() { - return this.activeFile; + public String getName() { + return name; } - /** */ public void stamp() { final DateFormat dateFormat = new SimpleDateFormat("dd-mm-yy, H:m"); this.timestamp = dateFormat.format(new Date()).toString(); @@ -61,64 +61,52 @@ public final class GauntletData { GauntletIO.saveGauntlet(this); } - /** @return {@link java.lang.String} */ public String getTimestamp() { return this.timestamp; } - /** @param i0 int */ public void setCompleted(final int i0) { this.completed = i0; } - /** @return int */ public int getCompleted() { return this.completed; } - /** @param d0 {@link forge.deck.Deck} */ public void setUserDeck(final Deck d0) { this.userDeck = d0; } - /** @return d0 {@link forge.deck.Deck} */ public Deck getUserDeck() { return this.userDeck; } - /** @return List */ public List getDeckNames() { final List names = new ArrayList(); for (final Deck d : decks) { names.add(d.getName()); } return names; } - /** @param records0 List */ public void setEventRecords(final List records0) { this.eventRecords = records0; } - /** @return List */ public List getEventRecords() { return this.eventRecords; } - /** @param names0 List */ public void setEventNames(final List names0) { this.eventNames = names0; } - /** @return List */ public List getEventNames() { return this.eventNames; } - /** @param decks0 List */ public void setDecks(final List decks0) { this.decks = decks0; } - /** @return List */ public List getDecks() { return this.decks; } diff --git a/src/main/java/forge/gauntlet/GauntletIO.java b/src/main/java/forge/gauntlet/GauntletIO.java index 83503ffad1e..540f729514d 100644 --- a/src/main/java/forge/gauntlet/GauntletIO.java +++ b/src/main/java/forge/gauntlet/GauntletIO.java @@ -27,25 +27,16 @@ import forge.item.CardPrinted; import forge.properties.NewConstants; import forge.util.IgnoringXStream; -/** */ public class GauntletIO { /** Prompt in text field for new (unsaved) built gauntlets. */ public static final String TXF_PROMPT = "[New Gauntlet]"; + /** suffix for all gauntlet data files */ + public static final String SUFFIX_DATA = ".dat"; /** Prefix for quick gauntlet save files. */ public static final String PREFIX_QUICK = "Quick_"; - /** Regex for quick gauntlet save files. */ - public static final String REGEX_QUICK = "^" + GauntletIO.PREFIX_QUICK + "[0-9]+\\.dat$"; /** Regex for locked gauntlet save files. */ - public static final String REGEX_LOCKED = "^LOCKED_.+\\.dat$"; - /** Regex for Subversion files. */ - public static final String SVN_IGNORE = "^\\.svn$"; + public static final String PREFIX_LOCKED = "LOCKED_"; - /** - * Gets the serializer. - * - * @param isIgnoring the is ignoring - * @return the serializer - */ protected static XStream getSerializer(final boolean isIgnoring) { final XStream xStream = isIgnoring ? new IgnoringXStream() : new XStream(); xStream.registerConverter(new DeckSectionToXml()); @@ -53,42 +44,43 @@ public class GauntletIO { return xStream; } + public static File getGauntletFile(String name) { + return new File(NewConstants.GAUNTLET_DIR.userPrefLoc, name + SUFFIX_DATA); + } - /** @return File[] */ + public static File getGauntletFile(GauntletData gd) { + return getGauntletFile(gd.getName()); + } + public static File[] getGauntletFilesUnlocked() { final FilenameFilter filter = new FilenameFilter() { @Override public boolean accept(File dir, String name) { - return (!name.matches(GauntletIO.REGEX_LOCKED) - && !name.matches(GauntletIO.SVN_IGNORE)); + return (name.endsWith(SUFFIX_DATA)); } }; - File folder = new File(NewConstants.GAUNTLET_DIR.defaultLoc); + File folder = new File(NewConstants.GAUNTLET_DIR.userPrefLoc); return folder.listFiles(filter); } - /** @return File[] */ public static File[] getGauntletFilesQuick() { final FilenameFilter filter = new FilenameFilter() { @Override public boolean accept(File dir, String name) { - return (name.matches(GauntletIO.REGEX_QUICK) - && !name.matches(GauntletIO.SVN_IGNORE)); + return (name.startsWith(PREFIX_QUICK) && name.endsWith(SUFFIX_DATA)); } }; - File folder = new File(NewConstants.GAUNTLET_DIR.defaultLoc); + File folder = new File(NewConstants.GAUNTLET_DIR.userPrefLoc); return folder.listFiles(filter); } - /** @return File[] */ public static File[] getGauntletFilesLocked() { final FilenameFilter filter = new FilenameFilter() { @Override public boolean accept(File dir, String name) { - return (name.matches(GauntletIO.REGEX_LOCKED) - && !name.matches(GauntletIO.SVN_IGNORE)); + return (name.startsWith(PREFIX_LOCKED) && name.endsWith(SUFFIX_DATA)); } }; @@ -96,50 +88,29 @@ public class GauntletIO { return folder.listFiles(filter); } - /** - *

- * loadData. - *

- * - * @param xmlSaveFile - *   {@link java.io.File} - * @return {@link forge.gauntlet.GauntletData} - */ public static GauntletData loadGauntlet(final File xmlSaveFile) { + GZIPInputStream zin = null; try { - GauntletData data = null; + zin = new GZIPInputStream(new FileInputStream(xmlSaveFile)); + InputStreamReader reader = new InputStreamReader(zin); - final GZIPInputStream zin = new GZIPInputStream(new FileInputStream(xmlSaveFile)); - - final StringBuilder xml = new StringBuilder(); - final char[] buf = new char[1024]; - final InputStreamReader reader = new InputStreamReader(zin); - while (reader.ready()) { - final int len = reader.read(buf); - if (len == -1) { - break; - } // when end of stream was reached - xml.append(buf, 0, len); - } - - zin.close(); - data = (GauntletData) GauntletIO.getSerializer(true).fromXML(xml.toString()); + GauntletData data = (GauntletData)GauntletIO.getSerializer(true).fromXML(reader); + String filename = xmlSaveFile.getName(); + data.setName(filename.substring(0, filename.length() - SUFFIX_DATA.length())); + return data; } catch (final Exception ex) { BugReporter.reportException(ex, "Error loading Gauntlet Data"); throw new RuntimeException(ex); + } finally { + if (null != zin) { + try { zin.close(); } + catch (IOException e) { System.out.println("error closing gauntlet data reader: " + e); } + } } } - /** - *

- * saveData. - *

- * - * @param gd0 - * a {@link forge.gauntlet.GauntletData} object. - */ public static void saveGauntlet(final GauntletData gd0) { try { final XStream xStream = GauntletIO.getSerializer(false); @@ -151,7 +122,7 @@ public class GauntletIO { } private static void savePacked(final XStream xStream0, final GauntletData gd0) throws IOException { - final BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream(gd0.getActiveFile())); + final BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream(getGauntletFile(gd0))); final GZIPOutputStream zout = new GZIPOutputStream(bout); xStream0.toXML(gd0, zout); zout.flush(); @@ -159,7 +130,6 @@ public class GauntletIO { } private static class DeckSectionToXml implements Converter { - @SuppressWarnings("rawtypes") @Override public boolean canConvert(final Class clasz) { @@ -171,7 +141,6 @@ public class GauntletIO { for (final Entry e : (CardPool) source) { this.writeCardPrinted(e.getKey(), e.getValue(), writer); } - } @Override @@ -190,10 +159,10 @@ public class GauntletIO { } reader.moveUp(); } + return result; } - /** */ private void writeCardPrinted(final CardPrinted cref, final Integer count, final HierarchicalStreamWriter writer) { writer.startNode("card"); writer.addAttribute("c", cref.getName()); diff --git a/src/main/java/forge/gui/DialogMigrateProfile.java b/src/main/java/forge/gui/DialogMigrateProfile.java index be55fd6e737..93d8da9e653 100644 --- a/src/main/java/forge/gui/DialogMigrateProfile.java +++ b/src/main/java/forge/gui/DialogMigrateProfile.java @@ -832,21 +832,21 @@ public class DialogMigrateProfile { opLogBuf.append(destFile.getAbsolutePath()).append("\n"); if (!destFile.exists()) { - _copyFile(srcFile, destFile); + _copyFile(srcFile, destFile, _move); } else { if (_overwrite) { opLogBuf.append(" Destination file exists; overwriting\n"); - _copyFile(srcFile, destFile); + _copyFile(srcFile, destFile, _move); } else { opLogBuf.append(" Destination file exists; skipping copy\n"); } ++numExisting; } - if (_move) { - opLogBuf.append(" Removing source file after successful copy\n"); + // source file may have been deleted already if _copyFile was called srcFile.delete(); + opLogBuf.append(" Removed source file after successful copy\n"); } ++numSucceeded; @@ -896,10 +896,17 @@ public class DialogMigrateProfile { } } - // actual file copy routine. uses java.nio classes for ultra-fast copying - private static void _copyFile(File srcFile, File destFile) throws IOException { + // when copying is required, uses java nio classes for ultra-fast I/O + private static void _copyFile(File srcFile, File destFile, boolean deleteSrcAfter) throws IOException { destFile.getParentFile().mkdirs(); + // if this is a move, try a simple rename first + if (deleteSrcAfter) { + if (srcFile.renameTo(destFile)) { + return; + } + } + if (!destFile.exists()) { destFile.createNewFile(); } @@ -914,5 +921,9 @@ public class DialogMigrateProfile { if (src != null) { src.close(); } if (dest != null) { dest.close(); } } + + if (deleteSrcAfter) { + srcFile.delete(); + } } } diff --git a/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletBuild.java b/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletBuild.java index 366b72056af..b891ad006c2 100644 --- a/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletBuild.java +++ b/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletBuild.java @@ -42,13 +42,11 @@ import forge.util.storage.IStorage; @SuppressWarnings("serial") public enum CSubmenuGauntletBuild implements ICDoc { - /** */ SINGLETON_INSTANCE; private final VSubmenuGauntletBuild view = VSubmenuGauntletBuild.SINGLETON_INSTANCE; private final List workingDecks = new ArrayList(); - private File previousDirectory = null; - private File openStartDir = new File(NewConstants.GAUNTLET_DIR.defaultLoc); + private File openStartDir = new File(NewConstants.GAUNTLET_DIR.userPrefLoc); private final FileFilter filterDAT = new FileFilter() { @Override @@ -57,12 +55,8 @@ public enum CSubmenuGauntletBuild implements ICDoc { return true; } - if (!f.getName().matches(GauntletIO.REGEX_LOCKED) - && !f.getName().matches(GauntletIO.REGEX_QUICK)) { - return true; - } - - return false; + String filename = f.getName(); + return (!filename.startsWith(GauntletIO.PREFIX_QUICK) && filename.endsWith(GauntletIO.SUFFIX_DATA)); } @Override @@ -318,7 +312,7 @@ public enum CSubmenuGauntletBuild implements ICDoc { return false; } - final File f = new File(NewConstants.GAUNTLET_DIR.defaultLoc + name + ".dat"); + final File f = new File(NewConstants.GAUNTLET_DIR.userPrefLoc + name + ".dat"); // Confirm if overwrite if (f.exists()) { final int m = JOptionPane.showConfirmDialog(null, @@ -350,7 +344,7 @@ public enum CSubmenuGauntletBuild implements ICDoc { gd.setEventNames(names); gd.setDecks(workingDecks); - gd.setActiveFile(f); + gd.setName(name); gd.reset(); view.getLblSave().setVisible(false); @@ -359,17 +353,14 @@ public enum CSubmenuGauntletBuild implements ICDoc { } private boolean openGauntlet() { - /** */ final File file; - final JFileChooser open = new JFileChooser(previousDirectory); + final JFileChooser open = new JFileChooser(openStartDir); open.setDialogTitle("Import Deck"); open.addChoosableFileFilter(this.filterDAT); - open.setCurrentDirectory(openStartDir); final int returnVal = open.showOpenDialog(null); if (returnVal == JFileChooser.APPROVE_OPTION) { file = open.getSelectedFile(); - previousDirectory = file.getParentFile(); } else { return false; diff --git a/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletContests.java b/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletContests.java index 3874210f6d2..65cc04ca230 100644 --- a/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletContests.java +++ b/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletContests.java @@ -140,11 +140,8 @@ public enum CSubmenuGauntletContests implements ICDoc { private void updateData() { final File[] files = GauntletIO.getGauntletFilesLocked(); final List data = new ArrayList(); - for (final File f : files) { - if (f.getName().matches(GauntletIO.REGEX_LOCKED)) { - data.add(GauntletIO.loadGauntlet(f)); - } + data.add(GauntletIO.loadGauntlet(f)); } view.getGauntletLister().setGauntlets(data); diff --git a/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletLoad.java b/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletLoad.java index ea3f040680f..79b7f06f1a0 100644 --- a/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletLoad.java +++ b/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletLoad.java @@ -31,12 +31,9 @@ import forge.model.FModel; *

(C at beginning of class name denotes a control class.) * */ - public enum CSubmenuGauntletLoad implements ICDoc { - /** */ SINGLETON_INSTANCE; - private final ActionListener actStartGame = new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { startGame(); } }; @@ -47,6 +44,11 @@ public enum CSubmenuGauntletLoad implements ICDoc { */ @Override public void update() { + updateData(); + enableStartButton(); + + view.getGauntletLister().setSelectedIndex(0); + SwingUtilities.invokeLater(new Runnable() { @Override public void run() { JButton btnStart = view.getBtnStart(); @@ -67,10 +69,6 @@ public enum CSubmenuGauntletLoad implements ICDoc { public void initialize() { view.getBtnStart().addActionListener(actStartGame); - updateData(); - enableStartButton(); - - view.getGauntletLister().setSelectedIndex(0); view.getGauntletLister().setCmdDelete(new Command() { @Override public void execute() { enableStartButton(); } }); view.getGauntletLister().setCmdSelect(new Command() { @Override @@ -89,7 +87,7 @@ public enum CSubmenuGauntletLoad implements ICDoc { } private void enableStartButton() { - if (view.getGauntletLister().getSelectedGauntlet() == null) { + if (view.getGauntletLister().getSelectedGauntletFile() == null) { view.getBtnStart().setEnabled(false); } else { @@ -99,8 +97,7 @@ public enum CSubmenuGauntletLoad implements ICDoc { private void startGame() { FModel.SINGLETON_INSTANCE.setGauntletData( - GauntletIO.loadGauntlet(VSubmenuGauntletQuick.SINGLETON_INSTANCE - .getGauntletLister().getSelectedGauntlet().getActiveFile())); + GauntletIO.loadGauntlet(VSubmenuGauntletQuick.SINGLETON_INSTANCE.getGauntletLister().getSelectedGauntletFile())); // Start game SwingUtilities.invokeLater(new Runnable() { diff --git a/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletQuick.java b/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletQuick.java index c52785ee761..3a080fbdd9f 100644 --- a/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletQuick.java +++ b/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletQuick.java @@ -7,7 +7,9 @@ import java.awt.event.MouseEvent; import java.io.File; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashSet; import java.util.List; +import java.util.Set; import javax.swing.JList; import javax.swing.ListSelectionModel; @@ -32,7 +34,6 @@ import forge.gauntlet.GauntletIO; import forge.gui.SOverlayUtils; import forge.gui.framework.ICDoc; import forge.model.FModel; -import forge.properties.NewConstants; import forge.quest.QuestController; import forge.quest.QuestEvent; import forge.util.storage.IStorage; @@ -206,7 +207,6 @@ public enum CSubmenuGauntletQuick implements ICDoc { view.getLstDecks().setSelectedIndices(new int[]{0, 1}); } - /** */ private void startGame() { // Start game overlay SwingUtilities.invokeLater(new Runnable() { @@ -219,13 +219,12 @@ public enum CSubmenuGauntletQuick implements ICDoc { // Find appropriate filename for new save, create and set new save file. final File[] arrFiles = GauntletIO.getGauntletFilesQuick(); - final List lstNames = new ArrayList(); - for (File f : arrFiles) { lstNames.add(f.getName()); } + final Set setNames = new HashSet(); + for (File f : arrFiles) { setNames.add(f.getName()); } int num = 1; - while (lstNames.contains(GauntletIO.PREFIX_QUICK + num + ".dat")) { num++; } - FModel.SINGLETON_INSTANCE.getGauntletData().setActiveFile(new File( - NewConstants.GAUNTLET_DIR.defaultLoc + GauntletIO.PREFIX_QUICK + num + ".dat")); + while (setNames.contains(GauntletIO.PREFIX_QUICK + num + GauntletIO.SUFFIX_DATA)) { num++; } + FModel.SINGLETON_INSTANCE.getGauntletData().setName(GauntletIO.PREFIX_QUICK + num); // Pull user deck final Deck userDeck; diff --git a/src/main/java/forge/gui/home/gauntlet/ContestGauntletLister.java b/src/main/java/forge/gui/home/gauntlet/ContestGauntletLister.java index a9e16420a15..d161f5c1a21 100644 --- a/src/main/java/forge/gui/home/gauntlet/ContestGauntletLister.java +++ b/src/main/java/forge/gui/home/gauntlet/ContestGauntletLister.java @@ -17,6 +17,7 @@ import javax.swing.border.MatteBorder; import net.miginfocom.swing.MigLayout; import forge.Command; import forge.gauntlet.GauntletData; +import forge.gauntlet.GauntletIO; import forge.gui.toolbox.FLabel; import forge.gui.toolbox.FSkin; @@ -52,7 +53,7 @@ public class ContestGauntletLister extends JPanel { Collections.sort(sorted, new Comparator() { @Override public int compare(final GauntletData x, final GauntletData y) { - return x.getActiveFile().getName().compareTo(y.getActiveFile().getName()); + return x.getName().compareTo(y.getName()); } }); @@ -78,8 +79,8 @@ public class ContestGauntletLister extends JPanel { String name; String progress; for (GauntletData gd : sorted) { - name = gd.getActiveFile().getName(); - name = name.substring(7, name.length() - 4); + name = gd.getName(); + name = name.substring(GauntletIO.PREFIX_LOCKED.length()); progress = String.valueOf(Math.round( ((double) gd.getCompleted() / (double) gd.getDecks().size()) * 100)) + " %"; diff --git a/src/main/java/forge/gui/home/gauntlet/QuickGauntletLister.java b/src/main/java/forge/gui/home/gauntlet/QuickGauntletLister.java index 7a51a3b0f1e..71d0f6c8d93 100644 --- a/src/main/java/forge/gui/home/gauntlet/QuickGauntletLister.java +++ b/src/main/java/forge/gui/home/gauntlet/QuickGauntletLister.java @@ -5,6 +5,7 @@ package forge.gui.home.gauntlet; import java.awt.Color; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; +import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -20,6 +21,7 @@ import javax.swing.border.MatteBorder; import net.miginfocom.swing.MigLayout; import forge.Command; import forge.gauntlet.GauntletData; +import forge.gauntlet.GauntletIO; import forge.gui.toolbox.FLabel; import forge.gui.toolbox.FSkin; @@ -60,7 +62,7 @@ public class QuickGauntletLister extends JPanel { Collections.sort(sorted, new Comparator() { @Override public int compare(final GauntletData x, final GauntletData y) { - return x.getActiveFile().getName().compareTo(y.getActiveFile().getName()); + return x.getName().compareTo(y.getName()); } }); @@ -85,8 +87,7 @@ public class QuickGauntletLister extends JPanel { RowPanel row; String name; for (GauntletData gd : sorted) { - name = gd.getActiveFile().getName(); - name = name.substring(0, name.length() - 4); + name = gd.getName(); row = new RowPanel(gd); row.setToolTipText(name); @@ -113,12 +114,12 @@ public class QuickGauntletLister extends JPanel { } /** @return {@link forge.deck.Deck} */ - public GauntletData getSelectedGauntlet() { + public File getSelectedGauntletFile() { if (previousSelect == null) { return null; } else { - return previousSelect.getGauntletData(); + return GauntletIO.getGauntletFile(previousSelect.getGauntletData()); } } @@ -221,7 +222,7 @@ public class QuickGauntletLister extends JPanel { */ public boolean setSelectedIndex(int i0) { if (i0 >= rows.length) { return false; } - selectHandler(rows[i0]); + selectHandler(rows[Math.max(0, i0)]); return true; } @@ -263,7 +264,7 @@ public class QuickGauntletLister extends JPanel { final GauntletData gd = r0.getGauntletData(); final int n = JOptionPane.showConfirmDialog(null, - "Are you sure you want to delete \"" + gd.getActiveFile().getName() + "Are you sure you want to delete \"" + gd.getName() + "\" ?", "Delete Gauntlet", JOptionPane.YES_NO_OPTION); if (n == JOptionPane.NO_OPTION) { @@ -271,7 +272,7 @@ public class QuickGauntletLister extends JPanel { } - gd.getActiveFile().delete(); + GauntletIO.getGauntletFile(gd).delete(); if (cmdRowDelete != null) { cmdRowDelete.execute(); } this.setSelectedIndex(0); diff --git a/src/main/java/forge/gui/home/quest/CSubmenuQuestData.java b/src/main/java/forge/gui/home/quest/CSubmenuQuestData.java index 7f4c1300720..476d106cb0b 100644 --- a/src/main/java/forge/gui/home/quest/CSubmenuQuestData.java +++ b/src/main/java/forge/gui/home/quest/CSubmenuQuestData.java @@ -102,18 +102,7 @@ public enum CSubmenuQuestData implements ICDoc { final File dirQuests = new File(NewConstants.QUEST_SAVE_DIR); final QuestController qc = Singletons.getModel().getQuest(); - // Temporary transition code between v1.2.2 and v1.2.3. - // Can be safely deleted after release of 1.2.3. - if (!dirQuests.exists()) { - dirQuests.mkdirs(); - } - File olddata = new File("res/quest/questData.dat"); - File newpath = new File(dirQuests.getPath() + "/questData.dat"); - - if (olddata.exists()) { olddata.renameTo(newpath); } - // end block which can be deleted - - // Iterate over files and load quest datas for each. + // Iterate over files and load quest data for each. FilenameFilter takeDatFiles = new FilenameFilter() { @Override public boolean accept(final File dir, final String name) { @@ -126,7 +115,7 @@ public enum CSubmenuQuestData implements ICDoc { arrQuests.put(f.getName(), QuestDataIO.loadData(f)); } - // Populate list with available quest datas. + // Populate list with available quest data. view.getLstQuests().setQuests(new ArrayList(arrQuests.values())); // If there are quests available, force select. diff --git a/src/main/java/forge/gui/match/GauntletWinLose.java b/src/main/java/forge/gui/match/GauntletWinLose.java index 2412cd44f42..4ae1d268042 100644 --- a/src/main/java/forge/gui/match/GauntletWinLose.java +++ b/src/main/java/forge/gui/match/GauntletWinLose.java @@ -102,8 +102,8 @@ public class GauntletWinLose extends ControlWinLose { this.getView().getBtnQuit().setText("OK"); // Remove save file if it's a quickie, or just reset it. - if (gd.getActiveFile().getName().matches(GauntletIO.REGEX_QUICK)) { - gd.getActiveFile().delete(); + if (gd.getName().startsWith(GauntletIO.PREFIX_QUICK)) { + GauntletIO.getGauntletFile(gd).delete(); } else { gd.reset(); @@ -131,8 +131,8 @@ public class GauntletWinLose extends ControlWinLose { this.getView().getBtnContinue().setVisible(false); // Remove save file if it's a quickie, or just reset it. - if (gd.getActiveFile().getName().matches(GauntletIO.REGEX_QUICK)) { - gd.getActiveFile().delete(); + if (gd.getName().startsWith(GauntletIO.PREFIX_QUICK)) { + GauntletIO.getGauntletFile(gd).delete(); } else { gd.reset(); diff --git a/src/main/java/forge/quest/io/QuestDataIO.java b/src/main/java/forge/quest/io/QuestDataIO.java index 7705b0cb90f..16ff1cdd8e3 100644 --- a/src/main/java/forge/quest/io/QuestDataIO.java +++ b/src/main/java/forge/quest/io/QuestDataIO.java @@ -534,10 +534,9 @@ public class QuestDataIO { } reader.moveUp(); } - return result; + return result; } - } private static class ItemPoolToXml implements Converter {