You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fop-commits@xmlgraphics.apache.org by ke...@apache.org on 2002/09/05 17:15:08 UTC

cvs commit: xml-fop/src/org/apache/fop/render/pdf PDFRenderer.java

keiron      2002/09/05 08:15:08

  Modified:    src/org/apache/fop/apps LayoutHandler.java
               src/org/apache/fop/area AreaTree.java TreeExt.java
               src/org/apache/fop/extensions BookmarkData.java
                        Bookmarks.java
               src/org/apache/fop/pdf PDFDocument.java
               src/org/apache/fop/render AbstractRenderer.java
                        Renderer.java
               src/org/apache/fop/render/pdf PDFRenderer.java
  Log:
  bookmark extension now working
  
  Revision  Changes    Path
  1.5       +15 -2     xml-fop/src/org/apache/fop/apps/LayoutHandler.java
  
  Index: LayoutHandler.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/apps/LayoutHandler.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- LayoutHandler.java	7 Aug 2002 16:54:56 -0000	1.4
  +++ LayoutHandler.java	5 Sep 2002 15:15:08 -0000	1.5
  @@ -1,8 +1,16 @@
  +/*
  + * $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.apps;
   
   import java.io.OutputStream;
   import java.io.IOException;
   import java.util.HashSet;
  +import java.util.List;
   
   import org.xml.sax.SAXException;
   
  @@ -10,6 +18,7 @@
   import org.apache.fop.area.PageViewport;
   import org.apache.fop.area.AreaTree;
   import org.apache.fop.area.Title;
  +import org.apache.fop.area.TreeExt;
   import org.apache.fop.render.Renderer;
   import org.apache.fop.fo.pagination.PageSequence;
   import org.apache.fop.fo.pagination.LayoutMasterSet;
  @@ -116,8 +125,8 @@
              even if they are not resolved.
            */
           try {
  -            //processQueue(true);
               processAreaTree();
  +            areaTree.endDocument();
               renderer.stopRenderer();
           } catch (FOPException e) {
               throw new SAXException(e);
  @@ -198,7 +207,11 @@
               }
               count++;
           }
  -
  +        List list = atModel.getEndExtensions();
  +        for(count = 0; count < list.size(); count++) {
  +            TreeExt ext = (TreeExt)list.get(count);
  +            renderer.renderExtension(ext);
  +        }
       }
   
       public FontInfo getFontInfo() {
  
  
  
  1.6       +83 -1     xml-fop/src/org/apache/fop/area/AreaTree.java
  
  Index: AreaTree.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/area/AreaTree.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- AreaTree.java	4 Sep 2002 11:43:41 -0000	1.5
  +++ AreaTree.java	5 Sep 2002 15:15:08 -0000	1.6
  @@ -10,7 +10,9 @@
   import org.apache.fop.render.Renderer;
   
   import java.util.ArrayList;
  +import java.util.List;
   import java.util.HashMap;
  +import java.util.Iterator;
   
   /**
    * Area tree for formatting objects.
  @@ -74,6 +76,7 @@
                   Resolveable res = (Resolveable)todo.get(count);
                   res.resolve(id, list);
               }
  +            resolve.remove(id);
           }
       }
   
  @@ -106,10 +109,31 @@
           }
       }
   
  +    public void handleTreeExtension(TreeExt ext, int when) {
  +        // queue tree extension according to the when
  +        model.addExtension(ext, when);
  +    }
  +
  +    public void endDocument() {
  +        for(Iterator iter = resolve.keySet().iterator(); iter.hasNext(); ) {
  +            String id = (String)iter.next();
  +            ArrayList list = (ArrayList)resolve.get(id);
  +            for(int count = 0; count < list.size(); count++) {
  +                Resolveable res = (Resolveable)list.get(count);
  +                if(!res.isResolved()) {
  +                    res.resolve(id, null);
  +                }
  +            }
  +        }
  +        model.endDocument();
  +    }
  +
       // this is the model for the area tree object
       public static abstract class AreaTreeModel {
           public abstract void startPageSequence(Title title);
           public abstract void addPage(PageViewport page);
  +        public abstract void addExtension(TreeExt ext, int when);
  +        public abstract void endDocument();
       }
   
       // this class stores all the pages in the document
  @@ -118,6 +142,7 @@
           ArrayList pageSequence = null;
           ArrayList titles = new ArrayList();
           ArrayList currSequence;
  +        ArrayList extensions = new ArrayList();
   
           public StorePagesModel() {}
   
  @@ -151,6 +176,32 @@
               ArrayList sequence = (ArrayList) pageSequence.get(seq);
               return (PageViewport) sequence.get(count);
           }
  +
  +        public void addExtension(TreeExt ext, int when) {
  +            int seq, page;
  +            switch(when) {
  +                case TreeExt.IMMEDIATELY:
  +                    seq = pageSequence == null ? 0 : pageSequence.size();
  +                    page = currSequence == null ? 0 : currSequence.size();
  +                break;
  +                case TreeExt.AFTER_PAGE:
  +                break;
  +                case TreeExt.END_OF_DOC:
  +                break;
  +            }
  +            extensions.add(ext);
  +        }
  +
  +        public List getExtensions(int seq, int count) {
  +            return null;
  +        }
  +
  +        public List getEndExtensions() {
  +            return extensions;
  +        }
  +
  +        public void endDocument() {
  +        }
       }
   
       // this uses the store pages model to store the pages
  @@ -159,6 +210,8 @@
       public static class RenderPagesModel extends StorePagesModel {
           Renderer renderer;
           ArrayList prepared = new ArrayList();
  +        ArrayList pendingExt = new ArrayList();
  +        ArrayList endDocExt = new ArrayList();
   
           public RenderPagesModel(Renderer rend) {
               renderer = rend;
  @@ -178,9 +231,38 @@
                   // use error handler to handle this FOP or IO Exception
               }
               page.clear();
  +
  +            renderExtensions(pendingExt);
  +            pendingExt.clear();
  +
               // else prepare
               //renderer.preparePage(page);
               prepared.add(page);
  +        }
  +
  +        public void addExtension(TreeExt ext, int when) {
  +            switch(when) {
  +                case TreeExt.IMMEDIATELY:
  +                    renderer.renderExtension(ext);
  +                break;
  +                case TreeExt.AFTER_PAGE:
  +                    pendingExt.add(ext);
  +                break;
  +                case TreeExt.END_OF_DOC:
  +                    endDocExt.add(ext);
  +                break;
  +            }
  +        }        
  +
  +        private void renderExtensions(ArrayList list) {
  +            for(int count = 0; count < list.size(); count++) {
  +                TreeExt ext = (TreeExt)list.get(count);
  +                renderer.renderExtension(ext);
  +            }
  +        }
  +
  +        public void endDocument() {
  +            renderExtensions(endDocExt);
           }
       }
   
  
  
  
  1.2       +5 -1      xml-fop/src/org/apache/fop/area/TreeExt.java
  
  Index: TreeExt.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/area/TreeExt.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- TreeExt.java	17 May 2002 14:47:12 -0000	1.1
  +++ TreeExt.java	5 Sep 2002 15:15:08 -0000	1.2
  @@ -10,6 +10,10 @@
   /**
    */
   public interface TreeExt {
  +    public final static int IMMEDIATELY = 0;
  +    public final static int AFTER_PAGE = 1;
  +    public final static int END_OF_DOC = 2;
  +
       public boolean isResolveable();
       public String getMimeType();
       public String getName();
  
  
  
  1.2       +45 -8     xml-fop/src/org/apache/fop/extensions/BookmarkData.java
  
  Index: BookmarkData.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/extensions/BookmarkData.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- BookmarkData.java	17 May 2002 14:47:12 -0000	1.1
  +++ BookmarkData.java	5 Sep 2002 15:15:08 -0000	1.2
  @@ -10,6 +10,7 @@
   import org.apache.fop.area.PageViewport;
   import org.apache.fop.area.Resolveable;
   import org.apache.fop.area.TreeExt;
  +import org.apache.fop.area.AreaTree;
   
   import java.util.*;
   
  @@ -17,6 +18,9 @@
       private ArrayList subData = new ArrayList();
       private HashMap idRefs = new HashMap();
   
  +    // area tree for the top level object to notify when resolved
  +    private AreaTree areaTree = null;
  +
       String idRef;
       PageViewport pageRef = null;
       String label = null;
  @@ -30,6 +34,10 @@
           idRefs.put(idRef, this);
       }
   
  +    public void setAreaTree(AreaTree at) {
  +        areaTree = at;
  +    }
  +
       public String getID() {
           return idRef;
       }
  @@ -37,12 +45,32 @@
       public void addSubData(BookmarkData sub) {
           subData.add(sub);
           idRefs.put(sub.getID(), sub);
  +        String[] ids = sub.getIDs();
  +        for(int count = 0; count < ids.length; count++) {
  +            idRefs.put(ids[count], sub);
  +        }
       }
   
       public void setLabel(String l) {
           label = l;
       }
   
  +    public String getLabel() {
  +        return label;
  +    }
  +
  +    public int getCount() {
  +        return subData.size();
  +    }
  +
  +    public BookmarkData getSubData(int count) {
  +        return (BookmarkData)subData.get(count);
  +    }
  +
  +    public PageViewport getPage() {
  +        return pageRef;
  +    }
  +
       public boolean isResolveable() {
           return true;
       }
  @@ -66,12 +94,14 @@
       public void resolve(String id, ArrayList pages) {
           if(!id.equals(idRef)) {
               BookmarkData bd = (BookmarkData)idRefs.get(id);
  -            bd.resolve(id, pages);
  -            if(bd.isResolved()) {
  -                idRefs.remove(id);
  -                if(idRefs.size() == 0) {
  -                    idRefs = null;
  +            idRefs.remove(id);
  +            if(bd != null) {
  +                bd.resolve(id, pages);
  +                if(bd.isResolved()) {
  +                    checkFinish();
                   }
  +            } else if (idRef == null) {
  +                checkFinish();
               }
           } else {
               if(pages != null) {
  @@ -81,8 +111,15 @@
               // get rect area of id on page
   
               idRefs.remove(idRef);
  -            if(idRefs.size() == 0) {
  -                idRefs = null;
  +            checkFinish();
  +        }
  +    }
  +
  +    private void checkFinish() {
  +        if(idRefs.size() == 0) {
  +            idRefs = null;
  +            if(areaTree != null) {
  +                areaTree.handleTreeExtension(this, TreeExt.AFTER_PAGE);
               }
           }
       }
  
  
  
  1.5       +2 -1      xml-fop/src/org/apache/fop/extensions/Bookmarks.java
  
  Index: Bookmarks.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/extensions/Bookmarks.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- Bookmarks.java	7 Aug 2002 16:54:56 -0000	1.4
  +++ Bookmarks.java	5 Sep 2002 15:15:08 -0000	1.5
  @@ -44,6 +44,7 @@
           if(structHandler instanceof LayoutHandler) {
               AreaTree at = ((LayoutHandler)structHandler).getAreaTree();
               at.addTreeExtension(data);
  +            data.setAreaTree(at);
           }
       }
   }
  
  
  
  1.51      +4 -21     xml-fop/src/org/apache/fop/pdf/PDFDocument.java
  
  Index: PDFDocument.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/pdf/PDFDocument.java,v
  retrieving revision 1.50
  retrieving revision 1.51
  diff -u -r1.50 -r1.51
  --- PDFDocument.java	3 Sep 2002 12:48:57 -0000	1.50
  +++ PDFDocument.java	5 Sep 2002 15:15:08 -0000	1.51
  @@ -1206,24 +1206,9 @@
   
       private String getGoToReference(String destination) {
           String goToReference = null;
  -        /*if (idReferences.doesIDExist(destination)) {
  -            if (idReferences.doesGoToReferenceExist(destination)) {
  -                goToReference =
  -                    idReferences.getInternalLinkGoToReference(destination);
  -            } else {    // assign Internal Link GoTo object
  -                goToReference =
  -                    idReferences.createInternalLinkGoTo(destination,
  -                                                        ++this.objectcount);
  -                addTrailerObject(idReferences.getPDFGoTo(destination));
  -            }
  -        } else {        // id was not found, so create it
  -
  -            idReferences.createUnvalidatedID(destination); 
  -            idReferences.addToIdValidationList(destination);
  -            goToReference = idReferences.createInternalLinkGoTo(destination,
  -                            ++this.objectcount);
  -            addTrailerObject(idReferences.getPDFGoTo(destination));
  -        }*/
  +        PDFGoTo gt = new PDFGoTo(++this.objectcount, destination);
  +        goToReference = gt.referencePDF();
  +        addTrailerObject(gt);
           return goToReference;
       }
   
  @@ -1323,14 +1308,12 @@
           String goToRef = getGoToReference(destination);
   
           PDFOutline obj = new PDFOutline(++this.objectcount, label, goToRef);
  -        //log.debug("created new outline object");
   
           if (parent != null) {
               parent.addOutline(obj);
           }
           this.objects.add(obj);
           return obj;
  -
       }
   
       /**
  
  
  
  1.22      +7 -1      xml-fop/src/org/apache/fop/render/AbstractRenderer.java
  
  Index: AbstractRenderer.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/render/AbstractRenderer.java,v
  retrieving revision 1.21
  retrieving revision 1.22
  diff -u -r1.21 -r1.22
  --- AbstractRenderer.java	30 Aug 2002 08:03:23 -0000	1.21
  +++ AbstractRenderer.java	5 Sep 2002 15:15:08 -0000	1.22
  @@ -63,6 +63,12 @@
       }
   
       /**
  +     * Render tree extension.
  +     */
  +    public void renderExtension(TreeExt ext) {
  +    }
  +
  +    /**
        * Prepare a page for rendering.
        * This is called if the renderer supports out of order rendering.
        * The renderer should prepare the page so that a page further on
  
  
  
  1.27      +3 -1      xml-fop/src/org/apache/fop/render/Renderer.java
  
  Index: Renderer.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/render/Renderer.java,v
  retrieving revision 1.26
  retrieving revision 1.27
  diff -u -r1.26 -r1.27
  --- Renderer.java	7 Aug 2002 16:54:57 -0000	1.26
  +++ Renderer.java	5 Sep 2002 15:15:08 -0000	1.27
  @@ -58,6 +58,8 @@
   
       public boolean supportsOutOfOrder();
   
  +    public void renderExtension(TreeExt ext);
  +
       public void preparePage(PageViewport page);
   
       public void startPageSequence(Title seqTitle);
  
  
  
  1.119     +33 -1     xml-fop/src/org/apache/fop/render/pdf/PDFRenderer.java
  
  Index: PDFRenderer.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/render/pdf/PDFRenderer.java,v
  retrieving revision 1.118
  retrieving revision 1.119
  diff -u -r1.118 -r1.119
  --- PDFRenderer.java	30 Aug 2002 08:03:24 -0000	1.118
  +++ PDFRenderer.java	5 Sep 2002 15:15:08 -0000	1.119
  @@ -176,6 +176,38 @@
           return true;
       }
   
  +    public void renderExtension(TreeExt ext) {
  +        // render bookmark extension
  +        if(ext instanceof BookmarkData) {
  +            renderRootExtensions((BookmarkData)ext);
  +        }
  +    }
  +
  +    protected void renderRootExtensions(BookmarkData bookmarks) {
  +        for (int i = 0; i < bookmarks.getCount(); i++) {
  +            BookmarkData ext = bookmarks.getSubData(i);
  +            renderOutline(ext, null);
  +        }
  +    }
  +
  +    private void renderOutline(BookmarkData outline, PDFOutline parentOutline) {
  +        PDFOutline outlineRoot = pdfDoc.getOutlineRoot();
  +        PDFOutline pdfOutline = null;
  +        String intDest = (String)pageReferences.get(outline.getPage());
  +        if (parentOutline == null) {
  +            pdfOutline = pdfDoc.makeOutline(outlineRoot,
  +                                    outline.getLabel(), intDest);
  +        } else {
  +            PDFOutline pdfParentOutline = parentOutline;
  +            pdfOutline = pdfDoc.makeOutline(pdfParentOutline,
  +                                    outline.getLabel(), intDest);
  +        }
  +
  +        for (int i = 0; i < outline.getCount(); i++) {
  +            renderOutline(outline.getSubData(i), pdfOutline);
  +        }
  +    }
  +
       public void startPageSequence(Title seqTitle) {
           if(seqTitle != null) {
               String str = convertTitleToString(seqTitle);
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: fop-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: fop-cvs-help@xml.apache.org