/*
* Copyright 1999-2005 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: BookmarkData.java 279656 2005-09-08 22:06:48Z pietsch $ */
package org.apache.fop.area;
import java.util.ArrayList;
import java.util.List;
import java.util.HashMap;
import org.apache.fop.fo.pagination.bookmarks.BookmarkTree;
import org.apache.fop.fo.pagination.bookmarks.Bookmark;
/**
* An instance of this class is either a PDF bookmark-tree and
* its child bookmark-items, or a bookmark-item and the child
* child bookmark-items under it.
*/
public class BookmarkData extends AbstractOffDocumentItem implements Resolvable {
private ArrayList subData = new ArrayList();
// bookmark-title for this fo:bookmark
private String bookmarkTitle = null;
// indicator of whether to initially display/hide child bookmarks of this object
private boolean bShow = true;
// ID Reference for this bookmark
private String idRef;
// PageViewport that the idRef item refers to
private PageViewport pageRef = 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 called by the bookmark-tree item because
* it has no idref item that needs to be resolved.
*
* @param bookmarkTree fo:bookmark-tree for this document
*/
public BookmarkData(BookmarkTree bookmarkTree) {
idRef = null;
whenToProcess = END_OF_DOC;
// top level defined in Rec to show all child bookmarks
bShow = true;
for (int count = 0; count < bookmarkTree.getBookmarks().size(); count++) {
Bookmark bkmk = (Bookmark)(bookmarkTree.getBookmarks()).get(count);
addSubData(createBookmarkData(bkmk));
}
}
/**
* Create a new pdf bookmark data object.
* This is used by the bookmark-items to create a data object
* with a idref. During processing, this idref will be
* subsequently resolved to a particular PageViewport.
*
* @param bookmark the fo:bookmark object
*/
public BookmarkData(Bookmark bookmark) {
bookmarkTitle = bookmark.getBookmarkTitle();
bShow = bookmark.showChildItems();
this.idRef = bookmark.getInternalDestination();
unresolvedIDRefs.put(idRef, this);
}
/**
* Get the idref for this bookmark-item
*
* @return the idref for the bookmark-item
*/
public String getIDRef() {
return idRef;
}
/**
* Add the child bookmark data object.
* This adds a child bookmark in the bookmark hierarchy.
*
* @param sub the child bookmark data
*/
public void addSubData(BookmarkData sub) {
subData.add(sub);
unresolvedIDRefs.put(sub.getIDRef(), sub);
String[] ids = sub.getIDRefs();
for (int count = 0; count < ids.length; count++) {
unresolvedIDRefs.put(ids[count], sub);
}
}
/**
* Get the title for this bookmark object.
*
* @return the bookmark title
*/
public String getBookmarkTitle() {
return bookmarkTitle;
}
/**
* Indicator of whether to initially display child bookmarks.
*
* @return true to initially display child bookmarks, false otherwise
*/
public boolean showChildItems() {
return bShow;
}
/**
* Get the size of child data objects.
*
* @return the number of child bookmark data
*/
public int getCount() {
return subData.size();
}
/**
* Get the child data object.
*
* @param count the index to get
* @return the child bookmark data
*/
public BookmarkData getSubData(int count) {
return (BookmarkData) subData.get(count);
}
/**
* Get the PageViewport object that this bookmark refers to
*
* @return the PageViewport that this bookmark points to
*/
public PageViewport getPageViewport() {
return pageRef;
}
/**
* Check if this resolvable object has been resolved.
* A BookmarkData object is considered resolved once the idrefs for it
* and for all of its child bookmark-items have been resolved.
*
* @return true if this object has been resolved
*/
public boolean isResolved() {
return unresolvedIDRefs == null || (unresolvedIDRefs.size() == 0);
}
/**
* @see org.apache.fop.area.Resolvable#getIDRefs()
*/
public String[] getIDRefs() {
return (String[])unresolvedIDRefs.keySet().toArray(new String[] {});
}
/**
* Resolve this resolvable object.
* This resolves the idref of this object and if possible also
* resolves id references of child elements that have the same
* id reference.
*
* @see org.apache.fop.area.Resolvable#resolveIDRef(String, List)
* @todo check to make sure it works if multiple bookmark-items
* have the same idref
*/
public void resolveIDRef(String id, List pages) {
if (!id.equals(idRef)) {
BookmarkData bd = (BookmarkData) unresolvedIDRefs.get(id);
if (bd != null) {
bd.resolveIDRef(id, pages);
unresolvedIDRefs.remove(id);
}
} else {
pageRef = (PageViewport) pages.get(0);
// TODO get rect area of id on page
unresolvedIDRefs.remove(idRef);
}
}
/**
* @see org.apache.fop.area.OffDocumentItem#getName()
*/
public String getName() {
return "Bookmarks";
}
/**
* Create and return the bookmark data for this bookmark
* This creates a bookmark data with the destination
* and adds all the data from child bookmarks
*
* @param bookmark the Bookmark object for which a bookmark entry should be
* created
* @return the new bookmark data
*/
private BookmarkData createBookmarkData(Bookmark bookmark) {
BookmarkData data = new BookmarkData(bookmark);
for (int count = 0; count < bookmark.getChildBookmarks().size(); count++) {
Bookmark bkmk = (Bookmark)(bookmark.getChildBookmarks()).get(count);
data.addSubData(createBookmarkData(bkmk));
}
return data;
}
}