Author: matthias
Date: Fri Jun 12 20:54:50 2015
New Revision: 1685165
URL: http://svn.apache.org/r1685165
Log:
FOP-2465: Fix links to/from 'last' page
Added:
xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/basic_link_to_last_page.xml
Modified:
xmlgraphics/fop/trunk/src/java/org/apache/fop/area/IDTracker.java
xmlgraphics/fop/trunk/src/java/org/apache/fop/area/PageViewport.java
xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/PageProvider.java
Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/area/IDTracker.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/area/IDTracker.java?rev=1685165&r1=1685164&r2=1685165&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/area/IDTracker.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/area/IDTracker.java Fri Jun
12 20:54:50 2015
@@ -238,4 +238,22 @@ public class IDTracker {
// add Resolvable object to this HashSet
todo.add(res);
}
+
+ /**
+ * Replace all id locations pointing to the old page view port with a new
one. This is
+ * necessary when a layouted page is replaced with a new one (e.g. last
page handling).
+ * @param oldPageViewPort old page view port
+ * @param newPageViewPort new page view port
+ */
+ public void replacePageViewPort(PageViewport oldPageViewPort, PageViewport
newPageViewPort) {
+
+ for (List<PageViewport> viewPortList : idLocations.values()) {
+ for (int i = 0, len = viewPortList.size(); i < len; i++) {
+ PageViewport currPV = viewPortList.get(i);
+ if (currPV == oldPageViewPort) {
+ viewPortList.set(i, newPageViewPort);
+ }
+ }
+ }
+ }
}
Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/area/PageViewport.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/area/PageViewport.java?rev=1685165&r1=1685164&r2=1685165&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/area/PageViewport.java
(original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/area/PageViewport.java Fri
Jun 12 20:54:50 2015
@@ -278,6 +278,19 @@ public class PageViewport extends AreaTr
}
/**
+ * Replace the old view port. This copies all ID related fields from the
old view port
+ * to the current one.
+ * @param oldViewPort old view port
+ */
+ public void replace(PageViewport oldViewPort) {
+ this.idFirsts.addAll(oldViewPort.idFirsts);
+ this.unresolvedIDRefs.putAll(oldViewPort.unresolvedIDRefs);
+ if (oldViewPort.pendingResolved != null) {
+ this.pendingResolved.putAll(oldViewPort.pendingResolved);
+ }
+ }
+
+ /**
* Add an idref to this page.
* All idrefs found for child areas of this {@link PageViewport} are added
* to unresolvedIDRefs, for subsequent resolution by {@link
AreaTreeHandler}
Modified:
xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/PageProvider.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/PageProvider.java?rev=1685165&r1=1685164&r2=1685165&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/PageProvider.java
(original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/PageProvider.java
Fri Jun 12 20:54:50 2015
@@ -25,6 +25,7 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.fop.area.AreaTreeHandler;
+import org.apache.fop.area.PageViewport;
import org.apache.fop.fo.Constants;
import org.apache.fop.fo.pagination.PageSequence;
import org.apache.fop.fo.pagination.SimplePageMaster;
@@ -311,7 +312,11 @@ public class PageProvider implements Con
}
if (replace) {
discardCacheStartingWith(intIndex);
+ PageViewport oldPageVP = page.getPageViewport();
page = cacheNextPage(index, isBlank, isLastPage,
this.spanAllForCurrentElementList);
+ PageViewport newPageVP = page.getPageViewport();
+ newPageVP.replace(oldPageVP);
+ this.areaTreeHandler.getIDTracker().replacePageViewPort(oldPageVP,
newPageVP);
}
return page;
}
Added:
xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/basic_link_to_last_page.xml
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/basic_link_to_last_page.xml?rev=1685165&view=auto
==============================================================================
---
xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/basic_link_to_last_page.xml
(added)
+++
xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/basic_link_to_last_page.xml
Fri Jun 12 20:54:50 2015
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ 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.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- $Id$ -->
+<testcase>
+ <info>
+ <p>This test checks links to and from the last page.</p>
+ </info>
+ <fo>
+ <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <fo:layout-master-set>
+ <fo:simple-page-master margin="2cm" master-name="odd"
page-height="297mm" page-width="210mm">
+ <fo:region-body column-count="2" column-gap="28pt"/>
+ </fo:simple-page-master>
+ <fo:simple-page-master margin="2cm" master-name="even"
page-height="297mm" page-width="210mm">
+ <fo:region-body column-count="2" column-gap="28pt"/>
+ </fo:simple-page-master>
+ <fo:simple-page-master margin="2cm" master-name="last"
page-height="297mm" page-width="210mm">
+ <fo:region-body column-count="2" column-gap="28pt"/>
+ </fo:simple-page-master>
+ <fo:page-sequence-master master-name="basicPSM">
+ <fo:repeatable-page-master-alternatives>
+ <fo:conditional-page-master-reference master-reference="last"
odd-or-even="any" page-position="last"/>
+ <fo:conditional-page-master-reference master-reference="odd"
odd-or-even="odd" page-position="any"/>
+ <fo:conditional-page-master-reference master-reference="even"
odd-or-even="even" page-position="any"/>
+ </fo:repeatable-page-master-alternatives>
+ </fo:page-sequence-master>
+ </fo:layout-master-set>
+ <fo:bookmark-tree>
+ <fo:bookmark internal-destination="title" starting-state="show">
+ <fo:bookmark-title>title</fo:bookmark-title>
+ </fo:bookmark>
+ </fo:bookmark-tree>
+ <fo:page-sequence id="lastpagesequence" master-reference="basicPSM">
+ <fo:flow flow-name="xsl-region-body">
+ <fo:block id="par" break-after="page">par</fo:block>
+ <fo:block id="par2" break-after="page">par2</fo:block>
+ <fo:block id="par3" break-after="page">par3</fo:block>
+ <fo:block>before-title</fo:block>
+ <fo:block id="title" keep-with-next="always">title</fo:block>
+ <fo:block>
+ <fo:basic-link internal-destination="par2">
+ siehe <fo:inline keep-together="always">
+ Seite <fo:page-number-citation ref-id="par2"/>
+ </fo:inline>
+ </fo:basic-link>
+ </fo:block>
+ <fo:block break-before="column">title2</fo:block>
+ <fo:block>
+ <fo:basic-link internal-destination="par3">
+ siehe <fo:inline keep-together="always">
+ Seite <fo:page-number-citation ref-id="par3"/>
+ </fo:inline>
+ </fo:basic-link>
+ </fo:block>
+ </fo:flow>
+ </fo:page-sequence>
+ </fo:root>
+ </fo>
+ <checks>
+ <eval expected="(P2,par2)"
xpath="((/areaTree/pageSequence/pageViewport)[4]//inlineparent[@internal-link])[1]/@internal-link"/>
+ <eval expected="(P3,par3)"
xpath="((/areaTree/pageSequence/pageViewport)[4]//inlineparent[@internal-link])[2]/@internal-link"/>
+ <eval expected="(P5,title)"
xpath="/areaTree/bookmarkTree/bookmark/@internal-link"/>
+ <eval expected="4" xpath="count(/areaTree/pageSequence/pageViewport)"/>
+ </checks>
+</testcase>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]