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));
* 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);
}
}
}
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;
}
*/
public BookmarkData(String id) {
idRef = id;
- idRefs.put(idRef, this);
+ unresolvedIDRefs.put(idRef, this);
}
/**
*/
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);
}
}
* @return true if this has been resolved
*/
public boolean isResolved() {
- return idRefs == null;
+ return unresolvedIDRefs == null;
}
/**
* @return the array of id references
*/
public String[] getIDs() {
- return (String[])idRefs.keySet().toArray(new String[] {});
+ return (String[])unresolvedIDRefs.keySet().toArray(new String[] {});
}
/**
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()) {
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";
+ }
}