Subfolders for constructed decks work in r/o mode (part 2 of ~3)

This commit is contained in:
Maxmtg
2013-08-19 22:40:10 +00:00
parent df6860294d
commit ada5fa5056
10 changed files with 116 additions and 9 deletions

1
.gitattributes vendored
View File

@@ -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

View File

@@ -49,7 +49,7 @@ public class CardCollections {
public CardCollections() {
StopWatch sw = new StopWatch();
sw.start();
this.constructed = new StorageImmediatelySerialized<Deck>(new DeckSerializer(new File(NewConstants.DECK_CONSTRUCTED_DIR), true));
this.constructed = new StorageImmediatelySerialized<Deck>(new DeckSerializer(new File(NewConstants.DECK_CONSTRUCTED_DIR), true), true);
this.draft = new StorageImmediatelySerialized<DeckGroup>(new DeckGroupSerializer(new File(NewConstants.DECK_DRAFT_DIR)));
this.sealed = new StorageImmediatelySerialized<DeckGroup>(new DeckGroupSerializer(new File(NewConstants.DECK_SEALED_DIR)));
this.cube = new StorageImmediatelySerialized<Deck>(new DeckSerializer(new File(NewConstants.DECK_CUBE_DIR)));

View File

@@ -77,7 +77,14 @@ public class Deck extends DeckBase implements Iterable<Entry<DeckSection, CardPo
getOrCreate(DeckSection.Main);
}
/* (non-Javadoc)
* @see forge.item.InventoryItem#getItemType()
*/
@Override
public String getItemType() {
return "Deck";
}
@Override
public int hashCode() {
return this.getName().hashCode();

View File

@@ -19,11 +19,13 @@ package forge.deck;
import java.io.Serializable;
import forge.item.InventoryItem;
/**
* TODO: Write javadoc for this type.
*
*/
public abstract class DeckBase implements Serializable, Comparable<DeckBase> {
public abstract class DeckBase implements Serializable, Comparable<DeckBase>, InventoryItem {
private static final long serialVersionUID = -7538150536939660052L;
// gameType is from Constant.GameType, like GameType.Regular

View File

@@ -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";
}
}

View File

@@ -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<Deck> 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) {

View File

@@ -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.
*

View File

@@ -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<String> customNames = new ArrayList<String>();
final IStorage<Deck> 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 <T extends InventoryItem> void addDecksRecursive(IStorage<T> node, List<String> customNames, String namePrefix ) {
String path = namePrefix == null ? "" : namePrefix + "/";
for (final String fn : node.getFolders().getNames() )
{
IStorage<T> 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<String> lst = getLstDecks();
lst.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
final List<String> customNames = new ArrayList<String>();
final IStorage<PreconDeck> 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());

View File

@@ -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<T> extends StorageBase<T> {
private final IItemSerializer<T> serializer;
private final IStorage<IStorage<T>> subfolders;
private final Function<IItemReader<T>, IStorage<T>> nestedFactory = new Function<IItemReader<T>, IStorage<T>>() {
@Override
public IStorage<T> apply(IItemReader<T> io) {
return new StorageImmediatelySerialized<T>((IItemSerializer<T>) io, true);
}
};
/**
* <p>
* Constructor for DeckManager.
@@ -40,8 +52,14 @@ public class StorageImmediatelySerialized<T> extends StorageBase<T> {
* @param io the io
*/
public StorageImmediatelySerialized(final IItemSerializer<T> io) {
this(io, false);
}
public StorageImmediatelySerialized(final IItemSerializer<T> io, boolean withSubFolders) {
super(io);
this.serializer = io;
subfolders = withSubFolders ? new StorageNestedFolders<T>(io, nestedFactory) : null;
}
/*
@@ -65,4 +83,12 @@ public class StorageImmediatelySerialized<T> extends StorageBase<T> {
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<IStorage<T>> getFolders() {
return subfolders == null ? super.getFolders() : subfolders;
}
}

View File

@@ -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<T> extends StorageBase<IStorage<T>> {
public StorageNestedFolders(IItemReader<T> io, Function<IItemReader<T>, IStorage<T>> factory) {
super(new HashMap<String, IStorage<T>>());
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<T> deck) {
// need folder name here!
throw new NotImplementedException();
}
@Override
public void delete(String deckName) {
throw new NotImplementedException();
}
}