complete new node management
[jSite2.git] / src / net / pterodactylus / jsite / gui / SwingInterface.java
index eb67d27..eb5ff26 100644 (file)
@@ -26,6 +26,7 @@ import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.net.UnknownHostException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Date;
@@ -91,8 +92,8 @@ public class SwingInterface implements CoreListener, LoggingListener, PropertyCh
        /** The “quit” action. */
        private I18nAction quitAction;
 
-       /** The “manage nodes” action. */
-       private I18nAction manageNodesAction;
+       /** The “add node” action. */
+       private I18nAction addNodeAction;
 
        /** All node menu items. */
        private Map<Node, I18nAction> nodeConnectActions = Collections.synchronizedMap(new HashMap<Node, I18nAction>());
@@ -100,8 +101,11 @@ public class SwingInterface implements CoreListener, LoggingListener, PropertyCh
        /** All node disconnect actions. */
        private Map<Node, I18nAction> nodeDisconnectActions = Collections.synchronizedMap(new HashMap<Node, I18nAction>());
 
-       /** The node manager dialog. */
-       private ManageNodesDialog manageNodesDialog;
+       /** All node edit actions. */
+       private Map<Node, I18nAction> nodeEditActions = Collections.synchronizedMap(new HashMap<Node, I18nAction>());
+
+       /** All node removal actions. */
+       private Map<Node, I18nAction> nodeDeleteActions = Collections.synchronizedMap(new HashMap<Node, I18nAction>());
 
        /** All lanugage menu items. */
        private List<I18nAction> languageActions = new ArrayList<I18nAction>();
@@ -124,6 +128,9 @@ public class SwingInterface implements CoreListener, LoggingListener, PropertyCh
        /** The configuration dialog. */
        private ConfigurationDialog configurationDialog;
 
+       /** The node editor dialog. */
+       private EditNodeDialog editNodeDialog;
+
        /** The list of all defined nodes. */
        private List<Node> nodeList = Collections.synchronizedList(new ArrayList<Node>());
 
@@ -264,12 +271,12 @@ public class SwingInterface implements CoreListener, LoggingListener, PropertyCh
        }
 
        /**
-        * Returns the “manage nodes” action.
+        * Returns the “add node” action.
         * 
-        * @return The “manage nodes” action
+        * @return The “add node” action
         */
-       I18nAction getManageNodesAction() {
-               return manageNodesAction;
+       I18nAction getAddNodeAction() {
+               return addNodeAction;
        }
 
        /**
@@ -295,6 +302,28 @@ public class SwingInterface implements CoreListener, LoggingListener, PropertyCh
        }
 
        /**
+        * Returns the “edit node” action for the given node.
+        * 
+        * @param node
+        *            The node to edit
+        * @return The “edit node” action
+        */
+       I18nAction getNodeEditAction(Node node) {
+               return nodeEditActions.get(node);
+       }
+
+       /**
+        * Returns the “delete node” action for the given node.
+        * 
+        * @param node
+        *            The node to delete
+        * @return The “delete node” action
+        */
+       I18nAction getNodeDeleteAction(Node node) {
+               return nodeDeleteActions.get(node);
+       }
+
+       /**
         * Returns all language actions.
         * 
         * @return All language actions
@@ -501,16 +530,6 @@ public class SwingInterface implements CoreListener, LoggingListener, PropertyCh
                                quit();
                        }
                };
-               manageNodesAction = new I18nAction("mainWindow.menu.node.item.manageNodes") {
-
-                       /**
-                        * {@inheritDoc}
-                        */
-                       @SuppressWarnings("synthetic-access")
-                       public void actionPerformed(ActionEvent actionEvent) {
-                               manageNodes();
-                       }
-               };
                List<Locale> availableLanguages = I18n.findAvailableLanguages();
                for (final Locale locale: availableLanguages) {
                        I18nAction languageAction = new I18nAction("general.language." + locale.getLanguage()) {
@@ -526,6 +545,16 @@ public class SwingInterface implements CoreListener, LoggingListener, PropertyCh
                        }
                        languageActions.add(languageAction);
                }
