Refactor deck import logic to be reusable by mobile game

Don't prompt about replacing deck contents if deck is empty
This commit is contained in:
drdev
2015-04-05 16:36:02 +00:00
parent 5f1000090d
commit 5f68844fa4
14 changed files with 280 additions and 155 deletions

2
.gitattributes vendored
View File

@@ -1254,6 +1254,7 @@ forge-gui-mobile/src/forge/card/GameEntityPicker.java -text
forge-gui-mobile/src/forge/deck/AddBasicLandsDialog.java -text forge-gui-mobile/src/forge/deck/AddBasicLandsDialog.java -text
forge-gui-mobile/src/forge/deck/FDeckChooser.java -text forge-gui-mobile/src/forge/deck/FDeckChooser.java -text
forge-gui-mobile/src/forge/deck/FDeckEditor.java -text forge-gui-mobile/src/forge/deck/FDeckEditor.java -text
forge-gui-mobile/src/forge/deck/FDeckImportDialog.java -text
forge-gui-mobile/src/forge/deck/FDeckViewer.java -text forge-gui-mobile/src/forge/deck/FDeckViewer.java -text
forge-gui-mobile/src/forge/deck/FSideboardDialog.java -text forge-gui-mobile/src/forge/deck/FSideboardDialog.java -text
forge-gui-mobile/src/forge/deck/FVanguardChooser.java -text forge-gui-mobile/src/forge/deck/FVanguardChooser.java -text
@@ -17594,6 +17595,7 @@ forge-gui/src/main/java/forge/control/WatchLocalGame.java -text
forge-gui/src/main/java/forge/control/package-info.java -text forge-gui/src/main/java/forge/control/package-info.java -text
forge-gui/src/main/java/forge/deck/ColorDeckGenerator.java -text forge-gui/src/main/java/forge/deck/ColorDeckGenerator.java -text
forge-gui/src/main/java/forge/deck/DeckGeneratorTheme.java -text forge-gui/src/main/java/forge/deck/DeckGeneratorTheme.java -text
forge-gui/src/main/java/forge/deck/DeckImportController.java -text
forge-gui/src/main/java/forge/deck/DeckProxy.java -text forge-gui/src/main/java/forge/deck/DeckProxy.java -text
forge-gui/src/main/java/forge/deck/DeckType.java -text forge-gui/src/main/java/forge/deck/DeckType.java -text
forge-gui/src/main/java/forge/deck/DeckgenUtil.java -text forge-gui/src/main/java/forge/deck/DeckgenUtil.java -text

View File

@@ -11,7 +11,6 @@ import forge.game.card.Card;
import forge.game.card.CardCollection; import forge.game.card.CardCollection;
import forge.game.card.CardLists; import forge.game.card.CardLists;
import forge.game.card.CardPredicates; import forge.game.card.CardPredicates;
import forge.game.card.CounterType;
import forge.game.cost.Cost; import forge.game.cost.Cost;
import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;

View File

@@ -206,11 +206,23 @@ public class Deck extends DeckBase implements Iterable<Entry<DeckSection, CardPo
public CardPool getAllCardsInASinglePool() { public CardPool getAllCardsInASinglePool() {
CardPool allCards = new CardPool(); // will count cards in this pool to enforce restricted CardPool allCards = new CardPool(); // will count cards in this pool to enforce restricted
allCards.addAll(this.getMain()); allCards.addAll(this.getMain());
if (this.has(DeckSection.Sideboard)) if (this.has(DeckSection.Sideboard)) {
allCards.addAll(this.get(DeckSection.Sideboard)); allCards.addAll(this.get(DeckSection.Sideboard));
if (this.has(DeckSection.Commander)) }
if (this.has(DeckSection.Commander)) {
allCards.addAll(this.get(DeckSection.Commander)); allCards.addAll(this.get(DeckSection.Commander));
}
// do not include schemes / avatars and any non-regular cards // do not include schemes / avatars and any non-regular cards
return allCards; return allCards;
} }
@Override
public boolean isEmpty() {
for (CardPool part : parts.values()) {
if (!part.isEmpty()) {
return false;
}
}
return true;
}
} }

View File

