Some refactoring of the model and of command handling.
[lgpl/argeo-commons.git] / server / plugins / org.argeo.jcr.ui.explorer / src / main / java / org / argeo / jcr / ui / explorer / commands / AddFolderNode.java
index ed81c88d9bf5c1a903d64da61e5e32c3e7999ba4..afc01b2a7bd0e02326c3431956e9aed7549737ba 100644 (file)
@@ -5,9 +5,12 @@ import javax.jcr.RepositoryException;
 import javax.jcr.nodetype.NodeType;
 
 import org.argeo.eclipse.ui.ErrorFeedback;
+import org.argeo.eclipse.ui.TreeParent;
 import org.argeo.eclipse.ui.dialogs.SingleValue;
 import org.argeo.eclipse.ui.jcr.JcrUiPlugin;
+import org.argeo.jcr.ui.explorer.JcrExplorerPlugin;
 import org.argeo.jcr.ui.explorer.model.SingleJcrNode;
+import org.argeo.jcr.ui.explorer.model.WorkspaceNode;
 import org.argeo.jcr.ui.explorer.views.GenericJcrBrowser;
 import org.eclipse.core.commands.AbstractHandler;
 import org.eclipse.core.commands.ExecutionEvent;
@@ -16,41 +19,68 @@ import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.ui.handlers.HandlerUtil;
 
-/** Adds a node of type nt:folder */
+/**
+ * Adds a node of type nt:folder, only on {@link SingleJcrNode} and
+ * {@link WorkspaceNode} TreeObject types.
+ * 
+ * 
+ * This handler assumes that a selection provider is available and picks only
+ * first selected item. It is UI's job to enable the command only when the
+ * selection contains one and only one element. Thus no parameter is passed
+ * through the command.
+ * 
+ * This handler is still 'hard linked' to a GenericJcrBrowser view to enable
+ * correct tree refresh when a node is added. This must be corrected in future
+ * versions.
+ */
 public class AddFolderNode extends AbstractHandler {
 
+       public final static String ID = JcrExplorerPlugin.ID + ".addFolderNode";
+
+       // public final static String DEFAULT_LABEL = JcrExplorerPlugin
+       // .getMessage("addFolderNodeCmdLbl");
+       // public final static String DEFAULT_ICON_REL_PATH = "icons/addRepo.gif";
+
        public Object execute(ExecutionEvent event) throws ExecutionException {
+
                ISelection selection = HandlerUtil.getActiveWorkbenchWindow(event)
                                .getActivePage().getSelection();
+
                GenericJcrBrowser view = (GenericJcrBrowser) HandlerUtil
                                .getActiveWorkbenchWindow(event).getActivePage()
                                .findView(HandlerUtil.getActivePartId(event));
+
                if (selection != null && !selection.isEmpty()
                                && selection instanceof IStructuredSelection) {
                        Object obj = ((IStructuredSelection) selection).getFirstElement();
+                       TreeParent treeParentNode = null;
+                       Node jcrParentNode = null;
 
                        if (obj instanceof SingleJcrNode) {
-                               String folderName = SingleValue.ask("Folder name",
-                                               "Enter folder name");
-                               if (folderName != null) {
-                                       SingleJcrNode sjn = (SingleJcrNode) obj;
-                                       Node parentNode = sjn.getNode();
-                                       try {
-                                               Node newNode = parentNode.addNode(folderName,
-                                                               NodeType.NT_FOLDER);
-                                               parentNode.getSession().save();
-                                               view.nodeAdded(sjn);
-                                       } catch (RepositoryException e) {
-                                               ErrorFeedback.show("Cannot create folder " + folderName
-                                                               + " under " + parentNode, e);
-                                       }
+                               treeParentNode = (TreeParent) obj;
+                               jcrParentNode = ((SingleJcrNode) treeParentNode).getNode();
+                       } else if (obj instanceof WorkspaceNode) {
+                               treeParentNode = (TreeParent) obj;
+                               jcrParentNode = ((WorkspaceNode) treeParentNode).getRootNode();
+                       } else
+                               return null;
+
+                       String folderName = SingleValue.ask("Folder name",
+                                       "Enter folder name");
+                       if (folderName != null) {
+                               try {
+                                       jcrParentNode.addNode(folderName, NodeType.NT_FOLDER);
+                                       jcrParentNode.getSession().save();
+                                       view.nodeAdded(treeParentNode);
+                               } catch (RepositoryException e) {
+                                       ErrorFeedback.show("Cannot create folder " + folderName
+                                                       + " under " + treeParentNode, e);
                                }
-                       } else {
-                               ErrorFeedback.show(JcrUiPlugin
-                                               .getMessage("errorUnvalidNtFolderNodeType"));
                        }
+               } else {
+                       ErrorFeedback.show(JcrUiPlugin
+                                       .getMessage("errorUnvalidNtFolderNodeType"));
                }
                return null;
        }
-
 }