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 058448130..4092df12f 100644 --- a/jadx-gui/src/main/java/jadx/gui/ui/MainWindow.java +++ b/jadx-gui/src/main/java/jadx/gui/ui/MainWindow.java @@ -39,7 +39,6 @@ import java.util.function.Consumer; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.Box; -import javax.swing.ImageIcon; import javax.swing.JCheckBox; import javax.swing.JCheckBoxMenuItem; import javax.swing.JDialog; @@ -159,6 +158,7 @@ import jadx.gui.utils.CacheObject; import jadx.gui.utils.DesktopEntryUtils; import jadx.gui.utils.FontUtils; import jadx.gui.utils.ILoadListener; +import jadx.gui.utils.Icons; import jadx.gui.utils.LafManager; import jadx.gui.utils.Link; import jadx.gui.utils.NLS; @@ -179,26 +179,6 @@ public class MainWindow extends JFrame { private static final double WINDOW_RATIO = 1 - BORDER_RATIO * 2; public static final double SPLIT_PANE_RESIZE_WEIGHT = 0.15; - private static final ImageIcon ICON_ADD_FILES = UiUtils.openSvgIcon("ui/addFile"); - private static final ImageIcon ICON_RELOAD = UiUtils.openSvgIcon("ui/refresh"); - private static final ImageIcon ICON_EXPORT = UiUtils.openSvgIcon("ui/export"); - private static final ImageIcon ICON_EXIT = UiUtils.openSvgIcon("ui/exit"); - private static final ImageIcon ICON_SYNC = UiUtils.openSvgIcon("ui/pagination"); - private static final ImageIcon ICON_FLAT_PKG = UiUtils.openSvgIcon("ui/moduleGroup"); - private static final ImageIcon ICON_SEARCH = UiUtils.openSvgIcon("ui/find"); - private static final ImageIcon ICON_FIND = UiUtils.openSvgIcon("ui/ejbFinderMethod"); - private static final ImageIcon ICON_COMMENT_SEARCH = UiUtils.openSvgIcon("ui/usagesFinder"); - private static final ImageIcon ICON_MAIN_ACTIVITY = UiUtils.openSvgIcon("ui/home"); - private static final ImageIcon ICON_BACK = UiUtils.openSvgIcon("ui/left"); - private static final ImageIcon ICON_FORWARD = UiUtils.openSvgIcon("ui/right"); - private static final ImageIcon ICON_QUARK = UiUtils.openSvgIcon("ui/quark"); - private static final ImageIcon ICON_PREF = UiUtils.openSvgIcon("ui/settings"); - private static final ImageIcon ICON_DEOBF = UiUtils.openSvgIcon("ui/helmChartLock"); - private static final ImageIcon ICON_DECOMPILE_ALL = UiUtils.openSvgIcon("ui/runAll"); - private static final ImageIcon ICON_LOG = UiUtils.openSvgIcon("ui/logVerbose"); - private static final ImageIcon ICON_INFO = UiUtils.openSvgIcon("ui/showInfos"); - private static final ImageIcon ICON_DEBUGGER = UiUtils.openSvgIcon("ui/startDebugger"); - private final transient JadxWrapper wrapper; private final transient JadxSettings settings; private final transient CacheObject cacheObject; @@ -1082,7 +1062,7 @@ public class MainWindow extends JFrame { JadxGuiAction exitAction = new JadxGuiAction(ActionModel.EXIT, this::closeWindow); isFlattenPackage = settings.isFlattenPackage(); - flatPkgMenuItem = new JCheckBoxMenuItem(NLS.str("menu.flatten"), ICON_FLAT_PKG); + flatPkgMenuItem = new JCheckBoxMenuItem(NLS.str("menu.flatten"), Icons.FLAT_PKG); flatPkgMenuItem.setState(isFlattenPackage); JCheckBoxMenuItem heapUsageBarMenuItem = new JCheckBoxMenuItem(NLS.str("menu.heapUsageBar")); @@ -1105,16 +1085,15 @@ public class MainWindow extends JFrame { dockLog.setState(settings.isDockLogViewer()); dockLog.addActionListener(event -> settings.setDockLogViewer(!settings.isDockLogViewer())); - JCheckBoxMenuItem dockQuickTabs = new JCheckBoxMenuItem(NLS.str("menu.dock_quick_tabs")); - dockQuickTabs.setState(settings.isDockQuickTabs()); - dockQuickTabs.addActionListener(event -> { + ActionHandler quickTabsAction = new ActionHandler(ev -> { boolean visible = quickTabsTree == null; setQuickTabsVisibility(visible); settings.setDockQuickTabs(visible); }); - if (dockQuickTabs.getState()) { - setQuickTabsVisibility(true); - } + quickTabsAction.setNameAndDesc(NLS.str("menu.dock_quick_tabs")); + quickTabsAction.setIcon(Icons.QUICK_TABS); + quickTabsAction.setSelected(settings.isDockQuickTabs()); + setQuickTabsVisibility(settings.isDockQuickTabs()); JadxGuiAction syncAction = new JadxGuiAction(ActionModel.SYNC, this.editorSyncManager::sync); JadxGuiAction textSearchAction = new JadxGuiAction(ActionModel.TEXT_SEARCH, this::textSearch); @@ -1174,12 +1153,14 @@ public class MainWindow extends JFrame { JMenu view = new JadxMenu(NLS.str("menu.view"), shortcutsController); view.setMnemonic(KeyEvent.VK_V); + view.add(quickTabsAction.makeCheckBoxMenuItem()); view.add(flatPkgMenuItem); + view.addSeparator(); view.add(syncAction); - view.add(heapUsageBarMenuItem); view.add(alwaysSelectOpened); + view.addSeparator(); view.add(dockLog); - view.add(dockQuickTabs); + view.add(heapUsageBarMenuItem); JMenu nav = new JadxMenu(NLS.str("menu.navigation"), shortcutsController); nav.setMnemonic(KeyEvent.VK_N); @@ -1235,7 +1216,7 @@ public class MainWindow extends JFrame { menuBar.add(help); setJMenuBar(menuBar); - flatPkgButton = new JToggleButton(ICON_FLAT_PKG); + flatPkgButton = new JToggleButton(Icons.FLAT_PKG); flatPkgButton.setSelected(isFlattenPackage); ActionListener flatPkgAction = e -> toggleFlattenPackage(); flatPkgMenuItem.addActionListener(flatPkgAction); @@ -1256,6 +1237,7 @@ public class MainWindow extends JFrame { toolbar.addSeparator(); toolbar.add(syncAction); toolbar.add(flatPkgButton); + toolbar.add(quickTabsAction.makeToggleButton()); toolbar.addSeparator(); toolbar.add(textSearchAction); toolbar.add(clsSearchAction); diff --git a/jadx-gui/src/main/java/jadx/gui/ui/action/ActionModel.java b/jadx-gui/src/main/java/jadx/gui/ui/action/ActionModel.java index a686521e2..8097a38fb 100644 --- a/jadx-gui/src/main/java/jadx/gui/ui/action/ActionModel.java +++ b/jadx-gui/src/main/java/jadx/gui/ui/action/ActionModel.java @@ -43,7 +43,7 @@ public enum ActionModel { Shortcut.keyboard(KeyEvent.VK_P, UiUtils.ctrlButton() | KeyEvent.SHIFT_DOWN_MASK)), EXIT(MENU_TOOLBAR, "file.exit", "file.exit", "ui/exit", Shortcut.none()), - SYNC(MENU_TOOLBAR, "menu.sync", "menu.sync", "ui/pagination", + SYNC(MENU_TOOLBAR, "menu.sync", "menu.sync", "ui/selectWeb", Shortcut.keyboard(KeyEvent.VK_T, UiUtils.ctrlButton())), TEXT_SEARCH(MENU_TOOLBAR, "menu.text_search", "menu.text_search", "ui/find", Shortcut.keyboard(KeyEvent.VK_F, UiUtils.ctrlButton() | KeyEvent.SHIFT_DOWN_MASK)), diff --git a/jadx-gui/src/main/java/jadx/gui/ui/tab/TabComponent.java b/jadx-gui/src/main/java/jadx/gui/ui/tab/TabComponent.java index dd5f01d71..4ebc1e424 100644 --- a/jadx-gui/src/main/java/jadx/gui/ui/tab/TabComponent.java +++ b/jadx-gui/src/main/java/jadx/gui/ui/tab/TabComponent.java @@ -25,6 +25,9 @@ import jadx.core.utils.exceptions.JadxRuntimeException; import jadx.gui.treemodel.JClass; import jadx.gui.treemodel.JEditableNode; import jadx.gui.treemodel.JNode; +import jadx.gui.ui.MainWindow; +import jadx.gui.ui.action.ActionModel; +import jadx.gui.ui.action.JadxGuiAction; import jadx.gui.ui.panel.ContentPanel; import jadx.gui.ui.tab.dnd.TabDndGestureListener; import jadx.gui.utils.Icons; @@ -234,9 +237,11 @@ public class TabComponent extends JPanel { } if (nodeFullName != null) { - JMenuItem revealTab = new JMenuItem(NLS.str("menu.sync")); - revealTab.addActionListener(e -> tabsController.getMainWindow().selectNodeInTree(getNode())); - menu.add(revealTab); + MainWindow mainWindow = tabsController.getMainWindow(); + JadxGuiAction selectInTree = new JadxGuiAction(ActionModel.SYNC, () -> mainWindow.selectNodeInTree(getNode())); + // attach shortcut without bind only to show current keybinding + selectInTree.setShortcut(mainWindow.getShortcutsController().get(ActionModel.SYNC)); + menu.add(selectInTree); menu.addSeparator(); } diff --git a/jadx-gui/src/main/java/jadx/gui/utils/Icons.java b/jadx-gui/src/main/java/jadx/gui/utils/Icons.java index 650c41515..2f2975958 100644 --- a/jadx-gui/src/main/java/jadx/gui/utils/Icons.java +++ b/jadx-gui/src/main/java/jadx/gui/utils/Icons.java @@ -15,6 +15,9 @@ public class Icons { public static final ImageIcon SAVE_ALL = UiUtils.openSvgIcon("ui/menu-saveall"); + public static final ImageIcon FLAT_PKG = UiUtils.openSvgIcon("ui/moduleGroup"); + public static final ImageIcon QUICK_TABS = UiUtils.openSvgIcon("ui/dataView"); + public static final ImageIcon PIN = UiUtils.openSvgIcon("nodes/pin"); public static final ImageIcon PIN_DARK = UiUtils.openSvgIcon("nodes/pin_dark"); public static final ImageIcon PIN_HOVERED = UiUtils.openSvgIcon("nodes/pinHovered"); diff --git a/jadx-gui/src/main/java/jadx/gui/utils/ui/ActionHandler.java b/jadx-gui/src/main/java/jadx/gui/utils/ui/ActionHandler.java index bb39aab52..688b94698 100644 --- a/jadx-gui/src/main/java/jadx/gui/utils/ui/ActionHandler.java +++ b/jadx-gui/src/main/java/jadx/gui/utils/ui/ActionHandler.java @@ -4,9 +4,11 @@ import java.awt.event.ActionEvent; import java.util.function.Consumer; import javax.swing.AbstractAction; -import javax.swing.ImageIcon; +import javax.swing.Icon; import javax.swing.JButton; +import javax.swing.JCheckBoxMenuItem; import javax.swing.JComponent; +import javax.swing.JToggleButton; import javax.swing.KeyStroke; import jadx.gui.utils.UiUtils; @@ -52,10 +54,14 @@ public class ActionHandler extends AbstractAction { putValue(SHORT_DESCRIPTION, desc); } - public void setIcon(ImageIcon icon) { + public void setIcon(Icon icon) { putValue(SMALL_ICON, icon); } + public void setSelected(boolean selected) { + putValue(SELECTED_KEY, selected); + } + public void setKeyBinding(KeyStroke keyStroke) { putValue(ACCELERATOR_KEY, keyStroke); } @@ -83,4 +89,14 @@ public class ActionHandler extends AbstractAction { addKeyBindToDescription(); return new JButton(this); } + + public JToggleButton makeToggleButton() { + JToggleButton toggleButton = new JToggleButton(this); + toggleButton.setText(""); + return toggleButton; + } + + public JCheckBoxMenuItem makeCheckBoxMenuItem() { + return new JCheckBoxMenuItem(this); + } } 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 58fbee61e..117b71233 100644 --- a/jadx-gui/src/main/resources/i18n/Messages_en_US.properties +++ b/jadx-gui/src/main/resources/i18n/Messages_en_US.properties @@ -5,12 +5,12 @@ menu.view=View menu.recent_projects=Recent projects menu.no_recent_projects=No recent projects 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.dock_log=Dock log viewer -menu.dock_quick_tabs=Dock quick tabs +menu.sync=Select in Tree +menu.flatten=Use Flatten Packages +menu.heapUsageBar=Show Memory Usage Bar +menu.alwaysSelectOpened=Auto Select in Tree +menu.dock_log=Dock Log Viewer +menu.dock_quick_tabs=Show Quick Tabs menu.navigation=Navigation menu.text_search=Text search menu.class_search=Class search diff --git a/jadx-gui/src/main/resources/icons/ui/dataView.svg b/jadx-gui/src/main/resources/icons/ui/dataView.svg new file mode 100644 index 000000000..727667269 --- /dev/null +++ b/jadx-gui/src/main/resources/icons/ui/dataView.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/jadx-gui/src/main/resources/icons/ui/selectWeb.svg b/jadx-gui/src/main/resources/icons/ui/selectWeb.svg new file mode 100644 index 000000000..9a3865dc0 --- /dev/null +++ b/jadx-gui/src/main/resources/icons/ui/selectWeb.svg @@ -0,0 +1,4 @@ + + + +