From 8eba8cafedb7127ca34c755b6e62557d3d07c7fa Mon Sep 17 00:00:00 2001 From: dragonmacher <48328597+dragonmacher@users.noreply.github.com> Date: Fri, 30 Sep 2022 18:56:50 -0400 Subject: [PATCH] GP-2637 - Updated the Component Providers' drop-down button to allow users to add a keybinding to show the popup menu. --- .../java/docking/DockableToolBarManager.java | 45 +++++++++++++++---- 1 file changed, 36 insertions(+), 9 deletions(-) diff --git a/Ghidra/Framework/Docking/src/main/java/docking/DockableToolBarManager.java b/Ghidra/Framework/Docking/src/main/java/docking/DockableToolBarManager.java index ed28d9a3fb..93cd15a61f 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/DockableToolBarManager.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/DockableToolBarManager.java @@ -17,7 +17,7 @@ package docking; import java.awt.Dimension; import java.awt.FlowLayout; -import java.util.ArrayList; +import java.util.Collections; import java.util.Iterator; import javax.swing.*; @@ -49,7 +49,8 @@ class DockableToolBarManager { DockableToolBarManager(GenericHeader header) { this.dockableHeader = header; - initialize(null, null, new ArrayList().iterator()); + menuButtonManager = new ToolBarItemManager(new ToolBarMenuAction(), null); + initialize(null, null, Collections.emptyIterator()); } /** @@ -74,17 +75,20 @@ class DockableToolBarManager { String owner = provider.getOwner(); ToolBarCloseAction closeAction = new ToolBarCloseAction(owner); closeButtonManager = new ToolBarItemManager(closeAction, winMgr); - Tool tool = winMgr.getTool(); + + ToolBarMenuAction dropDownAction = new ToolBarMenuAction(owner); + menuButtonManager = new ToolBarItemManager(dropDownAction, winMgr); // we need to add this action to the tool in order to use key bindings + Tool tool = winMgr.getTool(); tool.addLocalAction(provider, closeAction); + tool.addLocalAction(provider, dropDownAction); } private void initialize(DockingWindowManager winMgr, MenuHandler menuHandler, Iterator actions) { toolBarManager = new ToolBarManager(winMgr); menuManager = new MenuManager(null, '\0', null, false, menuHandler, menuGroupMap); - menuButtonManager = new ToolBarItemManager(new ToolBarMenuAction(), winMgr); while (actions.hasNext()) { DockingActionIf action = actions.next(); @@ -177,8 +181,8 @@ class DockableToolBarManager { } //================================================================================================== -// Inner Classes -//================================================================================================== +// Inner Classes +//================================================================================================== /** * Action added to toolbar for "hiding" the component. @@ -212,19 +216,42 @@ class DockableToolBarManager { */ private class ToolBarMenuAction extends DockingAction { + private JButton myButton; + + /** + * Constructor for tool bars that are not part of standard component providers, such as + * those used when direct rendering. + */ ToolBarMenuAction() { super("Local Menu", DockingWindowManager.DOCKING_WINDOWS_OWNER); setDescription("Menu"); setToolBarData(new ToolBarData(MENU_ICON, null)); + markHelpUnnecessary(); + } + + /** + * Constructor for component providers + * @param owner the action owner, typically a plugin + */ + ToolBarMenuAction(String owner) { + super("Local Menu", owner, KeyBindingType.SHARED); + setDescription("Menu"); + setToolBarData(new ToolBarData(MENU_ICON, null)); + markHelpUnnecessary(); + } + + @Override + protected JButton doCreateButton() { + myButton = super.doCreateButton(); + return myButton; } @Override public void actionPerformed(ActionContext context) { - JComponent src = (JComponent) context.getSourceObject(); - Dimension d = src.getSize(); + Dimension d = myButton.getSize(); JPopupMenu popupMenu = menuManager.getPopupMenu(); popupMenu.addPopupMenuListener(menuManager.getMenuHandler()); - popupMenu.show(src, 0, d.height); + popupMenu.show(myButton, 0, d.height); } } }