First draft of the child nodes page.
authorBruno Sinou <bsinou@argeo.org>
Tue, 6 Sep 2011 15:21:56 +0000 (15:21 +0000)
committerBruno Sinou <bsinou@argeo.org>
Tue, 6 Sep 2011 15:21:56 +0000 (15:21 +0000)
git-svn-id: https://svn.argeo.org/commons/trunk@4730 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/browser/NodeContentProvider.java
server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/browser/SingleNodeAsTreeContentProvider.java [new file with mode: 0644]
server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/editors/ChildNodesPage.java
server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/editors/GenericNodeEditorInput.java
server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/editors/GenericNodePage.java
server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/views/GenericJcrBrowser.java

index b2bd4b753ddde9844ed3cc911ec6136b93081b30..59ef4c1a26fba0742fe0fd8113f97d5db3d53bdb 100644 (file)
@@ -17,6 +17,11 @@ import org.argeo.jcr.RepositoryRegister;
 import org.eclipse.jface.viewers.ITreeContentProvider;
 import org.eclipse.jface.viewers.Viewer;
 
+/**
+ * Implementation of the {@code ITreeContentProvider} to display multiple
+ * repository environment in a tree like structure
+ * 
+ */
 public class NodeContentProvider implements ITreeContentProvider {
        private ItemComparator itemComparator = new ItemComparator();
 
diff --git a/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/browser/SingleNodeAsTreeContentProvider.java b/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/browser/SingleNodeAsTreeContentProvider.java
new file mode 100644 (file)
index 0000000..7666589
--- /dev/null
@@ -0,0 +1,90 @@
+package org.argeo.jcr.ui.explorer.browser;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.jcr.Node;
+import javax.jcr.NodeIterator;
+import javax.jcr.RepositoryException;
+
+import org.argeo.ArgeoException;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+
+/**
+ * Implementation of the {@code ITreeContentProvider} in order to display a
+ * single JCR node and its children in a tree like structure
+ * 
+ */
+public class SingleNodeAsTreeContentProvider implements ITreeContentProvider {
+       // private Node rootNode;
+       private ItemComparator itemComparator = new ItemComparator();
+
+       /**
+        * Sends back the first level of the Tree. input element must be a single
+        * node object
+        */
+       public Object[] getElements(Object inputElement) {
+               try {
+                       Node rootNode = (Node) inputElement;
+                       List<Node> result = new ArrayList<Node>();
+                       NodeIterator ni = rootNode.getNodes();
+                       while (ni.hasNext()) {
+                               result.add(ni.nextNode());
+                       }
+
+                       return result.toArray();
+               } catch (RepositoryException re) {
+                       throw new ArgeoException(
+                                       "Unexpected error while getting child nodes for children editor page ",
+                                       re);
+               }
+       }
+
+       public Object[] getChildren(Object parentElement) {
+               return childrenNodes((Node) parentElement);
+       }
+
+       public Object getParent(Object element) {
+               try {
+                       Node node = (Node) element;
+                       if (!node.getPath().equals("/"))
+                               return node.getParent();
+                       else
+                               return null;
+               } catch (RepositoryException e) {
+                       return null;
+               }
+       }
+
+       public boolean hasChildren(Object element) {
+               try {
+                       return ((Node) element).hasNodes();
+               } catch (RepositoryException e) {
+                       throw new ArgeoException("Cannot check children of " + element, e);
+               }
+       }
+
+       public void dispose() {
+       }
+
+       public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+       }
+
+       protected Object[] childrenNodes(Node parentNode) {
+               try {
+                       List<Node> children = new ArrayList<Node>();
+                       NodeIterator nit = parentNode.getNodes();
+                       while (nit.hasNext()) {
+                               Node node = nit.nextNode();
+                               children.add(node);
+                       }
+                       Node[] arr = children.toArray(new Node[children.size()]);
+                       Arrays.sort(arr, itemComparator);
+                       return arr;
+               } catch (RepositoryException e) {
+                       throw new ArgeoException("Cannot list children of " + parentNode, e);
+               }
+       }
+}
index 7d9743615db7ba06eca0ff6b9763a3814c92ad95..58f4166e3734bb253960f7ca54c5219e2cf46e89 100644 (file)
@@ -4,9 +4,15 @@ import javax.jcr.Node;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.argeo.jcr.ui.explorer.browser.NodeLabelProvider;
+import org.argeo.jcr.ui.explorer.browser.SingleNodeAsTreeContentProvider;
+import org.argeo.jcr.ui.explorer.utils.GenericNodeDoubleClickListener;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.TreeViewer;
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Composite;
 import org.eclipse.ui.forms.IManagedForm;
 import org.eclipse.ui.forms.editor.FormEditor;
 import org.eclipse.ui.forms.editor.FormPage;