@@ -138,4 +138,6 @@ public abstract class DeckBase implements Serializable, Comparable<DeckBase>, In
public final String getBestFileName() { public final String getBestFileName() {
return this.getName().replaceAll("[^-_$#@.,{[()]} a-zA-Z0-9]", ""); return this.getName().replaceAll("[^-_$#@.,{[()]} a-zA-Z0-9]", "");
} }
public abstract boolean isEmpty();
} }

View File

@@ -147,4 +147,9 @@ public class DeckGroup extends DeckBase {
return arg1.getHumanDeck(); return arg1.getHumanDeck();
} }
}; };
@Override
public boolean isEmpty() {
return humanDeck == null || humanDeck.isEmpty();
}
} }

View File

@@ -19,31 +19,20 @@ package forge.screens.deckeditor;
import forge.deck.Deck; import forge.deck.Deck;
import forge.deck.DeckBase; import forge.deck.DeckBase;
import forge.deck.DeckImportController;
import forge.deck.DeckRecognizer; import forge.deck.DeckRecognizer;
import forge.deck.DeckRecognizer.TokenType; import forge.deck.DeckRecognizer.TokenType;
import forge.deck.DeckSection;
import forge.item.InventoryItem; import forge.item.InventoryItem;
import forge.item.PaperCard;
import forge.model.FModel;
import forge.screens.deckeditor.controllers.ACEditorBase; import forge.screens.deckeditor.controllers.ACEditorBase;
import forge.toolbox.*; import forge.toolbox.*;
import forge.view.FDialog; import forge.view.FDialog;
import org.apache.commons.lang3.StringUtils;
import javax.swing.*; import javax.swing.*;
import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener; import javax.swing.event.DocumentListener;
import javax.swing.text.BadLocationException;
import javax.swing.text.Element;
import javax.swing.text.ElementIterator;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
import java.awt.event.WindowEvent; import java.awt.event.WindowEvent;
import java.text.DateFormatSymbols;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List; import java.util.List;
/** /**
@@ -94,18 +83,13 @@ public class DeckImport<TItem extends InventoryItem, TModel extends DeckBase> ex
private final FComboBox<String> monthDropdown = new FComboBox<String>(); //don't need wrappers since skin can't change while this dialog is open private final FComboBox<String> monthDropdown = new FComboBox<String>(); //don't need wrappers since skin can't change while this dialog is open
private final FComboBox<Integer> yearDropdown = new FComboBox<Integer>(); private final FComboBox<Integer> yearDropdown = new FComboBox<Integer>();
/** The tokens. */ private final DeckImportController controller;
private final List<DeckRecognizer.Token> tokens = new ArrayList<DeckRecognizer.Token>();
private final ACEditorBase<TItem, TModel> host; private final ACEditorBase<TItem, TModel> host;
/**
* Instantiates a new deck import.
*
* @param g
* the g
*/
public DeckImport(final ACEditorBase<TItem, TModel> g, boolean allowCardsFromAllSets) { public DeckImport(final ACEditorBase<TItem, TModel> g, boolean allowCardsFromAllSets) {
this.controller = new DeckImportController(!g.getDeckController().isEmpty(),
newEditionCheck, dateTimeCheck, onlyCoreExpCheck, monthDropdown, yearDropdown);
this.host = g; this.host = g;
final int wWidth = 700; final int wWidth = 700;
@@ -130,7 +114,6 @@ public class DeckImport<TItem extends InventoryItem, TModel extends DeckBase> ex
this.add(monthDropdown, "cell 0 3, w 20%, ax left, split 2, pad 0 4 0 0"); this.add(monthDropdown, "cell 0 3, w 20%, ax left, split 2, pad 0 4 0 0");
this.add(yearDropdown, "w 15%"); this.add(yearDropdown, "w 15%");
fillDateDropdowns();
this.onlyCoreExpCheck.setSelected(!allowCardsFromAllSets); this.onlyCoreExpCheck.setSelected(!allowCardsFromAllSets);
this.add(this.onlyCoreExpCheck, "cell 0 4, w 50%, ax c"); this.add(this.onlyCoreExpCheck, "cell 0 4, w 50%, ax c");
@@ -153,11 +136,9 @@ public class DeckImport<TItem extends InventoryItem, TModel extends DeckBase> ex
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override
public void actionPerformed(final ActionEvent e) { public void actionPerformed(final ActionEvent e) {
final String warning = "This will replace contents of your currently open deck with whatever you are importing. Proceed?"; final Deck toSet = controller.accept();
if (!FOptionPane.showConfirmDialog(warning, "Replacing old deck")) { if (toSet == null) { return; }
return;
}
final Deck toSet = DeckImport.this.buildDeck();
DeckImport.this.host.getDeckController().setModel((TModel) toSet); DeckImport.this.host.getDeckController().setModel((TModel) toSet);
DeckImport.this.processWindowEvent(new WindowEvent(DeckImport.this, WindowEvent.WINDOW_CLOSING)); DeckImport.this.processWindowEvent(new WindowEvent(DeckImport.this, WindowEvent.WINDOW_CLOSING));
} }
@@ -188,63 +169,54 @@ public class DeckImport<TItem extends InventoryItem, TModel extends DeckBase> ex
} }
/** /**
* TODO: Write javadoc for this method. * The Class OnChangeTextUpdate.
*/ */
private void fillDateDropdowns() { protected class OnChangeTextUpdate implements DocumentListener {
DateFormatSymbols dfs = new DateFormatSymbols(); private void onChange() {
monthDropdown.removeAllItems(); parseAndDisplay();
String[] months = dfs.getMonths();
for(String monthName : months)
if(!StringUtils.isBlank(monthName))
monthDropdown.addItem(monthName);
int yearNow = Calendar.getInstance().get(Calendar.YEAR);
for(int i = yearNow; i >= 1993; i--)
yearDropdown.addItem(Integer.valueOf(i));
} }
private void readInput() { @Override
this.tokens.clear(); public final void insertUpdate(final DocumentEvent e) {
final ElementIterator it = new ElementIterator(this.txtInput.getDocument().getDefaultRootElement()); this.onChange();
Element e;
DeckRecognizer recognizer = new DeckRecognizer(newEditionCheck.isSelected(), onlyCoreExpCheck.isSelected(), FModel.getMagicDb().getCommonCards());
if (dateTimeCheck.isSelected()) {
recognizer.setDateConstraint(monthDropdown.getSelectedIndex(), (Integer)yearDropdown.getSelectedItem());
}
while ((e = it.next()) != null) {
if (!e.isLeaf()) {
continue;
}
final int rangeStart = e.getStartOffset();
final int rangeEnd = e.getEndOffset();
try {
final String line = this.txtInput.getText(rangeStart, rangeEnd - rangeStart);
this.tokens.add(recognizer.recognizeLine(line));
}
catch (final BadLocationException ex) {
}
}
} }
private void displayTokens() { @Override
if(this.tokens.isEmpty()) public final void removeUpdate(final DocumentEvent e) {
this.htmlOutput.setText(HTML_WELCOME_TEXT); this.onChange();
}
@Override
public void changedUpdate(final DocumentEvent e) {
} // Happend only on ENTER pressed
}
private void parseAndDisplay() {
List<DeckRecognizer.Token> tokens = controller.parseInput(txtInput.getText());
displayTokens(tokens);
updateSummaries(tokens);
}
private void displayTokens(List<DeckRecognizer.Token> tokens) {
if (tokens.isEmpty()) {
htmlOutput.setText(HTML_WELCOME_TEXT);
}
else { else {
final StringBuilder sbOut = new StringBuilder("<html>"); final StringBuilder sbOut = new StringBuilder("<html>");
sbOut.append(DeckImport.STYLESHEET); sbOut.append(DeckImport.STYLESHEET);
for (final DeckRecognizer.Token t : this.tokens) { for (final DeckRecognizer.Token t : tokens) {
sbOut.append(this.makeHtmlViewOfToken(t)); sbOut.append(makeHtmlViewOfToken(t));
} }
sbOut.append("</html>"); sbOut.append("</html>");
this.htmlOutput.setText(sbOut.toString()); htmlOutput.setText(sbOut.toString());
} }
} }
private void updateSummaries() { private void updateSummaries(List<DeckRecognizer.Token> tokens) {
final int[] cardsOk = new int[2]; final int[] cardsOk = new int[2];
final int[] cardsUnknown = new int[2]; final int[] cardsUnknown = new int[2];
int idx = 0; int idx = 0;
for (final DeckRecognizer.Token t : this.tokens) { for (final DeckRecognizer.Token t : tokens) {
if (t.getType() == TokenType.KnownCard) { if (t.getType() == TokenType.KnownCard) {
cardsOk[idx] += t.getNumber(); cardsOk[idx] += t.getNumber();
} }
@@ -255,81 +227,9 @@ public class DeckImport<TItem extends InventoryItem, TModel extends DeckBase> ex
idx = 1; idx = 1;
} }
} }
this.summaryMain.setText(String.format("Main: %d cards recognized, %d unknown cards", cardsOk[0], cardsUnknown[0])); summaryMain.setText(String.format("Main: %d cards recognized, %d unknown cards", cardsOk[0], cardsUnknown[0]));
this.summarySide.setText(String.format("Sideboard: %d cards recognized, %d unknown cards", cardsOk[1], cardsUnknown[1])); summarySide.setText(String.format("Sideboard: %d cards recognized, %d unknown cards", cardsOk[1], cardsUnknown[1]));
this.cmdAccept.setEnabled(cardsOk[0] > 0); cmdAccept.setEnabled(cardsOk[0] > 0);
}
private Deck buildDeck() {
final Deck result = new Deck();
boolean isMain = true;
for (final DeckRecognizer.Token t : this.tokens) {
final DeckRecognizer.TokenType type = t.getType();
if ((type == DeckRecognizer.TokenType.SectionName) && t.getText().toLowerCase().contains("side")) {
isMain = false;
}
if (type != DeckRecognizer.TokenType.KnownCard) {
continue;
}
final PaperCard crd = t.getCard();
if (isMain) {
result.getMain().add(crd, t.getNumber());
}
else {
result.getOrCreate(DeckSection.Sideboard).add(crd, t.getNumber());
}
}
return result;
}
protected void parseAndDisplay() {
readInput();
displayTokens();
updateSummaries();
}
/**
* The Class OnChangeTextUpdate.
*/
protected class OnChangeTextUpdate implements DocumentListener {
private void onChange() {
DeckImport.this.parseAndDisplay();
}
/*
* (non-Javadoc)
*
* @see
* javax.swing.event.DocumentListener#insertUpdate(javax.swing.event
* .DocumentEvent)
*/
@Override
public final void insertUpdate(final DocumentEvent e) {
this.onChange();
}
/*
* (non-Javadoc)
*
* @see
* javax.swing.event.DocumentListener#removeUpdate(javax.swing.event
* .DocumentEvent)
*/
@Override
public final void removeUpdate(final DocumentEvent e) {
this.onChange();
}
/*
* (non-Javadoc)
*
* @see
* javax.swing.event.DocumentListener#changedUpdate(javax.swing.event
* .DocumentEvent)
*/
@Override
public void changedUpdate(final DocumentEvent e) {
} // Happend only on ENTER pressed
} }
private String makeHtmlViewOfToken(final DeckRecognizer.Token token) { private String makeHtmlViewOfToken(final DeckRecognizer.Token token) {
@@ -345,9 +245,7 @@ public class DeckImport<TItem extends InventoryItem, TModel extends DeckBase> ex
case Comment: case Comment:
return String.format("<div class='comment'>%s</div>", token.getText()); return String.format("<div class='comment'>%s</div>", token.getText());
default: default:
break;
}
return ""; return "";
} }
}
} }

