]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - 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
diff --git a/bundles/org.simantics.document.ui/src/org/simantics/document/ui/dialogs/AnnotationConfigurator.java b/bundles/org.simantics.document.ui/src/org/simantics/document/ui/dialogs/AnnotationConfigurator.java
new file mode 100644 (file)
index 0000000..deadf5a
--- /dev/null
@@ -0,0 +1,207 @@
+package org.simantics.document.ui.dialogs;\r
+\r
+import java.util.ArrayList;\r
+import java.util.Collection;\r
+import java.util.List;\r
+\r
+import org.eclipse.jface.viewers.ISelection;\r
+import org.eclipse.jface.viewers.StructuredSelection;\r
+import org.eclipse.swt.widgets.Composite;\r
+import org.eclipse.ui.IWorkbenchPartSite;\r
+import org.simantics.Simantics;\r
+import org.simantics.annotation.ontology.AnnotationResource;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.Statement;\r
+import org.simantics.db.VirtualGraph;\r
+import org.simantics.db.WriteGraph;\r
+import org.simantics.db.common.request.WriteRequest;\r
+import org.simantics.db.common.request.WriteResultRequest;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.layer0.variable.Variable;\r
+import org.simantics.db.request.Read;\r
+import org.simantics.db.service.VirtualGraphSupport;\r
+import org.simantics.layer0.Layer0;\r
+import org.simantics.selectionview.ComparableTabContributor;\r
+import org.simantics.selectionview.IPropertyTab;\r
+import org.simantics.selectionview.TabContribution;\r
+import org.simantics.utils.ui.ExceptionUtils;\r
+\r
+/**\r
+ * Tool for configuring annotations for a resource before it is instantiated.\r
+ * \r
+ * @author Marko Luukkainen <marko.luukkainen@vtt.fi>\r
+ *\r
+ */\r
+public class AnnotationConfigurator {\r
+\r
+       private Resource type;\r
+       private Resource lib;\r
+       boolean useVG = false;\r
+       Variable annotationHolderVariable;\r
+       \r
+       public AnnotationConfigurator(Resource type, Resource lib) {\r
+               this.type = type;\r
+               this.lib = lib;\r
+               \r
+       }\r
+       \r
+       public void createComposite(Composite parent) {\r
+               annotationHolderVariable = createAnnotationHolder2();\r
+               \r
+//             IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();\r
+//             IWorkbenchPartSite site = page.getActivePart().getSite();\r
+               IWorkbenchPartSite site = null;\r
+               \r
+               Collection<ComparableTabContributor> contribution = getAnnotationTab(annotationHolderVariable);\r
+               ISelection selection = new StructuredSelection(annotationHolderVariable);\r
+               for (ComparableTabContributor c : contribution) {\r
+                       \r
+                       IPropertyTab tab = c.create(parent, site, Simantics.getSessionContext(), selection);\r
+                       tab.setInput(Simantics.getSessionContext(), selection, false);\r
+               }\r
+       }\r
+       \r
+       \r
+//     private Resource createAnnotationHolder() {\r
+//             VirtualGraph vg = null;\r
+//             if (useVG) {\r
+//                     VirtualGraphSupport support = Simantics.getSession().getService(VirtualGraphSupport.class);\r
+//                     vg = support.getMemoryPersistent("document_annotation");\r
+//             }\r
+//             Resource annotationHolder = null;\r
+//             try {\r
+//                     annotationHolder = Simantics.getSession().syncRequest(new WriteResultRequest<Resource>(vg) {\r
+//                             public Resource perform(WriteGraph graph) throws DatabaseException {\r
+//                                     Layer0 l0 = Layer0.getInstance(graph);\r
+//                                     Resource annotationHolderDoc = graph.newResource();\r
+//                                     graph.claim(annotationHolderDoc, l0.InstanceOf, type);\r
+//                                     graph.claimLiteral(annotationHolderDoc, l0.HasName, "Template");\r
+//                                     graph.claim(lib, l0.ConsistsOf, annotationHolderDoc);\r
+//                                     return annotationHolderDoc;\r
+//                             }\r
+//                     });\r
+//     \r
+//             } catch (DatabaseException e1) {\r
+//                     ExceptionUtils.logAndShowError(e1);\r
+//             }\r
+//             return annotationHolder;\r
+//     }\r
+       \r
+       private Variable createAnnotationHolder2() {\r
+               VirtualGraph vg = null;\r
+               if (useVG) {\r
+                       VirtualGraphSupport support = Simantics.getSession().getService(VirtualGraphSupport.class);\r
+                       vg = support.getMemoryPersistent("document_annotation");\r
+               }\r
+               Variable annotationHolder = null;\r
+               try {\r
+                       annotationHolder = Simantics.getSession().syncRequest(new WriteResultRequest<Variable>(vg) {\r
+                               public Variable perform(WriteGraph graph) throws DatabaseException {\r
+                                       Layer0 l0 = Layer0.getInstance(graph);\r
+                                       Resource annotationHolderDoc = graph.newResource();\r
+                                       graph.claim(annotationHolderDoc, l0.InstanceOf, type);\r
+                                       graph.claimLiteral(annotationHolderDoc, l0.HasName, "Template");\r
+                                       graph.claim(lib, l0.ConsistsOf, annotationHolderDoc);\r
+                                       if (graph.isInstanceOf(lib, type)) {\r
+                                               copyAnnotations(graph, lib, annotationHolderDoc);\r
+                                       }\r
+                                       return graph.adapt(annotationHolderDoc, Variable.class);\r
+                               }\r
+                       });\r
+       \r
+               } catch (DatabaseException e1) {\r
+                       ExceptionUtils.logAndShowError(e1);\r
+               }\r
+               return annotationHolder;\r
+       }\r
+       \r
+//     private Variable createAnnotationHolder3() {\r
+//             Resource r = createAnnotationHolder();\r
+//             return new StandardGraphChildVariable(null, null, r);\r
+//     }\r
+       \r
+       private Collection<ComparableTabContributor> getAnnotationTab(final Object selection) {\r
+               try {\r
+                       return Simantics.getSession().syncRequest(new Read<Collection<ComparableTabContributor>>() {\r
+                               @SuppressWarnings({ "rawtypes", "unchecked" })\r
+                               @Override\r
+                               public Collection<ComparableTabContributor> perform(ReadGraph graph)\r
+                                               throws DatabaseException {\r
+                                       AnnotationResource ann = AnnotationResource.getInstance(graph);\r
+                                       TabContribution contribution = graph.adapt(ann.SelectionTabContribution, TabContribution.class);\r
+                                       Collection<ComparableTabContributor> coll = new ArrayList<ComparableTabContributor>();\r
+                                       contribution.contribute(graph, selection, coll);\r
+                                       return coll;\r
+                               }\r
+                       });\r
+               } catch (DatabaseException e) {\r
+                       ExceptionUtils.logAndShowError(e);\r
+                       return null;\r
+               }\r
+       }\r
+       \r
+       public void apply(final Resource to) throws DatabaseException{\r
+               Simantics.getSession().syncRequest(new WriteRequest() {\r
+                       \r
+                       @Override\r
+                       public void perform(WriteGraph graph) throws DatabaseException {\r
+                               apply(graph, to);\r
+                       }\r
+               });\r
+               \r
+       }\r
+       \r
+       public void apply(WriteGraph graph, Resource to) throws DatabaseException{\r
+               Resource from = annotationHolderVariable.getPossibleRepresents(graph);\r
+               copyAnnotations(graph, from, to);\r
+\r
+       }\r
+       \r
+       private void copyAnnotations(WriteGraph graph, Resource from, Resource to) throws DatabaseException{\r
+               Layer0 l0 = Layer0.getInstance(graph);\r
+               AnnotationResource ann = AnnotationResource.getInstance(graph);\r
+               \r
+               List<Statement> annotations = new ArrayList<Statement>();\r
+               for (Statement s : graph.getStatements(from, l0.HasProperty)) {\r
+                       if (graph.isInstanceOf(s.getObject(),ann.Annotation) ){\r
+                               annotations.add(s);\r
+                       }\r
+               }\r
+               \r
+               for (Statement annotation : annotations) {\r
+                       Resource annotationInstance = graph.newResource();\r
+                       graph.claim(to, annotation.getPredicate(), annotationInstance);\r
+                       for (Resource type : graph.getObjects(annotation.getObject(), l0.InstanceOf)) {\r
+                               graph.claim(annotationInstance, l0.InstanceOf, type);\r
+                       }\r
+                       for (Statement property : graph.getStatements(annotation.getObject(), l0.HasProperty)) {\r
+                               if (property.isAsserted(annotation.getObject()))\r
+                                       continue;\r
+                               graph.claimLiteral(annotationInstance, property.getPredicate(), graph.getValue(property.getObject()));\r
+                       }\r
+               }\r
+       }\r
+       \r
+       public void dispose() {\r
+               \r
+               if (useVG) {\r
+                       VirtualGraphSupport support = Simantics.getSession().getService(VirtualGraphSupport.class);\r
+                       VirtualGraph vg = support.getMemoryPersistent("document_annotation");\r
+                       support.discard(vg);\r
+               } else {\r
+                       \r
+                       Simantics.getSession().asyncRequest(new WriteRequest() {\r
+                               \r
+                               @Override\r
+                               public void perform(WriteGraph graph) throws DatabaseException {\r
+                                       Resource r = annotationHolderVariable.getPossibleRepresents(graph);\r
+                                       graph.deny(r);\r
+                                       \r
+                               }\r
+                       });\r
+                       \r
+               }\r
+               \r
+       }\r
+}\r