]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.diagram.profile/src/org/simantics/diagram/profile/view/ActiveRuntimeDiagramInputSource.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.diagram.profile / src / org / simantics / diagram / profile / view / ActiveRuntimeDiagramInputSource.java
diff --git a/bundles/org.simantics.diagram.profile/src/org/simantics/diagram/profile/view/ActiveRuntimeDiagramInputSource.java b/bundles/org.simantics.diagram.profile/src/org/simantics/diagram/profile/view/ActiveRuntimeDiagramInputSource.java
new file mode 100644 (file)
index 0000000..3d143e6
--- /dev/null
@@ -0,0 +1,263 @@
+/*******************************************************************************\r
+ * Copyright (c) 2007, 2011 Association for Decentralized Information Management\r
+ * in Industry THTH ry.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ *     VTT Technical Research Centre of Finland - initial API and implementation\r
+ *******************************************************************************/\r
+package org.simantics.diagram.profile.view;\r
+\r
+import org.eclipse.swt.widgets.Display;\r
+import org.eclipse.ui.IEditorPart;\r
+import org.eclipse.ui.IEditorReference;\r
+import org.eclipse.ui.IPartListener2;\r
+import org.eclipse.ui.IPartService;\r
+import org.eclipse.ui.IWorkbenchPage;\r
+import org.eclipse.ui.IWorkbenchPart;\r
+import org.eclipse.ui.IWorkbenchPartReference;\r
+import org.eclipse.ui.IWorkbenchSite;\r
+import org.eclipse.ui.IWorkbenchWindow;\r
+import org.eclipse.ui.PlatformUI;\r
+import org.eclipse.ui.part.EditorPart;\r
+import org.simantics.Simantics;\r
+import org.simantics.browsing.ui.GraphExplorer;\r
+import org.simantics.browsing.ui.common.ErrorLogger;\r
+import org.simantics.browsing.ui.graph.impl.InputSourceListener;\r
+import org.simantics.browsing.ui.graph.impl.ObservableInputSource;\r
+import org.simantics.browsing.ui.graph.impl.WorkbenchSessionContextInputSource;\r
+import org.simantics.db.Disposable;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.Session;\r
+import org.simantics.db.common.request.UniqueRead;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.management.ISessionContext;\r
+import org.simantics.db.procedure.Procedure;\r
+import org.simantics.diagram.stubs.DiagramResource;\r
+import org.simantics.utils.ObjectUtils;\r
+import org.simantics.utils.ui.SWTUtils;\r
+\r
+/**\r
+ * @author Tuukka Lehtonen\r
+ */\r
+public class ActiveRuntimeDiagramInputSource implements WorkbenchSessionContextInputSource, ObservableInputSource, IPartListener2, Disposable {\r
+\r
+    protected Display             display;\r
+    protected IWorkbenchPart      ownerPart;\r
+    protected IPartService        service;\r
+    protected IEditorPart         activeEditor;\r
+    protected Resource            activeRuntimeDiagram;\r
+    protected InputSourceListener listener;\r
+    protected boolean             ownerIsVisible = true;\r
+    protected Resource            lastInputResource;\r
+\r
+    @Override\r
+    public void init(IWorkbenchSite site, IWorkbenchPart part) {\r
+        this.display = site.getShell().getDisplay();\r
+        this.ownerPart = part;\r
+        attachToWorkbench();\r
+    }\r
+\r
+    /**\r
+     * @thread SWT\r
+     */\r
+    protected void attachToWorkbench() {\r
+        IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();\r
+        if (window == null)\r
+            return;\r
+        service = window.getPartService();\r
+        service.addPartListener(this);\r
+\r
+        IWorkbenchPage activePage = window.getActivePage();\r
+        if (activePage == null)\r
+            return;\r
+        \r
+        IEditorPart activeEditor = activePage.getActiveEditor();\r
+        if (activeEditor != null)\r
+            editorActivated(activeEditor);\r
+    }\r
+\r
+    /**\r
+     * @thread SWT\r
+     */\r
+    @Override\r
+    public void dispose() {\r
+        if (service != null)\r
+            service.removePartListener(this);\r
+        service = null;\r
+        activeEditor = null;\r
+        activeRuntimeDiagram = null;\r
+        listener = null;\r
+        ownerPart = null;\r
+        display = null;\r
+    }\r
+\r
+    protected void fireIfInputChanged(Object oldSelection, Object newSelection) {\r
+        InputSourceListener l = listener;\r
+        if (l != null)\r
+            if (!ObjectUtils.objectEquals(oldSelection, newSelection))\r
+                l.inputChanged(this);\r
+    }\r
+\r
+    @Override\r
+    public Object get(ISessionContext ctx) {\r
+        return activeRuntimeDiagram != null ? activeRuntimeDiagram : GraphExplorer.EMPTY_INPUT;\r
+    }\r
+    \r
+    @Override\r
+    public IWorkbenchPart getProvider() {\r
+       return activeEditor;\r
+    }\r
+\r
+    @Override\r
+    public void setListener(InputSourceListener listener) {\r
+        this.listener = listener;\r
+    }\r
+\r
+    private static class InputTransformation extends UniqueRead<Resource> {\r
+\r
+        private Resource resource;\r
+        private Resource defaultResult;\r
+\r
+        public InputTransformation(Resource input, Resource defaultResult) {\r
+            this.resource = input;\r
+            this.defaultResult = defaultResult;\r
+        }\r
+\r
+        @Override\r
+        public Resource perform(ReadGraph graph) throws DatabaseException {\r
+            if (graph.isInstanceOf(resource, DiagramResource.getInstance(graph).RuntimeDiagram))\r
+                return resource;\r
+            if (!graph.hasStatement(resource))\r
+                return null;\r
+\r
+//            if (defaultResult != null && !graph.hasStatement(defaultResult))\r
+//                return null;\r
+\r
+            return defaultResult;\r
+        }\r
+\r
+    }\r
+\r
+    class InputProcedure implements Procedure<Resource> {\r
+        @Override\r
+        public void execute(Resource result) {\r
+            Display d = display;\r
+            if (d != null)\r
+                SWTUtils.asyncExec(d, () -> changeInput(result));\r
+        }\r
+        @Override\r
+        public void exception(Throwable t) {\r
+            ErrorLogger.defaultLogError(t);\r
+        }\r
+    }\r
+\r
+    private InputProcedure inputProcedure = new InputProcedure();\r
+\r
+    protected void testAndChangeInput(Resource resource) {\r
+        Session session = Simantics.peekSession();\r
+        if (session != null && resource != null) {\r
+            session.asyncRequest(\r
+                    new InputTransformation(resource, activeRuntimeDiagram),\r
+                    inputProcedure);\r
+        } else {\r
+            changeInput(null);\r
+        }\r
+    }\r
+\r
+    protected void editorActivated(IEditorPart part) {\r
+        Resource resource = part.getAdapter(Resource.class); \r
+        lastInputResource = resource;\r
+        if (ownerIsVisible) {\r
+            testAndChangeInput(resource);\r
+        }\r
+    }\r
+\r
+    private boolean allEditorsClosed(IEditorPart forWindowOfPart) {\r
+        for (IWorkbenchPage page : forWindowOfPart.getEditorSite().getWorkbenchWindow().getPages()) {\r
+            IEditorReference[] editors = page.getEditorReferences();\r
+            if (editors.length > 0)\r
+                return false;\r
+        }\r
+        return true;\r
+    }\r
+\r
+    protected void activeEditorClosed() {\r
+        if (allEditorsClosed(activeEditor))\r
+            changeInput(null);\r
+    }\r
+\r
+    private void changeInput(Resource newInput) {\r
+        Resource oldInput = activeRuntimeDiagram;\r
+        this.activeRuntimeDiagram = newInput;\r
+        fireIfInputChanged(oldInput, newInput != null ? newInput : GraphExplorer.EMPTY_INPUT);\r
+    }\r
+\r
+    @Override\r
+    public void partActivated(IWorkbenchPartReference partRef) {\r
+        //System.out.println("partActivated1: " + partRef);\r
+        if (partRef instanceof IEditorReference) {\r
+            IEditorPart part = ((IEditorReference) partRef).getEditor(false);\r
+            //System.out.println("partActivated2: " + part);\r
+            if (part instanceof EditorPart) {\r
+                editorActivated((IEditorPart) part);\r
+            }\r
+        }\r
+    }\r
+\r
+    @Override\r
+    public void partBroughtToTop(IWorkbenchPartReference partRef) {\r
+        //System.out.println("partBroughtToTop: " + partRef);\r
+    }\r
+\r
+    @Override\r
+    public void partClosed(IWorkbenchPartReference partRef) {\r
+        //System.out.println("partClosed1: " + partRef);\r
+        if (partRef instanceof IEditorReference) {\r
+            IEditorPart part = ((IEditorReference) partRef).getEditor(false);\r
+            //System.out.println("partClosed2: " + part);\r
+            if (part == activeEditor) {\r
+                activeEditorClosed();\r
+            }\r
+        }\r
+    }\r
+\r
+    @Override\r
+    public void partDeactivated(IWorkbenchPartReference partRef) {\r
+        //System.out.println("partDeactivated: " + partRef);\r
+    }\r
+\r
+    @Override\r
+    public void partOpened(IWorkbenchPartReference partRef) {\r
+        //System.out.println("partOpened: " + partRef);\r
+    }\r
+\r
+    @Override\r
+    public void partInputChanged(IWorkbenchPartReference partRef) {\r
+        //System.out.println("partInputChanged: " + partRef);\r
+    }\r
+\r
+    @Override\r
+    public void partHidden(IWorkbenchPartReference partRef) {\r
+        //System.out.println("partHidden: " + partRef);\r
+        IWorkbenchPart part = partRef.getPart(false);\r
+        if (ownerPart != null && ownerPart.equals(part)) {\r
+            ownerIsVisible = false;\r
+        }\r
+    }\r
+\r
+    @Override\r
+    public void partVisible(IWorkbenchPartReference partRef) {\r
+        //System.out.println("partVisible: " + partRef);\r
+        IWorkbenchPart part = partRef.getPart(false);\r
+        if (ownerPart != null && ownerPart.equals(part)) {\r
+            ownerIsVisible = true;\r
+            testAndChangeInput(lastInputResource);\r
+        }\r
+    }\r
+\r
+}\r