From: Mathieu Baudier Date: Mon, 18 Apr 2011 16:48:58 +0000 (+0000) Subject: Extends generic JCR UI components X-Git-Tag: argeo-commons-2.1.30~1281 X-Git-Url: http://git.argeo.org/?a=commitdiff_plain;h=d5d0ea08027ce18a842c1727a1539e42a1e17857;p=lgpl%2Fargeo-commons.git Extends generic JCR UI components NEW - bug 17: Generalize agent management and registration beyond JMS https://bugzilla.argeo.org/show_bug.cgi?id=17 git-svn-id: https://svn.argeo.org/commons/trunk@4448 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- diff --git a/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/AbstractNodeContentProvider.java b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/AbstractNodeContentProvider.java index a8d07ad67..72a14baf8 100644 --- a/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/AbstractNodeContentProvider.java +++ b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/AbstractNodeContentProvider.java @@ -31,19 +31,43 @@ public abstract class AbstractNodeContentProvider extends @Override public Object[] getChildren(Object element) { + Object[] children; if (element instanceof Node) { try { - List nodes = new ArrayList(); - 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 nodes = new ArrayList(); + for (NodeIterator nit = node.getNodes(); nit.hasNext();) + nodes.add(nit.nextNode()); + return nodes.toArray(); } @Override @@ -59,20 +83,33 @@ public abstract class AbstractNodeContentProvider extends } 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); } diff --git a/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/DefaultNodeLabelProvider.java b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/DefaultNodeLabelProvider.java new file mode 100644 index 000000000..648079ea3 --- /dev/null +++ b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/DefaultNodeLabelProvider.java @@ -0,0 +1,80 @@ +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; + } + +} diff --git a/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/NodesWrapper.java b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/NodesWrapper.java new file mode 100644 index 000000000..5765a389d --- /dev/null +++ b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/NodesWrapper.java @@ -0,0 +1,67 @@ +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 getWrappedNodes() throws RepositoryException { + List nodes = new ArrayList(); + 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; + } +} diff --git a/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/WrappedNode.java b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/WrappedNode.java new file mode 100644 index 000000000..f24a25adf --- /dev/null +++ b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/WrappedNode.java @@ -0,0 +1,41 @@ +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; + } + +} diff --git a/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/browser/NodeLabelProvider.java b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/browser/NodeLabelProvider.java index a3ff38fc0..099231995 100644 --- a/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/browser/NodeLabelProvider.java +++ b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/browser/NodeLabelProvider.java @@ -4,69 +4,36 @@ import javax.jcr.Node; 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