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