@Override
public Object[] getChildren(Object element) {
+ Object[] children;
if (element instanceof Node) {
try {
- List<Node> nodes = new ArrayList<Node>();
- for (NodeIterator nit = ((Node) element).getNodes(); nit
- .hasNext();)
- nodes.add(nit.nextNode());
- return nodes.toArray();
+ Node node = (Node) element;
+ children = getChildren(node);
} catch (RepositoryException e) {
throw new ArgeoException("Cannot get children of " + element, e);
}
+ } else if (element instanceof WrappedNode) {
+ WrappedNode wrappedNode = (WrappedNode) element;
+ try {
+ children = getChildren(wrappedNode.getNode());
+ } catch (RepositoryException e) {
+ throw new ArgeoException("Cannot get children of "
+ + wrappedNode, e);
+ }
+ } else if (element instanceof NodesWrapper) {
+ NodesWrapper node = (NodesWrapper) element;
+ children = node.getChildren();
} else {
- return super.getChildren(element);
+ children = super.getChildren(element);
}
+
+ children = sort(element, children);
+ return children;
+ }
+
+ /** Do not sort by default. To be overidden to provide custom sort. */
+ protected Object[] sort(Object parent, Object[] children) {
+ return children;
+ }
+
+ protected Object[] getChildren(Node node) throws RepositoryException {
+ List<Node> nodes = new ArrayList<Node>();
+ for (NodeIterator nit = node.getNodes(); nit.hasNext();)
+ nodes.add(nit.nextNode());
+ return nodes.toArray();
}
@Override
} catch (RepositoryException e) {
throw new ArgeoException("Cannot get parent of " + element, e);
}
+ } else if (element instanceof WrappedNode) {
+ WrappedNode wrappedNode = (WrappedNode) element;
+ return wrappedNode.getParent();
+ } else if (element instanceof NodesWrapper) {
+ NodesWrapper nodesWrapper = (NodesWrapper) element;
+ return this.getParent(nodesWrapper.getNode());
}
return super.getParent(element);
}
@Override
public boolean hasChildren(Object element) {
- if (element instanceof Node) {
- Node node = (Node) element;
- try {
+ try {
+ if (element instanceof Node) {
+ Node node = (Node) element;
return node.hasNodes();
- } catch (RepositoryException e) {
- throw new ArgeoException("Cannot check whether " + element
- + " has children", e);
+ } else if (element instanceof WrappedNode) {
+ WrappedNode wrappedNode = (WrappedNode) element;
+ return wrappedNode.getNode().hasNodes();
+ } else if (element instanceof NodesWrapper) {
+ NodesWrapper nodesWrapper = (NodesWrapper) element;
+ return nodesWrapper.hasChildren();
}
+
+ } catch (RepositoryException e) {
+ throw new ArgeoException("Cannot check whether " + element
+ + " has children", e);
}
return super.hasChildren(element);
}
--- /dev/null
+package org.argeo.eclipse.ui.jcr;
+
+import javax.jcr.Node;
+import javax.jcr.Property;
+import javax.jcr.RepositoryException;
+import javax.jcr.nodetype.NodeType;
+
+import org.argeo.ArgeoException;
+import org.argeo.jcr.ArgeoTypes;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.swt.graphics.Image;
+
+/** Provides reasonable overridable defaults for know JCR types. */
+public class DefaultNodeLabelProvider extends LabelProvider {
+ // Images
+ public final static Image NODE = JcrUiPlugin.getImageDescriptor(
+ "icons/node.gif").createImage();
+ public final static Image FOLDER = JcrUiPlugin.getImageDescriptor(
+ "icons/folder.gif").createImage();
+ public final static Image FILE = JcrUiPlugin.getImageDescriptor(
+ "icons/file.gif").createImage();
+ public final static Image BINARY = JcrUiPlugin.getImageDescriptor(
+ "icons/binary.png").createImage();
+ public final static Image HOME = JcrUiPlugin.getImageDescriptor(
+ "icons/home.gif").createImage();
+
+ public String getText(Object element) {
+ try {
+ if (element instanceof Node) {
+ return getText((Node) element);
+ } else if (element instanceof WrappedNode) {
+ return getText(((WrappedNode) element).getNode());
+ } else if (element instanceof NodesWrapper) {
+ return getText(((NodesWrapper) element).getNode());
+ }
+ return super.getText(element);
+ } catch (RepositoryException e) {
+ throw new ArgeoException("Cannot get text for of " + element, e);
+ }
+ }
+
+ protected String getText(Node node) throws RepositoryException {
+ if (node.isNodeType(NodeType.MIX_TITLE)
+ && node.hasProperty(Property.JCR_TITLE))
+ return node.getProperty(Property.JCR_TITLE).getString();
+ else
+ return node.getName();
+ }
+
+ @Override
+ public Image getImage(Object element) {
+ try {
+ if (element instanceof Node) {
+ return getImage((Node) element);
+ } else if (element instanceof WrappedNode) {
+ return getImage(((WrappedNode) element).getNode());
+ } else if (element instanceof NodesWrapper) {
+ return getImage(((NodesWrapper) element).getNode());
+ }
+ } catch (RepositoryException e) {
+ throw new ArgeoException("Cannot retrieve image for " + element, e);
+ }
+ return super.getImage(element);
+ }
+
+ protected Image getImage(Node node) throws RepositoryException {
+ // optimized order
+ if (node.getPrimaryNodeType().isNodeType(NodeType.NT_FILE))
+ return FILE;
+ else if (node.getPrimaryNodeType().isNodeType(NodeType.NT_FOLDER))
+ return FOLDER;
+ else if (node.getPrimaryNodeType().isNodeType(NodeType.NT_RESOURCE))
+ return BINARY;
+ else if (node.isNodeType(ArgeoTypes.ARGEO_USER_HOME))
+ return HOME;
+ else
+ return NODE;
+ }
+
+}
--- /dev/null
+package org.argeo.eclipse.ui.jcr;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.jcr.Node;
+import javax.jcr.NodeIterator;
+import javax.jcr.RepositoryException;
+
+import org.argeo.ArgeoException;
+
+/**
+ * Element of tree which is based on a node, but whose children are not
+ * necessarily this node children.
+ */
+public class NodesWrapper {
+ private final Node node;
+
+ public NodesWrapper(Node node) {
+ super();
+ this.node = node;
+ }
+
+ protected List<WrappedNode> getWrappedNodes() throws RepositoryException {
+ List<WrappedNode> nodes = new ArrayList<WrappedNode>();
+ for (NodeIterator nit = node.getNodes(); nit.hasNext();)
+ nodes.add(new WrappedNode(this, nit.nextNode()));
+ return nodes;
+ }
+
+ public Object[] getChildren() {
+ try {
+ return getWrappedNodes().toArray();
+ } catch (RepositoryException e) {
+ throw new ArgeoException("Cannot get wrapped children", e);
+ }
+ }
+
+ /**
+ * @return true by default because we don't want to compute the wrapped
+ * nodes twice
+ */
+ public Boolean hasChildren() {
+ return true;
+ }
+
+ public Node getNode() {
+ return node;
+ }
+
+ @Override
+ public int hashCode() {
+ return node.hashCode();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof NodesWrapper)
+ return node.equals(((NodesWrapper) obj).getNode());
+ else
+ return false;
+ }
+
+ public String toString() {
+ return "nodes wrapper based on " + node;
+ }
+}
--- /dev/null
+package org.argeo.eclipse.ui.jcr;
+
+import javax.jcr.Node;
+
+/** Wraps a node (created from a {@link NodesWrapper}) */
+public class WrappedNode {
+ private final NodesWrapper parent;
+ private final Node node;
+
+ public WrappedNode(NodesWrapper parent, Node node) {
+ super();
+ this.parent = parent;
+ this.node = node;
+ }
+
+ public NodesWrapper getParent() {
+ return parent;
+ }
+
+ public Node getNode() {
+ return node;
+ }
+
+ public String toString() {
+ return "wrapped " + node;
+ }
+
+ @Override
+ public int hashCode() {
+ return node.hashCode();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof WrappedNode)
+ return node.equals(((WrappedNode) obj).getNode());
+ else
+ return false;
+ }
+
+}
import javax.jcr.RepositoryException;
import javax.jcr.nodetype.NodeType;
-import org.argeo.ArgeoException;
+import org.argeo.eclipse.ui.jcr.DefaultNodeLabelProvider;
import org.argeo.eclipse.ui.jcr.JcrUiPlugin;
-import org.argeo.jcr.ArgeoTypes;
import org.argeo.jcr.RepositoryRegister;
-import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.graphics.Image;
-public class NodeLabelProvider extends LabelProvider {
+public class NodeLabelProvider extends DefaultNodeLabelProvider {
// Images
- public final static Image NODE = JcrUiPlugin.getImageDescriptor(
- "icons/node.gif").createImage();
- public final static Image FOLDER = JcrUiPlugin.getImageDescriptor(
- "icons/folder.gif").createImage();
- public final static Image FILE = JcrUiPlugin.getImageDescriptor(
- "icons/file.gif").createImage();
- public final static Image BINARY = JcrUiPlugin.getImageDescriptor(
- "icons/binary.png").createImage();
- public final static Image HOME = JcrUiPlugin.getImageDescriptor(
- "icons/home.gif").createImage();
public final static Image REPOSITORIES = JcrUiPlugin.getImageDescriptor(
"icons/repositories.gif").createImage();
public String getText(Object element) {
- try {
- if (element instanceof Node) {
- Node node = (Node) element;
- String label = node.getName();
- StringBuffer mixins = new StringBuffer("");
- for (NodeType type : node.getMixinNodeTypes())
- mixins.append(' ').append(type.getName());
-
- return label + " [" + node.getPrimaryNodeType().getName()
- + mixins + "]";
- } else if (element instanceof RepositoryRegister) {
- return "Repositories";
- }
- return element.toString();
- } catch (RepositoryException e) {
- throw new ArgeoException("Cannot get text for of " + element, e);
+ if (element instanceof RepositoryRegister) {
+ return "Repositories";
}
+ return super.getText(element);
+ }
+
+ protected String getText(Node node) throws RepositoryException {
+ String label = node.getName();
+ StringBuffer mixins = new StringBuffer("");
+ for (NodeType type : node.getMixinNodeTypes())
+ mixins.append(' ').append(type.getName());
+
+ return label + " [" + node.getPrimaryNodeType().getName() + mixins
+ + "]";
}
@Override
public Image getImage(Object element) {
- if (element instanceof Node) {
- Node node = (Node) element;
- try {
- // optimized order
- if (node.getPrimaryNodeType().isNodeType(NodeType.NT_FILE))
- return FILE;
- else if (node.getPrimaryNodeType().isNodeType(
- NodeType.NT_FOLDER))
- return FOLDER;
- else if (node.getPrimaryNodeType().isNodeType(
- NodeType.NT_RESOURCE))
- return BINARY;
- else if (node.isNodeType(ArgeoTypes.ARGEO_USER_HOME))
- return HOME;
- } catch (RepositoryException e) {
- // silent
- }
- return NODE;
- } else if (element instanceof RepositoryNode) {
+ if (element instanceof RepositoryNode) {
if (((RepositoryNode) element).getDefaultSession() == null)
return RepositoryNode.REPOSITORY_DISCONNECTED;
else