From 2f0d8516846690fcb9a13ebe7a8c15ca50930a2b Mon Sep 17 00:00:00 2001 From: Bruno Sinou Date: Tue, 6 Sep 2011 15:21:56 +0000 Subject: [PATCH] First draft of the child nodes page. git-svn-id: https://svn.argeo.org/commons/trunk@4730 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- .../explorer/browser/NodeContentProvider.java | 5 ++ .../SingleNodeAsTreeContentProvider.java | 90 +++++++++++++++++++ .../ui/explorer/editors/ChildNodesPage.java | 40 +++++++-- .../editors/GenericNodeEditorInput.java | 43 ++++----- .../ui/explorer/editors/GenericNodePage.java | 2 +- .../ui/explorer/views/GenericJcrBrowser.java | 8 +- 6 files changed, 155 insertions(+), 33 deletions(-) create mode 100644 server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/browser/SingleNodeAsTreeContentProvider.java diff --git a/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/browser/NodeContentProvider.java b/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/browser/NodeContentProvider.java index b2bd4b753..59ef4c1a2 100644 --- a/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/browser/NodeContentProvider.java +++ b/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/browser/NodeContentProvider.java @@ -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 index 000000000..766658913 --- /dev/null +++ b/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/browser/SingleNodeAsTreeContentProvider.java @@ -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 result = new ArrayList(); + 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 children = new ArrayList(); + 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); + } + } +} diff --git a/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/editors/ChildNodesPage.java b/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/editors/ChildNodesPage.java index 7d9743615..58f4166e3 100644 --- a/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/editors/ChildNodesPage.java +++ b/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/editors/ChildNodesPage.java @@ -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; + } } diff --git a/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/editors/GenericNodeEditorInput.java b/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/editors/GenericNodeEditorInput.java index 37cabe703..5ddfc301d 100644 --- a/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/editors/GenericNodeEditorInput.java +++ b/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/editors/GenericNodeEditorInput.java @@ -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() { diff --git a/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/editors/GenericNodePage.java b/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/editors/GenericNodePage.java index 0be0f1949..da01f3d49 100644 --- a/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/editors/GenericNodePage.java +++ b/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/editors/GenericNodePage.java @@ -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); diff --git a/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/views/GenericJcrBrowser.java b/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/views/GenericJcrBrowser.java index d009a85fb..2fd97ae97 100644 --- a/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/views/GenericJcrBrowser.java +++ b/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/views/GenericJcrBrowser.java @@ -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 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; } -- 2.39.2