Create DeckManager

This commit is contained in:
drdev
2014-01-05 19:21:15 +00:00
parent a22a3dc849
commit 8b0e20aa9e
25 changed files with 758 additions and 234 deletions

9
.gitattributes vendored
View File

@@ -68,6 +68,7 @@ forge-core/src/main/java/forge/deck/io/OldDeckFileFormatException.java -text
forge-core/src/main/java/forge/deck/io/package-info.java -text
forge-core/src/main/java/forge/deck/package-info.java -text
forge-core/src/main/java/forge/item/BoosterPack.java -text
forge-core/src/main/java/forge/item/DeckBox.java -text
forge-core/src/main/java/forge/item/FatPack.java -text
forge-core/src/main/java/forge/item/IPaperCard.java -text
forge-core/src/main/java/forge/item/InventoryItem.java -text
@@ -15473,6 +15474,7 @@ forge-gui/src/main/java/forge/gui/toolbox/imaging/FImagePanel.java -text
forge-gui/src/main/java/forge/gui/toolbox/imaging/FImageUtil.java -text
forge-gui/src/main/java/forge/gui/toolbox/imaging/ImageUtil.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/CardManager.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/DeckManager.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/ItemManager.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/ItemManagerContainer.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/ItemManagerModel.java -text
@@ -15490,6 +15492,13 @@ forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardSearchFilter.j
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardSetFilter.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardToughnessFilter.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardTypeFilter.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/DeckColorFilter.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/DeckFormatFilter.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/DeckQuestWorldFilter.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/DeckSearchFilter.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/DeckSetFilter.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/DeckStatTypeFilter.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/FormatFilter.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/ItemFilter.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/ListLabelFilter.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/StatTypeFilter.java -text

View File

@@ -105,7 +105,7 @@ public final class CardDb implements ICardDatabase {
}
private void addCard(PaperCard paperCard) {
allCardsByName.put(paperCard.name, paperCard);
allCardsByName.put(paperCard.getName(), paperCard);
}
private void reIndex() {

View File

@@ -134,5 +134,4 @@ public class DeckGroup extends DeckBase {
return arg1.getName();
}
};
}

View File

@@ -0,0 +1,73 @@
/*
* Forge: Play Magic: the Gathering.
* Copyright (C) 2011 Nate
*
* 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.item;
import java.util.Map.Entry;
import com.google.common.base.Predicate;
import forge.deck.CardPool;
import forge.deck.Deck;
import forge.deck.DeckSection;
/**
* A deck box containing a deck
*
*/
public class DeckBox implements InventoryItem {
private final Deck deck;
@Override
public String getName() {
return this.deck.getName();
}
@Override
public String getItemType() {
return "Deck";
}
public DeckBox(final Deck deck0) {
this.deck = deck0;
}
//create predicate that applys a card predicate to all cards in deck
public static final Predicate<DeckBox> createPredicate(final Predicate<PaperCard> cardPredicate) {
return new Predicate<DeckBox>() {
@Override
public boolean apply(DeckBox input) {
for (Entry<DeckSection, CardPool> deckEntry : input.deck) {
switch (deckEntry.getKey()) {
case Main:
case Sideboard:
case Commander:
for (Entry<PaperCard, Integer> poolEntry : deckEntry.getValue()) {
if (!cardPredicate.apply(poolEntry.getKey())) {
return false; //all cards in deck must pass card predicate to pass deck predicate
}
}
break;
default:
break; //ignore other sections
}
}
return true;
}
};
}
}

View File

@@ -35,10 +35,10 @@ public final class PaperCard implements Comparable<IPaperCard>, InventoryItemFro
private final transient CardRules rules;
// These fields are kinda PK for PrintedCard
public final String name;
public final String edition;
public final int artIndex;
public final boolean foil;
private final String name;
private final String edition;
private final int artIndex;
private final boolean foil;
// Calculated fields are below:
private final transient CardRarity rarity; // rarity is given in ctor when set is assigned

View File

