diff --git a/.gitattributes b/.gitattributes index 756e9c3de50..b43c8aa2ab9 100644 --- a/.gitattributes +++ b/.gitattributes @@ -15193,6 +15193,7 @@ src/main/java/forge/util/package-info.java -text src/main/java/forge/util/storage/IStorage.java -text src/main/java/forge/util/storage/StorageBase.java -text src/main/java/forge/util/storage/StorageImmediatelySerialized.java svneol=native#text/plain +src/main/java/forge/util/storage/StorageNestedFolders.java -text src/main/java/forge/util/storage/StorageReaderBase.java -text src/main/java/forge/util/storage/StorageReaderFile.java -text src/main/java/forge/util/storage/StorageReaderFileSections.java -text diff --git a/src/main/java/forge/deck/CardCollections.java b/src/main/java/forge/deck/CardCollections.java index 902580a7d77..50ac0cd3aee 100644 --- a/src/main/java/forge/deck/CardCollections.java +++ b/src/main/java/forge/deck/CardCollections.java @@ -49,7 +49,7 @@ public class CardCollections { public CardCollections() { StopWatch sw = new StopWatch(); sw.start(); - this.constructed = new StorageImmediatelySerialized(new DeckSerializer(new File(NewConstants.DECK_CONSTRUCTED_DIR), true)); + this.constructed = new StorageImmediatelySerialized(new DeckSerializer(new File(NewConstants.DECK_CONSTRUCTED_DIR), true), true); this.draft = new StorageImmediatelySerialized(new DeckGroupSerializer(new File(NewConstants.DECK_DRAFT_DIR))); this.sealed = new StorageImmediatelySerialized(new DeckGroupSerializer(new File(NewConstants.DECK_SEALED_DIR))); this.cube = new StorageImmediatelySerialized(new DeckSerializer(new File(NewConstants.DECK_CUBE_DIR))); diff --git a/src/main/java/forge/deck/Deck.java b/src/main/java/forge/deck/Deck.java index ea716322215..4ce33c9a83f 100644 --- a/src/main/java/forge/deck/Deck.java +++ b/src/main/java/forge/deck/Deck.java @@ -77,7 +77,14 @@ public class Deck extends DeckBase implements Iterable { +public abstract class DeckBase implements Serializable, Comparable, InventoryItem { private static final long serialVersionUID = -7538150536939660052L; // gameType is from Constant.GameType, like GameType.Regular diff --git a/src/main/java/forge/deck/DeckGroup.java b/src/main/java/forge/deck/DeckGroup.java index 13147718fb3..03b7abae2a2 100644 --- a/src/main/java/forge/deck/DeckGroup.java +++ b/src/main/java/forge/deck/DeckGroup.java @@ -135,4 +135,13 @@ public class DeckGroup extends DeckBase { } }; + /* (non-Javadoc) + * @see forge.item.InventoryItem#getItemType() + */ + @Override + public String getItemType() { + // TODO Auto-generated method stub + return "Set of limited mode decks"; + } + } diff --git a/src/main/java/forge/deck/DeckgenUtil.java b/src/main/java/forge/deck/DeckgenUtil.java index 5c505afc302..1e192ef7d34 100644 --- a/src/main/java/forge/deck/DeckgenUtil.java +++ b/src/main/java/forge/deck/DeckgenUtil.java @@ -105,7 +105,16 @@ public class DeckgenUtil { * @return {@link forge.deck.Deck} */ public static Deck getConstructedDeck(final String selection) { - return Singletons.getModel().getDecks().getConstructed().get(selection); + IStorage path = Singletons.getModel().getDecks().getConstructed(); + String name = selection; + int idxSlash = name.indexOf('/'); + while( idxSlash > 0 ) { + String sf = name.substring(0, idxSlash); + path = path.getFolders().get(sf); + name = name.substring(idxSlash+1); + idxSlash = name.indexOf('/'); + }; + return path.get(name); } public static Deck getPreconDeck(String selection) { diff --git a/src/main/java/forge/game/limited/CustomLimited.java b/src/main/java/forge/game/limited/CustomLimited.java index 10b6bf52e6d..e84368d76f9 100644 --- a/src/main/java/forge/game/limited/CustomLimited.java +++ b/src/main/java/forge/game/limited/CustomLimited.java @@ -82,6 +82,15 @@ public class CustomLimited extends DeckBase { return this.getName(); } + /* (non-Javadoc) + * @see forge.item.InventoryItem#getItemType() + */ + @Override + public String getItemType() { + // TODO Auto-generated method stub + return "Limited game setup"; + } + /** * Parses the. * diff --git a/src/main/java/forge/gui/toolbox/special/FDeckChooser.java b/src/main/java/forge/gui/toolbox/special/FDeckChooser.java index 2d149c74f2e..b8058274fff 100644 --- a/src/main/java/forge/gui/toolbox/special/FDeckChooser.java +++ b/src/main/java/forge/gui/toolbox/special/FDeckChooser.java @@ -29,7 +29,7 @@ import forge.gui.toolbox.FList; import forge.gui.toolbox.FRadioButton; import forge.gui.toolbox.FScrollPane; import forge.gui.toolbox.JXButtonPanel; -import forge.item.PreconDeck; +import forge.item.InventoryItem; import forge.quest.QuestController; import forge.quest.QuestEvent; import forge.quest.QuestEventChallenge; @@ -194,8 +194,7 @@ public class FDeckChooser extends JPanel { lst.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); final List customNames = new ArrayList(); - final IStorage allDecks = Singletons.getModel().getDecks().getConstructed(); - for (final Deck d : allDecks) { customNames.add(d.getName()); } + addDecksRecursive(Singletons.getModel().getDecks().getConstructed(), customNames, null); lst.setListData(customNames.toArray(ArrayUtils.EMPTY_STRING_ARRAY)); lst.setName(DeckgenUtil.DeckTypes.CUSTOM.toString()); @@ -210,14 +209,23 @@ public class FDeckChooser extends JPanel { lst.setSelectedIndex(0); } + private void addDecksRecursive(IStorage node, List customNames, String namePrefix ) { + String path = namePrefix == null ? "" : namePrefix + "/"; + for (final String fn : node.getFolders().getNames() ) + { + IStorage f = node.getFolders().get(fn); + addDecksRecursive(f, customNames, path + fn); + } + for (final T d : node) { customNames.add(path + d.getName()); } + } + /** Handles all control for "custom" radio button click. */ private void updatePrecons() { final JList lst = getLstDecks(); lst.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); final List customNames = new ArrayList(); - final IStorage allDecks = QuestController.getPrecons(); - for (final PreconDeck d : allDecks) { customNames.add(d.getName()); } + addDecksRecursive(QuestController.getPrecons(), customNames, null); lst.setListData(customNames.toArray(ArrayUtils.EMPTY_STRING_ARRAY)); lst.setName(DeckgenUtil.DeckTypes.PRECON.toString()); diff --git a/src/main/java/forge/util/storage/StorageImmediatelySerialized.java b/src/main/java/forge/util/storage/StorageImmediatelySerialized.java index bcc500f5381..2d984edc125 100644 --- a/src/main/java/forge/util/storage/StorageImmediatelySerialized.java +++ b/src/main/java/forge/util/storage/StorageImmediatelySerialized.java @@ -17,6 +17,9 @@ */ package forge.util.storage; +import com.google.common.base.Function; + +import forge.util.IItemReader; import forge.util.IItemSerializer; //reads and writeDeck Deck objects @@ -32,6 +35,15 @@ import forge.util.IItemSerializer; public class StorageImmediatelySerialized extends StorageBase { private final IItemSerializer serializer; + private final IStorage> subfolders; + + private final Function, IStorage> nestedFactory = new Function, IStorage>() { + @Override + public IStorage apply(IItemReader io) { + return new StorageImmediatelySerialized((IItemSerializer) io, true); + } + }; + /** *

