From 018ff98df7853c0cc680e8521e671ef1ce411f2b Mon Sep 17 00:00:00 2001 From: Emiel Matthys Date: Thu, 15 Feb 2024 19:00:37 +0100 Subject: [PATCH] feat(gui): remember save preference decision (PR #2103) * First version * Use dropdown * Spotless * Language strings and tests * Comment out translated versions * Remove more translations --------- Co-authored-by: Emiel Matthys --- .../java/jadx/gui/settings/JadxProject.java | 2 +- .../java/jadx/gui/settings/JadxSettings.java | 25 +++++++++------ .../gui/settings/ui/JadxSettingsWindow.java | 11 ++++--- .../src/main/java/jadx/gui/ui/MainWindow.java | 31 ++++++++++++++++++- .../resources/i18n/Messages_de_DE.properties | 3 +- .../resources/i18n/Messages_en_US.properties | 3 +- .../resources/i18n/Messages_es_ES.properties | 3 +- .../resources/i18n/Messages_id_ID.properties | 3 +- .../resources/i18n/Messages_ko_KR.properties | 3 +- .../resources/i18n/Messages_pt_BR.properties | 3 +- .../resources/i18n/Messages_ru_RU.properties | 3 +- .../resources/i18n/Messages_zh_CN.properties | 3 +- .../resources/i18n/Messages_zh_TW.properties | 3 +- 13 files changed, 72 insertions(+), 24 deletions(-) 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 89a1987c9..15aac3089 100644 --- a/jadx-gui/src/main/java/jadx/gui/settings/JadxProject.java +++ b/jadx-gui/src/main/java/jadx/gui/settings/JadxProject.java @@ -258,7 +258,7 @@ public class JadxProject { private void changed() { JadxSettings settings = mainWindow.getSettings(); - if (settings != null && settings.isAutoSaveProject()) { + if (settings != null && settings.getSaveOption() == JadxSettings.SAVEOPTION.ALWAYS) { save(); } else { saved = false; diff --git a/jadx-gui/src/main/java/jadx/gui/settings/JadxSettings.java b/jadx-gui/src/main/java/jadx/gui/settings/JadxSettings.java index 723ae1dd6..8b0965916 100644 --- a/jadx-gui/src/main/java/jadx/gui/settings/JadxSettings.java +++ b/jadx-gui/src/main/java/jadx/gui/settings/JadxSettings.java @@ -75,7 +75,22 @@ public class JadxSettings extends JadxCLIArgs { private LangLocale langLocale = NLS.defaultLocale(); private boolean autoStartJobs = false; private String excludedPackages = ""; - private boolean autoSaveProject = true; + private SAVEOPTION saveOption = SAVEOPTION.ASK; + + public enum SAVEOPTION { + ASK, + NEVER, + ALWAYS + } + + public SAVEOPTION getSaveOption() { + return saveOption; + } + + public void setSaveOption(SAVEOPTION saveOption) { + this.saveOption = saveOption; + } + private Map shortcuts = new HashMap<>(); @JadxSettingsAdapter.GsonExclude @@ -447,14 +462,6 @@ public class JadxSettings extends JadxCLIArgs { this.autoStartJobs = autoStartJobs; } - public boolean isAutoSaveProject() { - return autoSaveProject; - } - - public void setAutoSaveProject(boolean autoSaveProject) { - this.autoSaveProject = autoSaveProject; - } - public ShortcutsWrapper getShortcuts() { if (shortcutsWrapper == null) { shortcutsWrapper = new ShortcutsWrapper(); diff --git a/jadx-gui/src/main/java/jadx/gui/settings/ui/JadxSettingsWindow.java b/jadx-gui/src/main/java/jadx/gui/settings/ui/JadxSettingsWindow.java index e7631aab7..7d51f3014 100644 --- a/jadx-gui/src/main/java/jadx/gui/settings/ui/JadxSettingsWindow.java +++ b/jadx-gui/src/main/java/jadx/gui/settings/ui/JadxSettingsWindow.java @@ -310,12 +310,15 @@ public class JadxSettingsWindow extends JDialog { } private SettingsGroup makeProjectGroup() { - JCheckBox autoSave = new JCheckBox(); - autoSave.setSelected(settings.isAutoSaveProject()); - autoSave.addItemListener(e -> settings.setAutoSaveProject(e.getStateChange() == ItemEvent.SELECTED)); + JComboBox dropdown = new JComboBox<>(JadxSettings.SAVEOPTION.values()); + dropdown.setSelectedItem(settings.getSaveOption()); + dropdown.addActionListener(e -> { + settings.setSaveOption((JadxSettings.SAVEOPTION) dropdown.getSelectedItem()); + needReload(); + }); SettingsGroup group = new SettingsGroup(NLS.str("preferences.project")); - group.addRow(NLS.str("preferences.autoSave"), autoSave); + group.addRow(NLS.str("preferences.saveOption"), dropdown); return group; } 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 1e084c031..87961a228 100644 --- a/jadx-gui/src/main/java/jadx/gui/ui/MainWindow.java +++ b/jadx-gui/src/main/java/jadx/gui/ui/MainWindow.java @@ -41,10 +41,12 @@ import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.Box; import javax.swing.ImageIcon; +import javax.swing.JCheckBox; import javax.swing.JCheckBoxMenuItem; import javax.swing.JDialog; import javax.swing.JFileChooser; import javax.swing.JFrame; +import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JOptionPane; import javax.swing.JPanel; @@ -627,16 +629,43 @@ public class MainWindow extends JFrame { private boolean ensureProjectIsSaved() { if (!project.isSaved() && !project.isInitial()) { + // Check if we saved settings that indicate what to do + + if (settings.getSaveOption() == JadxSettings.SAVEOPTION.NEVER) { + return true; + } + + if (settings.getSaveOption() == JadxSettings.SAVEOPTION.ALWAYS) { + saveProject(); + return true; + } + + JCheckBox remember = new JCheckBox(NLS.str("confirm.remember")); + JLabel message = new JLabel(NLS.str("confirm.not_saved_message")); + + JPanel inner = new JPanel(new BorderLayout()); + inner.add(remember, BorderLayout.SOUTH); + inner.add(message, BorderLayout.NORTH); + int res = JOptionPane.showConfirmDialog( this, - NLS.str("confirm.not_saved_message"), + inner, NLS.str("confirm.not_saved_title"), JOptionPane.YES_NO_CANCEL_OPTION); if (res == JOptionPane.CANCEL_OPTION) { return false; } if (res == JOptionPane.YES_OPTION) { + if (remember.isSelected()) { + settings.setSaveOption(JadxSettings.SAVEOPTION.ALWAYS); + settings.sync(); + } saveProject(); + } else if (res == JOptionPane.NO_OPTION) { + if (remember.isSelected()) { + settings.setSaveOption(JadxSettings.SAVEOPTION.NEVER); + settings.sync(); + } } } return true; diff --git a/jadx-gui/src/main/resources/i18n/Messages_de_DE.properties b/jadx-gui/src/main/resources/i18n/Messages_de_DE.properties index 6beca6d05..251aae0e8 100644 --- a/jadx-gui/src/main/resources/i18n/Messages_de_DE.properties +++ b/jadx-gui/src/main/resources/i18n/Messages_de_DE.properties @@ -195,7 +195,7 @@ preferences.fsCaseSensitive=Dateisystem unterscheidet zwischen Groß/Kleinschrei preferences.skipResourcesDecode=Keine Ressourcen dekodieren preferences.useKotlinMethodsForVarNames=Kotlin-Methoden für die Umbenennung von Variablen verwenden preferences.commentsLevel=Level der Code Kommentierungen -preferences.autoSave=Autom. speichern +#preferences.saveOption=Auto-save settings preferences.threads=Verarbeitungs-Thread-Anzahl preferences.excludedPackages=Ausgeschlossene Pakete preferences.excludedPackages.tooltip=Liste der durch Leerzeichen getrennten Paketnamen, die nicht dekompiliert oder indiziert werden (spart RAM) @@ -320,6 +320,7 @@ confirm.save_as_title=Speichern unter bestätigen confirm.save_as_message=%s existiert bereits.\nErsetzen? confirm.not_saved_title=Projekt speichern confirm.not_saved_message=Das aktuelle Projekt speichern, bevor Sie fortfahren? +#confirm.remember=Remember my decision certificate.cert_type=Type certificate.serialSigVer=Version diff --git a/jadx-gui/src/main/resources/i18n/Messages_en_US.properties b/jadx-gui/src/main/resources/i18n/Messages_en_US.properties index f1aea4600..773e2930f 100644 --- a/jadx-gui/src/main/resources/i18n/Messages_en_US.properties +++ b/jadx-gui/src/main/resources/i18n/Messages_en_US.properties @@ -195,7 +195,7 @@ preferences.fsCaseSensitive=File system is case-sensitive preferences.skipResourcesDecode=Don't decode resources preferences.useKotlinMethodsForVarNames=Use kotlin methods for variables rename preferences.commentsLevel=Code comments level -preferences.autoSave=Auto save +preferences.saveOption=Auto-save settings preferences.threads=Processing threads count preferences.excludedPackages=Excluded packages preferences.excludedPackages.tooltip=List of space separated package names that will not be decompiled or indexed (saves RAM) @@ -320,6 +320,7 @@ confirm.save_as_title=Confirm Save as confirm.save_as_message=%s already exists.\nDo you want to replace it? confirm.not_saved_title=Save project confirm.not_saved_message=Save the current project before proceeding? +confirm.remember=Remember my decision certificate.cert_type=Type certificate.serialSigVer=Version diff --git a/jadx-gui/src/main/resources/i18n/Messages_es_ES.properties b/jadx-gui/src/main/resources/i18n/Messages_es_ES.properties index 0e1b39c5f..5d964d1ef 100644 --- a/jadx-gui/src/main/resources/i18n/Messages_es_ES.properties +++ b/jadx-gui/src/main/resources/i18n/Messages_es_ES.properties @@ -195,7 +195,7 @@ preferences.replaceConsts=Reemplazar constantes preferences.skipResourcesDecode=No descodificar recursos #preferences.useKotlinMethodsForVarNames=Use kotlin methods for variables rename #preferences.commentsLevel=Code comments level -#preferences.autoSave= +#preferences.saveOption=Auto-save settings preferences.threads=Número de hilos a procesar #preferences.excludedPackages= #preferences.excludedPackages.tooltip= @@ -320,6 +320,7 @@ popup.rename=Nimeta ümber #confirm.save_as_message= #confirm.not_saved_title= #confirm.not_saved_message= +#confirm.remember= certificate.cert_type=Tipo certificate.serialSigVer=Versión diff --git a/jadx-gui/src/main/resources/i18n/Messages_id_ID.properties b/jadx-gui/src/main/resources/i18n/Messages_id_ID.properties index 1b0633995..5cb5fed77 100644 --- a/jadx-gui/src/main/resources/i18n/Messages_id_ID.properties +++ b/jadx-gui/src/main/resources/i18n/Messages_id_ID.properties @@ -195,7 +195,7 @@ preferences.fsCaseSensitive=File sistem bersifat sensitif huruf besar-kecil preferences.skipResourcesDecode=Jangan dekode sumber daya preferences.useKotlinMethodsForVarNames=Gunakan metode Kotlin untuk mengganti nama variabel preferences.commentsLevel=Tingkat komentar kode -preferences.autoSave=Simpan otomatis +#preferences.saveOption=Auto-save settings preferences.threads=Jumlah utas pemrosesan preferences.excludedPackages=Package yang dikecualikan preferences.excludedPackages.tooltip=Daftar nama paket yang dipisahkan spasi yang tidak akan di deskompilasi atau diindeks (menghemat RAM) @@ -320,6 +320,7 @@ confirm.save_as_title=Konfirmasi Simpan Sebagai confirm.save_as_message=%s sudah ada.\nApakah Anda ingin menggantinya? confirm.not_saved_title=Simpan proyek confirm.not_saved_message=Simpan proyek saat ini sebelum melanjutkan? +#confirm.remember=Remember my decision certificate.cert_type=Tipe certificate.serialSigVer=Versi Tanda Tangan diff --git a/jadx-gui/src/main/resources/i18n/Messages_ko_KR.properties b/jadx-gui/src/main/resources/i18n/Messages_ko_KR.properties index f5e835c09..baaf8c2f2 100644 --- a/jadx-gui/src/main/resources/i18n/Messages_ko_KR.properties +++ b/jadx-gui/src/main/resources/i18n/Messages_ko_KR.properties @@ -195,7 +195,7 @@ preferences.fsCaseSensitive=파일 시스템 대소문자 구별 preferences.skipResourcesDecode=리소스 디코딩 하지 않기 preferences.useKotlinMethodsForVarNames=변수 이름 바꾸기에 kotlin 메서드 사용 preferences.commentsLevel=코드 주석 수준 -preferences.autoSave=자동 저장 +#preferences.saveOption=Auto-save settings preferences.threads=처리 스레드 수 preferences.excludedPackages=제외할 패키지 preferences.excludedPackages.tooltip=RAM 절약을 위해 디컴파일되거나 인덱싱하지 않을 패키지 이름 목록 (공백으로 항목 구분) @@ -320,6 +320,7 @@ confirm.save_as_title=다른 이름으로 저장 확인 confirm.save_as_message=%s이(가) 이미 있습니다.\n바꾸시겠습니까? confirm.not_saved_title=프로젝트 저장 confirm.not_saved_message=계속하기 전에 현재 프로젝트를 저장 하시겠습니까? +#confirm.remember=Remember my decision certificate.cert_type=유형 certificate.serialSigVer=버전 diff --git a/jadx-gui/src/main/resources/i18n/Messages_pt_BR.properties b/jadx-gui/src/main/resources/i18n/Messages_pt_BR.properties index c0aa1a98c..b38a19bde 100644 --- a/jadx-gui/src/main/resources/i18n/Messages_pt_BR.properties +++ b/jadx-gui/src/main/resources/i18n/Messages_pt_BR.properties @@ -195,7 +195,7 @@ preferences.fsCaseSensitive=Sistema de arquivo diferencia maiúsculas de minúsc preferences.skipResourcesDecode=Não decodificar recursos preferences.useKotlinMethodsForVarNames=Usar métodos do kotlin para renomear variáveis preferences.commentsLevel=Nível de comentários do código -preferences.autoSave=Salvar automaticamente +#preferences.saveOption=Auto-save settings preferences.threads=Número de threads no processo preferences.excludedPackages=Pacotes ignorados preferences.excludedPackages.tooltip=Lista espaço de pacotes que não vão ser descompilados ou indexados (economiza RAM) @@ -320,6 +320,7 @@ confirm.save_as_title=Confirmar operação confirm.save_as_message=%s Já existe.\nVocê deseja substituir? confirm.not_saved_title=Salvar projeto confirm.not_saved_message=Salvar projeto atual antes de continuar? +#confirm.remember=Remember my decision certificate.cert_type=Tipo certificate.serialSigVer=Versão diff --git a/jadx-gui/src/main/resources/i18n/Messages_ru_RU.properties b/jadx-gui/src/main/resources/i18n/Messages_ru_RU.properties index d61080ab9..fb3be97c8 100644 --- a/jadx-gui/src/main/resources/i18n/Messages_ru_RU.properties +++ b/jadx-gui/src/main/resources/i18n/Messages_ru_RU.properties @@ -195,7 +195,7 @@ preferences.fsCaseSensitive=Учитывать регистр в файлово preferences.skipResourcesDecode=Не декодировать ресурсы preferences.useKotlinMethodsForVarNames=Kotlin методы как имена полей preferences.commentsLevel=Уровень лога операций -preferences.autoSave=Автосохранение +#preferences.saveOption=Auto-save settings preferences.threads=Количество используемых потоков preferences.excludedPackages=Исключенные пакеты preferences.excludedPackages.tooltip=Список пакетов, которые не будут декомпилироваться и индексироваться (экономит ОЗУ) @@ -320,6 +320,7 @@ confirm.save_as_title=Подтверджение сохранения confirm.save_as_message=%s уже существует.\nВы хотите его перезаписать? confirm.not_saved_title=Сохранить проект confirm.not_saved_message=Сохранить текущий проект перед выходом? +#confirm.remember=Remember my decision certificate.cert_type=Type certificate.serialSigVer=Version diff --git a/jadx-gui/src/main/resources/i18n/Messages_zh_CN.properties b/jadx-gui/src/main/resources/i18n/Messages_zh_CN.properties index ac62423c6..977d66b54 100644 --- a/jadx-gui/src/main/resources/i18n/Messages_zh_CN.properties +++ b/jadx-gui/src/main/resources/i18n/Messages_zh_CN.properties @@ -195,7 +195,7 @@ preferences.fsCaseSensitive=文件系统区分大小写 preferences.skipResourcesDecode=不反编译资源文件 preferences.useKotlinMethodsForVarNames=使用Kotlin方法来重命名变量 preferences.commentsLevel=代码注释等级 -preferences.autoSave=自动保存 +#preferences.saveOption=Auto-save settings preferences.threads=并行线程数 preferences.excludedPackages=排除的包 preferences.excludedPackages.tooltip=排除于反编译或索引的以空格分隔的包名列表(节省 RAM) @@ -320,6 +320,7 @@ confirm.save_as_title=确认另存为 confirm.save_as_message=%s 已存在。\n你想替换它吗? confirm.not_saved_title=保存项目 confirm.not_saved_message=在继续之前保存当前项目? +#confirm.remember=Remember my decision certificate.cert_type=类型 certificate.serialSigVer=版本 diff --git a/jadx-gui/src/main/resources/i18n/Messages_zh_TW.properties b/jadx-gui/src/main/resources/i18n/Messages_zh_TW.properties index 3149880e7..4b4c53b71 100644 --- a/jadx-gui/src/main/resources/i18n/Messages_zh_TW.properties +++ b/jadx-gui/src/main/resources/i18n/Messages_zh_TW.properties @@ -195,7 +195,7 @@ preferences.fsCaseSensitive=檔案系統區分大小寫 preferences.skipResourcesDecode=不要為資源解碼 preferences.useKotlinMethodsForVarNames=使用 Kotlin 方法來為變數重新命名 preferences.commentsLevel=程式碼註解層級 -preferences.autoSave=自動儲存 +#preferences.saveOption=Auto-save settings preferences.threads=執行緒數 preferences.excludedPackages=被排除的套件 preferences.excludedPackages.tooltip=排除於索引或反編譯外的套件列表 (以空格分隔) (節省 RAM) @@ -320,6 +320,7 @@ confirm.save_as_title=確認另存為 confirm.save_as_message=%s 已存在。\n您要覆寫它嗎? confirm.not_saved_title=儲存專案 confirm.not_saved_message=在繼續進行前要先儲存目前專案嗎? +#confirm.remember=Remember my decision certificate.cert_type=類型 certificate.serialSigVer=版本