]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.document.linking.ui/src/org/simantics/document/linking/wizard/ReportCustomizationPage.java
Sync git svn branch with SVN repository r33144.
[simantics/platform.git] / bundles / org.simantics.document.linking.ui / src / org / simantics / document / linking / wizard / ReportCustomizationPage.java
1 package org.simantics.document.linking.wizard;\r
2 \r
3 import java.util.Collection;\r
4 import java.util.LinkedHashMap;\r
5 import java.util.List;\r
6 import java.util.Map;\r
7 \r
8 import org.eclipse.jface.dialogs.InputDialog;\r
9 import org.eclipse.jface.layout.GridDataFactory;\r
10 import org.eclipse.jface.resource.LocalResourceManager;\r
11 import org.eclipse.jface.viewers.IStructuredContentProvider;\r
12 import org.eclipse.jface.viewers.LabelProvider;\r
13 import org.eclipse.jface.viewers.Viewer;\r
14 import org.eclipse.jface.wizard.WizardPage;\r
15 import org.eclipse.swt.SWT;\r
16 import org.eclipse.swt.events.SelectionAdapter;\r
17 import org.eclipse.swt.events.SelectionEvent;\r
18 import org.eclipse.swt.layout.GridLayout;\r
19 import org.eclipse.swt.widgets.Button;\r
20 import org.eclipse.swt.widgets.Composite;\r
21 import org.eclipse.swt.widgets.TabFolder;\r
22 import org.eclipse.swt.widgets.TabItem;\r
23 import org.eclipse.ui.dialogs.ListDialog;\r
24 import org.simantics.Simantics;\r
25 import org.simantics.db.ReadGraph;\r
26 import org.simantics.db.Resource;\r
27 import org.simantics.db.common.NamedResource;\r
28 import org.simantics.db.common.request.PossibleObjectWithName;\r
29 import org.simantics.db.common.request.ReadRequest;\r
30 import org.simantics.db.exception.DatabaseException;\r
31 import org.simantics.db.request.Read;\r
32 import org.simantics.document.linking.report.evaluator.DBUtil;\r
33 import org.simantics.document.linking.report.templates.CustomizableContentProvider;\r
34 import org.simantics.document.linking.report.templates.ReportWriter;\r
35 import org.simantics.document.linking.report.templates.custom.CustomizableContent;\r
36 import org.simantics.document.linking.report.templates.custom.EvaluatorCustomizableContent;\r
37 import org.simantics.document.linking.report.templates.custom.SCLCustomizableContent;\r
38 import org.simantics.layer0.Layer0;\r
39 import org.simantics.utils.ui.validators.NotNullValidator;\r
40 \r
41 \r
42 /**\r
43  * \r
44  * \r
45  * @author Marko Luukkainen <marko.luukkainen@vtt.fi>\r
46  *\r
47  */\r
48 public class ReportCustomizationPage extends WizardPage{\r
49         \r
50         ReportWriter<?> reportWriter;\r
51         Resource model;\r
52 \r
53         private Map<String,Composite> widgets = new LinkedHashMap<String, Composite>();\r
54         private TabFolder tabFolder;\r
55         private Map<String,TabItem> tabs = new LinkedHashMap<String, TabItem>();\r
56         \r
57         private Button loadButton;\r
58         private Button saveButton;\r
59         private Button resetButton;\r
60         private Resource library;\r
61         \r
62         protected ReportCustomizationPage(String pageName) {\r
63                 super(pageName,pageName,null);\r
64         }\r
65 \r
66         @Override\r
67         public void createControl(Composite parent) {\r
68                 Composite composite = new Composite(parent, SWT.NONE);\r
69                 composite.setLayout(new GridLayout(1,false));\r
70                 setControl(composite);\r
71                 tabFolder = new TabFolder(composite, SWT.NONE);\r
72                 tabFolder.setLayout(new GridLayout());\r
73                 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).applyTo(tabFolder);\r
74                 Composite buttonComposite = new Composite(composite, SWT.NONE);\r
75                 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.BOTTOM).grab(true, false).applyTo(buttonComposite);\r
76                 buttonComposite.setLayout(new GridLayout(3, true));\r
77                 loadButton = new Button(buttonComposite, SWT.PUSH);\r
78                 saveButton = new Button(buttonComposite, SWT.PUSH);\r
79                 resetButton = new Button(buttonComposite, SWT.PUSH);\r
80                 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(loadButton);\r
81                 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(saveButton);\r
82                 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(resetButton);\r
83                 loadButton.setText("Load");\r
84                 saveButton.setText("Save");\r
85                 resetButton.setText("Defaults");\r
86                 \r
87                 loadButton.addSelectionListener(new SelectionAdapter() {\r
88                         @Override\r
89                         public void widgetSelected(SelectionEvent e) {\r
90                                 load();\r
91                         }\r
92                         \r
93                 });\r
94                 saveButton.addSelectionListener(new SelectionAdapter() {\r
95                         public void widgetSelected(SelectionEvent e) {\r
96                                 save();\r
97                         };\r
98                 });\r
99                 resetButton.addSelectionListener(new SelectionAdapter() {\r
100                         public void widgetSelected(SelectionEvent e) {\r
101                                 reset();\r
102                         };\r
103                 });\r
104                 updateContent();\r
105         }\r
106         \r
107         public void setReportWriter(ReportWriter<?> reportWriter) {\r
108                 this.reportWriter = reportWriter;\r
109                 updateContentProviders();\r
110                 updateContent();\r
111         }\r
112         \r
113         public void setModel(final Resource model) {\r
114                 this.model = model;\r
115                 \r
116                 \r
117                 try {\r
118                         // TODO : this code retrieves a proper location for storing the template configurations in a model. \r
119                         //        this should be changed so that model resource somehow tells where to store the configurations.\r
120                         // Note: in other models, the location of templates is the model resource itself.\r
121                         this.library = Simantics.getSession().syncRequest(new Read<Resource>() {\r
122                                 @Override\r
123                                 public Resource perform(ReadGraph graph) throws DatabaseException {\r
124                                         Layer0 l0 = Layer0.getInstance(graph);\r
125                                         Resource lib =  graph.syncRequest(new PossibleObjectWithName(model, l0.ConsistsOf,"Library"));\r
126                                         if (lib != null)\r
127                                                 return lib;\r
128                                         \r
129                                         return model;\r
130                                 }\r
131                         });\r
132                 } catch (DatabaseException e) {\r
133                         this.library = model;\r
134                 }\r
135         }\r
136         \r
137         private void updateContentProviders() {\r
138                 if (reportWriter instanceof CustomizableContentProvider) {\r
139                         LocalResourceManager manager = ((ReportWizard)getWizard()).manager;\r
140                         CustomizableContentProvider provider = (CustomizableContentProvider)reportWriter;\r
141                         Collection<String> ids = provider.getContentIds();\r
142                         for (String id : tabs.keySet()) {\r
143                                 if (!ids.contains(id)) {\r
144                                         tabs.remove(id).dispose();\r
145                                         Composite c = widgets.get(id);\r
146                                         if (c != null && !c.isDisposed())\r
147                                                 c.dispose();\r
148                                 }\r
149                         }\r
150                         for (String id : ids) {\r
151                                 CustomizableContent content = provider.getContent(id);\r
152                                 if (content instanceof EvaluatorCustomizableContent) {\r
153                                         TabItem item = tabs.get(id);\r
154                                         if (item == null) {\r
155                                                 item = new TabItem(tabFolder, SWT.NONE);\r
156                                                 tabs.put(id, item);\r
157                                         }\r
158                                         item.setText(content.getCustomizationDescription());\r
159                                         EvaluatorConfigurationWidget w = new EvaluatorConfigurationWidget(tabFolder,manager, SWT.NONE);\r
160                                         w.setInput((EvaluatorCustomizableContent)content);\r
161                                         GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).applyTo(w);\r
162                                         Composite c = widgets.put(id, w);\r
163                                         if (c != null)\r
164                                                 c.dispose();\r
165                                         item.setControl(w);\r
166                                 } else if (content instanceof SCLCustomizableContent) {\r
167                                         \r
168                                 }\r
169                         }\r
170                 }\r
171         }\r
172 \r
173         \r
174         @Override\r
175         public void setVisible(boolean visible) {\r
176                 super.setVisible(visible);\r
177                 updateContent();\r
178         }\r
179         \r
180         \r
181         private void updateContent() {\r
182                 for (Composite c : widgets.values()) {\r
183                         if (c instanceof EvaluatorConfigurationWidget)\r
184                                 ((EvaluatorConfigurationWidget)c).updateContent();\r
185                 }\r
186                 ((Composite)getControl()).layout(true);\r
187         }\r
188         \r
189         private void load() {\r
190                 try {\r
191                         List<NamedResource> templates = DBUtil.getTemplates(library);\r
192                         \r
193                         ListDialog dialog = new ListDialog(getShell());\r
194                         dialog.setContentProvider(new IStructuredContentProvider() {\r
195                                 \r
196                                 @Override\r
197                                 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {\r
198                                         \r
199                                 }\r
200                                 \r
201                                 @Override\r
202                                 public void dispose() {\r
203                                         \r
204                                 }\r
205                                 \r
206                                 @SuppressWarnings("unchecked")\r
207                                 @Override\r
208                                 public Object[] getElements(Object inputElement) {\r
209                                         List<NamedResource> list = (List<NamedResource>)inputElement;\r
210                                         return list.toArray();\r
211                                 }\r
212                         });\r
213                         dialog.setLabelProvider(new LabelProvider());\r
214                         dialog.setInput(templates);\r
215                         if (dialog.open() != ListDialog.OK)\r
216                                 return;\r
217                         Object result[] = dialog.getResult();\r
218                         if (result == null || result.length != 1)\r
219                                 return;\r
220                         final NamedResource selectedTemplate = (NamedResource)result[0];\r
221                         Simantics.getSession().syncRequest(new ReadRequest() {\r
222                                 \r
223                                 @Override\r
224                                 public void run(ReadGraph graph) throws DatabaseException {\r
225                                         DBUtil.load(graph, selectedTemplate.getResource(), (CustomizableContentProvider)reportWriter);\r
226                                         \r
227                                 }\r
228                         });\r
229                         updateContentProviders();\r
230                         updateContent();\r
231                         \r
232                 } catch (DatabaseException e) {\r
233                         // TODO Auto-generated catch block\r
234                         e.printStackTrace();\r
235                 }\r
236                 \r
237         }\r
238         \r
239         private void save() {\r
240                 try {\r
241                         \r
242                         InputDialog dialog = new InputDialog(getShell(), "Save report customization", "Give template name", "Name", new NotNullValidator("Name cannot be empty"));\r
243                         if (dialog.open() != InputDialog.OK)\r
244                                 return;\r
245                         final String name = dialog.getValue();\r
246                         if (name == null || name.length() == 0)\r
247                                 return;\r
248                         DBUtil.save(library, name, (CustomizableContentProvider)reportWriter);\r
249                 } catch (DatabaseException e) {\r
250                         // TODO Auto-generated catch block\r
251                         e.printStackTrace();\r
252                 }\r
253                         \r
254         }\r
255         \r
256         private void reset() {\r
257                 if (reportWriter instanceof CustomizableContentProvider) {\r
258                         CustomizableContentProvider ccp = (CustomizableContentProvider)reportWriter;\r
259                         for (String id : ccp.getContentIds()) {\r
260                                 ccp.setDefaultContent(id);\r
261                         }\r
262                         updateContentProviders();\r
263                         updateContent();\r
264                 }\r
265         }\r
266         \r
267         \r
268 \r
269 }\r