* 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);
}
/**
<changes>
<release version="FOP Trunk" date="TBD">
+ <action context="Layout" dev="JM" type="fix">
+ Fixed ID resolution for nested bookmarks with duplicated IDs.
+ </action>
<action context="Code" dev="AD" type="fix" fixes-bug="45490" due-to="Thomas Stieler">
Fixed a slight error when resolving non-file URLs: avoid
altering the original 'href' if the protocol is other than 'file:'
<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>