feat(gui): added option to always select opened file/class
This commit is contained in:
@@ -42,7 +42,7 @@ public class JadxSettings extends JadxCLIArgs {
|
||||
|
||||
private static final Path USER_HOME = Paths.get(System.getProperty("user.home"));
|
||||
private static final int RECENT_PROJECTS_COUNT = 15;
|
||||
private static final int CURRENT_SETTINGS_VERSION = 12;
|
||||
private static final int CURRENT_SETTINGS_VERSION = 13;
|
||||
|
||||
private static final Font DEFAULT_FONT = new RSyntaxTextArea().getFont();
|
||||
|
||||
@@ -68,6 +68,7 @@ public class JadxSettings extends JadxCLIArgs {
|
||||
private boolean autoSaveProject = false;
|
||||
|
||||
private boolean showHeapUsageBar = false;
|
||||
private boolean alwaysSelectOpened = false;
|
||||
|
||||
private Map<String, WindowLocation> windowPos = new HashMap<>();
|
||||
private int mainWindowExtendedState = JFrame.NORMAL;
|
||||
@@ -242,6 +243,15 @@ public class JadxSettings extends JadxCLIArgs {
|
||||
partialSync(settings -> settings.showHeapUsageBar = showHeapUsageBar);
|
||||
}
|
||||
|
||||
public boolean isAlwaysSelectOpened() {
|
||||
return alwaysSelectOpened;
|
||||
}
|
||||
|
||||
public void setAlwaysSelectOpened(boolean showHeapUsageBar) {
|
||||
this.alwaysSelectOpened = showHeapUsageBar;
|
||||
partialSync(settings -> settings.alwaysSelectOpened = alwaysSelectOpened);
|
||||
}
|
||||
|
||||
public String getExcludedPackages() {
|
||||
return excludedPackages;
|
||||
}
|
||||
@@ -607,6 +617,10 @@ public class JadxSettings extends JadxCLIArgs {
|
||||
inlineMethods = true;
|
||||
fromVersion++;
|
||||
}
|
||||
if (fromVersion == 12) {
|
||||
alwaysSelectOpened = false;
|
||||
fromVersion++;
|
||||
}
|
||||
if (fromVersion != CURRENT_SETTINGS_VERSION) {
|
||||
throw new JadxRuntimeException("Incorrect settings upgrade");
|
||||
}
|
||||
|
||||
@@ -745,7 +745,7 @@ public class MainWindow extends JFrame {
|
||||
return null;
|
||||
}
|
||||
|
||||
private void syncWithEditor() {
|
||||
public void syncWithEditor() {
|
||||
ContentPanel selectedContentPanel = tabbedPane.getSelectedCodePanel();
|
||||
if (selectedContentPanel == null) {
|
||||
return;
|
||||
@@ -861,6 +861,12 @@ public class MainWindow extends JFrame {
|
||||
heapUsageBar.setVisible(settings.isShowHeapUsageBar());
|
||||
});
|
||||
|
||||
JCheckBoxMenuItem alwaysSelectOpened = new JCheckBoxMenuItem(NLS.str("menu.alwaysSelectOpened"));
|
||||
alwaysSelectOpened.setState(settings.isAlwaysSelectOpened());
|
||||
alwaysSelectOpened.addActionListener(event -> {
|
||||
settings.setAlwaysSelectOpened(!settings.isAlwaysSelectOpened());
|
||||
});
|
||||
|
||||
Action syncAction = new AbstractAction(NLS.str("menu.sync"), ICON_SYNC) {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
@@ -999,6 +1005,7 @@ public class MainWindow extends JFrame {
|
||||
view.add(flatPkgMenuItem);
|
||||
view.add(syncAction);
|
||||
view.add(heapUsageBarMenuItem);
|
||||
view.add(alwaysSelectOpened);
|
||||
|
||||
JMenu nav = new JMenu(NLS.str("menu.navigation"));
|
||||
nav.setMnemonic(KeyEvent.VK_N);
|
||||
|
||||
@@ -51,9 +51,8 @@ public class TabComponent extends JPanel {
|
||||
}
|
||||
|
||||
private void init() {
|
||||
JPanel panel = this;
|
||||
panel.setLayout(new FlowLayout(FlowLayout.CENTER, 3, 0));
|
||||
panel.setOpaque(false);
|
||||
setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
|
||||
setOpaque(false);
|
||||
|
||||
JNode node = contentPanel.getNode();
|
||||
String tabTitle;
|
||||
@@ -93,18 +92,18 @@ public class TabComponent extends JPanel {
|
||||
menu.show(e.getComponent(), e.getX(), e.getY());
|
||||
} else if (SwingUtilities.isLeftMouseButton(e)) {
|
||||
if (tabbedPane.getSelectedComponent() != contentPanel) {
|
||||
tabbedPane.setSelectedComponent(contentPanel);
|
||||
tabbedPane.selectTab(contentPanel);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
panel.addMouseListener(clickAdapter);
|
||||
addMouseListener(clickAdapter);
|
||||
label.addMouseListener(clickAdapter);
|
||||
closeBtn.addMouseListener(clickAdapter);
|
||||
|
||||
panel.add(label);
|
||||
panel.add(closeBtn);
|
||||
panel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
|
||||
add(label);
|
||||
add(closeBtn);
|
||||
setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
|
||||
}
|
||||
|
||||
private JPopupMenu createTabPopupMenu(final ContentPanel contentPanel) {
|
||||
|
||||
@@ -100,7 +100,7 @@ public class TabbedPane extends JTabbedPane {
|
||||
}
|
||||
}
|
||||
if (doSwitch) {
|
||||
setSelectedComponent(lastTab);
|
||||
selectTab(lastTab);
|
||||
}
|
||||
}
|
||||
} else if (consume && (e.getModifiersEx() & ctrlDown) == 0) {
|
||||
@@ -168,7 +168,7 @@ public class TabbedPane extends JTabbedPane {
|
||||
return;
|
||||
}
|
||||
SwingUtilities.invokeLater(() -> {
|
||||
setSelectedComponent(contentPanel);
|
||||
selectTab(contentPanel);
|
||||
AbstractCodeArea codeArea = contentPanel.getCodeArea();
|
||||
int pos = jumpPos.getPos();
|
||||
if (pos > 0) {
|
||||
@@ -206,7 +206,14 @@ public class TabbedPane extends JTabbedPane {
|
||||
if (contentPanel == null) {
|
||||
return;
|
||||
}
|
||||
SwingUtilities.invokeLater(() -> setSelectedComponent(contentPanel));
|
||||
SwingUtilities.invokeLater(() -> selectTab(contentPanel));
|
||||
}
|
||||
|
||||
public void selectTab(ContentPanel contentPanel) {
|
||||
setSelectedComponent(contentPanel);
|
||||
if (mainWindow.getSettings().isAlwaysSelectOpened()) {
|
||||
mainWindow.syncWithEditor();
|
||||
}
|
||||
}
|
||||
|
||||
public void codeJump(JNode node) {
|
||||
@@ -231,7 +238,7 @@ public class TabbedPane extends JTabbedPane {
|
||||
throw new JadxRuntimeException("Failed to open panel for JClass: " + cls);
|
||||
}
|
||||
} else {
|
||||
setSelectedComponent(panel);
|
||||
selectTab(panel);
|
||||
}
|
||||
ClassCodeContentPanel codePane = ((ClassCodeContentPanel) panel);
|
||||
codePane.showSmaliPane();
|
||||
|
||||
@@ -8,6 +8,7 @@ menu.preferences=Präferenzen
|
||||
menu.sync=Mit Editor synchronisieren
|
||||
menu.flatten=Codepaket erweitern
|
||||
menu.heapUsageBar=Speicherverbrauchsleiste anzeigen
|
||||
#menu.alwaysSelectOpened=Always Select Opened File/Class
|
||||
menu.navigation=Navigation
|
||||
menu.text_search=Textsuche
|
||||
menu.class_search=Klassen-Suche
|
||||
|
||||
@@ -8,6 +8,7 @@ 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.navigation=Navigation
|
||||
menu.text_search=Text search
|
||||
menu.class_search=Class search
|
||||
|
||||
@@ -8,6 +8,7 @@ menu.preferences=Preferencias
|
||||
menu.sync=Sincronizar con el editor
|
||||
menu.flatten=Mostrar paquetes en vista plana
|
||||
#menu.heapUsageBar=
|
||||
#menu.alwaysSelectOpened=Always Select Opened File/Class
|
||||
menu.navigation=Navegación
|
||||
menu.text_search=Buscar texto
|
||||
menu.class_search=Buscar clase
|
||||
|
||||
@@ -8,6 +8,7 @@ menu.preferences=설정
|
||||
menu.sync=에디터와 동기화
|
||||
menu.flatten=플랫 패키지 표시
|
||||
menu.heapUsageBar=메모리 사용량 표시
|
||||
#menu.alwaysSelectOpened=Always Select Opened File/Class
|
||||
menu.navigation=네비게이션
|
||||
menu.text_search=텍스트 검색
|
||||
menu.class_search=클래스 검색
|
||||
|
||||
@@ -8,6 +8,7 @@ menu.preferences=首选项
|
||||
menu.sync=与编辑器同步
|
||||
menu.flatten=展开显示代码包
|
||||
menu.heapUsageBar=显示内存使用栏
|
||||
#menu.alwaysSelectOpened=Always Select Opened File/Class
|
||||
menu.navigation=导航
|
||||
menu.text_search=搜索文本
|
||||
menu.class_search=搜索类
|
||||
|
||||
Reference in New Issue
Block a user