@@ -19,8 +25,13 @@ import org.eclipse.ui.forms.widgets.ScrolledForm;
 public class ChildNodesPage extends FormPage {
        private final static Log log = LogFactory.getLog(ChildNodesPage.class);
 
+       // business objects
        private Node currentNode;
-       
+
+       // this page UI components
+       private SingleNodeAsTreeContentProvider nodeContentProvider;
+       private TreeViewer nodesViewer;
+
        public ChildNodesPage(FormEditor editor, String title, Node currentNode) {
                super(editor, "ChildNodesPage", title);
                this.currentNode = currentNode;
@@ -29,13 +40,32 @@ public class ChildNodesPage extends FormPage {
        protected void createFormContent(IManagedForm managedForm) {
                try {
                        ScrolledForm form = managedForm.getForm();
+                       Composite body = form.getBody();
                        GridLayout twt = new GridLayout(1, false);
                        twt.marginWidth = twt.marginHeight = 0;
-                       form.getBody().setLayout(twt);
-                       Label lbl = new Label(form.getBody(), SWT.NONE);
-                       lbl.setText("Implement this");
+                       body.setLayout(twt);
+
+                       nodeContentProvider = new SingleNodeAsTreeContentProvider();
+                       nodesViewer = createNodeViewer(body, nodeContentProvider);
+                       nodesViewer.setInput(currentNode);
                } catch (Exception e) {
                        e.printStackTrace();
                }
        }
+
+       protected TreeViewer createNodeViewer(Composite parent,
+                       final ITreeContentProvider nodeContentProvider) {
+
+               final TreeViewer tmpNodeViewer = new TreeViewer(parent, SWT.MULTI);
+
+               tmpNodeViewer.getTree().setLayoutData(
+                               new GridData(SWT.FILL, SWT.FILL, true, true));
+
+               tmpNodeViewer.setContentProvider(nodeContentProvider);
+               tmpNodeViewer.setLabelProvider(new NodeLabelProvider());
+               tmpNodeViewer
+                               .addDoubleClickListener(new GenericNodeDoubleClickListener(
+                                               tmpNodeViewer));
+               return tmpNodeViewer;
+       }
 }
index 37cabe703d46b75014db197dc400da07d3bcdb11..5ddfc301d9eecb610c178f3bc3c4dca6d30d1ea8 100644 (file)
@@ -15,8 +15,23 @@ import org.eclipse.ui.IPersistableElement;
 public class GenericNodeEditorInput implements IEditorInput {
        private final Node currentNode;
 
+       // cache key properties at creation time to avoid Exception at recoring time
+       // when the session has been closed
+       private String path;
+       private String uid;
+       private String name;
+
        public GenericNodeEditorInput(Node currentNode) {
                this.currentNode = currentNode;
+               try {
+                       name = currentNode.getName();
+                       uid = currentNode.getIdentifier();
+                       path = currentNode.getPath();
+               } catch (RepositoryException re) {
+                       throw new ArgeoException(
+                                       "unexpected error while getting node key values at creation time",
+                                       re);
+               }
        }
 
        public Node getCurrentNode() {
@@ -36,39 +51,19 @@ public class GenericNodeEditorInput implements IEditorInput {
        }
 
        public String getName() {
-               try {
-                       return currentNode.getName();
-               } catch (RepositoryException re) {
-                       throw new ArgeoException(
-                                       "unexpected error while getting node name", re);
-               }
+               return name;
        }
 
        public String getUid() {
-               try {
-                       return currentNode.getIdentifier();
-               } catch (RepositoryException re) {
-                       throw new ArgeoException("unexpected error while getting node uid",
-                                       re);
-               }
+               return uid;
        }
 
        public String getToolTipText() {
-               try {
-                       return currentNode.getPath();
-               } catch (RepositoryException re) {
-                       throw new ArgeoException(
-                                       "unexpected error while getting node path", re);
-               }
+               return path;
        }
 
        public String getPath() {
-               try {
-                       return currentNode.getPath();
-               } catch (RepositoryException re) {
-                       throw new ArgeoException(
-                                       "unexpected error while getting node path", re);
-               }
+               return path;
        }
 
        public IPersistableElement getPersistable() {
index 0be0f19497825ac3a7a5606405f38153e8450e9a..da01f3d49da4c0683564fea9237ed958d0ace15d 100644 (file)
@@ -59,7 +59,7 @@ public class GenericNodePage extends FormPage implements JcrExplorerConstants {
                        tk = managedForm.getToolkit();
                        ScrolledForm form = managedForm.getForm();
                        GridLayout twt = new GridLayout(3, false);
-                       twt.marginWidth = twt.marginHeight = 0;
+                       twt.marginWidth = twt.marginHeight = 5;
 
                        form.getBody().setLayout(twt);
 
index d009a85fb2b4366870364cf6c0c219ae80917b96..2fd97ae97172ad9bf88eae527faa94e4200ed29e 100644 (file)
@@ -109,6 +109,7 @@ public class GenericJcrBrowser extends AbstractJcrBrowser {
                nodesViewer.getTree().setMenu(menu);
                getSite().registerContextMenu(menuManager, nodesViewer);
                getSite().setSelectionProvider(nodesViewer);
+
                nodesViewer.setInput(getViewSite());
 
                // Create the property viewer on the bottom
@@ -241,7 +242,6 @@ public class GenericJcrBrowser extends AbstractJcrBrowser {
                try {
                        ObservationManager observationManager = session.getWorkspace()
                                        .getObservationManager();
-                       // FIXME Will not be notified if empty result is deleted
                        observationManager.addEventListener(resultsObserver,
                                        Event.PROPERTY_ADDED | Event.PROPERTY_CHANGED, "/", true,
                                        null, null, false);
@@ -270,11 +270,13 @@ public class GenericJcrBrowser extends AbstractJcrBrowser {
                protected Boolean willProcessInUiThread(List<Event> events)
                                throws RepositoryException {
                        for (Event event : events) {
-                               getLog().debug("Received event " + event);
+                               if (getLog().isTraceEnabled())
+                                       getLog().debug("Received event " + event);
                                String path = event.getPath();
                                int index = path.lastIndexOf('/');
                                String propertyName = path.substring(index + 1);
-                               getLog().debug("Concerned property " + propertyName);
+                               if (getLog().isTraceEnabled())
+                                       getLog().debug("Concerned property " + propertyName);
                        }
                        return false;
                }