]> gerrit.simantics Code Review - simantics/3d.git/blob - org.simantics.proconf.g3d/src/org/simantics/proconf/g3d/views/SinglePageResourceEditor.java
ErrorLogger moved (integration)
[simantics/3d.git] / org.simantics.proconf.g3d / src / org / simantics / proconf / g3d / views / SinglePageResourceEditor.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.views;\r
12 \r
13 import org.eclipse.jface.viewers.ISelection;\r
14 import org.eclipse.swt.layout.GridData;\r
15 import org.eclipse.swt.layout.GridLayout;\r
16 import org.eclipse.swt.widgets.Composite;\r
17 import org.eclipse.swt.widgets.Display;\r
18 import org.eclipse.ui.IPartListener;\r
19 import org.eclipse.ui.IWorkbenchPart;\r
20 import org.eclipse.ui.forms.events.ExpansionAdapter;\r
21 import org.eclipse.ui.forms.events.ExpansionEvent;\r
22 import org.eclipse.ui.forms.widgets.FormToolkit;\r
23 import org.eclipse.ui.forms.widgets.ScrolledForm;\r
24 import org.eclipse.ui.forms.widgets.Section;\r
25 import org.simantics.db.Graph;\r
26 import org.simantics.db.GraphRequestAdapter;\r
27 import org.simantics.db.GraphRequestStatus;\r
28 import org.simantics.db.Session;\r
29 import org.simantics.proconf.g3d.common.StructuredResourceSelection;\r
30 import org.simantics.proconf.ui.workbench.ResourceEditorPart;\r
31 import org.simantics.utils.ui.ErrorLogger;\r
32 import org.simantics.utils.ui.ISelectionUtils;\r
33 import org.simantics.utils.ui.jface.BaseSelectionProvider;\r
34 \r
35 \r
36 \r
37 public abstract class SinglePageResourceEditor extends ResourceEditorPart {\r
38         private ScrolledForm form;\r
39         private BaseSelectionProvider defaultInputSelectionProvider = new BaseSelectionProvider();\r
40         protected FormToolkit toolkit;\r
41         \r
42         @Override\r
43         public void createPartControl(Composite parent) {\r
44                 this.getEditorSite().getPage().addPartListener(new IPartListener() {\r
45                 \r
46                 boolean opened = false;\r
47                 boolean activated = false;\r
48                 \r
49             public void partOpened(IWorkbenchPart part) {\r
50                 if (part.equals(SinglePageResourceEditor.this.getEditorSite().getPart())) {\r
51                     opened = true;\r
52                 }\r
53             }\r
54             \r
55             public void partActivated(IWorkbenchPart part) {\r
56                 if (part.equals(SinglePageResourceEditor.this.getEditorSite().getPart())) {\r
57                     if (opened & !activated) {\r
58                         activated = true;\r
59                         load();\r
60                     }\r
61                 }\r
62             }\r
63             \r
64             public void partBroughtToTop(IWorkbenchPart part) {}\r
65             \r
66             public void partClosed(IWorkbenchPart part) {}\r
67             \r
68             public void partDeactivated(IWorkbenchPart part) {}\r
69             \r
70             private void load() {\r
71                 Session ses = SinglePageResourceEditor.this.getSession();\r
72                 GraphRequestAdapter r = new GraphRequestAdapter() {\r
73                         @Override\r
74                         public GraphRequestStatus perform(Graph g)\r
75                                         throws Exception {\r
76                                  reload(g);\r
77                                 return GraphRequestStatus.transactionComplete();\r
78                         }\r
79                 };\r
80                 ses.asyncRead(r);\r
81             }\r
82         });\r
83                 try {\r
84                         toolkit = new FormToolkit(parent.getDisplay());\r
85                         form = getToolkit().createScrolledForm(parent);\r
86 \r
87                         GridLayout layout = new GridLayout(2, false);\r
88                         form.getBody().setLayout(layout);\r
89                         form.getBody().setLayoutData(\r
90                                         new GridData(GridData.FILL, GridData.FILL, true, true));\r
91 \r
92                         // By default make this ViewPart use a default ISelectionProvider\r
93                         // that will offer the viewparts input resource as its selection.\r
94                         // The Resource is wrapped into a ResourceSelection object.\r
95                         // Any widgets created in createWidgets may override the default\r
96                         // selection provider.\r
97                         getEditorSite().setSelectionProvider(defaultInputSelectionProvider);\r
98 \r
99                         beforeCreateWidgets();\r
100                         createWidgets();\r
101 \r
102                         //reload();\r
103 \r
104                         form.setText(getFormText());\r
105 \r
106                         // Finally Set the default selection which will have an effect only\r
107                         // if nothing in createWidgets has overridden the default selection\r
108                         // provider.\r
109                         ISelection s = ISelectionUtils\r
110                                         .createSelection(new StructuredResourceSelection(\r
111                                                         getInputResource()));\r
112                         defaultInputSelectionProvider.setSelection(s);\r
113 \r
114                 } catch (Exception e) {\r
115                         Display d = getSite().getShell().getDisplay();\r
116                         d.asyncExec(new Runnable() {\r
117                                 public void run() {\r
118                                         getSite().getPage().closeEditor(\r
119                                                         SinglePageResourceEditor.this, false);\r
120                                 }\r
121                         });\r
122 \r
123                         ErrorLogger.defaultLogError("Single-page type editor failed to open, see exception for details",e);\r
124                 }\r
125         }\r
126 \r
127         public ScrolledForm getActiveForm() {\r
128                 return form;\r
129         }\r
130 \r
131         protected Composite getBody() {\r
132                 return form.getBody();\r
133         }\r
134 \r
135         public Composite newGridSection(int formColumns, int childColumns,\r
136                         boolean equalWidth, boolean grabVertical, String text,\r
137                         String description) {\r
138                 return newGridSection(getBody(), formColumns, childColumns, equalWidth,\r
139                                 grabVertical, text, description);\r
140         }\r
141 \r
142         public Composite newGridSection(Composite parent, int formColumns,\r
143                         int childColumns, boolean equalWidth, boolean grabVertical,\r
144                         String text, String description) {\r
145                 FormToolkit toolkit = getToolkit();\r
146 \r
147                 Section section = toolkit.createSection(parent, Section.DESCRIPTION\r
148                                 | Section.TWISTIE | Section.TITLE_BAR | Section.EXPANDED);\r
149                 section.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true,\r
150                                 grabVertical, formColumns, 1));\r
151                 section.addExpansionListener(new ExpansionAdapter() {\r
152                         public void expansionStateChanged(ExpansionEvent e) {\r
153                                 //System.out.println("SinglePageTypeEditor: expansionStateChanged " + e);\r
154                                 //reflow(true);\r
155                         }\r
156                 });\r
157                 section.setText(text);\r
158                 section.setDescription(description);\r
159                 Composite sectionClient = toolkit.createComposite(section);\r
160                 sectionClient.setLayout(new GridLayout(childColumns, equalWidth));\r
161                 sectionClient.setLayoutData(new GridData());\r
162                 section.setClient(sectionClient);\r
163                 return sectionClient;\r
164         }\r
165 \r
166         \r
167 \r
168         //----------------------------------------------------------------------\r
169         // Getters\r
170 \r
171         public FormToolkit getToolkit() {\r
172                 return toolkit;\r
173         }\r
174 \r
175         //----------------------------------------------------------------------\r
176         // Event utilities\r
177 \r
178         public void reflow(boolean flushCache) {\r
179                 //System.out.println("FormTypeEditorBase.reflow(" + flushCache + ")");\r
180                 getActiveForm().reflow(flushCache);\r
181         }\r
182 \r
183         @Override\r
184         public void dispose() {\r
185                 if (toolkit != null) {\r
186                         toolkit.dispose();\r
187                 }\r
188                 super.dispose();\r
189         }\r
190 \r
191         @Override\r
192         public void setFocus() {\r
193                 //System.out.println("FormTypeEditorBase.setFocus(): Input = " + getInput());\r
194                 ScrolledForm form = getActiveForm();\r
195                 if (form != null) {\r
196                         form.setFocus();\r
197                 }\r
198         }\r
199 \r
200         protected abstract String getFormText();\r
201 \r
202         /**\r
203          * Returns null by default which makes {@link #updateTitle()} not set the\r
204          * part name programmatically, i.e. the plugin-defined view name will stay.\r
205          * \r
206          * @return\r
207          */\r
208         protected String getTitleText() {\r
209                 return null;\r
210         }\r
211 \r
212         /**\r
213          * Return null by default which makes {@link #updateTitle()} clear the\r
214          * tooltip.\r
215          * \r
216          * @return\r
217          */\r
218         protected String getTitleTooltip() {\r
219                 return null;\r
220         }\r
221 \r
222         /**\r
223          * A method for performing initializations just before UI initialization.\r
224          */\r
225         protected void beforeCreateWidgets() {\r
226         }\r
227 \r
228         /**\r
229          * A method for initializing the UI of the view.\r
230          */\r
231         protected void createWidgets() {\r
232         }\r
233 }\r