Author: jeremias
Date: Tue Sep  7 13:45:39 2010
New Revision: 993357

URL: http://svn.apache.org/viewvc?rev=993357&view=rev
Log:
Bugzilla #49885:
Fixed retrieval of available BPD for cases spanning columns and multiple pages 
with differing page masters.

Added:
    
xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/region-body_column-count_span_4.xml
   (with props)
Modified:
    xmlgraphics/fop/trunk/src/java/org/apache/fop/area/PageViewport.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/Page.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/PageBreaker.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/PageProvider.java
    xmlgraphics/fop/trunk/status.xml

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=993357&r1=993356&r2=993357&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 Tue 
Sep  7 13:45:39 2010
@@ -95,8 +95,10 @@ public class PageViewport extends AreaTr
      * @param pageNumber the page number
      * @param pageStr String representation of the page number
      * @param blank true if this is a blank page
+     * @param spanAll true if the first span area spans all columns
      */
-    public PageViewport(SimplePageMaster spm, int pageNumber, String pageStr, 
boolean blank) {
+    public PageViewport(SimplePageMaster spm, int pageNumber, String pageStr,
+            boolean blank, boolean spanAll) {
         this.simplePageMasterName = spm.getMasterName();
         setExtensionAttachments(spm.getExtensionAttachments());
         setForeignAttributes(spm.getForeignAttributes());
@@ -107,7 +109,18 @@ public class PageViewport extends AreaTr
         this.pageNumberString = pageStr;
         this.viewArea = new Rectangle(0, 0, pageWidth, pageHeight);
         this.page = new Page(spm);
-        createSpan(false);
+        createSpan(spanAll);
+    }
+
+    /**
+     * Create a page viewport.
+     * @param spm SimplePageMaster indicating the page and region dimensions
+     * @param pageNumber the page number
+     * @param pageStr String representation of the page number
+     * @param blank true if this is a blank page
+     */
+    public PageViewport(SimplePageMaster spm, int pageNumber, String pageStr, 
boolean blank) {
+        this(spm, pageNumber, pageStr, blank, false);
     }
 
     /**

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/Page.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/Page.java?rev=993357&r1=993356&r2=993357&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/Page.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/Page.java Tue Sep  
7 13:45:39 2010
@@ -41,10 +41,12 @@ public class Page {
      * @param pageNumber the page number (as an int)
      * @param pageNumberStr the page number (as a String)
      * @param blank true if this is a blank page
+     * @param spanAll true if the first span area spans all columns
      */
-    public Page(SimplePageMaster spm, int pageNumber, String pageNumberStr, 
boolean blank) {
+    public Page(SimplePageMaster spm, int pageNumber, String pageNumberStr,
+            boolean blank, boolean spanAll) {
         this.spm = spm;
-        this.pageViewport = new PageViewport(spm, pageNumber, pageNumberStr, 
blank);
+        this.pageViewport = new PageViewport(spm, pageNumber, pageNumberStr, 
blank, spanAll);
     }
 
     /**

Modified: 
xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/PageBreaker.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/PageBreaker.java?rev=993357&r1=993356&r2=993357&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/PageBreaker.java 
(original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/PageBreaker.java 
Tue Sep  7 13:45:39 2010
@@ -45,6 +45,7 @@ public class PageBreaker extends Abstrac
     private boolean needColumnBalancing;
     private PageProvider pageProvider;
     private Block separatorArea;
+    private boolean spanAllActive;
 
     /**
      * The FlowLayoutManager object, which processes
@@ -148,8 +149,9 @@ public class PageBreaker extends Abstrac
         }
         firstPart = false;
         pageBreakHandled = true;
+
         pageProvider.setStartOfNextElementList(pslm.getCurrentPageNum(),
-                pslm.getCurrentPV().getCurrentSpan().getCurrentFlowIndex());
+                pslm.getCurrentPV().getCurrentSpan().getCurrentFlowIndex(), 
this.spanAllActive);
         return super.getNextBlockList(childLC, nextSequenceStartsOn, 
positionAtIPDChange,
                 restartLM, firstElements);
     }
@@ -342,8 +344,9 @@ public class PageBreaker extends Abstrac
         pageBreakHandled = true;
         //Update so the available BPD is reported correctly
         int currentPageNum = pslm.getCurrentPageNum();
+
         pageProvider.setStartOfNextElementList(currentPageNum,
-                pslm.getCurrentPV().getCurrentSpan().getCurrentFlowIndex());
+                pslm.getCurrentPV().getCurrentSpan().getCurrentFlowIndex(), 
this.spanAllActive);
 
         //Make sure we only add the areas we haven't added already
         effectiveList.ignoreAtStart = newStartPos;
@@ -387,7 +390,7 @@ public class PageBreaker extends Abstrac
 
         boolean fitsOnePage
             = optimalPageCount <= pslm.getCurrentPV()
-            
.getBodyRegion().getMainReference().getCurrentSpan().getColumnCount();
+                
.getBodyRegion().getMainReference().getCurrentSpan().getColumnCount();
 
         if (needColumnBalancing) {
             if (!fitsOnePage) {
@@ -435,7 +438,8 @@ public class PageBreaker extends Abstrac
                 handleBreakTrait(breakClass);
             }
             pageProvider.setStartOfNextElementList(pslm.getCurrentPageNum(),
-                    
pslm.getCurrentPV().getCurrentSpan().getCurrentFlowIndex());
+                    pslm.getCurrentPV().getCurrentSpan().getCurrentFlowIndex(),
+                    this.spanAllActive);
         }
         pageBreakHandled = false;
         // add static areas and resolve any new id areas
@@ -503,9 +507,11 @@ public class PageBreaker extends Abstrac
         case Constants.EN_ALL:
             //break due to span change in multi-column layout
             curPage.getPageViewport().createSpan(true);
+            this.spanAllActive = true;
             return;
         case Constants.EN_NONE:
             curPage.getPageViewport().createSpan(false);
+            this.spanAllActive = false;
             return;
         case Constants.EN_COLUMN:
         case Constants.EN_AUTO:

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=993357&r1=993356&r2=993357&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 
Tue Sep  7 13:45:39 2010
@@ -51,6 +51,7 @@ public class PageProvider implements Con
     private int startPageOfPageSequence;
     private int startPageOfCurrentElementList;
     private int startColumnOfCurrentElementList;
+    private boolean spanAllForCurrentElementList;
     private List cachedPages = new java.util.ArrayList();
 
     private int lastPageIndex = -1;
@@ -88,12 +89,17 @@ public class PageProvider implements Con
      * on so it can later retrieve PageViewports relative to this first page.
      * @param startPage the number of the first page for the element list.
      * @param startColumn the starting column number for the element list.
+     * @param spanAll true if the current element list is for a 
column-spanning section
      */
-    public void setStartOfNextElementList(int startPage, int startColumn) {
-        log.debug("start of the next element list is:"
-                + " page=" + startPage + " col=" + startColumn);
+    public void setStartOfNextElementList(int startPage, int startColumn, 
boolean spanAll) {
+        if (log.isDebugEnabled()) {
+            log.debug("start of the next element list is:"
+                    + " page=" + startPage + " col=" + startColumn
+                    + (spanAll ? ", column-spanning" : ""));
+        }
         this.startPageOfCurrentElementList = startPage - 
startPageOfPageSequence + 1;
         this.startColumnOfCurrentElementList = startColumn;
+        this.spanAllForCurrentElementList = spanAll;
         //Reset Cache
         this.lastRequestedIndex = -1;
         this.lastReportedBPD = -1;
@@ -290,7 +296,7 @@ public class PageProvider implements Con
             if (log.isTraceEnabled()) {
                 log.trace("Caching " + index);
             }
-            cacheNextPage(index, isBlank, isLastPage);
+            cacheNextPage(index, isBlank, isLastPage, 
this.spanAllForCurrentElementList);
         }
         Page page = (Page)cachedPages.get(intIndex);
         boolean replace = false;
@@ -306,7 +312,7 @@ public class PageProvider implements Con
         }
         if (replace) {
             discardCacheStartingWith(intIndex);
-            page = cacheNextPage(index, isBlank, isLastPage);
+            page = cacheNextPage(index, isBlank, isLastPage, 
this.spanAllForCurrentElementList);
         }
         return page;
     }
@@ -320,7 +326,7 @@ public class PageProvider implements Con
         }
     }
 
