1 package org.simantics.document.linking.wizard;
\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
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
45 * @author Marko Luukkainen <marko.luukkainen@vtt.fi>
\r
48 public class ReportCustomizationPage extends WizardPage{
\r
50 ReportWriter<?> reportWriter;
\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
57 private Button loadButton;
\r
58 private Button saveButton;
\r
59 private Button resetButton;
\r
60 private Resource library;
\r
62 protected ReportCustomizationPage(String pageName) {
\r
63 super(pageName,pageName,null);
\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
87 loadButton.addSelectionListener(new SelectionAdapter() {
\r
89 public void widgetSelected(SelectionEvent e) {
\r
94 saveButton.addSelectionListener(new SelectionAdapter() {
\r
95 public void widgetSelected(SelectionEvent e) {
\r
99 resetButton.addSelectionListener(new SelectionAdapter() {
\r
100 public void widgetSelected(SelectionEvent e) {
\r
107 public void setReportWriter(ReportWriter<?> reportWriter) {
\r
108 this.reportWriter = reportWriter;
\r
109 updateContentProviders();
\r
113 public void setModel(final Resource model) {
\r
114 this.model = model;
\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
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
132 } catch (DatabaseException e) {
\r
133 this.library = model;
\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
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
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
165 item.setControl(w);
\r
166 } else if (content instanceof SCLCustomizableContent) {
\r
175 public void setVisible(boolean visible) {
\r
176 super.setVisible(visible);
\r
181 private void updateContent() {
\r
182 for (Composite c : widgets.values()) {
\r
183 if (c instanceof EvaluatorConfigurationWidget)
\r
184 ((EvaluatorConfigurationWidget)c).updateContent();
\r
186 ((Composite)getControl()).layout(true);
\r
189 private void load() {
\r
191 List<NamedResource> templates = DBUtil.getTemplates(library);
\r
193 ListDialog dialog = new ListDialog(getShell());
\r
194 dialog.setContentProvider(new IStructuredContentProvider() {
\r
197 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
\r
202 public void dispose() {
\r
206 @SuppressWarnings("unchecked")
\r
208 public Object[] getElements(Object inputElement) {
\r
209 List<NamedResource> list = (List<NamedResource>)inputElement;
\r
210 return list.toArray();
\r
213 dialog.setLabelProvider(new LabelProvider());
\r
214 dialog.setInput(templates);
\r
215 if (dialog.open() != ListDialog.OK)
\r
217 Object result[] = dialog.getResult();
\r
218 if (result == null || result.length != 1)
\r
220 final NamedResource selectedTemplate = (NamedResource)result[0];
\r
221 Simantics.getSession().syncRequest(new ReadRequest() {
\r
224 public void run(ReadGraph graph) throws DatabaseException {
\r
225 DBUtil.load(graph, selectedTemplate.getResource(), (CustomizableContentProvider)reportWriter);
\r
229 updateContentProviders();
\r
232 } catch (DatabaseException e) {
\r
233 // TODO Auto-generated catch block
\r
234 e.printStackTrace();
\r
239 private void save() {
\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
245 final String name = dialog.getValue();
\r
246 if (name == null || name.length() == 0)
\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
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
262 updateContentProviders();
\r