* Constructor for DeckManager. @@ -40,8 +52,14 @@ public class StorageImmediatelySerialized extends StorageBase { * @param io the io */ public StorageImmediatelySerialized(final IItemSerializer io) { + this(io, false); + } + + + public StorageImmediatelySerialized(final IItemSerializer io, boolean withSubFolders) { super(io); this.serializer = io; + subfolders = withSubFolders ? new StorageNestedFolders(io, nestedFactory) : null; } /* @@ -65,4 +83,12 @@ public class StorageImmediatelySerialized extends StorageBase { public final void delete(final String deckName) { this.serializer.erase(this.map.remove(deckName)); } + + /* (non-Javadoc) + * @see forge.util.storage.StorageBase#getFolders() + */ + @Override + public IStorage> getFolders() { + return subfolders == null ? super.getFolders() : subfolders; + } } diff --git a/src/main/java/forge/util/storage/StorageNestedFolders.java b/src/main/java/forge/util/storage/StorageNestedFolders.java new file mode 100644 index 00000000000..ffdbdb4d858 --- /dev/null +++ b/src/main/java/forge/util/storage/StorageNestedFolders.java @@ -0,0 +1,36 @@ +package forge.util.storage; + +import java.io.File; +import java.util.HashMap; + +import org.apache.commons.lang.NotImplementedException; + +import com.google.common.base.Function; + +import forge.util.IItemReader; + + +public class StorageNestedFolders extends StorageBase> { + + public StorageNestedFolders(IItemReader io, Function, IStorage> factory) { + super(new HashMap>()); + for(File sf : io.getSubFolders() ) + { + map.put(sf.getName(), factory.apply(io.getReaderForFolder(sf))); + } + } + + // need code implementations for folder create/delete operations + + @Override + public void add(IStorage deck) { + // need folder name here! + throw new NotImplementedException(); + } + + @Override + public void delete(String deckName) { + throw new NotImplementedException(); + } + +}