diff --git a/jadx-gui/src/main/java/jadx/gui/ui/MainWindow.java b/jadx-gui/src/main/java/jadx/gui/ui/MainWindow.java index 3190cbaf6..059d34531 100644 --- a/jadx-gui/src/main/java/jadx/gui/ui/MainWindow.java +++ b/jadx-gui/src/main/java/jadx/gui/ui/MainWindow.java @@ -15,6 +15,8 @@ import java.awt.dnd.DnDConstants; import java.awt.dnd.DropTarget; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.event.FocusAdapter; +import java.awt.event.FocusEvent; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; @@ -680,28 +682,29 @@ public class MainWindow extends JFrame { reOpenFile(); } - private void nodeClickAction(@Nullable Object obj) { + private boolean nodeClickAction(@Nullable Object obj) { + if (obj == null) { + return false; + } try { - if (obj == null) { - return; - } if (obj instanceof JResource) { JResource res = (JResource) obj; ResourceFile resFile = res.getResFile(); if (resFile != null && JResource.isSupportedForView(resFile.getType())) { - tabbedPane.showNode(res); + return tabbedPane.showNode(res); } } else if (obj instanceof JNode) { JNode node = (JNode) obj; if (node.getRootClass() != null) { tabbedPane.codeJump(new JumpPosition(node)); - } else { - tabbedPane.showNode(node); + return true; } + return tabbedPane.showNode(node); } } catch (Exception e) { LOG.error("Content loading error", e); } + return false; } private void treeRightClickAction(MouseEvent e) { @@ -738,6 +741,7 @@ public class MainWindow extends JFrame { } Object obj = path.getLastPathComponent(); if (obj instanceof JNode) { + tree.setSelectionPath(path); return (JNode) obj; } return null; @@ -1090,11 +1094,22 @@ public class MainWindow extends JFrame { tree = new JTree(treeModel); ToolTipManager.sharedInstance().registerComponent(tree); tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); + tree.setFocusable(false); + tree.addFocusListener(new FocusAdapter() { + @Override + public void focusLost(FocusEvent e) { + tree.setFocusable(false); + } + }); tree.addMouseListener(new MouseAdapter() { @Override - public void mouseClicked(MouseEvent e) { + public void mousePressed(MouseEvent e) { if (SwingUtilities.isLeftMouseButton(e)) { - nodeClickAction(getJNodeUnderMouse(e)); + if (!nodeClickAction(getJNodeUnderMouse(e))) { + // click ignored -> switch to focusable mode + tree.setFocusable(true); + tree.requestFocus(); + } } else if (SwingUtilities.isRightMouseButton(e)) { treeRightClickAction(e); } diff --git a/jadx-gui/src/main/java/jadx/gui/ui/TabbedPane.java b/jadx-gui/src/main/java/jadx/gui/ui/TabbedPane.java index 037d9d991..221dfab78 100644 --- a/jadx-gui/src/main/java/jadx/gui/ui/TabbedPane.java +++ b/jadx-gui/src/main/java/jadx/gui/ui/TabbedPane.java @@ -203,12 +203,13 @@ public class TabbedPane extends JTabbedPane { }); } - public void showNode(JNode node) { + public boolean showNode(JNode node) { final ContentPanel contentPanel = getContentPanel(node); if (contentPanel == null) { - return; + return false; } - SwingUtilities.invokeLater(() -> selectTab(contentPanel)); + selectTab(contentPanel); + return true; } public void selectTab(ContentPanel contentPanel) {