--- /dev/null
+/*******************************************************************************\r
+ * Copyright (c) 2012 Association for Decentralized Information Management in\r
+ * 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.modeling.ui.diagramEditor;\r
+\r
+import org.eclipse.core.runtime.IProgressMonitor;\r
+import org.eclipse.core.runtime.IStatus;\r
+import org.eclipse.core.runtime.Status;\r
+import org.eclipse.core.runtime.SubMonitor;\r
+import org.simantics.DatabaseJob;\r
+import org.simantics.db.exception.CancelTransactionException;\r
+import org.simantics.g2d.diagram.DiagramHints;\r
+import org.simantics.g2d.diagram.IDiagram;\r
+import org.simantics.modeling.ui.Activator;\r
+import org.simantics.utils.DataContainer;\r
+import org.simantics.utils.threads.ThreadUtils;\r
+\r
+public class DiagramViewerLoadJob extends DatabaseJob {\r
+\r
+ private static final boolean PROFILE = false;\r
+ private DiagramViewer viewer;\r
+\r
+ public DiagramViewerLoadJob(DiagramViewer viewer) {\r
+ super("Load Diagram");\r
+ setUser(true);\r
+ this.viewer = viewer;\r
+ }\r
+\r
+ @Override\r
+ protected IStatus run(final IProgressMonitor monitor) {\r
+ final SubMonitor mon = SubMonitor.convert(monitor, "Loading Diagram", 200);\r
+\r
+ try {\r
+ Object task = BEGIN("DV.loadDiagram");\r
+ final IDiagram diagram = viewer.loadDiagram(mon.newChild(100), viewer.diagramResource);\r
+ if (diagram == null)\r
+ return Status.CANCEL_STATUS;\r
+ END(task);\r
+\r
+ // Start an activation for the input resource.\r
+ // This will activate mapping if necessary.\r
+ task = BEGIN("DV.performActivation");\r
+ viewer.performActivation(mon.newChild(50));\r
+ END(task);\r
+\r
+ // Wait for load completion in AWT thread\r
+ ThreadUtils.syncExec(viewer.canvasContext.getThreadAccess(), new Runnable() {\r
+ @Override\r
+ public void run() {\r
+ setThread(viewer.canvasContext.getThreadAccess().getThread());\r
+ mon.setTaskName("Finalize Diagram Loading");\r
+\r
+ try {\r
+ Object task = BEGIN("DV.beforeSetDiagram");\r
+ viewer.beforeSetDiagram(diagram);\r
+ mon.worked(10);\r
+ END(task);\r
+\r
+ task = BEGIN("DV.setDiagramHint");\r
+ mon.subTask("Set Diagram");\r
+ DataContainer<IDiagram> diagramContainer = viewer.sourceDiagramContainer;\r
+ if (diagramContainer != null)\r
+ diagramContainer.set( diagram );\r
+ viewer.sourceDiagram = diagram;\r
+ viewer.canvasContext.getDefaultHintContext().setHint(DiagramHints.KEY_DIAGRAM, diagram);\r
+ mon.worked(10);\r
+ END(task);\r
+\r
+ // Zoom to fit if no previous view transform is available\r
+ task = BEGIN("DV.scheduleZoomToFit");\r
+ viewer.scheduleZoomToFit(diagram);\r
+ mon.worked(10);\r
+ END(task);\r
+\r
+ task = BEGIN("DV.onCreated");\r
+ mon.subTask("");\r
+ viewer.onCreated();\r
+ mon.worked(10);\r
+ END(task);\r
+\r
+ task = BEGIN("DV.applyEditorState");\r
+ mon.subTask("Apply editor state");\r
+ viewer.applyEditorState(viewer.editorState, viewer.canvasContext);\r
+ mon.worked(10);\r
+ END(task);\r
+\r
+ task = BEGIN("DV.activateUiContexts");\r
+ viewer.contextUtil.inContextThread(new Runnable() {\r
+ @Override\r
+ public void run() {\r
+ if (!viewer.disposed)\r
+ viewer.activateUiContexts(viewer.contextUtil);\r
+ viewer = null;\r
+ }\r
+ });\r
+ END(task);\r
+ } catch (Throwable t) {\r
+ viewer = null;\r
+ }\r
+ }\r
+ });\r
+\r
+ return Status.OK_STATUS;\r
+ } catch (CancelTransactionException e) {\r
+ monitor.done();\r
+ viewer = null;\r
+ return new Status(IStatus.CANCEL, Activator.PLUGIN_ID, "Diagram loading was cancelled.", e);\r
+ } catch (Throwable t) {\r
+ monitor.done();\r
+ viewer = null;\r
+ return new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Diagram loading failed, see exception for details.", t);\r
+ }\r
+ }\r
+\r
+ protected static Object BEGIN(String name) {\r
+ if (PROFILE) {\r
+ //return ThreadLog.BEGIN(name);\r
+ }\r
+ return null;\r
+ }\r
+\r
+ protected static void END(Object task) {\r
+ if (PROFILE) {\r
+ //((Task) task).end();\r
+ }\r
+ }\r
+}\r