1 package org.simantics.interop.browsing;
\r
3 import java.util.Collection;
\r
4 import java.util.Collections;
\r
5 import java.util.Map;
\r
7 import org.eclipse.jface.resource.ImageDescriptor;
\r
8 import org.simantics.browsing.ui.BuiltinKeys;
\r
9 import org.simantics.browsing.ui.BuiltinKeys.ImagerKey;
\r
10 import org.simantics.browsing.ui.BuiltinKeys.LabelerKey;
\r
11 import org.simantics.browsing.ui.BuiltinKeys.ViewpointKey;
\r
12 import org.simantics.browsing.ui.DataSource;
\r
13 import org.simantics.browsing.ui.NodeContext;
\r
14 import org.simantics.browsing.ui.PrimitiveQueryUpdater;
\r
15 import org.simantics.browsing.ui.common.ColumnKeys;
\r
16 import org.simantics.browsing.ui.common.EvaluatorData.Evaluator;
\r
17 import org.simantics.browsing.ui.common.EvaluatorImpl;
\r
18 import org.simantics.browsing.ui.common.comparators.AlphanumericComparatorFactory;
\r
19 import org.simantics.browsing.ui.common.imagers.ContainerImager;
\r
20 import org.simantics.browsing.ui.content.Imager;
\r
21 import org.simantics.browsing.ui.content.ImagerFactory;
\r
22 import org.simantics.browsing.ui.content.Labeler;
\r
23 import org.simantics.browsing.ui.content.LabelerFactory;
\r
24 import org.simantics.browsing.ui.content.Viewpoint;
\r
25 import org.simantics.browsing.ui.content.ViewpointFactory;
\r
26 import org.simantics.browsing.ui.graph.impl.LazyGraphLabeler;
\r
27 import org.simantics.browsing.ui.graph.impl.LazyViewpoint;
\r
28 import org.simantics.browsing.ui.graph.impl.MissingImageDescriptor;
\r
29 import org.simantics.db.ReadGraph;
\r
30 import org.simantics.db.exception.DatabaseException;
\r
31 import org.simantics.modeling.ui.modelBrowser.model.IChildrenCallback;
\r
32 import org.simantics.modeling.ui.modelBrowser.model.IDisposable;
\r
33 import org.simantics.modeling.ui.modelBrowser.model.IUpdateable;
\r
34 import org.simantics.utils.datastructures.Callable;
\r
35 import org.simantics.utils.datastructures.Callback;
\r
38 public class INodeEvaluators {
\r
39 public static Evaluator createEvaluator() {
\r
40 Evaluator nodeEvaluator = new EvaluatorImpl();
\r
42 nodeEvaluator.addViewpoint(new NodeViewpointFactory(), 1.0);
\r
43 nodeEvaluator.addComparator(new AlphanumericComparatorFactory(ColumnKeys.SINGLE), 2.0);
\r
44 nodeEvaluator.addLabeler(new NodeLabelerFactory(), 1.0);
\r
45 nodeEvaluator.addImager(new NodeImagerFactory(), 1.0);
\r
47 return nodeEvaluator;
\r
51 abstract class BaseViewpointFactory implements ViewpointFactory {
\r
52 protected abstract class VPB extends LazyViewpoint implements Callable<Boolean>, IChildrenCallback {
\r
53 public VPB(PrimitiveQueryUpdater updater, NodeContext context, ViewpointKey key) {
\r
54 super(updater, context, key);
\r
58 public String toString() {
\r
59 return BaseViewpointFactory.this.toString();
\r
63 public Object getIdentity() {
\r
64 // This is necessary to give graph requests related to this
\r
65 // LazyViewpoint a unique-enough identity so that they don't collide
\r
66 // unexpectedly with other users of ModelEvaluators.
\r
67 // This makes requests created with different concrete classes of
\r
68 // BaseViewpointFactory unique.
\r
69 return BaseViewpointFactory.this.getClass();
\r
73 public Boolean call() {
\r
74 return Boolean.valueOf(updater.isDisposed());
\r
78 public void refreshChildren(Collection<?> newChildren) {
\r
79 NodeContext[] ncs = toContextsWithInput(newChildren);
\r
80 setHasChildren(ncs.length > 0);
\r
82 updater.scheduleReplace(context, key, this);
\r
86 public Boolean hasChildren(ReadGraph graph) throws DatabaseException {
\r
87 // hasChildren must do the same graph operations as children
\r
88 // since they both share the same PrimitiveQueryUpdater.
\r
89 return children(graph).length > 0;
\r
94 class NodeViewpointFactory extends BaseViewpointFactory {
\r
96 public String toString() {
\r
100 class VP extends VPB {
\r
101 public VP(PrimitiveQueryUpdater updater, NodeContext context, ViewpointKey key) {
\r
102 super(updater, context, key);
\r
106 public NodeContext[] children(ReadGraph graph) throws DatabaseException {
\r
107 INode node = (INode) context.getConstant(BuiltinKeys.INPUT);
\r
108 if (node instanceof IUpdateable)
\r
109 ((IUpdateable) node).setChildrenCallback(this);
\r
111 Collection<?> children = node.getChildren(graph);
\r
112 for (Object child : children) {
\r
113 if (child instanceof IDisposable)
\r
114 ((IDisposable) child).setDisposedCallable(this);
\r
116 return toContextsWithInput(children);
\r
121 public Viewpoint create(PrimitiveQueryUpdater updater, NodeContext context, ViewpointKey key) {
\r
122 return new VP(updater, context, key);
\r
126 class NodeLabelerFactory implements LabelerFactory {
\r
128 public Labeler create(PrimitiveQueryUpdater updater, final NodeContext context, LabelerKey key) {
\r
129 return new LazyGraphLabeler(updater, context, key) {
\r
131 public Object getIdentity(LabelerKey key) {
\r
132 return NodeLabelerFactory.this.getClass();
\r
136 public Map<String, String> labels(ReadGraph graph) throws DatabaseException {
\r
137 return Collections.singletonMap(ColumnKeys.SINGLE,
\r
138 ((INode) context.getConstant(BuiltinKeys.INPUT)).getLabel(graph));
\r
142 // public Modifier getModifier(ModificationContext sourcePart, String key) {
\r
143 // return ((INode) context.getConstant(BuiltinKeys.INPUT)).getModifier(SimanticsUI.getSession(), key);
\r
147 public int category(ReadGraph graph) throws DatabaseException {
\r
148 return ((INode) context.getConstant(BuiltinKeys.INPUT)).getCategory(graph);
\r
154 class NodeImagerFactory implements ImagerFactory {
\r
157 public Imager create(final PrimitiveQueryUpdater updater, final NodeContext context, final ImagerKey key) {
\r
158 final ContainerImager<ImageDescriptor> result = new ContainerImager<ImageDescriptor>();
\r
159 result.setImage(MissingImageDescriptor.getInstance());
\r
161 DataSource<ReadGraph> source = updater.getDataSource(ReadGraph.class);
\r
163 source.schedule(new Callback<ReadGraph>() {
\r
165 public void run(ReadGraph g) {
\r
167 INode node = (INode)context.getConstant(BuiltinKeys.INPUT);
\r
168 ImageDescriptor descriptor = node.getImage(g);
\r
169 result.setImage(descriptor);
\r
170 updater.scheduleReplace(context, key, result);
\r
171 } catch (DatabaseException e) {
\r
172 e.printStackTrace();
\r