]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.document.linking.ui/src/org/simantics/document/linking/report/ExportToPDF.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.document.linking.ui / src / org / simantics / document / linking / report / ExportToPDF.java
1 package org.simantics.document.linking.report;\r
2 \r
3 import java.awt.Font;\r
4 import java.io.File;\r
5 import java.util.HashMap;\r
6 import java.util.List;\r
7 import java.util.Map;\r
8 \r
9 import org.eclipse.core.runtime.IProgressMonitor;\r
10 import org.eclipse.core.runtime.IStatus;\r
11 import org.eclipse.core.runtime.NullProgressMonitor;\r
12 import org.eclipse.core.runtime.Status;\r
13 import org.eclipse.core.runtime.jobs.Job;\r
14 import org.simantics.Simantics;\r
15 import org.simantics.db.ReadGraph;\r
16 import org.simantics.db.Resource;\r
17 import org.simantics.db.Session;\r
18 import org.simantics.db.exception.DatabaseException;\r
19 import org.simantics.db.request.Read;\r
20 import org.simantics.document.linking.Activator;\r
21 import org.simantics.document.linking.report.html.HTMLDocument;\r
22 import org.simantics.document.linking.report.pdf.PDFDocument;\r
23 import org.simantics.document.linking.report.templates.CompleteStructureWriter;\r
24 import org.simantics.document.linking.report.templates.DocumentStructureWriter;\r
25 import org.simantics.document.linking.report.templates.ReportWriter;\r
26 \r
27 \r
28 public class ExportToPDF {\r
29         public static final int DOCUMENT_BROWSE_STRCTURE = 0;\r
30         public static final int DOCUMENT_STRUCTURE = 1;\r
31         public static final int DIAGRAM_STRUCTURE = 2;\r
32         public static final int COMPLETE_STRUCTURE = 3;\r
33         \r
34         private Session session;\r
35         private Resource model;\r
36         \r
37         public ExportToPDF(Session session,Resource model) {\r
38                 this.model = model;\r
39                 this.session = session;\r
40         }\r
41         \r
42         public  void exportPDF(String filename, int report) {\r
43                 ReportWriter<?> reportWriter = null;\r
44                 switch (report) {\r
45                 case DOCUMENT_BROWSE_STRCTURE:\r
46                         \r
47                         break;\r
48                 case DOCUMENT_STRUCTURE:\r
49                         reportWriter = new DocumentStructureWriter();\r
50                         break;\r
51                 case DIAGRAM_STRUCTURE:\r
52                         \r
53                         break;\r
54                 case COMPLETE_STRUCTURE:\r
55                         reportWriter = new CompleteStructureWriter();\r
56                         break;\r
57                 default:\r
58                         break;\r
59                 }\r
60                 ExportJob job = new ExportJob(filename, reportWriter);\r
61                 job.setUser(true);\r
62                 job.schedule();\r
63                 \r
64         }\r
65         \r
66         private class ExportJob extends Job {\r
67                 \r
68                 String filename;\r
69                 ReportWriter<?> reportWriter;\r
70                 \r
71                 public ExportJob(String filename, ReportWriter<?> reportWriter) {\r
72                         super(reportWriter.getName());\r
73                         this.filename = filename;\r
74                         this.reportWriter = reportWriter;\r
75                 }\r
76                 \r
77                 @Override\r
78                 protected IStatus run(IProgressMonitor monitor) {\r
79                         return export(filename, reportWriter, monitor);\r
80                 }\r
81         }\r
82         \r
83         public <T> IStatus export(String filename, ReportWriter<T> reportWriter, IProgressMonitor monitor) {\r
84                 \r
85                 Document lineWriter = null;\r
86                 try {\r
87                         if (filename.toLowerCase().endsWith(".pdf"))\r
88                                 lineWriter = new PDFDocument(filename, new Font("Arial", Font.PLAIN, 10),new Font("Arial", Font.BOLD, 10));\r
89                         else if (filename.toLowerCase().endsWith(".html") ||\r
90                                         filename.toLowerCase().endsWith(".htm"))\r
91                                 lineWriter = new HTMLDocument(new File(filename));\r
92                         else {\r
93                                 throw new Exception("File has unknow extension " + filename);\r
94                         }\r
95                         export(lineWriter, reportWriter, monitor);\r
96                         \r
97                 } catch (Exception e) {\r
98                         return new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Could not generate report", e);\r
99                 } finally {\r
100                         if (lineWriter != null) {\r
101                                 try {\r
102                                         lineWriter.close();\r
103                                 } catch (Exception e) {\r
104                                         e.printStackTrace();\r
105                                 }\r
106                         }\r
107                         \r
108                 }\r
109                 String status  = "Report generated.";\r
110 //              if (lineWriter instanceof PDFTableWriter) {\r
111 //                      status += " Report size " + ((PDFTableWriter)lineWriter).getCurrentPageIndex() + " pages.";\r
112 //              }\r
113                 \r
114                 return new Status(IStatus.OK, Activator.PLUGIN_ID, status);\r
115         }\r
116         \r
117         \r
118 \r
119         \r
120         private <T> void export(final Document document, final ReportWriter<T> reportWriter, final IProgressMonitor monitor) throws DatabaseException{\r
121                 session.syncRequest(new Read<Object>() {\r
122                         @Override\r
123                         public Object perform(ReadGraph graph) throws DatabaseException {\r
124                                 \r
125                                 try {\r
126                                         Map<Object, Object> context = new HashMap<Object, Object>();\r
127                                         context.put("model", model);\r
128                                         context.put(Document.class, document);\r
129                                         context.put(ReportWriter.class, reportWriter);\r
130                                         context.put("DocumentName", reportWriter.getName());\r
131                                         \r
132                                         reportWriter.start(graph, model, document, context);\r
133                                         \r
134                                         List<T> list = reportWriter.getReportItems(graph);\r
135                                         \r
136                                 monitor.beginTask("Write Report", list.size());\r
137         \r
138                                 T previous = null;\r
139                                 T current = null;\r
140                                 T next = null;\r
141                                 for (int i = 0; i < list.size(); i++) {\r
142                                         current = list.get(i);\r
143                                         if (i > 0)\r
144                                                 previous = list.get(i-1);\r
145                                         else\r
146                                                 previous = null;\r
147                                         if (i < list.size()-1)\r
148                                                 next = list.get(i+1);\r
149                                         else\r
150                                                 next = null;\r
151                                         reportWriter.write(previous, current, next, document);\r
152                                         monitor.worked(1);\r
153                                 }\r
154                                 } catch (Exception e) {\r
155                                         throw new DatabaseException(e);\r
156                                 }\r
157                         monitor.done();\r
158                         return null;\r
159                         }\r
160                 });\r
161                 \r
162         }\r
163         \r
164         public static void exportDocumentToPDF(Resource model, String filename) {\r
165             ExportToPDF exportPdf = new ExportToPDF(Simantics.getSession(), model);\r
166             exportPdf.export(filename, new DocumentStructureWriter(), new NullProgressMonitor());\r
167         }\r
168 }\r