From 117501c51118adbfc8f6f09ee2e74d3876de025e Mon Sep 17 00:00:00 2001 From: drdev Date: Tue, 17 Dec 2013 21:21:35 +0000 Subject: [PATCH] Fix SpellShop item manager to not crash and support filtering --- .gitattributes | 2 +- .../forge/gui/deckeditor/CDeckEditorUI.java | 2 +- .../controllers/CEditorDraftingProcess.java | 2 +- .../controllers/CEditorQuestCardShop.java | 6 +- .../gui/toolbox/itemmanager/CardManager.java | 58 ++++++++----- .../itemmanager/InventoryItemManager.java | 27 ------ .../gui/toolbox/itemmanager/ItemManager.java | 83 +++++++++++-------- .../itemmanager/ItemManagerContainer.java | 12 +-- .../gui/toolbox/itemmanager/SFilterUtil.java | 28 +++++++ .../toolbox/itemmanager/SpellShopManager.java | 32 +++++++ .../itemmanager/filters/CardCMCFilter.java | 4 +- .../itemmanager/filters/CardColorFilter.java | 4 +- .../itemmanager/filters/CardFormatFilter.java | 6 +- .../itemmanager/filters/CardPowerFilter.java | 4 +- .../filters/CardQuestWorldFilter.java | 4 +- .../itemmanager/filters/CardSearchFilter.java | 4 +- .../itemmanager/filters/CardSetFilter.java | 2 +- .../filters/CardToughnessFilter.java | 4 +- .../itemmanager/filters/CardTypeFilter.java | 4 +- .../itemmanager/filters/ItemFilter.java | 24 +++++- .../itemmanager/filters/ListLabelFilter.java | 2 +- .../itemmanager/filters/StatTypeFilter.java | 4 +- .../itemmanager/filters/TextSearchFilter.java | 26 +++++- .../filters/ToggleButtonsFilter.java | 2 +- .../itemmanager/filters/ValueRangeFilter.java | 2 +- 25 files changed, 224 insertions(+), 124 deletions(-) delete mode 100644 forge-gui/src/main/java/forge/gui/toolbox/itemmanager/InventoryItemManager.java create mode 100644 forge-gui/src/main/java/forge/gui/toolbox/itemmanager/SpellShopManager.java diff --git a/.gitattributes b/.gitattributes index 7d2e32a73cf..5ecd669d7cc 100644 --- a/.gitattributes +++ b/.gitattributes @@ -15464,13 +15464,13 @@ 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/InventoryItemManager.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 forge-gui/src/main/java/forge/gui/toolbox/itemmanager/SFilterUtil.java -text forge-gui/src/main/java/forge/gui/toolbox/itemmanager/SItemManagerIO.java -text forge-gui/src/main/java/forge/gui/toolbox/itemmanager/SItemManagerUtil.java -text +forge-gui/src/main/java/forge/gui/toolbox/itemmanager/SpellShopManager.java -text forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardCMCFilter.java -text forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardColorFilter.java -text forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardFormatFilter.java -text diff --git a/forge-gui/src/main/java/forge/gui/deckeditor/CDeckEditorUI.java b/forge-gui/src/main/java/forge/gui/deckeditor/CDeckEditorUI.java index 5cb8d6c049e..701ef23235e 100644 --- a/forge-gui/src/main/java/forge/gui/deckeditor/CDeckEditorUI.java +++ b/forge-gui/src/main/java/forge/gui/deckeditor/CDeckEditorUI.java @@ -437,7 +437,7 @@ public enum CDeckEditorUI implements ICDoc, IMenuProvider { deckTable.setWantElasticColumns(wantElastic); catView.setWantUnique(wantUnique); deckView.setWantUnique(wantUnique); - catView.buildFilterPredicate(); + catView.applyFilters(); } private class _FindAsYouType extends KeyAdapter { diff --git a/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorDraftingProcess.java b/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorDraftingProcess.java index 44df945eb00..889664e2148 100644 --- a/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorDraftingProcess.java +++ b/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorDraftingProcess.java @@ -257,7 +257,7 @@ public class CEditorDraftingProcess extends ACEditorBase { if (this.getDeckManager().getPool() == null) { //avoid showing next choice or resetting pool if just switching back to Draft screen this.showChoices(this.boosterDraft.nextChoice()); - this.getDeckManager().setPool((Iterable) null); + this.getDeckManager().setPool((Iterable) null); } else { this.showChoices(this.getCatalogManager().getPool()); diff --git a/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorQuestCardShop.java b/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorQuestCardShop.java index 58a6d162657..349ac1d1646 100644 --- a/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorQuestCardShop.java +++ b/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorQuestCardShop.java @@ -48,7 +48,7 @@ import forge.gui.framework.FScreen; import forge.gui.home.quest.CSubmenuQuestDecks; import forge.gui.toolbox.FLabel; import forge.gui.toolbox.FSkin; -import forge.gui.toolbox.itemmanager.InventoryItemManager; +import forge.gui.toolbox.itemmanager.SpellShopManager; import forge.gui.toolbox.itemmanager.SItemManagerUtil; import forge.gui.toolbox.itemmanager.table.TableColumnInfo; import forge.gui.toolbox.itemmanager.table.SColumnUtil; @@ -129,8 +129,8 @@ public final class CEditorQuestCardShop extends ACEditorBase { public CardManager(boolean wantUnique0) { super(PaperCard.class, wantUnique0); + } - this.lockFiltering = true; //temporary lock filtering for improved performance - this.addFilter(new CardColorFilter(this)); - this.addFilter(new CardTypeFilter(this)); - this.lockFiltering = false; - buildFilterPredicate(); + @Override + protected void addDefaultFilters() { + addDefaultFilters(this); } @Override protected ItemFilter createSearchFilter() { - return new CardSearchFilter(this); + return createSearchFilter(this); } @Override - protected void buildFilterMenu(JPopupMenu menu) { + protected void buildFilterMenu(JPopupMenu menu) { + buildFilterMenu(menu, this); + } + + /* Static overrides shared with SpellShopManager*/ + + public static void addDefaultFilters(final ItemManager itemManager) { + itemManager.addFilter(new CardColorFilter(itemManager)); + itemManager.addFilter(new CardTypeFilter(itemManager)); + } + + public static ItemFilter createSearchFilter(final ItemManager itemManager) { + return new CardSearchFilter(itemManager); + } + + public static void buildFilterMenu(JPopupMenu menu, final ItemManager itemManager) { JMenu fmt = new JMenu("Format"); for (final GameFormat f : Singletons.getModel().getFormats()) { GuiUtils.addMenuItem(fmt, f.getName(), null, new Runnable() { @Override public void run() { - addFilter(new CardFormatFilter(CardManager.this, f)); + itemManager.addFilter(new CardFormatFilter(itemManager, f)); } - }, CardFormatFilter.canAddFormat(f, getFilter(CardFormatFilter.class))); + }, CardFormatFilter.canAddFormat(f, itemManager.getFilter(CardFormatFilter.class))); } menu.add(fmt); - + GuiUtils.addMenuItem(menu, "Sets...", null, new Runnable() { @Override public void run() { - CardSetFilter existingFilter = getFilter(CardSetFilter.class); + CardSetFilter existingFilter = itemManager.getFilter(CardSetFilter.class); if (existingFilter != null) { existingFilter.edit(); } @@ -70,43 +84,43 @@ public final class CardManager extends ItemManager { public void run() { List sets = dialog.getSelectedSets(); if (!sets.isEmpty()) { - addFilter(new CardSetFilter(CardManager.this, sets, dialog.getWantReprints())); + itemManager.addFilter(new CardSetFilter(itemManager, sets, dialog.getWantReprints())); } } }); } } }); - + JMenu range = new JMenu("Value range"); GuiUtils.addMenuItem(range, "CMC", null, new Runnable() { @Override public void run() { - addFilter(new CardCMCFilter(CardManager.this)); + itemManager.addFilter(new CardCMCFilter(itemManager)); } - }, getFilter(CardCMCFilter.class) == null); + }, itemManager.getFilter(CardCMCFilter.class) == null); GuiUtils.addMenuItem(range, "Power", null, new Runnable() { @Override public void run() { - addFilter(new CardPowerFilter(CardManager.this)); + itemManager.addFilter(new CardPowerFilter(itemManager)); } - }, getFilter(CardPowerFilter.class) == null); + }, itemManager.getFilter(CardPowerFilter.class) == null); GuiUtils.addMenuItem(range, "Toughness", null, new Runnable() { @Override public void run() { - addFilter(new CardToughnessFilter(CardManager.this)); + itemManager.addFilter(new CardToughnessFilter(itemManager)); } - }, getFilter(CardToughnessFilter.class) == null); + }, itemManager.getFilter(CardToughnessFilter.class) == null); menu.add(range); - + JMenu world = new JMenu("Quest world"); for (final QuestWorld w : Singletons.getModel().getWorlds()) { GuiUtils.addMenuItem(world, w.getName(), null, new Runnable() { @Override public void run() { - addFilter(new CardQuestWorldFilter(CardManager.this, w)); + itemManager.addFilter(new CardQuestWorldFilter(itemManager, w)); } - }, CardQuestWorldFilter.canAddQuestWorld(w, getFilter(CardQuestWorldFilter.class))); + }, CardQuestWorldFilter.canAddQuestWorld(w, itemManager.getFilter(CardQuestWorldFilter.class))); } menu.add(world); } diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/InventoryItemManager.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/InventoryItemManager.java deleted file mode 100644 index 07cc16daf73..00000000000 --- a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/InventoryItemManager.java +++ /dev/null @@ -1,27 +0,0 @@ -package forge.gui.toolbox.itemmanager; - -import javax.swing.JPopupMenu; - -import forge.gui.toolbox.itemmanager.filters.ItemFilter; -import forge.item.InventoryItem; - -/** - * TODO: Write javadoc for this type. - * - */ -@SuppressWarnings("serial") -public final class InventoryItemManager extends ItemManager { - public InventoryItemManager(boolean wantUnique0) { - super(InventoryItem.class, wantUnique0); - } - - @Override - protected ItemFilter createSearchFilter() { - return null; - } - - @Override - protected void buildFilterMenu(JPopupMenu menu) { - - } -} diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/ItemManager.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/ItemManager.java index ebee49d8437..2656bb7fcec 100644 --- a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/ItemManager.java +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/ItemManager.java @@ -72,10 +72,10 @@ import forge.util.ReflectionUtil; public abstract class ItemManager extends JPanel { private ItemPool pool; private final ItemManagerModel model; - private Predicate filterPredicate = null; - private final Map>, List>> filters = - new HashMap>, List>>(); - private final List> orderedFilters = new ArrayList>(); + private Predicate filterPredicate = null; + private final Map>, List>> filters = + new HashMap>, List>>(); + private final List> orderedFilters = new ArrayList>(); private boolean wantUnique = false; private boolean alwaysNonUnique = false; private boolean allowMultipleSelections = false; @@ -89,7 +89,7 @@ public abstract class ItemManager extends JPanel { .readonly() //TODO: Support editing filter logic .build(); - private ItemFilter mainSearchFilter; + private ItemFilter mainSearchFilter; private final JPanel pnlButtons = new JPanel(new MigLayout("insets 0, gap 0, ax center, hidemode 3")); private final FLabel btnFilters = new FLabel.ButtonBuilder() @@ -111,6 +111,7 @@ public abstract class ItemManager extends JPanel { private final ItemTable table; private final JScrollPane tableScroller; + private boolean initialized; protected boolean lockFiltering; /** @@ -124,11 +125,18 @@ public abstract class ItemManager extends JPanel { this.genericType = genericType0; this.wantUnique = wantUnique0; this.model = new ItemManagerModel(this, genericType0); + this.table = new ItemTable(this, this.model); + this.tableScroller = new JScrollPane(this.table); + } + + /** + * Initialize item manager if needed + */ + public void initialize() { + if (this.initialized) { return; } //avoid initializing more than once //build table view - this.table = new ItemTable(this, this.model); this.table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - this.tableScroller = new JScrollPane(this.table); this.tableScroller.setOpaque(false); this.tableScroller.getViewport().setOpaque(false); this.tableScroller.setBorder(null); @@ -144,7 +152,7 @@ public abstract class ItemManager extends JPanel { public void itemStateChanged(ItemEvent arg0) { lockFiltering = true; boolean enabled = chkEnableFilters.isSelected(); - for (ItemFilter filter : orderedFilters) { + for (ItemFilter filter : orderedFilters) { filter.setEnabled(enabled); } txtFilterLogic.setEnabled(enabled); @@ -152,7 +160,7 @@ public abstract class ItemManager extends JPanel { mainSearchFilter.setEnabled(enabled); mainSearchFilter.updateEnabled(); //need to call updateEnabled since no listener for filter checkbox lockFiltering = false; - buildFilterPredicate(); + applyFilters(); } }); @@ -174,7 +182,7 @@ public abstract class ItemManager extends JPanel { final Runnable cmdAddCurrentSearch = new Runnable() { @Override public void run() { - ItemFilter searchFilter = mainSearchFilter.createCopy(); + ItemFilter searchFilter = mainSearchFilter.createCopy(); if (searchFilter != null) { lockFiltering = true; //prevent updating filtering from this change addFilter(searchFilter); @@ -209,6 +217,12 @@ public abstract class ItemManager extends JPanel { }; this.btnFilters.setCommand(addFilterCommand); this.btnFilters.setRightClickCommand(addFilterCommand); //show menu on right-click too + + //setup initial filters + addDefaultFilters(); + + this.initialized = true; //must set flag just before applying filters + applyFilters(); } @Override @@ -216,7 +230,7 @@ public abstract class ItemManager extends JPanel { int number = 0; StringBuilder logicBuilder = new StringBuilder(); LayoutHelper helper = new LayoutHelper(this); - for (ItemFilter filter : this.orderedFilters) { + for (ItemFilter filter : this.orderedFilters) { filter.setNumber(++number); logicBuilder.append(number + "&"); helper.fillLine(filter.getPanel(), ItemFilter.PANEL_HEIGHT); @@ -271,7 +285,7 @@ public abstract class ItemManager extends JPanel { * * @param items */ - public void setPool(final Iterable items) { + public void setPool(final Iterable items) { this.setPool(ItemPool.createFrom(items, this.genericType), false); } @@ -346,7 +360,7 @@ public abstract class ItemManager extends JPanel { * * getSelectedItem. * - * @return InventoryItem + * @return T */ public T getSelectedItem() { return this.table.getSelectedItem(); @@ -356,7 +370,7 @@ public abstract class ItemManager extends JPanel { * * getSelectedItems. * - * @return List + * @return List */ public List getSelectedItems() { return this.table.getSelectedItems(); @@ -459,32 +473,33 @@ public abstract class ItemManager extends JPanel { return this.model.getItems(); } - protected abstract ItemFilter createSearchFilter(); + protected abstract void addDefaultFilters(); + protected abstract ItemFilter createSearchFilter(); protected abstract void buildFilterMenu(JPopupMenu menu); - protected > F getFilter(Class filterClass) { + protected > F getFilter(Class filterClass) { return ReflectionUtil.safeCast(this.filters.get(filterClass), filterClass); } @SuppressWarnings("unchecked") - public void addFilter(final ItemFilter filter) { - final Class> filterClass = (Class>) filter.getClass(); - List> classFilters = this.filters.get(filterClass); + public void addFilter(final ItemFilter filter) { + final Class> filterClass = (Class>) filter.getClass(); + List> classFilters = this.filters.get(filterClass); if (classFilters == null) { - classFilters = new ArrayList>(); + classFilters = new ArrayList>(); this.filters.put(filterClass, classFilters); } if (classFilters.size() > 0) { //if filter with the same class already exists, try to merge if allowed //NOTE: can always use first filter for these checks since if //merge is supported, only one will ever exist - final ItemFilter existingFilter = classFilters.get(0); + final ItemFilter existingFilter = classFilters.get(0); if (existingFilter.merge(filter)) { //if new filter merged with existing filter, just refresh the widget existingFilter.refreshWidget(); if (!this.lockFiltering) { //apply filters and focus existing filter's main component if filtering not locked - buildFilterPredicate(); + applyFilters(); SwingUtilities.invokeLater(new Runnable() { @Override public void run() { @@ -501,7 +516,7 @@ public abstract class ItemManager extends JPanel { this.revalidate(); if (!this.lockFiltering) { //apply filters and focus filter's main component if filtering not locked - buildFilterPredicate(); + applyFilters(); SwingUtilities.invokeLater(new Runnable() { @Override public void run() { @@ -512,9 +527,9 @@ public abstract class ItemManager extends JPanel { } @SuppressWarnings("unchecked") - public void removeFilter(ItemFilter filter) { - final Class> filterClass = (Class>) filter.getClass(); - final List> classFilters = this.filters.get(filterClass); + public void removeFilter(ItemFilter filter) { + final Class> filterClass = (Class>) filter.getClass(); + final List> classFilters = this.filters.get(filterClass); if (classFilters != null && classFilters.remove(filter)) { if (classFilters.size() == 0) { this.filters.remove(filterClass); @@ -522,23 +537,23 @@ public abstract class ItemManager extends JPanel { orderedFilters.remove(filter); this.remove(filter.getPanel()); this.revalidate(); - buildFilterPredicate(); + applyFilters(); } } - public void buildFilterPredicate() { - if (this.lockFiltering) { return; } - + public void applyFilters() { + if (this.lockFiltering || !this.initialized) { return; } + List> predicates = new ArrayList>(); predicates.add(Predicates.instanceOf(this.genericType)); - for (ItemFilter filter : this.orderedFilters) { //TODO: Support custom filter logic + for (ItemFilter filter : this.orderedFilters) { //TODO: Support custom filter logic if (filter.isEnabled() && !filter.isEmpty()) { - predicates.add(filter.buildPredicate()); + predicates.add(filter.buildPredicate(this.genericType)); } } if (!this.mainSearchFilter.isEmpty()) { - predicates.add(mainSearchFilter.buildPredicate()); + predicates.add(mainSearchFilter.buildPredicate(this.genericType)); } this.filterPredicate = predicates.size() == 0 ? null : Predicates.and(predicates); if (this.pool != null) { @@ -587,7 +602,7 @@ public abstract class ItemManager extends JPanel { this.table.getTableModel().refreshSort(); - for (ItemFilter filter : this.orderedFilters) { + for (ItemFilter filter : this.orderedFilters) { filter.afterFiltersApplied(); } diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/ItemManagerContainer.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/ItemManagerContainer.java index 40e90cca25c..d9f02fb445c 100644 --- a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/ItemManagerContainer.java +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/ItemManagerContainer.java @@ -19,8 +19,6 @@ package forge.gui.toolbox.itemmanager; import javax.swing.JScrollPane; -import forge.item.InventoryItem; - /** * Simple container pane meant to contain item managers. @@ -32,12 +30,13 @@ public final class ItemManagerContainer extends JScrollPane { this(null); } - public ItemManagerContainer(ItemManager itemManager) { - super(itemManager, JScrollPane.VERTICAL_SCROLLBAR_NEVER, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); + public ItemManagerContainer(ItemManager itemManager) { + super(null, JScrollPane.VERTICAL_SCROLLBAR_NEVER, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); setBorder(null); setOpaque(false); getViewport().setOpaque(false); + setItemManager(itemManager); } /** @@ -46,7 +45,10 @@ public final class ItemManagerContainer extends JScrollPane { * * @return ItemPoolView */ - public void setItemManager(ItemManager itemManager) { + public void setItemManager(ItemManager itemManager) { + if (itemManager != null) { + itemManager.initialize(); //ensure item manager is initialized + } this.getViewport().setView(itemManager); } } 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 bb59885d94c..9d16f7c05f1 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 @@ -12,6 +12,7 @@ import forge.card.CardRulesPredicates; import forge.card.CardRulesPredicates.Presets; import forge.card.MagicColor; import forge.gui.toolbox.FLabel; +import forge.item.InventoryItem; import forge.item.PaperCard; import forge.util.PredicateString.StringOp; @@ -132,6 +133,33 @@ public class SFilterUtil { return Predicates.compose(textFilter, PaperCard.FN_GET_RULES); } + + public static Predicate buildItemTextFilter(String text) { + if (text.trim().isEmpty()) { + return Predicates.alwaysTrue(); + } + + return new ItemTextPredicate(text); + } + + private static class ItemTextPredicate implements Predicate { + private final String[] splitText; + + private ItemTextPredicate(String text) { + splitText = text.toLowerCase().replaceAll(",", "").replaceAll(" ", " ").split(" "); + } + + @Override + public boolean apply(T input) { + String name = input.getName().toLowerCase(); + for (String s : splitText) { + if (name.contains(s)) { + return true; + } + } + return false; + } + }; 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/SpellShopManager.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/SpellShopManager.java new file mode 100644 index 00000000000..d83ad38da11 --- /dev/null +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/SpellShopManager.java @@ -0,0 +1,32 @@ +package forge.gui.toolbox.itemmanager; + +import javax.swing.JPopupMenu; + +import forge.gui.toolbox.itemmanager.filters.ItemFilter; +import forge.item.InventoryItem; + +/** + * TODO: Write javadoc for this type. + * + */ +@SuppressWarnings("serial") +public final class SpellShopManager extends ItemManager { + public SpellShopManager(boolean wantUnique0) { + super(InventoryItem.class, wantUnique0); + } + + @Override + protected void addDefaultFilters() { + CardManager.addDefaultFilters(this); + } + + @Override + protected ItemFilter createSearchFilter() { + return CardManager.createSearchFilter(this); + } + + @Override + protected void buildFilterMenu(JPopupMenu menu) { + CardManager.buildFilterMenu(menu, this); + } +} diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardCMCFilter.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardCMCFilter.java index 591b39dbf6c..5d6bce4f9e2 100644 --- a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardCMCFilter.java +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardCMCFilter.java @@ -13,7 +13,7 @@ import forge.item.PaperCard; * */ public class CardCMCFilter extends ValueRangeFilter { - public CardCMCFilter(ItemManager itemManager0) { + public CardCMCFilter(ItemManager itemManager0) { super(itemManager0); } @@ -28,7 +28,7 @@ public class CardCMCFilter extends ValueRangeFilter { } @Override - public Predicate buildPredicate() { + protected Predicate buildPredicate() { Predicate predicate = getCardRulesFieldPredicate(CardRulesPredicates.LeafNumber.CardField.CMC); if (predicate == null) { return Predicates.alwaysTrue(); 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 5ea1a9d0ca0..46c89c24665 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 @@ -19,7 +19,7 @@ import forge.item.PaperCard; * */ public class CardColorFilter extends StatTypeFilter { - public CardColorFilter(ItemManager itemManager0) { + public CardColorFilter(ItemManager itemManager0) { super(itemManager0); } @@ -40,7 +40,7 @@ public class CardColorFilter extends StatTypeFilter { } @Override - public final Predicate buildPredicate() { + protected final Predicate buildPredicate() { byte colors = 0; if (buttonMap.get(StatTypes.WHITE).getSelected()) { 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 4aebc54276d..57cfac77ca6 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 @@ -22,10 +22,10 @@ public class CardFormatFilter extends ListLabelFilter { protected boolean allowReprints = true; protected final Set formats = new HashSet(); - public CardFormatFilter(ItemManager itemManager0) { + public CardFormatFilter(ItemManager itemManager0) { super(itemManager0); } - public CardFormatFilter(ItemManager itemManager0, GameFormat format0) { + public CardFormatFilter(ItemManager itemManager0, GameFormat format0) { super(itemManager0); this.formats.add(format0); } @@ -151,7 +151,7 @@ public class CardFormatFilter extends ListLabelFilter { } @Override - public final Predicate buildPredicate() { + protected final Predicate buildPredicate() { List> predicates = new ArrayList>(); for (GameFormat f : this.formats) { predicates.add(allowReprints ? f.getFilterRules() : f.getFilterPrinted()); diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardPowerFilter.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardPowerFilter.java index aa7c31c89c0..69d7364a39c 100644 --- a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardPowerFilter.java +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardPowerFilter.java @@ -13,7 +13,7 @@ import forge.item.PaperCard; * */ public class CardPowerFilter extends ValueRangeFilter { - public CardPowerFilter(ItemManager itemManager0) { + public CardPowerFilter(ItemManager itemManager0) { super(itemManager0); } @@ -28,7 +28,7 @@ public class CardPowerFilter extends ValueRangeFilter { } @Override - public Predicate buildPredicate() { + protected Predicate buildPredicate() { Predicate predicate = getCardRulesFieldPredicate(CardRulesPredicates.LeafNumber.CardField.POWER); if (predicate == null) { return Predicates.alwaysTrue(); 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 e68bcdc5bb6..2cb9460f57d 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 @@ -16,10 +16,10 @@ import forge.quest.QuestWorld; public class CardQuestWorldFilter extends CardFormatFilter { private final Set questWorlds = new HashSet(); - public CardQuestWorldFilter(ItemManager itemManager0) { + public CardQuestWorldFilter(ItemManager itemManager0) { super(itemManager0); } - public CardQuestWorldFilter(ItemManager itemManager0, QuestWorld questWorld0) { + public CardQuestWorldFilter(ItemManager itemManager0, QuestWorld questWorld0) { super(itemManager0); this.questWorlds.add(questWorld0); this.formats.add(getQuestWorldFormat(questWorld0)); 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 64e2da50835..f82d8f49adf 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 @@ -24,7 +24,7 @@ public class CardSearchFilter extends TextSearchFilter { private FComboBoxWrapper cbSearchMode; private FLabel btnName, btnType, btnText; - public CardSearchFilter(ItemManager itemManager0) { + public CardSearchFilter(ItemManager itemManager0) { super(itemManager0); } @@ -110,7 +110,7 @@ public class CardSearchFilter extends TextSearchFilter { } @Override - public Predicate buildPredicate() { + protected Predicate buildPredicate() { return SFilterUtil.buildTextFilter( txtSearch.getText(), cbSearchMode.getSelectedIndex() != 0, 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 0e939dbc7f2..ef6f3e372a7 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 @@ -16,7 +16,7 @@ import forge.item.PaperCard; public class CardSetFilter extends CardFormatFilter { private final Set sets = new HashSet(); - public CardSetFilter(ItemManager itemManager0, Collection sets0, boolean allowReprints0) { + public CardSetFilter(ItemManager itemManager0, Collection sets0, boolean allowReprints0) { super(itemManager0); this.sets.addAll(sets0); this.formats.add(new GameFormat(null, this.sets, null)); diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardToughnessFilter.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardToughnessFilter.java index 4b4fd0f509b..f35c75a0b88 100644 --- a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardToughnessFilter.java +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardToughnessFilter.java @@ -13,7 +13,7 @@ import forge.item.PaperCard; * */ public class CardToughnessFilter extends ValueRangeFilter { - public CardToughnessFilter(ItemManager itemManager0) { + public CardToughnessFilter(ItemManager itemManager0) { super(itemManager0); } @@ -28,7 +28,7 @@ public class CardToughnessFilter extends ValueRangeFilter { } @Override - public Predicate buildPredicate() { + protected Predicate buildPredicate() { Predicate predicate = getCardRulesFieldPredicate(CardRulesPredicates.LeafNumber.CardField.TOUGHNESS); if (predicate == null) { return Predicates.alwaysTrue(); diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardTypeFilter.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardTypeFilter.java index 967acb91aa2..b5511889d2c 100644 --- a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardTypeFilter.java +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardTypeFilter.java @@ -19,7 +19,7 @@ import forge.item.PaperCard; * */ public class CardTypeFilter extends StatTypeFilter { - public CardTypeFilter(ItemManager itemManager0) { + public CardTypeFilter(ItemManager itemManager0) { super(itemManager0); } @@ -40,7 +40,7 @@ public class CardTypeFilter extends StatTypeFilter { } @Override - public final Predicate buildPredicate() { + protected final Predicate buildPredicate() { final List> types = new ArrayList>(); for (SItemManagerUtil.StatTypes s : buttonMap.keySet()) { 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 4e551ae0706..b83a0c74624 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 @@ -44,13 +44,13 @@ public abstract class ItemFilter { cb.setFocusable(false); } - protected final ItemManager itemManager; + protected final ItemManager itemManager; private FilterPanel panel; private Widget widget; private final JCheckBox chkEnable = new JCheckBox(); private RemoveButton btnRemove; - protected ItemFilter(ItemManager itemManager0) { + protected ItemFilter(ItemManager itemManager0) { this.itemManager = itemManager0; this.chkEnable.setSelected(true); //enable by default } @@ -119,13 +119,28 @@ public abstract class ItemFilter { } protected void applyChange() { - this.itemManager.buildFilterPredicate(); + this.itemManager.applyFilters(); + } + + public Predicate buildPredicate(Class genericType) { + final Predicate predicate = this.buildPredicate(); + return new Predicate() { + @SuppressWarnings("unchecked") + @Override + public boolean apply(U item) { + try { + return predicate.apply((T)item); + } + catch (Exception ex) { + return false; //if can't cast U to T, filter item out + } + } + }; } public abstract ItemFilter createCopy(); public abstract boolean isEmpty(); public abstract void reset(); - public abstract Predicate buildPredicate(); public void afterFiltersApplied() { } @@ -139,6 +154,7 @@ public abstract class ItemFilter { protected abstract void buildWidget(JPanel widget); protected abstract void doWidgetLayout(LayoutHelper helper); + protected abstract Predicate buildPredicate(); @SuppressWarnings("serial") private class FilterPanel extends JPanel { diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/ListLabelFilter.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/ListLabelFilter.java index a74c1c2aad5..ad037609e60 100644 --- a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/ListLabelFilter.java +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/ListLabelFilter.java @@ -17,7 +17,7 @@ import forge.util.TextUtil; public abstract class ListLabelFilter extends ItemFilter { private FLabel label; - protected ListLabelFilter(ItemManager itemManager0) { + protected ListLabelFilter(ItemManager itemManager0) { super(itemManager0); } 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 82e783ecf93..967cb252052 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 @@ -18,7 +18,7 @@ import forge.util.ItemPoolView; public abstract class StatTypeFilter extends ToggleButtonsFilter { protected final Map buttonMap; - public StatTypeFilter(ItemManager itemManager0) { + public StatTypeFilter(ItemManager itemManager0) { super(itemManager0); buttonMap = new HashMap(); } @@ -79,7 +79,7 @@ public abstract class StatTypeFilter extends ToggleButt @Override public void afterFiltersApplied() { - final ItemPoolView items = itemManager.getFilteredItems(); + final ItemPoolView items = itemManager.getFilteredItems(); for (Map.Entry btn : buttonMap.entrySet()) { int count = items.countAll(Predicates.compose(btn.getKey().predicate, PaperCard.FN_GET_RULES), PaperCard.class); btn.getValue().setText(String.valueOf(count)); 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 4ccf5160e51..ecebee4fad8 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 @@ -5,26 +5,37 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; - import javax.swing.JPanel; import javax.swing.Timer; +import com.google.common.base.Predicate; +import com.google.common.base.Predicates; + import forge.gui.toolbox.FTextField; import forge.gui.toolbox.LayoutHelper; import forge.gui.toolbox.itemmanager.ItemManager; +import forge.gui.toolbox.itemmanager.SFilterUtil; import forge.item.InventoryItem; /** * TODO: Write javadoc for this type. * */ -public abstract class TextSearchFilter extends ItemFilter { +public class TextSearchFilter extends ItemFilter { protected FTextField txtSearch; - protected TextSearchFilter(ItemManager itemManager0) { + public TextSearchFilter(ItemManager itemManager0) { super(itemManager0); } + @Override + public ItemFilter createCopy() { + TextSearchFilter copy = new TextSearchFilter(itemManager); + copy.getWidget(); //initialize widget + copy.txtSearch.setText(this.txtSearch.getText()); + return copy; + } + @Override public boolean isEmpty() { return txtSearch.isEmpty(); @@ -108,4 +119,13 @@ public abstract class TextSearchFilter extends ItemFilt applyChange(); } }); + + @Override + protected Predicate buildPredicate() { + String text = txtSearch.getText(); + if (text.trim().isEmpty()) { + return Predicates.alwaysTrue(); + } + return SFilterUtil.buildItemTextFilter(text); + } } 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 b420736b49c..ba496466267 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 @@ -24,7 +24,7 @@ public abstract class ToggleButtonsFilter extends ItemF protected boolean lockFiltering; private final ArrayList buttons = new ArrayList(); - protected ToggleButtonsFilter(ItemManager itemManager0) { + protected ToggleButtonsFilter(ItemManager itemManager0) { super(itemManager0); } 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 07b23b9fbf9..08bd6fc34d8 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 @@ -27,7 +27,7 @@ public abstract class ValueRangeFilter extends ItemFilt private FLabel label; private FSpinner lowerBound, upperBound; - protected ValueRangeFilter(ItemManager itemManager0) { + protected ValueRangeFilter(ItemManager itemManager0) { super(itemManager0); }