From 31b5f4181ac95810d77bb93d293b1ed6f627be02 Mon Sep 17 00:00:00 2001 From: drdev Date: Fri, 22 Nov 2013 03:21:37 +0000 Subject: [PATCH] Support displaying scripts in Workshop again --- .gitattributes | 1 + .../main/java/forge/ICardStorageReader.java | 4 +- .../src/main/java/forge/StaticData.java | 25 +++++--- .../main/java/forge/card/CardScriptInfo.java | 52 ++++++++++++++++ .../src/main/java/forge/util/FileUtil.java | 6 +- .../src/main/java/forge/util/TextUtil.java | 17 ++++- .../card/cardfactory/CardStorageReader.java | 62 +++++++++---------- .../gui/workshop/controllers/CCardScript.java | 33 +++++----- 8 files changed, 134 insertions(+), 66 deletions(-) create mode 100644 forge-core/src/main/java/forge/card/CardScriptInfo.java diff --git a/.gitattributes b/.gitattributes index 66376c688a5..15eaaadd835 100644 --- a/.gitattributes +++ b/.gitattributes @@ -32,6 +32,7 @@ forge-core/src/main/java/forge/card/CardFace.java -text forge-core/src/main/java/forge/card/CardRarity.java -text forge-core/src/main/java/forge/card/CardRules.java -text forge-core/src/main/java/forge/card/CardRulesPredicates.java -text +forge-core/src/main/java/forge/card/CardScriptInfo.java -text forge-core/src/main/java/forge/card/CardSplitType.java -text forge-core/src/main/java/forge/card/CardType.java -text forge-core/src/main/java/forge/card/ColorSet.java -text diff --git a/forge-core/src/main/java/forge/ICardStorageReader.java b/forge-core/src/main/java/forge/ICardStorageReader.java index a0521468dbe..e4cd9250044 100644 --- a/forge-core/src/main/java/forge/ICardStorageReader.java +++ b/forge-core/src/main/java/forge/ICardStorageReader.java @@ -2,8 +2,8 @@ package forge; import java.util.List; -import forge.card.CardRules; +import forge.card.CardScriptInfo; public interface ICardStorageReader{ - List loadCards(); + List loadCards(); } \ No newline at end of file diff --git a/forge-core/src/main/java/forge/StaticData.java b/forge-core/src/main/java/forge/StaticData.java index f30af6b4f6b..5eb3b8cdc8d 100644 --- a/forge-core/src/main/java/forge/StaticData.java +++ b/forge-core/src/main/java/forge/StaticData.java @@ -1,6 +1,7 @@ package forge; import java.io.File; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.TreeMap; @@ -8,6 +9,7 @@ import java.util.TreeMap; import forge.card.CardDb; import forge.card.CardEdition; import forge.card.CardRules; +import forge.card.CardScriptInfo; import forge.card.PrintSheet; import forge.item.FatPack; import forge.item.SealedProduct; @@ -29,26 +31,31 @@ public class StaticData { private final IStorage tournaments; private final IStorage fatPacks; private final IStorage printSheets; + private final HashMap scriptLookup; private static StaticData lastInstance = null; public StaticData(ICardStorageReader reader, String editionFolder, String blockDataFolder) { + this.scriptLookup = new HashMap(); this.editions = new CardEdition.Collection(new CardEdition.Reader(new File(editionFolder))); lastInstance = this; final Map regularCards = new TreeMap(String.CASE_INSENSITIVE_ORDER); final Map variantsCards = new TreeMap(String.CASE_INSENSITIVE_ORDER); - List rules = reader.loadCards(); - for (CardRules card : rules) { + List cards = reader.loadCards(); + for (CardScriptInfo card : cards) { if (null == card) continue; - final String cardName = card.getName(); - if ( card.isVariant() ) { - variantsCards.put(cardName, card); + final CardRules rules = card.getRules(); + scriptLookup.put(rules, card); + + final String cardName = rules.getName(); + if (rules.isVariant()) { + variantsCards.put(cardName, rules); } else { - regularCards.put(cardName, card); + regularCards.put(cardName, rules); } } @@ -62,7 +69,7 @@ public class StaticData { this.printSheets = new StorageBase("Special print runs", new PrintSheet.Reader(new File(blockDataFolder, "printsheets.txt"))); } - public final static StaticData instance() { + public final static StaticData instance() { return lastInstance; } @@ -100,4 +107,8 @@ public class StaticData { public CardDb getVariantCards() { return variantCards; } + + public CardScriptInfo getScriptInfo(CardRules rules) { + return scriptLookup.get(rules); + } } diff --git a/forge-core/src/main/java/forge/card/CardScriptInfo.java b/forge-core/src/main/java/forge/card/CardScriptInfo.java new file mode 100644 index 00000000000..6d54fd9b757 --- /dev/null +++ b/forge-core/src/main/java/forge/card/CardScriptInfo.java @@ -0,0 +1,52 @@ +/* + * Forge: Play Magic: the Gathering. + * Copyright (C) 2011 Forge Team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package forge.card; + +import java.io.File; + +/** + * Info pertaining to a card script file + * + */ +public final class CardScriptInfo { + private String text; + private File file; + private CardRules rules; + + public CardScriptInfo(String text0, File file0, CardRules rules0) { + this.text = text0; + this.file = file0; + this.rules = rules0; + } + + public String getText() { + return this.text; + } + + public File getFile() { + return this.file; + } + + public boolean canEdit() { + return this.file != null; + } + + public CardRules getRules() { + return this.rules; + } +} diff --git a/forge-core/src/main/java/forge/util/FileUtil.java b/forge-core/src/main/java/forge/util/FileUtil.java index 3422cd546b4..703f9b9e4b5 100644 --- a/forge-core/src/main/java/forge/util/FileUtil.java +++ b/forge-core/src/main/java/forge/util/FileUtil.java @@ -112,11 +112,7 @@ public final class FileUtil { } // writeAllDecks() public static String readFileToString(String filename) { - StringBuilder s = new StringBuilder(); - for (String line : readFile(filename)) { - s.append(line).append('\n'); - } - return s.toString(); + return TextUtil.join(readFile(filename), "\n"); } public static List readFile(final String filename) { diff --git a/forge-core/src/main/java/forge/util/TextUtil.java b/forge-core/src/main/java/forge/util/TextUtil.java index f1f0323003f..8bd9cdc3b15 100644 --- a/forge-core/src/main/java/forge/util/TextUtil.java +++ b/forge-core/src/main/java/forge/util/TextUtil.java @@ -43,7 +43,7 @@ public class TextUtil { return mapAsString.toString(); } - public static String[] split(CharSequence input, char delimiter) { + public static String[] split(CharSequence input, char delimiter) { return splitWithParenthesis(input, delimiter, Integer.MAX_VALUE, '\0', '\0', true); } @@ -68,7 +68,7 @@ public class TextUtil { /** * Split string separated by a single char delimiter, can take parenthesis in account - * It's faster than String.split, and allows parenthesis + * It's faster than String.split, and allows parenthesis */ public static String[] splitWithParenthesis(CharSequence input, char delimiter, int maxEntries, char openPar, char closePar, boolean skipEmpty) { List result = new ArrayList(); @@ -98,7 +98,18 @@ public class TextUtil { String[] toReturn = result.toArray(ArrayUtils.EMPTY_STRING_ARRAY); return trimParenthesis ? StringUtils.stripAll(toReturn, String.valueOf(openPar)) : toReturn; } - + + public static String join(Iterable strs, String delim) { + StringBuilder sb = new StringBuilder(); + for (String str : strs) { + if (sb.length() > 0) { + sb.append(delim); + } + sb.append(str); + } + return sb.toString(); + } + /** * Converts an enum value to a printable label but upcasing the first letter * and lcasing all subsequent letters diff --git a/forge-gui/src/main/java/forge/card/cardfactory/CardStorageReader.java b/forge-gui/src/main/java/forge/card/cardfactory/CardStorageReader.java index 19a4984c8cc..c596581022a 100644 --- a/forge-gui/src/main/java/forge/card/cardfactory/CardStorageReader.java +++ b/forge-gui/src/main/java/forge/card/cardfactory/CardStorageReader.java @@ -41,7 +41,9 @@ import forge.FThreads; import forge.ICardStorageReader; import forge.IProgressObserver; import forge.card.CardRules; +import forge.card.CardScriptInfo; import forge.util.FileUtil; +import forge.util.TextUtil; /** *

@@ -112,10 +114,10 @@ public class CardStorageReader implements ICardStorageReader { } // CardReader() - private final List loadCardsInRange(final List files, int from, int to) { + private final List loadCardsInRange(final List files, int from, int to) { CardRules.Reader rulesReader = new CardRules.Reader(); - List result = new ArrayList(); + List result = new ArrayList(); for(int i = from; i < to; i++) { File cardTxtFile = files.get(i); result.add(this.loadCard(rulesReader, cardTxtFile)); @@ -123,10 +125,10 @@ public class CardStorageReader implements ICardStorageReader { return result; } - private final List loadCardsInRangeFromZip(final List files, int from, int to) { + private final List loadCardsInRangeFromZip(final List files, int from, int to) { CardRules.Reader rulesReader = new CardRules.Reader(); - List result = new ArrayList(); + List result = new ArrayList(); for(int i = from; i < to; i++) { ZipEntry ze = files.get(i); // if (ze.getName().endsWith(CardStorageReader.CARD_FILE_DOT_EXTENSION)) // already filtered! @@ -143,11 +145,12 @@ public class CardStorageReader implements ICardStorageReader { * * @return the Card or null if it was not found. */ - public final List loadCards() { + @Override + public final List loadCards() { progressObserver.setOperationName("Loading card data", true); progressObserver.report(0, NUMBER_OF_PARTS); - final List>> tasks; + final List>> tasks; long estimatedFilesRemaining; // Iterate through txt files or zip archive. @@ -175,7 +178,7 @@ public class CardStorageReader implements ICardStorageReader { StopWatch sw = new StopWatch(); sw.start(); - List res = executeLoadTask(tasks); + List res = executeLoadTask(tasks); sw.stop(); final long timeOnParse = sw.getTime(); @@ -185,20 +188,20 @@ public class CardStorageReader implements ICardStorageReader { return res; } // loadCardsUntilYouFind(String) - private List executeLoadTask(final List>> tasks) { - List result = new ArrayList(); + private List executeLoadTask(final List>> tasks) { + List result = new ArrayList(); try { if ( useThreadPool ) { final ExecutorService executor = FThreads.getComputingPool(0.5f); - final List>> parts = executor.invokeAll(tasks); + final List>> parts = executor.invokeAll(tasks); executor.shutdown(); cdl.await(); - for(Future> pp : parts) { + for(Future> pp : parts) { result.addAll(pp.get()); } } else { - for(Callable> c : tasks) { + for(Callable> c : tasks) { result.addAll(c.call()); } } @@ -213,17 +216,17 @@ public class CardStorageReader implements ICardStorageReader { return result; } - private List>> makeTaskListForZip(final List entries) { + private List>> makeTaskListForZip(final List entries) { int totalFiles = entries.size(); int filesPerPart = totalFiles / NUMBER_OF_PARTS; - final List>> tasks = new ArrayList>>(); + final List>> tasks = new ArrayList>>(); for (int iPart = 0; iPart < NUMBER_OF_PARTS; iPart++) { final int from = iPart * filesPerPart; final int till = iPart == NUMBER_OF_PARTS - 1 ? totalFiles : from + filesPerPart; - tasks.add(new Callable>() { + tasks.add(new Callable>() { @Override - public List call() throws Exception{ - List res = loadCardsInRangeFromZip(entries, from, till); + public List call() throws Exception{ + List res = loadCardsInRangeFromZip(entries, from, till); cdl.countDown(); progressObserver.report(NUMBER_OF_PARTS - (int)cdl.getCount(), NUMBER_OF_PARTS); return res; @@ -233,17 +236,17 @@ public class CardStorageReader implements ICardStorageReader { return tasks; } - private List>> makeTaskListForFiles(final List allFiles) { + private List>> makeTaskListForFiles(final List allFiles) { int totalFiles = allFiles.size(); int filesPerPart = totalFiles / NUMBER_OF_PARTS; - final List>> tasks = new ArrayList>>(); + final List>> tasks = new ArrayList>>(); for (int iPart = 0; iPart < NUMBER_OF_PARTS; iPart++) { final int from = iPart * filesPerPart; final int till = iPart == NUMBER_OF_PARTS - 1 ? totalFiles : from + filesPerPart; - tasks.add(new Callable>() { + tasks.add(new Callable>() { @Override - public List call() throws Exception{ - List res = loadCardsInRange(allFiles, from, till); + public List call() throws Exception{ + List res = loadCardsInRange(allFiles, from, till); cdl.countDown(); progressObserver.report(NUMBER_OF_PARTS - (int)cdl.getCount(), NUMBER_OF_PARTS); return res; @@ -282,13 +285,13 @@ public class CardStorageReader implements ICardStorageReader { * * @return the card loaded from the stream */ - protected final CardRules loadCard(CardRules.Reader reader, final InputStream inputStream) { + protected final CardScriptInfo loadCard(CardRules.Reader reader, final InputStream inputStream, final File file) { reader.reset(); InputStreamReader isr = new InputStreamReader(inputStream, this.charset); List allLines = FileUtil.readAllLines(isr, true); - return reader.readCard(allLines); + return new CardScriptInfo(TextUtil.join(allLines, "\n"), file, reader.readCard(allLines)); } /** @@ -299,13 +302,11 @@ public class CardStorageReader implements ICardStorageReader { * * @return a new Card instance */ - protected final CardRules loadCard(final CardRules.Reader reader, final File file) { + protected final CardScriptInfo loadCard(final CardRules.Reader reader, final File file) { FileInputStream fileInputStream = null; try { fileInputStream = new FileInputStream(file); - CardRules rules = this.loadCard(reader, fileInputStream); - //rules.setSourceFile(file); - return rules; + return this.loadCard(reader, fileInputStream, file); } catch (final FileNotFoundException ex) { throw new RuntimeException("CardReader : run error -- file not found: " + file.getPath(), ex); } finally { @@ -326,11 +327,11 @@ public class CardStorageReader implements ICardStorageReader { * * @return a new Card instance */ - protected final CardRules loadCard(final CardRules.Reader rulesReader, final ZipEntry entry) { + protected final CardScriptInfo loadCard(final CardRules.Reader rulesReader, final ZipEntry entry) { InputStream zipInputStream = null; try { zipInputStream = this.zip.getInputStream(entry); - return this.loadCard(rulesReader, zipInputStream); + return this.loadCard(rulesReader, zipInputStream, null); } catch (final IOException exn) { throw new RuntimeException(exn); // PM @@ -345,5 +346,4 @@ public class CardStorageReader implements ICardStorageReader { } } } - } diff --git a/forge-gui/src/main/java/forge/gui/workshop/controllers/CCardScript.java b/forge-gui/src/main/java/forge/gui/workshop/controllers/CCardScript.java index aa6393c8f41..b84a48f6c06 100644 --- a/forge-gui/src/main/java/forge/gui/workshop/controllers/CCardScript.java +++ b/forge-gui/src/main/java/forge/gui/workshop/controllers/CCardScript.java @@ -6,6 +6,8 @@ import javax.swing.event.DocumentListener; import forge.Command; import forge.Singletons; +import forge.StaticData; +import forge.card.CardScriptInfo; import forge.gui.framework.FScreen; import forge.gui.framework.ICDoc; import forge.gui.toolbox.FTextEditor; @@ -25,11 +27,11 @@ import forge.item.PaperCard; public enum CCardScript implements ICDoc { /** */ SINGLETON_INSTANCE; - + private PaperCard currentCard; private String baseText; private boolean isTextDirty; - + private CCardScript() { VCardScript.SINGLETON_INSTANCE.getTxtScript().addDocumentListener(new DocumentListener() { @Override @@ -48,7 +50,7 @@ public enum CCardScript implements ICDoc { } }); } - + private void updateDirtyFlag() { boolean isTextNowDirty = !VCardScript.SINGLETON_INSTANCE.getTxtScript().getText().equals(baseText); if (this.isTextDirty == isTextNowDirty) { return; } @@ -72,21 +74,16 @@ public enum CCardScript implements ICDoc { this.currentCard = card; refresh(); } - + public void refresh() { String text = ""; boolean editable = false; if (this.currentCard != null) { -// File sourceFile = this.currentCard.getRules().getSourceFile(); -// if (sourceFile != null) { -// try { -// text = FileUtil.readFileToString(sourceFile); -// editable = true; -// } -// catch (final Exception ex) { -// text = "Couldn't read file - " + sourceFile + "\n\nException:\n" + ex.toString(); -// } -// } + CardScriptInfo scriptInfo = StaticData.instance().getScriptInfo(this.currentCard.getRules()); + if (scriptInfo != null) { + text = scriptInfo.getText(); + editable = scriptInfo.canEdit(); + } } this.baseText = text; @@ -95,11 +92,11 @@ public enum CCardScript implements ICDoc { txtScript.setEditable(editable); txtScript.setCaretPosition(0); //keep scrolled to top } - + public boolean hasChanges() { return (this.currentCard != null && this.isTextDirty); } - + public boolean canSwitchAway(boolean isCardChanging) { if (!hasChanges()) { return true; } @@ -119,7 +116,7 @@ public enum CCardScript implements ICDoc { } return true; } - + public boolean saveChanges() { if (!hasChanges()) { return true; } //not need if text hasn't been changed @@ -132,7 +129,7 @@ public enum CCardScript implements ICDoc { // PrintWriter p = new PrintWriter(sourceFile); // p.print(text); // p.close(); -// +// // this.baseText = text; // updateDirtyFlag(); //