From e5be41b9cc47e69f4826915bc2a686172c7b6558 Mon Sep 17 00:00:00 2001 From: Skylot <118523+skylot@users.noreply.github.com> Date: Tue, 22 Oct 2024 21:29:00 +0100 Subject: [PATCH] fix(gui): use another implementation for font dialog (#2310) --- jadx-gui/build.gradle.kts | 2 +- jadx-gui/libs/jfontchooser-1.0.5.jar | Bin 16703 -> 0 bytes .../settings/ui/JPreferredFontChooser.java | 52 ----------- .../gui/settings/ui/JadxSettingsWindow.java | 19 ++-- .../gui/settings/ui/font/FontChooserHack.java | 31 +++++++ .../gui/settings/ui/font/JadxFontDialog.java | 86 ++++++++++++++++++ 6 files changed, 125 insertions(+), 65 deletions(-) delete mode 100644 jadx-gui/libs/jfontchooser-1.0.5.jar delete mode 100644 jadx-gui/src/main/java/jadx/gui/settings/ui/JPreferredFontChooser.java create mode 100644 jadx-gui/src/main/java/jadx/gui/settings/ui/font/FontChooserHack.java create mode 100644 jadx-gui/src/main/java/jadx/gui/settings/ui/font/JadxFontDialog.java diff --git a/jadx-gui/build.gradle.kts b/jadx-gui/build.gradle.kts index eaeaa05df..5931e54b0 100644 --- a/jadx-gui/build.gradle.kts +++ b/jadx-gui/build.gradle.kts @@ -31,7 +31,7 @@ dependencies { implementation("io.github.oshai:kotlin-logging-jvm:7.0.0") implementation("com.fifesoft:rsyntaxtextarea:3.4.1") - implementation(files("libs/jfontchooser-1.0.5.jar")) + implementation("org.drjekyll:fontchooser:3.1.0") implementation("hu.kazocsaba:image-viewer:1.2.3") implementation("com.formdev:flatlaf:3.5.1") diff --git a/jadx-gui/libs/jfontchooser-1.0.5.jar b/jadx-gui/libs/jfontchooser-1.0.5.jar deleted file mode 100644 index 3a9779f592ddeed0e043f0aaa9e00e9eccddabfd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16703 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 fontSet = new HashSet<>(); - Collections.addAll(fontSet, env.getAvailableFontFamilyNames()); - List found = new ArrayList<>(PREFERRED_FONTS.length); - for (String font : PREFERRED_FONTS) { - if (fontSet.contains(font)) { - found.add(font); - } - } - if (found.size() == PREFERRED_FONTS.length) { - filteredFonts = PREFERRED_FONTS; - } else if (found.size() > 0) { - filteredFonts = new String[found.size()]; - for (int i = 0; i < found.size(); i++) { - filteredFonts[i] = found.get(i); - } - } else { - LOG.warn("Can't found any preferred fonts for smali, use all available."); - filteredFonts = env.getAvailableFontFamilyNames(); - } - } - return filteredFonts; - } -} 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 38928c683..96adbc040 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 @@ -44,8 +44,6 @@ import org.slf4j.LoggerFactory; import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; -import say.swing.JFontChooser; - import jadx.api.CommentsLevel; import jadx.api.DecompilationMode; import jadx.api.JadxArgs; @@ -63,6 +61,7 @@ import jadx.gui.settings.JadxUpdateChannel; import jadx.gui.settings.LineNumbersMode; import jadx.gui.settings.XposedCodegenLanguage; import jadx.gui.settings.ui.cache.CacheSettingsGroup; +import jadx.gui.settings.ui.font.JadxFontDialog; import jadx.gui.settings.ui.plugins.PluginSettings; import jadx.gui.settings.ui.shortcut.ShortcutsSettingsGroup; import jadx.gui.ui.MainWindow; @@ -371,11 +370,9 @@ public class JadxSettingsWindow extends JDialog { fontBtn.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { - JFontChooser fontChooser = new JFontChooser(); - fontChooser.setSelectedFont(settings.getFont()); - int result = fontChooser.showDialog(JadxSettingsWindow.this); - if (result == JFontChooser.OK_OPTION) { - Font font = fontChooser.getSelectedFont(); + Font font = new JadxFontDialog(JadxSettingsWindow.this, NLS.str("preferences.font")) + .select(settings.getFont(), false); + if (font != null) { LOG.debug("Selected Font: {}", font); settings.setFont(font); mainWindow.loadSettings(); @@ -387,11 +384,9 @@ public class JadxSettingsWindow extends JDialog { smaliFontBtn.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { - JFontChooser fontChooser = new JPreferredFontChooser(); - fontChooser.setSelectedFont(settings.getSmaliFont()); - int result = fontChooser.showDialog(JadxSettingsWindow.this); - if (result == JFontChooser.OK_OPTION) { - Font font = fontChooser.getSelectedFont(); + Font font = new JadxFontDialog(JadxSettingsWindow.this, NLS.str("preferences.smali_font")) + .select(settings.getSmaliFont(), true); + if (font != null) { LOG.debug("Selected Font: {} for smali", font); settings.setSmaliFont(font); mainWindow.loadSettings(); diff --git a/jadx-gui/src/main/java/jadx/gui/settings/ui/font/FontChooserHack.java b/jadx-gui/src/main/java/jadx/gui/settings/ui/font/FontChooserHack.java new file mode 100644 index 000000000..fd496104b --- /dev/null +++ b/jadx-gui/src/main/java/jadx/gui/settings/ui/font/FontChooserHack.java @@ -0,0 +1,31 @@ +package jadx.gui.settings.ui.font; + +import java.lang.reflect.Field; + +import javax.swing.JCheckBox; + +import org.drjekyll.fontchooser.FontChooser; +import org.drjekyll.fontchooser.panes.FamilyPane; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class FontChooserHack { + private static final Logger LOG = LoggerFactory.getLogger(FontChooserHack.class); + + public static void setOnlyMonospace(FontChooser fontChooser) { + try { + FamilyPane familyPane = (FamilyPane) getPrivateField(fontChooser, "familyPane"); + JCheckBox monospacedCheckBox = (JCheckBox) getPrivateField(familyPane, "monospacedCheckBox"); + monospacedCheckBox.setSelected(true); + monospacedCheckBox.setEnabled(false); + } catch (Throwable e) { + LOG.debug("Failed to set only monospace check box", e); + } + } + + private static Object getPrivateField(Object obj, String fieldName) throws NoSuchFieldException, IllegalAccessException { + Field f = obj.getClass().getDeclaredField(fieldName); + f.setAccessible(true); + return f.get(obj); + } +} diff --git a/jadx-gui/src/main/java/jadx/gui/settings/ui/font/JadxFontDialog.java b/jadx-gui/src/main/java/jadx/gui/settings/ui/font/JadxFontDialog.java new file mode 100644 index 000000000..207496549 --- /dev/null +++ b/jadx-gui/src/main/java/jadx/gui/settings/ui/font/JadxFontDialog.java @@ -0,0 +1,86 @@ +package jadx.gui.settings.ui.font; + +import java.awt.BorderLayout; +import java.awt.FlowLayout; +import java.awt.Font; + +import javax.swing.BorderFactory; +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JPanel; +import javax.swing.WindowConstants; + +import org.drjekyll.fontchooser.FontChooser; +import org.jetbrains.annotations.Nullable; + +import jadx.gui.settings.JadxSettings; +import jadx.gui.settings.ui.JadxSettingsWindow; +import jadx.gui.utils.NLS; + +public class JadxFontDialog extends JDialog { + private static final long serialVersionUID = 7609857698785777587L; + + private final FontChooser fontChooser = new FontChooser(); + private final JadxSettings settings; + private boolean selected = false; + + public JadxFontDialog(JadxSettingsWindow settingsWindow, String title) { + super(settingsWindow, title, true); + settings = settingsWindow.getMainWindow().getSettings(); + initComponents(); + setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + if (!settings.loadWindowPos(this)) { + pack(); + } + } + + public @Nullable Font select(Font currentFont, boolean onlyMonospace) { + fontChooser.setSelectedFont(currentFont); + if (onlyMonospace) { + FontChooserHack.setOnlyMonospace(fontChooser); + } + setVisible(true); + Font selectedFont = fontChooser.getSelectedFont(); + if (selected && !selectedFont.equals(currentFont)) { + return selectedFont; + } + return null; + } + + private void initComponents() { + JPanel chooserPanel = new JPanel(); + chooserPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 0, 10)); + chooserPanel.setLayout(new BorderLayout(0, 10)); + chooserPanel.add(fontChooser); + + JPanel controlPanel = new JPanel(); + controlPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); + controlPanel.setLayout(new FlowLayout(FlowLayout.TRAILING)); + + JButton okBtn = new JButton(); + okBtn.setText(NLS.str("common_dialog.ok")); + okBtn.setMnemonic('o'); + okBtn.addActionListener(event -> { + selected = true; + dispose(); + }); + + JButton cancelBtn = new JButton(); + cancelBtn.setText(NLS.str("common_dialog.cancel")); + cancelBtn.setMnemonic('c'); + cancelBtn.addActionListener(event -> dispose()); + + controlPanel.add(okBtn); + controlPanel.add(cancelBtn); + + add(chooserPanel); + add(controlPanel, BorderLayout.PAGE_END); + getRootPane().setDefaultButton(okBtn); + } + + @Override + public void dispose() { + settings.saveWindowPos(this); + super.dispose(); + } +}