@@ -0,0 +1,111 @@
package forge.gui.toolbox.itemmanager;
import java.util.List;
import javax.swing.JMenu;
import forge.Singletons;
import forge.game.GameFormat;
import forge.gui.GuiUtils;
import forge.gui.home.quest.DialogChooseSets;
import forge.gui.toolbox.itemmanager.filters.DeckColorFilter;
import forge.gui.toolbox.itemmanager.filters.DeckFormatFilter;
import forge.gui.toolbox.itemmanager.filters.DeckQuestWorldFilter;
import forge.gui.toolbox.itemmanager.filters.DeckSearchFilter;
import forge.gui.toolbox.itemmanager.filters.DeckSetFilter;
import forge.gui.toolbox.itemmanager.filters.ItemFilter;
import forge.item.DeckBox;
import forge.quest.QuestWorld;
/**
* ItemManager for cards
*
*/
@SuppressWarnings("serial")
public final class DeckManager extends ItemManager<DeckBox> {
public DeckManager(boolean wantUnique0) {
super(DeckBox.class, wantUnique0);
}
@Override
protected void addDefaultFilters() {
addDefaultFilters(this);
}
@Override
protected ItemFilter<DeckBox> createSearchFilter() {
return createSearchFilter(this);
}
@Override
protected void buildAddFilterMenu(JMenu menu) {
buildAddFilterMenu(menu, this);
}
/* Static overrides shared with SpellShopManager*/
public static void addDefaultFilters(final ItemManager<? super DeckBox> itemManager) {
itemManager.addFilter(new DeckColorFilter(itemManager));
}
public static ItemFilter<DeckBox> createSearchFilter(final ItemManager<? super DeckBox> itemManager) {
return new DeckSearchFilter(itemManager);
}
public static void buildAddFilterMenu(JMenu menu, final ItemManager<? super DeckBox> itemManager) {
GuiUtils.addSeparator(menu); //separate from current search item
JMenu fmt = GuiUtils.createMenu("Format");
for (final GameFormat f : Singletons.getModel().getFormats()) {
GuiUtils.addMenuItem(fmt, f.getName(), null, new Runnable() {
@Override
public void run() {
itemManager.addFilter(new DeckFormatFilter(itemManager, f));
}
}, DeckFormatFilter.canAddFormat(f, itemManager.getFilter(DeckFormatFilter.class)));
}
menu.add(fmt);
GuiUtils.addMenuItem(menu, "Sets...", null, new Runnable() {
@Override
public void run() {
DeckSetFilter existingFilter = itemManager.getFilter(DeckSetFilter.class);
if (existingFilter != null) {
existingFilter.edit();
}
else {
final DialogChooseSets dialog = new DialogChooseSets(null, null, true);
dialog.setOkCallback(new Runnable() {
@Override
public void run() {
List<String> sets = dialog.getSelectedSets();
if (!sets.isEmpty()) {
itemManager.addFilter(new DeckSetFilter(itemManager, sets, dialog.getWantReprints()));
}
}
});
}
}
});
JMenu world = GuiUtils.createMenu("Quest world");
for (final QuestWorld w : Singletons.getModel().getWorlds()) {
GuiUtils.addMenuItem(world, w.getName(), null, new Runnable() {
@Override
public void run() {
itemManager.addFilter(new DeckQuestWorldFilter(itemManager, w));
}
}, DeckQuestWorldFilter.canAddQuestWorld(w, itemManager.getFilter(DeckQuestWorldFilter.class)));
}
menu.add(world);
GuiUtils.addSeparator(menu);
GuiUtils.addMenuItem(menu, "Colors", null, new Runnable() {
@Override
public void run() {
itemManager.addFilter(new DeckColorFilter(itemManager));
}
}, itemManager.getFilter(DeckColorFilter.class) == null);
}
}

View File

