]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.document.linking.ui/src/org/simantics/document/linking/wizard/ReportCustomizationPage.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.document.linking.ui / src / org / simantics / document / linking / wizard / ReportCustomizationPage.java
diff --git a/bundles/org.simantics.document.linking.ui/src/org/simantics/document/linking/wizard/ReportCustomizationPage.java b/bundles/org.simantics.document.linking.ui/src/org/simantics/document/linking/wizard/ReportCustomizationPage.java
new file mode 100644 (file)
index 0000000..e30f50a
--- /dev/null
@@ -0,0 +1,269 @@
+package org.simantics.document.linking.wizard;\r
+\r
+import java.util.Collection;\r
+import java.util.LinkedHashMap;\r
+import java.util.List;\r
+import java.util.Map;\r
+\r
+import org.eclipse.jface.dialogs.InputDialog;\r
+import org.eclipse.jface.layout.GridDataFactory;\r
+import org.eclipse.jface.resource.LocalResourceManager;\r
+import org.eclipse.jface.viewers.IStructuredContentProvider;\r
+import org.eclipse.jface.viewers.LabelProvider;\r
+import org.eclipse.jface.viewers.Viewer;\r
+import org.eclipse.jface.wizard.WizardPage;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.events.SelectionAdapter;\r
+import org.eclipse.swt.events.SelectionEvent;\r
+import org.eclipse.swt.layout.GridLayout;\r
+import org.eclipse.swt.widgets.Button;\r
+import org.eclipse.swt.widgets.Composite;\r
+import org.eclipse.swt.widgets.TabFolder;\r
+import org.eclipse.swt.widgets.TabItem;\r
+import org.eclipse.ui.dialogs.ListDialog;\r
+import org.simantics.Simantics;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.common.NamedResource;\r
+import org.simantics.db.common.request.PossibleObjectWithName;\r
+import org.simantics.db.common.request.ReadRequest;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.request.Read;\r
+import org.simantics.document.linking.report.evaluator.DBUtil;\r
+import org.simantics.document.linking.report.templates.CustomizableContentProvider;\r
+import org.simantics.document.linking.report.templates.ReportWriter;\r
+import org.simantics.document.linking.report.templates.custom.CustomizableContent;\r
+import org.simantics.document.linking.report.templates.custom.EvaluatorCustomizableContent;\r
+import org.simantics.document.linking.report.templates.custom.SCLCustomizableContent;\r
+import org.simantics.layer0.Layer0;\r
+import org.simantics.utils.ui.validators.NotNullValidator;\r
+\r
+\r
+/**\r
+ * \r
+ * \r
+ * @author Marko Luukkainen <marko.luukkainen@vtt.fi>\r
+ *\r
+ */\r
+public class ReportCustomizationPage extends WizardPage{\r
+       \r
+       ReportWriter<?> reportWriter;\r
+       Resource model;\r
+\r
+       private Map<String,Composite> widgets = new LinkedHashMap<String, Composite>();\r
+       private TabFolder tabFolder;\r
+       private Map<String,TabItem> tabs = new LinkedHashMap<String, TabItem>();\r
+       \r
+       private Button loadButton;\r
+       private Button saveButton;\r
+       private Button resetButton;\r
+       private Resource library;\r
+       \r
+       protected ReportCustomizationPage(String pageName) {\r
+               super(pageName,pageName,null);\r
+       }\r
+\r
+       @Override\r
+       public void createControl(Composite parent) {\r
+               Composite composite = new Composite(parent, SWT.NONE);\r
+               composite.setLayout(new GridLayout(1,false));\r
+               setControl(composite);\r
+               tabFolder = new TabFolder(composite, SWT.NONE);\r
+               tabFolder.setLayout(new GridLayout());\r
+               GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).applyTo(tabFolder);\r
+               Composite buttonComposite = new Composite(composite, SWT.NONE);\r
+               GridDataFactory.fillDefaults().align(SWT.FILL, SWT.BOTTOM).grab(true, false).applyTo(buttonComposite);\r
+               buttonComposite.setLayout(new GridLayout(3, true));\r
+               loadButton = new Button(buttonComposite, SWT.PUSH);\r
+               saveButton = new Button(buttonComposite, SWT.PUSH);\r
+               resetButton = new Button(buttonComposite, SWT.PUSH);\r
+               GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(loadButton);\r
+               GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(saveButton);\r
+               GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(resetButton);\r
+               loadButton.setText("Load");\r
+               saveButton.setText("Save");\r
+               resetButton.setText("Defaults");\r
+               \r
+               loadButton.addSelectionListener(new SelectionAdapter() {\r
+                       @Override\r
+                       public void widgetSelected(SelectionEvent e) {\r
+                               load();\r
+                       }\r
+                       \r
+               });\r
+               saveButton.addSelectionListener(new SelectionAdapter() {\r
+                       public void widgetSelected(SelectionEvent e) {\r
+                               save();\r
+                       };\r
+               });\r
+               resetButton.addSelectionListener(new SelectionAdapter() {\r
+                       public void widgetSelected(SelectionEvent e) {\r
+                               reset();\r
+                       };\r
+               });\r
+               updateContent();\r
+       }\r
+       \r
+       public void setReportWriter(ReportWriter<?> reportWriter) {\r
+               this.reportWriter = reportWriter;\r
+               updateContentProviders();\r
+               updateContent();\r
+       }\r
+       \r
+       public void setModel(final Resource model) {\r
+               this.model = model;\r
+               \r
+               \r
+               try {\r
+                       // TODO : this code retrieves a proper location for storing the template configurations in a model. \r
+                       //        this should be changed so that model resource somehow tells where to store the configurations.\r
+                       // Note: in other models, the location of templates is the model resource itself.\r
+                       this.library = Simantics.getSession().syncRequest(new Read<Resource>() {\r
+                               @Override\r
+                               public Resource perform(ReadGraph graph) throws DatabaseException {\r
+                                       Layer0 l0 = Layer0.getInstance(graph);\r
+                                       Resource lib =  graph.syncRequest(new PossibleObjectWithName(model, l0.ConsistsOf,"Library"));\r
+                                       if (lib != null)\r
+                                               return lib;\r
+                                       \r
+                                       return model;\r
+                               }\r
+                       });\r
+               } catch (DatabaseException e) {\r
+                       this.library = model;\r
+               }\r
+       }\r
+       \r
+       private void updateContentProviders() {\r
+               if (reportWriter instanceof CustomizableContentProvider) {\r
+                       LocalResourceManager manager = ((ReportWizard)getWizard()).manager;\r
+                       CustomizableContentProvider provider = (CustomizableContentProvider)reportWriter;\r
+                       Collection<String> ids = provider.getContentIds();\r
+                       for (String id : tabs.keySet()) {\r
+                               if (!ids.contains(id)) {\r
+                                       tabs.remove(id).dispose();\r
+                                       Composite c = widgets.get(id);\r
+                                       if (c != null && !c.isDisposed())\r
+                                               c.dispose();\r
+                               }\r
+                       }\r
+                       for (String id : ids) {\r
+                               CustomizableContent content = provider.getContent(id);\r
+                               if (content instanceof EvaluatorCustomizableContent) {\r
+                                       TabItem item = tabs.get(id);\r
+                                       if (item == null) {\r
+                                               item = new TabItem(tabFolder, SWT.NONE);\r
+                                               tabs.put(id, item);\r
+                                       }\r
+                                       item.setText(content.getCustomizationDescription());\r
+                                       EvaluatorConfigurationWidget w = new EvaluatorConfigurationWidget(tabFolder,manager, SWT.NONE);\r
+                                       w.setInput((EvaluatorCustomizableContent)content);\r
+                                       GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).applyTo(w);\r
+                                       Composite c = widgets.put(id, w);\r
+                                       if (c != null)\r
+                                               c.dispose();\r
+                                       item.setControl(w);\r
+                               } else if (content instanceof SCLCustomizableContent) {\r
+                                       \r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       \r
+       @Override\r
+       public void setVisible(boolean visible) {\r
+               super.setVisible(visible);\r
+               updateContent();\r
+       }\r
+       \r
+       \r
+       private void updateContent() {\r
+               for (Composite c : widgets.values()) {\r
+                       if (c instanceof EvaluatorConfigurationWidget)\r
+                               ((EvaluatorConfigurationWidget)c).updateContent();\r
+               }\r
+               ((Composite)getControl()).layout(true);\r
+       }\r
+       \r
+       private void load() {\r
+               try {\r
+                       List<NamedResource> templates = DBUtil.getTemplates(library);\r
+                       \r
+                       ListDialog dialog = new ListDialog(getShell());\r
+                       dialog.setContentProvider(new IStructuredContentProvider() {\r
+                               \r
+                               @Override\r
+                               public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {\r
+                                       \r
+                               }\r
+                               \r
+                               @Override\r
+                               public void dispose() {\r
+                                       \r
+                               }\r
+                               \r
+                               @SuppressWarnings("unchecked")\r
+                               @Override\r
+                               public Object[] getElements(Object inputElement) {\r
+                                       List<NamedResource> list = (List<NamedResource>)inputElement;\r
+                                       return list.toArray();\r
+                               }\r
+                       });\r
+                       dialog.setLabelProvider(new LabelProvider());\r
+                       dialog.setInput(templates);\r
+                       if (dialog.open() != ListDialog.OK)\r
+                               return;\r
+                       Object result[] = dialog.getResult();\r
+                       if (result == null || result.length != 1)\r
+                               return;\r
+                       final NamedResource selectedTemplate = (NamedResource)result[0];\r
+                       Simantics.getSession().syncRequest(new ReadRequest() {\r
+                               \r
+                               @Override\r
+                               public void run(ReadGraph graph) throws DatabaseException {\r
+                                       DBUtil.load(graph, selectedTemplate.getResource(), (CustomizableContentProvider)reportWriter);\r
+                                       \r
+                               }\r
+                       });\r
+                       updateContentProviders();\r
+                       updateContent();\r
+                       \r
+               } catch (DatabaseException e) {\r
+                       // TODO Auto-generated catch block\r
+                       e.printStackTrace();\r
+               }\r
+               \r
+       }\r
+       \r
+       private void save() {\r
+               try {\r
+                       \r
+                       InputDialog dialog = new InputDialog(getShell(), "Save report customization", "Give template name", "Name", new NotNullValidator("Name cannot be empty"));\r
+                       if (dialog.open() != InputDialog.OK)\r
+                               return;\r
+                       final String name = dialog.getValue();\r
+                       if (name == null || name.length() == 0)\r
+                               return;\r
+                       DBUtil.save(library, name, (CustomizableContentProvider)reportWriter);\r
+               } catch (DatabaseException e) {\r
+                       // TODO Auto-generated catch block\r
+                       e.printStackTrace();\r
+               }\r
+                       \r
+       }\r
+       \r
+       private void reset() {\r
+               if (reportWriter instanceof CustomizableContentProvider) {\r
+                       CustomizableContentProvider ccp = (CustomizableContentProvider)reportWriter;\r
+                       for (String id : ccp.getContentIds()) {\r
+                               ccp.setDefaultContent(id);\r
+                       }\r
+                       updateContentProviders();\r
+                       updateContent();\r
+               }\r
+       }\r
+       \r
+       \r
+\r
+}\r