Added LoginDialog

This commit is contained in:
Kai S. K. Engelbart 2020-01-01 18:18:18 +02:00
parent 7e2956ca11
commit 96066863ca
2 changed files with 128 additions and 12 deletions

View File

@ -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: <strong>envoy-client</strong><br>
* File: <strong>LoginDialog.java</strong><br>
* Created: <strong>01.01.2020</strong><br>
*
* @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; }
}

View File

@ -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);
}