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
6 import java.util.function.Consumer;
\r
7 import java.util.function.Supplier;
\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 import org.slf4j.Logger;
\r
37 import org.slf4j.LoggerFactory;
\r
40 public class INodeEvaluators {
\r
41 public static Evaluator createEvaluator() {
\r
42 Evaluator nodeEvaluator = new EvaluatorImpl();
\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
49 return nodeEvaluator;
\r
53 abstract class BaseViewpointFactory implements ViewpointFactory {
\r
54 protected abstract class VPB extends LazyViewpoint implements Supplier<Boolean>, IChildrenCallback {
\r
55 PrimitiveQueryUpdater updater;
\r
57 public VPB(PrimitiveQueryUpdater updater, NodeContext context, ViewpointKey key) {
\r
58 super(updater, context, key);
\r
59 this.updater = updater;
\r
63 public String toString() {
\r
64 return BaseViewpointFactory.this.toString();
\r
68 public Object getIdentity() {
\r
69 // This is necessary to give graph requests related to this
\r
70 // LazyViewpoint a unique-enough identity so that they don't collide
\r
71 // unexpectedly with other users of ModelEvaluators.
\r
72 // This makes requests created with different concrete classes of
\r
73 // BaseViewpointFactory unique.
\r
74 return BaseViewpointFactory.this.getClass();
\r
78 public Boolean get() {
\r
79 return Boolean.valueOf(updater.isDisposed());
\r
83 public void refreshChildren(Collection<?> newChildren) {
\r
84 NodeContext[] ncs = toContextsWithInput(newChildren);
\r
85 setHasChildren(ncs.length > 0);
\r
86 setChildren(updater,ncs);
\r
87 updater.scheduleReplace(context, key, this);
\r
91 public Boolean hasChildren(ReadGraph graph) throws DatabaseException {
\r
92 // hasChildren must do the same graph operations as children
\r
93 // since they both share the same PrimitiveQueryUpdater.
\r
94 return children(graph).length > 0;
\r
99 class NodeViewpointFactory extends BaseViewpointFactory {
\r
101 public String toString() {
\r
105 class VP extends VPB {
\r
106 public VP(PrimitiveQueryUpdater updater, NodeContext context, ViewpointKey key) {
\r
107 super(updater, context, key);
\r
111 public NodeContext[] children(ReadGraph graph) throws DatabaseException {
\r
112 INode node = (INode) context.getConstant(BuiltinKeys.INPUT);
\r
113 if (node instanceof IUpdateable)
\r
114 ((IUpdateable) node).setChildrenCallback(this);
\r
116 Collection<?> children = node.getChildren(graph);
\r
117 for (Object child : children) {
\r
118 if (child instanceof IDisposable)
\r
119 ((IDisposable) child).setDisposedCallable(this);
\r
121 return toContextsWithInput(children);
\r
126 public Viewpoint create(PrimitiveQueryUpdater updater, NodeContext context, ViewpointKey key) {
\r
127 return new VP(updater, context, key);
\r
131 class NodeLabelerFactory implements LabelerFactory {
\r
133 public Labeler create(PrimitiveQueryUpdater updater, final NodeContext context, LabelerKey key) {
\r
134 return new LazyGraphLabeler(updater, context, key) {
\r
136 public Object getIdentity(LabelerKey key) {
\r
137 return NodeLabelerFactory.this.getClass();
\r
141 public Map<String, String> labels(ReadGraph graph) throws DatabaseException {
\r
142 return Collections.singletonMap(ColumnKeys.SINGLE,
\r
143 ((INode) context.getConstant(BuiltinKeys.INPUT)).getLabel(graph));
\r
147 public int category(ReadGraph graph) throws DatabaseException {
\r
148 return ((INode) context.getConstant(BuiltinKeys.INPUT)).getCategory(graph);
\r
152 public Logger getLogger() {
\r
153 return LoggerFactory.getLogger(NodeLabelerFactory.class);
\r
159 class NodeImagerFactory implements ImagerFactory {
\r
162 public Imager create(final PrimitiveQueryUpdater updater, final NodeContext context, final ImagerKey key) {
\r
163 final ContainerImager<ImageDescriptor> result = new ContainerImager<ImageDescriptor>();
\r
164 result.setImage(MissingImageDescriptor.getInstance());
\r
166 DataSource<ReadGraph> source = updater.getDataSource(ReadGraph.class);
\r
168 source.schedule(new Consumer<ReadGraph>() {
\r
171 public void accept(ReadGraph g) {
\r
173 INode node = (INode)context.getConstant(BuiltinKeys.INPUT);
\r
174 ImageDescriptor descriptor = node.getImage(g);
\r
175 result.setImage(descriptor);
\r
176 updater.scheduleReplace(context, key, result);
\r
177 } catch (DatabaseException e) {
\r
178 e.printStackTrace();
\r