@@ -2,11 +2,19 @@ package forge.gui.toolbox.itemmanager;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import forge.card.CardRules;
import forge.card.CardRulesPredicates;
import forge.card.MagicColor;
import forge.card.CardRulesPredicates.Presets;
import forge.game.GameFormat;
import forge.gui.toolbox.FLabel;
import forge.gui.toolbox.itemmanager.SItemManagerUtil.StatTypes;
import forge.item.InventoryItem;
import forge.item.PaperCard;
import forge.util.PredicateString.StringOp;
@@ -69,6 +77,74 @@ public class SFilterUtil {
return false;
}
};
public static Predicate<PaperCard> buildColorFilter(Map<SItemManagerUtil.StatTypes, FLabel> buttonMap) {
byte colors = 0;
if (buttonMap.get(StatTypes.WHITE).getSelected()) {
colors |= MagicColor.WHITE;
}
if (buttonMap.get(StatTypes.BLUE).getSelected()) {
colors |= MagicColor.BLUE;
}
if (buttonMap.get(StatTypes.BLACK).getSelected()) {
colors |= MagicColor.BLACK;
}
if (buttonMap.get(StatTypes.RED).getSelected()) {
colors |= MagicColor.RED;
}
if (buttonMap.get(StatTypes.GREEN).getSelected()) {
colors |= MagicColor.GREEN;
}
boolean wantColorless = buttonMap.get(StatTypes.COLORLESS).getSelected();
boolean wantMulticolor = buttonMap.get(StatTypes.MULTICOLOR).getSelected();
Predicate<CardRules> preFinal = null;
if (wantMulticolor) {
if (colors == 0) { //handle showing all multi-color cards if all 5 colors are filtered
preFinal = Presets.IS_MULTICOLOR;
if (wantColorless) {
preFinal = Predicates.or(preFinal, Presets.IS_COLORLESS);
}
}
else if (colors != MagicColor.ALL_COLORS) {
preFinal = CardRulesPredicates.canCastWithAvailable(colors);
}
}
else {
preFinal = Predicates.not(Presets.IS_MULTICOLOR);
if (colors != MagicColor.ALL_COLORS) {
preFinal = Predicates.and(CardRulesPredicates.canCastWithAvailable(colors), preFinal);
}
}
if (!wantColorless) {
if (colors != 0 && colors != MagicColor.ALL_COLORS) {
//if colorless filtered out ensure phyrexian cards don't appear
//unless at least one of their colors is selected
preFinal = Predicates.and(preFinal, CardRulesPredicates.isColor(colors));
}
preFinal = SFilterUtil.optimizedAnd(preFinal, Predicates.not(Presets.IS_COLORLESS));
}
if (preFinal == null) {
return new Predicate<PaperCard>() { //use custom return true delegate to validate the item is a card
@Override
public boolean apply(PaperCard card) {
return true;
}
};
}
return Predicates.compose(preFinal, PaperCard.FN_GET_RULES);
}
public static Predicate<PaperCard> buildFormatFilter(Set<GameFormat> formats, boolean allowReprints) {
List<Predicate<PaperCard>> predicates = new ArrayList<Predicate<PaperCard>>();
for (GameFormat f : formats) {
predicates.add(allowReprints ? f.getFilterRules() : f.getFilterPrinted());
}
return Predicates.or(predicates);
}
public static <T> Predicate<T> optimizedAnd(Predicate<T> p1, Predicate<T> p2) {
return p1 == null ? p2 : (p2 == null ? p1 : Predicates.and(p1, p2));

View File

@@ -3,12 +3,6 @@ package forge.gui.toolbox.itemmanager.filters;
import javax.swing.JPanel;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import forge.card.CardRules;
import forge.card.CardRulesPredicates;
import forge.card.MagicColor;
import forge.card.CardRulesPredicates.Presets;
import forge.gui.toolbox.itemmanager.ItemManager;
import forge.gui.toolbox.itemmanager.SFilterUtil;
import forge.gui.toolbox.itemmanager.SpellShopManager;
@@ -34,73 +28,11 @@ public class CardColorFilter extends StatTypeFilter<PaperCard> {
if (itemManager instanceof SpellShopManager) {
addToggleButton(widget, StatTypes.PACK_OR_DECK);
}
addToggleButton(widget, StatTypes.WHITE);
addToggleButton(widget, StatTypes.BLUE);
addToggleButton(widget, StatTypes.BLACK);
addToggleButton(widget, StatTypes.RED);
addToggleButton(widget, StatTypes.GREEN);
addToggleButton(widget, StatTypes.COLORLESS);
addToggleButton(widget, StatTypes.MULTICOLOR);
addColorButtons(widget);
}
@Override
protected final Predicate<PaperCard> buildPredicate() {
byte colors = 0;
if (buttonMap.get(StatTypes.WHITE).getSelected()) {
colors |= MagicColor.WHITE;
}
if (buttonMap.get(StatTypes.BLUE).getSelected()) {
colors |= MagicColor.BLUE;
}
if (buttonMap.get(StatTypes.BLACK).getSelected()) {
colors |= MagicColor.BLACK;
}
if (buttonMap.get(StatTypes.RED).getSelected()) {
colors |= MagicColor.RED;
}
if (buttonMap.get(StatTypes.GREEN).getSelected()) {
colors |= MagicColor.GREEN;
}
boolean wantColorless = buttonMap.get(StatTypes.COLORLESS).getSelected();
boolean wantMulticolor = buttonMap.get(StatTypes.MULTICOLOR).getSelected();
Predicate<CardRules> preFinal = null;
if (wantMulticolor) {
if (colors == 0) { //handle showing all multi-color cards if all 5 colors are filtered
preFinal = Presets.IS_MULTICOLOR;
if (wantColorless) {
preFinal = Predicates.or(preFinal, Presets.IS_COLORLESS);
}
}
else if (colors != MagicColor.ALL_COLORS) {
preFinal = CardRulesPredicates.canCastWithAvailable(colors);
}
}
else {
preFinal = Predicates.not(Presets.IS_MULTICOLOR);
if (colors != MagicColor.ALL_COLORS) {
preFinal = Predicates.and(CardRulesPredicates.canCastWithAvailable(colors), preFinal);
}
}
if (!wantColorless) {
if (colors != 0 && colors != MagicColor.ALL_COLORS) {
//if colorless filtered out ensure phyrexian cards don't appear
//unless at least one of their colors is selected
preFinal = Predicates.and(preFinal, CardRulesPredicates.isColor(colors));
}
preFinal = SFilterUtil.optimizedAnd(preFinal, Predicates.not(Presets.IS_COLORLESS));
}
if (preFinal == null) {
return new Predicate<PaperCard>() { //use custom return true delegate to validate the item is a card
@Override
public boolean apply(PaperCard card) {
return true;
}
};
}
return Predicates.compose(preFinal, PaperCard.FN_GET_RULES);
return SFilterUtil.buildColorFilter(buttonMap);
}
}

