* The ASF licenses this file to You 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.
*/
/* $Id$ */
-
+
package org.apache.fop.area;
import java.util.Collection;
* child bookmark-items under it.
*/
public class BookmarkData extends AbstractOffDocumentItem implements Resolvable {
-
+
private List subData = new java.util.ArrayList();
// bookmark-title for this fo:bookmark
}
refs.add(bd);
}
-
+
/**
* Create a new bookmark data root object.
* This constructor is called by the AreaTreeParser when the
* id reference.
*
* {@inheritDoc} 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)) {
- Collection refs = (Collection)unresolvedIDRefs.get(id);
- if (refs != null) {
- Iterator iter = refs.iterator();
- while (iter.hasNext()) {
- BookmarkData bd = (BookmarkData)iter.next();
- bd.resolveIDRef(id, pages);
- }
- unresolvedIDRefs.remove(id);
- }
- } else {
+ if (id.equals(idRef)) {
+ //Own ID has been resolved, so note the page
pageRef = (PageViewport) pages.get(0);
- // TODO get rect area of id on page
- unresolvedIDRefs.remove(idRef);
+ //Note: Determining the placement inside the page is the renderer's job.
+ }
+
+ //Notify all child bookmarks
+ Collection refs = (Collection)unresolvedIDRefs.get(id);
+ if (refs != null) {
+ Iterator iter = refs.iterator();
+ while (iter.hasNext()) {
+ BookmarkData bd = (BookmarkData)iter.next();
+ bd.resolveIDRef(id, pages);
+ }
}
+ unresolvedIDRefs.remove(id);
}
/**
</contexts>
<changes>
- <!--release version="FOP Trunk" date="TBD"-->
- <!-- change reverted, to be added back later
- <action context="Renderers" dev="AC" importance="high" type="add">
- Added SVG support for AFP (GOCA).
- </action>
- -->
- <!--/release-->
- <release version="0.95" date="TBD">
+ <release version="FOP Trunk" date="TBD">
+ <action context="Layout" dev="JM" type="fix">
+ Fixed ID resolution for nested bookmarks with duplicated IDs.
+ </action>
+ </release>
+ <release version="0.95" date="05 August 2008">
<notes>
<section>
<title>Notes</title>
<fo:bookmark-tree>
<fo:bookmark internal-destination="chapter1">
<fo:bookmark-title>Chapter 1</fo:bookmark-title>
+ <fo:bookmark internal-destination="chapter1">
+ <fo:bookmark-title>Nested Chapter 1</fo:bookmark-title>
+ </fo:bookmark>
</fo:bookmark>
<fo:bookmark internal-destination="chapter1" starting-state="hide">
<fo:bookmark-title>Again Chapter 1</fo:bookmark-title>
</fo:bookmark>
+ <fo:bookmark internal-destination="chapter2">
+ <fo:bookmark-title>Chapter 2</fo:bookmark-title>
+ </fo:bookmark>
</fo:bookmark-tree>
<fo:page-sequence id="page-sequence" master-reference="normal">
<fo:flow flow-name="xsl-region-body">
<eval expected="Chapter 1" xpath="//bookmarkTree/bookmark[1]/@title"/>
<eval expected="true" xpath="//bookmarkTree/bookmark[1]/@show-children"/>
+ <eval expected="Nested Chapter 1" xpath="//bookmarkTree/bookmark[1]/bookmark[1]/@title"/>
+ <eval expected="true" xpath="//bookmarkTree/bookmark[1]/bookmark[1]/@show-children"/>
<eval expected="Again Chapter 1" xpath="//bookmarkTree/bookmark[2]/@title"/>
<eval expected="false" xpath="//bookmarkTree/bookmark[2]/@show-children"/>
<eval expected="(P1,chapter1)" xpath="//bookmarkTree/bookmark[1]/@internal-link"/>
+ <eval expected="(P1,chapter1)" xpath="//bookmarkTree/bookmark[1]/bookmark[1]/@internal-link"/>
<eval expected="(P1,chapter1)" xpath="//bookmarkTree/bookmark[2]/@internal-link"/>
</checks>