]> gerrit.simantics Code Review - simantics/3d.git/blob - org.simantics.proconf.g3d/src/org/simantics/proconf/g3d/base/ThreeDimensionalEditorPart.java
Moved 3D plug-ins to /3d/branches/dev.
[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 IPartListener() {\r
53                 \r
54                 boolean opened = false;\r
55                 boolean activated = false;\r
56                 \r
57                 public void partOpened(IWorkbenchPart part) {\r
58                     if (part.equals(ThreeDimensionalEditorPart.this.getEditorSite().getPart())) {\r
59                         opened = true;\r
60                     }\r
61                 }\r
62                 \r
63                 public void partActivated(IWorkbenchPart part) {\r
64                         if (part.equals(ThreeDimensionalEditorPart.this.getEditorSite().getPart())) {\r
65                         if (opened & !activated) {\r
66                                 activated = true;\r
67                                 load();\r
68                         }\r
69                         }\r
70                 }\r
71                 \r
72                 public void partBroughtToTop(IWorkbenchPart part) {}\r
73                 \r
74                 public void partClosed(IWorkbenchPart part) {}\r
75                 \r
76                 public void partDeactivated(IWorkbenchPart part) {}\r
77                 \r
78                 private void load() {\r
79                         //System.out.println("ThreeDimensionalEditorPart.reload()");\r
80                     Session ses = ThreeDimensionalEditorPart.this.getSession();\r
81                     GraphRequestAdapter r = new GraphRequestAdapter() {\r
82                         @Override\r
83                         public GraphRequestStatus perform(Graph g)\r
84                                         throws Exception {\r
85                                  reload(g);\r
86                                 return GraphRequestStatus.transactionComplete();\r
87                         }\r
88                     };\r
89                     ses.asyncRead(r);\r
90                 }\r
91             });\r
92 \r
93             IActionBars actionBar = getEditorSite().getActionBars();\r
94 //            editor.setActionBarContributor(getEditorSite().getActionBarContributor());\r
95             editor.setActionBars(actionBar);\r
96             getSession().syncRead(new GraphRequestAdapter() {\r
97                 @Override\r
98                 public GraphRequestStatus perform(Graph g) throws Exception {\r
99                         editor.createControl(g,parent);\r
100                         return GraphRequestStatus.transactionComplete();\r
101                 }\r
102             });\r
103             \r
104             contributeStatusBar(actionBar.getStatusLineManager());\r
105             hookPageSelection(); \r
106             getSite().setSelectionProvider(editor.selectionAdapter);\r
107             \r
108 \r
109 \r
110         } catch (Exception e) {\r
111             Display d = getSite().getShell().getDisplay();\r
112             d.asyncExec(new Runnable() {\r
113                 public void run() {\r
114                     getSite().getPage().closeEditor(ThreeDimensionalEditorPart.this,false);\r
115                 }\r
116             });\r
117 \r
118             ErrorLogger logger = ErrorLogger.getDefault();\r
119             logger.logError("Shape editor failed to open, see exception for details", e);\r
120         }\r
121 \r
122     }\r
123     \r
124 \r
125     protected void contributeStatusBar(IStatusLineManager manager) {\r
126     }\r
127     \r
128     \r
129         @Override\r
130         public void reload(Graph g) {\r
131                 Resource inputResource = getInputResource();\r
132                 if (inputResource != null) {\r
133                         editor.reload(g,inputResource);\r
134                 } else {\r
135                         \r
136                          Display d = getSite().getShell().getDisplay();\r
137                     d.asyncExec(new Runnable() {\r
138                         public void run() {\r
139                                 editor.showMessage("Failed to load model.");\r
140                             getSite().getPage().closeEditor(ThreeDimensionalEditorPart.this,false);\r
141                         }\r
142                     });\r
143                 }\r
144         }\r
145         \r
146         @Override\r
147         public void update(GraphChangeEvent e) {\r
148                 editor.update(e);\r
149         }\r
150         \r
151         @Override\r
152         public void setFocus() {\r
153                 editor.setFocus();\r
154         }\r
155         \r
156          /**\r
157      * Hooks selection listening\r
158      */\r
159     private void hookPageSelection() {\r
160         pageSelectionListener = new ISelectionListener() {\r
161             public void selectionChanged(IWorkbenchPart part, ISelection selection) {\r
162                 if (part == ThreeDimensionalEditorPart.this)\r
163                     return;\r
164                 pageSelectionChanged(part, selection);\r
165             }\r
166         };\r
167         getSite().getPage().addPostSelectionListener(pageSelectionListener);\r
168         ISelection sel = getSite().getPage().getSelection();\r
169         IWorkbenchPart wb = getSite().getPage().getActivePart();\r
170         pageSelectionChanged(wb, sel);\r
171     }\r
172     \r
173     /**\r
174      * Receives selection changes\r
175      * \r
176      * @param part\r
177      * @param selection\r
178      */\r
179     protected void pageSelectionChanged(IWorkbenchPart part, ISelection selection) {\r
180         editor.pageSelectionChanged(part, selection);\r
181     }\r
182     \r
183     public void dispose() {\r
184         if (pageSelectionListener != null)\r
185             getSite().getPage().removePostSelectionListener(pageSelectionListener);\r
186         editor.dispose();\r
187         super.dispose();\r
188     }\r
189     \r
190     public ThreeDimensionalEditorBase getEditor() {\r
191         return editor;\r
192     }\r
193     \r
194     @Override\r
195     public Object getAdapter(Class adapter) {\r
196         Object o = super.getAdapter(adapter);\r
197         if (o == null) {\r
198                 o = editor.getAdapter(adapter);\r
199         }\r
200         return o;\r
201     }\r
202 \r
203 \r
204 \r
205 }\r