From 802aed63df4fb16136114e324bf4923c3371c61d Mon Sep 17 00:00:00 2001 From: drdev Date: Sun, 5 Jan 2014 22:26:01 +0000 Subject: [PATCH] Refactor context menu building logic for editor tables --- .gitattributes | 1 + .../forge/gui/deckeditor/CDeckEditorUI.java | 159 +----------------- .../deckeditor/controllers/ACEditorBase.java | 155 +++++++++++++++-- .../controllers/CEditorCommander.java | 4 +- .../controllers/CEditorConstructed.java | 4 +- .../controllers/CEditorDraftingProcess.java | 4 +- .../controllers/CEditorLimited.java | 4 +- .../deckeditor/controllers/CEditorQuest.java | 4 +- .../controllers/CEditorQuestCardShop.java | 4 +- .../controllers/CEditorVariant.java | 4 +- .../forge/gui/toolbox/ContextMenuBuilder.java | 7 + .../gui/toolbox/itemmanager/ItemManager.java | 43 +++++ .../itemmanager/views/ItemListView.java | 12 ++ .../toolbox/itemmanager/views/ItemView.java | 6 +- 14 files changed, 229 insertions(+), 182 deletions(-) create mode 100644 forge-gui/src/main/java/forge/gui/toolbox/ContextMenuBuilder.java diff --git a/.gitattributes b/.gitattributes index a0625b99b84..0f4dfcd3be4 100644 --- a/.gitattributes +++ b/.gitattributes @@ -15443,6 +15443,7 @@ forge-gui/src/main/java/forge/gui/player/PlayerControllerHuman.java -text forge-gui/src/main/java/forge/gui/player/TargetSelection.java svneol=native#text/plain forge-gui/src/main/java/forge/gui/player/package-info.java -text forge-gui/src/main/java/forge/gui/toolbox/CardFaceSymbols.java svneol=native#text/plain +forge-gui/src/main/java/forge/gui/toolbox/ContextMenuBuilder.java -text forge-gui/src/main/java/forge/gui/toolbox/FAbsolutePositioner.java -text forge-gui/src/main/java/forge/gui/toolbox/FButton.java -text forge-gui/src/main/java/forge/gui/toolbox/FCheckBox.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 676f0bbee74..9a11f5bef45 100644 --- a/forge-gui/src/main/java/forge/gui/deckeditor/CDeckEditorUI.java +++ b/forge-gui/src/main/java/forge/gui/deckeditor/CDeckEditorUI.java @@ -17,15 +17,11 @@ */ package forge.gui.deckeditor; -import java.awt.Toolkit; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; -import java.awt.event.MouseEvent; import java.util.HashMap; import java.util.Map.Entry; -import javax.swing.JPopupMenu; -import javax.swing.KeyStroke; import javax.swing.SwingUtilities; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; @@ -33,7 +29,6 @@ import javax.swing.event.ListSelectionListener; import forge.Command; import forge.Singletons; import forge.deck.DeckBase; -import forge.gui.GuiUtils; import forge.gui.deckeditor.controllers.ACEditorBase; import forge.gui.deckeditor.controllers.CEditorConstructed; import forge.gui.deckeditor.controllers.CProbabilities; @@ -45,7 +40,6 @@ import forge.gui.framework.FScreen; import forge.gui.framework.ICDoc; import forge.gui.match.controllers.CDetail; import forge.gui.match.controllers.CPicture; -import forge.gui.toolbox.FMouseAdapter; import forge.gui.toolbox.itemmanager.ItemManager; import forge.gui.toolbox.itemmanager.SItemManagerIO; import forge.gui.toolbox.itemmanager.SItemManagerIO.EditorPreference; @@ -195,120 +189,10 @@ public enum CDeckEditorUI implements ICDoc { }, Integer.MAX_VALUE); } - //========== Other methods - private interface _MoveCard { - void moveCard(boolean toAlternate, int qty); - } - - private class _ContextMenuBuilder implements ACEditorBase.ContextMenuBuilder { - private final MouseEvent _e; - private final ItemManager _itemManager; - private final ItemManager _nextItemManager; - private final _MoveCard _onMove; - private final JPopupMenu _menu = new JPopupMenu("ItemViewContextMenu"); - - public _ContextMenuBuilder(MouseEvent e, ItemManager itemManager, ItemManager nextItemManager, _MoveCard onMove) { - _e = e; - _itemManager = itemManager; - _nextItemManager = nextItemManager; - _onMove = onMove; - - //ensure the item manager has focus - itemManager.focus(); - - //if item under the cursor is not selected, select it - int index = itemManager.getTable().getIndexAtPoint(e.getPoint()); - boolean needSelection = true; - for (Integer selectedIndex : itemManager.getSelectedIndices()) { - if (selectedIndex == index) { - needSelection = false; - break; - } - } - if (needSelection) { - itemManager.setSelectedIndex(index); - } - } - - private void show() { - _menu.addSeparator(); - - GuiUtils.addMenuItem(_menu, "Jump to previous table", - KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), new Runnable() { - @Override public void run() { _nextItemManager.focus(); } - }); - GuiUtils.addMenuItem(_menu, "Jump to next table", - KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), new Runnable() { - @Override public void run() { _nextItemManager.focus(); } - }); - GuiUtils.addMenuItem(_menu, "Jump to text filter", - KeyStroke.getKeyStroke(KeyEvent.VK_F, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()), - new Runnable() { - @Override public void run() { - _itemManager.focusSearch(); - } - }); - - _menu.show(_e.getComponent(), _e.getX(), _e.getY()); - } - - private String _doNoun(String nounSingular, String nounPlural) { - int numSelected = _itemManager.getSelectionCount(); - if (1 == numSelected) { - return nounSingular; - } - return String.format("%d %s", numSelected, nounPlural); - } - - private String _doDest(String destination) { - if (null == destination) { - return ""; - } - return " " + destination; - } - - @Override - public void addMoveItems(String verb, String nounSingular, String nounPlural, String destination) { - String noun = _doNoun(nounSingular, nounPlural); - String dest = _doDest(destination); - - GuiUtils.addMenuItem(_menu, - String.format("%s %s%s", verb, noun, dest), - KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0), new Runnable() { - @Override public void run() { _onMove.moveCard(false, 1); } - }, true, true); - GuiUtils.addMenuItem(_menu, - String.format("%s 4 copies of %s%s", verb, noun, dest), - KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, KeyEvent.SHIFT_DOWN_MASK), new Runnable() { - @Override public void run() { _onMove.moveCard(false, 4); } - }); - } - - @Override - public void addMoveAlternateItems(String verb, String nounSingular, String nounPlural, String destination) { - String noun = _doNoun(nounSingular, nounPlural); - String dest = _doDest(destination); - - // yes, CTRL_DOWN_MASK and not getMenuShortcutKeyMask(). On OSX, cmd-space is hard-coded to bring up Spotlight - GuiUtils.addMenuItem(_menu, - String.format("%s %s%s", verb, noun, dest), - KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, KeyEvent.CTRL_DOWN_MASK), new Runnable() { - @Override public void run() { _onMove.moveCard(true, 1); } - }); - - // getMenuShortcutKeyMask() instead of CTRL_DOWN_MASK since on OSX, ctrl-shift-space brings up the window manager - GuiUtils.addMenuItem(_menu, - String.format("%s 4 copies of %s%s", verb, noun, dest), - KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, KeyEvent.SHIFT_DOWN_MASK | Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()), - new Runnable() { - @Override public void run() { _onMove.moveCard(true, 4); } - }); - } - } - /** * Set current editor controller */ + @SuppressWarnings("serial") private void setCurrentEditorController(ACEditorBase childController0) { this.childController = childController0; Singletons.getControl().getForgeMenu().setProvider(childController0); @@ -362,49 +246,22 @@ public enum CDeckEditorUI implements ICDoc { } }); - final _MoveCard onAdd = new _MoveCard() { + catView.setItemActivateCommand(new Command() { @Override - public void moveCard(boolean toAlternate, int qty) { - addSelectedCards(toAlternate, qty); - } - }; - final _MoveCard onRemove = new _MoveCard() { - @Override - public void moveCard(boolean toAlternate, int qty) { - removeSelectedCards(toAlternate, qty); - } - }; - - catTable.getComponent().addMouseListener(new FMouseAdapter() { - @Override - public void onLeftDoubleClick(MouseEvent e) { - if (e.isConsumed()) { return; } //don't add cards if inline button double clicked + public void run() { addSelectedCards(false, 1); } - - @Override - public void onRightClick(MouseEvent e) { - _ContextMenuBuilder cmb = new _ContextMenuBuilder(e, catView, deckView, onAdd); - childController.buildAddContextMenu(cmb); - cmb.show(); - } }); - - deckTable.getComponent().addMouseListener(new FMouseAdapter() { + deckView.setItemActivateCommand(new Command() { @Override - public void onLeftDoubleClick(MouseEvent e) { - if (e.isConsumed()) { return; } //don't remove cards if inline button double clicked + public void run() { removeSelectedCards(false, 1); } - - @Override - public void onRightClick(MouseEvent e) { - _ContextMenuBuilder cmb = new _ContextMenuBuilder(e, deckView, catView, onRemove); - childController.buildRemoveContextMenu(cmb); - cmb.show(); - } }); + catView.setContextMenuBuilder(childController.createContextMenuBuilder(true)); + deckView.setContextMenuBuilder(childController.createContextMenuBuilder(false)); + //set card when selection changes catView.addSelectionListener(new ListSelectionListener() { @Override diff --git a/forge-gui/src/main/java/forge/gui/deckeditor/controllers/ACEditorBase.java b/forge-gui/src/main/java/forge/gui/deckeditor/controllers/ACEditorBase.java index 132c2003c11..d30fb4674a9 100644 --- a/forge-gui/src/main/java/forge/gui/deckeditor/controllers/ACEditorBase.java +++ b/forge-gui/src/main/java/forge/gui/deckeditor/controllers/ACEditorBase.java @@ -17,15 +17,20 @@ */ package forge.gui.deckeditor.controllers; +import java.awt.Toolkit; +import java.awt.event.KeyEvent; import java.util.List; import java.util.Map.Entry; import javax.swing.JMenu; +import javax.swing.JPopupMenu; +import javax.swing.KeyStroke; import javax.swing.SwingUtilities; import forge.Command; import forge.deck.DeckBase; import forge.deck.DeckSection; +import forge.gui.GuiUtils; import forge.gui.deckeditor.CDeckEditorUI; import forge.gui.deckeditor.menus.CDeckEditorUIMenus; import forge.gui.framework.DragCell; @@ -34,6 +39,7 @@ import forge.gui.framework.ICDoc; import forge.gui.framework.IVDoc; import forge.gui.framework.SRearrangingUtil; import forge.gui.menus.IMenuProvider; +import forge.gui.toolbox.ContextMenuBuilder; import forge.gui.toolbox.FLabel; import forge.gui.toolbox.FSkin; import forge.gui.toolbox.itemmanager.ItemManager; @@ -57,19 +63,6 @@ import forge.view.FView; * @param extends {@link forge.deck.DeckBase} */ public abstract class ACEditorBase implements IMenuProvider { - public interface ContextMenuBuilder { - /** - * Adds move-related items to the context menu - * - * @param verb Examples: "Sell", "Add" - * @param nounSingular Examples: "item", "card" - * @param nounPlural Examples: "items", "cards" - * @param destination Examples: null, "to deck", "to sideboard" - */ - public void addMoveItems (String verb, String nounSingular, String nounPlural, String destination); - public void addMoveAlternateItems (String verb, String nounSingular, String nounPlural, String destination); - } - public boolean listenersHooked; private final FScreen screen; private ItemManager catalogManager; @@ -183,8 +176,8 @@ public abstract class ACEditorBase> items, boolean toAlternate); - public abstract void buildAddContextMenu(ContextMenuBuilder cmb); - public abstract void buildRemoveContextMenu(ContextMenuBuilder cmb); + protected abstract void buildAddContextMenu(EditorContextMenuBuilder cmb); + protected abstract void buildRemoveContextMenu(EditorContextMenuBuilder cmb); /** * Resets the cards in the catalog table and current deck table. @@ -320,4 +313,136 @@ public abstract class ACEditorBase getItemManager() { + return isAddContextMenu ? catalogManager : deckManager; + } + + private ItemManager getNextItemManager() { + return isAddContextMenu ? deckManager : catalogManager; + } + + private void moveCard(boolean toAlternate, int qty) { + if (isAddContextMenu) { + CDeckEditorUI.SINGLETON_INSTANCE.addSelectedCards(toAlternate, qty); + } + else { + CDeckEditorUI.SINGLETON_INSTANCE.removeSelectedCards(toAlternate, qty); + } + } + + @Override + public void buildContextMenu(JPopupMenu menu) { + this.menu = menu; //cache menu while controller populates menu + if (isAddContextMenu) { + buildAddContextMenu(this); + } + else { + buildRemoveContextMenu(this); + } + this.menu = null; + + menu.addSeparator(); + + GuiUtils.addMenuItem(menu, "Jump to previous table", + KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), + new Runnable() { + @Override + public void run() { + getNextItemManager().focus(); + } + }); + GuiUtils.addMenuItem(menu, "Jump to next table", + KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), + new Runnable() { + @Override + public void run() { + getNextItemManager().focus(); + } + }); + GuiUtils.addMenuItem(menu, "Jump to text filter", + KeyStroke.getKeyStroke(KeyEvent.VK_F, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()), + new Runnable() { + @Override + public void run() { + getItemManager().focusSearch(); + } + }); + } + + private String doNoun(String nounSingular, String nounPlural) { + int numSelected = getItemManager().getSelectionCount(); + if (1 == numSelected) { + return nounSingular; + } + return String.format("%d %s", numSelected, nounPlural); + } + + private String doDest(String destination) { + if (null == destination) { + return ""; + } + return " " + destination; + } + + public void addMoveItems(String verb, String nounSingular, String nounPlural, String destination) { + String noun = doNoun(nounSingular, nounPlural); + String dest = doDest(destination); + + GuiUtils.addMenuItem(menu, + String.format("%s %s%s", verb, noun, dest), + KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0), new Runnable() { + @Override + public void run() { + moveCard(false, 1); + } + }, true, true); + GuiUtils.addMenuItem(menu, + String.format("%s 4 copies of %s%s", verb, noun, dest), + KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, KeyEvent.SHIFT_DOWN_MASK), new Runnable() { + @Override + public void run() { + moveCard(false, 4); + } + }); + } + + public void addMoveAlternateItems(String verb, String nounSingular, String nounPlural, String destination) { + String noun = doNoun(nounSingular, nounPlural); + String dest = doDest(destination); + + // yes, CTRL_DOWN_MASK and not getMenuShortcutKeyMask(). On OSX, cmd-space is hard-coded to bring up Spotlight + GuiUtils.addMenuItem(menu, + String.format("%s %s%s", verb, noun, dest), + KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, KeyEvent.CTRL_DOWN_MASK), new Runnable() { + @Override + public void run() { + moveCard(true, 1); + } + }); + + // getMenuShortcutKeyMask() instead of CTRL_DOWN_MASK since on OSX, ctrl-shift-space brings up the window manager + GuiUtils.addMenuItem(menu, + String.format("%s 4 copies of %s%s", verb, noun, dest), + KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, KeyEvent.SHIFT_DOWN_MASK | Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()), + new Runnable() { + @Override + public void run() { + moveCard(true, 4); + } + }); + } + } } diff --git a/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorCommander.java b/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorCommander.java index 87756c40a51..be1b7604f57 100644 --- a/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorCommander.java +++ b/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorCommander.java @@ -143,12 +143,12 @@ public final class CEditorCommander extends ACEditorBase { } @Override - public void buildAddContextMenu(ContextMenuBuilder cmb) { + protected void buildAddContextMenu(EditorContextMenuBuilder cmb) { cmb.addMoveItems("Move", "card", "cards", "to deck"); } @Override - public void buildRemoveContextMenu(ContextMenuBuilder cmb) { + protected void buildRemoveContextMenu(EditorContextMenuBuilder cmb) { cmb.addMoveItems("Move", "card", "cards", "to sideboard"); } diff --git a/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorConstructed.java b/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorConstructed.java index ef10f5619bc..1d9c08cba9b 100644 --- a/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorConstructed.java +++ b/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorConstructed.java @@ -150,13 +150,13 @@ public final class CEditorConstructed extends ACEditorBase { } @Override - public void buildAddContextMenu(ContextMenuBuilder cmb) { + protected void buildAddContextMenu(EditorContextMenuBuilder cmb) { cmb.addMoveItems(sectionMode == DeckSection.Sideboard ? "Move" : "Add", "card", "cards", sectionMode == DeckSection.Sideboard ? "to sideboard" : "to deck"); cmb.addMoveAlternateItems(sectionMode == DeckSection.Sideboard ? "Remove" : "Add", "card", "cards", sectionMode == DeckSection.Sideboard ? "from deck" : "to sideboard"); } @Override - public void buildRemoveContextMenu(ContextMenuBuilder cmb) { + protected void buildRemoveContextMenu(EditorContextMenuBuilder cmb) { cmb.addMoveItems(sectionMode == DeckSection.Sideboard ? "Move" : "Remove", "card", "cards", sectionMode == DeckSection.Sideboard ? "to deck" : "from deck"); cmb.addMoveAlternateItems(sectionMode == DeckSection.Sideboard ? "Remove" : "Move", "card", "cards", sectionMode == DeckSection.Sideboard ? "from sideboard" : "to sideboard"); } 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 cf499c8e543..5c3f75e08a7 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 @@ -116,12 +116,12 @@ public class CEditorDraftingProcess extends ACEditorBase { } @Override - public void buildAddContextMenu(ContextMenuBuilder cmb) { + protected void buildAddContextMenu(EditorContextMenuBuilder cmb) { cmb.addMoveItems("Draft", "card", "cards", null); } @Override - public void buildRemoveContextMenu(ContextMenuBuilder cmb) { + protected void buildRemoveContextMenu(EditorContextMenuBuilder cmb) { // no valid remove options } diff --git a/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorLimited.java b/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorLimited.java index 70709b14ee9..7e821faea1a 100644 --- a/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorLimited.java +++ b/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorLimited.java @@ -118,12 +118,12 @@ public final class CEditorLimited extends ACEditorBase { } @Override - public void buildAddContextMenu(ContextMenuBuilder cmb) { + protected void buildAddContextMenu(EditorContextMenuBuilder cmb) { cmb.addMoveItems("Move", "card", "cards", "to deck"); } @Override - public void buildRemoveContextMenu(ContextMenuBuilder cmb) { + protected void buildRemoveContextMenu(EditorContextMenuBuilder cmb) { cmb.addMoveItems("Move", "card", "cards", "to sideboard"); } diff --git a/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorQuest.java b/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorQuest.java index 415ef0dc619..db2e3ab989a 100644 --- a/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorQuest.java +++ b/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorQuest.java @@ -184,13 +184,13 @@ public final class CEditorQuest extends ACEditorBase { } @Override - public void buildAddContextMenu(ContextMenuBuilder cmb) { + protected void buildAddContextMenu(EditorContextMenuBuilder cmb) { cmb.addMoveItems(sideboardMode ? "Move" : "Add", "card", "cards", sideboardMode ? "to sideboard" : "to deck"); cmb.addMoveAlternateItems(sideboardMode ? "Remove" : "Add", "card", "cards", sideboardMode ? "from deck" : "to sideboard"); } @Override - public void buildRemoveContextMenu(ContextMenuBuilder cmb) { + protected void buildRemoveContextMenu(EditorContextMenuBuilder cmb) { cmb.addMoveItems(sideboardMode ? "Move" : "Remove", "card", "cards", sideboardMode ? "to deck" : "from deck"); cmb.addMoveAlternateItems(sideboardMode ? "Remove" : "Move", "card", "cards", sideboardMode ? "from sideboard" : "to sideboard"); } 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 61332f8641e..6e2261b2e43 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 @@ -433,14 +433,14 @@ public final class CEditorQuestCardShop extends ACEditorBase { } @Override - public void buildAddContextMenu(ContextMenuBuilder cmb) { + protected void buildAddContextMenu(EditorContextMenuBuilder cmb) { cmb.addMoveItems("Move", "card", "cards", "to deck"); } @Override - public void buildRemoveContextMenu(ContextMenuBuilder cmb) { + protected void buildRemoveContextMenu(EditorContextMenuBuilder cmb) { cmb.addMoveItems("Move", "card", "cards", "to sideboard"); } diff --git a/forge-gui/src/main/java/forge/gui/toolbox/ContextMenuBuilder.java b/forge-gui/src/main/java/forge/gui/toolbox/ContextMenuBuilder.java new file mode 100644 index 00000000000..63e57d0f3ee --- /dev/null +++ b/forge-gui/src/main/java/forge/gui/toolbox/ContextMenuBuilder.java @@ -0,0 +1,7 @@ +package forge.gui.toolbox; + +import javax.swing.JPopupMenu; + +public interface ContextMenuBuilder { + void buildContextMenu(JPopupMenu menu); +} \ No newline at end of file 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 00b70f74306..f7c4638b88c 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 @@ -22,6 +22,7 @@ import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; +import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -46,6 +47,7 @@ import com.google.common.collect.Iterables; import forge.Command; import forge.gui.GuiUtils; +import forge.gui.toolbox.ContextMenuBuilder; import forge.gui.toolbox.FComboBoxWrapper; import forge.gui.toolbox.FLabel; import forge.gui.toolbox.FSkin; @@ -81,6 +83,8 @@ public abstract class ItemManager extends JPanel { private boolean alwaysNonUnique = false; private boolean allowMultipleSelections = false; private boolean hideFilters = false; + private Command itemActivateCommand; + private ContextMenuBuilder contextMenuBuilder; private final Class genericType; private final ArrayList selectionListeners = new ArrayList(); @@ -974,4 +978,43 @@ public abstract class ItemManager extends JPanel { public Iterable getSelectionListeners() { return selectionListeners; } + + public void setItemActivateCommand(Command itemActivateCommand0) { + this.itemActivateCommand = itemActivateCommand0; + } + + public void activateSelectedItems() { + if (this.itemActivateCommand != null) { + this.itemActivateCommand.run(); + } + } + + public void setContextMenuBuilder(ContextMenuBuilder contextMenuBuilder0) { + this.contextMenuBuilder = contextMenuBuilder0; + } + + public void showContextMenu(MouseEvent e) { + if (this.contextMenuBuilder == null) { return; } + + //ensure the item manager has focus + this.focus(); + + //if item under the cursor is not selected, select it + int index = this.getTable().getIndexAtPoint(e.getPoint()); + boolean needSelection = true; + for (Integer selectedIndex : this.getSelectedIndices()) { + if (selectedIndex == index) { + needSelection = false; + break; + } + } + if (needSelection) { + this.setSelectedIndex(index); + } + + JPopupMenu menu = new JPopupMenu("ItemManagerContextMenu"); + this.contextMenuBuilder.buildContextMenu(menu); + + menu.show(e.getComponent(), e.getX(), e.getY()); + } } diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemListView.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemListView.java index 691c5715801..2a027eb9696 100644 --- a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemListView.java +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemListView.java @@ -108,6 +108,18 @@ public final class ItemListView extends ItemView { } } }); + this.table.addMouseListener(new FMouseAdapter() { + @Override + public void onLeftDoubleClick(MouseEvent e) { + if (e.isConsumed()) { return; } //don't activate if inline button double clicked + getItemManager().activateSelectedItems(); + } + + @Override + public void onRightClick(MouseEvent e) { + getItemManager().showContextMenu(e); + } + }); this.skin.setFont(FSkin.getFont(12)); this.table.setBorder(null); diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemView.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemView.java index e2880a80467..9e607a71e80 100644 --- a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemView.java +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemView.java @@ -38,15 +38,17 @@ public abstract class ItemView { } public void initialize() { + final JComponent comp = this.getComponent(); + //hook incremental search functionality final IncrementalSearch incrementalSearch = new IncrementalSearch(); - this.getComponent().addFocusListener(new FocusAdapter() { + comp.addFocusListener(new FocusAdapter() { @Override public void focusLost(FocusEvent arg0) { incrementalSearch.cancel(); } }); - this.getComponent().addKeyListener(incrementalSearch); + comp.addKeyListener(incrementalSearch); } public ItemManager getItemManager() {