From 127f0ecf3f55ca15057a4b9ca0490b2c8ee80786 Mon Sep 17 00:00:00 2001 From: Skylot Date: Tue, 16 Aug 2022 21:28:57 +0100 Subject: [PATCH] fix(gui): disable actions if files not loaded (#1644) --- .../src/main/java/jadx/gui/ui/MainWindow.java | 37 ++++++++++++++++++- .../jadx/gui/ui/codearea/FindUsageAction.java | 11 +++++- .../java/jadx/gui/ui/dialog/SearchDialog.java | 15 +++++++- .../java/jadx/gui/utils/ILoadListener.java | 11 ++++++ 4 files changed, 70 insertions(+), 4 deletions(-) create mode 100644 jadx-gui/src/main/java/jadx/gui/utils/ILoadListener.java 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 a0eb2eb09..30db8e4ae 100644 --- a/jadx-gui/src/main/java/jadx/gui/ui/MainWindow.java +++ b/jadx-gui/src/main/java/jadx/gui/ui/MainWindow.java @@ -132,6 +132,7 @@ import jadx.gui.update.JadxUpdate.IUpdateCallback; import jadx.gui.update.data.Release; import jadx.gui.utils.CacheObject; 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; @@ -211,6 +212,9 @@ public class MainWindow extends JFrame { private JDebuggerPanel debuggerPanel; private JSplitPane verticalSplitter; + private List loadListeners = new ArrayList<>(); + private boolean loaded; + public MainWindow(JadxSettings settings) { this.settings = settings; this.cacheObject = new CacheObject(); @@ -488,6 +492,7 @@ public class MainWindow extends JFrame { } private void closeAll() { + notifyLoadListeners(false); cancelBackgroundJobs(); clearTree(); resetCache(); @@ -526,7 +531,10 @@ public class MainWindow extends JFrame { backgroundExecutor.execute(NLS.str("progress.load"), this::restoreOpenTabs, - status -> runInitialBackgroundJobs()); + status -> { + runInitialBackgroundJobs(); + notifyLoadListeners(true); + }); } public void updateLiveReload(boolean state) { @@ -1210,6 +1218,22 @@ public class MainWindow extends JFrame { toolbar.add(updateLink); mainPanel.add(toolbar, BorderLayout.NORTH); + + addLoadListener(loaded -> { + textSearchAction.setEnabled(loaded); + clsSearchAction.setEnabled(loaded); + commentSearchAction.setEnabled(loaded); + backAction.setEnabled(loaded); + forwardAction.setEnabled(loaded); + syncAction.setEnabled(loaded); + saveAllAction.setEnabled(loaded); + exportAction.setEnabled(loaded); + saveProjectAsAction.setEnabled(loaded); + reload.setEnabled(loaded); + deobfAction.setEnabled(loaded); + quarkAction.setEnabled(loaded); + return false; + }); } private void initUI() { @@ -1499,6 +1523,17 @@ public class MainWindow extends JFrame { settings.setDebuggerVarTreeSplitterLoc(debuggerPanel.getRightSplitterLocation()); } + public void addLoadListener(ILoadListener loadListener) { + this.loadListeners.add(loadListener); + // set initial value + loadListener.update(loaded); + } + + public void notifyLoadListeners(boolean loaded) { + this.loaded = loaded; + loadListeners.removeIf(listener -> listener.update(loaded)); + } + public JadxWrapper getWrapper() { return wrapper; } diff --git a/jadx-gui/src/main/java/jadx/gui/ui/codearea/FindUsageAction.java b/jadx-gui/src/main/java/jadx/gui/ui/codearea/FindUsageAction.java index 7a13b24f4..acc7dba55 100644 --- a/jadx-gui/src/main/java/jadx/gui/ui/codearea/FindUsageAction.java +++ b/jadx-gui/src/main/java/jadx/gui/ui/codearea/FindUsageAction.java @@ -3,6 +3,7 @@ package jadx.gui.ui.codearea; import java.awt.event.KeyEvent; import jadx.gui.treemodel.JNode; +import jadx.gui.ui.MainWindow; import jadx.gui.ui.dialog.UsageDialog; import jadx.gui.utils.NLS; @@ -18,7 +19,15 @@ public final class FindUsageAction extends JNodeAction { @Override public void runAction(JNode node) { - UsageDialog usageDialog = new UsageDialog(getCodeArea().getMainWindow(), node); + MainWindow mw = getCodeArea().getMainWindow(); + UsageDialog usageDialog = new UsageDialog(mw, node); + mw.addLoadListener(loaded -> { + if (!loaded) { + usageDialog.dispose(); + return true; + } + return false; + }); usageDialog.setVisible(true); } } diff --git a/jadx-gui/src/main/java/jadx/gui/ui/dialog/SearchDialog.java b/jadx-gui/src/main/java/jadx/gui/ui/dialog/SearchDialog.java index 5303020c1..be0bd6ce6 100644 --- a/jadx-gui/src/main/java/jadx/gui/ui/dialog/SearchDialog.java +++ b/jadx-gui/src/main/java/jadx/gui/ui/dialog/SearchDialog.java @@ -81,17 +81,28 @@ public class SearchDialog extends CommonSearchDialog { public static void search(MainWindow window, SearchPreset preset) { SearchDialog searchDialog = new SearchDialog(window, preset, Collections.emptySet()); - searchDialog.setVisible(true); + show(searchDialog, window); } public static void searchInActiveTab(MainWindow window, SearchPreset preset) { SearchDialog searchDialog = new SearchDialog(window, preset, EnumSet.of(SearchOptions.ACTIVE_TAB)); - searchDialog.setVisible(true); + show(searchDialog, window); } public static void searchText(MainWindow window, String text) { SearchDialog searchDialog = new SearchDialog(window, SearchPreset.TEXT, Collections.emptySet()); searchDialog.initSearchText = text; + show(searchDialog, window); + } + + private static void show(SearchDialog searchDialog, MainWindow mw) { + mw.addLoadListener(loaded -> { + if (!loaded) { + searchDialog.dispose(); + return true; + } + return false; + }); searchDialog.setVisible(true); } diff --git a/jadx-gui/src/main/java/jadx/gui/utils/ILoadListener.java b/jadx-gui/src/main/java/jadx/gui/utils/ILoadListener.java new file mode 100644 index 000000000..630b89759 --- /dev/null +++ b/jadx-gui/src/main/java/jadx/gui/utils/ILoadListener.java @@ -0,0 +1,11 @@ +package jadx.gui.utils; + +public interface ILoadListener { + + /** + * Update files/project loaded state + * + * @return true to remove listener + */ + boolean update(boolean loaded); +}