From a648df9683fc93922daad22f7bcb3e8c247d1860 Mon Sep 17 00:00:00 2001 From: 2xsaiko Date: Wed, 22 Apr 2020 23:52:09 +0200 Subject: Improve CreateServerDialog --- .../enigma/gui/dialog/ConnectToServerDialog.java | 11 +- .../enigma/gui/dialog/CreateServerDialog.java | 141 ++++++++++++++++----- 2 files changed, 115 insertions(+), 37 deletions(-) (limited to 'enigma-swing/src/main/java') diff --git a/enigma-swing/src/main/java/cuchaz/enigma/gui/dialog/ConnectToServerDialog.java b/enigma-swing/src/main/java/cuchaz/enigma/gui/dialog/ConnectToServerDialog.java index eede946c..697fc516 100644 --- a/enigma-swing/src/main/java/cuchaz/enigma/gui/dialog/ConnectToServerDialog.java +++ b/enigma-swing/src/main/java/cuchaz/enigma/gui/dialog/ConnectToServerDialog.java @@ -23,7 +23,7 @@ public class ConnectToServerDialog extends JDialog { private final JTextField usernameField; private final ValidatableTextField ipField; private final JPasswordField passwordField; - private boolean success = false; + private boolean actionConfirm = false; public ConnectToServerDialog(Frame owner) { super(owner, I18n.translate("prompt.connect.title"), true); @@ -70,7 +70,7 @@ public class ConnectToServerDialog extends JDialog { buttonContainer.add(connectButton, c); c.weightx = 0.0; c.anchor = GridBagConstraints.CENTER; - JButton abortButton = new JButton(I18n.translate("prompt.connect.cancel")); + JButton abortButton = new JButton(I18n.translate("prompt.cancel")); abortButton.addActionListener(event -> cancel()); buttonContainer.add(abortButton, c); contentPane.add(buttonContainer, BorderLayout.SOUTH); @@ -83,13 +83,13 @@ public class ConnectToServerDialog extends JDialog { vc.reset(); validateInputs(); if (vc.canProceed()) { - success = true; + actionConfirm = true; setVisible(false); } } private void cancel() { - success = false; + actionConfirm = false; setVisible(false); } @@ -98,11 +98,12 @@ public class ConnectToServerDialog extends JDialog { if (ipField.getText().trim().isEmpty()) { vc.raise(Message.EMPTY_FIELD); } else if (ServerAddress.from(ipField.getText(), EnigmaServer.DEFAULT_PORT) == null) { - vc.raise(Message.INVALID_IP, ipField.getText()); + vc.raise(Message.INVALID_IP); } } public Result getResult() { + if (!actionConfirm) return null; vc.reset(); validateInputs(); if (!vc.canProceed()) return null; diff --git a/enigma-swing/src/main/java/cuchaz/enigma/gui/dialog/CreateServerDialog.java b/enigma-swing/src/main/java/cuchaz/enigma/gui/dialog/CreateServerDialog.java index eea1dff1..bc4e9c94 100644 --- a/enigma-swing/src/main/java/cuchaz/enigma/gui/dialog/CreateServerDialog.java +++ b/enigma-swing/src/main/java/cuchaz/enigma/gui/dialog/CreateServerDialog.java @@ -1,47 +1,124 @@ package cuchaz.enigma.gui.dialog; +import java.awt.*; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import javax.swing.*; + +import cuchaz.enigma.gui.elements.ValidatablePasswordField; +import cuchaz.enigma.gui.elements.ValidatableTextField; import cuchaz.enigma.network.EnigmaServer; import cuchaz.enigma.utils.I18n; +import cuchaz.enigma.utils.validation.Message; +import cuchaz.enigma.utils.validation.StandardValidation; +import cuchaz.enigma.utils.validation.ValidationContext; -import javax.swing.*; -import java.awt.*; +public class CreateServerDialog extends JDialog { -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; - } + private final ValidationContext vc = new ValidationContext(); + + private final ValidatableTextField portField; + private final ValidatablePasswordField passwordField; + private boolean actionConfirm = false; + + public CreateServerDialog(Frame owner) { + super(owner, I18n.translate("prompt.create_server.title"), true); + + Container contentPane = getContentPane(); + contentPane.setLayout(new BorderLayout()); + Container inputContainer = new JPanel(new GridBagLayout()); + GridBagConstraints c = new GridBagConstraints(); + portField = new ValidatableTextField(Integer.toString(EnigmaServer.DEFAULT_PORT)); + passwordField = new ValidatablePasswordField(); + + java.util.List labels = Stream.of("prompt.create_server.port", "prompt.password") + .map(I18n::translate) + .map(JLabel::new) + .collect(Collectors.toList()); + List inputs = Arrays.asList(portField, passwordField); + + for (int i = 0; i < inputs.size(); i += 1) { + c.gridy = i; + c.insets = new Insets(4, 4, 4, 4); - 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; + c.gridx = 0; + c.weightx = 0.0; + c.anchor = GridBagConstraints.LINE_END; + c.fill = GridBagConstraints.NONE; + inputContainer.add(labels.get(i), c); + + c.gridx = 1; + c.weightx = 1.0; + c.anchor = GridBagConstraints.LINE_START; + c.fill = GridBagConstraints.HORIZONTAL; + inputs.get(i).addActionListener(event -> confirm()); + inputContainer.add(inputs.get(i), c); } - if (port < 0 || port >= 65536) { - JOptionPane.showMessageDialog(parentComponent, I18n.translate("prompt.port.invalid"), I18n.translate("prompt.create_server.title"), JOptionPane.ERROR_MESSAGE); - return null; + contentPane.add(inputContainer, BorderLayout.CENTER); + Container buttonContainer = new JPanel(new GridBagLayout()); + c = new GridBagConstraints(); + c.weightx = 1.0; + c.insets = new Insets(4, 4, 4, 4); + c.anchor = GridBagConstraints.LINE_END; + JButton connectButton = new JButton(I18n.translate("prompt.create_server.confirm")); + connectButton.addActionListener(event -> confirm()); + buttonContainer.add(connectButton, c); + c.weightx = 0.0; + c.anchor = GridBagConstraints.CENTER; + JButton abortButton = new JButton(I18n.translate("prompt.cancel")); + abortButton.addActionListener(event -> cancel()); + buttonContainer.add(abortButton, c); + contentPane.add(buttonContainer, BorderLayout.SOUTH); + + setLocationRelativeTo(owner); + setSize(new Dimension(400, 150)); + } + + private void confirm() { + vc.reset(); + validateInputs(); + if (vc.canProceed()) { + actionConfirm = true; + setVisible(false); } + } + + private void cancel() { + actionConfirm = false; + setVisible(false); + } - 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; + public void validateInputs() { + vc.setActiveElement(portField); + StandardValidation.isIntInRange(vc, portField.getText(), 0, 65535); + vc.setActiveElement(passwordField); + if (passwordField.getPassword().length > EnigmaServer.MAX_PASSWORD_LENGTH) { + vc.raise(Message.FIELD_LENGTH_OUT_OF_RANGE, EnigmaServer.MAX_PASSWORD_LENGTH); } + } + + public Result getResult() { + if (!actionConfirm) return null; + vc.reset(); + validateInputs(); + if (!vc.canProceed()) return null; + return new Result( + Integer.parseInt(portField.getText()), + passwordField.getPassword() + ); + } + + public static Result show(Frame parent) { + CreateServerDialog d = new CreateServerDialog(parent); + + d.setVisible(true); + Result r = d.getResult(); - return new Result(port, password); + d.dispose(); + return r; } public static class Result { -- cgit v1.2.3