View File

@@ -72,6 +72,10 @@ public class DeckController<T extends DeckBase> {
return this.modelPath; return this.modelPath;
} }
public boolean isEmpty() {
return model == null || model.isEmpty();
}
/** /**
* Sets the model. * Sets the model.
* *

View File

@@ -319,7 +319,6 @@ public enum CSubmenuPreferences implements ICDoc {
private <E> void addComboBoxListener(final FComboBox<E> comboBox, final ForgePreferences.FPref setting) { private <E> void addComboBoxListener(final FComboBox<E> comboBox, final ForgePreferences.FPref setting) {
comboBox.addItemListener(new ItemListener() { comboBox.addItemListener(new ItemListener() {
@SuppressWarnings("unchecked")
@Override @Override
public void itemStateChanged(final ItemEvent e) { public void itemStateChanged(final ItemEvent e) {
E selectedType = (E) comboBox.getSelectedItem(); E selectedType = (E) comboBox.getSelectedItem();

View File

@@ -94,6 +94,12 @@ public class FComboBox<E> extends SkinnedComboBox<E> implements IComboBox<E> {
return maxWidth + 28; //leave room for arrow and padding return maxWidth + 28; //leave room for arrow and padding
} }
@SuppressWarnings("unchecked")
@Override
public E getSelectedItem() {
return (E)super.getSelectedItem();
}
@Override @Override
protected void paintComponent(Graphics g) { protected void paintComponent(Graphics g) {
super.paintComponent(g); super.paintComponent(g);

View File

@@ -306,6 +306,27 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
setSelectedPage(getMainDeckPage()); //select main deck page if needed so main deck if visible below dialog setSelectedPage(getMainDeckPage()); //select main deck page if needed so main deck if visible below dialog
} }
})); }));
if (!isLimitedEditor()) {
addItem(new FMenuItem("Import Deck", FSkinImage.OPEN, new FEventHandler() {
@Override
public void handleEvent(FEvent e) {
FDeckImportDialog dialog = new FDeckImportDialog(deck.isEmpty(), new Callback<Deck>() {
@Override
public void run(Deck importedDeck) {
getMainDeckPage().setCards(importedDeck.getMain());
if (getSideboardPage() != null) {
getSideboardPage().setCards(importedDeck.getOrCreate(DeckSection.Sideboard));
}
if (getCommanderPage() != null) {
getCommanderPage().setCards(importedDeck.getOrCreate(DeckSection.Commander));
}
}
});
dialog.show();
setSelectedPage(getMainDeckPage()); //select main deck page if needed so main deck if visible below dialog
}
}));
}
if (allowRename()) { if (allowRename()) {
addItem(new FMenuItem("Rename Deck", FSkinImage.EDIT, new FEventHandler() { addItem(new FMenuItem("Rename Deck", FSkinImage.EDIT, new FEventHandler() {
@Override @Override

View File

@@ -0,0 +1,80 @@
/*
* 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 <http://www.gnu.org/licenses/>.
*/
package forge.deck;
import forge.toolbox.FCheckBox;
import forge.toolbox.FComboBox;
import forge.toolbox.FDialog;
import forge.toolbox.FEvent;
import forge.toolbox.FEvent.FEventHandler;
import forge.toolbox.FOptionPane;
import forge.toolbox.FTextArea;
import forge.util.Callback;
public class FDeckImportDialog extends FDialog {
private final Callback<Deck> callback;
private final FTextArea txtInput = add(new FTextArea(true));
private final FCheckBox newEditionCheck = new FCheckBox("Import latest version of card", true);
private final FCheckBox dateTimeCheck = new FCheckBox("Use only sets released before:", false);
private final FCheckBox onlyCoreExpCheck = new FCheckBox("Use only core and expansion sets", true);
private final FComboBox<String> monthDropdown = new FComboBox<String>(); //don't need wrappers since skin can't change while this dialog is open
private final FComboBox<Integer> yearDropdown = new FComboBox<Integer>();
private final DeckImportController controller;
public FDeckImportDialog(final boolean replacingDeck, final Callback<Deck> callback0) {
super("Import Deck", 2);
callback = callback0;
controller = new DeckImportController(replacingDeck, newEditionCheck, dateTimeCheck, onlyCoreExpCheck, monthDropdown, yearDropdown);
initButton(0, "OK", new FEventHandler() {
@Override
public void handleEvent(FEvent e) {
controller.parseInput(txtInput.getText());
Deck deck = controller.accept();
if (deck == null) { return; }
hide();
callback.run(deck);
}
});
initButton(1, "Cancel", new FEventHandler() {
@Override
public void handleEvent(FEvent e) {
hide();
}
});
}
@Override
protected float layoutAndGetHeight(float width, float maxHeight) {
float padding = FOptionPane.PADDING;
float x = padding;
float y = padding;
float w = width - 2 * padding;
float h = maxHeight - 2 * padding;
txtInput.setBounds(x, y, w, h);
return maxHeight;
}
}

