--- /dev/null
+/*******************************************************************************\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