]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.document.linking.ui/src/org/simantics/document/linking/report/pdf/PDFTocElement.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.document.linking.ui / src / org / simantics / document / linking / report / pdf / PDFTocElement.java
diff --git a/bundles/org.simantics.document.linking.ui/src/org/simantics/document/linking/report/pdf/PDFTocElement.java b/bundles/org.simantics.document.linking.ui/src/org/simantics/document/linking/report/pdf/PDFTocElement.java
new file mode 100644 (file)
index 0000000..cd92ffb
--- /dev/null
@@ -0,0 +1,88 @@
+package org.simantics.document.linking.report.pdf;\r
+\r
+import java.awt.Font;\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import org.simantics.document.linking.report.DocumentElement;\r
+import org.simantics.document.linking.report.TableOfContents;\r
+import org.simantics.document.linking.report.Document.TextSize;\r
+import org.simantics.document.linking.report.TableColumn.Alignment;\r
+import org.simantics.utils.datastructures.Pair;\r
+\r
+\r
+public class PDFTocElement implements TableOfContents {\r
+       \r
+       PDFDocument writer;\r
+       PDFPageStream stream;\r
+       \r
+       Font itemFont;\r
+       Font titleFont;\r
+       \r
+       int linesPerPage;\r
+       int linesOnFirstPage;\r
+       \r
+       PDFTable tocTable;\r
+       \r
+       public PDFTocElement(PDFDocument writer) throws Exception{\r
+               this.writer = writer;\r
+               stream = new PDFPageStream();\r
+               itemFont = writer.getFont(TextSize.SMALL);\r
+               titleFont = writer.getFont(TextSize.LARGE);\r
+               stream.setDefaultFont(itemFont);\r
+               \r
+               stream.nextPage();\r
+               tocTable= new PDFTable(writer, stream);\r
+               linesPerPage = tocTable.getAvailableLines();\r
+               //linesPerPage = stream.getAvailableLines();\r
+               PDFPage page = stream.getCurrentPage();\r
+               page.setFont(titleFont);\r
+               page.writeLine("Table of Contents");\r
+               page.setFont(itemFont);\r
+               page.writeLine("");\r
+               linesOnFirstPage = tocTable.getAvailableLines();\r
+               //linesOnFirstPage = page.availableLines;\r
+       }\r
+       private List<Pair<String, PDFElement>> toc = new ArrayList<Pair<String,PDFElement>>();\r
+       @Override\r
+       public void addTocElement(String label, DocumentElement element) {\r
+               toc.add(new Pair<String, PDFElement>(label, (PDFElement)element));\r
+       }\r
+       \r
+       public void create(PDFPageStream destStream, PDFPage after) throws Exception {\r
+               int tocPages = getEstimatedPages();\r
+\r
+               List<PDFPage> pages = destStream.getPages();\r
+               int tocIndex = pages.indexOf(after)+1;\r
+               \r
+               tocTable.addColumn("Document", 0.9);\r
+               tocTable.addColumn("Page", 0.1).setAlignment(Alignment.RIGHT);\r
+               tocTable.setHeaderVisible(false);\r
+               tocTable.setLinesVisible(false);\r
+               for (Pair<String, PDFElement> item : toc) {\r
+                       int pageIndex = pages.indexOf(item.second.getPage());\r
+                       if (pageIndex >= 0) {\r
+                               pageIndex += tocPages + 1;\r
+                       }\r
+                       tocTable.writeRow(item.first, Integer.toString(pageIndex));\r
+//                     stream.getCurrentPage().writeLine( + "  " + pageIndex);\r
+               }\r
+               \r
+               pages.addAll(tocIndex, stream.getPages());\r
+               stream = null;\r
+       }\r
+       \r
+       \r
+       \r
+       public int getEstimatedPages() {\r
+               int pages = 1;\r
+               int items = toc.size();\r
+               items -= linesOnFirstPage;\r
+               while (items > 0) {\r
+                       items-= linesPerPage;\r
+                       pages++;\r
+               }\r
+               return pages;\r
+       }\r
+\r
+}\r