View File

@@ -0,0 +1,93 @@
package forge.deck;
import java.text.DateFormatSymbols;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import forge.interfaces.ICheckBox;
import forge.interfaces.IComboBox;
import forge.item.PaperCard;
import forge.model.FModel;
import forge.util.gui.SOptionPane;
public class DeckImportController {
private final boolean replacingDeck;
private final ICheckBox newEditionCheck, dateTimeCheck, onlyCoreExpCheck;
private final IComboBox<String> monthDropdown;
private final IComboBox<Integer> yearDropdown;
private final List<DeckRecognizer.Token> tokens = new ArrayList<DeckRecognizer.Token>();
public DeckImportController(boolean replacingDeck0, ICheckBox newEditionCheck0, ICheckBox dateTimeCheck0, ICheckBox onlyCoreExpCheck0, IComboBox<String> monthDropdown0, IComboBox<Integer> yearDropdown0) {
replacingDeck = replacingDeck0;
newEditionCheck = newEditionCheck0;
dateTimeCheck = dateTimeCheck0;
onlyCoreExpCheck = onlyCoreExpCheck0;
monthDropdown = monthDropdown0;
yearDropdown = yearDropdown0;
fillDateDropdowns();
}
private void fillDateDropdowns() {
DateFormatSymbols dfs = new DateFormatSymbols();
monthDropdown.removeAllItems();
String[] months = dfs.getMonths();
for (String monthName : months) {
if (!StringUtils.isBlank(monthName)) {
monthDropdown.addItem(monthName);
}
}
int yearNow = Calendar.getInstance().get(Calendar.YEAR);
for (int i = yearNow; i >= 1993; i--) {
yearDropdown.addItem(Integer.valueOf(i));
}
}
public List<DeckRecognizer.Token> parseInput(String input) {
tokens.clear();
DeckRecognizer recognizer = new DeckRecognizer(newEditionCheck.isSelected(), onlyCoreExpCheck.isSelected(), FModel.getMagicDb().getCommonCards());
if (dateTimeCheck.isSelected()) {
recognizer.setDateConstraint(monthDropdown.getSelectedIndex(), yearDropdown.getSelectedItem());
}
String[] lines = input.split("\n");
for (String line : lines) {
tokens.add(recognizer.recognizeLine(line));
}
return tokens;
}
public Deck accept() {
if (tokens.isEmpty()) { return null; }
if (replacingDeck) {
final String warning = "This will replace contents of the current deck with whatever you are importing.\n\nProceed?";
if (!SOptionPane.showConfirmDialog(warning, "Replace Current Deck", "Replace", "Cancel")) {
return null;
}
}
final Deck result = new Deck();
boolean isMain = true;
for (final DeckRecognizer.Token t : tokens) {
final DeckRecognizer.TokenType type = t.getType();
if ((type == DeckRecognizer.TokenType.SectionName) && t.getText().toLowerCase().contains("side")) {
isMain = false;
}
if (type != DeckRecognizer.TokenType.KnownCard) {
continue;
}
final PaperCard crd = t.getCard();
if (isMain) {
result.getMain().add(crd, t.getNumber());
}
else {
result.getOrCreate(DeckSection.Sideboard).add(crd, t.getNumber());
}
}
return result;
}
}

