diff --git a/src/main/java/vslab1/src/Input/Commands/ECommandType.java b/src/main/java/vslab1/src/Input/Commands/ECommandType.java new file mode 100644 index 0000000..1fc5db5 --- /dev/null +++ b/src/main/java/vslab1/src/Input/Commands/ECommandType.java @@ -0,0 +1,14 @@ +/** + * @author Aaron Moser + */ +package vslab1.src.Input.Commands; + +public enum ECommandType { + Exit, + ShowNodes, + ShowFiles, + PublishFile, + GetFile, + AddPeer, + Help +} diff --git a/src/main/java/vslab1/src/Input/Commands/ExecutableCommand.java b/src/main/java/vslab1/src/Input/Commands/ExecutableCommand.java new file mode 100644 index 0000000..d0619c1 --- /dev/null +++ b/src/main/java/vslab1/src/Input/Commands/ExecutableCommand.java @@ -0,0 +1,10 @@ +/** + * @author Aaron Moser + */ +package vslab1.src.Input.Commands; + +public interface ExecutableCommand { + public String toString(); + public ECommandType getType(); + public void execute(); +} diff --git a/src/main/java/vslab1/src/Input/Commands/ExitCommand.java b/src/main/java/vslab1/src/Input/Commands/ExitCommand.java new file mode 100644 index 0000000..af165f7 --- /dev/null +++ b/src/main/java/vslab1/src/Input/Commands/ExitCommand.java @@ -0,0 +1,24 @@ +/** + * @author Aaron Moser + */ +package vslab1.src.Input.Commands; + +import vslab1.src.Terminatable; + +public record ExitCommand(Terminatable[] threadsToTerminate) implements ExecutableCommand { + + @Override + public ECommandType getType() { + return ECommandType.Exit; + } + + @Override + public void execute() { + for (Terminatable thread : threadsToTerminate) { + if (thread != null) { + thread.terminate(); + } + } + } + +} diff --git a/src/main/java/vslab1/src/Input/InputThread.java b/src/main/java/vslab1/src/Input/InputThread.java index 912cd9d..b5378a5 100644 --- a/src/main/java/vslab1/src/Input/InputThread.java +++ b/src/main/java/vslab1/src/Input/InputThread.java @@ -7,6 +7,7 @@ package vslab1.src.Input; import vslab1.src.Terminatable; import vslab1.src.FileReaderWriter.FileReaderWriter; import vslab1.src.FileReaderWriter.FileReaderWriter.EUpdateFlag; +import vslab1.src.Input.Commands.ExitCommand; import vslab1.src.Peers.EOnlineState; import vslab1.src.Peers.Peer; import vslab1.src.Sending.SendingQueue; @@ -20,6 +21,8 @@ import java.io.File; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.LinkedList; import java.util.List; import java.util.Scanner; @@ -64,7 +67,9 @@ public class InputThread extends Thread implements Terminatable { String command = inputArgs[0]; switch (command) { - case "exit": { + case "Exit": { + Terminatable[] threadsArray = {senderThread, receiverThread, requestExecuterThread, timeoutThread, this}; + new ExitCommand(null).execute(); // Terminates sender thread, receiver thread and this thread. if (senderThread != null) { senderThread.terminate(); @@ -175,13 +180,20 @@ public class InputThread extends Thread implements Terminatable { FileReaderWriter.getThisPeer(EUpdateFlag.Update); } }break; + case "Help": { + if (inputArgs.length > 1) { + System.err.println("Too many arguments."); + } else { + + } + }break; default: { System.err.println("Unknown command."); }break; } } } catch (Exception e) { - + } } } diff --git a/src/main/java/vslab1/src/Main.java b/src/main/java/vslab1/src/Main.java index 6db54b2..e2fb869 100644 --- a/src/main/java/vslab1/src/Main.java +++ b/src/main/java/vslab1/src/Main.java @@ -18,6 +18,7 @@ import vslab1.src.Sending.SenderThread; import vslab1.src.Sending.SendingQueue; import vslab1.src.Timeout.JobList; import vslab1.src.Timeout.TimeoutThread; +import vslab1.src.View.MainFrame; public class Main { public static void main(String[] args) { @@ -25,6 +26,8 @@ public class Main { FileReaderWriter.createInfoFilesIfNotExisting(Constants.PEERCONFIGFILEPATH); + MainFrame frame = new MainFrame(); + DatagramSocket datagramSocket = NetworkController.getSocket(inputScanner); SendingQueue sendingQueue = new SendingQueue(); diff --git a/src/main/java/vslab1/src/View/ColorTheme/EColorTheme.java b/src/main/java/vslab1/src/View/ColorTheme/EColorTheme.java new file mode 100644 index 0000000..e9d1780 --- /dev/null +++ b/src/main/java/vslab1/src/View/ColorTheme/EColorTheme.java @@ -0,0 +1,9 @@ +/** + * @author Aaron Moser + */ +package vslab1.src.View.ColorTheme; + +public enum EColorTheme { + Light, + Dark, +} diff --git a/src/main/java/vslab1/src/View/Language/Constants/LanguageConstants.java b/src/main/java/vslab1/src/View/Language/Constants/LanguageConstants.java new file mode 100644 index 0000000..86e3c72 --- /dev/null +++ b/src/main/java/vslab1/src/View/Language/Constants/LanguageConstants.java @@ -0,0 +1,10 @@ +package vslab1.src.View.Language.Constants; + +public class LanguageConstants { + public final static String[] titleStrings = { + "Peer to Peer Dateifreigabe", + "Peer to Peer Filesharing" + }; + + +} \ No newline at end of file diff --git a/src/main/java/vslab1/src/View/Language/ELanguage.java b/src/main/java/vslab1/src/View/Language/ELanguage.java new file mode 100644 index 0000000..79742ef --- /dev/null +++ b/src/main/java/vslab1/src/View/Language/ELanguage.java @@ -0,0 +1,9 @@ +/** + * @author Aaron Moser + */ +package vslab1.src.View.Language; + +public enum ELanguage { + German, + English, +} diff --git a/src/main/java/vslab1/src/View/MainFrame.java b/src/main/java/vslab1/src/View/MainFrame.java new file mode 100644 index 0000000..e80a6a7 --- /dev/null +++ b/src/main/java/vslab1/src/View/MainFrame.java @@ -0,0 +1,49 @@ +/** + * @author Aaron Moser + */ +package vslab1.src.View; + +import java.awt.Dimension; +import java.awt.GridBagLayout; + +import javax.swing.JFrame; + +import vslab1.src.View.Language.ELanguage; +import vslab1.src.View.Panels.EPanelType; +import vslab1.src.View.Panels.PanelOrganizer; +import vslab1.src.View.Panels.StartPanel.StartPanel; + +public class MainFrame extends JFrame { + + private Settings settings = null; + + private PanelOrganizer panelOrganizer = null; + + public MainFrame() { + this.settings = new Settings(ELanguage.English); + + this.panelOrganizer = new PanelOrganizer(new StartPanel(settings)); + + this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + this.setTitle("Peer to Peer Filesharing"); + //this.setLocation(null); + + this.setMainPanelTo(EPanelType.StartPanel); + } + + public void setMainPanelTo(EPanelType panelType) { + switch (panelType) { + case StartPanel: { + this.getContentPane().removeAll(); + this.getContentPane().add(panelOrganizer.startPanel()); + }break; + default: { + System.err.println("setMainPanelTo was called with unknown panel type."); + return; + } + } + this.setSize(new Dimension(1400, 700)); + this.update(getGraphics()); + this.setVisible(true); + } +} diff --git a/src/main/java/vslab1/src/View/Panels/EPanelType.java b/src/main/java/vslab1/src/View/Panels/EPanelType.java new file mode 100644 index 0000000..b84f84e --- /dev/null +++ b/src/main/java/vslab1/src/View/Panels/EPanelType.java @@ -0,0 +1,8 @@ +/** + * @author Aaron Moser + */ +package vslab1.src.View.Panels; + +public enum EPanelType { + StartPanel, +} diff --git a/src/main/java/vslab1/src/View/Panels/Panel.java b/src/main/java/vslab1/src/View/Panels/Panel.java new file mode 100644 index 0000000..04a74e4 --- /dev/null +++ b/src/main/java/vslab1/src/View/Panels/Panel.java @@ -0,0 +1,9 @@ +/** + * @author Aaron Moser + */ +package vslab1.src.View.Panels; + +public interface Panel { + public void updateLanguage(); + public void updateColorTheme(); +} diff --git a/src/main/java/vslab1/src/View/Panels/PanelOrganizer.java b/src/main/java/vslab1/src/View/Panels/PanelOrganizer.java new file mode 100644 index 0000000..26fb8cd --- /dev/null +++ b/src/main/java/vslab1/src/View/Panels/PanelOrganizer.java @@ -0,0 +1,28 @@ +/** + * @author Aaron Moser + */ +package vslab1.src.View.Panels; + +import vslab1.src.View.ColorTheme.EColorTheme; +import vslab1.src.View.Panels.StartPanel.StartPanel; + +public record PanelOrganizer(StartPanel startPanel) { + public Panel getPanelInstance(EPanelType panelType) { + switch (panelType) { + case StartPanel: { + return startPanel; + } + default: { + return null; + } + } + } + + public void updateLanguage() { + startPanel.updateLanguage(); + } + + public void updateColorTheme() { + startPanel.updateColorTheme(); + } +} diff --git a/src/main/java/vslab1/src/View/Panels/StartPanel/StartPanel.java b/src/main/java/vslab1/src/View/Panels/StartPanel/StartPanel.java new file mode 100644 index 0000000..2b1aba7 --- /dev/null +++ b/src/main/java/vslab1/src/View/Panels/StartPanel/StartPanel.java @@ -0,0 +1,119 @@ +/** + * @author Aaron Moser + */ +package vslab1.src.View.Panels.StartPanel; + +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.JButton; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JTextField; + +import vslab1.src.View.Settings; +import vslab1.src.View.Panels.Panel; + +public class StartPanel extends JPanel implements Panel { + + private Settings settings = null; + + private JLabel ipLabel = null; + private JLabel portLabel = null; + + private JTextField ipTextField = null; + private JTextField portTextField = null; + + private JButton submitButton = null; + + public StartPanel(Settings settings) { + this.settings = settings; + build(); + } + + @Override + public void updateLanguage() { + if (ipLabel != null) { + ipLabel.setText(StartPanelLanguageConstants.ipLabelStrings[settings.getActiveLanguageOrdinal()]); + } + if (portLabel != null) { + portLabel.setText(StartPanelLanguageConstants.portLabelStrings[settings.getActiveLanguageOrdinal()]); + } + } + + @Override + public void updateColorTheme() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'changeColorTheme'"); + } + + private void build() { + this.setLayout(new GridBagLayout()); + addIPLabel(0,0); + addIPTextField(1,0); + addPortLabel(2,0); + addPortTextField(3,0); + addSubmitButton(4, 0); + } + + private void addIPLabel(int row, int column) { + ipLabel = new JLabel(StartPanelLanguageConstants.ipLabelStrings[settings.getActiveLanguageOrdinal()]); + + GridBagConstraints ipLabelConstraints = new GridBagConstraints(); + ipLabelConstraints.gridx = column; + ipLabelConstraints.gridy = row; + ipLabelConstraints.anchor = GridBagConstraints.NORTHWEST; + this.add(ipLabel, ipLabelConstraints); + } + + private void addIPTextField(int row, int column) { + ipTextField = new JTextField(20); + + GridBagConstraints ipTextFieldConstraints = new GridBagConstraints(); + ipTextFieldConstraints.gridx = column; + ipTextFieldConstraints.gridy = row; + ipTextFieldConstraints.anchor = GridBagConstraints.NORTHWEST; + this.add(ipTextField, ipTextFieldConstraints); + } + + private void addPortLabel(int row, int column) { + portLabel = new JLabel(StartPanelLanguageConstants.portLabelStrings[settings.getActiveLanguageOrdinal()]); + + GridBagConstraints portLabelConstraints = new GridBagConstraints(); + portLabelConstraints.gridx = column; + portLabelConstraints.gridy = row; + portLabelConstraints.anchor = GridBagConstraints.NORTHWEST; + this.add(portLabel, portLabelConstraints); + } + + private void addPortTextField(int row, int column) { + portTextField = new JTextField(20); + + GridBagConstraints portTextFieldConstraints = new GridBagConstraints(); + portTextFieldConstraints.gridx = column; + portTextFieldConstraints.gridy = row; + portTextFieldConstraints.anchor = GridBagConstraints.NORTHWEST; + this.add(portTextField, portTextFieldConstraints); + } + + private void addSubmitButton(int row, int column) { + submitButton = new JButton(StartPanelLanguageConstants.submitButtonStrings[settings.getActiveLanguageOrdinal()]); + + submitButton.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + + } + + }); + + GridBagConstraints submitButtonConstraints = new GridBagConstraints(); + submitButtonConstraints.gridx = column; + submitButtonConstraints.gridy = row; + submitButtonConstraints.anchor = GridBagConstraints.NORTHWEST; + this.add(submitButton, submitButtonConstraints); + } +} diff --git a/src/main/java/vslab1/src/View/Panels/StartPanel/StartPanelLanguageConstants.java b/src/main/java/vslab1/src/View/Panels/StartPanel/StartPanelLanguageConstants.java new file mode 100644 index 0000000..49d854f --- /dev/null +++ b/src/main/java/vslab1/src/View/Panels/StartPanel/StartPanelLanguageConstants.java @@ -0,0 +1,18 @@ +package vslab1.src.View.Panels.StartPanel; + +public class StartPanelLanguageConstants { + public final static String[] ipLabelStrings = { + "IP Adresse eingeben:", + "Enter IP address:" + }; + + public final static String[] portLabelStrings = { + "Port eingeben:", + "Enter port:" + }; + + public final static String[] submitButtonStrings = { + "Peer starten", + "Start peer" + }; +} diff --git a/src/main/java/vslab1/src/View/Settings.java b/src/main/java/vslab1/src/View/Settings.java new file mode 100644 index 0000000..d803b7c --- /dev/null +++ b/src/main/java/vslab1/src/View/Settings.java @@ -0,0 +1,23 @@ +package vslab1.src.View; + +import vslab1.src.View.Language.ELanguage; + +public class Settings { + private ELanguage activeLanguage = ELanguage.English; + + public Settings(ELanguage initLanguage) { + activeLanguage = initLanguage; + } + + public ELanguage getActiveLanguage() { + return activeLanguage; + } + + public void setActiveLanguage(ELanguage language) { + this.activeLanguage = language; + } + + public int getActiveLanguageOrdinal() { + return activeLanguage.ordinal(); + } +}