+package org.simantics.document.linking.report.pdf;\r
+\r
+import java.awt.Font;\r
+import java.util.HashMap;\r
+import java.util.Map;\r
+\r
+import org.simantics.document.linking.report.Document;\r
+import org.simantics.document.linking.report.DocumentElement;\r
+import org.simantics.document.linking.report.DocumentItem;\r
+import org.simantics.document.linking.report.DocumentTitlePage;\r
+import org.simantics.document.linking.report.Table;\r
+import org.simantics.document.linking.report.TableOfContents;\r
+import org.simantics.document.linking.report.TextItem;\r
+import org.simantics.document.linking.report.URLItem;\r
+import org.simantics.document.linking.report.base.TextItemImpl;\r
+import org.simantics.document.linking.report.base.URLItemImpl;\r
+import org.simantics.utils.datastructures.Arrays;\r
+\r
+\r
+/**\r
+ * PDF format reporter.\r
+ * \r
+ * @author Marko Luukkainen <marko.luukkainen@vtt.fi>\r
+ *\r
+ */\r
+public class PDFDocument implements Document {\r
+ private String filename;\r
+ \r
+ Map<TextSize, Font> fonts = new HashMap<TextSize, Font>();\r
+ \r
+ PDFPageStream contentStream;\r
+ PDFTable currentTable;\r
+ PDFTitlePage titlePage;\r
+ PDFTocElement toc;\r
+ \r
+ public PDFDocument(String filename) throws Exception {\r
+ this.filename = filename;\r
+ contentStream = new PDFPageStream();\r
+ defaultFonts();\r
+ contentStream.setDefaultFont(fonts.get(TextSize.SMALL));\r
+ }\r
+ \r
+ public PDFDocument(String filename, Font font) throws Exception {\r
+ this.filename = filename;\r
+ contentStream = new PDFPageStream();\r
+ defaultFonts();\r
+ fonts.put(TextSize.SMALL, font);\r
+ }\r
+ \r
+ public PDFDocument(String filename, Font font, Font headerFont) throws Exception {\r
+ this.filename = filename;\r
+ contentStream = new PDFPageStream();\r
+ defaultFonts();\r
+ fonts.put(TextSize.SMALL, font);\r
+ fonts.put(TextSize.MEDIUM, headerFont);\r
+ }\r
+ \r
+ private void defaultFonts() {\r
+ fonts.put(TextSize.TINY, new Font("Arial", Font.PLAIN, 6));\r
+ fonts.put(TextSize.SMALL, new Font("Arial", Font.PLAIN, 8));\r
+ fonts.put(TextSize.MEDIUM, new Font("Arial", Font.PLAIN, 10));\r
+ fonts.put(TextSize.LARGE, new Font("Arial", Font.PLAIN, 16));\r
+ fonts.put(TextSize.HUGE, new Font("Arial", Font.BOLD, 24));\r
+ contentStream.setDefaultFont(fonts.get(TextSize.SMALL));\r
+ }\r
+ \r
+ Font getFont(TextSize size) {\r
+ return fonts.get(size);\r
+ }\r
+ \r
+ @Override\r
+ public int getAvailableLines() {\r
+ return contentStream.getAvailableLines();\r
+ }\r
+ \r
+ @Override\r
+ public int getCurrentLine() {\r
+ return contentStream.getCurrentLine();\r
+ }\r
+ \r
+ public void close() throws Exception{\r
+ if (toc != null) {\r
+ // hackety hack.\r
+ toc.create(contentStream, contentStream.getPages().get(0));\r
+ }\r
+ contentStream.close(filename);\r
+ }\r
+ \r
+ /* (non-Javadoc)\r
+ * @see org.simantics.document.linking.report.Document#nextPage()\r
+ */\r
+ @Override\r
+ public void nextPage() throws Exception{\r
+ contentStream.nextPage(); \r
+ }\r
+ \r
+ @SuppressWarnings("unchecked")\r
+ @Override\r
+ public <T extends DocumentElement> T newElement(Class<T> cls, String...options) throws Exception {\r
+ if (cls == Table.class) {\r
+ return (T)newTable();\r
+ } else if (cls == TableOfContents.class) {\r
+ return (T)getOrCreateToc();\r
+ } else if (cls == DocumentTitlePage.class) {\r
+ if (titlePage != null)\r
+ throw new Exception("Report may contain only one title page");\r
+ titlePage = new PDFTitlePage(this);\r
+ return (T)titlePage;\r
+ }\r
+ return null;\r
+ }\r
+ \r
+ @SuppressWarnings("unchecked")\r
+ @Override\r
+ public <T extends DocumentElement> T nextElement(Class<T> cls, String...options) throws Exception {\r
+ if (cls == Table.class) {\r
+ return (T)nextTable(Arrays.contains(options, Document.TOC));\r
+ } else if (cls == TableOfContents.class) {\r
+ return (T)getOrCreateToc();\r
+ } \r
+ return null;\r
+ }\r
+ \r
+ @SuppressWarnings("unchecked")\r
+ @Override\r
+ public <T extends DocumentElement> T getCurrentElement(Class<T> cls) {\r
+ if (cls == Table.class) {\r
+ return (T)getCurrentTable();\r
+ } else if (cls == TableOfContents.class) {\r
+ return (T)toc;\r
+ } else if (cls == DocumentTitlePage.class) {\r
+ return (T)titlePage;\r
+ }\r
+ return null;\r
+ }\r
+ \r
+ @SuppressWarnings("unchecked")\r
+ @Override\r
+ public <T extends DocumentItem> T newItem(Class<T> cls, String... options)\r
+ throws Exception {\r
+ if (cls == TextItem.class)\r
+ return (T)new TextItemImpl();\r
+ if (cls == URLItem.class)\r
+ return (T)new URLItemImpl();\r
+ return null;\r
+ } \r
+ \r
+ public Table nextTable(boolean id) throws Exception {\r
+ if (currentTable!= null) {\r
+ closeTable();\r
+ currentTable = new PDFTable(currentTable);\r
+ return currentTable; \r
+ } else {\r
+ return newTable();\r
+ }\r
+\r
+ }\r
+ \r
+ private void closeTable() throws Exception {\r
+ if (currentTable != null && currentTable.currentLine > 0) {\r
+ currentTable.setLinesVisible(false);\r
+ currentTable.setHeaderVisible(false);\r
+ currentTable.writeLine("");\r
+ }\r
+ }\r
+ \r
+ \r
+ public Table newTable() throws Exception {\r
+ closeTable();\r
+ currentTable = new PDFTable(this,contentStream);\r
+ return currentTable;\r
+ }\r
+ \r
+ \r
+ Table getCurrentTable() {\r
+ return currentTable;\r
+ }\r
+ \r
+ TableOfContents getOrCreateToc() throws Exception{\r
+ if (toc == null)\r
+ toc = new PDFTocElement(this);\r
+ return toc;\r
+ }\r
+ \r
+ \r
+\r
+\r
+}\r