+package org.simantics.document.linking.report;\r
+\r
+import java.awt.Font;\r
+import java.io.File;\r
+import java.util.HashMap;\r
+import java.util.List;\r
+import java.util.Map;\r
+\r
+import org.eclipse.core.runtime.IProgressMonitor;\r
+import org.eclipse.core.runtime.IStatus;\r
+import org.eclipse.core.runtime.NullProgressMonitor;\r
+import org.eclipse.core.runtime.Status;\r
+import org.eclipse.core.runtime.jobs.Job;\r
+import org.simantics.Simantics;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.Session;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.request.Read;\r
+import org.simantics.document.linking.Activator;\r
+import org.simantics.document.linking.report.html.HTMLDocument;\r
+import org.simantics.document.linking.report.pdf.PDFDocument;\r
+import org.simantics.document.linking.report.templates.CompleteStructureWriter;\r
+import org.simantics.document.linking.report.templates.DocumentStructureWriter;\r
+import org.simantics.document.linking.report.templates.ReportWriter;\r
+\r
+\r
+public class ExportToPDF {\r
+ public static final int DOCUMENT_BROWSE_STRCTURE = 0;\r
+ public static final int DOCUMENT_STRUCTURE = 1;\r
+ public static final int DIAGRAM_STRUCTURE = 2;\r
+ public static final int COMPLETE_STRUCTURE = 3;\r
+ \r
+ private Session session;\r
+ private Resource model;\r
+ \r
+ public ExportToPDF(Session session,Resource model) {\r
+ this.model = model;\r
+ this.session = session;\r
+ }\r
+ \r
+ public void exportPDF(String filename, int report) {\r
+ ReportWriter<?> reportWriter = null;\r
+ switch (report) {\r
+ case DOCUMENT_BROWSE_STRCTURE:\r
+ \r
+ break;\r
+ case DOCUMENT_STRUCTURE:\r
+ reportWriter = new DocumentStructureWriter();\r
+ break;\r
+ case DIAGRAM_STRUCTURE:\r
+ \r
+ break;\r
+ case COMPLETE_STRUCTURE:\r
+ reportWriter = new CompleteStructureWriter();\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ ExportJob job = new ExportJob(filename, reportWriter);\r
+ job.setUser(true);\r
+ job.schedule();\r
+ \r
+ }\r
+ \r
+ private class ExportJob extends Job {\r
+ \r
+ String filename;\r
+ ReportWriter<?> reportWriter;\r
+ \r
+ public ExportJob(String filename, ReportWriter<?> reportWriter) {\r
+ super(reportWriter.getName());\r
+ this.filename = filename;\r
+ this.reportWriter = reportWriter;\r
+ }\r
+ \r
+ @Override\r
+ protected IStatus run(IProgressMonitor monitor) {\r
+ return export(filename, reportWriter, monitor);\r
+ }\r
+ }\r
+ \r
+ public <T> IStatus export(String filename, ReportWriter<T> reportWriter, IProgressMonitor monitor) {\r
+ \r
+ Document lineWriter = null;\r
+ try {\r
+ if (filename.toLowerCase().endsWith(".pdf"))\r
+ lineWriter = new PDFDocument(filename, new Font("Arial", Font.PLAIN, 10),new Font("Arial", Font.BOLD, 10));\r
+ else if (filename.toLowerCase().endsWith(".html") ||\r
+ filename.toLowerCase().endsWith(".htm"))\r
+ lineWriter = new HTMLDocument(new File(filename));\r
+ else {\r
+ throw new Exception("File has unknow extension " + filename);\r
+ }\r
+ export(lineWriter, reportWriter, monitor);\r
+ \r
+ } catch (Exception e) {\r
+ return new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Could not generate report", e);\r
+ } finally {\r
+ if (lineWriter != null) {\r
+ try {\r
+ lineWriter.close();\r
+ } catch (Exception e) {\r
+ e.printStackTrace();\r
+ }\r
+ }\r
+ \r
+ }\r
+ String status = "Report generated.";\r
+// if (lineWriter instanceof PDFTableWriter) {\r
+// status += " Report size " + ((PDFTableWriter)lineWriter).getCurrentPageIndex() + " pages.";\r
+// }\r
+ \r
+ return new Status(IStatus.OK, Activator.PLUGIN_ID, status);\r
+ }\r
+ \r
+ \r
+\r
+ \r
+ private <T> void export(final Document document, final ReportWriter<T> reportWriter, final IProgressMonitor monitor) throws DatabaseException{\r
+ session.syncRequest(new Read<Object>() {\r
+ @Override\r
+ public Object perform(ReadGraph graph) throws DatabaseException {\r
+ \r
+ try {\r
+ Map<Object, Object> context = new HashMap<Object, Object>();\r
+ context.put("model", model);\r
+ context.put(Document.class, document);\r
+ context.put(ReportWriter.class, reportWriter);\r
+ context.put("DocumentName", reportWriter.getName());\r
+ \r
+ reportWriter.start(graph, model, document, context);\r
+ \r
+ List<T> list = reportWriter.getReportItems(graph);\r
+ \r
+ monitor.beginTask("Write Report", list.size());\r
+ \r
+ T previous = null;\r
+ T current = null;\r
+ T next = null;\r
+ for (int i = 0; i < list.size(); i++) {\r
+ current = list.get(i);\r
+ if (i > 0)\r
+ previous = list.get(i-1);\r
+ else\r
+ previous = null;\r
+ if (i < list.size()-1)\r
+ next = list.get(i+1);\r
+ else\r
+ next = null;\r
+ reportWriter.write(previous, current, next, document);\r
+ monitor.worked(1);\r
+ }\r
+ } catch (Exception e) {\r
+ throw new DatabaseException(e);\r
+ }\r
+ monitor.done();\r
+ return null;\r
+ }\r
+ });\r
+ \r
+ }\r
+ \r
+ public static void exportDocumentToPDF(Resource model, String filename) {\r
+ ExportToPDF exportPdf = new ExportToPDF(Simantics.getSession(), model);\r
+ exportPdf.export(filename, new DocumentStructureWriter(), new NullProgressMonitor());\r
+ }\r
+}\r