From 718caf8cb181595751c5d3af773c374310d4e7db Mon Sep 17 00:00:00 2001 From: Jan Peter Stotz Date: Sun, 16 Aug 2020 13:05:49 +0200 Subject: [PATCH] chore (gui): Add button in preferences dialog to copy the preference values in text form (json) to clipboard --- .../gui/settings/JadxSettingsAdapter.java | 5 ++++ .../jadx/gui/settings/JadxSettingsWindow.java | 26 +++++++++++++++++++ .../resources/i18n/Messages_en_US.properties | 2 ++ 3 files changed, 33 insertions(+) diff --git a/jadx-gui/src/main/java/jadx/gui/settings/JadxSettingsAdapter.java b/jadx-gui/src/main/java/jadx/gui/settings/JadxSettingsAdapter.java index 8f1811a66..b861bb00d 100644 --- a/jadx-gui/src/main/java/jadx/gui/settings/JadxSettingsAdapter.java +++ b/jadx-gui/src/main/java/jadx/gui/settings/JadxSettingsAdapter.java @@ -17,6 +17,7 @@ import com.google.gson.FieldAttributes; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.InstanceCreator; +import com.google.gson.JsonObject; import jadx.gui.JadxGUI; import jadx.gui.utils.PathTypeAdapter; @@ -92,6 +93,10 @@ public class JadxSettingsAdapter { return GSON.toJson(settings); } + public static JsonObject makeJsonObject(JadxSettings settings) { + return GSON.toJsonTree(settings).getAsJsonObject(); + } + public static void fill(JadxSettings settings, String jsonStr) { populate(GSON_BUILDER, jsonStr, JadxSettings.class, settings); } diff --git a/jadx-gui/src/main/java/jadx/gui/settings/JadxSettingsWindow.java b/jadx-gui/src/main/java/jadx/gui/settings/JadxSettingsWindow.java index c28b0555d..66a366d9b 100644 --- a/jadx-gui/src/main/java/jadx/gui/settings/JadxSettingsWindow.java +++ b/jadx-gui/src/main/java/jadx/gui/settings/JadxSettingsWindow.java @@ -1,6 +1,8 @@ package jadx.gui.settings; import java.awt.*; +import java.awt.datatransfer.Clipboard; +import java.awt.datatransfer.StringSelection; import java.awt.event.ActionEvent; import java.awt.event.ItemEvent; import java.awt.event.MouseAdapter; @@ -13,6 +15,9 @@ import javax.swing.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonObject; + import say.swing.JFontChooser; import jadx.api.JadxArgs; @@ -113,10 +118,31 @@ public class JadxSettingsWindow extends JDialog { } }); + JButton copyBtn = new JButton(NLS.str("preferences.copy")); + copyBtn.addActionListener(event -> { + + JsonObject settingsJson = JadxSettingsAdapter.makeJsonObject(this.settings); + // remove irrelevant preferences + settingsJson.remove("windowPos"); + settingsJson.remove("mainWindowExtendedState"); + settingsJson.remove("lastSaveProjectPath"); + settingsJson.remove("lastOpenFilePath"); + settingsJson.remove("lastSaveFilePath"); + settingsJson.remove("recentProjects"); + String settingsText = new GsonBuilder().setPrettyPrinting().create().toJson(settingsJson); + Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); + StringSelection selection = new StringSelection(settingsText); + clipboard.setContents(selection, selection); + JOptionPane.showMessageDialog( + JadxSettingsWindow.this, + NLS.str("preferences.copy_message")); + }); + JPanel buttonPane = new JPanel(); buttonPane.setLayout(new BoxLayout(buttonPane, BoxLayout.LINE_AXIS)); buttonPane.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); buttonPane.add(resetBtn); + buttonPane.add(copyBtn); buttonPane.add(Box.createHorizontalGlue()); buttonPane.add(saveBtn); buttonPane.add(Box.createRigidArea(new Dimension(10, 0))); 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 7aa16f5e1..dad659340 100644 --- a/jadx-gui/src/main/resources/i18n/Messages_en_US.properties +++ b/jadx-gui/src/main/resources/i18n/Messages_en_US.properties @@ -124,6 +124,8 @@ preferences.cancel=Cancel preferences.reset=Reset preferences.reset_message=Reset settings to default values? preferences.reset_title=Reset settings +preferences.copy=Copy to clipboard +preferences.copy_message=All settings values has been copied to clipboard preferences.rename=Rename preferences.rename_case=System case sensitivity preferences.rename_valid=To be valid identifier