View File

@@ -9,4 +9,6 @@ public interface IComboBox<E> {
void setSelectedIndex(int index); void setSelectedIndex(int index);
void addItem(E item); void addItem(E item);
void removeAllItems(); void removeAllItems();
int getSelectedIndex();
E getSelectedItem();
} }

View File

@@ -93,7 +93,6 @@ public class CustomLimited extends DeckBase {
* @return the custom limited * @return the custom limited
*/ */
public static CustomLimited parse(final List<String> dfData, final IStorage<Deck> cubes) { public static CustomLimited parse(final List<String> dfData, final IStorage<Deck> cubes) {
final FileSection data = FileSection.parse(dfData, ":"); final FileSection data = FileSection.parse(dfData, ":");
List<Pair<String, Integer>> slots = new ArrayList<Pair<String,Integer>>(); List<Pair<String, Integer>> slots = new ArrayList<Pair<String,Integer>>();
@@ -117,8 +116,6 @@ public class CustomLimited extends DeckBase {
return cd; return cd;
} }
/** /**
* Gets the num packs. * Gets the num packs.
* *
@@ -177,4 +174,9 @@ public class CustomLimited extends DeckBase {
public boolean isSingleton() { public boolean isSingleton() {
return singleton; return singleton;
} }
@Override
public boolean isEmpty() {
return cardPool.isEmpty();
}
} }