]> gerrit.simantics Code Review - simantics/interop.git/blob - org.simantics.interop/src/org/simantics/interop/browsing/INodeEvaluators.java
Removed os.modelling.ui.modelBrowser.model.INode dependency.
[simantics/interop.git] / org.simantics.interop / src / org / simantics / interop / browsing / INodeEvaluators.java
1 package org.simantics.interop.browsing;\r
2 \r
3 import java.util.Collection;\r
4 import java.util.Collections;\r
5 import java.util.Map;\r
6 \r
7 import org.eclipse.jface.resource.ImageDescriptor;\r
8 import org.simantics.browsing.ui.BuiltinKeys;\r
9 import org.simantics.browsing.ui.DataSource;\r
10 import org.simantics.browsing.ui.NodeContext;\r
11 import org.simantics.browsing.ui.PrimitiveQueryUpdater;\r
12 import org.simantics.browsing.ui.BuiltinKeys.ImagerKey;\r
13 import org.simantics.browsing.ui.BuiltinKeys.LabelerKey;\r
14 import org.simantics.browsing.ui.BuiltinKeys.ViewpointKey;\r
15 import org.simantics.browsing.ui.GraphExplorer.ModificationContext;\r
16 import org.simantics.browsing.ui.common.ColumnKeys;\r
17 import org.simantics.browsing.ui.common.EvaluatorImpl;\r
18 import org.simantics.browsing.ui.common.EvaluatorData.Evaluator;\r
19 import org.simantics.browsing.ui.common.comparators.AlphanumericComparatorFactory;\r
20 import org.simantics.browsing.ui.common.imagers.ContainerImager;\r
21 import org.simantics.browsing.ui.content.Imager;\r
22 import org.simantics.browsing.ui.content.ImagerFactory;\r
23 import org.simantics.browsing.ui.content.Labeler;\r
24 import org.simantics.browsing.ui.content.LabelerFactory;\r
25 import org.simantics.browsing.ui.content.Viewpoint;\r
26 import org.simantics.browsing.ui.content.ViewpointFactory;\r
27 import org.simantics.browsing.ui.graph.impl.LazyGraphLabeler;\r
28 import org.simantics.browsing.ui.graph.impl.LazyViewpoint;\r
29 import org.simantics.browsing.ui.graph.impl.MissingImageDescriptor;\r
30 import org.simantics.db.ReadGraph;\r
31 import org.simantics.db.exception.DatabaseException;\r
32 import org.simantics.modeling.ui.modelBrowser.model.IChildrenCallback;\r
33 import org.simantics.modeling.ui.modelBrowser.model.IDisposable;\r
34 import org.simantics.modeling.ui.modelBrowser.model.IUpdateable;\r
35 import org.simantics.ui.SimanticsUI;\r
36 import org.simantics.utils.datastructures.Callable;\r
37 import org.simantics.utils.datastructures.Callback;\r
38 \r
39 \r
40 public class INodeEvaluators {\r
41         public static Evaluator createEvaluator() {\r
42                 Evaluator nodeEvaluator = new EvaluatorImpl();\r
43 \r
44         nodeEvaluator.addViewpoint(new NodeViewpointFactory(), 1.0);\r
45         nodeEvaluator.addComparator(new AlphanumericComparatorFactory(ColumnKeys.SINGLE), 2.0);\r
46         nodeEvaluator.addLabeler(new NodeLabelerFactory(), 1.0);\r
47         nodeEvaluator.addImager(new NodeImagerFactory(), 1.0);\r
48         \r
49         return nodeEvaluator;\r
50         }\r
51 }\r
52 \r
53 abstract class BaseViewpointFactory implements ViewpointFactory {\r
54     protected abstract class VPB extends LazyViewpoint implements Callable<Boolean>, IChildrenCallback {\r
55         public VPB(PrimitiveQueryUpdater updater, NodeContext context, ViewpointKey key) {\r
56             super(updater, context, key);\r
57         }\r
58 \r
59         @Override\r
60         public String toString() {\r
61             return BaseViewpointFactory.this.toString();\r
62         }\r
63 \r
64         @Override\r
65         public Object getIdentity() {\r
66             // This is necessary to give graph requests related to this\r
67             // LazyViewpoint a unique-enough identity so that they don't collide\r
68             // unexpectedly with other users of ModelEvaluators.\r
69             // This makes requests created with different concrete classes of\r
70             // BaseViewpointFactory unique.\r
71             return BaseViewpointFactory.this.getClass();\r
72         }\r
73 \r
74         @Override\r
75         public Boolean call() {\r
76             return Boolean.valueOf(updater.isDisposed());\r
77         }\r
78 \r
79         @Override\r
80         public void refreshChildren(Collection<?> newChildren) {\r
81             NodeContext[] ncs = toContextsWithInput(newChildren);\r
82             setHasChildren(ncs.length > 0);\r
83             setChildren(ncs);\r
84             updater.scheduleReplace(context, key, this);\r
85         }\r
86 \r
87         @Override\r
88         public Boolean hasChildren(ReadGraph graph) throws DatabaseException {\r
89             // hasChildren must do the same graph operations as children\r
90             // since they both share the same PrimitiveQueryUpdater.\r
91             return children(graph).length > 0;\r
92         }\r
93     };\r
94 }\r
95 \r
96 class NodeViewpointFactory extends BaseViewpointFactory {\r
97     @Override\r
98     public String toString() {\r
99         return "Standard";\r
100     }\r
101 \r
102     class VP extends VPB {\r
103         public VP(PrimitiveQueryUpdater updater, NodeContext context, ViewpointKey key) {\r
104             super(updater, context, key);\r
105         }\r
106 \r
107         @Override\r
108         public NodeContext[] children(ReadGraph graph) throws DatabaseException {\r
109             INode node = (INode) context.getConstant(BuiltinKeys.INPUT);\r
110             if (node instanceof IUpdateable)\r
111                 ((IUpdateable) node).setChildrenCallback(this);\r
112 \r
113             Collection<?> children = node.getChildren(graph);\r
114             for (Object child : children) {\r
115                 if (child instanceof IDisposable)\r
116                     ((IDisposable) child).setDisposedCallable(this);\r
117             }\r
118             return toContextsWithInput(children);\r
119         }\r
120     };\r
121 \r
122     @Override\r
123     public Viewpoint create(PrimitiveQueryUpdater updater, NodeContext context, ViewpointKey key) {\r
124         return new VP(updater, context, key);\r
125     }\r
126 }\r
127 \r
128 class NodeLabelerFactory implements LabelerFactory {\r
129     @Override\r
130     public Labeler create(PrimitiveQueryUpdater updater, final NodeContext context, LabelerKey key) {\r
131         return new LazyGraphLabeler(updater, context, key) {\r
132             @Override\r
133             public Object getIdentity(LabelerKey key) {\r
134                 return NodeLabelerFactory.this.getClass();\r
135             }\r
136 \r
137             @Override\r
138             public Map<String, String> labels(ReadGraph graph) throws DatabaseException {\r
139                 return Collections.singletonMap(ColumnKeys.SINGLE,\r
140                         ((INode) context.getConstant(BuiltinKeys.INPUT)).getLabel(graph));\r
141             }\r
142 \r
143             @Override\r
144             public Modifier getModifier(ModificationContext sourcePart, String key) {\r
145                 return ((INode) context.getConstant(BuiltinKeys.INPUT)).getModifier(SimanticsUI.getSession(), key);\r
146             }\r
147 \r
148             @Override\r
149             public int category(ReadGraph graph) throws DatabaseException {\r
150                 return ((INode) context.getConstant(BuiltinKeys.INPUT)).getCategory(graph);\r
151             }\r
152         };\r
153     }\r
154 }\r
155 \r
156 class NodeImagerFactory implements ImagerFactory {\r
157 \r
158     @Override\r
159     public Imager create(final PrimitiveQueryUpdater updater, final NodeContext context, final ImagerKey key) {\r
160         final ContainerImager<ImageDescriptor> result = new ContainerImager<ImageDescriptor>();\r
161         result.setImage(MissingImageDescriptor.getInstance());\r
162 \r
163         DataSource<ReadGraph> source = updater.getDataSource(ReadGraph.class);\r
164 \r
165         source.schedule(new Callback<ReadGraph>() {\r
166             @Override\r
167             public void run(ReadGraph g) {\r
168                 try {\r
169                     ImageDescriptor descriptor = ((INode)context.getConstant(BuiltinKeys.INPUT)).getImage(g);\r
170                     result.setImage(descriptor);\r
171                     updater.scheduleReplace(context, key, result);\r
172                 } catch (DatabaseException e) {\r
173                     e.printStackTrace();\r
174                 }\r
175             }\r
176         });\r
177 \r
178         return result;\r
179     }\r
180 \r
181 }