--- /dev/null
+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