/*
 * $Id$
 * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
 * For details on use and redistribution please refer to the
 * LICENSE file included with these sources.
 */

package org.apache.fop.pdf;

// Java
import java.io.UnsupportedEncodingException;
import java.util.Vector;

/**
 * class representing an object which is a list of annotations.
 *
 * This PDF object is a list of references to /Annot objects. So far we
 * are dealing only with links.
 */
public class PDFAnnotList extends PDFObject {

    /**
     * the /Annot objects
     */
    protected Vector links = new Vector();

    /**
     * the number of /Annot objects
     */
    protected int count = 0;

    /**
     * create a /Annots object.
     *
     * @param number the object's number
     */
    public PDFAnnotList(int number) {

        /* generic creation of object */
        super(number);
    }

    /**
     * add an /Annot object of /Subtype /Link.
     *
     * @param link the PDFLink to add.
     */
    public void addLink(PDFLink link) {
        this.links.addElement(link);
        this.count++;
    }

    /**
     * get the count of /Annot objects
     *
     * @return the number of links
     */
    public int getCount() {
        return this.count;
    }

    /**
     * represent the object in PDF
     *
     * @return the PDF string
     */
    public byte[] toPDF() {
        StringBuffer p = new StringBuffer(this.number + " " + this.generation
                                          + " obj\n[\n");
        for (int i = 0; i < this.count; i++) {
            p = p.append(((PDFObject)links.elementAt(i)).referencePDF()
                         + "\n");
        }
        p = p.append("]\nendobj\n");

        try {
            return p.toString().getBytes(PDFDocument.ENCODING);
        } catch (UnsupportedEncodingException ue) {
            return p.toString().getBytes();
        }       
    }

    /*
     * example
     * 20 0 obj
     * [
     * 19 0 R
     * ]
     * endobj
     */
}
