diff --git a/src/main/java/envoy/client/ui/LoginDialog.java b/src/main/java/envoy/client/ui/LoginDialog.java
new file mode 100644
index 0000000..db88176
--- /dev/null
+++ b/src/main/java/envoy/client/ui/LoginDialog.java
@@ -0,0 +1,118 @@
+package envoy.client.ui;
+
+import java.awt.*;
+import java.security.NoSuchAlgorithmException;
+
+import javax.swing.*;
+import javax.swing.border.EmptyBorder;
+
+import envoy.data.LoginCredentials;
+
+/**
+ * Project: envoy-client
+ * File: LoginDialog.java
+ * Created: 01.01.2020
+ *
+ * @author Kai S. K. Engelbart
+ * @since Envoy v0.3-alpha
+ */
+public class LoginDialog extends JDialog {
+
+ private final JPanel contentPanel = new JPanel();
+
+ private static final long serialVersionUID = 352021600833907468L;
+ private JTextField textField;
+ private JPasswordField passwordField;
+
+ private LoginCredentials credentials;
+
+ /**
+ * Displays a dialog enabling the user to enter their user name and password.
+ *
+ * @since Envoy v0.3-alpha
+ */
+ public LoginDialog() {
+ setSize(338, 123);
+ setLocationRelativeTo(null);
+ getContentPane().setLayout(new BorderLayout());
+ contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
+ getContentPane().add(contentPanel, BorderLayout.CENTER);
+ GridBagLayout gbl_contentPanel = new GridBagLayout();
+ gbl_contentPanel.columnWidths = new int[] { 0, 0, 0 };
+ gbl_contentPanel.rowHeights = new int[] { 0, 0, 0 };
+ gbl_contentPanel.columnWeights = new double[] { 0.0, 1.0, Double.MIN_VALUE };
+ gbl_contentPanel.rowWeights = new double[] { 0.0, 0.0, Double.MIN_VALUE };
+ contentPanel.setLayout(gbl_contentPanel);
+ {
+ JLabel lblUserName = new JLabel("User name:");
+ GridBagConstraints gbc_lblUserName = new GridBagConstraints();
+ gbc_lblUserName.anchor = GridBagConstraints.EAST;
+ gbc_lblUserName.insets = new Insets(0, 0, 5, 5);
+ gbc_lblUserName.gridx = 0;
+ gbc_lblUserName.gridy = 0;
+ contentPanel.add(lblUserName, gbc_lblUserName);
+ }
+ {
+ textField = new JTextField();
+ GridBagConstraints gbc_textField = new GridBagConstraints();
+ gbc_textField.insets = new Insets(0, 0, 5, 0);
+ gbc_textField.fill = GridBagConstraints.HORIZONTAL;
+ gbc_textField.gridx = 1;
+ gbc_textField.gridy = 0;
+ contentPanel.add(textField, gbc_textField);
+ textField.setColumns(10);
+ }
+ {
+ JLabel lblPassword = new JLabel("Password:");
+ GridBagConstraints gbc_lblPassword = new GridBagConstraints();
+ gbc_lblPassword.anchor = GridBagConstraints.EAST;
+ gbc_lblPassword.insets = new Insets(0, 0, 0, 5);
+ gbc_lblPassword.gridx = 0;
+ gbc_lblPassword.gridy = 1;
+ contentPanel.add(lblPassword, gbc_lblPassword);
+ }
+ {
+ passwordField = new JPasswordField();
+ GridBagConstraints gbc_passwordField = new GridBagConstraints();
+ gbc_passwordField.fill = GridBagConstraints.HORIZONTAL;
+ gbc_passwordField.gridx = 1;
+ gbc_passwordField.gridy = 1;
+ contentPanel.add(passwordField, gbc_passwordField);
+ }
+ {
+ JPanel buttonPane = new JPanel();
+ buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
+ getContentPane().add(buttonPane, BorderLayout.SOUTH);
+ {
+ JButton okButton = new JButton("OK");
+ okButton.addActionListener((evt) -> {
+ try {
+ credentials = new LoginCredentials(textField.getText(), passwordField.getPassword());
+ dispose();
+ } catch (NoSuchAlgorithmException e) {
+ e.printStackTrace();
+ }
+ });
+ okButton.setActionCommand("OK");
+ buttonPane.add(okButton);
+ getRootPane().setDefaultButton(okButton);
+ }
+ {
+ JButton cancelButton = new JButton("Cancel");
+ cancelButton.addActionListener((evt) -> dispose());
+ cancelButton.setActionCommand("Cancel");
+ buttonPane.add(cancelButton);
+ }
+ }
+
+ setModal(true);
+ setVisible(true);
+ }
+
+ /**
+ * @return the {@link LoginCredentials} entered by the user, or {@code null} if
+ * the dialog has been cancelled
+ * @since Envoy v0.3-alpha
+ */
+ public LoginCredentials getCredentials() { return credentials; }
+}
\ No newline at end of file
diff --git a/src/main/java/envoy/client/ui/Startup.java b/src/main/java/envoy/client/ui/Startup.java
index ae01e82..3e4692d 100644
--- a/src/main/java/envoy/client/ui/Startup.java
+++ b/src/main/java/envoy/client/ui/Startup.java
@@ -71,15 +71,13 @@ public class Startup {
EnvoyLog.setFileLevelBarrier(config.getFileLevelBarrier());
EnvoyLog.setConsoleLevelBarrier(config.getConsoleLevelBarrier());
- // Ask the user for their user name
- String userName = JOptionPane.showInputDialog("Please enter your username");
- if (userName == null || userName.isEmpty()) {
- logger.severe("User name is not set or empty. Exiting...");
- System.exit(1);
- }
+ // Ask the user for their user name and password
+ LoginCredentials credentials = new LoginDialog().getCredentials();
- // TODO: create dialog
- String pass = JOptionPane.showInputDialog("Enter password");
+ if (credentials == null) {
+ logger.info("The login process has been aborted by the user. Exiting...");
+ System.exit(0);
+ }
// Initialize the local database
LocalDB localDB;
@@ -99,18 +97,18 @@ public class Startup {
Client client = new Client();
try {
// Try entering online mode first
- client.onlineInit(new LoginCredentials(userName, pass.toCharArray()));
+ client.onlineInit(credentials);
} catch (Exception e1) {
logger.warning("Could not connect to server. Trying offline mode...");
e1.printStackTrace();
try {
// Try entering offline mode
localDB.loadUsers();
- User clientUser = localDB.getUsers().get(userName);
+ User clientUser = localDB.getUsers().get(credentials.getName());
if (clientUser == null) throw new EnvoyException("Could not enter offline mode: user name unknown");
client.setSender(clientUser);
JOptionPane.showMessageDialog(null,
- "A connection to the server could not be established. Starting in offline mode.",
+ "A connection to the server could not be established. Starting in offline mode.\n" + e1,
"Connection error",
JOptionPane.WARNING_MESSAGE);
} catch (Exception e2) {
@@ -132,7 +130,7 @@ public class Startup {
} catch (Exception e) {
e.printStackTrace();
JOptionPane.showMessageDialog(null,
- "Error while loading local database: " + e.toString() + "\nChats might not be stored locally.",
+ "Error while loading local database: " + e + "\nChats might not be stored locally.",
"Local DB error",
JOptionPane.WARNING_MESSAGE);
}