From: Glen Mazza Date: Tue, 14 Dec 2004 23:16:44 +0000 (+0000) Subject: PR: X-Git-Tag: Root_Temp_KnuthStylePageBreaking~307 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=4f3152f59a020eda3dae7c56fa68c2063eeb084e;p=xmlgraphics-fop.git PR: Obtained from: Submitted by: Reviewed by: AreaTreeModel detached from BookmarkData; more code commenting. git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@198200 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/src/java/org/apache/fop/area/AreaTreeHandler.java b/src/java/org/apache/fop/area/AreaTreeHandler.java index 3439baa54..186ae558f 100644 --- a/src/java/org/apache/fop/area/AreaTreeHandler.java +++ b/src/java/org/apache/fop/area/AreaTreeHandler.java @@ -249,8 +249,7 @@ public class AreaTreeHandler extends FOEventHandler { return; } - log.debug("adding bookmarks to area tree"); - BookmarkData data = new BookmarkData(model); + BookmarkData data = new BookmarkData(); for (int count = 0; count < bookmarks.getOutlines().size(); count++) { Outline out = (Outline)(bookmarks.getOutlines()).get(count); data.addSubData(createBookmarkData(out)); @@ -281,21 +280,27 @@ public class AreaTreeHandler extends FOEventHandler { * Add a OffDocumentItem to the area tree model * This checks if the OffDocumentItem is resolvable and attempts * to resolve or add the resolvable ids for later resolution. - * @param ext the OffDocumentItem to add. + * @param odi the OffDocumentItem to add. */ - private void addOffDocumentItem(OffDocumentItem ext) { - if (ext instanceof Resolvable) { - Resolvable res = (Resolvable) ext; + private void addOffDocumentItem(OffDocumentItem odi) { + if (odi instanceof Resolvable) { + Resolvable res = (Resolvable) odi; String[] ids = res.getIDs(); for (int count = 0; count < ids.length; count++) { if (idLocations.containsKey(ids[count])) { res.resolveIDRef(ids[count], (List) idLocations.get(ids[count])); } else { + log.warn(odi.getName() + ": Unresolved id reference \"" + + ids[count] + "\" found."); addUnresolvedIDRef(ids[count], res); } } + // check to see if ODI is now fully resolved, if so process it + if (res.isResolved()) { + model.handleOffDocumentItem(odi); + } } else { - model.handleOffDocumentItem(ext); + model.handleOffDocumentItem(odi); } } } diff --git a/src/java/org/apache/fop/area/BookmarkData.java b/src/java/org/apache/fop/area/BookmarkData.java index 70bc1fa36..5384a7cdf 100644 --- a/src/java/org/apache/fop/area/BookmarkData.java +++ b/src/java/org/apache/fop/area/BookmarkData.java @@ -23,29 +23,32 @@ import java.util.List; import java.util.HashMap; /** - * This class holds the PDF bookmark OffDocumentItem + * An instance of this class is either a PDF bookmark OffDocumentItem and + * its child bookmarks. */ public class BookmarkData extends OffDocumentItem implements Resolvable { private ArrayList subData = new ArrayList(); - private HashMap idRefs = new HashMap(); - // area tree model for the top level object to activate when resolved - private AreaTreeModel areaTreeModel = null; + // bookmark label + private String label = null; + // ID Reference for this bookmark private String idRef; + + // PageViewport that the idRef item refers to private PageViewport pageRef = null; - private String label = null; + + // unresolved idrefs by this bookmark and child bookmarks below it + private HashMap unresolvedIDRefs = new HashMap(); /** * Create a new bookmark data object. * This should only be call by the top level element as its * idref will be null. * - * @param model the AreaTreeModel for this object */ - public BookmarkData(AreaTreeModel model) { + public BookmarkData() { idRef = null; - areaTreeModel = model; whenToProcess = END_OF_DOC; } @@ -58,7 +61,7 @@ public class BookmarkData extends OffDocumentItem implements Resolvable { */ public BookmarkData(String id) { idRef = id; - idRefs.put(idRef, this); + unresolvedIDRefs.put(idRef, this); } /** @@ -78,10 +81,10 @@ public class BookmarkData extends OffDocumentItem implements Resolvable { */ public void addSubData(BookmarkData sub) { subData.add(sub); - idRefs.put(sub.getID(), sub); + unresolvedIDRefs.put(sub.getID(), sub); String[] ids = sub.getIDs(); for (int count = 0; count < ids.length; count++) { - idRefs.put(ids[count], sub); + unresolvedIDRefs.put(ids[count], sub); } } @@ -138,7 +141,7 @@ public class BookmarkData extends OffDocumentItem implements Resolvable { * @return true if this has been resolved */ public boolean isResolved() { - return idRefs == null; + return unresolvedIDRefs == null; } /** @@ -148,7 +151,7 @@ public class BookmarkData extends OffDocumentItem implements Resolvable { * @return the array of id references */ public String[] getIDs() { - return (String[])idRefs.keySet().toArray(new String[] {}); + return (String[])unresolvedIDRefs.keySet().toArray(new String[] {}); } /** @@ -164,8 +167,8 @@ public class BookmarkData extends OffDocumentItem implements Resolvable { public void resolveIDRef(String id, List pages) { // this method is buggy if (!id.equals(idRef)) { - BookmarkData bd = (BookmarkData)idRefs.get(id); - idRefs.remove(id); + BookmarkData bd = (BookmarkData)unresolvedIDRefs.get(id); + unresolvedIDRefs.remove(id); if (bd != null) { bd.resolveIDRef(id, pages); if (bd.isResolved()) { @@ -179,18 +182,22 @@ public class BookmarkData extends OffDocumentItem implements Resolvable { pageRef = (PageViewport)pages.get(0); } // TODO get rect area of id on page - idRefs.remove(idRef); + unresolvedIDRefs.remove(idRef); checkFinish(); } } private void checkFinish() { - if (idRefs.size() == 0) { - idRefs = null; - if (areaTreeModel != null) { - areaTreeModel.handleOffDocumentItem(this); - } + if (unresolvedIDRefs.size() == 0) { + unresolvedIDRefs = null; } } + + /** + * @see org.apache.fop.area.OffDocumentItem#getName() + */ + public String getName() { + return "Bookmarks"; + } } diff --git a/src/java/org/apache/fop/area/OffDocumentItem.java b/src/java/org/apache/fop/area/OffDocumentItem.java index 8f740bb1a..72f3b2e37 100644 --- a/src/java/org/apache/fop/area/OffDocumentItem.java +++ b/src/java/org/apache/fop/area/OffDocumentItem.java @@ -54,4 +54,10 @@ public abstract class OffDocumentItem { public int getWhenToProcess() { return whenToProcess; } + + /** + * Return a human-readable name for this ODI (for error messages, etc.) + * @return String name of ODI + */ + public abstract String getName(); }