Emit warning and abort insert if the selected node is not connected.
[jSite2.git] / src / net / pterodactylus / jsite / gui / SwingInterface.java
index 9531717..3df6402 100644 (file)
@@ -41,6 +41,8 @@ import java.util.logging.Level;
 import java.util.logging.LogRecord;
 import java.util.logging.Logger;
 
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.JComboBox;
 import javax.swing.JOptionPane;
 import javax.swing.UIManager;
 import javax.swing.UnsupportedLookAndFeelException;
@@ -49,9 +51,9 @@ import net.pterodactylus.jsite.core.Core;
 import net.pterodactylus.jsite.core.CoreListener;
 import net.pterodactylus.jsite.core.JSiteException;
 import net.pterodactylus.jsite.core.Node;
+import net.pterodactylus.jsite.core.Project;
 import net.pterodactylus.jsite.i18n.I18n;
 import net.pterodactylus.jsite.i18n.gui.I18nAction;
-import net.pterodactylus.jsite.project.Project;
 import net.pterodactylus.util.image.IconLoader;
 import net.pterodactylus.util.io.Closer;
 import net.pterodactylus.util.logging.Logging;
@@ -115,6 +117,9 @@ public class SwingInterface implements CoreListener, LoggingListener, PropertyCh
        /** The “add project” action. */
        private I18nAction addProjectAction;
 
+       /** The “insert project” actions. */
+       private Map<Project, I18nAction> insertProjectActions = new HashMap<Project, I18nAction>();
+
        /** The “clone project” actions. */
        private Map<Project, I18nAction> cloneProjectActions = new HashMap<Project, I18nAction>();
 
