fix(gui): resolve active tab restore issue

This commit is contained in:
Skylot
2023-04-03 20:37:38 +01:00
parent 7a309ca367
commit 13e317d927
9 changed files with 46 additions and 50 deletions
@@ -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) {
@@ -143,7 +143,7 @@ public class JadxProject {
changed();
}
public void saveOpenTabs(List<EditorViewState> tabs, int activeTab) {
public void saveOpenTabs(List<EditorViewState> tabs) {
List<TabViewState> 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();
}
@@ -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;
@@ -19,7 +19,6 @@ public class ProjectData {
private List<String[]> treeExpansions = new ArrayList<>();
private JadxCodeData codeData = new JadxCodeData();
private List<TabViewState> 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 <code>true></code> if a change was saved
*/
public boolean setOpenTabs(List<TabViewState> 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 <code>true></code> 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;
@@ -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;
}
}
@@ -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<EditorViewState> 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<EditorViewState> 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) {
@@ -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<JNode, ContentPanel> entry : openTabs.entrySet()) {
final ContentPanel cp = entry.getValue();
if (cp == selectedContentPanel) {
@@ -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<EditorViewState> getEditorViewStates() {
ContentPanel selected = getSelectedContentPanel();
List<EditorViewState> 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();
}
@@ -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
+ '}';
}
}