]> gerrit.simantics Code Review - simantics/interop.git/blob - org.simantics.interop/src/org/simantics/interop/browsing/INodeEvaluators.java
INode cleanup
[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.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
36 \r
37 \r
38 public class INodeEvaluators {\r
39         public static Evaluator createEvaluator() {\r
40                 Evaluator nodeEvaluator = new EvaluatorImpl();\r
41 \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
46         \r
47         return nodeEvaluator;\r
48         }\r
49 }\r
50 \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
55         }\r
56 \r
57         @Override\r
58         public String toString() {\r
59             return BaseViewpointFactory.this.toString();\r
60         }\r
61 \r
62         @Override\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
70         }\r
71 \r
72         @Override\r
73         public Boolean call() {\r
74             return Boolean.valueOf(updater.isDisposed());\r
75         }\r
76 \r
77         @Override\r
78         public void refreshChildren(Collection<?> newChildren) {\r
79             NodeContext[] ncs = toContextsWithInput(newChildren);\r
80             setHasChildren(ncs.length > 0);\r
81             setChildren(ncs);\r
82             updater.scheduleReplace(context, key, this);\r
83         }\r
84 \r
85         @Override\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
90         }\r
91     };\r
92 }\r
93 \r
94 class NodeViewpointFactory extends BaseViewpointFactory {\r
95     @Override\r
96     public String toString() {\r
97         return "Standard";\r
98     }\r
99 \r
100     class VP extends VPB {\r
101         public VP(PrimitiveQueryUpdater updater, NodeContext context, ViewpointKey key) {\r
102             super(updater, context, key);\r
103         }\r
104 \r
105         @Override\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
110 \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
115             }\r
116             return toContextsWithInput(children);\r
117         }\r
118     };\r
119 \r
120     @Override\r
121     public Viewpoint create(PrimitiveQueryUpdater updater, NodeContext context, ViewpointKey key) {\r
122         return new VP(updater, context, key);\r
123     }\r
124 }\r
125 \r
126 class NodeLabelerFactory implements LabelerFactory {\r
127     @Override\r
128     public Labeler create(PrimitiveQueryUpdater updater, final NodeContext context, LabelerKey key) {\r
129         return new LazyGraphLabeler(updater, context, key) {\r
130             @Override\r
131             public Object getIdentity(LabelerKey key) {\r
132                 return NodeLabelerFactory.this.getClass();\r
133             }\r
134 \r
135             @Override\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
139             }\r
140 \r
141 //            @Override\r
142 //            public Modifier getModifier(ModificationContext sourcePart, String key) {\r
143 //                return ((INode) context.getConstant(BuiltinKeys.INPUT)).getModifier(SimanticsUI.getSession(), key);\r
144 //            }\r
145 //\r
146 //            @Override\r
147 //            public int category(ReadGraph graph) throws DatabaseException {\r
148 //                return ((INode) context.getConstant(BuiltinKeys.INPUT)).getCategory(graph);\r
149 //            }\r
150         };\r
151     }\r
152 }\r
153 \r
154 class NodeImagerFactory implements ImagerFactory {\r
155 \r
156     @Override\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
160 \r
161         DataSource<ReadGraph> source = updater.getDataSource(ReadGraph.class);\r
162 \r
163         source.schedule(new Callback<ReadGraph>() {\r
164             @Override\r
165             public void run(ReadGraph g) {\r
166                 try {\r
167                     ImageDescriptor descriptor = ((INode)context.getConstant(BuiltinKeys.INPUT)).getImage(g);\r
168                     result.setImage(descriptor);\r
169                     updater.scheduleReplace(context, key, result);\r
170                 } catch (DatabaseException e) {\r
171                     e.printStackTrace();\r
172                 }\r
173             }\r
174         });\r
175 \r
176         return result;\r
177     }\r
178 \r
179 }