]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.ui/src/org/simantics/ui/workbench/e4/E4ResourceEditorBase.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.ui / src / org / simantics / ui / workbench / e4 / E4ResourceEditorBase.java
1 package org.simantics.ui.workbench.e4;\r
2 \r
3 import java.util.Map;\r
4 \r
5 import javax.annotation.PostConstruct;\r
6 import javax.annotation.PreDestroy;\r
7 import javax.inject.Inject;\r
8 \r
9 import org.eclipse.e4.core.contexts.IEclipseContext;\r
10 import org.eclipse.e4.ui.di.Focus;\r
11 import org.eclipse.e4.ui.di.Persist;\r
12 import org.eclipse.e4.ui.di.PersistState;\r
13 import org.eclipse.e4.ui.model.application.ui.basic.MPart;\r
14 import org.eclipse.e4.ui.workbench.modeling.EPartService;\r
15 import org.eclipse.e4.ui.workbench.modeling.ESelectionService;\r
16 import org.eclipse.swt.widgets.Composite;\r
17 import org.simantics.Simantics;\r
18 import org.simantics.db.ReadGraph;\r
19 import org.simantics.db.Resource;\r
20 import org.simantics.db.common.request.ParametrizedRead;\r
21 import org.simantics.db.common.request.ReadRequest;\r
22 import org.simantics.db.exception.DatabaseException;\r
23 import org.simantics.db.layer0.request.PossibleModel;\r
24 import org.simantics.db.layer0.variable.RVI;\r
25 import org.simantics.db.layer0.variable.Variable;\r
26 import org.simantics.db.layer0.variable.Variables;\r
27 import org.simantics.db.service.SerialisationSupport;\r
28 import org.simantics.ui.workbench.IResourceEditorInput;\r
29 \r
30 public abstract class E4ResourceEditorBase {\r
31 \r
32     @Inject\r
33     private ESelectionService selectionService;\r
34 \r
35     @Inject\r
36     private IEclipseContext eclipseContext;\r
37 \r
38     private MPart part;\r
39     private boolean disposed;\r
40 \r
41     private Resource resource;\r
42     private Variable variable;\r
43     private String rvi;\r
44     private Resource model;\r
45     \r
46     private IResourceEditorInput input;\r
47     private E4ResourceEditorSupport support;\r
48 \r
49     @Inject\r
50     public final void init(MPart mPart) throws NumberFormatException, DatabaseException {\r
51         this.part = mPart;\r
52         readTransientState();\r
53         if (resource == null && model == null && rvi == null && variable == null)\r
54             readPersistentState();\r
55 \r
56         deriveState();\r
57         initImpl(part);\r
58 \r
59         if (!part.getTags().contains(EPartService.REMOVE_ON_HIDE_TAG)) {\r
60             part.getTags().add(EPartService.REMOVE_ON_HIDE_TAG);\r
61         }\r
62     }\r
63 \r
64     public void initImpl(MPart part) { }\r
65 \r
66     private void deriveState() throws DatabaseException {\r
67         boolean deriveVariable = variable == null && model != null;\r
68         boolean deriveModelAndRVI = variable != null;\r
69         boolean deriveModel = resource != null && model == null;\r
70 \r
71         if (deriveModel || deriveModelAndRVI || deriveVariable) {\r
72             Simantics.getSession().syncRequest(new ReadRequest() {\r
73                 \r
74                 @Override\r
75                 public void run(ReadGraph graph) throws DatabaseException {\r
76                     if (deriveVariable) {\r
77                         if (rvi != null) {\r
78                             Variable configuration = Variables.getConfigurationContext(graph, model);\r
79                             RVI rrvi = RVI.fromResourceFormat(graph, rvi);\r
80                             variable = rrvi.resolve(graph, configuration);\r
81                         }\r
82                         // Absolute URI\r
83                         else {\r
84                             variable = Variables.getVariable(graph, model);\r
85                         }\r
86                     }\r
87 \r
88                     if (deriveModelAndRVI) {\r
89                         model = Variables.getPossibleModel(graph, variable);\r
90                         rvi = variable.getRVI(graph).toString();\r
91                     }\r
92 \r
93                     if (deriveModel) {\r
94                         model = graph.syncRequest(new PossibleModel(resource));\r
95                     }\r
96                 }\r
97             });\r
98         }\r
99 \r
100         Map<String, Object> transientData = part.getTransientData(); \r
101         transientData.put(E4ResourceEditorConstants.KEY_RESOURCE, resource);\r
102         transientData.put(E4ResourceEditorConstants.KEY_MODEL, model);\r
103         transientData.put(E4ResourceEditorConstants.KEY_VARIABLE, variable);\r
104         transientData.put(E4ResourceEditorConstants.KEY_RVI, rvi);\r
105 \r
106         if (resource != null) {\r
107             if (model != null) {\r
108                 input = new E4ResourceEditorInput2(resource, model, rvi);\r
109             } else {\r
110                 input = new E4ResourceEditorInput(resource);\r
111             }\r
112         }\r
113     }\r
114 \r
115     protected void activateValidation() {\r
116         this.support = new E4ResourceEditorSupport(this, getInputValidator());\r
117         this.support.activateValidation();\r
118     }\r
119 \r
120     protected void deactivateValidation() {\r
121         if (support != null) {\r
122             support.dispose();\r
123             support = null;\r
124         }\r
125     }\r
126 \r
127     /**\r
128      * Override to define your own input resource editor input validator that\r
129      * the view uses by default in {@link #initializeSupport()}.\r
130      */\r
131     protected ParametrizedRead<IResourceEditorInput, Boolean> getInputValidator() {\r
132         return null;\r
133     }\r
134 \r
135     private void readTransientState() throws DatabaseException {\r
136         Map<String, Object> transientData = part.getTransientData();\r
137         // Read input resource\r
138         Object inputResource = transientData.get(E4ResourceEditorConstants.KEY_RESOURCE);\r
139         if (inputResource != null && inputResource instanceof Resource)\r
140             resource = (Resource) inputResource;\r
141 \r
142         // Read input RVI\r
143         Object inputRVI = transientData.get(E4ResourceEditorConstants.KEY_RVI);\r
144         if (inputRVI != null && inputRVI instanceof String)\r
145             rvi = (String) inputRVI;\r
146 \r
147         Object inputModel = transientData.get(E4ResourceEditorConstants.KEY_MODEL);\r
148         if (inputModel != null && inputModel instanceof Resource)\r
149             model = (Resource) inputModel;\r
150 \r
151         // Read input variable\r
152         Object inputVariable = transientData.get(E4ResourceEditorConstants.KEY_VARIABLE);\r
153         if (inputVariable != null && inputVariable instanceof Variable)\r
154             variable = (Variable) inputVariable;\r
155     }\r
156 \r
157     private void readPersistentState() throws NumberFormatException, DatabaseException {\r
158         Map<String, String> persistState = part.getPersistedState();\r
159         SerialisationSupport support = Simantics.getSession().getService(SerialisationSupport.class);\r
160         String inputResource = persistState.get(E4ResourceEditorConstants.KEY_RESOURCE);\r
161         if (inputResource != null)\r
162             resource = support.getResource(Long.parseLong(inputResource));\r
163 \r
164         // Read input RVI\r
165         String inputRVI = persistState.get(E4ResourceEditorConstants.KEY_RVI);\r
166         if (inputRVI != null)\r
167             rvi = inputRVI;\r
168 \r
169         String inputModel = persistState.get(E4ResourceEditorConstants.KEY_MODEL);\r
170         if (inputModel != null)\r
171             model = support.getResource(Long.parseLong(inputModel));\r
172     }\r
173 \r
174     @PostConstruct\r
175     public void createEditor(Composite parent) {\r
176         createPartControl(parent);\r
177     }\r
178 \r
179     public abstract void createPartControl(Composite parent);\r
180 \r
181     @PersistState\r
182     public void persistState() {\r
183         System.out.println("persistState");\r
184         Map<String, String> persistedState = part.getPersistedState();\r
185         if (resource != null)\r
186             persistedState.put(E4ResourceEditorConstants.KEY_RESOURCE, Long.toString(resource.getResourceId()));\r
187         if (model != null)\r
188             persistedState.put(E4ResourceEditorConstants.KEY_MODEL, Long.toString(model.getResourceId()));\r
189         if (rvi != null)\r
190             persistedState.put(E4ResourceEditorConstants.KEY_RVI, rvi);\r
191     }\r
192 \r
193     @Persist\r
194     public void persist() {\r
195         System.out.println("persist");\r
196     }\r
197 \r
198     @PreDestroy\r
199     public void preDestroy() {\r
200         System.out.println("dispose");\r
201         disposed = true;\r
202         dispose();\r
203         deactivateValidation();\r
204     }\r
205 \r
206     public abstract void dispose();\r
207 \r
208     public boolean isDisposed() {\r
209         return disposed;\r
210     }\r
211 \r
212     public abstract void setFocus();\r
213 \r
214     @Focus\r
215     public void focus() {\r
216         setFocus();\r
217     }\r
218 \r
219     public MPart getPart() {\r
220         return part;\r
221     }\r
222 \r
223     public Resource getInputResource() {\r
224         return resource;\r
225     }\r
226 \r
227     public Variable getInputVariable() {\r
228         return variable;\r
229     }\r
230 \r
231     public String getInputRVI() {\r
232         return rvi;\r
233     }\r
234 \r
235     public Resource getInputModelResource() {\r
236         return model;\r
237     }\r
238 \r
239     public Resource assertInputModelResource() {\r
240         if (model == null)\r
241             throw new NullPointerException("Input model resource not defined, input resource is " + resource);\r
242         return model;\r
243     }\r
244 \r
245     public IResourceEditorInput getResourceInput() {\r
246         return input;\r
247     }\r
248 \r
249     public ESelectionService getSelectionService() {\r
250         return selectionService;\r
251     }\r
252 \r
253     public IEclipseContext getContext() {\r
254         return eclipseContext;\r
255     }\r
256 \r
257 }\r