]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - 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
diff --git a/bundles/org.simantics.ui/src/org/simantics/ui/workbench/e4/E4ResourceEditorBase.java b/bundles/org.simantics.ui/src/org/simantics/ui/workbench/e4/E4ResourceEditorBase.java
new file mode 100644 (file)
index 0000000..b1ee2ec
--- /dev/null
@@ -0,0 +1,257 @@
+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