From 0267961eff954c06d58bcde501c7ded7ba499b8b Mon Sep 17 00:00:00 2001 From: Kristian Knarvik Date: Mon, 29 Jan 2018 20:14:17 +0100 Subject: [PATCH] Servers can now be removed --- src/Main.java | 5 +- .../serverlauncher/profile/Profile.java | 11 ++ .../serverlauncher/server/Server.java | 2 +- .../serverlauncher/userinterface/GUI.java | 156 +++++++++--------- .../userinterface/ServerTab.java | 108 ++++++++++++ 5 files changed, 203 insertions(+), 79 deletions(-) create mode 100644 src/net/knarcraft/serverlauncher/userinterface/ServerTab.java diff --git a/src/Main.java b/src/Main.java index c0234ed..7a4a5ae 100644 --- a/src/Main.java +++ b/src/Main.java @@ -1,10 +1,10 @@ import net.knarcraft.serverlauncher.profile.Profile; -import net.knarcraft.serverlauncher.server.*; +import net.knarcraft.serverlauncher.server.ServerType; import net.knarcraft.serverlauncher.userinterface.GUI; import javax.naming.ConfigurationException; import java.awt.*; -//Java 9 required. +//Java 8 required. /** * A software for managing Minecraft servers. @@ -35,5 +35,4 @@ class Main { System.exit(1); } } - // TODO: Add gui functionality } \ No newline at end of file diff --git a/src/net/knarcraft/serverlauncher/profile/Profile.java b/src/net/knarcraft/serverlauncher/profile/Profile.java index 41eacab..221f3af 100644 --- a/src/net/knarcraft/serverlauncher/profile/Profile.java +++ b/src/net/knarcraft/serverlauncher/profile/Profile.java @@ -5,6 +5,13 @@ import net.knarcraft.serverlauncher.userinterface.GUI; import java.util.ArrayList; +/** + * Contains all user settings + * + * @author Kristian Knarvik + * @version 0.0.0.1 + * @since 0.0.0.1 + */ public class Profile { private static final GUI gui = Server.getGUI(); private static final ArrayList profiles = new ArrayList<>(); @@ -27,6 +34,10 @@ public class Profile { this.servers.add(server); } + public void removeServer(int i) { + servers.remove(i); + } + public ArrayList getServers() { return this.servers; } diff --git a/src/net/knarcraft/serverlauncher/server/Server.java b/src/net/knarcraft/serverlauncher/server/Server.java index 37924b8..5010af3 100644 --- a/src/net/knarcraft/serverlauncher/server/Server.java +++ b/src/net/knarcraft/serverlauncher/server/Server.java @@ -41,7 +41,7 @@ public class Server { this.maxRam = ramList[0]; this.process = null; gui.currentProfile().addServer(this); - window.addServer(name, this); + window.addServer(name); } public void addPlayer(String name) { diff --git a/src/net/knarcraft/serverlauncher/userinterface/GUI.java b/src/net/knarcraft/serverlauncher/userinterface/GUI.java index d5766f7..49a67e8 100644 --- a/src/net/knarcraft/serverlauncher/userinterface/GUI.java +++ b/src/net/knarcraft/serverlauncher/userinterface/GUI.java @@ -7,12 +7,22 @@ import net.knarcraft.serverlauncher.profile.Profile; import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; import java.io.*; import java.net.URI; import java.net.URISyntaxException; +import java.util.ArrayList; import java.util.Objects; import java.util.Scanner; +/** + * Generates a GUI + * + * @author Kristian Knarvik + * @version 0.0.0.1 + * @since 0.0.0.1 + */ public class GUI implements ActionListener { private JFrame frame; @@ -40,6 +50,8 @@ public class GUI implements ActionListener { private JTabbedPane serversPane; + private ArrayList serverTabs = new ArrayList<>(); + /** * Create the application. */ @@ -77,6 +89,24 @@ public class GUI implements ActionListener { return null; } + /** + * Removes a server's tab, removes it from the list of tabs, and removes the server from Profile.java + * + * @param tab The current tab object + */ + public void removeServer(ServerTab tab) { + for (int i = 0; i < this.serverTabs.size(); i++) { + System.out.println(this.serverTabs.get(i)); + if(this.serverTabs.get(i) == tab) { + serversPane.remove(i); + currentProfile().removeServer(i); + this.serverTabs.remove(i); + i = serverTabs.size(); + } + } + + } + /** * Initialize the contents of the frame. */ @@ -89,9 +119,16 @@ public class GUI implements ActionListener { frame = new JFrame(); frame.setBounds(100, 100, 398, 219); - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); frame.setResizable(false); + frame.addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent e) { + save(); + stop(); + } + }); + JMenuBar menuBar = new JMenuBar(); frame.setJMenuBar(menuBar); @@ -334,80 +371,8 @@ public class GUI implements ActionListener { frame.setVisible(true); } - public void addServer(String name, Server server) { - JPanel panel = new JPanel(); - this.serversPane.addTab(name, null, panel, null); - SpringLayout sl_panel_3 = new SpringLayout(); - panel.setLayout(sl_panel_3); - - JLabel lblServerType = new JLabel("Server type"); - sl_panel_3.putConstraint(SpringLayout.NORTH, lblServerType, 10, SpringLayout.NORTH, panel); - sl_panel_3.putConstraint(SpringLayout.WEST, lblServerType, 10, SpringLayout.WEST, panel); - sl_panel_3.putConstraint(SpringLayout.SOUTH, lblServerType, 30, SpringLayout.NORTH, panel); - panel.add(lblServerType); - - JComboBox comboBox_3 = new JComboBox<>(ServerType.getTypeNames()); - sl_panel_3.putConstraint(SpringLayout.NORTH, comboBox_3, 10, SpringLayout.NORTH, panel); - sl_panel_3.putConstraint(SpringLayout.WEST, comboBox_3, 16, SpringLayout.EAST, lblServerType); - panel.add(comboBox_3); - - JLabel lblServerVersion = new JLabel("Server version"); - sl_panel_3.putConstraint(SpringLayout.NORTH, lblServerVersion, 6, SpringLayout.SOUTH, lblServerType); - sl_panel_3.putConstraint(SpringLayout.WEST, lblServerVersion, 10, SpringLayout.WEST, panel); - sl_panel_3.putConstraint(SpringLayout.SOUTH, lblServerVersion, 26, SpringLayout.SOUTH, lblServerType); - panel.add(lblServerVersion); - - JComboBox comboBox_4 = new JComboBox<>(ServerType.getServerTypes().get(0).getVersions()); - sl_panel_3.putConstraint(SpringLayout.NORTH, comboBox_4, 6, SpringLayout.SOUTH, comboBox_3); - sl_panel_3.putConstraint(SpringLayout.WEST, comboBox_4, 0, SpringLayout.WEST, comboBox_3); - panel.add(comboBox_4); - - JLabel lblMaxRam = new JLabel("Max ram"); - sl_panel_3.putConstraint(SpringLayout.EAST, comboBox_3, -13, SpringLayout.WEST, lblMaxRam); - sl_panel_3.putConstraint(SpringLayout.NORTH, lblMaxRam, 10, SpringLayout.NORTH, panel); - sl_panel_3.putConstraint(SpringLayout.SOUTH, lblMaxRam, -92, SpringLayout.SOUTH, panel); - sl_panel_3.putConstraint(SpringLayout.EAST, lblMaxRam, -111, SpringLayout.EAST, panel); - panel.add(lblMaxRam); - - JComboBox comboBox_5 = new JComboBox<>(Server.getRamList()); - sl_panel_3.putConstraint(SpringLayout.NORTH, comboBox_5, 10, SpringLayout.NORTH, panel); - sl_panel_3.putConstraint(SpringLayout.WEST, comboBox_5, 6, SpringLayout.EAST, lblMaxRam); - sl_panel_3.putConstraint(SpringLayout.EAST, comboBox_5, 86, SpringLayout.EAST, lblMaxRam); - panel.add(comboBox_5); - - JCheckBox chckbxEnabled = new JCheckBox("Enabled"); - sl_panel_3.putConstraint(SpringLayout.NORTH, chckbxEnabled, 6, SpringLayout.SOUTH, lblServerVersion); - sl_panel_3.putConstraint(SpringLayout.EAST, chckbxEnabled, 0, SpringLayout.EAST, lblServerType); - panel.add(chckbxEnabled); - - JButton btnRemoveServer = new JButton("Remove server"); - sl_panel_3.putConstraint(SpringLayout.NORTH, btnRemoveServer, 5, SpringLayout.SOUTH, lblMaxRam); - sl_panel_3.putConstraint(SpringLayout.SOUTH, btnRemoveServer, -64, SpringLayout.SOUTH, panel); - sl_panel_3.putConstraint(SpringLayout.SOUTH, comboBox_5, -5, SpringLayout.NORTH, btnRemoveServer); - sl_panel_3.putConstraint(SpringLayout.EAST, comboBox_4, -13, SpringLayout.WEST, btnRemoveServer); - sl_panel_3.putConstraint(SpringLayout.WEST, btnRemoveServer, 239, SpringLayout.WEST, panel); - sl_panel_3.putConstraint(SpringLayout.EAST, btnRemoveServer, 0, SpringLayout.EAST, comboBox_5); - panel.add(btnRemoveServer); - - JLabel lblDirectory = new JLabel("Directory"); - sl_panel_3.putConstraint(SpringLayout.NORTH, lblDirectory, 1, SpringLayout.NORTH, chckbxEnabled); - sl_panel_3.putConstraint(SpringLayout.SOUTH, lblDirectory, 0, SpringLayout.SOUTH, chckbxEnabled); - panel.add(lblDirectory); - - JTextField textField_1 = new JTextField(); - sl_panel_3.putConstraint(SpringLayout.NORTH, textField_1, 4, SpringLayout.SOUTH, btnRemoveServer); - sl_panel_3.putConstraint(SpringLayout.SOUTH, textField_1, -37, SpringLayout.SOUTH, panel); - sl_panel_3.putConstraint(SpringLayout.EAST, lblDirectory, -6, SpringLayout.WEST, textField_1); - sl_panel_3.putConstraint(SpringLayout.WEST, textField_1, 130, SpringLayout.WEST, panel); - panel.add(textField_1); - textField_1.setColumns(10); - - JButton btnBrowse = new JButton("Browse"); - sl_panel_3.putConstraint(SpringLayout.EAST, textField_1, -6, SpringLayout.WEST, btnBrowse); - sl_panel_3.putConstraint(SpringLayout.NORTH, btnBrowse, 3, SpringLayout.SOUTH, btnRemoveServer); - sl_panel_3.putConstraint(SpringLayout.WEST, btnBrowse, 293, SpringLayout.WEST, panel); - sl_panel_3.putConstraint(SpringLayout.EAST, btnBrowse, 0, SpringLayout.EAST, comboBox_5); - panel.add(btnBrowse); + public void addServer(String name) { + serverTabs.add(new ServerTab(name)); } @Override @@ -435,6 +400,7 @@ public class GUI implements ActionListener { } else if (e.getSource() == mntmStory) { goToURL("https://knarcraft.net/Bungeeminecraftserverlauncher/Story/"); } else if (e.getSource() == btnStartServer) { + save(); Server.startServers(); } else if (e.getSource() == btnStopServer) { stop(); @@ -456,8 +422,19 @@ public class GUI implements ActionListener { private JComboBox targetServer, targetPlayer; private JButton btnKick, btnBan, btnOp, btnDeop, btnCustomCommand, btnSaveserver, btnReload, btnServerConsoles; private JTextField customCommand;*/ + } + /** + * Reads all combo boxes, updates variables and saves to disk + */ + private void save() { + //TODO: Finish save + } + + /** + * Stops all servers + */ private void stop() { try { setStatus("Servers are stopping"); @@ -485,6 +462,9 @@ public class GUI implements ActionListener { } } + /** + * Saves the runInBackground setting to the current profile + */ private void background() { Object selected = profiles.getSelectedItem(); if (selected != null) { @@ -493,8 +473,16 @@ public class GUI implements ActionListener { } else { JOptionPane.showMessageDialog(null, "No profile selected", "Error", JOptionPane.ERROR_MESSAGE); } + if (chckbxmntmRunInBackground.isSelected()) { + frame.setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE); + } else { + frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); + } } + /** + * Saves the downloadJars setting to the current profile + */ private void downloadJars() { Object selected = profiles.getSelectedItem(); if (selected != null) { @@ -505,6 +493,9 @@ public class GUI implements ActionListener { } } + /** + * Copies all server directories to a folder specified by the user + */ private void backup() { JFileChooser chooser = new JFileChooser(); chooser.setCurrentDirectory(new java.io.File(".")); @@ -536,6 +527,11 @@ public class GUI implements ActionListener { } } + /** + * Opens an url in the user's default application + * + * @param url URL to open + */ private static void goToURL(String url) { java.awt.Desktop desktop = java.awt.Desktop.getDesktop(); try { @@ -545,6 +541,9 @@ public class GUI implements ActionListener { } } + /** + * Loads popup messages from a text file + */ private void loadMessages() { try (Scanner in = new Scanner(new File("config/menumsg.csv"))) { while (in.hasNextLine()) { @@ -572,6 +571,13 @@ public class GUI implements ActionListener { } } + /** + * Recursivly copies a folder to another location + * + * @param src The folder to copy + * @param dest Target destination + * @throws IOException If we can't start a file stream + */ private void copyFolder(File src, File dest) throws IOException{ if (!src.isDirectory()) { InputStream in = new FileInputStream(src); diff --git a/src/net/knarcraft/serverlauncher/userinterface/ServerTab.java b/src/net/knarcraft/serverlauncher/userinterface/ServerTab.java new file mode 100644 index 0000000..6963d93 --- /dev/null +++ b/src/net/knarcraft/serverlauncher/userinterface/ServerTab.java @@ -0,0 +1,108 @@ +package net.knarcraft.serverlauncher.userinterface; + +import net.knarcraft.serverlauncher.server.Server; +import net.knarcraft.serverlauncher.server.ServerType; + +import javax.swing.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +public class ServerTab implements ActionListener { + private JComboBox serverTypes, serverVersions, maxRam; + private JCheckBox chckbxEnabled; + private JButton btnRemoveServer, btnBrowse; + private JTextField directory; + + + public ServerTab(String name) { + JPanel panel = new JPanel(); + Server.getGUI().getPane().addTab(name, null, panel, null); + SpringLayout sl_panel_3 = new SpringLayout(); + panel.setLayout(sl_panel_3); + + JLabel lblServerType = new JLabel("Server type"); + sl_panel_3.putConstraint(SpringLayout.NORTH, lblServerType, 10, SpringLayout.NORTH, panel); + sl_panel_3.putConstraint(SpringLayout.WEST, lblServerType, 10, SpringLayout.WEST, panel); + sl_panel_3.putConstraint(SpringLayout.SOUTH, lblServerType, 30, SpringLayout.NORTH, panel); + panel.add(lblServerType); + + serverTypes = new JComboBox<>(ServerType.getTypeNames()); + sl_panel_3.putConstraint(SpringLayout.NORTH, serverTypes, 10, SpringLayout.NORTH, panel); + sl_panel_3.putConstraint(SpringLayout.WEST, serverTypes, 16, SpringLayout.EAST, lblServerType); + panel.add(serverTypes); + serverTypes.addActionListener(this); + + JLabel lblServerVersion = new JLabel("Server version"); + sl_panel_3.putConstraint(SpringLayout.NORTH, lblServerVersion, 6, SpringLayout.SOUTH, lblServerType); + sl_panel_3.putConstraint(SpringLayout.WEST, lblServerVersion, 10, SpringLayout.WEST, panel); + sl_panel_3.putConstraint(SpringLayout.SOUTH, lblServerVersion, 26, SpringLayout.SOUTH, lblServerType); + panel.add(lblServerVersion); + + serverVersions = new JComboBox<>(ServerType.getServerTypes().get(0).getVersions()); + sl_panel_3.putConstraint(SpringLayout.NORTH, serverVersions, 6, SpringLayout.SOUTH, serverTypes); + sl_panel_3.putConstraint(SpringLayout.WEST, serverVersions, 0, SpringLayout.WEST, serverTypes); + panel.add(serverVersions); + serverVersions.addActionListener(this); + + JLabel lblMaxRam = new JLabel("Max ram"); + sl_panel_3.putConstraint(SpringLayout.EAST, serverTypes, -13, SpringLayout.WEST, lblMaxRam); + sl_panel_3.putConstraint(SpringLayout.NORTH, lblMaxRam, 10, SpringLayout.NORTH, panel); + sl_panel_3.putConstraint(SpringLayout.SOUTH, lblMaxRam, -92, SpringLayout.SOUTH, panel); + sl_panel_3.putConstraint(SpringLayout.EAST, lblMaxRam, -111, SpringLayout.EAST, panel); + panel.add(lblMaxRam); + + maxRam = new JComboBox<>(Server.getRamList()); + sl_panel_3.putConstraint(SpringLayout.NORTH, maxRam, 10, SpringLayout.NORTH, panel); + sl_panel_3.putConstraint(SpringLayout.WEST, maxRam, 6, SpringLayout.EAST, lblMaxRam); + sl_panel_3.putConstraint(SpringLayout.EAST, maxRam, 86, SpringLayout.EAST, lblMaxRam); + panel.add(maxRam); + maxRam.addActionListener(this); + + chckbxEnabled = new JCheckBox("Enabled"); + sl_panel_3.putConstraint(SpringLayout.NORTH, chckbxEnabled, 6, SpringLayout.SOUTH, lblServerVersion); + sl_panel_3.putConstraint(SpringLayout.EAST, chckbxEnabled, 0, SpringLayout.EAST, lblServerType); + panel.add(chckbxEnabled); + chckbxEnabled.addActionListener(this); + + btnRemoveServer = new JButton("Remove server"); + sl_panel_3.putConstraint(SpringLayout.NORTH, btnRemoveServer, 5, SpringLayout.SOUTH, lblMaxRam); + sl_panel_3.putConstraint(SpringLayout.SOUTH, btnRemoveServer, -64, SpringLayout.SOUTH, panel); + sl_panel_3.putConstraint(SpringLayout.SOUTH, maxRam, -5, SpringLayout.NORTH, btnRemoveServer); + sl_panel_3.putConstraint(SpringLayout.EAST, serverVersions, -13, SpringLayout.WEST, btnRemoveServer); + sl_panel_3.putConstraint(SpringLayout.WEST, btnRemoveServer, 239, SpringLayout.WEST, panel); + sl_panel_3.putConstraint(SpringLayout.EAST, btnRemoveServer, 0, SpringLayout.EAST, maxRam); + panel.add(btnRemoveServer); + btnRemoveServer.addActionListener(this); + + JLabel lblDirectory = new JLabel("Directory"); + sl_panel_3.putConstraint(SpringLayout.NORTH, lblDirectory, 1, SpringLayout.NORTH, chckbxEnabled); + sl_panel_3.putConstraint(SpringLayout.SOUTH, lblDirectory, 0, SpringLayout.SOUTH, chckbxEnabled); + panel.add(lblDirectory); + + directory = new JTextField(); + sl_panel_3.putConstraint(SpringLayout.NORTH, directory, 4, SpringLayout.SOUTH, btnRemoveServer); + sl_panel_3.putConstraint(SpringLayout.SOUTH, directory, -37, SpringLayout.SOUTH, panel); + sl_panel_3.putConstraint(SpringLayout.EAST, lblDirectory, -6, SpringLayout.WEST, directory); + sl_panel_3.putConstraint(SpringLayout.WEST, directory, 130, SpringLayout.WEST, panel); + panel.add(directory); + directory.setColumns(10); + directory.addActionListener(this); + + btnBrowse = new JButton("Browse"); + sl_panel_3.putConstraint(SpringLayout.EAST, directory, -6, SpringLayout.WEST, btnBrowse); + sl_panel_3.putConstraint(SpringLayout.NORTH, btnBrowse, 3, SpringLayout.SOUTH, btnRemoveServer); + sl_panel_3.putConstraint(SpringLayout.WEST, btnBrowse, 293, SpringLayout.WEST, panel); + sl_panel_3.putConstraint(SpringLayout.EAST, btnBrowse, 0, SpringLayout.EAST, maxRam); + panel.add(btnBrowse); + btnBrowse.addActionListener(this); + } + + @Override + public void actionPerformed(ActionEvent e) { + if (e.getSource() == btnRemoveServer) { + Server.getGUI().removeServer(this); + } else if (e.getSource() == btnBrowse) { + + } + } +}