]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
Fixed ID resolution for nested bookmarks with duplicated IDs.
authorJeremias Maerki <jeremias@apache.org>
Sun, 10 Aug 2008 19:01:59 +0000 (19:01 +0000)
committerJeremias Maerki <jeremias@apache.org>
Sun, 10 Aug 2008 19:01:59 +0000 (19:01 +0000)
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/branches/fop-0_95@684572 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/fop/area/BookmarkData.java
status.xml
test/layoutengine/standard-testcases/bookmarks_2.xml

index 07290824e0d249886c85b3611a0d653a0a5cc444..28ee2c23e0078f8687d03280fb6ae4b7e89373d7 100644 (file)
@@ -5,9 +5,9 @@
  * 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.
@@ -16,7 +16,7 @@
  */
 
 /* $Id$ */
+
 package org.apache.fop.area;
 
 import java.util.Collection;
@@ -33,7 +33,7 @@ import org.apache.fop.fo.pagination.bookmarks.BookmarkTree;
  * 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
@@ -92,7 +92,7 @@ public class BookmarkData extends AbstractOffDocumentItem implements Resolvable
         }
         refs.add(bd);
     }
-    
+
     /**
      * Create a new bookmark data root object.
      * This constructor is called by the AreaTreeParser when the
@@ -218,25 +218,24 @@ public class BookmarkData extends AbstractOffDocumentItem implements Resolvable
      * 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);
     }
 
     /**
index 495f0a545fc14ee4e22c8367b307d54f11834fd5..68575fe81093f5c267c76b4f3bf18d18c114362a 100644 (file)
   </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>
index b66b27bcff56ab7832ac90ec5144f25f554c5062..90a801412f6816c934d12945c7122ef79ab78425 100644 (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>