fix(gui): resolve active tab restore issue
This commit is contained in:
@@ -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
|
||||
+ '}';
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user