From 8461e91758d7d67a9f274251d4a3df310426944c Mon Sep 17 00:00:00 2001 From: dev747368 <48332326+dev747368@users.noreply.github.com> Date: Tue, 6 Aug 2019 16:02:40 -0400 Subject: [PATCH 1/2] GT-2383 tree focus when clicking on already selected node. --- .../Docking/src/main/java/docking/widgets/tree/GTree.java | 4 ++++ 1 file changed, 4 insertions(+) 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 91704d22ec..0fc08d2eba 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 @@ -1324,6 +1324,10 @@ public class GTree extends JPanel implements BusyListener { protected void setSelectedPathNow(TreePath path) { GTreeSelectionModel selectionModel = (GTreeSelectionModel) gTree.getSelectionModel(); selectionModel.setSelectionPaths(new TreePath[] { path }, USER_GENERATED); + + // If the user clicked on the same node as was already selected, no events are generated + // and the tree might be left unfocused. Force the focus to the tree. + gTree.requestFocus(); } } From bcba73fdce2f2d4f1b509267e39276f3c51f6919 Mon Sep 17 00:00:00 2001 From: dev747368 <48332326+dev747368@users.noreply.github.com> Date: Tue, 6 Aug 2019 16:55:21 -0400 Subject: [PATCH 2/2] GT-2383 - tree focus, code review tweaks --- .../docking/widgets/JTreeMouseListenerDelegate.java | 13 +++++++++++-- .../src/main/java/docking/widgets/tree/GTree.java | 4 ---- 2 files changed, 11 insertions(+), 6 deletions(-) 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 14af4be37d..759d9a5d27 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/JTreeMouseListenerDelegate.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/JTreeMouseListenerDelegate.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,7 +25,7 @@ import javax.swing.tree.TreeSelectionModel; public class JTreeMouseListenerDelegate extends MouseAdapter { - private final Set listeners = new CopyOnWriteArraySet(); + private final Set listeners = new CopyOnWriteArraySet<>(); private final JTree tree; private boolean consumedPressed; @@ -87,6 +86,10 @@ public class JTreeMouseListenerDelegate extends MouseAdapter { if (isPotentialDragSelection(e)) { e.consume(); consumedPressed = true; + + // ensure the tree has focus in this case, since we consumed the event, which can + // prevent the normal focus updating done by Swing + fixFocus(); } else { consumedPressed = false; @@ -94,6 +97,12 @@ public class JTreeMouseListenerDelegate extends MouseAdapter { fireMousePressed(e); } + private void fixFocus() { + if (!tree.hasFocus()) { + tree.requestFocus(); + } + } + @Override public void mouseClicked(MouseEvent e) { handlePopupTrigger(e); 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 0fc08d2eba..91704d22ec 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 @@ -1324,10 +1324,6 @@ public class GTree extends JPanel implements BusyListener { protected void setSelectedPathNow(TreePath path) { GTreeSelectionModel selectionModel = (GTreeSelectionModel) gTree.getSelectionModel(); selectionModel.setSelectionPaths(new TreePath[] { path }, USER_GENERATED); - - // If the user clicked on the same node as was already selected, no events are generated - // and the tree might be left unfocused. Force the focus to the tree. - gTree.requestFocus(); } }