]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.document.ui/src/org/simantics/document/ui/dialogs/AnnotationConfigurator.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.document.ui / src / org / simantics / document / ui / dialogs / AnnotationConfigurator.java
1 package org.simantics.document.ui.dialogs;\r
2 \r
3 import java.util.ArrayList;\r
4 import java.util.Collection;\r
5 import java.util.List;\r
6 \r
7 import org.eclipse.jface.viewers.ISelection;\r
8 import org.eclipse.jface.viewers.StructuredSelection;\r
9 import org.eclipse.swt.widgets.Composite;\r
10 import org.eclipse.ui.IWorkbenchPartSite;\r
11 import org.simantics.Simantics;\r
12 import org.simantics.annotation.ontology.AnnotationResource;\r
13 import org.simantics.db.ReadGraph;\r
14 import org.simantics.db.Resource;\r
15 import org.simantics.db.Statement;\r
16 import org.simantics.db.VirtualGraph;\r
17 import org.simantics.db.WriteGraph;\r
18 import org.simantics.db.common.request.WriteRequest;\r
19 import org.simantics.db.common.request.WriteResultRequest;\r
20 import org.simantics.db.exception.DatabaseException;\r
21 import org.simantics.db.layer0.variable.Variable;\r
22 import org.simantics.db.request.Read;\r
23 import org.simantics.db.service.VirtualGraphSupport;\r
24 import org.simantics.layer0.Layer0;\r
25 import org.simantics.selectionview.ComparableTabContributor;\r
26 import org.simantics.selectionview.IPropertyTab;\r
27 import org.simantics.selectionview.TabContribution;\r
28 import org.simantics.utils.ui.ExceptionUtils;\r
29 \r
30 /**\r
31  * Tool for configuring annotations for a resource before it is instantiated.\r
32  * \r
33  * @author Marko Luukkainen <marko.luukkainen@vtt.fi>\r
34  *\r
35  */\r
36 public class AnnotationConfigurator {\r
37 \r
38         private Resource type;\r
39         private Resource lib;\r
40         boolean useVG = false;\r
41         Variable annotationHolderVariable;\r
42         \r
43         public AnnotationConfigurator(Resource type, Resource lib) {\r
44                 this.type = type;\r
45                 this.lib = lib;\r
46                 \r
47         }\r
48         \r
49         public void createComposite(Composite parent) {\r
50                 annotationHolderVariable = createAnnotationHolder2();\r
51                 \r
52 //              IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();\r
53 //              IWorkbenchPartSite site = page.getActivePart().getSite();\r
54                 IWorkbenchPartSite site = null;\r
55                 \r
56                 Collection<ComparableTabContributor> contribution = getAnnotationTab(annotationHolderVariable);\r
57                 ISelection selection = new StructuredSelection(annotationHolderVariable);\r
58                 for (ComparableTabContributor c : contribution) {\r
59                         \r
60                         IPropertyTab tab = c.create(parent, site, Simantics.getSessionContext(), selection);\r
61                         tab.setInput(Simantics.getSessionContext(), selection, false);\r
62                 }\r
63         }\r
64         \r
65         \r
66 //      private Resource createAnnotationHolder() {\r
67 //              VirtualGraph vg = null;\r
68 //              if (useVG) {\r
69 //                      VirtualGraphSupport support = Simantics.getSession().getService(VirtualGraphSupport.class);\r
70 //                      vg = support.getMemoryPersistent("document_annotation");\r
71 //              }\r
72 //              Resource annotationHolder = null;\r
73 //              try {\r
74 //                      annotationHolder = Simantics.getSession().syncRequest(new WriteResultRequest<Resource>(vg) {\r
75 //                              public Resource perform(WriteGraph graph) throws DatabaseException {\r
76 //                                      Layer0 l0 = Layer0.getInstance(graph);\r
77 //                                      Resource annotationHolderDoc = graph.newResource();\r
78 //                                      graph.claim(annotationHolderDoc, l0.InstanceOf, type);\r
79 //                                      graph.claimLiteral(annotationHolderDoc, l0.HasName, "Template");\r
80 //                                      graph.claim(lib, l0.ConsistsOf, annotationHolderDoc);\r
81 //                                      return annotationHolderDoc;\r
82 //                              }\r
83 //                      });\r
84 //      \r
85 //              } catch (DatabaseException e1) {\r
86 //                      ExceptionUtils.logAndShowError(e1);\r
87 //              }\r
88 //              return annotationHolder;\r
89 //      }\r
90         \r
91         private Variable createAnnotationHolder2() {\r
92                 VirtualGraph vg = null;\r
93                 if (useVG) {\r
94                         VirtualGraphSupport support = Simantics.getSession().getService(VirtualGraphSupport.class);\r
95                         vg = support.getMemoryPersistent("document_annotation");\r
96                 }\r
97                 Variable annotationHolder = null;\r
98                 try {\r
99                         annotationHolder = Simantics.getSession().syncRequest(new WriteResultRequest<Variable>(vg) {\r
100                                 public Variable perform(WriteGraph graph) throws DatabaseException {\r
101                                         Layer0 l0 = Layer0.getInstance(graph);\r
102                                         Resource annotationHolderDoc = graph.newResource();\r
103                                         graph.claim(annotationHolderDoc, l0.InstanceOf, type);\r
104                                         graph.claimLiteral(annotationHolderDoc, l0.HasName, "Template");\r
105                                         graph.claim(lib, l0.ConsistsOf, annotationHolderDoc);\r
106                                         if (graph.isInstanceOf(lib, type)) {\r
107                                                 copyAnnotations(graph, lib, annotationHolderDoc);\r
108                                         }\r
109                                         return graph.adapt(annotationHolderDoc, Variable.class);\r
110                                 }\r
111                         });\r
112         \r
113                 } catch (DatabaseException e1) {\r
114                         ExceptionUtils.logAndShowError(e1);\r
115                 }\r
116                 return annotationHolder;\r
117         }\r
118         \r
119 //      private Variable createAnnotationHolder3() {\r
120 //              Resource r = createAnnotationHolder();\r
121 //              return new StandardGraphChildVariable(null, null, r);\r
122 //      }\r
123         \r
124         private Collection<ComparableTabContributor> getAnnotationTab(final Object selection) {\r
125                 try {\r
126                         return Simantics.getSession().syncRequest(new Read<Collection<ComparableTabContributor>>() {\r
127                                 @SuppressWarnings({ "rawtypes", "unchecked" })\r
128                                 @Override\r
129                                 public Collection<ComparableTabContributor> perform(ReadGraph graph)\r
130                                                 throws DatabaseException {\r
131                                         AnnotationResource ann = AnnotationResource.getInstance(graph);\r
132                                         TabContribution contribution = graph.adapt(ann.SelectionTabContribution, TabContribution.class);\r
133                                         Collection<ComparableTabContributor> coll = new ArrayList<ComparableTabContributor>();\r
134                                         contribution.contribute(graph, selection, coll);\r
135                                         return coll;\r
136                                 }\r
137                         });\r
138                 } catch (DatabaseException e) {\r
139                         ExceptionUtils.logAndShowError(e);\r
140                         return null;\r
141                 }\r
142         }\r
143         \r
144         public void apply(final Resource to) throws DatabaseException{\r
145                 Simantics.getSession().syncRequest(new WriteRequest() {\r
146                         \r
147                         @Override\r
148                         public void perform(WriteGraph graph) throws DatabaseException {\r
149                                 apply(graph, to);\r
150                         }\r
151                 });\r
152                 \r
153         }\r
154         \r
155         public void apply(WriteGraph graph, Resource to) throws DatabaseException{\r
156                 Resource from = annotationHolderVariable.getPossibleRepresents(graph);\r
157                 copyAnnotations(graph, from, to);\r
158 \r
159         }\r
160         \r
161         private void copyAnnotations(WriteGraph graph, Resource from, Resource to) throws DatabaseException{\r
162                 Layer0 l0 = Layer0.getInstance(graph);\r
163                 AnnotationResource ann = AnnotationResource.getInstance(graph);\r
164                 \r
165                 List<Statement> annotations = new ArrayList<Statement>();\r
166                 for (Statement s : graph.getStatements(from, l0.HasProperty)) {\r
167                         if (graph.isInstanceOf(s.getObject(),ann.Annotation) ){\r
168                                 annotations.add(s);\r
169                         }\r
170                 }\r
171                 \r
172                 for (Statement annotation : annotations) {\r
173                         Resource annotationInstance = graph.newResource();\r
174                         graph.claim(to, annotation.getPredicate(), annotationInstance);\r
175                         for (Resource type : graph.getObjects(annotation.getObject(), l0.InstanceOf)) {\r
176                                 graph.claim(annotationInstance, l0.InstanceOf, type);\r
177                         }\r
178                         for (Statement property : graph.getStatements(annotation.getObject(), l0.HasProperty)) {\r
179                                 if (property.isAsserted(annotation.getObject()))\r
180                                         continue;\r
181                                 graph.claimLiteral(annotationInstance, property.getPredicate(), graph.getValue(property.getObject()));\r
182                         }\r
183                 }\r
184         }\r
185         \r
186         public void dispose() {\r
187                 \r
188                 if (useVG) {\r
189                         VirtualGraphSupport support = Simantics.getSession().getService(VirtualGraphSupport.class);\r
190                         VirtualGraph vg = support.getMemoryPersistent("document_annotation");\r
191                         support.discard(vg);\r
192                 } else {\r
193                         \r
194                         Simantics.getSession().asyncRequest(new WriteRequest() {\r
195                                 \r
196                                 @Override\r
197                                 public void perform(WriteGraph graph) throws DatabaseException {\r
198                                         Resource r = annotationHolderVariable.getPossibleRepresents(graph);\r
199                                         graph.deny(r);\r
200                                         \r
201                                 }\r
202                         });\r
203                         \r
204                 }\r
205                 \r
206         }\r
207 }\r