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