--- /dev/null
+package org.simantics.document.linking.wizard;\r
+\r
+import java.io.File;\r
+import java.lang.reflect.InvocationTargetException;\r
+\r
+import org.eclipse.core.runtime.IProgressMonitor;\r
+import org.eclipse.core.runtime.IStatus;\r
+import org.eclipse.jface.operation.IRunnableWithProgress;\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.Display;\r
+import org.eclipse.swt.widgets.Label;\r
+import org.eclipse.ui.PartInitException;\r
+import org.simantics.Simantics;\r
+import org.simantics.db.Resource;\r
+import org.simantics.document.linking.report.ExportToPDF;\r
+import org.simantics.document.linking.report.templates.ReportWriter;\r
+import org.simantics.editors.Editors;\r
+import org.simantics.utils.ui.ErrorLogger;\r
+import org.simantics.utils.ui.ExceptionUtils;\r
+\r
+\r
+/**\r
+ * Wizard page for generating a report.\r
+ * \r
+ * @author Marko Luukkainen <marko.luukkainen@vtt.fi>\r
+ *\r
+ */\r
+public class ReportGeneratePage extends WizardPage {\r
+ \r
+ private Resource model;\r
+ private String filename;\r
+ private ReportWriter<?> reportWriter;\r
+ \r
+ \r
+ private Label fileLabel;\r
+ private Label reportLabel;\r
+ private Label statusLabel;\r
+ private Button generateButton;\r
+ private Button showButton;\r
+ private boolean generated = false;\r
+ \r
+ protected ReportGeneratePage(String pageName) {\r
+ super(pageName,pageName,null);\r
+ setGenerated(false);\r
+ }\r
+ \r
+ public void setFilename(String filename) {\r
+ this.filename = filename;\r
+ setGenerated(false);\r
+ }\r
+ \r
+ public void setReportWriter(ReportWriter<?> reportWriter) {\r
+ this.reportWriter = reportWriter;\r
+ setGenerated(false);\r
+ }\r
+ \r
+ public void setModel(Resource model) {\r
+ this.model = model;\r
+ setGenerated(false);\r
+ }\r
+\r
+ @Override\r
+ public void createControl(Composite parent) {\r
+ Composite composite = new Composite(parent, SWT.NONE);\r
+ composite.setLayout(new GridLayout(2,false));\r
+ Label label = new Label(composite, SWT.NONE);\r
+ label.setText("File:");\r
+ fileLabel = new Label(composite, SWT.NONE);\r
+ label = new Label(composite, SWT.NONE);\r
+ label.setText("Report:");\r
+ reportLabel = new Label(composite, SWT.NONE);\r
+ label = new Label(composite, SWT.NONE);\r
+ label.setText("Status:");\r
+ this.statusLabel = new Label(composite, SWT.NONE);\r
+ this.statusLabel.setText("Report has not been generated");\r
+ generateButton = new Button(composite, SWT.PUSH);\r
+ generateButton.setText("Generate report");\r
+ generateButton.addSelectionListener(new SelectionAdapter() {\r
+ @Override\r
+ public void widgetSelected(SelectionEvent e) {\r
+ generate();\r
+ }\r
+ });\r
+ showButton = new Button(composite, SWT.PUSH);\r
+ showButton.setText("Show Report");\r
+ showButton.addSelectionListener(new SelectionAdapter() {\r
+ \r
+ @Override\r
+ public void widgetSelected(SelectionEvent e) {\r
+ File file = new File(filename);\r
+ if (file.exists() && file.canRead()) {\r
+ try {\r
+ Editors.openExternalEditor(file);\r
+ } catch (PartInitException err) {\r
+ ExceptionUtils.logAndShowError(err);\r
+ }\r
+ }\r
+ }\r
+ });\r
+ showButton.setEnabled(false);\r
+ updateContent();\r
+ setControl(composite);\r
+ }\r
+ \r
+ private void updateContent() {\r
+ fileLabel.setText(filename == null ? "File has not been selected" : filename);\r
+ reportLabel.setText(reportWriter == null ? "Report Writer has not been selected" : reportWriter.getName());\r
+ generateButton.setEnabled(filename != null && reportWriter != null && model != null);\r
+ showButton.setEnabled(generated);\r
+ generateButton.setEnabled(!generated);\r
+ if (!generated)\r
+ statusLabel.setText("Report has not been generated");\r
+ }\r
+ \r
+ public void setGenerated(boolean b) {\r
+ generated = b;\r
+ setPageComplete(generated);\r
+ }\r
+ \r
+ private void generate() {\r
+ generateButton.setEnabled(false);\r
+ statusLabel.setText("Generating report");\r
+ try {\r
+ getWizard().getContainer().run(true, false, new IRunnableWithProgress() {\r
+ \r
+ @Override\r
+ public void run(final IProgressMonitor monitor) throws InvocationTargetException,\r
+ InterruptedException {\r
+\r
+ ExportToPDF exportToPDF = new ExportToPDF(Simantics.getSession(), model);\r
+ final IStatus status = exportToPDF.export(filename, reportWriter, monitor);\r
+ Display.getDefault().asyncExec(new Runnable() {\r
+ public void run() {\r
+ if (!statusLabel.isDisposed()) {\r
+ if (status.isOK())\r
+ statusLabel.setText(status.getMessage());\r
+ else {\r
+ statusLabel.setText(status.getMessage());\r
+ ExceptionUtils.logError(status.getException());\r
+ }\r
+ setPageComplete(true); \r
+ ((Composite)getControl()).layout(true, true);\r
+ }\r
+ \r
+ };\r
+ });\r
+ monitor.done();\r
+ }\r
+ });\r
+ } catch (InterruptedException err) {\r
+ setErrorMessage("Report failed: " + err.getMessage());\r
+ ErrorLogger.defaultLogError("Report failed.",err);\r
+ statusLabel.setText("Report failed.");\r
+ } catch (InvocationTargetException err) {\r
+ setErrorMessage("Report failed: " + err.getMessage());\r
+ ErrorLogger.defaultLogError("Report failed.",err);\r
+ statusLabel.setText("Report failed.");\r
+ }\r
+ setGenerated(true);\r
+ \r
+ showButton.setEnabled(true);\r
+ generateButton.setEnabled(false);\r
+ getContainer().updateButtons();\r
+ }\r
+ \r
+ @Override\r
+ public void setVisible(boolean visible) {\r
+ if (visible) {\r
+ updateContent();\r
+ } else {\r
+ setGenerated(false);\r
+ }\r
+ super.setVisible(visible);\r
+ }\r
+ \r
+ public boolean isGenerated() {\r
+ return generated;\r
+ }\r
+\r
+}\r