1 package org.simantics.document.linking.report.pdf;
\r
3 import java.awt.Font;
\r
4 import java.util.ArrayList;
\r
5 import java.util.List;
\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
14 public class PDFTocElement implements TableOfContents {
\r
17 PDFPageStream stream;
\r
23 int linesOnFirstPage;
\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
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
43 linesOnFirstPage = tocTable.getAvailableLines();
\r
44 //linesOnFirstPage = page.availableLines;
\r
46 private List<Pair<String, PDFElement>> toc = new ArrayList<Pair<String,PDFElement>>();
\r
48 public void addTocElement(String label, DocumentElement element) {
\r
49 toc.add(new Pair<String, PDFElement>(label, (PDFElement)element));
\r
52 public void create(PDFPageStream destStream, PDFPage after) throws Exception {
\r
53 int tocPages = getEstimatedPages();
\r
55 List<PDFPage> pages = destStream.getPages();
\r
56 int tocIndex = pages.indexOf(after)+1;
\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
67 tocTable.writeRow(item.first, Integer.toString(pageIndex));
\r
68 // stream.getCurrentPage().writeLine( + " " + pageIndex);
\r
71 pages.addAll(tocIndex, stream.getPages());
\r
77 public int getEstimatedPages() {
\r
79 int items = toc.size();
\r
80 items -= linesOnFirstPage;
\r
82 items-= linesPerPage;
\r