From f51c8a16770216003a1c8039a94e1632b2b1bb3c Mon Sep 17 00:00:00 2001 From: 2xsaiko Date: Wed, 22 Apr 2020 22:59:41 +0200 Subject: Extend validation system --- .../enigma/gui/dialog/ConnectToServerDialog.java | 37 +++++----- .../enigma/gui/elements/VerifiableTextField.java | 83 ---------------------- .../cuchaz/enigma/utils/validation/Message.java | 1 + enigma/src/main/resources/lang/en_us.json | 1 + 4 files changed, 23 insertions(+), 99 deletions(-) delete mode 100644 enigma-swing/src/main/java/cuchaz/enigma/gui/elements/VerifiableTextField.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 4bac97b..eede946 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 @@ -9,15 +9,19 @@ import java.util.stream.Stream; import javax.swing.*; -import cuchaz.enigma.gui.elements.VerifiableTextField; +import cuchaz.enigma.gui.elements.ValidatableTextField; import cuchaz.enigma.network.EnigmaServer; import cuchaz.enigma.utils.I18n; import cuchaz.enigma.utils.ServerAddress; +import cuchaz.enigma.utils.validation.Message; +import cuchaz.enigma.utils.validation.ValidationContext; public class ConnectToServerDialog extends JDialog { + private final ValidationContext vc = new ValidationContext(); + private final JTextField usernameField; - private final VerifiableTextField ipField; + private final ValidatableTextField ipField; private final JPasswordField passwordField; private boolean success = false; @@ -29,7 +33,7 @@ public class ConnectToServerDialog extends JDialog { Container inputContainer = new JPanel(new GridBagLayout()); GridBagConstraints c = new GridBagConstraints(); usernameField = new JTextField(System.getProperty("user.name")); - ipField = new VerifiableTextField(); + ipField = new ValidatableTextField(); passwordField = new JPasswordField(); List labels = Stream.of("prompt.connect.username", "prompt.connect.address", "prompt.password") @@ -76,31 +80,32 @@ public class ConnectToServerDialog extends JDialog { } private void confirm() { - if (validateInputs()) { + vc.reset(); + validateInputs(); + if (vc.canProceed()) { success = true; setVisible(false); } } private void cancel() { - success = false; - setVisible(false); + success = false; + setVisible(false); } - public boolean validateInputs() { - boolean error = false; - ipField.clearErrorState(); - - if (ServerAddress.from(ipField.getText(), EnigmaServer.DEFAULT_PORT) == null) { - ipField.addError("Invalid IP/Port combination"); - error = true; + public void validateInputs() { + vc.setActiveElement(ipField); + 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()); } - - return !error; } public Result getResult() { - if (!success) return null; + vc.reset(); + validateInputs(); + if (!vc.canProceed()) return null; return new Result( usernameField.getText(), Objects.requireNonNull(ServerAddress.from(ipField.getText(), EnigmaServer.DEFAULT_PORT)), diff --git a/enigma-swing/src/main/java/cuchaz/enigma/gui/elements/VerifiableTextField.java b/enigma-swing/src/main/java/cuchaz/enigma/gui/elements/VerifiableTextField.java deleted file mode 100644 index 928372c..0000000 --- a/enigma-swing/src/main/java/cuchaz/enigma/gui/elements/VerifiableTextField.java +++ /dev/null @@ -1,83 +0,0 @@ -package cuchaz.enigma.gui.elements; - -import java.awt.Color; -import java.awt.Graphics; -import java.awt.event.FocusAdapter; -import java.awt.event.FocusEvent; - -import javax.swing.JTextField; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; -import javax.swing.text.Document; - -public class VerifiableTextField extends JTextField { - - private boolean hasError; - - public VerifiableTextField() { - } - - public VerifiableTextField(String text) { - super(text); - } - - public VerifiableTextField(int columns) { - super(columns); - } - - public VerifiableTextField(String text, int columns) { - super(text, columns); - } - - public VerifiableTextField(Document doc, String text, int columns) { - super(doc, text, columns); - } - - { - getDocument().addDocumentListener(new DocumentListener() { - @Override - public void insertUpdate(DocumentEvent e) { - clearErrorState(); - } - - @Override - public void removeUpdate(DocumentEvent e) { - clearErrorState(); - } - - @Override - public void changedUpdate(DocumentEvent e) { - clearErrorState(); - } - }); - } - - @Override - public void setText(String t) { - super.setText(t); - } - - public void clearErrorState() { - this.hasError = false; - repaint(); - } - - public void addError(String message) { - this.hasError = true; - repaint(); - } - - @Override - public void paint(Graphics g) { - super.paint(g); - if (hasError) { - g.setColor(Color.RED); - int x1 = getWidth() - 9; - int x2 = getWidth() - 2; - int y1 = 1; - int y2 = 8; - g.fillPolygon(new int[]{x1, x2, x2}, new int[]{y1, y1, y2}, 3); - } - } - -} diff --git a/enigma/src/main/java/cuchaz/enigma/utils/validation/Message.java b/enigma/src/main/java/cuchaz/enigma/utils/validation/Message.java index dca74bc..113199a 100644 --- a/enigma/src/main/java/cuchaz/enigma/utils/validation/Message.java +++ b/enigma/src/main/java/cuchaz/enigma/utils/validation/Message.java @@ -5,6 +5,7 @@ import cuchaz.enigma.utils.I18n; public class Message { public static final Message EMPTY_FIELD = create(Type.ERROR, "empty_field"); + public static final Message INVALID_IP = create(Type.ERROR, "invalid_ip"); public static final Message NOT_INT = create(Type.ERROR, "not_int"); public static final Message FIELD_OUT_OF_RANGE_INT = create(Type.ERROR, "field_out_of_range_int"); public static final Message FIELD_LENGTH_OUT_OF_RANGE = create(Type.ERROR, "field_length_out_of_range"); diff --git a/enigma/src/main/resources/lang/en_us.json b/enigma/src/main/resources/lang/en_us.json index 6590240..bc31f2c 100644 --- a/enigma/src/main/resources/lang/en_us.json +++ b/enigma/src/main/resources/lang/en_us.json @@ -167,6 +167,7 @@ "status.ready": "Ready.", "validation.message.empty_field": "This field is required.", + "validation.message.invalid_ip": "Invalid IP/Port combination: '%s'.", "validation.message.not_int": "Value must be an integer.", "validation.message.field_out_of_range_int": "Value must be an integer between %d and %d.", "validation.message.field_length_out_of_range": "Value must be less than %d characters long.", -- cgit v1.2.3