@@ -353,6 +358,17 @@ public class SwingInterface implements CoreListener, LoggingListener, PropertyCh
        }
 
        /**
+        * Returns the “insert project” action for the given project.
+        *
+        * @param project
+        *            The project to get the “insert project” action for
+        * @return The “insert project” action
+        */
+       I18nAction getInsertProjectAction(Project project) {
+               return insertProjectActions.get(project);
+       }
+
+       /**
         * Returns the “clone project” action for the given project.
         *
         * @param project
@@ -546,8 +562,9 @@ public class SwingInterface implements CoreListener, LoggingListener, PropertyCh
                        }
                };
                List<Locale> availableLanguages = I18n.findAvailableLanguages();
-               for (final Locale locale: availableLanguages) {
-                       I18nAction languageAction = new I18nAction("general.language." + locale.getLanguage(), IconLoader.loadIcon("/flag-" + locale.getLanguage() + ".png")) {
+               for (final Locale locale : availableLanguages) {
+                       String language = locale.getLanguage();
+                       I18nAction languageAction = new I18nAction("general.language." + language, IconLoader.loadIcon("/flag-" + language + ".png")) {
 
                                @SuppressWarnings("synthetic-access")
                                public void actionPerformed(ActionEvent e) {
@@ -555,7 +572,7 @@ public class SwingInterface implements CoreListener, LoggingListener, PropertyCh
                                }
 
                        };
-                       if (I18n.getLocale().getLanguage().equals(locale.getLanguage())) {
+                       if (I18n.getLocale().getLanguage().equals(language)) {
                                languageAction.setEnabled(false);
                        }
                        languageActions.add(languageAction);
@@ -743,7 +760,7 @@ public class SwingInterface implements CoreListener, LoggingListener, PropertyCh
         *            The action that triggered the change
         */
        private void changeLanguage(Locale newLocale, I18nAction languageAction) {
-               for (I18nAction i18nAction: languageActions) {
+               for (I18nAction i18nAction : languageActions) {
                        i18nAction.setEnabled(i18nAction != languageAction);
                }
                I18n.setLocale(newLocale);
@@ -762,9 +779,8 @@ public class SwingInterface implements CoreListener, LoggingListener, PropertyCh
        private void addProject() {
                try {
                        core.createProject();
-               } catch (JSiteException nne1) {
-                       /* TODO - add i18n */
-                       JOptionPane.showMessageDialog(mainWindow, I18n.get(""), I18n.get(""), JOptionPane.ERROR_MESSAGE);
+               } catch (JSiteException jse1) {
+                       JOptionPane.showMessageDialog(mainWindow, I18n.get("mainWindow.error.notConnected.message"), I18n.get("mainWindow.error.notConnected.title"), JOptionPane.ERROR_MESSAGE);
                } catch (IOException e) {
                        /* TODO - add i18n */
                        JOptionPane.showMessageDialog(mainWindow, I18n.get(""), I18n.get(""), JOptionPane.ERROR_MESSAGE);
@@ -772,6 +788,35 @@ public class SwingInterface implements CoreListener, LoggingListener, PropertyCh
        }
 
        /**
+        * Inserts the given project.
+        *
+        * @param project
+        *            The project to insert
+        */
+       private void insertProject(Project project) {
+               Node targetNode = project.getNode();
+               if (targetNode == null) {
+                       JComboBox nodeComboBox = new JComboBox();
+                       for (Node node : nodeList) {
+                               ((DefaultComboBoxModel) nodeComboBox.getModel()).addElement(node.getName() + " (" + node.getHostname() + ":" + node.getPort() + ")");
+                       }
+                       int selectedOption = JOptionPane.showConfirmDialog(mainWindow, new Object[] { I18n.get("nodeSelectionDialog.selectNode.text"), nodeComboBox }, I18n.get("nodeSelectionDialog.noNodeSelected.text"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE);
+                       if (selectedOption == JOptionPane.CANCEL_OPTION) {
+                               return;
+                       }
+                       int selectedNodeIndex = nodeComboBox.getSelectedIndex();
+                       logger.log(Level.FINE, "selected node index: " + selectedNodeIndex);
+                       targetNode = nodeList.get(selectedNodeIndex);
+               }
+               logger.log(Level.INFO, "Inserting project “" + project.getName() + "” to node “" + targetNode.getName() + "”...");
+               if (!core.isNodeConnected(targetNode)) {
+                       JOptionPane.showMessageDialog(mainWindow, I18n.get("mainWindow.error.nodeNotConnected.message", targetNode.getName()), I18n.get("mainWindow.error.nodeNotConnected.title", targetNode.getName()), JOptionPane.ERROR_MESSAGE);
+                       return;
+               }
+               core.insertProject(targetNode, project);
+       }
+
+       /**
         * Clones a project.
         *
         * @param project
@@ -804,7 +849,7 @@ public class SwingInterface implements CoreListener, LoggingListener, PropertyCh
         */
        public void loadingProjectsDone(String directory) {
                mainWindow.setStatusBarText(I18n.get("mainWindow.statusBar.projectLoadingDone"));
-               for (Project project: core.getProjects()) {
+               for (Project project : core.getProjects()) {
                        projectAdded(project, false);
                }
        }
@@ -844,6 +889,16 @@ public class SwingInterface implements CoreListener, LoggingListener, PropertyCh
         * @param switchToProject
         */
        private void projectAdded(final Project project, boolean switchToProject) {
+               insertProjectActions.put(project, new I18nAction("mainWindow.button.insertProject") {
+
+                       /**
+                        * {@inheritDoc}
+                        */
+                       @SuppressWarnings("synthetic-access")
+                       public void actionPerformed(ActionEvent actionEvent) {
+                               insertProject(project);
+                       }
+               });
                cloneProjectActions.put(project, new I18nAction("mainWindow.button.cloneProject") {
 
                        /**
@@ -1037,14 +1092,14 @@ public class SwingInterface implements CoreListener, LoggingListener, PropertyCh
        }
 
        /**
-        * @see net.pterodactylus.jsite.core.CoreListener#projectInsertStarted(net.pterodactylus.jsite.project.Project)
+        * @see net.pterodactylus.jsite.core.CoreListener#projectInsertStarted(net.pterodactylus.jsite.core.Project)
         */
        public void projectInsertStarted(Project project) {
                mainWindow.projectInsertStarted(project);
        }
 
        /**
-        * @see net.pterodactylus.jsite.core.CoreListener#projectInsertProgressed(net.pterodactylus.jsite.project.Project,
+        * @see net.pterodactylus.jsite.core.CoreListener#projectInsertProgressed(net.pterodactylus.jsite.core.Project,
         *      int, int, int, int, int, boolean)
         */
        public void projectInsertProgressed(Project project, int totalBlocks, int requiredBlocks, int successfulBlocks, int failedBlocks, int fatallyFailedBlocks, boolean finalizedTotal) {
@@ -1052,7 +1107,7 @@ public class SwingInterface implements CoreListener, LoggingListener, PropertyCh
        }
 
        /**
-        * @see net.pterodactylus.jsite.core.CoreListener#projectInsertGeneratedURI(net.pterodactylus.jsite.project.Project,
+        * @see net.pterodactylus.jsite.core.CoreListener#projectInsertGeneratedURI(net.pterodactylus.jsite.core.Project,
         *      java.lang.String)
         */
        public void projectInsertGeneratedURI(Project project, String uri) {
@@ -1060,7 +1115,7 @@ public class SwingInterface implements CoreListener, LoggingListener, PropertyCh
        }
 
        /**
-        * @see net.pterodactylus.jsite.core.CoreListener#projectInsertFinished(net.pterodactylus.jsite.project.Project,
+        * @see net.pterodactylus.jsite.core.CoreListener#projectInsertFinished(net.pterodactylus.jsite.core.Project,
         *      boolean)
         */
        public void projectInsertFinished(Project project, boolean success) {