--- /dev/null
+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