diff --git a/.gitattributes b/.gitattributes index b988ddaa669..a0625b99b84 100644 --- a/.gitattributes +++ b/.gitattributes @@ -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 diff --git a/forge-core/src/main/java/forge/card/CardDb.java b/forge-core/src/main/java/forge/card/CardDb.java index 01152284db9..ed47905402b 100644 --- a/forge-core/src/main/java/forge/card/CardDb.java +++ b/forge-core/src/main/java/forge/card/CardDb.java @@ -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() { diff --git a/forge-core/src/main/java/forge/deck/DeckGroup.java b/forge-core/src/main/java/forge/deck/DeckGroup.java index 13147718fb3..de212d774c9 100644 --- a/forge-core/src/main/java/forge/deck/DeckGroup.java +++ b/forge-core/src/main/java/forge/deck/DeckGroup.java @@ -134,5 +134,4 @@ public class DeckGroup extends DeckBase { return arg1.getName(); } }; - } diff --git a/forge-core/src/main/java/forge/item/DeckBox.java b/forge-core/src/main/java/forge/item/DeckBox.java new file mode 100644 index 00000000000..6b912747a9b --- /dev/null +++ b/forge-core/src/main/java/forge/item/DeckBox.java @@ -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 . + */ +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 createPredicate(final Predicate cardPredicate) { + return new Predicate() { + @Override + public boolean apply(DeckBox input) { + for (Entry deckEntry : input.deck) { + switch (deckEntry.getKey()) { + case Main: + case Sideboard: + case Commander: + for (Entry 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; + } + }; + } +} diff --git a/forge-core/src/main/java/forge/item/PaperCard.java b/forge-core/src/main/java/forge/item/PaperCard.java index 3a3cda7bae3..50faeb151aa 100644 --- a/forge-core/src/main/java/forge/item/PaperCard.java +++ b/forge-core/src/main/java/forge/item/PaperCard.java @@ -35,10 +35,10 @@ public final class PaperCard implements Comparable, 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 diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/DeckManager.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/DeckManager.java new file mode 100644 index 00000000000..440c85b7cd7 --- /dev/null +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/DeckManager.java @@ -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 { + public DeckManager(boolean wantUnique0) { + super(DeckBox.class, wantUnique0); + } + + @Override + protected void addDefaultFilters() { + addDefaultFilters(this); + } + + @Override + protected ItemFilter createSearchFilter() { + return createSearchFilter(this); + } + + @Override + protected void buildAddFilterMenu(JMenu menu) { + buildAddFilterMenu(menu, this); + } + + /* Static overrides shared with SpellShopManager*/ + + public static void addDefaultFilters(final ItemManager itemManager) { + itemManager.addFilter(new DeckColorFilter(itemManager)); + } + + public static ItemFilter createSearchFilter(final ItemManager itemManager) { + return new DeckSearchFilter(itemManager); + } + + public static void buildAddFilterMenu(JMenu menu, final ItemManager 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 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); + } +} diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/SFilterUtil.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/SFilterUtil.java index af712b0d517..eb3010a0c62 100644 --- a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/SFilterUtil.java +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/SFilterUtil.java @@ -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 buildColorFilter(Map 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 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() { //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 buildFormatFilter(Set formats, boolean allowReprints) { + List> predicates = new ArrayList>(); + for (GameFormat f : formats) { + predicates.add(allowReprints ? f.getFilterRules() : f.getFilterPrinted()); + } + return Predicates.or(predicates); + } public static Predicate optimizedAnd(Predicate p1, Predicate p2) { return p1 == null ? p2 : (p2 == null ? p1 : Predicates.and(p1, p2)); diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardColorFilter.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardColorFilter.java index 2cd0cc6bb7a..f1772f9be6f 100644 --- a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardColorFilter.java +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardColorFilter.java @@ -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 { 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 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 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() { //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); } } diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardFormatFilter.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardFormatFilter.java index 2b3fdcb7d7f..3b785c28635 100644 --- a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardFormatFilter.java +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardFormatFilter.java @@ -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 { - protected boolean allowReprints = true; - protected final Set formats = new HashSet(); - +public class CardFormatFilter extends FormatFilter { public CardFormatFilter(ItemManager itemManager0) { super(itemManager0); } public CardFormatFilter(ItemManager itemManager0, GameFormat format0) { - super(itemManager0); - this.formats.add(format0); - } - - @Override - protected String getTooltip() { - Set sets = new HashSet(); - Set bannedCards = new HashSet(); - - for (GameFormat format : this.formats) { - List formatSets = format.getAllowedSetCodes(); - if (formatSets != null) { - sets.addAll(formatSets); - } - List 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("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("
"); - 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("

Allowing identical cards from other sets"); - } - } - - if (!bannedCards.isEmpty()) { - tooltip.append("

Banned:"); - lastLen += lineLen; - lineLen = 0; - - for (String cardName : bannedCards) { - // don't let a single line get too long - if (50 < lineLen) { - tooltip.append("
"); - 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(""); - 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 { return copy; } - public static boolean canAddFormat(GameFormat format, ItemFilter 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 getList() { - Set strings = new HashSet(); - for (GameFormat f : this.formats) { - strings.add(f.getName()); - } - return strings; - } - @Override protected final Predicate buildPredicate() { - List> predicates = new ArrayList>(); - for (GameFormat f : this.formats) { - predicates.add(allowReprints ? f.getFilterRules() : f.getFilterPrinted()); - } - return Predicates.or(predicates); + return SFilterUtil.buildFormatFilter(this.formats, this.allowReprints); } } diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardQuestWorldFilter.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardQuestWorldFilter.java index 2cb9460f57d..af22a850a8e 100644 --- a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardQuestWorldFilter.java +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardQuestWorldFilter.java @@ -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) { diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardSearchFilter.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardSearchFilter.java index 9baa8f384c1..f68e25e75b9 100644 --- a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardSearchFilter.java +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardSearchFilter.java @@ -50,17 +50,6 @@ public class CardSearchFilter extends TextSearchFilter { 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); diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardSetFilter.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardSetFilter.java index ef6f3e372a7..af24e36f538 100644 --- a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardSetFilter.java +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardSetFilter.java @@ -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; diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/DeckColorFilter.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/DeckColorFilter.java new file mode 100644 index 00000000000..e33f5d258a7 --- /dev/null +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/DeckColorFilter.java @@ -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 { + public DeckColorFilter(ItemManager itemManager0) { + super(itemManager0); + } + + @Override + public ItemFilter createCopy() { + return new DeckColorFilter(itemManager); + } + + @Override + protected void buildWidget(JPanel widget) { + addColorButtons(widget); + } + + @Override + protected final Predicate buildPredicate() { + return DeckBox.createPredicate(SFilterUtil.buildColorFilter(buttonMap)); + } + + @Override + public void afterFiltersApplied() { + final ItemPoolView items = itemManager.getFilteredItems(); + + for (Map.Entry 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(); + } +} diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/DeckFormatFilter.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/DeckFormatFilter.java new file mode 100644 index 00000000000..b0a8920bdbe --- /dev/null +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/DeckFormatFilter.java @@ -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 { + public DeckFormatFilter(ItemManager itemManager0) { + super(itemManager0); + } + public DeckFormatFilter(ItemManager itemManager0, GameFormat format0) { + super(itemManager0, format0); + } + + @Override + public ItemFilter createCopy() { + DeckFormatFilter copy = new DeckFormatFilter(itemManager); + copy.formats.addAll(this.formats); + return copy; + } + + @Override + protected final Predicate buildPredicate() { + return DeckBox.createPredicate(SFilterUtil.buildFormatFilter(this.formats, this.allowReprints)); + } +} diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/DeckQuestWorldFilter.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/DeckQuestWorldFilter.java new file mode 100644 index 00000000000..4fa12917329 --- /dev/null +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/DeckQuestWorldFilter.java @@ -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 questWorlds = new HashSet(); + + public DeckQuestWorldFilter(ItemManager itemManager0) { + super(itemManager0); + } + public DeckQuestWorldFilter(ItemManager itemManager0, QuestWorld questWorld0) { + super(itemManager0); + this.questWorlds.add(questWorld0); + this.formats.add(getQuestWorldFormat(questWorld0)); + } + + @Override + public ItemFilter 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 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 getList() { + Set strings = new HashSet(); + 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; + } +} diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/DeckSearchFilter.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/DeckSearchFilter.java new file mode 100644 index 00000000000..a485e315ac6 --- /dev/null +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/DeckSearchFilter.java @@ -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 { + public DeckSearchFilter(ItemManager itemManager0) { + super(itemManager0); + } + + @Override + public ItemFilter createCopy() { + DeckSearchFilter copy = new DeckSearchFilter(itemManager); + copy.getWidget(); //initialize widget + copy.txtSearch.setText(this.txtSearch.getText()); + return copy; + } +} diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/DeckSetFilter.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/DeckSetFilter.java new file mode 100644 index 00000000000..ebdee772c14 --- /dev/null +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/DeckSetFilter.java @@ -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 sets = new HashSet(); + + public DeckSetFilter(ItemManager itemManager0, Collection sets0, boolean allowReprints0) { + super(itemManager0); + this.sets.addAll(sets0); + this.formats.add(new GameFormat(null, this.sets, null)); + this.allowReprints = allowReprints0; + } + + @Override + public ItemFilter 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 getList() { + return this.sets; + } +} diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/DeckStatTypeFilter.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/DeckStatTypeFilter.java new file mode 100644 index 00000000000..6545ceffea1 --- /dev/null +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/DeckStatTypeFilter.java @@ -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 { + public DeckStatTypeFilter(ItemManager itemManager0) { + super(itemManager0); + } + + @Override + protected boolean showUnsupportedItem(U item) { + return false; + } + + @Override + public void afterFiltersApplied() { + final ItemPoolView items = itemManager.getFilteredItems(); + + for (Map.Entry 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(); + } +} diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/FormatFilter.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/FormatFilter.java new file mode 100644 index 00000000000..e4d1fc6f2b1 --- /dev/null +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/FormatFilter.java @@ -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 extends ListLabelFilter { + protected boolean allowReprints = true; + protected final Set formats = new HashSet(); + + public FormatFilter(ItemManager itemManager0) { + super(itemManager0); + } + public FormatFilter(ItemManager itemManager0, GameFormat format0) { + super(itemManager0); + this.formats.add(format0); + } + + @Override + protected String getTooltip() { + Set sets = new HashSet(); + Set bannedCards = new HashSet(); + + for (GameFormat format : this.formats) { + List formatSets = format.getAllowedSetCodes(); + if (formatSets != null) { + sets.addAll(formatSets); + } + List 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("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("
"); + 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("

Allowing identical cards from other sets"); + } + } + + if (!bannedCards.isEmpty()) { + tooltip.append("

Banned:"); + lastLen += lineLen; + lineLen = 0; + + for (String cardName : bannedCards) { + // don't let a single line get too long + if (50 < lineLen) { + tooltip.append("
"); + 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(""); + return tooltip.toString(); + } + + @Override + public void reset() { + this.formats.clear(); + this.updateLabel(); + } + + public static boolean canAddFormat(GameFormat format, FormatFilter 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 formatFilter = (FormatFilter)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 getList() { + Set strings = new HashSet(); + for (GameFormat f : this.formats) { + strings.add(f.getName()); + } + return strings; + } +} diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/ItemFilter.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/ItemFilter.java index 525d835f06e..b7ff939b43b 100644 --- a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/ItemFilter.java +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/ItemFilter.java @@ -153,8 +153,7 @@ public abstract class ItemFilter { * @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); diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/StatTypeFilter.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/StatTypeFilter.java index 3e3d5f24fe5..cc496815c32 100644 --- a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/StatTypeFilter.java +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/StatTypeFilter.java @@ -25,6 +25,16 @@ public abstract class StatTypeFilter extends ToggleButt buttonMap = new HashMap(); } + 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(); diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/TextSearchFilter.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/TextSearchFilter.java index ecebee4fad8..9dee9bd63a3 100644 --- a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/TextSearchFilter.java +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/TextSearchFilter.java @@ -57,8 +57,7 @@ public class TextSearchFilter extends ItemFilter { * @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; } diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/ToggleButtonsFilter.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/ToggleButtonsFilter.java index f8e9b5aa223..217959f03b9 100644 --- a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/ToggleButtonsFilter.java +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/ToggleButtonsFilter.java @@ -103,8 +103,7 @@ public abstract class ToggleButtonsFilter 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; } } diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/ValueRangeFilter.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/ValueRangeFilter.java index 08bd6fc34d8..3e766275288 100644 --- a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/ValueRangeFilter.java +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/ValueRangeFilter.java @@ -128,8 +128,7 @@ public abstract class ValueRangeFilter 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; } } diff --git a/forge-gui/src/main/java/forge/limited/LimitedDeckBuilder.java b/forge-gui/src/main/java/forge/limited/LimitedDeckBuilder.java index 2d1b06a2412..0df0a045f09 100644 --- a/forge-gui/src/main/java/forge/limited/LimitedDeckBuilder.java +++ b/forge-gui/src/main/java/forge/limited/LimitedDeckBuilder.java @@ -276,7 +276,7 @@ public class LimitedDeckBuilder extends DeckGeneratorBase{ private void findBasicLandSets() { Set sets = new HashSet(); 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()); }