diff --git a/jadx-gui/src/main/java/jadx/gui/settings/JadxSettings.java b/jadx-gui/src/main/java/jadx/gui/settings/JadxSettings.java index cf6466bb01af3b728f50cbbf4c19eb8309d02698..917f4bff0635b83cf9ab83bfacffca5895eb3b08 100644 --- a/jadx-gui/src/main/java/jadx/gui/settings/JadxSettings.java +++ b/jadx-gui/src/main/java/jadx/gui/settings/JadxSettings.java @@ -42,7 +42,7 @@ public class JadxSettings extends JadxCLIArgs { private static final Path USER_HOME = Paths.get(System.getProperty("user.home")); private static final int RECENT_PROJECTS_COUNT = 15; - private static final int CURRENT_SETTINGS_VERSION = 12; + private static final int CURRENT_SETTINGS_VERSION = 13; private static final Font DEFAULT_FONT = new RSyntaxTextArea().getFont(); @@ -68,6 +68,7 @@ public class JadxSettings extends JadxCLIArgs { private boolean autoSaveProject = false; private boolean showHeapUsageBar = false; + private boolean alwaysSelectOpened = false; private Map windowPos = new HashMap<>(); private int mainWindowExtendedState = JFrame.NORMAL; @@ -242,6 +243,15 @@ public class JadxSettings extends JadxCLIArgs { partialSync(settings -> settings.showHeapUsageBar = showHeapUsageBar); } + public boolean isAlwaysSelectOpened() { + return alwaysSelectOpened; + } + + public void setAlwaysSelectOpened(boolean showHeapUsageBar) { + this.alwaysSelectOpened = showHeapUsageBar; + partialSync(settings -> settings.alwaysSelectOpened = alwaysSelectOpened); + } + public String getExcludedPackages() { return excludedPackages; } @@ -607,6 +617,10 @@ public class JadxSettings extends JadxCLIArgs { inlineMethods = true; fromVersion++; } + if (fromVersion == 12) { + alwaysSelectOpened = false; + fromVersion++; + } if (fromVersion != CURRENT_SETTINGS_VERSION) { throw new JadxRuntimeException("Incorrect settings upgrade"); } 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 cc3c4a03dacd91a8d4a54fcbea65c4ecf7e75530..36354c34b99bc22f55dd6d8b7469b9d67ba87567 100644 --- a/jadx-gui/src/main/java/jadx/gui/ui/MainWindow.java +++ b/jadx-gui/src/main/java/jadx/gui/ui/MainWindow.java @@ -745,7 +745,7 @@ public class MainWindow extends JFrame { return null; } - private void syncWithEditor() { + public void syncWithEditor() { ContentPanel selectedContentPanel = tabbedPane.getSelectedCodePanel(); if (selectedContentPanel == null) { return; @@ -861,6 +861,12 @@ public class MainWindow extends JFrame { heapUsageBar.setVisible(settings.isShowHeapUsageBar()); }); + JCheckBoxMenuItem alwaysSelectOpened = new JCheckBoxMenuItem(NLS.str("menu.alwaysSelectOpened")); + alwaysSelectOpened.setState(settings.isAlwaysSelectOpened()); + alwaysSelectOpened.addActionListener(event -> { + settings.setAlwaysSelectOpened(!settings.isAlwaysSelectOpened()); + }); + Action syncAction = new AbstractAction(NLS.str("menu.sync"), ICON_SYNC) { @Override public void actionPerformed(ActionEvent e) { @@ -999,6 +1005,7 @@ public class MainWindow extends JFrame { view.add(flatPkgMenuItem); view.add(syncAction); view.add(heapUsageBarMenuItem); + view.add(alwaysSelectOpened); JMenu nav = new JMenu(NLS.str("menu.navigation")); nav.setMnemonic(KeyEvent.VK_N); diff --git a/jadx-gui/src/main/java/jadx/gui/ui/TabComponent.java b/jadx-gui/src/main/java/jadx/gui/ui/TabComponent.java index b126945f9e3025835edbba79f82f913294357587..5bb7476fa99e3667ad4490320d1ec70d49225d1f 100644 --- a/jadx-gui/src/main/java/jadx/gui/ui/TabComponent.java +++ b/jadx-gui/src/main/java/jadx/gui/ui/TabComponent.java @@ -51,9 +51,8 @@ public class TabComponent extends JPanel { } private void init() { - JPanel panel = this; - panel.setLayout(new FlowLayout(FlowLayout.CENTER, 3, 0)); - panel.setOpaque(false); + setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0)); + setOpaque(false); JNode node = contentPanel.getNode(); String tabTitle; @@ -93,18 +92,18 @@ public class TabComponent extends JPanel { menu.show(e.getComponent(), e.getX(), e.getY()); } else if (SwingUtilities.isLeftMouseButton(e)) { if (tabbedPane.getSelectedComponent() != contentPanel) { - tabbedPane.setSelectedComponent(contentPanel); + tabbedPane.selectTab(contentPanel); } } } }; - panel.addMouseListener(clickAdapter); + addMouseListener(clickAdapter); label.addMouseListener(clickAdapter); closeBtn.addMouseListener(clickAdapter); - panel.add(label); - panel.add(closeBtn); - panel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); + add(label); + add(closeBtn); + setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); } private JPopupMenu createTabPopupMenu(final ContentPanel contentPanel) { 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 5fd7912f477a1becc04b49cbcec059f42a99e518..f2aec5e3a5b6d253c8c76da3643b5550e43434b7 100644 --- a/jadx-gui/src/main/java/jadx/gui/ui/TabbedPane.java +++ b/jadx-gui/src/main/java/jadx/gui/ui/TabbedPane.java @@ -100,7 +100,7 @@ public class TabbedPane extends JTabbedPane { } } if (doSwitch) { - setSelectedComponent(lastTab); + selectTab(lastTab); } } } else if (consume && (e.getModifiersEx() & ctrlDown) == 0) { @@ -168,7 +168,7 @@ public class TabbedPane extends JTabbedPane { return; } SwingUtilities.invokeLater(() -> { - setSelectedComponent(contentPanel); + selectTab(contentPanel); AbstractCodeArea codeArea = contentPanel.getCodeArea(); int pos = jumpPos.getPos(); if (pos > 0) { @@ -206,7 +206,14 @@ public class TabbedPane extends JTabbedPane { if (contentPanel == null) { return; } - SwingUtilities.invokeLater(() -> setSelectedComponent(contentPanel)); + SwingUtilities.invokeLater(() -> selectTab(contentPanel)); + } + + public void selectTab(ContentPanel contentPanel) { + setSelectedComponent(contentPanel); + if (mainWindow.getSettings().isAlwaysSelectOpened()) { + mainWindow.syncWithEditor(); + } } public void codeJump(JNode node) { @@ -231,7 +238,7 @@ public class TabbedPane extends JTabbedPane { throw new JadxRuntimeException("Failed to open panel for JClass: " + cls); } } else { - setSelectedComponent(panel); + selectTab(panel); } ClassCodeContentPanel codePane = ((ClassCodeContentPanel) panel); codePane.showSmaliPane(); diff --git a/jadx-gui/src/main/resources/i18n/Messages_de_DE.properties b/jadx-gui/src/main/resources/i18n/Messages_de_DE.properties index 505d762ee3575105973a49c2a06148e7e6787067..a8fe1700eb93c6f3de3e5e6ba2d11e57654ea086 100644 --- a/jadx-gui/src/main/resources/i18n/Messages_de_DE.properties +++ b/jadx-gui/src/main/resources/i18n/Messages_de_DE.properties @@ -8,6 +8,7 @@ menu.preferences=Präferenzen menu.sync=Mit Editor synchronisieren menu.flatten=Codepaket erweitern menu.heapUsageBar=Speicherverbrauchsleiste anzeigen +#menu.alwaysSelectOpened=Always Select Opened File/Class menu.navigation=Navigation menu.text_search=Textsuche menu.class_search=Klassen-Suche diff --git a/jadx-gui/src/main/resources/i18n/Messages_en_US.properties b/jadx-gui/src/main/resources/i18n/Messages_en_US.properties index 0ec683f285d418e514b427bfffdf48fe5901acf5..9e5d7bf03de794cb5fb86e76931620e6a5554f6d 100644 --- a/jadx-gui/src/main/resources/i18n/Messages_en_US.properties +++ b/jadx-gui/src/main/resources/i18n/Messages_en_US.properties @@ -8,6 +8,7 @@ menu.preferences=Preferences menu.sync=Sync with editor menu.flatten=Show flatten packages menu.heapUsageBar=Show memory usage bar +menu.alwaysSelectOpened=Always Select Opened File/Class menu.navigation=Navigation menu.text_search=Text search menu.class_search=Class search diff --git a/jadx-gui/src/main/resources/i18n/Messages_es_ES.properties b/jadx-gui/src/main/resources/i18n/Messages_es_ES.properties index 9e9759ced79c7eb9ac12edd8555f98ab3c47799b..cff20d2fd568c1346a2565b016d92fc0bb41bb86 100644 --- a/jadx-gui/src/main/resources/i18n/Messages_es_ES.properties +++ b/jadx-gui/src/main/resources/i18n/Messages_es_ES.properties @@ -8,6 +8,7 @@ menu.preferences=Preferencias menu.sync=Sincronizar con el editor menu.flatten=Mostrar paquetes en vista plana #menu.heapUsageBar= +#menu.alwaysSelectOpened=Always Select Opened File/Class menu.navigation=Navegación menu.text_search=Buscar texto menu.class_search=Buscar clase diff --git a/jadx-gui/src/main/resources/i18n/Messages_ko_KR.properties b/jadx-gui/src/main/resources/i18n/Messages_ko_KR.properties index ef72dc946b376ce105e4801f3f68e828963d5784..ee75171852f406a46c8a9332550d6ede58ee40cf 100644 --- a/jadx-gui/src/main/resources/i18n/Messages_ko_KR.properties +++ b/jadx-gui/src/main/resources/i18n/Messages_ko_KR.properties @@ -8,6 +8,7 @@ menu.preferences=설정 menu.sync=에디터와 동기화 menu.flatten=플랫 패키지 표시 menu.heapUsageBar=메모리 사용량 표시 +#menu.alwaysSelectOpened=Always Select Opened File/Class menu.navigation=네비게이션 menu.text_search=텍스트 검색 menu.class_search=클래스 검색 diff --git a/jadx-gui/src/main/resources/i18n/Messages_zh_CN.properties b/jadx-gui/src/main/resources/i18n/Messages_zh_CN.properties index 58cd513b0d01b63d2570a6961c3a7ea90f7f7d9e..2bfd7ad42cc443a2c6755cc4b1ef6cad65f1df8d 100644 --- a/jadx-gui/src/main/resources/i18n/Messages_zh_CN.properties +++ b/jadx-gui/src/main/resources/i18n/Messages_zh_CN.properties @@ -8,6 +8,7 @@ menu.preferences=首选项 menu.sync=与编辑器同步 menu.flatten=展开显示代码包 menu.heapUsageBar=显示内存使用栏 +#menu.alwaysSelectOpened=Always Select Opened File/Class menu.navigation=导航 menu.text_search=搜索文本 menu.class_search=搜索类