]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.browsing.ui.graph.impl/src/org/simantics/browsing/ui/graph/impl/contribution/FinalImagerContributionImpl.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.browsing.ui.graph.impl / src / org / simantics / browsing / ui / graph / impl / contribution / FinalImagerContributionImpl.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
3  * in Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.browsing.ui.graph.impl.contribution;\r
13 \r
14 import java.util.Collections;\r
15 import java.util.Map;\r
16 \r
17 import org.eclipse.jface.resource.ImageDescriptor;\r
18 import org.simantics.browsing.ui.BuiltinKeys;\r
19 import org.simantics.browsing.ui.BuiltinKeys.ImagerKey;\r
20 import org.simantics.browsing.ui.DataSource;\r
21 import org.simantics.browsing.ui.NodeContext;\r
22 import org.simantics.browsing.ui.PrimitiveQueryUpdater;\r
23 import org.simantics.browsing.ui.content.Imager;\r
24 import org.simantics.browsing.ui.graph.impl.request.ResourceQuery;\r
25 import org.simantics.db.ReadGraph;\r
26 import org.simantics.db.exception.DatabaseException;\r
27 import org.simantics.db.layer0.exception.PendingVariableException;\r
28 import org.simantics.db.procedure.Listener;\r
29 import org.simantics.db.procedure.Procedure;\r
30 import org.simantics.utils.ui.ErrorLogger;\r
31 \r
32 public abstract class FinalImagerContributionImpl implements Imager {\r
33 \r
34     private final static Map<String, ImageDescriptor>         PENDING = Collections.emptyMap();\r
35 \r
36     protected final PrimitiveQueryUpdater                     updater;\r
37     private final ResourceQuery<Map<String, ImageDescriptor>> imagerQuery;\r
38     \r
39     protected final NodeContext                                 context;\r
40     private final BuiltinKeys.ImagerKey                       key;\r
41 \r
42     protected Map<String, ImageDescriptor>                      content = null;\r
43 \r
44     public Object getIdentity(ImagerKey key) {\r
45         return key;\r
46     }\r
47 \r
48     public FinalImagerContributionImpl(final PrimitiveQueryUpdater updater, final NodeContext context, final ImagerKey key) {\r
49 \r
50         this.updater = updater;\r
51         this.context = context;\r
52         this.key = key;\r
53 \r
54         imagerQuery = new ResourceQuery<Map<String, ImageDescriptor>>(getIdentity(key), context) {\r
55 \r
56             @Override\r
57             public Map<String, ImageDescriptor> perform(ReadGraph graph) throws DatabaseException {\r
58                 try {\r
59                     return getDescriptors(graph, context);\r
60                 } catch (PendingVariableException e) {\r
61                     return PENDING;\r
62                 } catch (DatabaseException e) {\r
63                     throw e;\r
64                 } catch (Throwable t) {\r
65                     ErrorLogger.defaultLogError("LazyGraphLabeler.labelQuery produced unexpected exception.", t);\r
66                     return null;\r
67                 }\r
68             }\r
69 \r
70             @Override\r
71             public String toString() {\r
72                 return FinalImagerContributionImpl.this + " with context " + context;\r
73             }\r
74 \r
75         };\r
76 \r
77     }\r
78 \r
79     protected Procedure<Map<String, ImageDescriptor>> createProcedure() {\r
80 \r
81         return new Procedure<Map<String, ImageDescriptor>>() {\r
82 \r
83             @Override\r
84             public void execute(Map<String, ImageDescriptor> result) {\r
85                 replaceResult(result);\r
86             }\r
87 \r
88             @Override\r
89             public void exception(Throwable t) {\r
90                 ErrorLogger.defaultLogError("FinalImagerContributionImpl.imagerQuery failed, see exception for details.", t);\r
91             }\r
92 \r
93         };\r
94 \r
95     }\r
96 \r
97     protected void replaceResult(Map<String, ImageDescriptor> desc) {\r
98         content = desc;\r
99         updater.scheduleReplace(context, key, this);\r
100     }\r
101 \r
102     @SuppressWarnings("unchecked")\r
103     @Override\r
104     public ImageDescriptor getImage(String key) {\r
105         \r
106         if (content == null) {\r
107 \r
108             content = PENDING;\r
109 \r
110             final DataSource<ReadGraph> source = updater.getDataSource(ReadGraph.class);\r
111             assert(source != null);\r
112 \r
113             final Procedure<Map<String, ImageDescriptor>> procedure = createProcedure();\r
114             source.schedule(graph -> {\r
115                 if(procedure instanceof Listener<?>)\r
116                     graph.asyncRequest(imagerQuery, (Listener<Map<String, ImageDescriptor>>)procedure);\r
117                 else\r
118                     graph.asyncRequest(imagerQuery, procedure);\r
119             });\r
120 \r
121             return null;\r
122 \r
123         }\r
124 \r
125         ImageDescriptor descriptor = content.get(key);\r
126         return descriptor;\r
127     }\r
128 \r
129     // OVERRIDE\r
130 \r
131     public abstract Map<String, ImageDescriptor> getDescriptors(ReadGraph graph, NodeContext context) throws DatabaseException;\r
132 \r
133 }\r