+               addNodeAction = new I18nAction("mainWindow.menu.node.item.addNode") {
+
+                       /**
+                        * {@inheritDoc}
+                        */
+                       @SuppressWarnings("synthetic-access")
+                       public void actionPerformed(ActionEvent actionEvent) {
+                               addNode();
+                       }
+               };
                helpAboutAction = new I18nAction("mainWindow.menu.help.item.about") {
 
                        /**
@@ -572,9 +601,9 @@ public class SwingInterface implements CoreListener, LoggingListener, PropertyCh
         * Initializes all child dialogs.
         */
        private void initDialogs() {
-               manageNodesDialog = new ManageNodesDialog(this);
                aboutDialog = new AboutDialog(this);
                configurationDialog = new ConfigurationDialog(this);
+               editNodeDialog = new EditNodeDialog(mainWindow);
        }
 
        //
@@ -627,38 +656,58 @@ public class SwingInterface implements CoreListener, LoggingListener, PropertyCh
        }
 
        /**
-        * Pops up the “manage nodes” dialog.
+        * Adds a node.
         */
-       private void manageNodes() {
-               if (advancedMode) {
-                       manageNodesDialog.setNodeList(nodeList);
-                       manageNodesDialog.setVisible(true);
-                       nodeList = manageNodesDialog.getNodeList();
-                       /* TODO - notify main window of changes */
-               } else {
-                       if (nodeList.isEmpty()) {
-                               Node newNode = new Node();
-                               newNode.setName(I18n.get("general.defaultNode.name"));
-                               newNode.setHostname("localhost");
-                               newNode.setPort(9481);
-                               nodeList.add(newNode);
-                       }
-                       Node firstNode = nodeList.get(0);
-                       EditNodeDialog editNodeDialog = manageNodesDialog.getEditNodeDialog();
-                       editNodeDialog.setNodeName(firstNode.getName());
-                       editNodeDialog.setNodeHostname(firstNode.getHostname());
-                       editNodeDialog.setNodePort(firstNode.getPort());
-                       editNodeDialog.setVisible(true);
-                       if (!editNodeDialog.wasCancelled()) {
-                               firstNode.setName(editNodeDialog.getNodeName());
-                               firstNode.setHostname(editNodeDialog.getNodeHostname());
-                               firstNode.setPort(editNodeDialog.getNodePort());
-                               /* TODO - give to core. */
+       private void addNode() {
+               editNodeDialog.setNodeName(I18n.get(nodeList.isEmpty() ? "general.defaultNode.name" : "general.newNode.name"));
+               editNodeDialog.setNodeHostname("localhost");
+               editNodeDialog.setNodePort(9481);
+               editNodeDialog.setVisible(true);
+               if (!editNodeDialog.wasCancelled()) {
+                       Node newNode = new Node();
+                       newNode.setName(editNodeDialog.getNodeName());
+                       newNode.setHostname(editNodeDialog.getNodeHostname());
+                       newNode.setPort(editNodeDialog.getNodePort());
+                       try {
+                               core.addNode(newNode);
+                       } catch (UnknownHostException e) {
+                               JOptionPane.showMessageDialog(mainWindow, I18n.get("mainWindow.error.hostnameUnresolvable.message"), I18n.get("mainWindow.error.hostnameUnresolvable.title"), JOptionPane.ERROR_MESSAGE);
                        }
                }
        }
 
        /**
+        * Edits the given node.
+        * 
+        * @param node
+        *            The node to edit
+        */
+       private void editNode(Node node) {
+               editNodeDialog.setNodeName(node.getName());
+               editNodeDialog.setNodeHostname(node.getHostname());
+               editNodeDialog.setNodePort(node.getPort());
+               editNodeDialog.setVisible(true);
+               if (!editNodeDialog.wasCancelled()) {
+                       node.setName(editNodeDialog.getNodeName());
+                       node.setHostname(editNodeDialog.getNodeHostname());
+                       node.setPort(editNodeDialog.getNodePort());
+               }
+       }
+
+       /**
+        * Deletes the given node.
+        * 
+        * @param node
+        *            The node to delete
+        */
+       private void deleteNode(Node node) {
+               int option = JOptionPane.showConfirmDialog(mainWindow, I18n.get("mainWindow.question.deleteNode.message", node.getName()), I18n.get("mainWindow.question.deleteNode.title"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE);
+               if (option == JOptionPane.OK_OPTION) {
+                       core.removeNode(node);
+               }
+       }
+
+       /**
         * Connects to the node.
         * 
         * @param node
@@ -831,8 +880,7 @@ public class SwingInterface implements CoreListener, LoggingListener, PropertyCh
                nodeList.add(node);
                node.addPropertyChangeListener(this);
                logger.log(Level.FINE, "nodeList.size(): " + nodeList.size());
-               manageNodesDialog.setNodeList(nodeList);
-               nodeConnectActions.put(node, new I18nAction("mainWindow.menu.connect") {
+               nodeConnectActions.put(node, new I18nAction("mainWindow.menu.node.item.connect") {
 
                        /**
                         * {@inheritDoc}
@@ -842,7 +890,7 @@ public class SwingInterface implements CoreListener, LoggingListener, PropertyCh
                                nodeConnect(node);
                        }
                });
-               nodeDisconnectActions.put(node, new I18nAction("mainWindow.menu.disconnect") {
+               nodeDisconnectActions.put(node, new I18nAction("mainWindow.menu.node.item.disconnect") {
 
                        /**
                         * {@inheritDoc}
@@ -853,6 +901,26 @@ public class SwingInterface implements CoreListener, LoggingListener, PropertyCh
                        }
                });
                nodeDisconnectActions.get(node).setEnabled(false);
+               nodeEditActions.put(node, new I18nAction("mainWindow.menu.node.item.edit") {
+
+                       /**
+                        * {@inheritDoc}
+                        */
+                       @SuppressWarnings("synthetic-access")
+                       public void actionPerformed(ActionEvent actionEvent) {
+                               editNode(node);
+                       }
+               });
+               nodeDeleteActions.put(node, new I18nAction("mainWindow.menu.node.item.remove") {
+
+                       /**
+                        * {@inheritDoc}
+                        */
+                       @SuppressWarnings("synthetic-access")
+                       public void actionPerformed(ActionEvent actionEvent) {
+                               deleteNode(node);
+                       }
+               });
                mainWindow.addNode(node);
        }
 
@@ -865,6 +933,8 @@ public class SwingInterface implements CoreListener, LoggingListener, PropertyCh
                node.removePropertyChangeListener(this);
                nodeConnectActions.remove(node);
                nodeDisconnectActions.remove(node);
+               nodeEditActions.remove(node);
+               nodeDeleteActions.remove(node);
                mainWindow.removeNode(node);
        }
 
