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 @@
+