]> gerrit.simantics Code Review - simantics/3d.git/blob - org.simantics.proconf.g3d/src/org/simantics/proconf/g3d/base/ThreeDimensionalEditorPart.java
f2f3bc121eb7f15657d3f212d3c994bdea9bed04
[simantics/3d.git] / org.simantics.proconf.g3d / src / org / simantics / proconf / g3d / base / ThreeDimensionalEditorPart.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007 VTT Technical Research Centre of Finland and others.\r
3  * All rights reserved. This program and the accompanying materials\r
4  * are made available under the terms of the Eclipse Public License v1.0\r
5  * which accompanies this distribution, and is available at\r
6  * http://www.eclipse.org/legal/epl-v10.html\r
7  *\r
8  * Contributors:\r
9  *     VTT Technical Research Centre of Finland - initial API and implementation\r
10  *******************************************************************************/\r
11 package org.simantics.proconf.g3d.base;\r
12 \r
13 import org.eclipse.jface.action.IStatusLineManager;\r
14 import org.eclipse.jface.viewers.ISelection;\r
15 import org.eclipse.swt.widgets.Composite;\r
16 import org.eclipse.swt.widgets.Display;\r
17 import org.eclipse.ui.IActionBars;\r
18 import org.eclipse.ui.IPartListener;\r
19 import org.eclipse.ui.ISelectionListener;\r
20 import org.eclipse.ui.IWorkbenchPart;\r
21 import org.simantics.db.Graph;\r
22 import org.simantics.db.GraphRequestAdapter;\r
23 import org.simantics.db.GraphRequestStatus;\r
24 import org.simantics.db.Session;\r
25 import org.simantics.db.Resource;\r
26 import org.simantics.db.events.GraphChangeEvent;\r
27 import org.simantics.db.management.ISessionContext;\r
28 import org.simantics.proconf.ui.workbench.ResourceEditorPart;\r
29 import org.simantics.utils.ErrorLogger;\r
30 \r
31 \r
32 public abstract class ThreeDimensionalEditorPart extends ResourceEditorPart implements ThreeDimensionalEditorProvider{\r
33         \r
34         protected Composite parent;\r
35         \r
36         protected ThreeDimensionalEditorBase editor;\r
37 \r
38     protected ISelectionListener pageSelectionListener;\r
39 \r
40         protected abstract ThreeDimensionalEditorBase createEditor(ISessionContext session);\r
41         \r
42         /**\r
43      * This is a callback that will allow us to create the viewer and it.\r
44      */\r
45     @Override\r
46     public void createPartControl(Composite p) {\r
47         this.parent = p;\r
48         try {\r
49                 editor = createEditor(getSessionContext());\r
50                 \r
51             // add partlistener that loads the scene-graph when the view has been created\r
52             this.getEditorSite().getPage().addPartListener(new EditorLoader() {\r
53 \r
54                 public IWorkbenchPart getWorkbechPart() {\r
55                         return ThreeDimensionalEditorPart.this.getEditorSite().getPart();\r
56                 }\r
57                 \r
58                 public void load() {\r
59                         //System.out.println("ThreeDimensionalEditorPart.reload()");\r
60                     Session ses = ThreeDimensionalEditorPart.this.getSession();\r
61                     GraphRequestAdapter r = new GraphRequestAdapter() {\r
62                         @Override\r
63                         public GraphRequestStatus perform(Graph g)\r
64                                         throws Exception {\r
65                                  reload(g);\r
66                                 return GraphRequestStatus.transactionComplete();\r
67                         }\r
68                     };\r
69                     ses.asyncRead(r);\r
70                 }\r
71             });\r
72 \r
73             IActionBars actionBar = getEditorSite().getActionBars();\r
74 //            editor.setActionBarContributor(getEditorSite().getActionBarContributor());\r
75             editor.setActionBars(actionBar);\r
76             getSession().syncRead(new GraphRequestAdapter() {\r
77                 @Override\r
78                 public GraphRequestStatus perform(Graph g) throws Exception {\r
79                         editor.createControl(g,parent);\r
80                         return GraphRequestStatus.transactionComplete();\r
81                 }\r
82             });\r
83             \r
84             contributeStatusBar(actionBar.getStatusLineManager());\r
85             hookPageSelection(); \r
86             getSite().setSelectionProvider(editor.selectionAdapter);\r
87             \r
88 \r
89 \r
90         } catch (Exception e) {\r
91             Display d = getSite().getShell().getDisplay();\r
92             d.asyncExec(new Runnable() {\r
93                 public void run() {\r
94                     getSite().getPage().closeEditor(ThreeDimensionalEditorPart.this,false);\r
95                 }\r
96             });\r
97 \r
98             ErrorLogger logger = ErrorLogger.getDefault();\r
99             logger.logError("Shape editor failed to open, see exception for details", e);\r
100         }\r
101 \r
102     }\r
103     \r
104 \r
105     protected void contributeStatusBar(IStatusLineManager manager) {\r
106     }\r
107     \r
108     \r
109         @Override\r
110         public void reload(Graph g) {\r
111                 Resource inputResource = getInputResource();\r
112                 if (inputResource != null) {\r
113                         editor.reload(g,inputResource);\r
114                 } else {\r
115                         \r
116                          Display d = getSite().getShell().getDisplay();\r
117                     d.asyncExec(new Runnable() {\r
118                         public void run() {\r
119                                 editor.showMessage("Failed to load model.");\r
120                             getSite().getPage().closeEditor(ThreeDimensionalEditorPart.this,false);\r
121                         }\r
122                     });\r
123                 }\r
124         }\r
125         \r
126         @Override\r
127         public void update(GraphChangeEvent e) {\r
128                 editor.update(e);\r
129         }\r
130         \r
131         @Override\r
132         public void setFocus() {\r
133                 editor.setFocus();\r
134         }\r
135         \r
136          /**\r
137      * Hooks selection listening\r
138      */\r
139     private void hookPageSelection() {\r
140         pageSelectionListener = new ISelectionListener() {\r
141             public void selectionChanged(IWorkbenchPart part, ISelection selection) {\r
142                 if (part == ThreeDimensionalEditorPart.this)\r
143                     return;\r
144                 pageSelectionChanged(part, selection);\r
145             }\r
146         };\r
147         getSite().getPage().addPostSelectionListener(pageSelectionListener);\r
148         ISelection sel = getSite().getPage().getSelection();\r
149         IWorkbenchPart wb = getSite().getPage().getActivePart();\r
150         pageSelectionChanged(wb, sel);\r
151     }\r
152     \r
153     /**\r
154      * Receives selection changes\r
155      * \r
156      * @param part\r
157      * @param selection\r
158      */\r
159     protected void pageSelectionChanged(IWorkbenchPart part, ISelection selection) {\r
160         editor.pageSelectionChanged(part, selection);\r
161     }\r
162     \r
163     public void dispose() {\r
164         if (pageSelectionListener != null)\r
165             getSite().getPage().removePostSelectionListener(pageSelectionListener);\r
166         editor.dispose();\r
167         super.dispose();\r
168     }\r
169     \r
170     public ThreeDimensionalEditorBase getEditor() {\r
171         return editor;\r
172     }\r
173     \r
174     @Override\r
175     public Object getAdapter(Class adapter) {\r
176         Object o = super.getAdapter(adapter);\r
177         if (o == null) {\r
178                 o = editor.getAdapter(adapter);\r
179         }\r
180         return o;\r
181     }\r
182 \r
183 \r
184 \r
185 }\r