From 7420c70b2d65f823f596e234728ea3e53509c42c Mon Sep 17 00:00:00 2001 From: dragonmacher <48328597+dragonmacher@users.noreply.github.com> Date: Fri, 25 Apr 2025 16:46:58 -0400 Subject: [PATCH] GP-5618 - Tables - Updated tables so that Ctrl-Left-Click on the Mac does not clear the selection --- .../main/java/docking/DockableComponent.java | 28 ++++++++++++++++--- .../widgets/JTreeMouseListenerDelegate.java | 4 +-- .../java/docking/widgets/table/GTable.java | 2 +- .../main/java/docking/widgets/tree/GTree.java | 8 ++++++ 4 files changed, 35 insertions(+), 7 deletions(-) diff --git a/Ghidra/Framework/Docking/src/main/java/docking/DockableComponent.java b/Ghidra/Framework/Docking/src/main/java/docking/DockableComponent.java index 826f4456d5..9f7bb36952 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/DockableComponent.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/DockableComponent.java @@ -4,9 +4,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -166,6 +166,7 @@ public class DockableComponent extends JPanel implements ContainerListener { if (e.isPopupTrigger() && withinBounds) { PopupMenuContext popupContext = new PopupMenuContext(e); actionMgr.showPopupMenu(placeholder, popupContext); + e.consume(); } } @@ -328,8 +329,27 @@ public class DockableComponent extends JPanel implements ContainerListener { } if (comp.isFocusable()) { - comp.removeMouseListener(popupListener); - comp.addMouseListener(popupListener); + installPopupListenerFirst(comp); + } + } + + /** + * Remove and re-add all mouse listeners so our popup listener can go first. This allows our + * popup listener to consume the event, preventing Java UI listeners from changing the table + * selection when the user is performing a Ctrl-Mouse click on the Mac. + * + * @param comp the component + */ + private void installPopupListenerFirst(Component comp) { + comp.removeMouseListener(popupListener); + MouseListener[] listeners = comp.getMouseListeners(); + for (MouseListener l : listeners) { + comp.removeMouseListener(l); + } + + comp.addMouseListener(popupListener); + for (MouseListener l : listeners) { + comp.addMouseListener(l); } } diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/JTreeMouseListenerDelegate.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/JTreeMouseListenerDelegate.java index 759d9a5d27..4c27228d6e 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/JTreeMouseListenerDelegate.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/JTreeMouseListenerDelegate.java @@ -4,9 +4,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/GTable.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/GTable.java index bdf5000c33..96d07918b3 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/GTable.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/GTable.java @@ -104,7 +104,7 @@ public class GTable extends JTable { private MouseListener selectRowListener = new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { - if (e.getButton() == MouseEvent.BUTTON3) { + if (e.isPopupTrigger()) { int row = rowAtPoint(e.getPoint()); if (row >= 0) { if (!isRowSelected(row)) { diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/tree/GTree.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/tree/GTree.java index befd1ceae7..87440605f5 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/tree/GTree.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/tree/GTree.java @@ -1734,6 +1734,14 @@ public class GTree extends JPanel implements BusyListener { } } + @Override + public synchronized MouseListener[] getMouseListeners() { + if (mouseListenerDelegate == null) { + return super.getMouseListeners(); + } + return mouseListenerDelegate.getMouseListeners(); + } + @Override public void removeSelectionPath(TreePath path) { // Called by the UI to add/remove selections--mark it as a user event.