summaryrefslogtreecommitdiff
path: root/enigma-swing/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'enigma-swing/src/main/java')
-rw-r--r--enigma-swing/src/main/java/cuchaz/enigma/gui/dialog/ConnectToServerDialog.java11
-rw-r--r--enigma-swing/src/main/java/cuchaz/enigma/gui/dialog/CreateServerDialog.java141
2 files changed, 115 insertions, 37 deletions
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 {
23 private final JTextField usernameField; 23 private final JTextField usernameField;
24 private final ValidatableTextField ipField; 24 private final ValidatableTextField ipField;
25 private final JPasswordField passwordField; 25 private final JPasswordField passwordField;
26 private boolean success = false; 26 private boolean actionConfirm = false;
27 27
28 public ConnectToServerDialog(Frame owner) { 28 public ConnectToServerDialog(Frame owner) {
29 super(owner, I18n.translate("prompt.connect.title"), true); 29 super(owner, I18n.translate("prompt.connect.title"), true);
@@ -70,7 +70,7 @@ public class ConnectToServerDialog extends JDialog {
70 buttonContainer.add(connectButton, c); 70 buttonContainer.add(connectButton, c);
71 c.weightx = 0.0; 71 c.weightx = 0.0;
72 c.anchor = GridBagConstraints.CENTER; 72 c.anchor = GridBagConstraints.CENTER;
73 JButton abortButton = new JButton(I18n.translate("prompt.connect.cancel")); 73 JButton abortButton = new JButton(I18n.translate("prompt.cancel"));
74 abortButton.addActionListener(event -> cancel()); 74 abortButton.addActionListener(event -> cancel());
75 buttonContainer.add(abortButton, c); 75 buttonContainer.add(abortButton, c);
76 contentPane.add(buttonContainer, BorderLayout.SOUTH); 76 contentPane.add(buttonContainer, BorderLayout.SOUTH);
@@ -83,13 +83,13 @@ public class ConnectToServerDialog extends JDialog {
83 vc.reset(); 83 vc.reset();
84 validateInputs(); 84 validateInputs();
85 if (vc.canProceed()) { 85 if (vc.canProceed()) {
86 success = true; 86 actionConfirm = true;
87 setVisible(false); 87 setVisible(false);
88 } 88 }
89 } 89 }
90 90
91 private void cancel() { 91 private void cancel() {
92 success = false; 92 actionConfirm = false;
93 setVisible(false); 93 setVisible(false);
94 } 94 }
95 95
@@ -98,11 +98,12 @@ public class ConnectToServerDialog extends JDialog {
98 if (ipField.getText().trim().isEmpty()) { 98 if (ipField.getText().trim().isEmpty()) {
99 vc.raise(Message.EMPTY_FIELD); 99 vc.raise(Message.EMPTY_FIELD);
100 } else if (ServerAddress.from(ipField.getText(), EnigmaServer.DEFAULT_PORT) == null) { 100 } else if (ServerAddress.from(ipField.getText(), EnigmaServer.DEFAULT_PORT) == null) {
101 vc.raise(Message.INVALID_IP, ipField.getText()); 101 vc.raise(Message.INVALID_IP);
102 } 102 }
103 } 103 }
104 104
105 public Result getResult() { 105 public Result getResult() {
106 if (!actionConfirm) return null;
106 vc.reset(); 107 vc.reset();
107 validateInputs(); 108 validateInputs();
108 if (!vc.canProceed()) return null; 109 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 @@
1package cuchaz.enigma.gui.dialog; 1package cuchaz.enigma.gui.dialog;
2 2
3import java.awt.*;
4import java.util.Arrays;
5import java.util.List;
6import java.util.stream.Collectors;
7import java.util.stream.Stream;
8
9import javax.swing.*;
10
11import cuchaz.enigma.gui.elements.ValidatablePasswordField;
12import cuchaz.enigma.gui.elements.ValidatableTextField;
3import cuchaz.enigma.network.EnigmaServer; 13import cuchaz.enigma.network.EnigmaServer;
4import cuchaz.enigma.utils.I18n; 14import cuchaz.enigma.utils.I18n;
15import cuchaz.enigma.utils.validation.Message;
16import cuchaz.enigma.utils.validation.StandardValidation;
17import cuchaz.enigma.utils.validation.ValidationContext;
5 18
6import javax.swing.*; 19public class CreateServerDialog extends JDialog {
7import java.awt.*;
8 20
9public class CreateServerDialog { 21 private final ValidationContext vc = new ValidationContext();
10 22
11 public static Result show(Frame parentComponent) { 23 private final ValidatableTextField portField;
12 JTextField portField = new JTextField(String.valueOf(EnigmaServer.DEFAULT_PORT), 10); 24 private final ValidatablePasswordField passwordField;
13 JPanel portRow = new JPanel(); 25 private boolean actionConfirm = false;
14 portRow.add(new JLabel(I18n.translate("prompt.port"))); 26
15 portRow.add(portField); 27 public CreateServerDialog(Frame owner) {
16 JPasswordField passwordField = new JPasswordField(20); 28 super(owner, I18n.translate("prompt.create_server.title"), true);
17 JPanel passwordRow = new JPanel(); 29
18 passwordRow.add(new JLabel(I18n.translate("prompt.password"))); 30 Container contentPane = getContentPane();
19 passwordRow.add(passwordField); 31 contentPane.setLayout(new BorderLayout());
20 32 Container inputContainer = new JPanel(new GridBagLayout());
21 int response = JOptionPane.showConfirmDialog(parentComponent, new Object[]{portRow, passwordRow}, I18n.translate("prompt.create_server.title"), JOptionPane.OK_CANCEL_OPTION); 33 GridBagConstraints c = new GridBagConstraints();
22 if (response != JOptionPane.OK_OPTION) { 34 portField = new ValidatableTextField(Integer.toString(EnigmaServer.DEFAULT_PORT));
23 return null; 35 passwordField = new ValidatablePasswordField();
24 } 36
37 java.util.List<JLabel> labels = Stream.of("prompt.create_server.port", "prompt.password")
38 .map(I18n::translate)
39 .map(JLabel::new)
40 .collect(Collectors.toList());
41 List<JTextField> inputs = Arrays.asList(portField, passwordField);
42
43 for (int i = 0; i < inputs.size(); i += 1) {
44 c.gridy = i;
45 c.insets = new Insets(4, 4, 4, 4);
25 46
26 int port; 47 c.gridx = 0;
27 try { 48 c.weightx = 0.0;
28 port = Integer.parseInt(portField.getText()); 49 c.anchor = GridBagConstraints.LINE_END;
29 } catch (NumberFormatException e) { 50 c.fill = GridBagConstraints.NONE;
30 JOptionPane.showMessageDialog(parentComponent, I18n.translate("prompt.port.nan"), I18n.translate("prompt.create_server.title"), JOptionPane.ERROR_MESSAGE); 51 inputContainer.add(labels.get(i), c);
31 return null; 52
53 c.gridx = 1;
54 c.weightx = 1.0;
55 c.anchor = GridBagConstraints.LINE_START;
56 c.fill = GridBagConstraints.HORIZONTAL;
57 inputs.get(i).addActionListener(event -> confirm());
58 inputContainer.add(inputs.get(i), c);
32 } 59 }
33 if (port < 0 || port >= 65536) { 60 contentPane.add(inputContainer, BorderLayout.CENTER);
34 JOptionPane.showMessageDialog(parentComponent, I18n.translate("prompt.port.invalid"), I18n.translate("prompt.create_server.title"), JOptionPane.ERROR_MESSAGE); 61 Container buttonContainer = new JPanel(new GridBagLayout());
35 return null; 62 c = new GridBagConstraints();
63 c.weightx = 1.0;
64 c.insets = new Insets(4, 4, 4, 4);
65 c.anchor = GridBagConstraints.LINE_END;
66 JButton connectButton = new JButton(I18n.translate("prompt.create_server.confirm"));
67 connectButton.addActionListener(event -> confirm());
68 buttonContainer.add(connectButton, c);
69 c.weightx = 0.0;
70 c.anchor = GridBagConstraints.CENTER;
71 JButton abortButton = new JButton(I18n.translate("prompt.cancel"));
72 abortButton.addActionListener(event -> cancel());
73 buttonContainer.add(abortButton, c);
74 contentPane.add(buttonContainer, BorderLayout.SOUTH);
75
76 setLocationRelativeTo(owner);
77 setSize(new Dimension(400, 150));
78 }
79
80 private void confirm() {
81 vc.reset();
82 validateInputs();
83 if (vc.canProceed()) {
84 actionConfirm = true;
85 setVisible(false);
36 } 86 }
87 }
88
89 private void cancel() {
90 actionConfirm = false;
91 setVisible(false);
92 }
37 93
38 char[] password = passwordField.getPassword(); 94 public void validateInputs() {
39 if (password.length > EnigmaServer.MAX_PASSWORD_LENGTH) { 95 vc.setActiveElement(portField);
40 JOptionPane.showMessageDialog(parentComponent, I18n.translate("prompt.password.too_long"), I18n.translate("prompt.create_server.title"), JOptionPane.ERROR_MESSAGE); 96 StandardValidation.isIntInRange(vc, portField.getText(), 0, 65535);
41 return null; 97 vc.setActiveElement(passwordField);
98 if (passwordField.getPassword().length > EnigmaServer.MAX_PASSWORD_LENGTH) {
99 vc.raise(Message.FIELD_LENGTH_OUT_OF_RANGE, EnigmaServer.MAX_PASSWORD_LENGTH);
42 } 100 }
101 }
102
103 public Result getResult() {
104 if (!actionConfirm) return null;
105 vc.reset();
106 validateInputs();
107 if (!vc.canProceed()) return null;
108 return new Result(
109 Integer.parseInt(portField.getText()),
110 passwordField.getPassword()
111 );
112 }
113
114 public static Result show(Frame parent) {
115 CreateServerDialog d = new CreateServerDialog(parent);
116
117 d.setVisible(true);
118 Result r = d.getResult();
43 119
44 return new Result(port, password); 120 d.dispose();
121 return r;
45 } 122 }
46 123
47 public static class Result { 124 public static class Result {