]> gerrit.simantics Code Review - simantics/platform.git/blob - 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
1 package org.simantics.document.linking.report.pdf;\r
2 \r
3 import java.awt.Font;\r
4 import java.util.ArrayList;\r
5 import java.util.List;\r
6 \r
7 import org.simantics.document.linking.report.DocumentElement;\r
8 import org.simantics.document.linking.report.TableOfContents;\r
9 import org.simantics.document.linking.report.Document.TextSize;\r
10 import org.simantics.document.linking.report.TableColumn.Alignment;\r
11 import org.simantics.utils.datastructures.Pair;\r
12 \r
13 \r
14 public class PDFTocElement implements TableOfContents {\r
15         \r
16         PDFDocument writer;\r
17         PDFPageStream stream;\r
18         \r
19         Font itemFont;\r
20         Font titleFont;\r
21         \r
22         int linesPerPage;\r
23         int linesOnFirstPage;\r
24         \r
25         PDFTable tocTable;\r
26         \r
27         public PDFTocElement(PDFDocument writer) throws Exception{\r
28                 this.writer = writer;\r
29                 stream = new PDFPageStream();\r
30                 itemFont = writer.getFont(TextSize.SMALL);\r
31                 titleFont = writer.getFont(TextSize.LARGE);\r
32                 stream.setDefaultFont(itemFont);\r
33                 \r
34                 stream.nextPage();\r
35                 tocTable= new PDFTable(writer, stream);\r
36                 linesPerPage = tocTable.getAvailableLines();\r
37                 //linesPerPage = stream.getAvailableLines();\r
38                 PDFPage page = stream.getCurrentPage();\r
39                 page.setFont(titleFont);\r
40                 page.writeLine("Table of Contents");\r
41                 page.setFont(itemFont);\r
42                 page.writeLine("");\r
43                 linesOnFirstPage = tocTable.getAvailableLines();\r
44                 //linesOnFirstPage = page.availableLines;\r
45         }\r
46         private List<Pair<String, PDFElement>> toc = new ArrayList<Pair<String,PDFElement>>();\r
47         @Override\r
48         public void addTocElement(String label, DocumentElement element) {\r
49                 toc.add(new Pair<String, PDFElement>(label, (PDFElement)element));\r
50         }\r
51         \r
52         public void create(PDFPageStream destStream, PDFPage after) throws Exception {\r
53                 int tocPages = getEstimatedPages();\r
54 \r
55                 List<PDFPage> pages = destStream.getPages();\r
56                 int tocIndex = pages.indexOf(after)+1;\r
57                 \r
58                 tocTable.addColumn("Document", 0.9);\r
59                 tocTable.addColumn("Page", 0.1).setAlignment(Alignment.RIGHT);\r
60                 tocTable.setHeaderVisible(false);\r
61                 tocTable.setLinesVisible(false);\r
62                 for (Pair<String, PDFElement> item : toc) {\r
63                         int pageIndex = pages.indexOf(item.second.getPage());\r
64                         if (pageIndex >= 0) {\r
65                                 pageIndex += tocPages + 1;\r
66                         }\r
67                         tocTable.writeRow(item.first, Integer.toString(pageIndex));\r
68 //                      stream.getCurrentPage().writeLine( + "  " + pageIndex);\r
69                 }\r
70                 \r
71                 pages.addAll(tocIndex, stream.getPages());\r
72                 stream = null;\r
73         }\r
74         \r
75         \r
76         \r
77         public int getEstimatedPages() {\r
78                 int pages = 1;\r
79                 int items = toc.size();\r
80                 items -= linesOnFirstPage;\r
81                 while (items > 0) {\r
82                         items-= linesPerPage;\r
83                         pages++;\r
84                 }\r
85                 return pages;\r
86         }\r
87 \r
88 }\r