From 0f47403d0220757fed189b76e2071e25b1025cb8 Mon Sep 17 00:00:00 2001 From: Runemoro Date: Wed, 3 Jun 2020 13:39:42 -0400 Subject: Split GUI code to separate module (#242) * Split into modules * Post merge compile fixes Co-authored-by: modmuss50 --- .../java/cuchaz/enigma/gui/dialog/AboutDialog.java | 69 ------ .../cuchaz/enigma/gui/dialog/ChangeDialog.java | 50 ---- .../enigma/gui/dialog/ConnectToServerDialog.java | 82 ------- .../java/cuchaz/enigma/gui/dialog/CrashDialog.java | 105 --------- .../enigma/gui/dialog/CreateServerDialog.java | 65 ----- .../cuchaz/enigma/gui/dialog/JavadocDialog.java | 159 ------------- .../cuchaz/enigma/gui/dialog/ProgressDialog.java | 109 --------- .../cuchaz/enigma/gui/dialog/SearchDialog.java | 261 --------------------- .../java/cuchaz/enigma/gui/dialog/StatsDialog.java | 82 ------- 9 files changed, 982 deletions(-) delete mode 100644 src/main/java/cuchaz/enigma/gui/dialog/AboutDialog.java delete mode 100644 src/main/java/cuchaz/enigma/gui/dialog/ChangeDialog.java delete mode 100644 src/main/java/cuchaz/enigma/gui/dialog/ConnectToServerDialog.java delete mode 100644 src/main/java/cuchaz/enigma/gui/dialog/CrashDialog.java delete mode 100644 src/main/java/cuchaz/enigma/gui/dialog/CreateServerDialog.java delete mode 100644 src/main/java/cuchaz/enigma/gui/dialog/JavadocDialog.java delete mode 100644 src/main/java/cuchaz/enigma/gui/dialog/ProgressDialog.java delete mode 100644 src/main/java/cuchaz/enigma/gui/dialog/SearchDialog.java delete mode 100644 src/main/java/cuchaz/enigma/gui/dialog/StatsDialog.java (limited to 'src/main/java/cuchaz/enigma/gui/dialog') diff --git a/src/main/java/cuchaz/enigma/gui/dialog/AboutDialog.java b/src/main/java/cuchaz/enigma/gui/dialog/AboutDialog.java deleted file mode 100644 index 43b8265..0000000 --- a/src/main/java/cuchaz/enigma/gui/dialog/AboutDialog.java +++ /dev/null @@ -1,69 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 Jeff Martin. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the GNU Lesser General Public - * License v3.0 which accompanies this distribution, and is available at - * http://www.gnu.org/licenses/lgpl.html - *

- * Contributors: - * Jeff Martin - initial API and implementation - ******************************************************************************/ - -package cuchaz.enigma.gui.dialog; - -import cuchaz.enigma.Constants; -import cuchaz.enigma.utils.I18n; -import cuchaz.enigma.gui.util.ScaleUtil; -import cuchaz.enigma.utils.Utils; - -import javax.swing.*; -import java.awt.*; -import java.io.IOException; - -public class AboutDialog { - - public static void show(JFrame parent) { - // init frame - final JFrame frame = new JFrame(String.format(I18n.translate("menu.help.about.title"), Constants.NAME)); - final Container pane = frame.getContentPane(); - pane.setLayout(new FlowLayout()); - - // load the content - try { - String html = Utils.readResourceToString("/about.html"); - html = String.format(html, Constants.NAME, Constants.VERSION); - JLabel label = new JLabel(html); - label.setHorizontalAlignment(JLabel.CENTER); - pane.add(label); - } catch (IOException ex) { - throw new Error(ex); - } - - // show the link - String html = "%s"; - html = String.format(html, Constants.URL, Constants.URL); - JButton link = new JButton(html); - link.addActionListener(event -> Utils.openUrl(Constants.URL)); - link.setBorderPainted(false); - link.setOpaque(false); - link.setBackground(Color.WHITE); - link.setCursor(new Cursor(Cursor.HAND_CURSOR)); - link.setFocusable(false); - JPanel linkPanel = new JPanel(); - linkPanel.add(link); - pane.add(linkPanel); - - // show ok button - JButton okButton = new JButton(I18n.translate("menu.help.about.ok")); - pane.add(okButton); - okButton.addActionListener(arg0 -> frame.dispose()); - - // show the frame - pane.doLayout(); - frame.setSize(ScaleUtil.getDimension(400, 220)); - frame.setResizable(false); - frame.setLocationRelativeTo(parent); - frame.setVisible(true); - frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); - } -} diff --git a/src/main/java/cuchaz/enigma/gui/dialog/ChangeDialog.java b/src/main/java/cuchaz/enigma/gui/dialog/ChangeDialog.java deleted file mode 100644 index 64219ab..0000000 --- a/src/main/java/cuchaz/enigma/gui/dialog/ChangeDialog.java +++ /dev/null @@ -1,50 +0,0 @@ -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/ConnectToServerDialog.java b/src/main/java/cuchaz/enigma/gui/dialog/ConnectToServerDialog.java deleted file mode 100644 index c5f505c..0000000 --- a/src/main/java/cuchaz/enigma/gui/dialog/ConnectToServerDialog.java +++ /dev/null @@ -1,82 +0,0 @@ -package cuchaz.enigma.gui.dialog; - -import cuchaz.enigma.network.EnigmaServer; -import cuchaz.enigma.utils.I18n; - -import javax.swing.*; -import java.awt.Frame; - -public class ConnectToServerDialog { - - public static Result show(Frame parentComponent) { - JTextField usernameField = new JTextField(System.getProperty("user.name"), 20); - JPanel usernameRow = new JPanel(); - usernameRow.add(new JLabel(I18n.translate("prompt.connect.username"))); - usernameRow.add(usernameField); - JTextField ipField = new JTextField(20); - JPanel ipRow = new JPanel(); - ipRow.add(new JLabel(I18n.translate("prompt.connect.ip"))); - ipRow.add(ipField); - JTextField portField = new JTextField(String.valueOf(EnigmaServer.DEFAULT_PORT), 10); - JPanel portRow = new JPanel(); - portRow.add(new JLabel(I18n.translate("prompt.port"))); - portRow.add(portField); - JPasswordField passwordField = new JPasswordField(20); - JPanel passwordRow = new JPanel(); - passwordRow.add(new JLabel(I18n.translate("prompt.password"))); - passwordRow.add(passwordField); - - int response = JOptionPane.showConfirmDialog(parentComponent, new Object[]{usernameRow, ipRow, portRow, passwordRow}, I18n.translate("prompt.connect.title"), JOptionPane.OK_CANCEL_OPTION); - if (response != JOptionPane.OK_OPTION) { - return null; - } - - String username = usernameField.getText(); - String ip = ipField.getText(); - int port; - try { - port = Integer.parseInt(portField.getText()); - } catch (NumberFormatException e) { - JOptionPane.showMessageDialog(parentComponent, I18n.translate("prompt.port.nan"), I18n.translate("prompt.connect.title"), JOptionPane.ERROR_MESSAGE); - return null; - } - if (port < 0 || port >= 65536) { - JOptionPane.showMessageDialog(parentComponent, I18n.translate("prompt.port.invalid"), I18n.translate("prompt.connect.title"), JOptionPane.ERROR_MESSAGE); - return null; - } - char[] password = passwordField.getPassword(); - - return new Result(username, ip, port, password); - } - - public static class Result { - private final String username; - private final String ip; - private final int port; - private final char[] password; - - public Result(String username, String ip, int port, char[] password) { - this.username = username; - this.ip = ip; - this.port = port; - this.password = password; - } - - public String getUsername() { - return username; - } - - public String getIp() { - return ip; - } - - public int getPort() { - return port; - } - - public char[] getPassword() { - return password; - } - } - -} diff --git a/src/main/java/cuchaz/enigma/gui/dialog/CrashDialog.java b/src/main/java/cuchaz/enigma/gui/dialog/CrashDialog.java deleted file mode 100644 index 908b42e..0000000 --- a/src/main/java/cuchaz/enigma/gui/dialog/CrashDialog.java +++ /dev/null @@ -1,105 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 Jeff Martin. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the GNU Lesser General Public - * License v3.0 which accompanies this distribution, and is available at - * http://www.gnu.org/licenses/lgpl.html - *

- * Contributors: - * Jeff Martin - initial API and implementation - ******************************************************************************/ - -package cuchaz.enigma.gui.dialog; - -import cuchaz.enigma.Constants; -import cuchaz.enigma.utils.I18n; -import cuchaz.enigma.gui.util.ScaleUtil; -import cuchaz.enigma.utils.Utils; - -import javax.swing.*; -import java.awt.*; -import java.io.PrintWriter; -import java.io.StringWriter; -import java.io.FileWriter; -import java.io.File; -import java.io.IOException; - -public class CrashDialog { - - private static CrashDialog instance = null; - - private JFrame frame; - private JTextArea text; - - private CrashDialog(JFrame parent) { - // init frame - frame = new JFrame(String.format(I18n.translate("crash.title"), Constants.NAME)); - final Container pane = frame.getContentPane(); - pane.setLayout(new BorderLayout()); - - JLabel label = new JLabel(String.format(I18n.translate("crash.summary"), Constants.NAME)); - label.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); - pane.add(label, BorderLayout.NORTH); - - // report panel - text = new JTextArea(); - text.setTabSize(2); - pane.add(new JScrollPane(text), BorderLayout.CENTER); - - // buttons panel - JPanel buttonsPanel = new JPanel(); - buttonsPanel.setLayout(new BoxLayout(buttonsPanel, BoxLayout.LINE_AXIS)); - JButton exportButton = new JButton(I18n.translate("crash.export")); - exportButton.addActionListener(event -> { - JFileChooser chooser = new JFileChooser(); - chooser.setSelectedFile(new File("enigma_crash.log")); - if (chooser.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) { - try { - File file = chooser.getSelectedFile(); - FileWriter writer = new FileWriter(file); - writer.write(instance.text.getText()); - writer.close(); - } catch (IOException ex) { - ex.printStackTrace(); - } - } - }); - buttonsPanel.add(exportButton); - buttonsPanel.add(Box.createHorizontalGlue()); - buttonsPanel.add(Utils.unboldLabel(new JLabel(I18n.translate("crash.exit.warning")))); - JButton ignoreButton = new JButton(I18n.translate("crash.ignore")); - ignoreButton.addActionListener(event -> { - // close (hide) the dialog - frame.setVisible(false); - }); - buttonsPanel.add(ignoreButton); - JButton exitButton = new JButton(I18n.translate("crash.exit")); - exitButton.addActionListener(event -> { - // exit enigma - System.exit(1); - }); - buttonsPanel.add(exitButton); - pane.add(buttonsPanel, BorderLayout.SOUTH); - - // show the frame - frame.setSize(ScaleUtil.getDimension(600, 400)); - frame.setLocationRelativeTo(parent); - frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); - } - - public static void init(JFrame parent) { - instance = new CrashDialog(parent); - } - - public static void show(Throwable ex) { - // get the error report - StringWriter buf = new StringWriter(); - ex.printStackTrace(new PrintWriter(buf)); - String report = buf.toString(); - - // show it! - instance.text.setText(report); - instance.frame.doLayout(); - instance.frame.setVisible(true); - } -} diff --git a/src/main/java/cuchaz/enigma/gui/dialog/CreateServerDialog.java b/src/main/java/cuchaz/enigma/gui/dialog/CreateServerDialog.java deleted file mode 100644 index eea1dff..0000000 --- a/src/main/java/cuchaz/enigma/gui/dialog/CreateServerDialog.java +++ /dev/null @@ -1,65 +0,0 @@ -package cuchaz.enigma.gui.dialog; - -import cuchaz.enigma.network.EnigmaServer; -import cuchaz.enigma.utils.I18n; - -import javax.swing.*; -import java.awt.*; - -public class CreateServerDialog { - - public static Result show(Frame parentComponent) { - JTextField portField = new JTextField(String.valueOf(EnigmaServer.DEFAULT_PORT), 10); - JPanel portRow = new JPanel(); - portRow.add(new JLabel(I18n.translate("prompt.port"))); - portRow.add(portField); - JPasswordField passwordField = new JPasswordField(20); - JPanel passwordRow = new JPanel(); - passwordRow.add(new JLabel(I18n.translate("prompt.password"))); - passwordRow.add(passwordField); - - int response = JOptionPane.showConfirmDialog(parentComponent, new Object[]{portRow, passwordRow}, I18n.translate("prompt.create_server.title"), JOptionPane.OK_CANCEL_OPTION); - if (response != JOptionPane.OK_OPTION) { - return null; - } - - int port; - try { - port = Integer.parseInt(portField.getText()); - } catch (NumberFormatException e) { - JOptionPane.showMessageDialog(parentComponent, I18n.translate("prompt.port.nan"), I18n.translate("prompt.create_server.title"), JOptionPane.ERROR_MESSAGE); - return null; - } - if (port < 0 || port >= 65536) { - JOptionPane.showMessageDialog(parentComponent, I18n.translate("prompt.port.invalid"), I18n.translate("prompt.create_server.title"), JOptionPane.ERROR_MESSAGE); - return null; - } - - char[] password = passwordField.getPassword(); - if (password.length > EnigmaServer.MAX_PASSWORD_LENGTH) { - JOptionPane.showMessageDialog(parentComponent, I18n.translate("prompt.password.too_long"), I18n.translate("prompt.create_server.title"), JOptionPane.ERROR_MESSAGE); - return null; - } - - return new Result(port, password); - } - - public static class Result { - private final int port; - private final char[] password; - - public Result(int port, char[] password) { - this.port = port; - this.password = password; - } - - public int getPort() { - return port; - } - - public char[] getPassword() { - return password; - } - } - -} diff --git a/src/main/java/cuchaz/enigma/gui/dialog/JavadocDialog.java b/src/main/java/cuchaz/enigma/gui/dialog/JavadocDialog.java deleted file mode 100644 index 7e41441..0000000 --- a/src/main/java/cuchaz/enigma/gui/dialog/JavadocDialog.java +++ /dev/null @@ -1,159 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 Jeff Martin. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the GNU Lesser General Public - * License v3.0 which accompanies this distribution, and is available at - * http://www.gnu.org/licenses/lgpl.html - *

- * Contributors: - * Jeff Martin - initial API and implementation - ******************************************************************************/ - -package cuchaz.enigma.gui.dialog; - -import cuchaz.enigma.utils.I18n; -import cuchaz.enigma.gui.util.ScaleUtil; -import cuchaz.enigma.utils.Utils; - -import javax.swing.*; -import javax.swing.text.html.HTML; - -import java.awt.*; -import java.awt.event.KeyAdapter; -import java.awt.event.KeyEvent; - -public class JavadocDialog { - - private static JavadocDialog instance = null; - - private JFrame frame; - - private JavadocDialog(JFrame parent, JTextArea text, Callback callback) { - // init frame - frame = new JFrame(I18n.translate("javadocs.edit")); - final Container pane = frame.getContentPane(); - pane.setLayout(new BorderLayout()); - - // editor panel - text.setTabSize(2); - pane.add(new JScrollPane(text), BorderLayout.CENTER); - text.addKeyListener(new KeyAdapter() { - @Override - public void keyPressed(KeyEvent event) { - switch (event.getKeyCode()) { - case KeyEvent.VK_ENTER: - if (event.isControlDown()) - callback.closeUi(frame, true); - break; - case KeyEvent.VK_ESCAPE: - callback.closeUi(frame, false); - break; - default: - break; - } - } - }); - - // buttons panel - JPanel buttonsPanel = new JPanel(); - FlowLayout buttonsLayout = new FlowLayout(); - buttonsLayout.setAlignment(FlowLayout.RIGHT); - buttonsPanel.setLayout(buttonsLayout); - buttonsPanel.add(Utils.unboldLabel(new JLabel(I18n.translate("javadocs.instruction")))); - JButton cancelButton = new JButton(I18n.translate("javadocs.cancel")); - cancelButton.addActionListener(event -> { - // close (hide) the dialog - callback.closeUi(frame, false); - }); - buttonsPanel.add(cancelButton); - JButton saveButton = new JButton(I18n.translate("javadocs.save")); - saveButton.addActionListener(event -> { - // exit enigma - callback.closeUi(frame, true); - }); - buttonsPanel.add(saveButton); - pane.add(buttonsPanel, BorderLayout.SOUTH); - - // tags panel - JMenuBar tagsMenu = new JMenuBar(); - - // add javadoc tags - for (JavadocTag tag : JavadocTag.values()) { - JButton tagButton = new JButton(tag.getText()); - tagButton.addActionListener(action -> { - boolean textSelected = text.getSelectedText() != null; - String tagText = tag.isInline() ? "{" + tag.getText() + " }" : tag.getText() + " "; - - if (textSelected) { - if (tag.isInline()) { - tagText = "{" + tag.getText() + " " + text.getSelectedText() + "}"; - } else { - tagText = tag.getText() + " " + text.getSelectedText(); - } - text.replaceSelection(tagText); - } else { - text.insert(tagText, text.getCaretPosition()); - } - - if (tag.isInline()) { - text.setCaretPosition(text.getCaretPosition() - 1); - } - text.grabFocus(); - }); - tagsMenu.add(tagButton); - } - - // add html tags - JComboBox htmlList = new JComboBox(); - htmlList.setPreferredSize(new Dimension()); - for (HTML.Tag htmlTag : HTML.getAllTags()) { - htmlList.addItem(htmlTag.toString()); - } - htmlList.addActionListener(action -> { - String tagText = "<" + htmlList.getSelectedItem().toString() + ">"; - text.insert(tagText, text.getCaretPosition()); - text.grabFocus(); - }); - tagsMenu.add(htmlList); - - pane.add(tagsMenu, BorderLayout.NORTH); - - // show the frame - frame.setSize(ScaleUtil.getDimension(600, 400)); - frame.setLocationRelativeTo(parent); - frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); - } - - public static void init(JFrame parent, JTextArea area, Callback callback) { - instance = new JavadocDialog(parent, area, callback); - instance.frame.doLayout(); - instance.frame.setVisible(true); - } - - public interface Callback { - void closeUi(JFrame frame, boolean save); - } - - private enum JavadocTag { - CODE(true), - LINK(true), - LINKPLAIN(true), - RETURN(false), - SEE(false), - THROWS(false); - - private boolean inline; - - private JavadocTag(boolean inline) { - this.inline = inline; - } - - public String getText() { - return "@" + this.name().toLowerCase(); - } - - public boolean isInline() { - return this.inline; - } - } -} diff --git a/src/main/java/cuchaz/enigma/gui/dialog/ProgressDialog.java b/src/main/java/cuchaz/enigma/gui/dialog/ProgressDialog.java deleted file mode 100644 index e33ae82..0000000 --- a/src/main/java/cuchaz/enigma/gui/dialog/ProgressDialog.java +++ /dev/null @@ -1,109 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 Jeff Martin. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the GNU Lesser General Public - * License v3.0 which accompanies this distribution, and is available at - * http://www.gnu.org/licenses/lgpl.html - *

- * Contributors: - * Jeff Martin - initial API and implementation - ******************************************************************************/ - -package cuchaz.enigma.gui.dialog; - -import cuchaz.enigma.Constants; -import cuchaz.enigma.ProgressListener; -import cuchaz.enigma.utils.I18n; -import cuchaz.enigma.gui.util.ScaleUtil; -import cuchaz.enigma.utils.Utils; - -import javax.swing.*; -import java.awt.*; -import java.util.concurrent.CompletableFuture; - -public class ProgressDialog implements ProgressListener, AutoCloseable { - - private JFrame frame; - private JLabel labelTitle; - private JLabel labelText; - private JProgressBar progress; - - public ProgressDialog(JFrame parent) { - - // init frame - this.frame = new JFrame(String.format(I18n.translate("progress.operation"), Constants.NAME)); - final Container pane = this.frame.getContentPane(); - FlowLayout layout = new FlowLayout(); - layout.setAlignment(FlowLayout.LEFT); - pane.setLayout(layout); - - this.labelTitle = new JLabel(); - pane.add(this.labelTitle); - - // set up the progress bar - JPanel panel = new JPanel(); - pane.add(panel); - panel.setLayout(new BorderLayout()); - this.labelText = Utils.unboldLabel(new JLabel()); - this.progress = new JProgressBar(); - this.labelText.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 0)); - panel.add(this.labelText, BorderLayout.NORTH); - panel.add(this.progress, BorderLayout.CENTER); - panel.setPreferredSize(ScaleUtil.getDimension(360, 50)); - - // show the frame - pane.doLayout(); - this.frame.setSize(ScaleUtil.getDimension(400, 120)); - this.frame.setResizable(false); - this.frame.setLocationRelativeTo(parent); - this.frame.setVisible(true); - this.frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); - } - - public static CompletableFuture runOffThread(final JFrame parent, final ProgressRunnable runnable) { - CompletableFuture future = new CompletableFuture<>(); - new Thread(() -> - { - try (ProgressDialog progress = new ProgressDialog(parent)) { - runnable.run(progress); - future.complete(null); - } catch (Exception ex) { - future.completeExceptionally(ex); - throw new Error(ex); - } - }).start(); - return future; - } - - @Override - public void close() { - this.frame.dispose(); - } - - @Override - public void init(int totalWork, String title) { - this.labelTitle.setText(title); - this.progress.setMinimum(0); - this.progress.setMaximum(totalWork); - this.progress.setValue(0); - } - - @Override - public void step(int numDone, String message) { - this.labelText.setText(message); - if (numDone != -1) { - this.progress.setValue(numDone); - this.progress.setIndeterminate(false); - } else { - this.progress.setIndeterminate(true); - } - - // update the frame - this.frame.validate(); - this.frame.repaint(); - } - - public interface ProgressRunnable { - void run(ProgressListener listener) throws Exception; - } -} diff --git a/src/main/java/cuchaz/enigma/gui/dialog/SearchDialog.java b/src/main/java/cuchaz/enigma/gui/dialog/SearchDialog.java deleted file mode 100644 index b283a37..0000000 --- a/src/main/java/cuchaz/enigma/gui/dialog/SearchDialog.java +++ /dev/null @@ -1,261 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 Jeff Martin. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the GNU Lesser General Public - * License v3.0 which accompanies this distribution, and is available at - * http://www.gnu.org/licenses/lgpl.html - *

- * Contributors: - * Jeff Martin - initial API and implementation - ******************************************************************************/ - -package cuchaz.enigma.gui.dialog; - -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.FlowLayout; -import java.awt.Font; -import java.awt.event.*; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -import javax.swing.*; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; - -import cuchaz.enigma.gui.Gui; -import cuchaz.enigma.gui.GuiController; -import cuchaz.enigma.gui.util.AbstractListCellRenderer; -import cuchaz.enigma.gui.util.ScaleUtil; -import cuchaz.enigma.translation.representation.entry.ClassEntry; -import cuchaz.enigma.utils.I18n; -import cuchaz.enigma.utils.search.SearchEntry; -import cuchaz.enigma.utils.search.SearchUtil; - -public class SearchDialog { - - private final JTextField searchField; - private DefaultListModel classListModel; - private final JList classList; - private final JDialog dialog; - - private final Gui parent; - private final SearchUtil su; - private SearchUtil.SearchControl currentSearch; - - public SearchDialog(Gui parent) { - this.parent = parent; - - su = new SearchUtil<>(); - - dialog = new JDialog(parent.getFrame(), I18n.translate("menu.view.search"), true); - JPanel contentPane = new JPanel(); - contentPane.setBorder(ScaleUtil.createEmptyBorder(4, 4, 4, 4)); - contentPane.setLayout(new BorderLayout(ScaleUtil.scale(4), ScaleUtil.scale(4))); - - searchField = new JTextField(); - searchField.getDocument().addDocumentListener(new DocumentListener() { - - @Override - public void insertUpdate(DocumentEvent e) { - updateList(); - } - - @Override - public void removeUpdate(DocumentEvent e) { - updateList(); - } - - @Override - public void changedUpdate(DocumentEvent e) { - updateList(); - } - - }); - searchField.addKeyListener(new KeyAdapter() { - @Override - public void keyPressed(KeyEvent e) { - if (e.getKeyCode() == KeyEvent.VK_DOWN) { - int next = classList.isSelectionEmpty() ? 0 : classList.getSelectedIndex() + 1; - classList.setSelectedIndex(next); - classList.ensureIndexIsVisible(next); - } else if (e.getKeyCode() == KeyEvent.VK_UP) { - int prev = classList.isSelectionEmpty() ? classList.getModel().getSize() : classList.getSelectedIndex() - 1; - classList.setSelectedIndex(prev); - classList.ensureIndexIsVisible(prev); - } else if (e.getKeyCode() == KeyEvent.VK_ESCAPE) { - close(); - } - } - }); - searchField.addActionListener(e -> openSelected()); - contentPane.add(searchField, BorderLayout.NORTH); - - classListModel = new DefaultListModel<>(); - classList = new JList<>(); - classList.setModel(classListModel); - classList.setCellRenderer(new ListCellRendererImpl()); - classList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - classList.addMouseListener(new MouseAdapter() { - @Override - public void mouseClicked(MouseEvent mouseEvent) { - if (mouseEvent.getClickCount() >= 2) { - int idx = classList.locationToIndex(mouseEvent.getPoint()); - SearchEntryImpl entry = classList.getModel().getElementAt(idx); - openEntry(entry); - } - } - }); - contentPane.add(new JScrollPane(classList, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER), BorderLayout.CENTER); - - JPanel buttonBar = new JPanel(); - buttonBar.setLayout(new FlowLayout(FlowLayout.RIGHT)); - JButton open = new JButton(I18n.translate("prompt.open")); - open.addActionListener(event -> openSelected()); - buttonBar.add(open); - JButton cancel = new JButton(I18n.translate("prompt.cancel")); - cancel.addActionListener(event -> close()); - buttonBar.add(cancel); - contentPane.add(buttonBar, BorderLayout.SOUTH); - - // apparently the class list doesn't update by itself when the list - // state changes and the dialog is hidden - dialog.addComponentListener(new ComponentAdapter() { - @Override - public void componentShown(ComponentEvent e) { - classList.updateUI(); - } - }); - - dialog.setContentPane(contentPane); - dialog.setSize(ScaleUtil.getDimension(400, 500)); - dialog.setLocationRelativeTo(parent.getFrame()); - } - - public void show() { - su.clear(); - parent.getController().project.getJarIndex().getEntryIndex().getClasses().parallelStream() - .filter(e -> !e.isInnerClass()) - .map(e -> SearchEntryImpl.from(e, parent.getController())) - .map(SearchUtil.Entry::from) - .sequential() - .forEach(su::add); - - updateList(); - - searchField.requestFocus(); - searchField.selectAll(); - - dialog.setVisible(true); - } - - private void openSelected() { - SearchEntryImpl selectedValue = classList.getSelectedValue(); - if (selectedValue != null) { - openEntry(selectedValue); - } - } - - private void openEntry(SearchEntryImpl e) { - close(); - su.hit(e); - parent.getController().navigateTo(e.obf); - if (e.deobf != null) { - parent.getDeobfPanel().deobfClasses.setSelectionClass(e.deobf); - } else { - parent.getObfPanel().obfClasses.setSelectionClass(e.obf); - } - } - - private void close() { - dialog.setVisible(false); - } - - // Updates the list of class names - private void updateList() { - if (currentSearch != null) currentSearch.stop(); - - DefaultListModel classListModel = new DefaultListModel<>(); - this.classListModel = classListModel; - classList.setModel(classListModel); - - currentSearch = su.asyncSearch(searchField.getText(), (idx, e) -> SwingUtilities.invokeLater(() -> classListModel.insertElementAt(e, idx))); - } - - public void dispose() { - dialog.dispose(); - } - - private static final class SearchEntryImpl implements SearchEntry { - - public final ClassEntry obf; - public final ClassEntry deobf; - - private SearchEntryImpl(ClassEntry obf, ClassEntry deobf) { - this.obf = obf; - this.deobf = deobf; - } - - @Override - public List getSearchableNames() { - if (deobf != null) { - return Arrays.asList(obf.getSimpleName(), deobf.getSimpleName()); - } else { - return Collections.singletonList(obf.getSimpleName()); - } - } - - @Override - public String getIdentifier() { - return obf.getFullName(); - } - - @Override - public String toString() { - return String.format("SearchEntryImpl { obf: %s, deobf: %s }", obf, deobf); - } - - public static SearchEntryImpl from(ClassEntry e, GuiController controller) { - ClassEntry deobf = controller.project.getMapper().deobfuscate(e); - if (deobf.equals(e)) deobf = null; - return new SearchEntryImpl(e, deobf); - } - - } - - private static final class ListCellRendererImpl extends AbstractListCellRenderer { - - private final JLabel mainName; - private final JLabel secondaryName; - - public ListCellRendererImpl() { - this.setLayout(new BorderLayout()); - - mainName = new JLabel(); - this.add(mainName, BorderLayout.WEST); - - secondaryName = new JLabel(); - secondaryName.setFont(secondaryName.getFont().deriveFont(Font.ITALIC)); - secondaryName.setForeground(Color.GRAY); - this.add(secondaryName, BorderLayout.EAST); - } - - @Override - public void updateUiForEntry(JList list, SearchEntryImpl value, int index, boolean isSelected, boolean cellHasFocus) { - if (value.deobf == null) { - mainName.setText(value.obf.getSimpleName()); - mainName.setToolTipText(value.obf.getFullName()); - secondaryName.setText(""); - secondaryName.setToolTipText(""); - } else { - mainName.setText(value.deobf.getSimpleName()); - mainName.setToolTipText(value.deobf.getFullName()); - secondaryName.setText(value.obf.getSimpleName()); - secondaryName.setToolTipText(value.obf.getFullName()); - } - } - - } - -} diff --git a/src/main/java/cuchaz/enigma/gui/dialog/StatsDialog.java b/src/main/java/cuchaz/enigma/gui/dialog/StatsDialog.java deleted file mode 100644 index 868eba7..0000000 --- a/src/main/java/cuchaz/enigma/gui/dialog/StatsDialog.java +++ /dev/null @@ -1,82 +0,0 @@ -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); - } - } -} -- cgit v1.2.3