--- /dev/null
+package org.simantics.ui.workbench.e4;\r
+\r
+import java.util.Map;\r
+\r
+import javax.annotation.PostConstruct;\r
+import javax.annotation.PreDestroy;\r
+import javax.inject.Inject;\r
+\r
+import org.eclipse.e4.core.contexts.IEclipseContext;\r
+import org.eclipse.e4.ui.di.Focus;\r
+import org.eclipse.e4.ui.di.Persist;\r
+import org.eclipse.e4.ui.di.PersistState;\r
+import org.eclipse.e4.ui.model.application.ui.basic.MPart;\r
+import org.eclipse.e4.ui.workbench.modeling.EPartService;\r
+import org.eclipse.e4.ui.workbench.modeling.ESelectionService;\r
+import org.eclipse.swt.widgets.Composite;\r
+import org.simantics.Simantics;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.common.request.ParametrizedRead;\r
+import org.simantics.db.common.request.ReadRequest;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.layer0.request.PossibleModel;\r
+import org.simantics.db.layer0.variable.RVI;\r
+import org.simantics.db.layer0.variable.Variable;\r
+import org.simantics.db.layer0.variable.Variables;\r
+import org.simantics.db.service.SerialisationSupport;\r
+import org.simantics.ui.workbench.IResourceEditorInput;\r
+\r
+public abstract class E4ResourceEditorBase {\r
+\r
+ @Inject\r
+ private ESelectionService selectionService;\r
+\r
+ @Inject\r
+ private IEclipseContext eclipseContext;\r
+\r
+ private MPart part;\r
+ private boolean disposed;\r
+\r
+ private Resource resource;\r
+ private Variable variable;\r
+ private String rvi;\r
+ private Resource model;\r
+ \r
+ private IResourceEditorInput input;\r
+ private E4ResourceEditorSupport support;\r
+\r
+ @Inject\r
+ public final void init(MPart mPart) throws NumberFormatException, DatabaseException {\r
+ this.part = mPart;\r
+ readTransientState();\r
+ if (resource == null && model == null && rvi == null && variable == null)\r
+ readPersistentState();\r
+\r
+ deriveState();\r
+ initImpl(part);\r
+\r
+ if (!part.getTags().contains(EPartService.REMOVE_ON_HIDE_TAG)) {\r
+ part.getTags().add(EPartService.REMOVE_ON_HIDE_TAG);\r
+ }\r
+ }\r
+\r
+ public void initImpl(MPart part) { }\r
+\r
+ private void deriveState() throws DatabaseException {\r
+ boolean deriveVariable = variable == null && model != null;\r
+ boolean deriveModelAndRVI = variable != null;\r
+ boolean deriveModel = resource != null && model == null;\r
+\r
+ if (deriveModel || deriveModelAndRVI || deriveVariable) {\r
+ Simantics.getSession().syncRequest(new ReadRequest() {\r
+ \r
+ @Override\r
+ public void run(ReadGraph graph) throws DatabaseException {\r
+ if (deriveVariable) {\r
+ if (rvi != null) {\r
+ Variable configuration = Variables.getConfigurationContext(graph, model);\r
+ RVI rrvi = RVI.fromResourceFormat(graph, rvi);\r
+ variable = rrvi.resolve(graph, configuration);\r
+ }\r
+ // Absolute URI\r
+ else {\r
+ variable = Variables.getVariable(graph, model);\r
+ }\r
+ }\r
+\r
+ if (deriveModelAndRVI) {\r
+ model = Variables.getPossibleModel(graph, variable);\r
+ rvi = variable.getRVI(graph).toString();\r
+ }\r
+\r
+ if (deriveModel) {\r
+ model = graph.syncRequest(new PossibleModel(resource));\r
+ }\r
+ }\r
+ });\r
+ }\r
+\r
+ Map<String, Object> transientData = part.getTransientData(); \r
+ transientData.put(E4ResourceEditorConstants.KEY_RESOURCE, resource);\r
+ transientData.put(E4ResourceEditorConstants.KEY_MODEL, model);\r
+ transientData.put(E4ResourceEditorConstants.KEY_VARIABLE, variable);\r
+ transientData.put(E4ResourceEditorConstants.KEY_RVI, rvi);\r
+\r
+ if (resource != null) {\r
+ if (model != null) {\r
+ input = new E4ResourceEditorInput2(resource, model, rvi);\r
+ } else {\r
+ input = new E4ResourceEditorInput(resource);\r
+ }\r
+ }\r
+ }\r
+\r
+ protected void activateValidation() {\r
+ this.support = new E4ResourceEditorSupport(this, getInputValidator());\r
+ this.support.activateValidation();\r
+ }\r
+\r
+ protected void deactivateValidation() {\r
+ if (support != null) {\r
+ support.dispose();\r
+ support = null;\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Override to define your own input resource editor input validator that\r
+ * the view uses by default in {@link #initializeSupport()}.\r
+ */\r
+ protected ParametrizedRead<IResourceEditorInput, Boolean> getInputValidator() {\r
+ return null;\r
+ }\r
+\r
+ private void readTransientState() throws DatabaseException {\r
+ Map<String, Object> transientData = part.getTransientData();\r
+ // Read input resource\r
+ Object inputResource = transientData.get(E4ResourceEditorConstants.KEY_RESOURCE);\r
+ if (inputResource != null && inputResource instanceof Resource)\r
+ resource = (Resource) inputResource;\r
+\r
+ // Read input RVI\r
+ Object inputRVI = transientData.get(E4ResourceEditorConstants.KEY_RVI);\r
+ if (inputRVI != null && inputRVI instanceof String)\r
+ rvi = (String) inputRVI;\r
+\r
+ Object inputModel = transientData.get(E4ResourceEditorConstants.KEY_MODEL);\r
+ if (inputModel != null && inputModel instanceof Resource)\r
+ model = (Resource) inputModel;\r
+\r
+ // Read input variable\r
+ Object inputVariable = transientData.get(E4ResourceEditorConstants.KEY_VARIABLE);\r
+ if (inputVariable != null && inputVariable instanceof Variable)\r
+ variable = (Variable) inputVariable;\r
+ }\r
+\r
+ private void readPersistentState() throws NumberFormatException, DatabaseException {\r
+ Map<String, String> persistState = part.getPersistedState();\r
+ SerialisationSupport support = Simantics.getSession().getService(SerialisationSupport.class);\r
+ String inputResource = persistState.get(E4ResourceEditorConstants.KEY_RESOURCE);\r
+ if (inputResource != null)\r
+ resource = support.getResource(Long.parseLong(inputResource));\r
+\r
+ // Read input RVI\r
+ String inputRVI = persistState.get(E4ResourceEditorConstants.KEY_RVI);\r
+ if (inputRVI != null)\r
+ rvi = inputRVI;\r
+\r
+ String inputModel = persistState.get(E4ResourceEditorConstants.KEY_MODEL);\r
+ if (inputModel != null)\r
+ model = support.getResource(Long.parseLong(inputModel));\r
+ }\r
+\r
+ @PostConstruct\r
+ public void createEditor(Composite parent) {\r
+ createPartControl(parent);\r
+ }\r
+\r
+ public abstract void createPartControl(Composite parent);\r
+\r
+ @PersistState\r
+ public void persistState() {\r
+ System.out.println("persistState");\r
+ Map<String, String> persistedState = part.getPersistedState();\r
+ if (resource != null)\r
+ persistedState.put(E4ResourceEditorConstants.KEY_RESOURCE, Long.toString(resource.getResourceId()));\r
+ if (model != null)\r
+ persistedState.put(E4ResourceEditorConstants.KEY_MODEL, Long.toString(model.getResourceId()));\r
+ if (rvi != null)\r
+ persistedState.put(E4ResourceEditorConstants.KEY_RVI, rvi);\r
+ }\r
+\r
+ @Persist\r
+ public void persist() {\r
+ System.out.println("persist");\r
+ }\r
+\r
+ @PreDestroy\r
+ public void preDestroy() {\r
+ System.out.println("dispose");\r
+ disposed = true;\r
+ dispose();\r
+ deactivateValidation();\r
+ }\r
+\r
+ public abstract void dispose();\r
+\r
+ public boolean isDisposed() {\r
+ return disposed;\r
+ }\r
+\r
+ public abstract void setFocus();\r
+\r
+ @Focus\r
+ public void focus() {\r
+ setFocus();\r
+ }\r
+\r
+ public MPart getPart() {\r
+ return part;\r
+ }\r
+\r
+ public Resource getInputResource() {\r
+ return resource;\r
+ }\r
+\r
+ public Variable getInputVariable() {\r
+ return variable;\r
+ }\r
+\r
+ public String getInputRVI() {\r
+ return rvi;\r
+ }\r
+\r
+ public Resource getInputModelResource() {\r
+ return model;\r
+ }\r
+\r
+ public Resource assertInputModelResource() {\r
+ if (model == null)\r
+ throw new NullPointerException("Input model resource not defined, input resource is " + resource);\r
+ return model;\r
+ }\r
+\r
+ public IResourceEditorInput getResourceInput() {\r
+ return input;\r
+ }\r
+\r
+ public ESelectionService getSelectionService() {\r
+ return selectionService;\r
+ }\r
+\r
+ public IEclipseContext getContext() {\r
+ return eclipseContext;\r
+ }\r
+\r
+}\r