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();
--- /dev/null
+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);
+ }
+ }
+}
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;
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;
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;
+ }
}
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() {
}
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() {
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);
nodesViewer.getTree().setMenu(menu);
getSite().registerContextMenu(menuManager, nodesViewer);
getSite().setSelectionProvider(nodesViewer);
+
nodesViewer.setInput(getViewSite());
// Create the property viewer on the bottom
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);
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;
}