From 4fcaeead0f15dc62ac71952d06cbc0eefd57fa88 Mon Sep 17 00:00:00 2001
From: dragonmacher <48328597+dragonmacher@users.noreply.github.com>
Date: Thu, 7 Dec 2023 12:27:43 -0500
Subject: [PATCH 1/2] GP-4108 - Menu icons not appearing when disabled
---
.../src/main/java/docking/action/DockingAction.java | 6 +++++-
.../java/docking/menu/DockingCheckboxMenuItemUI.java | 7 +++----
.../src/main/java/docking/menu/DockingMenuItemUI.java | 10 +++++-----
.../src/main/java/docking/menu/DockingMenuUI.java | 6 +++---
.../src/main/java/docking/menu/MenuItemManager.java | 10 +++++++---
.../menu/MultipleActionDockingToolbarButton.java | 10 +++++-----
.../app/plugin/core/clipboard/ClipboardPluginTest.java | 2 +-
7 files changed, 29 insertions(+), 22 deletions(-)
diff --git a/Ghidra/Framework/Docking/src/main/java/docking/action/DockingAction.java b/Ghidra/Framework/Docking/src/main/java/docking/action/DockingAction.java
index ec2b6744a1..865d975fed 100644
--- a/Ghidra/Framework/Docking/src/main/java/docking/action/DockingAction.java
+++ b/Ghidra/Framework/Docking/src/main/java/docking/action/DockingAction.java
@@ -303,7 +303,11 @@ public abstract class DockingAction implements DockingActionIf {
String text = menuData.getMenuItemName();
String trimmed = StringUtilities.trimMiddle(text, 50);
menuItem.setText(trimmed);
- menuItem.setIcon(menuData.getMenuIcon());
+ Icon icon = menuData.getMenuIcon();
+ menuItem.setIcon(icon);
+ if (icon != null) {
+ menuItem.setDisabledIcon(ResourceManager.getDisabledIcon(icon));
+ }
menuItem.setMnemonic(menuData.getMnemonic());
}
else {
diff --git a/Ghidra/Framework/Docking/src/main/java/docking/menu/DockingCheckboxMenuItemUI.java b/Ghidra/Framework/Docking/src/main/java/docking/menu/DockingCheckboxMenuItemUI.java
index 11b8ed0883..d8fb81e897 100644
--- a/Ghidra/Framework/Docking/src/main/java/docking/menu/DockingCheckboxMenuItemUI.java
+++ b/Ghidra/Framework/Docking/src/main/java/docking/menu/DockingCheckboxMenuItemUI.java
@@ -15,16 +15,15 @@
*/
package docking.menu;
-import javax.swing.*;
-import javax.swing.plaf.ComponentUI;
+import javax.swing.JComponent;
+import javax.swing.UIManager;
import javax.swing.plaf.MenuItemUI;
/**
* Overrides the painting behavior of the BasicCheckBoxMenuItemUI
*/
-
public class DockingCheckboxMenuItemUI extends DockingMenuItemUI {
- public static ComponentUI createUI(JComponent c) {
+ public static DockingCheckboxMenuItemUI createUI(JComponent c) {
DockingCheckboxMenuItemUI result = new DockingCheckboxMenuItemUI();
result.ui = (MenuItemUI) UIManager.getDefaults().getUI(c);
return result;
diff --git a/Ghidra/Framework/Docking/src/main/java/docking/menu/DockingMenuItemUI.java b/Ghidra/Framework/Docking/src/main/java/docking/menu/DockingMenuItemUI.java
index c692839a0b..9845ecb3cc 100644
--- a/Ghidra/Framework/Docking/src/main/java/docking/menu/DockingMenuItemUI.java
+++ b/Ghidra/Framework/Docking/src/main/java/docking/menu/DockingMenuItemUI.java
@@ -35,17 +35,17 @@ import docking.util.GraphicsUtils;
/**
* This class exists to make menu items display content with proper alignment whether or not
- * they are displaying an icon. That is, this class will introduce padding for absent icons
+ * they are displaying an icon. That is, this class will introduce padding for absent icons
* within menu items so that the item lines up with those items that do contain icons.
*
* This class has an additional feature that allows clients to display menu item content in a
* tabular fashion. A menu item using this UI can contain some combination of the of the following
- * items, in the given order:
+ * items, in the given order:
*
* [Checkbox][Icon][Menu Item Content][Menu Pull-right/Accelerator Text]
*
- * To display the Menu Item Content in a tabular fashion, use the '\t'
character
- * to delimit the data into columns. This class will align all menu items in the given menu
+ * To display the Menu Item Content in a tabular fashion, use the '\t'
character
+ * to delimit the data into columns. This class will align all menu items in the given menu
* based upon the largest number of columns in the group and the largest width for each column.
*/
public class DockingMenuItemUI extends MenuItemUI {
@@ -170,7 +170,7 @@ public class DockingMenuItemUI extends MenuItemUI {
}
public static class MenuTabulator {
- private ArrayList columns = new ArrayList();
+ private ArrayList columns = new ArrayList<>();
public static MenuTabulator tabulate(JMenuItem c) {
MenuTabulator tabulator = get(c);
diff --git a/Ghidra/Framework/Docking/src/main/java/docking/menu/DockingMenuUI.java b/Ghidra/Framework/Docking/src/main/java/docking/menu/DockingMenuUI.java
index d53eacd34b..956bb9c32a 100644
--- a/Ghidra/Framework/Docking/src/main/java/docking/menu/DockingMenuUI.java
+++ b/Ghidra/Framework/Docking/src/main/java/docking/menu/DockingMenuUI.java
@@ -15,12 +15,12 @@
*/
package docking.menu;
-import javax.swing.*;
-import javax.swing.plaf.ComponentUI;
+import javax.swing.JComponent;
+import javax.swing.UIManager;
import javax.swing.plaf.MenuItemUI;
public class DockingMenuUI extends DockingMenuItemUI {
- public static ComponentUI createUI(JComponent c) {
+ public static DockingMenuUI createUI(JComponent c) {
DockingMenuUI result = new DockingMenuUI();
result.ui = (MenuItemUI) UIManager.getDefaults().getUI(c);
return result;
diff --git a/Ghidra/Framework/Docking/src/main/java/docking/menu/MenuItemManager.java b/Ghidra/Framework/Docking/src/main/java/docking/menu/MenuItemManager.java
index 83eeda43c4..daf9c03906 100644
--- a/Ghidra/Framework/Docking/src/main/java/docking/menu/MenuItemManager.java
+++ b/Ghidra/Framework/Docking/src/main/java/docking/menu/MenuItemManager.java
@@ -20,8 +20,7 @@ import java.awt.event.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
-import javax.swing.ButtonModel;
-import javax.swing.JMenuItem;
+import javax.swing.*;
import javax.swing.event.ChangeListener;
import docking.ActionContext;
@@ -29,6 +28,7 @@ import docking.DefaultActionContext;
import docking.action.*;
import ghidra.util.Msg;
import ghidra.util.StringUtilities;
+import resources.ResourceManager;
/**
* Class to manage a JMenuItem for an action. Handles property changes in the action
@@ -184,7 +184,11 @@ class MenuItemManager implements ManagedMenuItem, PropertyChangeListener, Action
String text = menuData.getMenuItemName();
String trimmed = StringUtilities.trimMiddle(text, 50);
menuItem.setText(trimmed);
- menuItem.setIcon(menuData.getMenuIcon());
+ Icon menuIcon = menuData.getMenuIcon();
+ menuItem.setIcon(menuIcon);
+ if (menuIcon != null) {
+ menuItem.setDisabledIcon(ResourceManager.getDisabledIcon(menuIcon));
+ }
menuItem.setMnemonic(menuData.getMnemonic());
menuItem.revalidate();
}
diff --git a/Ghidra/Framework/Docking/src/main/java/docking/menu/MultipleActionDockingToolbarButton.java b/Ghidra/Framework/Docking/src/main/java/docking/menu/MultipleActionDockingToolbarButton.java
index 68038daec5..d566577622 100644
--- a/Ghidra/Framework/Docking/src/main/java/docking/menu/MultipleActionDockingToolbarButton.java
+++ b/Ghidra/Framework/Docking/src/main/java/docking/menu/MultipleActionDockingToolbarButton.java
@@ -164,10 +164,10 @@ public class MultipleActionDockingToolbarButton extends EmptyBorderButton {
// 1) show a popup if it was not showing
// 2) hide the popup if it was showing
//
- // Case 2 requires timestamps. Java will close the popup as the button is clicked. This
- // means that when we are told to show the popup as the result of a click, the popup will
- // never be showing. To work around this, we track the elapsed time since last click. If
- // the period is too short, then we assume Java closed the popup when the click happened
+ // Case 2 requires timestamps. Java will close the popup as the button is clicked. This
+ // means that when we are told to show the popup as the result of a click, the popup will
+ // never be showing. To work around this, we track the elapsed time since last click. If
+ // the period is too short, then we assume Java closed the popup when the click happened
//and thus we should ignore it.
//
long elapsedTime = System.currentTimeMillis() - popupLastClosedTime;
@@ -187,7 +187,7 @@ public class MultipleActionDockingToolbarButton extends EmptyBorderButton {
}
// a custom Ghidra UI that handles alignment issues and allows for tabulating presentation
- item.setUI((DockingMenuItemUI) DockingMenuItemUI.createUI(item));
+ item.setUI(DockingMenuItemUI.createUI(item));
final DockingActionIf delegateAction = dockingAction;
item.addActionListener(e -> {
ActionContext context = getActionContext();
diff --git a/Ghidra/Test/IntegrationTest/src/test.slow/java/ghidra/app/plugin/core/clipboard/ClipboardPluginTest.java b/Ghidra/Test/IntegrationTest/src/test.slow/java/ghidra/app/plugin/core/clipboard/ClipboardPluginTest.java
index d4cd1d736c..95e659bed1 100644
--- a/Ghidra/Test/IntegrationTest/src/test.slow/java/ghidra/app/plugin/core/clipboard/ClipboardPluginTest.java
+++ b/Ghidra/Test/IntegrationTest/src/test.slow/java/ghidra/app/plugin/core/clipboard/ClipboardPluginTest.java
@@ -1401,8 +1401,8 @@ public class ClipboardPluginTest extends AbstractGhidraHeadedIntegrationTest {
Point point = wrapper.getStartMouseDragLocation();
int startX = point.x;
int startY = point.y;
-
Point endPoint = wrapper.getEndMouseDragLocation();
+
int endX = endPoint.x;
int endY = endPoint.y;
From 14a7baea20fa1d062689f375306cca55aa86b73e Mon Sep 17 00:00:00 2001
From: dragonmacher <48328597+dragonmacher@users.noreply.github.com>
Date: Fri, 15 Dec 2023 11:20:39 -0500
Subject: [PATCH 2/2] review fix
---
.../Docking/src/main/java/docking/menu/DockingMenuItemUI.java | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/Ghidra/Framework/Docking/src/main/java/docking/menu/DockingMenuItemUI.java b/Ghidra/Framework/Docking/src/main/java/docking/menu/DockingMenuItemUI.java
index 9845ecb3cc..1a403c800c 100644
--- a/Ghidra/Framework/Docking/src/main/java/docking/menu/DockingMenuItemUI.java
+++ b/Ghidra/Framework/Docking/src/main/java/docking/menu/DockingMenuItemUI.java
@@ -28,7 +28,6 @@ import java.util.Map;
import javax.accessibility.Accessible;
import javax.swing.*;
-import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.MenuItemUI;
import docking.util.GraphicsUtils;
@@ -57,7 +56,7 @@ public class DockingMenuItemUI extends MenuItemUI {
protected MenuItemUI ui;
- public static ComponentUI createUI(JComponent c) {
+ public static DockingMenuItemUI createUI(JComponent c) {
DockingMenuItemUI result = new DockingMenuItemUI();
result.ui = (MenuItemUI) UIManager.getDefaults().getUI(c);
return result;