]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.document.linking.ui/src/org/simantics/document/linking/report/pdf/PDFDocument.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.document.linking.ui / src / org / simantics / document / linking / report / pdf / PDFDocument.java
1 package org.simantics.document.linking.report.pdf;\r
2 \r
3 import java.awt.Font;\r
4 import java.util.HashMap;\r
5 import java.util.Map;\r
6 \r
7 import org.simantics.document.linking.report.Document;\r
8 import org.simantics.document.linking.report.DocumentElement;\r
9 import org.simantics.document.linking.report.DocumentItem;\r
10 import org.simantics.document.linking.report.DocumentTitlePage;\r
11 import org.simantics.document.linking.report.Table;\r
12 import org.simantics.document.linking.report.TableOfContents;\r
13 import org.simantics.document.linking.report.TextItem;\r
14 import org.simantics.document.linking.report.URLItem;\r
15 import org.simantics.document.linking.report.base.TextItemImpl;\r
16 import org.simantics.document.linking.report.base.URLItemImpl;\r
17 import org.simantics.utils.datastructures.Arrays;\r
18 \r
19 \r
20 /**\r
21  * PDF format reporter.\r
22  * \r
23  * @author Marko Luukkainen <marko.luukkainen@vtt.fi>\r
24  *\r
25  */\r
26 public class PDFDocument implements Document {\r
27         private String filename;\r
28         \r
29         Map<TextSize, Font> fonts = new HashMap<TextSize, Font>();\r
30         \r
31         PDFPageStream contentStream;\r
32         PDFTable currentTable;\r
33         PDFTitlePage titlePage;\r
34         PDFTocElement toc;\r
35         \r
36         public PDFDocument(String filename) throws Exception {\r
37                 this.filename = filename;\r
38                 contentStream = new PDFPageStream();\r
39                 defaultFonts();\r
40                 contentStream.setDefaultFont(fonts.get(TextSize.SMALL));\r
41         }\r
42         \r
43         public PDFDocument(String filename, Font font) throws Exception {\r
44                 this.filename = filename;\r
45                 contentStream = new PDFPageStream();\r
46                 defaultFonts();\r
47                 fonts.put(TextSize.SMALL, font);\r
48         }\r
49         \r
50         public PDFDocument(String filename, Font font, Font headerFont) throws Exception {\r
51                 this.filename = filename;\r
52                 contentStream = new PDFPageStream();\r
53                 defaultFonts();\r
54                 fonts.put(TextSize.SMALL, font);\r
55                 fonts.put(TextSize.MEDIUM, headerFont);\r
56         }\r
57         \r
58         private void defaultFonts() {\r
59                 fonts.put(TextSize.TINY, new Font("Arial", Font.PLAIN, 6));\r
60                 fonts.put(TextSize.SMALL, new Font("Arial", Font.PLAIN, 8));\r
61                 fonts.put(TextSize.MEDIUM, new Font("Arial", Font.PLAIN, 10));\r
62                 fonts.put(TextSize.LARGE, new Font("Arial", Font.PLAIN, 16));\r
63                 fonts.put(TextSize.HUGE, new Font("Arial", Font.BOLD, 24));\r
64                 contentStream.setDefaultFont(fonts.get(TextSize.SMALL));\r
65         }\r
66         \r
67         Font getFont(TextSize size) {\r
68                 return fonts.get(size);\r
69         }\r
70         \r
71         @Override\r
72         public int getAvailableLines() {\r
73                 return contentStream.getAvailableLines();\r
74         }\r
75         \r
76         @Override\r
77         public int getCurrentLine() {\r
78                 return contentStream.getCurrentLine();\r
79         }\r
80         \r
81         public void close() throws Exception{\r
82                 if (toc != null) {\r
83                         // hackety hack.\r
84                         toc.create(contentStream, contentStream.getPages().get(0));\r
85                 }\r
86                 contentStream.close(filename);\r
87         }\r
88         \r
89         /* (non-Javadoc)\r
90          * @see org.simantics.document.linking.report.Document#nextPage()\r
91          */\r
92         @Override\r
93         public void nextPage() throws Exception{\r
94                 contentStream.nextPage();       \r
95         }\r
96         \r
97         @SuppressWarnings("unchecked")\r
98         @Override\r
99         public <T extends DocumentElement> T newElement(Class<T> cls, String...options) throws Exception {\r
100                 if (cls == Table.class) {\r
101                         return (T)newTable();\r
102                 } else if (cls == TableOfContents.class) {\r
103                         return (T)getOrCreateToc();\r
104                 } else if (cls == DocumentTitlePage.class) {\r
105                         if (titlePage != null)\r
106                                 throw new Exception("Report may contain only one title page");\r
107                         titlePage =  new PDFTitlePage(this);\r
108                         return (T)titlePage;\r
109                 }\r
110                 return null;\r
111         }\r
112         \r
113         @SuppressWarnings("unchecked")\r
114         @Override\r
115         public <T extends DocumentElement> T nextElement(Class<T> cls, String...options) throws Exception {\r
116                 if (cls == Table.class) {\r
117                         return (T)nextTable(Arrays.contains(options, Document.TOC));\r
118                 } else if (cls == TableOfContents.class) {\r
119                         return (T)getOrCreateToc();\r
120                 } \r
121                 return null;\r
122         }\r
123         \r
124         @SuppressWarnings("unchecked")\r
125         @Override\r
126         public <T extends DocumentElement> T getCurrentElement(Class<T> cls) {\r
127                 if (cls == Table.class) {\r
128                         return (T)getCurrentTable();\r
129                 } else if (cls == TableOfContents.class) {\r
130                         return (T)toc;\r
131                 } else if (cls == DocumentTitlePage.class) {\r
132                         return (T)titlePage;\r
133                 }\r
134                 return null;\r
135         }\r
136         \r
137         @SuppressWarnings("unchecked")\r
138         @Override\r
139         public <T extends DocumentItem> T newItem(Class<T> cls, String... options)\r
140                         throws Exception {\r
141                 if (cls == TextItem.class)\r
142                         return (T)new TextItemImpl();\r
143                 if (cls == URLItem.class)\r
144                         return (T)new URLItemImpl();\r
145                 return null;\r
146         }       \r
147         \r
148         public Table nextTable(boolean id) throws Exception {\r
149                 if (currentTable!= null) {\r
150                         closeTable();\r
151                         currentTable = new PDFTable(currentTable);\r
152                         return currentTable;    \r
153                 } else {\r
154                         return newTable();\r
155                 }\r
156 \r
157         }\r
158         \r
159         private void closeTable() throws Exception {\r
160                 if (currentTable != null && currentTable.currentLine > 0) {\r
161                         currentTable.setLinesVisible(false);\r
162                         currentTable.setHeaderVisible(false);\r
163                         currentTable.writeLine("");\r
164                 }\r
165         }\r
166         \r
167         \r
168         public Table newTable() throws Exception {\r
169                 closeTable();\r
170                 currentTable = new PDFTable(this,contentStream);\r
171                 return currentTable;\r
172         }\r
173         \r
174         \r
175         Table getCurrentTable() {\r
176                 return currentTable;\r
177         }\r
178         \r
179         TableOfContents getOrCreateToc() throws Exception{\r
180                 if (toc == null)\r
181                         toc = new PDFTocElement(this);\r
182                 return toc;\r
183         }\r
184         \r
185         \r
186 \r
187 \r
188 }\r