]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/diagramEditor/DiagramViewerLoadJob.java
Still working for multiple readers
[simantics/platform.git] / bundles / org.simantics.modeling.ui / src / org / simantics / modeling / ui / diagramEditor / DiagramViewerLoadJob.java
1 /*******************************************************************************
2  * Copyright (c) 2012 Association for Decentralized Information Management in
3  * Industry THTH ry.
4  * All rights reserved. This program and the accompanying materials
5  * are made available under the terms of the Eclipse Public License v1.0
6  * which accompanies this distribution, and is available at
7  * http://www.eclipse.org/legal/epl-v10.html
8  *
9  * Contributors:
10  *     VTT Technical Research Centre of Finland - initial API and implementation
11  *******************************************************************************/
12 package org.simantics.modeling.ui.diagramEditor;
13
14 import java.util.Collections;
15
16 import org.eclipse.core.runtime.IProgressMonitor;
17 import org.eclipse.core.runtime.IStatus;
18 import org.eclipse.core.runtime.Status;
19 import org.eclipse.core.runtime.SubMonitor;
20 import org.simantics.DatabaseJob;
21 import org.simantics.db.exception.CancelTransactionException;
22 import org.simantics.g2d.diagram.DiagramHints;
23 import org.simantics.g2d.diagram.IDiagram;
24 import org.simantics.modeling.ui.Activator;
25 import org.simantics.threadlog.Task;
26 import org.simantics.threadlog.ThreadLog;
27 import org.simantics.utils.DataContainer;
28 import org.simantics.utils.threads.ThreadUtils;
29
30 public class DiagramViewerLoadJob extends DatabaseJob {
31
32     private static final boolean PROFILE = false;
33     private DiagramViewer        viewer;
34
35     public DiagramViewerLoadJob(DiagramViewer viewer) {
36         super("Load Diagram");
37         setUser(true);
38         this.viewer = viewer;
39     }
40
41     @Override
42     protected IStatus run(final IProgressMonitor monitor) {
43         final SubMonitor mon = SubMonitor.convert(monitor, "Loading Diagram", 200);
44
45         try {
46             Object task = BEGIN("DV.loadDiagram");
47             System.err.println("foo1");
48             final IDiagram diagram = viewer.loadDiagram(mon.newChild(100), viewer.diagramResource);
49             if (diagram == null)
50                 return Status.CANCEL_STATUS;
51             END(task);
52             System.err.println("foo2");
53
54             // Start an activation for the input resource.
55             // This will activate mapping if necessary.
56             task = BEGIN("DV.performActivation");
57             viewer.performActivation(mon.newChild(50));
58             END(task);
59
60             // Wait for load completion in AWT thread
61             ThreadUtils.syncExec(viewer.canvasContext.getThreadAccess(), new Runnable() {
62                 @Override
63                 public void run() {
64                     setThread(viewer.canvasContext.getThreadAccess().getThread());
65                     mon.setTaskName("Finalize Diagram Loading");
66
67                     try {
68                         Object task = BEGIN("DV.beforeSetDiagram");
69                         viewer.beforeSetDiagram(diagram);
70                         mon.worked(10);
71                         END(task);
72
73                         task = BEGIN("DV.setDiagramHint");
74                         mon.subTask("Set Diagram");
75                         DataContainer<IDiagram> diagramContainer = viewer.sourceDiagramContainer;
76                         if (diagramContainer != null)
77                             diagramContainer.set( diagram );
78                         viewer.sourceDiagram = diagram;
79                         viewer.canvasContext.getDefaultHintContext().setHint(DiagramHints.KEY_DIAGRAM, diagram);
80                         mon.worked(10);
81                         END(task);
82
83                         viewer.selectionProvider.fireSelection(Collections.emptyList());
84                         
85                         // Zoom to fit if no previous view transform is available
86                         task = BEGIN("DV.scheduleZoomToFit");
87                         viewer.scheduleZoomToFit(diagram);
88                         mon.worked(10);
89                         END(task);
90
91                         task = BEGIN("DV.onCreated");
92                         mon.subTask("");
93                         viewer.onCreated();
94                         mon.worked(10);
95                         END(task);
96
97                         task = BEGIN("DV.applyEditorState");
98                         mon.subTask("Apply editor state");
99                         viewer.applyEditorState(viewer.editorState, viewer.canvasContext);
100                         mon.worked(10);
101                         END(task);
102
103                         task = BEGIN("DV.activateUiContexts");
104                         viewer.contextUtil.inContextThread(new Runnable() {
105                             @Override
106                             public void run() {
107                                 if (!viewer.disposed)
108                                     viewer.activateUiContexts(viewer.contextUtil);
109                                 viewer = null;
110                             }
111                         });
112                         END(task);
113                     } catch (Throwable t) {
114                         viewer = null;
115                     }
116                 }
117             });
118
119             return Status.OK_STATUS;
120         } catch (CancelTransactionException e) {
121             monitor.done();
122             viewer = null;
123             return new Status(IStatus.CANCEL, Activator.PLUGIN_ID, "Diagram loading was cancelled.", e);
124         } catch (Throwable t) {
125             monitor.done();
126             viewer = null;
127             return new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Diagram loading failed, see exception for details.", t);
128         }
129     }
130
131     protected static Object BEGIN(String name) {
132         if (PROFILE) {
133             return ThreadLog.BEGIN(name);
134         }
135         return null;
136     }
137
138     protected static void END(Object task) {
139         if (PROFILE) {
140             ((Task) task).end();
141         }
142     }
143 }