]> gerrit.simantics Code Review - simantics/platform.git/blob - 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
1 package org.simantics.selectionview;\r
2 \r
3 import java.util.Collection;\r
4 import java.util.Collections;\r
5 \r
6 import org.eclipse.swt.SWT;\r
7 import org.eclipse.swt.widgets.Composite;\r
8 import org.eclipse.swt.widgets.Event;\r
9 import org.eclipse.swt.widgets.Listener;\r
10 import org.eclipse.ui.IWorkbenchSite;\r
11 import org.simantics.Simantics;\r
12 import org.simantics.databoard.Bindings;\r
13 import org.simantics.db.ReadGraph;\r
14 import org.simantics.db.Resource;\r
15 import org.simantics.db.common.utils.Functions;\r
16 import org.simantics.db.common.utils.Logger;\r
17 import org.simantics.db.exception.DatabaseException;\r
18 import org.simantics.db.layer0.variable.Variable;\r
19 import org.simantics.layer0.Layer0;\r
20 import org.simantics.ui.selection.WorkbenchSelectionUtils;\r
21 import org.simantics.views.swt.SWTViewLoaderProcess;\r
22 import org.simantics.views.swt.client.base.SWTRoot;\r
23 \r
24 public class TypedVariableTabContribution implements TabContribution<Object> {\r
25 \r
26         final private Resource configuration;\r
27         \r
28         public TypedVariableTabContribution(ReadGraph graph, Resource configuration) throws DatabaseException {\r
29                 this.configuration = configuration;\r
30         }\r
31         \r
32         static class Contribution extends ModelledTabContributor {\r
33 \r
34                 private String viewURI;\r
35                 \r
36                 public Contribution(String viewURI) {\r
37                         this.viewURI = viewURI;\r
38                 }\r
39                 \r
40                 @Override\r
41                 public void createControls(Composite body, IWorkbenchSite site) {\r
42 \r
43                         try {\r
44 \r
45                                 final SWTViewLoaderProcess loader = new SWTViewLoaderProcess(null, site);\r
46                                 final SWTRoot root = loader.load(viewURI, runtime);\r
47                                 root.createControls(body);\r
48                                 body.addListener(SWT.Dispose, new Listener() {\r
49                                         \r
50                                         @Override\r
51                                         public void handleEvent(Event event) {\r
52                                                 if(!loader.isDisposed())\r
53                                                         loader.dispose();\r
54                                         }\r
55                                         \r
56                                 });\r
57                                 \r
58                         } catch (DatabaseException e) {\r
59 \r
60                                 e.printStackTrace();\r
61                                 Logger.defaultLogError(e);\r
62 \r
63                         }\r
64 \r
65                 }\r
66                 \r
67             @Override\r
68             public boolean equals(Object obj) {\r
69                 if (this == obj)\r
70                     return true;\r
71                 else if (obj == null)\r
72                     return false;\r
73                 else if (!(obj instanceof Contribution))\r
74                     return false;\r
75                 Contribution c = (Contribution)obj;\r
76                 return viewURI.equals(c.viewURI);\r
77             }\r
78             \r
79             @Override\r
80             public int hashCode() {\r
81                 return viewURI.hashCode();\r
82             }\r
83                 \r
84         }\r
85         \r
86 \r
87         @Override\r
88         public boolean accept(ReadGraph graph, Object input) {\r
89                 return true;\r
90 //              return (input instanceof Variable);\r
91         }\r
92         \r
93         private Variable getPossibleVariable(ReadGraph graph, Object input) throws DatabaseException {\r
94 \r
95                 if(input instanceof Variable) {\r
96                         return (Variable)input;\r
97                 } else {\r
98                         return WorkbenchSelectionUtils.getPossibleVariable(graph, input);\r
99                 }\r
100                 \r
101         }\r
102         \r
103         @Override\r
104         public void contribute(ReadGraph graph, final Object object, Collection<ComparableTabContributor> result) throws DatabaseException {\r
105                 \r
106                 Variable variable = getPossibleVariable(graph, object);\r
107                 if(variable == null) return;\r
108                 \r
109                 Layer0 L0 = Layer0.getInstance(graph);\r
110                 SelectionViewResources SEL = SelectionViewResources.getInstance(graph);\r
111                 Collection<Resource> types = graph.getObjects(configuration, SEL.TypedVariableTabContribution_HasType);\r
112                 if(types.isEmpty()) throw new DatabaseException("No type for " + graph.getPossibleURI(configuration));\r
113                 Resource view = graph.getPossibleObject(configuration, SEL.VariableTabContribution_HasView);\r
114                 if(view == null) {\r
115                         throw new DatabaseException("No view for " + graph.getPossibleURI(configuration));\r
116                 }\r
117                 Integer priority = graph.getPossibleRelatedValue(configuration, SEL.VariableTabContribution_HasPriority, Bindings.INTEGER);\r
118                 String label = graph.getPossibleRelatedValue(configuration, L0.HasLabel);\r
119                 final String viewURI = graph.getPossibleURI(view);\r
120 \r
121         Resource resource = variable.getPossibleRepresents(graph);\r
122         if (resource == null)\r
123             return;\r
124 \r
125         Collection<Resource> ts = graph.getTypes(resource);\r
126         \r
127         if (!Collections.disjoint(types, ts)) {\r
128 \r
129                 for(Resource r : graph.getObjects(configuration, SEL.VariableTabContribution_HasTest)) {\r
130                         Boolean pass = Functions.exec(graph, r, graph, variable);\r
131                         if(!pass) return;\r
132                 }\r
133                 \r
134                 try {\r
135                         Variable transformed = Simantics.tryInvokeSCL(graph, configuration, SEL.VariableTabContribution_transformation, variable);\r
136                         if(transformed != null) variable = transformed;\r
137                 } catch (DatabaseException e) {\r
138                         // Errors are just ignored\r
139                 }\r
140                 \r
141                 result.add(new ComparableTabContributor(new Contribution(viewURI), priority, variable, label));\r
142 \r
143         }\r
144 \r
145         }\r
146 \r
147 }\r