123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 |
- /*
- * Copyright 1999-2004 The Apache Software Foundation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
- /* $Id$ */
-
- package org.apache.fop.pdf;
-
- import java.io.ByteArrayOutputStream;
- import java.io.IOException;
- import java.util.List;
-
- /**
- * This represents a single Outline object in a PDF, including the root Outlines
- * object. Outlines provide the bookmark bar, usually rendered to the right of
- * a PDF document in user agents such as Acrobat Reader
- *
- * @author Kelly A. Campbell
- *
- */
- public class PDFOutline extends PDFObject {
-
- /**
- * list of sub-entries (outline objects)
- */
- private List subentries;
-
- /**
- * parent outline object. Root Outlines parent is null
- */
- private PDFOutline parent;
-
- private PDFOutline prev;
- private PDFOutline next;
-
- private PDFOutline first;
- private PDFOutline last;
-
- private int count;
-
- /**
- * title to display for the bookmark entry
- */
- private String title;
-
- private String actionRef;
-
- /**
- * Create a PDF outline with the title and action.
- *
- * @param title the title of the outline entry (can only be null for root Outlines obj)
- * @param action the action for this outline
- */
- public PDFOutline(String title, String action) {
- super();
- subentries = new java.util.ArrayList();
- count = 0;
- parent = null;
- prev = null;
- next = null;
- first = null;
- last = null;
- this.title = title;
- actionRef = action;
- }
-
- /**
- * Set the title of this Outline object.
- *
- * @param t the title of the outline
- */
- public void setTitle(String t) {
- title = t;
- }
-
- /**
- * Add a sub element to this outline.
- *
- * @param outline a sub outline
- */
- public void addOutline(PDFOutline outline) {
- if (subentries.size() > 0) {
- outline.prev =
- (PDFOutline)subentries.get(subentries.size() - 1);
- outline.prev.next = outline;
- } else {
- first = outline;
- }
-
- subentries.add(outline);
- outline.parent = this;
-
- // note: count is not just the immediate children
- incrementCount();
-
- last = outline;
- }
-
- /**
- * Increment the number of subentries and descendants.
- */
- private void incrementCount() {
- // count is a total of our immediate subentries
- // and all descendent subentries
- count++;
- if (parent != null) {
- parent.incrementCount();
- }
- }
-
- /**
- * @see org.apache.fop.pdf.PDFObject#toPDF()
- */
- protected byte[] toPDF() {
- ByteArrayOutputStream bout = new ByteArrayOutputStream(128);
- try {
- bout.write(encode(getObjectID()));
- bout.write(encode("<<"));
- if (parent == null) {
- // root Outlines object
- if (first != null && last != null) {
- bout.write(encode(" /First " + first.referencePDF() + "\n"));
- bout.write(encode(" /Last " + last.referencePDF() + "\n"));
- // no count... we start with the outline completely closed for now
- }
- } else {
- // subentry Outline object
- bout.write(encode(" /Title "));
- bout.write(encodeText(this.title));
- bout.write(encode("\n"));
- bout.write(encode(" /Parent " + parent.referencePDF() + "\n"));
- if (first != null && last != null) {
- bout.write(encode(" /First " + first.referencePDF() + "\n"));
- bout.write(encode(" /Last " + last.referencePDF() + "\n"));
- }
- if (prev != null) {
- bout.write(encode(" /Prev " + prev.referencePDF() + "\n"));
- }
- if (next != null) {
- bout.write(encode(" /Next " + next.referencePDF() + "\n"));
- }
- if (count > 0) {
- bout.write(encode(" /Count -" + count + "\n"));
- }
-
- if (actionRef != null) {
- bout.write(encode(" /A " + actionRef + "\n"));
- }
-
-
- }
- bout.write(encode(">> endobj\n"));
- } catch (IOException ioe) {
- getDocumentSafely().getLogger().error("Ignored I/O exception", ioe);
- }
- return bout.toByteArray();
- }
-
- }
|