]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/diagramEditor/DiagramViewerLoadJob.java
Fix stupid NPE from DiagramViewerLoadJob
[simantics/platform.git] / bundles / org.simantics.modeling.ui / src / org / simantics / modeling / ui / diagramEditor / DiagramViewerLoadJob.java
index d53ace21c343f94829c14a4ed7ddb627777acb6c..dc9d9d1bef72f88c590167b14acc666edf33d19b 100644 (file)
-/*******************************************************************************\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
+/*******************************************************************************
+ * Copyright (c) 2012 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.modeling.ui.diagramEditor;
+
+import java.util.Collections;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.SubMonitor;
+import org.simantics.DatabaseJob;
+import org.simantics.db.exception.CancelTransactionException;
+import org.simantics.g2d.diagram.DiagramHints;
+import org.simantics.g2d.diagram.IDiagram;
+import org.simantics.modeling.ui.Activator;
+import org.simantics.utils.DataContainer;
+import org.simantics.utils.threads.ThreadUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class DiagramViewerLoadJob extends DatabaseJob {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(DiagramViewerLoadJob.class);
+
+    private static final boolean PROFILE = false;
+    private DiagramViewer        viewer;
+
+    public DiagramViewerLoadJob(DiagramViewer viewer) {
+        super(Messages.DiagramViewerLoadJob_LoadDiagram);
+        setUser(true);
+        this.viewer = viewer;
+    }
+
+    @Override
+    protected IStatus run(final IProgressMonitor monitor) {
+        final SubMonitor mon = SubMonitor.convert(monitor, Messages.DiagramViewerLoadJob_MonitorLoadingDiagram, 200);
+
+        try {
+            Object task = BEGIN("DV.loadDiagram"); //$NON-NLS-1$
+            final IDiagram diagram = viewer.loadDiagram(mon.newChild(100), viewer.diagramResource);
+            if (diagram == null)
+                return Status.CANCEL_STATUS;
+            END(task);
+
+            // Start an activation for the input resource.
+            // This will activate mapping if necessary.
+            task = BEGIN("DV.performActivation"); //$NON-NLS-1$
+            viewer.performActivation(mon.newChild(50));
+            END(task);
+
+            // Wait for load completion in AWT thread
+            ThreadUtils.syncExec(viewer.canvasContext.getThreadAccess(), new Runnable() {
+                @Override
+                public void run() {
+                    setThread(viewer.canvasContext.getThreadAccess().getThread());
+                    mon.setTaskName(Messages.DiagramViewerLoadJob_MonitorFinalizeDiagramLoading);
+
+                    try {
+                        Object task = BEGIN("DV.beforeSetDiagram"); //$NON-NLS-1$
+                        viewer.beforeSetDiagram(diagram);
+                        mon.worked(10);
+                        END(task);
+
+                        task = BEGIN("DV.setDiagramHint"); //$NON-NLS-1$
+                        mon.subTask(Messages.DiagramViewerLoadJob_SetDiagram);
+                        DataContainer<IDiagram> diagramContainer = viewer.sourceDiagramContainer;
+                        if (diagramContainer != null)
+                            diagramContainer.set( diagram );
+                        viewer.sourceDiagram = diagram;
+                        viewer.canvasContext.getDefaultHintContext().setHint(DiagramHints.KEY_DIAGRAM, diagram);
+                        mon.worked(10);
+                        END(task);
+
+                       viewer.selectionProvider.fireSelection(Collections.emptyList());
+                        
+                        // Zoom to fit if no previous view transform is available
+                        task = BEGIN("DV.scheduleZoomToFit"); //$NON-NLS-1$
+                        viewer.scheduleZoomToFit(diagram);
+                        mon.worked(10);
+                        END(task);
+
+                        task = BEGIN("DV.onCreated"); //$NON-NLS-1$
+                        mon.subTask(""); //$NON-NLS-1$
+                        viewer.onCreated();
+                        mon.worked(10);
+                        END(task);
+
+                        task = BEGIN("DV.applyEditorState"); //$NON-NLS-1$
+                        mon.subTask(Messages.DiagramViewerLoadJob_ApplyEditorState);
+                        viewer.applyEditorState(viewer.editorState, viewer.canvasContext);
+                        mon.worked(10);
+                        END(task);
+
+                        task = BEGIN("DV.activateUiContexts"); //$NON-NLS-1$
+                        viewer.contextUtil.inContextThread(new Runnable() {
+                            @Override
+                            public void run() {
+                                if (!viewer.disposed)
+                                    viewer.activateUiContexts(viewer.contextUtil);
+                                viewer = null;
+                            }
+                        });
+                        END(task);
+                    } catch (Throwable t) {
+                        LOGGER.error("Failed to complete loading of diagram {} in the canvas thread", viewer.diagramResource, t);
+                        viewer = null;
+                    }
+                }
+            });
+
+            return Status.OK_STATUS;
+        } catch (CancelTransactionException e) {
+            monitor.done();
+            viewer = null;
+            return new Status(IStatus.CANCEL, Activator.PLUGIN_ID, Messages.DiagramViewerLoadJob_ActivatorDiagramLoadingCancelled, e);
+        } catch (Throwable t) {
+            monitor.done();
+            viewer = null;
+            return new Status(IStatus.ERROR, Activator.PLUGIN_ID, Messages.DiagramViewerLoadJob_ActivatorDiagramLoadingFailed, t);
+        }
+    }
+
+    protected static Object BEGIN(String name) {
+        if (PROFILE) {
+            //return ThreadLog.BEGIN(name);
+        }
+        return null;
+    }
+
+    protected static void END(Object task) {
+        if (PROFILE) {
+            //((Task) task).end();
+        }
+    }
+}