]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - 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
diff --git a/bundles/org.simantics.document.linking.ui/src/org/simantics/document/linking/report/pdf/PDFDocument.java b/bundles/org.simantics.document.linking.ui/src/org/simantics/document/linking/report/pdf/PDFDocument.java
new file mode 100644 (file)
index 0000000..bc4aa6d
--- /dev/null
@@ -0,0 +1,188 @@
+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