@@ -873,6 +943,8 @@ public class SwingInterface implements CoreListener, LoggingListener, PropertyCh
         */
        public void nodeConnecting(Node node) {
                nodeConnectActions.get(node).setEnabled(false);
+               nodeEditActions.get(node).setEnabled(false);
+               nodeDeleteActions.get(node).setEnabled(false);
                mainWindow.setStatusBarText(I18n.get("mainWindow.statusBar.connectingToNode", node.getName(), node.getHostname(), node.getPort()));
        }
 
@@ -889,6 +961,8 @@ public class SwingInterface implements CoreListener, LoggingListener, PropertyCh
         */
        public void nodeConnectionFailed(Node node, Throwable cause) {
                nodeConnectActions.get(node).setEnabled(true);
+               nodeEditActions.get(node).setEnabled(true);
+               nodeDeleteActions.get(node).setEnabled(true);
                mainWindow.setStatusBarText(I18n.get("mainWindow.statusBar.connectionToNodeFailed", node.getName(), node.getHostname(), node.getPort(), (cause != null) ? cause.getMessage() : "no reason given"));
                JOptionPane.showMessageDialog(mainWindow, I18n.get("mainWindow.error.nodeConnectionFailed.message", node.getName(), node.getHostname(), node.getPort(), (cause != null) ? cause.getMessage() : "no reason given"), I18n.get("mainWindow.error.nodeConnectionFailed.title"), JOptionPane.ERROR_MESSAGE);
        }
@@ -899,6 +973,8 @@ public class SwingInterface implements CoreListener, LoggingListener, PropertyCh
        public void nodeDisconnected(Node node, Throwable throwable) {
                nodeDisconnectActions.get(node).setEnabled(false);
                nodeConnectActions.get(node).setEnabled(true);
+               nodeEditActions.get(node).setEnabled(true);
+               nodeDeleteActions.get(node).setEnabled(true);
                mainWindow.setStatusBarText(I18n.get("mainWindow.statusBar.disconnectedFromNode", node.getName(), node.getHostname(), node.getPort()));
        }