]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.selectionview/src/org/simantics/selectionview/TypedVariableTabContribution.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.selectionview / src / org / simantics / selectionview / TypedVariableTabContribution.java
diff --git a/bundles/org.simantics.selectionview/src/org/simantics/selectionview/TypedVariableTabContribution.java b/bundles/org.simantics.selectionview/src/org/simantics/selectionview/TypedVariableTabContribution.java
new file mode 100644 (file)
index 0000000..0e9330b
--- /dev/null
@@ -0,0 +1,147 @@
+package org.simantics.selectionview;\r
+\r
+import java.util.Collection;\r
+import java.util.Collections;\r
+\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.widgets.Composite;\r
+import org.eclipse.swt.widgets.Event;\r
+import org.eclipse.swt.widgets.Listener;\r
+import org.eclipse.ui.IWorkbenchSite;\r
+import org.simantics.Simantics;\r
+import org.simantics.databoard.Bindings;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.common.utils.Functions;\r
+import org.simantics.db.common.utils.Logger;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.layer0.variable.Variable;\r
+import org.simantics.layer0.Layer0;\r
+import org.simantics.ui.selection.WorkbenchSelectionUtils;\r
+import org.simantics.views.swt.SWTViewLoaderProcess;\r
+import org.simantics.views.swt.client.base.SWTRoot;\r
+\r
+public class TypedVariableTabContribution implements TabContribution<Object> {\r
+\r
+       final private Resource configuration;\r
+       \r
+       public TypedVariableTabContribution(ReadGraph graph, Resource configuration) throws DatabaseException {\r
+               this.configuration = configuration;\r
+       }\r
+       \r
+       static class Contribution extends ModelledTabContributor {\r
+\r
+               private String viewURI;\r
+               \r
+               public Contribution(String viewURI) {\r
+                       this.viewURI = viewURI;\r
+               }\r
+               \r
+               @Override\r
+               public void createControls(Composite body, IWorkbenchSite site) {\r
+\r
+                       try {\r
+\r
+                               final SWTViewLoaderProcess loader = new SWTViewLoaderProcess(null, site);\r
+                               final SWTRoot root = loader.load(viewURI, runtime);\r
+                               root.createControls(body);\r
+                               body.addListener(SWT.Dispose, new Listener() {\r
+                                       \r
+                                       @Override\r
+                                       public void handleEvent(Event event) {\r
+                                               if(!loader.isDisposed())\r
+                                                       loader.dispose();\r
+                                       }\r
+                                       \r
+                               });\r
+                               \r
+                       } catch (DatabaseException e) {\r
+\r
+                               e.printStackTrace();\r
+                               Logger.defaultLogError(e);\r
+\r
+                       }\r
+\r
+               }\r
+               \r
+           @Override\r
+           public boolean equals(Object obj) {\r
+               if (this == obj)\r
+                   return true;\r
+               else if (obj == null)\r
+                   return false;\r
+               else if (!(obj instanceof Contribution))\r
+                   return false;\r
+               Contribution c = (Contribution)obj;\r
+               return viewURI.equals(c.viewURI);\r
+           }\r
+           \r
+           @Override\r
+           public int hashCode() {\r
+               return viewURI.hashCode();\r
+           }\r
+               \r
+       }\r
+       \r
+\r
+       @Override\r
+       public boolean accept(ReadGraph graph, Object input) {\r
+               return true;\r
+//             return (input instanceof Variable);\r
+       }\r
+       \r
+       private Variable getPossibleVariable(ReadGraph graph, Object input) throws DatabaseException {\r
+\r
+               if(input instanceof Variable) {\r
+                       return (Variable)input;\r
+               } else {\r
+                       return WorkbenchSelectionUtils.getPossibleVariable(graph, input);\r
+               }\r
+               \r
+       }\r
+       \r
+       @Override\r
+       public void contribute(ReadGraph graph, final Object object, Collection<ComparableTabContributor> result) throws DatabaseException {\r
+               \r
+               Variable variable = getPossibleVariable(graph, object);\r
+               if(variable == null) return;\r
+               \r
+               Layer0 L0 = Layer0.getInstance(graph);\r
+               SelectionViewResources SEL = SelectionViewResources.getInstance(graph);\r
+               Collection<Resource> types = graph.getObjects(configuration, SEL.TypedVariableTabContribution_HasType);\r
+               if(types.isEmpty()) throw new DatabaseException("No type for " + graph.getPossibleURI(configuration));\r
+               Resource view = graph.getPossibleObject(configuration, SEL.VariableTabContribution_HasView);\r
+               if(view == null) {\r
+                       throw new DatabaseException("No view for " + graph.getPossibleURI(configuration));\r
+               }\r
+               Integer priority = graph.getPossibleRelatedValue(configuration, SEL.VariableTabContribution_HasPriority, Bindings.INTEGER);\r
+               String label = graph.getPossibleRelatedValue(configuration, L0.HasLabel);\r
+               final String viewURI = graph.getPossibleURI(view);\r
+\r
+        Resource resource = variable.getPossibleRepresents(graph);\r
+        if (resource == null)\r
+            return;\r
+\r
+        Collection<Resource> ts = graph.getTypes(resource);\r
+        \r
+        if (!Collections.disjoint(types, ts)) {\r
+\r
+               for(Resource r : graph.getObjects(configuration, SEL.VariableTabContribution_HasTest)) {\r
+                       Boolean pass = Functions.exec(graph, r, graph, variable);\r
+                       if(!pass) return;\r
+               }\r
+               \r
+               try {\r
+                       Variable transformed = Simantics.tryInvokeSCL(graph, configuration, SEL.VariableTabContribution_transformation, variable);\r
+                       if(transformed != null) variable = transformed;\r
+               } catch (DatabaseException e) {\r
+                       // Errors are just ignored\r
+               }\r
+               \r
+               result.add(new ComparableTabContributor(new Contribution(viewURI), priority, variable, label));\r
+\r
+        }\r
+\r
+       }\r
+\r
+}\r