From 13e317d9274444fdeb511b025daf8553a7c6a352 Mon Sep 17 00:00:00 2001 From: Skylot Date: Mon, 3 Apr 2023 20:37:38 +0100 Subject: [PATCH] fix(gui): resolve active tab restore issue --- .../src/main/java/jadx/gui/logs/LogPanel.java | 2 +- .../java/jadx/gui/settings/JadxProject.java | 11 ++------- .../gui/settings/TabStateViewAdapter.java | 5 +++- .../jadx/gui/settings/data/ProjectData.java | 23 ------------------- .../jadx/gui/settings/data/TabViewState.java | 9 ++++++++ .../src/main/java/jadx/gui/ui/MainWindow.java | 17 ++++++-------- .../main/java/jadx/gui/ui/TabComponent.java | 2 +- .../src/main/java/jadx/gui/ui/TabbedPane.java | 17 ++++++++++---- .../jadx/gui/ui/codearea/EditorViewState.java | 10 ++++++++ 9 files changed, 46 insertions(+), 50 deletions(-) diff --git a/jadx-gui/src/main/java/jadx/gui/logs/LogPanel.java b/jadx-gui/src/main/java/jadx/gui/logs/LogPanel.java index 290d94a7c..d0770b2d2 100644 --- a/jadx-gui/src/main/java/jadx/gui/logs/LogPanel.java +++ b/jadx-gui/src/main/java/jadx/gui/logs/LogPanel.java @@ -141,7 +141,7 @@ public class LogPanel extends JPanel { } private @Nullable String getCurrentScriptName() { - ContentPanel selectedCodePanel = mainWindow.getTabbedPane().getSelectedCodePanel(); + ContentPanel selectedCodePanel = mainWindow.getTabbedPane().getSelectedContentPanel(); if (selectedCodePanel != null) { JNode node = selectedCodePanel.getNode(); if (node instanceof JInputScript) { diff --git a/jadx-gui/src/main/java/jadx/gui/settings/JadxProject.java b/jadx-gui/src/main/java/jadx/gui/settings/JadxProject.java index 8f0080c8b..0af437406 100644 --- a/jadx-gui/src/main/java/jadx/gui/settings/JadxProject.java +++ b/jadx-gui/src/main/java/jadx/gui/settings/JadxProject.java @@ -143,7 +143,7 @@ public class JadxProject { changed(); } - public void saveOpenTabs(List tabs, int activeTab) { + public void saveOpenTabs(List tabs) { List tabStateList = tabs.stream() .map(TabStateViewAdapter::build) .filter(Objects::nonNull) @@ -151,10 +151,7 @@ public class JadxProject { if (tabStateList.isEmpty()) { return; } - boolean dataChanged; - dataChanged = data.setOpenTabs(tabStateList); - dataChanged |= data.setActiveTab(activeTab); - if (dataChanged) { + if (data.setOpenTabs(tabStateList)) { changed(); } } @@ -166,10 +163,6 @@ public class JadxProject { .collect(Collectors.toList()); } - public int getActiveTab() { - return data.getActiveTab(); - } - public Path getMappingsPath() { return data.getMappingsPath(); } diff --git a/jadx-gui/src/main/java/jadx/gui/settings/TabStateViewAdapter.java b/jadx-gui/src/main/java/jadx/gui/settings/TabStateViewAdapter.java index d88b594ab..39fb3456b 100644 --- a/jadx-gui/src/main/java/jadx/gui/settings/TabStateViewAdapter.java +++ b/jadx-gui/src/main/java/jadx/gui/settings/TabStateViewAdapter.java @@ -28,6 +28,7 @@ public class TabStateViewAdapter { tvs.setSubPath(viewState.getSubPath()); tvs.setCaret(viewState.getCaretPos()); tvs.setView(new ViewPoint(viewState.getViewPoint())); + tvs.setActive(viewState.isActive()); return tvs; } @@ -38,7 +39,9 @@ public class TabStateViewAdapter { if (node == null) { return null; } - return new EditorViewState(node, tvs.getSubPath(), tvs.getCaret(), tvs.getView().toPoint()); + EditorViewState viewState = new EditorViewState(node, tvs.getSubPath(), tvs.getCaret(), tvs.getView().toPoint()); + viewState.setActive(tvs.isActive()); + return viewState; } catch (Exception e) { LOG.error("Failed to load tab state: " + tvs, e); return null; diff --git a/jadx-gui/src/main/java/jadx/gui/settings/data/ProjectData.java b/jadx-gui/src/main/java/jadx/gui/settings/data/ProjectData.java index 6706cf479..30ad305a1 100644 --- a/jadx-gui/src/main/java/jadx/gui/settings/data/ProjectData.java +++ b/jadx-gui/src/main/java/jadx/gui/settings/data/ProjectData.java @@ -19,7 +19,6 @@ public class ProjectData { private List treeExpansions = new ArrayList<>(); private JadxCodeData codeData = new JadxCodeData(); private List openTabs = Collections.emptyList(); - private int activeTab = -1; private @Nullable Path mappingsPath; private @Nullable Path cacheDir; private boolean enableLiveReload = false; @@ -62,11 +61,6 @@ public class ProjectData { return openTabs; } - /** - * - * @param openTabs - * @return true> if a change was saved - */ public boolean setOpenTabs(List openTabs) { if (this.openTabs.equals(openTabs)) { return false; @@ -75,23 +69,6 @@ public class ProjectData { return true; } - public int getActiveTab() { - return activeTab; - } - - /** - * - * @param activeTab - * @return true> if a change was saved - */ - public boolean setActiveTab(int activeTab) { - if (this.activeTab == activeTab) { - return false; - } - this.activeTab = activeTab; - return true; - } - @Nullable public Path getMappingsPath() { return mappingsPath; diff --git a/jadx-gui/src/main/java/jadx/gui/settings/data/TabViewState.java b/jadx-gui/src/main/java/jadx/gui/settings/data/TabViewState.java index 62abea99a..1ca10954d 100644 --- a/jadx-gui/src/main/java/jadx/gui/settings/data/TabViewState.java +++ b/jadx-gui/src/main/java/jadx/gui/settings/data/TabViewState.java @@ -6,6 +6,7 @@ public class TabViewState { private String subPath; private int caret; private ViewPoint view; + boolean active; public String getType() { return type; @@ -46,4 +47,12 @@ public class TabViewState { public void setView(ViewPoint view) { this.view = view; } + + public boolean isActive() { + return active; + } + + public void setActive(boolean active) { + this.active = active; + } } 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 a769d7096..183672dd1 100644 --- a/jadx-gui/src/main/java/jadx/gui/ui/MainWindow.java +++ b/jadx-gui/src/main/java/jadx/gui/ui/MainWindow.java @@ -938,7 +938,7 @@ public class MainWindow extends JFrame { } public void syncWithEditor() { - ContentPanel selectedContentPanel = tabbedPane.getSelectedCodePanel(); + ContentPanel selectedContentPanel = tabbedPane.getSelectedContentPanel(); if (selectedContentPanel == null) { return; } @@ -1112,7 +1112,7 @@ public class MainWindow extends JFrame { Action textSearchAction = new AbstractAction(NLS.str("menu.text_search"), ICON_SEARCH) { @Override public void actionPerformed(ActionEvent e) { - ContentPanel panel = tabbedPane.getSelectedCodePanel(); + ContentPanel panel = tabbedPane.getSelectedContentPanel(); if (panel instanceof AbstractCodeContentPanel) { AbstractCodeArea codeArea = ((AbstractCodeContentPanel) panel).getCodeArea(); String preferText = codeArea.getSelectedText(); @@ -1629,7 +1629,7 @@ public class MainWindow extends JFrame { } private void saveOpenTabs() { - project.saveOpenTabs(tabbedPane.getEditorViewStates(), tabbedPane.getSelectedIndex()); + project.saveOpenTabs(tabbedPane.getEditorViewStates()); } private void restoreOpenTabs(List openTabs) { @@ -1640,11 +1640,6 @@ public class MainWindow extends JFrame { for (EditorViewState viewState : openTabs) { tabbedPane.restoreEditorViewState(viewState); } - try { - tabbedPane.setSelectedIndex(project.getActiveTab()); - } catch (Exception e) { - LOG.warn("Failed to restore active tab", e); - } } private void preLoadOpenTabs(List openTabs) { @@ -1661,8 +1656,10 @@ public class MainWindow extends JFrame { private void saveSplittersInfo() { settings.setMainWindowVerticalSplitterLoc(bottomSplitPane.getDividerLocation()); - settings.setDebuggerStackFrameSplitterLoc(debuggerPanel.getLeftSplitterLocation()); - settings.setDebuggerVarTreeSplitterLoc(debuggerPanel.getRightSplitterLocation()); + if (debuggerPanel != null) { + settings.setDebuggerStackFrameSplitterLoc(debuggerPanel.getLeftSplitterLocation()); + settings.setDebuggerVarTreeSplitterLoc(debuggerPanel.getRightSplitterLocation()); + } } public void addLoadListener(ILoadListener loadListener) { 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 335443f7b..6a0027ce1 100644 --- a/jadx-gui/src/main/java/jadx/gui/ui/TabComponent.java +++ b/jadx-gui/src/main/java/jadx/gui/ui/TabComponent.java @@ -150,7 +150,7 @@ public class TabComponent extends JPanel { menu.add(closeAll); menu.addSeparator(); - ContentPanel selectedContentPanel = tabbedPane.getSelectedCodePanel(); + ContentPanel selectedContentPanel = tabbedPane.getSelectedContentPanel(); for (final Map.Entry entry : openTabs.entrySet()) { final ContentPanel cp = entry.getValue(); if (cp == selectedContentPanel) { 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 8fa428cae..fb827d2f0 100644 --- a/jadx-gui/src/main/java/jadx/gui/ui/TabbedPane.java +++ b/jadx-gui/src/main/java/jadx/gui/ui/TabbedPane.java @@ -152,7 +152,7 @@ public class TabbedPane extends JTabbedPane { private void enableSwitchingTabs() { addChangeListener(e -> { - ContentPanel tab = getSelectedCodePanel(); + ContentPanel tab = getSelectedContentPanel(); if (tab == null) { // all closed curTab = null; lastTab = null; @@ -285,7 +285,7 @@ public class TabbedPane extends JTabbedPane { @Nullable public JumpPosition getCurrentPosition() { - ContentPanel selectedCodePanel = getSelectedCodePanel(); + ContentPanel selectedCodePanel = getSelectedContentPanel(); if (selectedCodePanel instanceof AbstractCodeContentPanel) { return ((AbstractCodeContentPanel) selectedCodePanel).getCodeArea().getCurrentPosition(); } @@ -293,13 +293,17 @@ public class TabbedPane extends JTabbedPane { } public List getEditorViewStates() { + ContentPanel selected = getSelectedContentPanel(); List states = new ArrayList<>(); for (ContentPanel panel : openTabs.values()) { + EditorViewState viewState; if (panel instanceof IViewStateSupport) { - states.add(((IViewStateSupport) panel).getEditorViewState()); + viewState = ((IViewStateSupport) panel).getEditorViewState(); } else { - states.add(new EditorViewState(panel.getNode(), "", 0, EditorViewState.ZERO)); + viewState = new EditorViewState(panel.getNode(), "", 0, EditorViewState.ZERO); } + viewState.setActive(panel == selected); + states.add(viewState); } return states; } @@ -309,6 +313,9 @@ public class TabbedPane extends JTabbedPane { if (contentPanel instanceof IViewStateSupport) { ((IViewStateSupport) contentPanel).restoreEditorViewState(viewState); } + if (viewState.isActive()) { + setSelectedComponent(contentPanel); + } } public void navBack() { @@ -388,7 +395,7 @@ public class TabbedPane extends JTabbedPane { } @Nullable - public ContentPanel getSelectedCodePanel() { + public ContentPanel getSelectedContentPanel() { return (ContentPanel) getSelectedComponent(); } diff --git a/jadx-gui/src/main/java/jadx/gui/ui/codearea/EditorViewState.java b/jadx-gui/src/main/java/jadx/gui/ui/codearea/EditorViewState.java index 2b3f70a0e..9af301bfd 100644 --- a/jadx-gui/src/main/java/jadx/gui/ui/codearea/EditorViewState.java +++ b/jadx-gui/src/main/java/jadx/gui/ui/codearea/EditorViewState.java @@ -11,6 +11,7 @@ public class EditorViewState { private final int caretPos; private final Point viewPoint; private final String subPath; + private boolean active; public EditorViewState(JNode node, String subPath, int caretPos, Point viewPoint) { this.node = node; @@ -35,12 +36,21 @@ public class EditorViewState { return subPath; } + public boolean isActive() { + return active; + } + + public void setActive(boolean active) { + this.active = active; + } + @Override public String toString() { return "EditorViewState{node=" + node + ", caretPos=" + caretPos + ", viewPoint=" + viewPoint + ", subPath='" + subPath + '\'' + + ", active=" + active + '}'; } }