From 9e75b56aa633b696dcce4478ddb4f1d9baf8c9a1 Mon Sep 17 00:00:00 2001 From: Yanis48 Date: Tue, 19 May 2020 08:19:07 +0200 Subject: QOL fixes - Volume 2 (#239) --- src/main/java/cuchaz/enigma/gui/Gui.java | 6 +- .../cuchaz/enigma/gui/dialog/ChangeDialog.java | 50 +++++++++ .../java/cuchaz/enigma/gui/dialog/StatsDialog.java | 82 ++++++++++++++ .../java/cuchaz/enigma/gui/elements/MenuBar.java | 123 +++++++-------------- 4 files changed, 177 insertions(+), 84 deletions(-) create mode 100644 src/main/java/cuchaz/enigma/gui/dialog/ChangeDialog.java create mode 100644 src/main/java/cuchaz/enigma/gui/dialog/StatsDialog.java (limited to 'src/main/java') diff --git a/src/main/java/cuchaz/enigma/gui/Gui.java b/src/main/java/cuchaz/enigma/gui/Gui.java index 3adabae..ed32469 100644 --- a/src/main/java/cuchaz/enigma/gui/Gui.java +++ b/src/main/java/cuchaz/enigma/gui/Gui.java @@ -941,18 +941,18 @@ public class Gui { public void moveClassTree(EntryReference, Entry> obfReference, boolean isOldOb, boolean isNewOb) { ClassEntry classEntry = obfReference.entry.getContainingClass(); - // Ob -> deob List stateDeobf = this.deobfPanel.deobfClasses.getExpansionState(this.deobfPanel.deobfClasses); List stateObf = this.obfPanel.obfClasses.getExpansionState(this.obfPanel.obfClasses); - if (isOldOb && !isNewOb) { + // Ob -> deob + if (!isNewOb) { this.deobfPanel.deobfClasses.moveClassIn(classEntry); this.obfPanel.obfClasses.moveClassOut(classEntry); this.deobfPanel.deobfClasses.reload(); this.obfPanel.obfClasses.reload(); } // Deob -> ob - else if (isNewOb && !isOldOb) { + else if (!isOldOb) { this.obfPanel.obfClasses.moveClassIn(classEntry); this.deobfPanel.deobfClasses.moveClassOut(classEntry); this.deobfPanel.deobfClasses.reload(); diff --git a/src/main/java/cuchaz/enigma/gui/dialog/ChangeDialog.java b/src/main/java/cuchaz/enigma/gui/dialog/ChangeDialog.java new file mode 100644 index 0000000..64219ab --- /dev/null +++ b/src/main/java/cuchaz/enigma/gui/dialog/ChangeDialog.java @@ -0,0 +1,50 @@ +package cuchaz.enigma.gui.dialog; + +import java.awt.BorderLayout; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; + +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JPanel; + +import cuchaz.enigma.gui.Gui; +import cuchaz.enigma.utils.I18n; + +public class ChangeDialog { + + public static void show(Gui gui) { + // init frame + JFrame frame = new JFrame(I18n.translate("menu.view.change.title")); + JPanel textPanel = new JPanel(); + JPanel buttonPanel = new JPanel(); + frame.setLayout(new BorderLayout()); + frame.add(BorderLayout.NORTH, textPanel); + frame.add(BorderLayout.SOUTH, buttonPanel); + + // show text + JLabel text = new JLabel((I18n.translate("menu.view.change.summary"))); + text.setHorizontalAlignment(JLabel.CENTER); + textPanel.add(text); + + // show ok button + JButton okButton = new JButton(I18n.translate("menu.view.change.ok")); + buttonPanel.add(okButton); + okButton.addActionListener(event -> frame.dispose()); + okButton.addKeyListener(new KeyAdapter() { + @Override + public void keyPressed(KeyEvent e) { + if (e.getKeyCode() == KeyEvent.VK_ESCAPE) { + frame.dispose(); + } + } + }); + + // show the frame + frame.pack(); + frame.setVisible(true); + frame.setResizable(false); + frame.setLocationRelativeTo(gui.getFrame()); + } +} diff --git a/src/main/java/cuchaz/enigma/gui/dialog/StatsDialog.java b/src/main/java/cuchaz/enigma/gui/dialog/StatsDialog.java new file mode 100644 index 0000000..868eba7 --- /dev/null +++ b/src/main/java/cuchaz/enigma/gui/dialog/StatsDialog.java @@ -0,0 +1,82 @@ +package cuchaz.enigma.gui.dialog; + +import java.awt.BorderLayout; +import java.util.Arrays; +import java.util.Locale; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JFrame; +import javax.swing.JPanel; + +import cuchaz.enigma.gui.Gui; +import cuchaz.enigma.gui.stats.StatsMember; +import cuchaz.enigma.gui.util.ScaleUtil; +import cuchaz.enigma.utils.I18n; + +public class StatsDialog { + + public static void show(Gui gui) { + // init frame + JFrame frame = new JFrame(I18n.translate("menu.file.stats.title")); + JPanel checkboxesPanel = new JPanel(); + JPanel buttonPanel = new JPanel(); + frame.setLayout(new BorderLayout()); + frame.add(BorderLayout.NORTH, checkboxesPanel); + frame.add(BorderLayout.SOUTH, buttonPanel); + + // show checkboxes + Map checkboxes = Arrays + .stream(StatsMember.values()) + .collect(Collectors.toMap(m -> m, m -> { + JCheckBox checkbox = new JCheckBox(I18n.translate("type." + m.name().toLowerCase(Locale.ROOT))); + checkboxesPanel.add(checkbox); + return checkbox; + })); + + // show generate button + JButton button = new JButton(I18n.translate("menu.file.stats.generate")); + buttonPanel.add(button); + button.setEnabled(false); + button.addActionListener(action -> { + frame.dispose(); + generateStats(gui, checkboxes); + }); + + // add action listener to each checkbox + checkboxes.entrySet().forEach(checkbox -> { + checkbox.getValue().addActionListener(action -> { + if (!button.isEnabled()) { + button.setEnabled(true); + } else if (checkboxes.entrySet().stream().allMatch(entry -> !entry.getValue().isSelected())) { + button.setEnabled(false); + } + }); + }); + + // show the frame + frame.pack(); + frame.setVisible(true); + frame.setSize(ScaleUtil.getDimension(500, 120)); + frame.setResizable(false); + frame.setLocationRelativeTo(gui.getFrame()); + } + + private static void generateStats(Gui gui, Map checkboxes) { + // get members from selected checkboxes + Set includedMembers = checkboxes + .entrySet() + .stream() + .filter(entry -> entry.getValue().isSelected()) + .map(Map.Entry::getKey) + .collect(Collectors.toSet()); + + // checks if a projet is open + if (gui.getController().project != null) { + gui.getController().openStats(includedMembers); + } + } +} diff --git a/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java b/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java index f8e4f7e..dc2cf8f 100644 --- a/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java +++ b/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java @@ -4,18 +4,16 @@ import cuchaz.enigma.config.Config; import cuchaz.enigma.config.Themes; import cuchaz.enigma.gui.Gui; import cuchaz.enigma.gui.dialog.AboutDialog; +import cuchaz.enigma.gui.dialog.ChangeDialog; import cuchaz.enigma.gui.dialog.ConnectToServerDialog; import cuchaz.enigma.gui.dialog.CreateServerDialog; -import cuchaz.enigma.gui.dialog.SearchDialog; -import cuchaz.enigma.gui.stats.StatsMember; +import cuchaz.enigma.gui.dialog.StatsDialog; import cuchaz.enigma.gui.util.ScaleUtil; import cuchaz.enigma.translation.mapping.serde.MappingFormat; import cuchaz.enigma.utils.I18n; import cuchaz.enigma.utils.Pair; -import java.awt.Container; import java.awt.Desktop; -import java.awt.FlowLayout; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import java.io.File; @@ -31,17 +29,6 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; import javax.swing.*; - -import javax.swing.*; - -import cuchaz.enigma.config.Config; -import cuchaz.enigma.config.Themes; -import cuchaz.enigma.gui.Gui; -import cuchaz.enigma.gui.dialog.AboutDialog; -import cuchaz.enigma.gui.stats.StatsMember; -import cuchaz.enigma.translation.mapping.serde.MappingFormat; -import cuchaz.enigma.utils.I18n; - public class MenuBar extends JMenuBar { public final JMenuItem closeJarMenu; @@ -185,42 +172,8 @@ public class MenuBar extends JMenuBar { menu.addSeparator(); { JMenuItem stats = new JMenuItem(I18n.translate("menu.file.stats")); - - stats.addActionListener(event -> { - JFrame frame = new JFrame(I18n.translate("menu.file.stats.title")); - Container pane = frame.getContentPane(); - pane.setLayout(new FlowLayout()); - - Map checkboxes = Arrays - .stream(StatsMember.values()) - .collect(Collectors.toMap(m -> m, m -> { - JCheckBox checkbox = new JCheckBox(I18n.translate("type." + m.name().toLowerCase(Locale.ROOT))); - pane.add(checkbox); - return checkbox; - })); - - JButton button = new JButton(I18n.translate("menu.file.stats.generate")); - - button.addActionListener(e -> { - Set includedMembers = checkboxes - .entrySet() - .stream() - .filter(entry -> entry.getValue().isSelected()) - .map(Map.Entry::getKey) - .collect(Collectors.toSet()); - - frame.setVisible(false); - frame.dispose(); - gui.getController().openStats(includedMembers); - }); - - pane.add(button); - frame.pack(); - frame.setLocationRelativeTo(this.gui.getFrame()); - frame.setVisible(true); - }); - menu.add(stats); + stats.addActionListener(event -> StatsDialog.show(this.gui)); } menu.addSeparator(); { @@ -235,12 +188,18 @@ public class MenuBar extends JMenuBar { */ { JMenu menu = new JMenu(I18n.translate("menu.decompiler")); - add(menu); + this.add(menu); + + ButtonGroup decompilerGroup = new ButtonGroup(); for (Config.Decompiler decompiler : Config.Decompiler.values()) { - JMenuItem label = new JMenuItem(decompiler.name); - menu.add(label); - label.addActionListener(event -> { + JRadioButtonMenuItem decompilerButton = new JRadioButtonMenuItem(decompiler.name); + decompilerGroup.add(decompilerButton); + if (decompiler.equals(Config.getInstance().decompiler)) { + decompilerButton.setSelected(true); + } + menu.add(decompilerButton); + decompilerButton.addActionListener(event -> { gui.getController().setDecompiler(decompiler.service); try { @@ -262,37 +221,35 @@ public class MenuBar extends JMenuBar { { JMenu themes = new JMenu(I18n.translate("menu.view.themes")); menu.add(themes); + ButtonGroup themeGroup = new ButtonGroup(); for (Config.LookAndFeel lookAndFeel : Config.LookAndFeel.values()) { - JMenuItem theme = new JMenuItem(I18n.translate("menu.view.themes." + lookAndFeel.name().toLowerCase(Locale.ROOT))); - themes.add(theme); - theme.addActionListener(event -> Themes.setLookAndFeel(gui, lookAndFeel)); + JRadioButtonMenuItem themeButton = new JRadioButtonMenuItem(I18n.translate("menu.view.themes." + lookAndFeel.name().toLowerCase(Locale.ROOT))); + themeGroup.add(themeButton); + if (lookAndFeel.equals(Config.getInstance().lookAndFeel)) { + themeButton.setSelected(true); + } + themes.add(themeButton); + themeButton.addActionListener(event -> Themes.setLookAndFeel(gui, lookAndFeel)); } - + } + { JMenu languages = new JMenu(I18n.translate("menu.view.languages")); menu.add(languages); + ButtonGroup languageGroup = new ButtonGroup(); for (String lang : I18n.getAvailableLanguages()) { - JMenuItem language = new JMenuItem(I18n.getLanguageName(lang)); - languages.add(language); - language.addActionListener(event -> I18n.setLanguage(lang)); - language.addActionListener(event -> { - JFrame frame = new JFrame(I18n.translate("menu.view.languages.title")); - Container pane = frame.getContentPane(); - pane.setLayout(new FlowLayout()); - - JLabel text = new JLabel((I18n.translate("menu.view.languages.summary"))); - text.setHorizontalAlignment(JLabel.CENTER); - pane.add(text); - - JButton okButton = new JButton(I18n.translate("menu.view.languages.ok")); - pane.add(okButton); - okButton.addActionListener(arg0 -> frame.dispose()); - - frame.pack(); - frame.setLocationRelativeTo(this.gui.getFrame()); - frame.setVisible(true); + JRadioButtonMenuItem languageButton = new JRadioButtonMenuItem(I18n.getLanguageName(lang)); + languageGroup.add(languageButton); + if (lang.equals(Config.getInstance().language)) { + languageButton.setSelected(true); + } + languages.add(languageButton); + languageButton.addActionListener(event -> { + I18n.setLanguage(lang); + ChangeDialog.show(this.gui); }); } - + } + { JMenu scale = new JMenu(I18n.translate("menu.view.scale")); { ButtonGroup scaleGroup = new ButtonGroup(); @@ -301,6 +258,7 @@ public class MenuBar extends JMenuBar { float realScaleFactor = scaleFactor / 100f; JRadioButtonMenuItem menuItem = new JRadioButtonMenuItem(String.format("%d%%", scaleFactor)); menuItem.addActionListener(event -> ScaleUtil.setScaleFactor(realScaleFactor)); + menuItem.addActionListener(event -> ChangeDialog.show(this.gui)); scaleGroup.add(menuItem); scale.add(menuItem); return new Pair<>(realScaleFactor, menuItem); @@ -309,7 +267,7 @@ public class MenuBar extends JMenuBar { JMenuItem customScale = new JMenuItem(I18n.translate("menu.view.scale.custom")); customScale.addActionListener(event -> { - String answer = (String) JOptionPane.showInputDialog(gui.getFrame(), "Custom Scale", "Custom Scale", + String answer = (String) JOptionPane.showInputDialog(gui.getFrame(), I18n.translate("menu.view.scale.custom.title"), I18n.translate("menu.view.scale.custom.title"), JOptionPane.QUESTION_MESSAGE, null, null, Float.toString(ScaleUtil.getScaleFactor() * 100)); if (answer == null) return; float newScale = 1.0f; @@ -318,6 +276,7 @@ public class MenuBar extends JMenuBar { } catch (NumberFormatException ignored) { } ScaleUtil.setScaleFactor(newScale); + ChangeDialog.show(this.gui); }); scale.add(customScale); ScaleUtil.addListener((newScale, _oldScale) -> { @@ -334,7 +293,9 @@ public class MenuBar extends JMenuBar { } } menu.add(scale); - + } + menu.addSeparator(); + { JMenuItem search = new JMenuItem(I18n.translate("menu.view.search")); search.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, InputEvent.SHIFT_MASK)); menu.add(search); @@ -343,7 +304,6 @@ public class MenuBar extends JMenuBar { this.gui.getSearchDialog().show(); } }); - } } @@ -399,6 +359,7 @@ public class MenuBar extends JMenuBar { this.startServerMenu = item; } } + /* * Help menu */ -- cgit v1.2.3