From 0220a00f94d5d5a59967c05fff785dabf07d607f Mon Sep 17 00:00:00 2001 From: drdev Date: Sun, 20 Sep 2015 17:02:21 +0000 Subject: [PATCH] Add right-click menu to desktop advanced search --- .../java/forge/itemmanager/CardManager.java | 9 +-- .../java/forge/itemmanager/DeckManager.java | 9 +-- .../java/forge/itemmanager/ItemManager.java | 2 +- .../filters/AdvancedSearchFilter.java | 61 ++++++++++++++++++- 4 files changed, 71 insertions(+), 10 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/CardManager.java b/forge-gui-desktop/src/main/java/forge/itemmanager/CardManager.java index 815fb796d31..af4cee1a4df 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/CardManager.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/CardManager.java @@ -163,13 +163,14 @@ public class CardManager extends ItemManager { public void run() { AdvancedSearchFilter filter = itemManager.getFilter(AdvancedSearchFilter.class); if (filter != null) { - if (filter.edit()) { - itemManager.applyNewOrModifiedFilter(filter); - } + filter.edit(); } else { filter = new AdvancedSearchFilter(itemManager); - if (filter.edit()) { + itemManager.lockFiltering = true; //ensure filter not applied until added + boolean result = filter.edit(); + itemManager.lockFiltering = false; + if (result) { itemManager.addFilter(filter); } } diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/DeckManager.java b/forge-gui-desktop/src/main/java/forge/itemmanager/DeckManager.java index 8faf817c9b0..8fd0ab6009a 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/DeckManager.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/DeckManager.java @@ -232,13 +232,14 @@ public final class DeckManager extends ItemManager implements IHasGam public void run() { AdvancedSearchFilter filter = getFilter(AdvancedSearchFilter.class); if (filter != null) { - if (filter.edit()) { - applyNewOrModifiedFilter(filter); - } + filter.edit(); } else { filter = new AdvancedSearchFilter(DeckManager.this); - if (filter.edit()) { + lockFiltering = true; //ensure filter not applied until added + boolean result = filter.edit(); + lockFiltering = false; + if (result) { addFilter(filter); } } diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/ItemManager.java b/forge-gui-desktop/src/main/java/forge/itemmanager/ItemManager.java index e7cd56675dc..232ad0c8754 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/ItemManager.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/ItemManager.java @@ -860,7 +860,7 @@ public abstract class ItemManager extends JPanel implem } //apply filters and focus existing filter's main component if filtering not locked - protected void applyNewOrModifiedFilter(final ItemFilter filter) { + public void applyNewOrModifiedFilter(final ItemFilter filter) { if (this.lockFiltering) { filter.afterFiltersApplied(); //ensure this called even if filters currently locked return; diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/AdvancedSearchFilter.java b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/AdvancedSearchFilter.java index b090efae3a8..185935fcccb 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/AdvancedSearchFilter.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/AdvancedSearchFilter.java @@ -2,15 +2,20 @@ package forge.itemmanager.filters; import java.awt.Component; import java.awt.Dimension; +import java.awt.event.MouseEvent; import forge.UiCommand; +import forge.gui.GuiUtils; import forge.interfaces.IButton; import forge.item.InventoryItem; import forge.itemmanager.AdvancedSearch; import forge.itemmanager.ItemManager; +import forge.itemmanager.AdvancedSearch.IFilterControl; import forge.toolbox.FLabel; +import forge.toolbox.FMouseAdapter; import forge.toolbox.FOptionPane; import forge.toolbox.FScrollPane; +import forge.toolbox.FSkin; import forge.toolbox.FSkin.SkinnedPanel; import forge.toolbox.FTextField; import forge.toolbox.LayoutHelper; @@ -41,6 +46,7 @@ public class AdvancedSearchFilter extends ItemFilter @Override public void reset() { model.reset(); + editDialog = null; } @Override @@ -56,6 +62,50 @@ public class AdvancedSearchFilter extends ItemFilter @Override protected final void buildWidget(JPanel widget) { label = new FLabel.Builder().fontAlign(SwingConstants.LEFT).fontSize(12).build(); + label.addMouseListener(new FMouseAdapter() { + @Override + public void onLeftDoubleClick(final MouseEvent e) { + edit(); + } + + @Override + public void onRightClick(final MouseEvent e) { + final JPopupMenu menu = new JPopupMenu("AdvancedSearchContextMenu"); + + boolean hasFilters = !isEmpty(); + if (hasFilters) { + //add a menu item for each filter to allow easily editing just that filter + for (final IFilterControl control : model.getControls()) { + GuiUtils.addMenuItem(menu, FSkin.encodeSymbols(control.getFilter().toString(), false), null, new Runnable() { + @Override + public void run() { + model.editFilterControl(control, onFilterChange); + } + }); + } + GuiUtils.addSeparator(menu); + } + + GuiUtils.addMenuItem(menu, "Edit Expression", null, new Runnable() { + @Override + public void run() { + edit(); + } + }); + + if (hasFilters) { + GuiUtils.addMenuItem(menu, "Clear Filter", null, new Runnable() { + @Override + public void run() { + reset(); + itemManager.applyNewOrModifiedFilter(AdvancedSearchFilter.this); + } + }); + } + + menu.show(e.getComponent(), e.getX(), e.getY()); + } + }); model.setLabel(label); widget.add(label); } @@ -77,6 +127,15 @@ public class AdvancedSearchFilter extends ItemFilter return false; } + private final Runnable onFilterChange = new Runnable() { + @Override + public void run() { + //update expression when edit screen closed or a single filter is changed + model.updateExpression(); + itemManager.applyNewOrModifiedFilter(AdvancedSearchFilter.this); + } + }; + @SuppressWarnings("serial") private class EditDialog { private static final int WIDTH = 400; @@ -120,7 +179,7 @@ public class AdvancedSearchFilter extends ItemFilter optionPane.dispose(); if (result != 1) { - model.updateExpression(); //update expression when dialog accepted + onFilterChange.run(); return true; } return false;