diff --git a/src/main/java/gui/src/panels/ConnectToServerPanel/ConnectToServerButton.java b/src/main/java/gui/src/panels/ConnectToServerPanel/ConnectToServerButton.java new file mode 100644 index 0000000..d8c62bf --- /dev/null +++ b/src/main/java/gui/src/panels/ConnectToServerPanel/ConnectToServerButton.java @@ -0,0 +1,50 @@ +/** + * @author Aaron Moser + * @date 09.12.2023 + */ +package gui.src.panels.ConnectToServerPanel; + +import data.src.ViewToController.ConnectToServerData; +import gui.src.constants.GUIConstants; +import gui.src.panels.StatusPanel; +import queues.src.ViewToControllerQueue; + +import javax.swing.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +public class ConnectToServerButton extends JButton implements ActionListener { + private JTextField ipAddressTextField; + private JTextField portTextField; + private JTextField trustStorePasswordTextField; + + public ConnectToServerButton(JTextField ipAddressTextField, JTextField portTextField, JTextField trustStorePasswordTextField) { + this.ipAddressTextField = ipAddressTextField; + this.portTextField = portTextField; + this.trustStorePasswordTextField = trustStorePasswordTextField; + this.addActionListener(this); + } + + @Override + public void actionPerformed(ActionEvent e) { + System.out.println("Connect to server button was pressed."); + + ConnectToServerPanel.getInstance().disableFields(); + + // Reads in fields text + String ipAddress = this.ipAddressTextField.getText(); + int port = Integer.parseInt(this.portTextField.getText()); + + String trustStorePath = ConnectToServerPanel.getInstance().getServerCertStoreFilePath(); + String trustStorePassword = this.trustStorePasswordTextField.getText(); + + StatusPanel.getInstance().setStatus(GUIConstants.Status.Connecting); + // Sends data to queue + ViewToControllerQueue.getInstance().add(new ConnectToServerData( + ipAddress, + port, + trustStorePath, + trustStorePassword + )); + } +} diff --git a/src/main/java/gui/src/panels/ConnectToServerPanel/ConnectToServerPanel.java b/src/main/java/gui/src/panels/ConnectToServerPanel/ConnectToServerPanel.java index fb81698..5113dfa 100644 --- a/src/main/java/gui/src/panels/ConnectToServerPanel/ConnectToServerPanel.java +++ b/src/main/java/gui/src/panels/ConnectToServerPanel/ConnectToServerPanel.java @@ -4,22 +4,9 @@ */ package gui.src.panels.ConnectToServerPanel; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; -import java.util.Queue; +import java.awt.*; -import javax.swing.ButtonGroup; -import javax.swing.JButton; -import javax.swing.JPanel; -import javax.swing.JRadioButton; -import javax.swing.JTextField; - -import data.src.ControllerToView.ControllerToViewData; -import data.src.ControllerToView.ControllerToViewData.ControllerEvent; -import data.src.ViewToController.ViewToControllerData; - -import javax.swing.JLabel; +import javax.swing.*; import gui.src.constants.GUIConstants.Languages; import gui.src.constants.GUIConstants.Theme; @@ -28,22 +15,23 @@ import gui.src.interfaces.Themeable; import gui.src.interfaces.Translateable; public final class ConnectToServerPanel extends JPanel implements Themeable, Translateable { + private String serverCertStoreFilePath; private static ConnectToServerPanel instance; - private static Queue controllerToViewQueue; - private static Queue viewToControllerQueue; - private JLabel mainMessageLabel; private JLabel ipAddressLabel; private JLabel portLabel; + private JLabel serverCertStoreLabel; + private JLabel serverCertStorePasswordLabel; private JRadioButton[] ipVersionRadioButtons; - private ButtonGroup ipVersionRadioButtonsGroup; private JTextField ipAddressTextField; private JTextField portTextField; + private JTextField trustStorePasswordTextField; private JButton connectButton; + private JButton trustStoreFileChooserButton; private final String[] translationsDE = { "Verbinden Sie sich mit dem Server", @@ -51,6 +39,9 @@ public final class ConnectToServerPanel extends JPanel implements Themeable, Tra "IPv6", "IP Adresse", "Port", + "Waehlen Sie den Trust Store, welcher das Server-Zertifikat enthaelt.", + "Datei waehlen", + "Trust Store Passwort", "Verbinden" }; private final String[] translationsEN = { @@ -59,6 +50,9 @@ public final class ConnectToServerPanel extends JPanel implements Themeable, Tra "IPv6", "IP address", "Port", + "Select the trust store, which contains the server certificate", + "Choose file", + "Trust store password", "Connect" }; @@ -80,22 +74,39 @@ public final class ConnectToServerPanel extends JPanel implements Themeable, Tra */ private void createComponents() { this.createMainMessageLabel(); + this.createIPVersionRadioButtons(); this.createIPAddressLabel(); this.createIPAddressTextField(); + this.createPortLabel(); this.createPortTextField(); + + this.createServerCertStoreLabel(); + this.createServerCertStoreFileChooserButton(); + this.createTrustStorePasswordLabel(); + this.createTrustStorePasswordTextField(); + this.createConnectButton(); } private void addComponents() { this.setLayout(new GridBagLayout()); + this.addMainMessageLabel(); + this.addIPVersionRadioButtons(); this.addIPAddressLabel(); this.addIPAddressTextField(); + this.addPortLabel(); this.addPortTextField(); + + this.addServerCertStoreLabel(); + this.addServerCertStoreFileChooserButton(); + this.addTrustStorePasswordLabel(); + this.addTrustStorePasswordTextField(); + this.addConnectButton(); } @@ -110,20 +121,20 @@ public final class ConnectToServerPanel extends JPanel implements Themeable, Tra gridBagConstraints.gridy = 0; gridBagConstraints.weightx = 1; gridBagConstraints.weighty = 1; - gridBagConstraints.insets = new Insets(0, 0, 0, 0); + gridBagConstraints.insets = new Insets(0, 0, 10, 0); this.add(this.mainMessageLabel, gridBagConstraints); } private void createIPVersionRadioButtons() { - this.ipVersionRadioButtonsGroup = new ButtonGroup(); + ButtonGroup ipVersionRadioButtonsGroup = new ButtonGroup(); this.ipVersionRadioButtons = new JRadioButton[2]; this.ipVersionRadioButtons[0] = new JRadioButton(); this.ipVersionRadioButtons[1] = new JRadioButton(); - this.ipVersionRadioButtonsGroup.add(this.ipVersionRadioButtons[0]); - this.ipVersionRadioButtonsGroup.add(this.ipVersionRadioButtons[1]); + ipVersionRadioButtonsGroup.add(this.ipVersionRadioButtons[0]); + ipVersionRadioButtonsGroup.add(this.ipVersionRadioButtons[1]); this.ipVersionRadioButtons[0].setSelected(true); } @@ -152,7 +163,7 @@ public final class ConnectToServerPanel extends JPanel implements Themeable, Tra gridBagConstraints.gridy = 3; gridBagConstraints.weightx = 1; gridBagConstraints.weighty = 1; - gridBagConstraints.insets = new Insets(0, 0, 0, 0); + gridBagConstraints.insets = new Insets(10, 0, 0, 0); this.add(this.ipAddressLabel, gridBagConstraints); } @@ -201,19 +212,78 @@ public final class ConnectToServerPanel extends JPanel implements Themeable, Tra this.add(this.portTextField, gridBagConstraints); } - private void createConnectButton() { - this.connectButton = new JButton(); - this.connectButton.addActionListener(new ConnectToServerButtonListener(this.ipAddressTextField, this.portTextField)); + private void createServerCertStoreLabel() { + this.serverCertStoreLabel = new JLabel(); } - private void addConnectButton() { + private void addServerCertStoreLabel() { GridBagConstraints gridBagConstraints = new GridBagConstraints(); gridBagConstraints.anchor = GridBagConstraints.NORTHWEST; gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 7; gridBagConstraints.weightx = 1; gridBagConstraints.weighty = 1; + gridBagConstraints.insets = new Insets(10, 0, 0, 0); + this.add(this.serverCertStoreLabel, gridBagConstraints); + } + + private void createServerCertStoreFileChooserButton() { + this.trustStoreFileChooserButton = new TrustStoreButton(); + } + + private void addServerCertStoreFileChooserButton() { + GridBagConstraints gridBagConstraints = new GridBagConstraints(); + gridBagConstraints.anchor = GridBagConstraints.NORTHWEST; + gridBagConstraints.gridx = 0; + gridBagConstraints.gridy = 8; + gridBagConstraints.weightx = 1; + gridBagConstraints.weighty = 1; + gridBagConstraints.insets = new Insets(10, 0, 0, 0); + this.add(this.trustStoreFileChooserButton, gridBagConstraints); + } + + private void createTrustStorePasswordLabel() { + this.serverCertStorePasswordLabel = new JLabel(); + } + + private void addTrustStorePasswordLabel() { + GridBagConstraints gridBagConstraints = new GridBagConstraints(); + gridBagConstraints.anchor = GridBagConstraints.NORTHWEST; + gridBagConstraints.gridx = 0; + gridBagConstraints.gridy = 9; + gridBagConstraints.weightx = 1; + gridBagConstraints.weighty = 1; + gridBagConstraints.insets = new Insets(10, 0, 0, 0); + this.add(this.serverCertStorePasswordLabel, gridBagConstraints); + } + + private void createTrustStorePasswordTextField() { + this.trustStorePasswordTextField = new JPasswordField(24); + } + + private void addTrustStorePasswordTextField() { + GridBagConstraints gridBagConstraints = new GridBagConstraints(); + gridBagConstraints.anchor = GridBagConstraints.NORTHWEST; + gridBagConstraints.gridx = 0; + gridBagConstraints.gridy = 10; + gridBagConstraints.weightx = 1; + gridBagConstraints.weighty = 1; gridBagConstraints.insets = new Insets(0, 0, 0, 0); + this.add(this.trustStorePasswordTextField, gridBagConstraints); + } + + private void createConnectButton() { + this.connectButton = new ConnectToServerButton(this.ipAddressTextField, this.portTextField, this.trustStorePasswordTextField); + } + + private void addConnectButton() { + GridBagConstraints gridBagConstraints = new GridBagConstraints(); + gridBagConstraints.anchor = GridBagConstraints.NORTHWEST; + gridBagConstraints.gridx = 0; + gridBagConstraints.gridy = 11; + gridBagConstraints.weightx = 1; + gridBagConstraints.weighty = 1; + gridBagConstraints.insets = new Insets(10, 0, 0, 0); this.add(this.connectButton, gridBagConstraints); } @@ -249,6 +319,9 @@ public final class ConnectToServerPanel extends JPanel implements Themeable, Tra changeLanguageIPAddressLabel(language); changeLanguagePortLabel(language); changeLanguageConnectButton(language); + changeLanguageServerCertStoreLabel(language); + changeLanguageTrustStoreFileChooserButton(language); + changeLanguageServerCertStorePasswordLabel(language); } /** @@ -334,14 +407,14 @@ public final class ConnectToServerPanel extends JPanel implements Themeable, Tra } } - private void changeLanguageConnectButton(Languages language) { + private void changeLanguageServerCertStoreLabel(Languages language) { try { switch (language) { case German: { - this.connectButton.setText(translationsDE[5]); + this.serverCertStoreLabel.setText(translationsDE[5]); }break; case English: { - this.connectButton.setText(translationsEN[5]); + this.serverCertStoreLabel.setText(translationsEN[5]); }break; default: { throw new Exception("Unknown kind of language."); @@ -353,29 +426,88 @@ public final class ConnectToServerPanel extends JPanel implements Themeable, Tra } } - public static void setControllerToViewQueue(Queue newControllerToViewQueue) { - controllerToViewQueue = newControllerToViewQueue; + private void changeLanguageTrustStoreFileChooserButton(Languages language) { + try { + switch (language) { + case German: { + this.trustStoreFileChooserButton.setText(translationsDE[6]); + }break; + case English: { + this.trustStoreFileChooserButton.setText(translationsEN[6]); + }break; + default: { + throw new Exception("Unknown kind of language."); + } + } + } catch (Exception e) { + System.err.println(e.getMessage()); + this.changeLanguagePortLabel(Languages.German); + } } - public static void setViewToControllerQueue(Queue newViewToControllerQueue) { - viewToControllerQueue = newViewToControllerQueue; + private void changeLanguageServerCertStorePasswordLabel(Languages language) { + try { + switch (language) { + case German: { + this.serverCertStorePasswordLabel.setText(translationsDE[7]); + }break; + case English: { + this.serverCertStorePasswordLabel.setText(translationsEN[7]); + }break; + default: { + throw new Exception("Unknown kind of language."); + } + } + } catch (Exception e) { + System.err.println(e.getMessage()); + this.changeLanguagePortLabel(Languages.German); + } + } + + private void changeLanguageConnectButton(Languages language) { + try { + switch (language) { + case German: { + this.connectButton.setText(translationsDE[8]); + }break; + case English: { + this.connectButton.setText(translationsEN[8]); + }break; + default: { + throw new Exception("Unknown kind of language."); + } + } + } catch (Exception e) { + System.err.println(e.getMessage()); + this.changeLanguagePortLabel(Languages.German); + } + } + + public void setServerCertStoreFilePath(String serverCertStoreFilePath) { + this.serverCertStoreFilePath = serverCertStoreFilePath; + } + + public String getServerCertStoreFilePath() { + return serverCertStoreFilePath; } public void enableFields() { - for (JRadioButton radioButton : ipVersionRadioButtons) { + for (JRadioButton radioButton : this.ipVersionRadioButtons) { radioButton.setEnabled(true); } - ipAddressTextField.setEditable(true); - portTextField.setEditable(true); - connectButton.setEnabled(true); + this.ipAddressTextField.setEditable(true); + this.portTextField.setEditable(true); + this.trustStorePasswordTextField.setEditable(true); + this.connectButton.setEnabled(true); } public void disableFields() { - for (JRadioButton radioButton : ipVersionRadioButtons) { + for (JRadioButton radioButton : this.ipVersionRadioButtons) { radioButton.setEnabled(false); } - ipAddressTextField.setEditable(false); - portTextField.setEditable(false); - connectButton.setEnabled(false); + this.ipAddressTextField.setEditable(false); + this.portTextField.setEditable(false); + this.trustStorePasswordTextField.setEditable(false); + this.connectButton.setEnabled(false); } } diff --git a/src/main/java/gui/src/panels/ConnectToServerPanel/TrustStoreButton.java b/src/main/java/gui/src/panels/ConnectToServerPanel/TrustStoreButton.java new file mode 100644 index 0000000..d75548b --- /dev/null +++ b/src/main/java/gui/src/panels/ConnectToServerPanel/TrustStoreButton.java @@ -0,0 +1,32 @@ +/** + * @author Aaron Moser + * @date 09.12.2023 + */ +package gui.src.panels.ConnectToServerPanel; + +import javax.swing.JButton; +import javax.swing.JFileChooser; + +import javax.swing.filechooser.FileSystemView; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +public class TrustStoreButton extends JButton implements ActionListener { + + public TrustStoreButton() { + this.addActionListener(this); + } + + @Override + public void actionPerformed(ActionEvent e) { + JFileChooser fileChooser = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory()); + + int fileChooserOption = fileChooser.showSaveDialog(null); + + // if the user selects a file + if (fileChooserOption == JFileChooser.APPROVE_OPTION) { + ConnectToServerPanel.getInstance().setServerCertStoreFilePath(fileChooser.getSelectedFile().getAbsolutePath()); + } + } +}