View File

@@ -1,110 +1,21 @@
package forge.gui.toolbox.itemmanager.filters;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import forge.Singletons;
import forge.card.CardEdition;
import forge.game.GameFormat;
import forge.gui.toolbox.itemmanager.ItemManager;
import forge.gui.toolbox.itemmanager.SFilterUtil;
import forge.item.PaperCard;
/**
* TODO: Write javadoc for this type.
*
*/
public class CardFormatFilter extends ListLabelFilter<PaperCard> {
protected boolean allowReprints = true;
protected final Set<GameFormat> formats = new HashSet<GameFormat>();
public class CardFormatFilter extends FormatFilter<PaperCard> {
public CardFormatFilter(ItemManager<? super PaperCard> itemManager0) {
super(itemManager0);
}
public CardFormatFilter(ItemManager<? super PaperCard> itemManager0, GameFormat format0) {
super(itemManager0);
this.formats.add(format0);
}
@Override
protected String getTooltip() {
Set<String> sets = new HashSet<String>();
Set<String> bannedCards = new HashSet<String>();
for (GameFormat format : this.formats) {
List<String> formatSets = format.getAllowedSetCodes();
if (formatSets != null) {
sets.addAll(formatSets);
}
List<String> formatBannedCards = format.getBannedCardNames();
if (formatBannedCards != null) {
bannedCards.addAll(formatBannedCards);
}
}
//use HTML tooltips so we can insert line breaks
int lastLen = 0;
int lineLen = 0;
StringBuilder tooltip = new StringBuilder("<html>Sets:");
if (sets.isEmpty()) {
tooltip.append(" All");
}
else {
CardEdition.Collection editions = Singletons.getMagicDb().getEditions();
for (String code : sets) {
// don't let a single line get too long
if (50 < lineLen) {
tooltip.append("<br>");
lastLen += lineLen;
lineLen = 0;
}
CardEdition edition = editions.get(code);
tooltip.append(" ").append(edition.getName()).append(" (").append(code).append("),");
lineLen = tooltip.length() - lastLen;
}
// chop off last comma
tooltip.delete(tooltip.length() - 1, tooltip.length());
if (this.allowReprints) {
tooltip.append("<br><br>Allowing identical cards from other sets");
}
}
if (!bannedCards.isEmpty()) {
tooltip.append("<br><br>Banned:");
lastLen += lineLen;
lineLen = 0;
for (String cardName : bannedCards) {
// don't let a single line get too long
if (50 < lineLen) {
tooltip.append("<br>");
lastLen += lineLen;
lineLen = 0;
}
tooltip.append(" ").append(cardName).append(";");
lineLen = tooltip.length() - lastLen;
}
// chop off last semicolon
tooltip.delete(tooltip.length() - 1, tooltip.length());
}
tooltip.append("</html>");
return tooltip.toString();
}
@Override
public void reset() {
this.formats.clear();
this.updateLabel();
super(itemManager0, format0);
}
@Override
@@ -114,49 +25,8 @@ public class CardFormatFilter extends ListLabelFilter<PaperCard> {
return copy;
}
public static boolean canAddFormat(GameFormat format, ItemFilter<PaperCard> existingFilter) {
return existingFilter == null || !((CardFormatFilter)existingFilter).formats.contains(format);
}
/**
* Merge the given filter with this filter if possible
* @param filter
* @return true if filter merged in or to suppress adding a new filter, false to allow adding new filter
*/
@Override
@SuppressWarnings("rawtypes")
public boolean merge(ItemFilter filter) {
CardFormatFilter cardFormatFilter = (CardFormatFilter)filter;
this.formats.addAll(cardFormatFilter.formats);
this.allowReprints = cardFormatFilter.allowReprints;
return true;
}
@Override
protected String getCaption() {
return "Format";
}
@Override
protected int getCount() {
return this.formats.size();
}
@Override
protected Iterable<String> getList() {
Set<String> strings = new HashSet<String>();
for (GameFormat f : this.formats) {
strings.add(f.getName());
}
return strings;
}
@Override
protected final Predicate<PaperCard> buildPredicate() {
List<Predicate<PaperCard>> predicates = new ArrayList<Predicate<PaperCard>>();
for (GameFormat f : this.formats) {
predicates.add(allowReprints ? f.getFilterRules() : f.getFilterPrinted());
}
return Predicates.or(predicates);
return SFilterUtil.buildFormatFilter(this.formats, this.allowReprints);
}
}

View File

@@ -54,8 +54,7 @@ public class CardQuestWorldFilter extends CardFormatFilter {
* @return true if filter merged in or to suppress adding a new filter, false to allow adding new filter
*/
@Override
@SuppressWarnings("rawtypes")
public boolean merge(ItemFilter filter) {
public boolean merge(ItemFilter<?> filter) {
CardQuestWorldFilter cardQuestWorldFilter = (CardQuestWorldFilter)filter;
this.questWorlds.addAll(cardQuestWorldFilter.questWorlds);
for (QuestWorld w : cardQuestWorldFilter.questWorlds) {

View File

@@ -50,17 +50,6 @@ public class CardSearchFilter extends TextSearchFilter<PaperCard> {
this.btnText.setSelected(true);
}
/**
* Merge the given filter with this filter if possible
* @param filter
* @return true if filter merged in or to suppress adding a new filter, false to allow adding new filter
*/
@Override
@SuppressWarnings("rawtypes")
public boolean merge(ItemFilter filter) {
return false;
}
@Override
protected final void buildWidget(JPanel widget) {
super.buildWidget(widget);

View File

@@ -40,8 +40,7 @@ public class CardSetFilter extends CardFormatFilter {
* @return true if filter merged in or to suppress adding a new filter, false to allow adding new filter
*/
@Override
@SuppressWarnings("rawtypes")
public boolean merge(ItemFilter filter) {
public boolean merge(ItemFilter<?> filter) {
CardSetFilter cardSetFilter = (CardSetFilter)filter;
this.sets.addAll(cardSetFilter.sets);
this.allowReprints = cardSetFilter.allowReprints;

View File

@@ -0,0 +1,55 @@
package forge.gui.toolbox.itemmanager.filters;
import java.util.Map;
import javax.swing.JPanel;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import forge.gui.toolbox.FLabel;
import forge.gui.toolbox.itemmanager.ItemManager;
import forge.gui.toolbox.itemmanager.SFilterUtil;
import forge.gui.toolbox.itemmanager.SItemManagerUtil;
import forge.item.DeckBox;
import forge.item.PaperCard;
import forge.util.ItemPoolView;
/**
* TODO: Write javadoc for this type.
*
*/
public class DeckColorFilter extends StatTypeFilter<DeckBox> {
public DeckColorFilter(ItemManager<? super DeckBox> itemManager0) {
super(itemManager0);
}
@Override
public ItemFilter<DeckBox> createCopy() {
return new DeckColorFilter(itemManager);
}
@Override
protected void buildWidget(JPanel widget) {
addColorButtons(widget);
}
@Override
protected final Predicate<DeckBox> buildPredicate() {
return DeckBox.createPredicate(SFilterUtil.buildColorFilter(buttonMap));
}
@Override
public void afterFiltersApplied() {
final ItemPoolView<? super DeckBox> items = itemManager.getFilteredItems();
for (Map.Entry<SItemManagerUtil.StatTypes, FLabel> btn : buttonMap.entrySet()) {
if (btn.getKey().predicate != null) {
int count = items.countAll(DeckBox.createPredicate(Predicates.compose(btn.getKey().predicate,
PaperCard.FN_GET_RULES)), DeckBox.class);
btn.getValue().setText(String.valueOf(count));
}
}
getWidget().revalidate();
}
}

View File

@@ -0,0 +1,32 @@
package forge.gui.toolbox.itemmanager.filters;
import com.google.common.base.Predicate;
import forge.game.GameFormat;
import forge.gui.toolbox.itemmanager.ItemManager;
import forge.gui.toolbox.itemmanager.SFilterUtil;
import forge.item.DeckBox;
/**
* TODO: Write javadoc for this type.
*
*/
public class DeckFormatFilter extends FormatFilter<DeckBox> {
public DeckFormatFilter(ItemManager<? super DeckBox> itemManager0) {
super(itemManager0);
}
public DeckFormatFilter(ItemManager<? super DeckBox> itemManager0, GameFormat format0) {
super(itemManager0, format0);
}
@Override
public ItemFilter<DeckBox> createCopy() {
DeckFormatFilter copy = new DeckFormatFilter(itemManager);
copy.formats.addAll(this.formats);
return copy;
}
@Override
protected final Predicate<DeckBox> buildPredicate() {
return DeckBox.createPredicate(SFilterUtil.buildFormatFilter(this.formats, this.allowReprints));
}
}

View File

@@ -0,0 +1,93 @@
package forge.gui.toolbox.itemmanager.filters;
import java.util.HashSet;
import java.util.Set;
import forge.Singletons;
import forge.game.GameFormat;
import forge.gui.toolbox.itemmanager.ItemManager;
import forge.item.DeckBox;
import forge.quest.QuestWorld;
/**
* TODO: Write javadoc for this type.
*
*/
public class DeckQuestWorldFilter extends DeckFormatFilter {
private final Set<QuestWorld> questWorlds = new HashSet<QuestWorld>();
public DeckQuestWorldFilter(ItemManager<? super DeckBox> itemManager0) {
super(itemManager0);
}
public DeckQuestWorldFilter(ItemManager<? super DeckBox> itemManager0, QuestWorld questWorld0) {
super(itemManager0);
this.questWorlds.add(questWorld0);
this.formats.add(getQuestWorldFormat(questWorld0));
}
@Override
public ItemFilter<DeckBox> createCopy() {
DeckQuestWorldFilter copy = new DeckQuestWorldFilter(itemManager);
copy.questWorlds.addAll(this.questWorlds);
for (QuestWorld w : this.questWorlds) {
copy.formats.add(getQuestWorldFormat(w));
}
return copy;
}
@Override
public void reset() {
this.questWorlds.clear();
super.reset();
}
public static boolean canAddQuestWorld(QuestWorld questWorld, ItemFilter<DeckBox> existingFilter) {
if (questWorld.getFormat() == null && Singletons.getModel().getQuest().getMainFormat() == null) {
return false; //must have format
}
return existingFilter == null || !((DeckQuestWorldFilter)existingFilter).questWorlds.contains(questWorld);
}
/**
* Merge the given filter with this filter if possible
* @param filter
* @return true if filter merged in or to suppress adding a new filter, false to allow adding new filter
*/
@Override
public boolean merge(ItemFilter<?> filter) {
DeckQuestWorldFilter cardQuestWorldFilter = (DeckQuestWorldFilter)filter;
this.questWorlds.addAll(cardQuestWorldFilter.questWorlds);
for (QuestWorld w : cardQuestWorldFilter.questWorlds) {
this.formats.add(getQuestWorldFormat(w));
}
return true;
}
@Override
protected String getCaption() {
return "Quest World";
}
@Override
protected int getCount() {
return this.questWorlds.size();
}
@Override
protected Iterable<String> getList() {
Set<String> strings = new HashSet<String>();
for (QuestWorld w : this.questWorlds) {
strings.add(w.getName());
}
return strings;
}
private GameFormat getQuestWorldFormat(QuestWorld w) {
GameFormat format = w.getFormat();
if (format == null) {
//assumes that no world other than the main world will have a null format
format = Singletons.getModel().getQuest().getMainFormat();
}
return format;
}
}

View File

@@ -0,0 +1,22 @@
package forge.gui.toolbox.itemmanager.filters;
import forge.gui.toolbox.itemmanager.ItemManager;
import forge.item.DeckBox;
/**
* TODO: Write javadoc for this type.
*
*/
public class DeckSearchFilter extends TextSearchFilter<DeckBox> {
public DeckSearchFilter(ItemManager<? super DeckBox> itemManager0) {
super(itemManager0);
}
@Override
public ItemFilter<DeckBox> createCopy() {
DeckSearchFilter copy = new DeckSearchFilter(itemManager);
copy.getWidget(); //initialize widget
copy.txtSearch.setText(this.txtSearch.getText());
return copy;
}
}

View File

@@ -0,0 +1,80 @@
package forge.gui.toolbox.itemmanager.filters;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import forge.game.GameFormat;
import forge.gui.home.quest.DialogChooseSets;
import forge.gui.toolbox.itemmanager.ItemManager;
import forge.item.DeckBox;
/**
* TODO: Write javadoc for this type.
*
*/
public class DeckSetFilter extends DeckFormatFilter {
private final Set<String> sets = new HashSet<String>();
public DeckSetFilter(ItemManager<? super DeckBox> itemManager0, Collection<String> sets0, boolean allowReprints0) {
super(itemManager0);
this.sets.addAll(sets0);
this.formats.add(new GameFormat(null, this.sets, null));
this.allowReprints = allowReprints0;
}
@Override
public ItemFilter<DeckBox> createCopy() {
return new DeckSetFilter(itemManager, this.sets, this.allowReprints);
}
@Override
public void reset() {
this.sets.clear();
super.reset();
}
/**
* Merge the given filter with this filter if possible
* @param filter
* @return true if filter merged in or to suppress adding a new filter, false to allow adding new filter
*/
@Override
public boolean merge(ItemFilter<?> filter) {
DeckSetFilter cardSetFilter = (DeckSetFilter)filter;
this.sets.addAll(cardSetFilter.sets);
this.allowReprints = cardSetFilter.allowReprints;
this.formats.clear();
this.formats.add(new GameFormat(null, this.sets, null));
return true;
}
public void edit() {
final DialogChooseSets dialog = new DialogChooseSets(this.sets, null, true);
dialog.setOkCallback(new Runnable() {
@Override
public void run() {
sets.clear();
sets.addAll(dialog.getSelectedSets());
allowReprints = dialog.getWantReprints();
formats.clear();
formats.add(new GameFormat(null, sets, null));
}
});
}
@Override
protected String getCaption() {
return "Set";
}
@Override
protected int getCount() {
return this.sets.size();
}
@Override
protected Iterable<String> getList() {
return this.sets;
}
}

View File

@@ -0,0 +1,37 @@
package forge.gui.toolbox.itemmanager.filters;
import java.util.Map;
import com.google.common.base.Predicates;
import forge.gui.toolbox.FLabel;
import forge.gui.toolbox.itemmanager.ItemManager;
import forge.gui.toolbox.itemmanager.SItemManagerUtil;
import forge.item.DeckBox;
import forge.item.InventoryItem;
import forge.item.PaperCard;
import forge.util.ItemPoolView;
public abstract class DeckStatTypeFilter extends StatTypeFilter<DeckBox> {
public DeckStatTypeFilter(ItemManager<? super DeckBox> itemManager0) {
super(itemManager0);
}
@Override
protected <U extends InventoryItem> boolean showUnsupportedItem(U item) {
return false;
}
@Override
public void afterFiltersApplied() {
final ItemPoolView<? super DeckBox> items = itemManager.getFilteredItems();
for (Map.Entry<SItemManagerUtil.StatTypes, FLabel> btn : buttonMap.entrySet()) {
if (btn.getKey().predicate != null) {
int count = items.countAll(DeckBox.createPredicate(Predicates.compose(btn.getKey().predicate, PaperCard.FN_GET_RULES)), DeckBox.class);
btn.getValue().setText(String.valueOf(count));
}
}
getWidget().revalidate();
}
}

View File

@@ -0,0 +1,142 @@
package forge.gui.toolbox.itemmanager.filters;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import forge.Singletons;
import forge.card.CardEdition;
import forge.game.GameFormat;
import forge.gui.toolbox.itemmanager.ItemManager;
import forge.item.InventoryItem;
/**
* TODO: Write javadoc for this type.
*
*/
public abstract class FormatFilter<T extends InventoryItem> extends ListLabelFilter<T> {
protected boolean allowReprints = true;
protected final Set<GameFormat> formats = new HashSet<GameFormat>();
public FormatFilter(ItemManager<? super T> itemManager0) {
super(itemManager0);
}
public FormatFilter(ItemManager<? super T> itemManager0, GameFormat format0) {
super(itemManager0);
this.formats.add(format0);
}
@Override
protected String getTooltip() {
Set<String> sets = new HashSet<String>();
Set<String> bannedCards = new HashSet<String>();
for (GameFormat format : this.formats) {
List<String> formatSets = format.getAllowedSetCodes();
if (formatSets != null) {
sets.addAll(formatSets);
}
List<String> formatBannedCards = format.getBannedCardNames();
if (formatBannedCards != null) {
bannedCards.addAll(formatBannedCards);
}
}
//use HTML tooltips so we can insert line breaks
int lastLen = 0;
int lineLen = 0;
StringBuilder tooltip = new StringBuilder("<html>Sets:");
if (sets.isEmpty()) {
tooltip.append(" All");
}
else {
CardEdition.Collection editions = Singletons.getMagicDb().getEditions();
for (String code : sets) {
// don't let a single line get too long
if (50 < lineLen) {
tooltip.append("<br>");
lastLen += lineLen;
lineLen = 0;
}
CardEdition edition = editions.get(code);
tooltip.append(" ").append(edition.getName()).append(" (").append(code).append("),");
lineLen = tooltip.length() - lastLen;
}
// chop off last comma
tooltip.delete(tooltip.length() - 1, tooltip.length());
if (this.allowReprints) {
tooltip.append("<br><br>Allowing identical cards from other sets");
}
}
if (!bannedCards.isEmpty()) {
tooltip.append("<br><br>Banned:");
lastLen += lineLen;
lineLen = 0;
for (String cardName : bannedCards) {
// don't let a single line get too long
if (50 < lineLen) {
tooltip.append("<br>");
lastLen += lineLen;
lineLen = 0;
}
tooltip.append(" ").append(cardName).append(";");
lineLen = tooltip.length() - lastLen;
}
// chop off last semicolon
tooltip.delete(tooltip.length() - 1, tooltip.length());
}
tooltip.append("</html>");
return tooltip.toString();
}
@Override
public void reset() {
this.formats.clear();
this.updateLabel();
}
public static <T extends InventoryItem> boolean canAddFormat(GameFormat format, FormatFilter<T> existingFilter) {
return existingFilter == null || !existingFilter.formats.contains(format);
}
/**
* Merge the given filter with this filter if possible
* @param filter
* @return true if filter merged in or to suppress adding a new filter, false to allow adding new filter
*/
@SuppressWarnings("unchecked")
@Override
public boolean merge(ItemFilter<?> filter) {
FormatFilter<T> formatFilter = (FormatFilter<T>)filter;
this.formats.addAll(formatFilter.formats);
this.allowReprints = formatFilter.allowReprints;
return true;
}
@Override
protected String getCaption() {
return "Format";
}
@Override
protected int getCount() {
return this.formats.size();
}
@Override
protected Iterable<String> getList() {
Set<String> strings = new HashSet<String>();
for (GameFormat f : this.formats) {
strings.add(f.getName());
}
return strings;
}
}

View File

@@ -153,8 +153,7 @@ public abstract class ItemFilter<T extends InventoryItem> {
* @param filter
* @return true if filter merged in or to suppress adding a new filter, false to allow adding new filter
*/
@SuppressWarnings("rawtypes")
public abstract boolean merge(ItemFilter filter);
public abstract boolean merge(ItemFilter<?> filter);
protected abstract void buildWidget(JPanel widget);
protected abstract void doWidgetLayout(LayoutHelper helper);

View File

@@ -25,6 +25,16 @@ public abstract class StatTypeFilter<T extends InventoryItem> extends ToggleButt
buttonMap = new HashMap<SItemManagerUtil.StatTypes, FLabel>();
}
protected void addColorButtons(JPanel widget) {
addToggleButton(widget, StatTypes.WHITE);
addToggleButton(widget, StatTypes.BLUE);
addToggleButton(widget, StatTypes.BLACK);
addToggleButton(widget, StatTypes.RED);
addToggleButton(widget, StatTypes.GREEN);
addToggleButton(widget, StatTypes.COLORLESS);
addToggleButton(widget, StatTypes.MULTICOLOR);
}
@SuppressWarnings("serial")
protected void addToggleButton(JPanel widget, final StatTypes st) {
StringBuilder tooltip = new StringBuilder();

View File

@@ -57,8 +57,7 @@ public class TextSearchFilter<T extends InventoryItem> extends ItemFilter<T> {
* @return true if filter merged in or to suppress adding a new filter, false to allow adding new filter
*/
@Override
@SuppressWarnings("rawtypes")
public boolean merge(ItemFilter filter) {
public boolean merge(ItemFilter<?> filter) {
return false;
}

View File

@@ -103,8 +103,7 @@ public abstract class ToggleButtonsFilter<T extends InventoryItem> extends ItemF
* @return true if filter merged in or to suppress adding a new filter, false to allow adding new filter
*/
@Override
@SuppressWarnings("rawtypes")
public boolean merge(ItemFilter filter) {
public boolean merge(ItemFilter<?> filter) {
return true;
}
}

View File

@@ -128,8 +128,7 @@ public abstract class ValueRangeFilter<T extends InventoryItem> extends ItemFilt
* @return true if filter merged in or to suppress adding a new filter, false to allow adding new filter
*/
@Override
@SuppressWarnings("rawtypes")
public boolean merge(ItemFilter filter) {
public boolean merge(ItemFilter<?> filter) {
return true;
}
}

View File

@@ -276,7 +276,7 @@ public class LimitedDeckBuilder extends DeckGeneratorBase{
private void findBasicLandSets() {
Set<String> sets = new HashSet<String>();
for (PaperCard cp : aiPlayables) {
CardEdition ee = Singletons.getMagicDb().getEditions().get(cp.edition);
CardEdition ee = Singletons.getMagicDb().getEditions().get(cp.getEdition());
if( !sets.contains(cp.getEdition()) && CardEdition.Predicates.hasBasicLands.apply(ee))
sets.add(cp.getEdition());
}