1 package org.simantics.ui.workbench.e4;
\r
3 import java.util.Map;
\r
5 import javax.annotation.PostConstruct;
\r
6 import javax.annotation.PreDestroy;
\r
7 import javax.inject.Inject;
\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
30 public abstract class E4ResourceEditorBase {
\r
33 private ESelectionService selectionService;
\r
36 private IEclipseContext eclipseContext;
\r
39 private boolean disposed;
\r
41 private Resource resource;
\r
42 private Variable variable;
\r
44 private Resource model;
\r
46 private IResourceEditorInput input;
\r
47 private E4ResourceEditorSupport support;
\r
50 public final void init(MPart mPart) throws NumberFormatException, DatabaseException {
\r
52 readTransientState();
\r
53 if (resource == null && model == null && rvi == null && variable == null)
\r
54 readPersistentState();
\r
59 if (!part.getTags().contains(EPartService.REMOVE_ON_HIDE_TAG)) {
\r
60 part.getTags().add(EPartService.REMOVE_ON_HIDE_TAG);
\r
64 public void initImpl(MPart part) { }
\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
71 if (deriveModel || deriveModelAndRVI || deriveVariable) {
\r
72 Simantics.getSession().syncRequest(new ReadRequest() {
\r
75 public void run(ReadGraph graph) throws DatabaseException {
\r
76 if (deriveVariable) {
\r
78 Variable configuration = Variables.getConfigurationContext(graph, model);
\r
79 RVI rrvi = RVI.fromResourceFormat(graph, rvi);
\r
80 variable = rrvi.resolve(graph, configuration);
\r
84 variable = Variables.getVariable(graph, model);
\r
88 if (deriveModelAndRVI) {
\r
89 model = Variables.getPossibleModel(graph, variable);
\r
90 rvi = variable.getRVI(graph).toString();
\r
94 model = graph.syncRequest(new PossibleModel(resource));
\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
106 if (resource != null) {
\r
107 if (model != null) {
\r
108 input = new E4ResourceEditorInput2(resource, model, rvi);
\r
110 input = new E4ResourceEditorInput(resource);
\r
115 protected void activateValidation() {
\r
116 this.support = new E4ResourceEditorSupport(this, getInputValidator());
\r
117 this.support.activateValidation();
\r
120 protected void deactivateValidation() {
\r
121 if (support != null) {
\r
128 * Override to define your own input resource editor input validator that
\r
129 * the view uses by default in {@link #initializeSupport()}.
\r
131 protected ParametrizedRead<IResourceEditorInput, Boolean> getInputValidator() {
\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
143 Object inputRVI = transientData.get(E4ResourceEditorConstants.KEY_RVI);
\r
144 if (inputRVI != null && inputRVI instanceof String)
\r
145 rvi = (String) inputRVI;
\r
147 Object inputModel = transientData.get(E4ResourceEditorConstants.KEY_MODEL);
\r
148 if (inputModel != null && inputModel instanceof Resource)
\r
149 model = (Resource) inputModel;
\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
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
165 String inputRVI = persistState.get(E4ResourceEditorConstants.KEY_RVI);
\r
166 if (inputRVI != null)
\r
169 String inputModel = persistState.get(E4ResourceEditorConstants.KEY_MODEL);
\r
170 if (inputModel != null)
\r
171 model = support.getResource(Long.parseLong(inputModel));
\r
175 public void createEditor(Composite parent) {
\r
176 createPartControl(parent);
\r
179 public abstract void createPartControl(Composite parent);
\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
188 persistedState.put(E4ResourceEditorConstants.KEY_MODEL, Long.toString(model.getResourceId()));
\r
190 persistedState.put(E4ResourceEditorConstants.KEY_RVI, rvi);
\r
194 public void persist() {
\r
195 System.out.println("persist");
\r
199 public void preDestroy() {
\r
200 System.out.println("dispose");
\r
203 deactivateValidation();
\r
206 public abstract void dispose();
\r
208 public boolean isDisposed() {
\r
212 public abstract void setFocus();
\r
215 public void focus() {
\r
219 public MPart getPart() {
\r
223 public Resource getInputResource() {
\r
227 public Variable getInputVariable() {
\r
231 public String getInputRVI() {
\r
235 public Resource getInputModelResource() {
\r
239 public Resource assertInputModelResource() {
\r
241 throw new NullPointerException("Input model resource not defined, input resource is " + resource);
\r
245 public IResourceEditorInput getResourceInput() {
\r
249 public ESelectionService getSelectionService() {
\r
250 return selectionService;
\r
253 public IEclipseContext getContext() {
\r
254 return eclipseContext;
\r