]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/diagramEditor/DiagramViewerLoadJob.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.modeling.ui / src / org / simantics / modeling / ui / diagramEditor / DiagramViewerLoadJob.java
diff --git a/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/diagramEditor/DiagramViewerLoadJob.java b/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/diagramEditor/DiagramViewerLoadJob.java
new file mode 100644 (file)
index 0000000..d53ace2
--- /dev/null
@@ -0,0 +1,135 @@
+/*******************************************************************************\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