-    private Page cacheNextPage(int index, boolean isBlank, boolean isLastPage) 
{
+    private Page cacheNextPage(int index, boolean isBlank, boolean isLastPage, 
boolean spanAll) {
         String pageNumberString = pageSeq.makeFormattedPageNumber(index);
         boolean isFirstPage = (startPageOfPageSequence == index);
         SimplePageMaster spm = pageSeq.getNextSimplePageMaster(
@@ -335,7 +341,7 @@ public class PageProvider implements Con
             eventProducer.flowNotMappingToRegionBody(this,
                     pageSeq.getMainFlow().getFlowName(), spm.getMasterName(), 
spm.getLocator());
         }
-        Page page = new Page(spm, index, pageNumberString, isBlank);
+        Page page = new Page(spm, index, pageNumberString, isBlank, spanAll);
         //Set unique key obtained from the AreaTreeHandler
         
page.getPageViewport().setKey(areaTreeHandler.generatePageViewportKey());
         
page.getPageViewport().setForeignAttributes(spm.getForeignAttributes());

Modified: xmlgraphics/fop/trunk/status.xml
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/status.xml?rev=993357&r1=993356&r2=993357&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/status.xml (original)
+++ xmlgraphics/fop/trunk/status.xml Tue Sep  7 13:45:39 2010
@@ -58,6 +58,9 @@
       documents. Example: the fix of marks layering will be such a case when 
it's done.
     -->
     <release version="FOP Trunk" date="TBD">
+      <action context="Layout" dev="JM" type="fix" fixes-bug="49885">
+        Fixed retrieval of available BPD for cases spanning columns and 
multiple pages with differing page masters.
+      </action>
       <action context="Renderers" dev="VH" type="remove">
         Removed old Renderer implementations for those output formats that 
have a version based on 
         the new DocumentHandler architecture available (AFP, PCL, PDF, PS).

Added: 
xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/region-body_column-count_span_4.xml
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/region-body_column-count_span_4.xml?rev=993357&view=auto
==============================================================================
--- 
xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/region-body_column-count_span_4.xml
 (added)
+++ 
xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/region-body_column-count_span_4.xml
 Tue Sep  7 13:45:39 2010
@@ -0,0 +1,84 @@
+<?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 multi-column documents. Check that spanned section that 
are broken over
+      to multiple pages still respect the span setting. This particular test 
makes sure that pages with different region-body
+      height are handled properly.
+    </p>
+  </info>
+  <fo>
+    <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format";>
+      <fo:layout-master-set>
+        <fo:simple-page-master master-name="odd-page" page-height="3.5cm" 
page-width="4cm" margin="0.45cm">
+          <fo:region-body margin-top="12pt * 1.2 * 2" column-count="2" 
background-color="yellow"/>
+        </fo:simple-page-master>
+        <fo:simple-page-master master-name="even-page" page-height="3.5cm" 
page-width="4cm" margin="0.45cm">
+          <fo:region-body column-count="2" background-color="orange"/>
+        </fo:simple-page-master>
+        <fo:page-sequence-master master-name="master">
+          <fo:repeatable-page-master-alternatives>
+            <fo:conditional-page-master-reference master-reference="odd-page" 
odd-or-even="odd" blank-or-not-blank="not-blank"/>
+            <fo:conditional-page-master-reference master-reference="even-page" 
odd-or-even="even" blank-or-not-blank="not-blank"/>
+          </fo:repeatable-page-master-alternatives>
+        </fo:page-sequence-master>
+      </fo:layout-master-set>
+      <fo:page-sequence master-reference="master">
+        <fo:flow flow-name="xsl-region-body">
+          <fo:block span="all">
+            <fo:block>Line 1</fo:block>
+            <fo:block>Line 2</fo:block>
+            <fo:block>Line 3</fo:block>
+            <fo:block>Line 4</fo:block>
+            <fo:block>Line 5</fo:block>
+            <fo:block>Line 6</fo:block>
+            <fo:block>Line 7</fo:block>
+            <fo:block>Line 8</fo:block>
+            <fo:block>Line 9</fo:block>
+            <fo:block>Line 10</fo:block>
+            <fo:block>Line 11</fo:block>
+            <fo:block>Line 12</fo:block>
+            <fo:block>Line 13</fo:block>
+            <fo:block>Line 14</fo:block>
+            <fo:block>Line 15</fo:block>
+            <fo:block>Line 16</fo:block>
+            <fo:block>Line 17</fo:block>
+            <fo:block>Line 18</fo:block>
+            <fo:block>Line 19</fo:block>
+            <fo:block>Line 20</fo:block>
+            <fo:block>Line 21</fo:block>
+            <fo:block>Line 22</fo:block>
+          </fo:block>
+        </fo:flow>
+      </fo:page-sequence>
+    </fo:root>
+  </fo>
+  <checks>
+    <eval expected="6" xpath="count(//pageViewport)"/>
+    
+    <eval expected="3" xpath="count(//pageviewpo...@nr=1]//lineArea)"/>
+    <eval expected="5" xpath="count(//pageviewpo...@nr=2]//lineArea)"/>
+    <eval expected="3" xpath="count(//pageviewpo...@nr=3]//lineArea)"/>
+    <eval expected="5" xpath="count(//pageviewpo...@nr=4]//lineArea)"/>
+    <eval expected="3" xpath="count(//pageviewpo...@nr=5]//lineArea)"/>
+    <eval expected="3" xpath="count(//pageviewpo...@nr=6]//lineArea)"/>
+    
+  </checks>
+</testcase>

Propchange: 
xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/region-body_column-count_span_4.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/region-body_column-count_span_4.xml
------------------------------------------------------------------------------
    svn:keywords = Id



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to