Author: ssteiner
Date: Tue Nov  8 14:34:28 2016
New Revision: 1768702

URL: http://svn.apache.org/viewvc?rev=1768702&view=rev
Log:
FOP-2664: Use page-position=only if there is enough space

Added:
    
xmlgraphics/fop/trunk/fop/test/layoutengine/standard-testcases/page-position_only_2.xml
   (with props)
Modified:
    
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/AbstractBreaker.java
    
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/AbstractPageSequenceLayoutManager.java
    
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/Page.java
    
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/PageBreaker.java
    
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/PageProvider.java
    
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/PageSequenceLayoutManager.java

Modified: 
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/AbstractBreaker.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/AbstractBreaker.java?rev=1768702&r1=1768701&r2=1768702&view=diff
==============================================================================
--- 
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/AbstractBreaker.java
 (original)
+++ 
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/AbstractBreaker.java
 Tue Nov  8 14:34:28 2016
@@ -45,6 +45,7 @@ public abstract class AbstractBreaker {
     private LayoutManager originalRestartAtLM;
     private Position positionAtBreak;
     private List firstElementsForRestart;
+    protected PageSequenceLayoutManager pslm;
 
     /**
      * A page break position.
@@ -368,7 +369,7 @@ public abstract class AbstractBreaker {
      * @param autoHeight true if warnings about overflows should be disabled 
because the
      *                   the BPD is really undefined (for footnote-separators, 
for example)
      */
-    public void doLayout(int flowBPD, boolean autoHeight) {
+    public boolean doLayout(int flowBPD, boolean autoHeight) {
         LayoutContext childLC = createLayoutContext();
         childLC.setStackLimitBP(MinOptMax.getInstance(flowBPD));
         alignment = Constants.EN_START;
@@ -418,6 +419,10 @@ public abstract class AbstractBreaker {
                     onLastPageAndIPDChanges = (lastPageHasIPDChange() && 
!thereIsANonRestartableLM(alg)
                             && (shouldRedoLayout() || (wasLayoutRedone() && 
optimalPageCount > 1)));
                 }
+                if ((ipdChangesOnNextPage || hasMoreContent() || 
optimalPageCount > 1)
+                        && pslm != null && 
pslm.getCurrentPage().isPagePositionOnly) {
+                    return false;
+                }
                 if (alg.handlingFloat()) {
                     nextSequenceStartsOn = handleFloatLayout(alg, 
optimalPageCount, blockList, childLC);
                 } else if (ipdChangesOnNextPage || onLastPageAndIPDChanges) {
@@ -457,6 +462,7 @@ public abstract class AbstractBreaker {
 
         // done
         blockLists = null;
+        return true;
     }
 
     private LayoutManager getRestartAtLM(PageBreakingAlgorithm alg, boolean 
ipdChangesOnNextPage,

Modified: 
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/AbstractPageSequenceLayoutManager.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/AbstractPageSequenceLayoutManager.java?rev=1768702&r1=1768701&r2=1768702&view=diff
==============================================================================
--- 
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/AbstractPageSequenceLayoutManager.java
 (original)
+++ 
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/AbstractPageSequenceLayoutManager.java
 Tue Nov  8 14:34:28 2016
@@ -111,6 +111,7 @@ public abstract class AbstractPageSequen
     public void initialize() {
         startPageNum = pageSeq.getStartingPageNumber();
         currentPageNum = startPageNum - 1;
+        curPage = null;
     }
 
     /**

Modified: 
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/Page.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/Page.java?rev=1768702&r1=1768701&r2=1768702&view=diff
==============================================================================
--- 
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/Page.java 
(original)
+++ 
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/Page.java 
Tue Nov  8 14:34:28 2016
@@ -34,6 +34,7 @@ public class Page {
 
     private SimplePageMaster spm;
     private PageViewport pageViewport;
+    protected boolean isPagePositionOnly;
 
     /**
      * Main constructor
@@ -44,9 +45,10 @@ public class Page {
      * @param spanAll true if the first span area spans all columns
      */
     public Page(SimplePageMaster spm, int pageNumber, String pageNumberStr,
-            boolean blank, boolean spanAll) {
+            boolean blank, boolean spanAll, boolean isPagePositionOnly) {
         this.spm = spm;
         this.pageViewport = new PageViewport(spm, pageNumber, pageNumberStr, 
blank, spanAll);
+        this.isPagePositionOnly = isPagePositionOnly;
     }
 
     /**

Modified: 
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/PageBreaker.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/PageBreaker.java?rev=1768702&r1=1768701&r2=1768702&view=diff
==============================================================================
--- 
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/PageBreaker.java
 (original)
+++ 
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/PageBreaker.java
 Tue Nov  8 14:34:28 2016
@@ -43,7 +43,6 @@ import org.apache.fop.traits.MinOptMax;
  */
 public class PageBreaker extends AbstractBreaker {
 
-    private PageSequenceLayoutManager pslm;
     private boolean firstPart = true;
     private boolean pageBreakHandled;
     private boolean needColumnBalancing;
@@ -109,8 +108,8 @@ public class PageBreaker extends Abstrac
      * Starts the page breaking process.
      * @param flowBPD the constant available block-progression-dimension (used 
for every part)
      */
-    void doLayout(int flowBPD) {
-        doLayout(flowBPD, false);
+    boolean doLayout(int flowBPD) {
+        return doLayout(flowBPD, false);
     }
 
     /** {@inheritDoc} */

Modified: 
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/PageProvider.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/PageProvider.java?rev=1768702&r1=1768701&r2=1768702&view=diff
==============================================================================
--- 
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/PageProvider.java
 (original)
+++ 
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/PageProvider.java
 Tue Nov  8 14:34:28 2016
@@ -75,6 +75,8 @@ public class PageProvider implements Con
      */
     private PageSequence pageSeq;
 
+    protected boolean skipPagePositionOnly;
+
     /**
      * Main constructor.
      * @param ath the area tree handler
@@ -86,6 +88,10 @@ public class PageProvider implements Con
         this.startPageOfPageSequence = ps.getStartingPageNumber();
     }
 
+    public void initialize() {
+        cachedPages.clear();
+    }
+
     /**
      * The page breaker notifies the provider about the page number an element 
list starts
      * on so it can later retrieve PageViewports relative to this first page.
@@ -346,7 +352,11 @@ public class PageProvider implements Con
         boolean isFirstPage = (startPageOfPageSequence == index);
         SimplePageMaster spm = pageSeq.getNextSimplePageMaster(
                 index, isFirstPage, isLastPage, isBlank);
-        Page page = new Page(spm, index, pageNumberString, isBlank, spanAll);
+        boolean isPagePositionOnly = pageSeq.hasPagePositionOnly() && 
!skipPagePositionOnly;
+        if (isPagePositionOnly) {
+            spm = pageSeq.getNextSimplePageMaster(index, isFirstPage, true, 
isBlank);
+        }
+        Page page = new Page(spm, index, pageNumberString, isBlank, spanAll, 
isPagePositionOnly);
         //Set unique key obtained from the AreaTreeHandler
         
page.getPageViewport().setKey(areaTreeHandler.generatePageViewportKey());
         
page.getPageViewport().setForeignAttributes(spm.getForeignAttributes());
@@ -372,7 +382,7 @@ public class PageProvider implements Con
         int index = this.cachedPages.size();
         boolean isFirstPage = (startPageOfPageSequence == index);
         SimplePageMaster spm = pageSeq.getLastSimplePageMaster(index, 
isFirstPage, false);
-        Page page = new Page(spm, index, "", false, false);
+        Page page = new Page(spm, index, "", false, false, false);
         if (pageSeq.getRoot().getLastSeq() != null && 
pageSeq.getRoot().getLastSeq() != pageSeq) {
             return -1;
         }

Modified: 
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/PageSequenceLayoutManager.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/PageSequenceLayoutManager.java?rev=1768702&r1=1768701&r2=1768702&view=diff
==============================================================================
--- 
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/PageSequenceLayoutManager.java
 (original)
+++ 
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/PageSequenceLayoutManager.java
 Tue Nov  8 14:34:28 2016
@@ -131,15 +131,25 @@ public class PageSequenceLayoutManager e
             log.debug("Starting layout");
         }
 
-        curPage = makeNewPage(false);
+        boolean finished = false;
+        while (!finished) {
+            initialize();
+            curPage = makeNewPage(false);
 
-        pageBreaker = new PageBreaker(this);
-        int flowBPD = getCurrentPV().getBodyRegion().getRemainingBPD();
-        pageBreaker.doLayout(flowBPD);
+            pageBreaker = new PageBreaker(this);
+            int flowBPD = getCurrentPV().getBodyRegion().getRemainingBPD();
+            finished = pageBreaker.doLayout(flowBPD);
+            pageProvider.skipPagePositionOnly = true;
+        }
 
         finishPage();
     }
 
+    public void initialize() {
+        super.initialize();
+        pageProvider.initialize();
+    }
+
     /** {@inheritDoc} */
     public void finishPageSequence() {
         if (pageSeq.hasId()) {

Added: 
xmlgraphics/fop/trunk/fop/test/layoutengine/standard-testcases/page-position_only_2.xml
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop/test/layoutengine/standard-testcases/page-position_only_2.xml?rev=1768702&view=auto
==============================================================================
--- 
xmlgraphics/fop/trunk/fop/test/layoutengine/standard-testcases/page-position_only_2.xml
 (added)
+++ 
xmlgraphics/fop/trunk/fop/test/layoutengine/standard-testcases/page-position_only_2.xml
 Tue Nov  8 14:34:28 2016
@@ -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 for the use of an 'only' 
conditional-page-master-reference (XSL 1.1)
+    </p>
+  </info>
+  <fo>
+<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format";>
+  <fo:layout-master-set>
+    <fo:simple-page-master margin-left="20mm" margin-right="20mm" 
page-height="297mm" page-width="210mm" master-name="OnlyPage" 
margin-bottom="5mm" margin-top="12mm">
+      <fo:region-body region-name="Body" margin-bottom="30mm" 
margin-top="105mm" background-color="red" />
+    </fo:simple-page-master>
+    <fo:simple-page-master page-height="297mm" page-width="210mm" 
master-name="FrontPage" margin-bottom="5mm" margin-left="20mm" 
margin-right="20mm" margin-top="12mm">
+      <fo:region-body region-name="Body" margin-bottom="70mm" 
margin-top="105mm" background-color="green" />
+    </fo:simple-page-master>
+    <fo:simple-page-master page-height="297mm" page-width="210mm" 
master-name="BackPage" margin-bottom="5mm" margin-left="20mm" 
margin-right="20mm" margin-top="15mm">
+      <fo:region-body region-name="Body" margin-bottom="30mm" 
margin-top="20mm" background-color="transparent" />
+    </fo:simple-page-master>
+    <fo:page-sequence-master master-name="LetterPages">
+      <fo:repeatable-page-master-alternatives>
+        <fo:conditional-page-master-reference master-reference="OnlyPage" 
page-position="only" />
+        <fo:conditional-page-master-reference master-reference="FrontPage" 
page-position="first" />
+        <fo:conditional-page-master-reference master-reference="BackPage" 
page-position="rest" />
+        <fo:conditional-page-master-reference master-reference="BackPage" 
page-position="last" />
+      </fo:repeatable-page-master-alternatives>
+    </fo:page-sequence-master>
+  </fo:layout-master-set>
+  <fo:page-sequence master-reference="LetterPages" force-page-count="auto" 
initial-page-number="auto">
+
+    <fo:flow flow-name="Body">
+      <fo:block>
+        <fo:block>1test</fo:block>
+        <fo:block>2test</fo:block>
+        <fo:block>3test</fo:block>
+        <fo:block>4test</fo:block>
+        <fo:block>5test</fo:block>
+        <fo:block>6test</fo:block>
+        <fo:block>7test</fo:block>
+        <fo:block>8test</fo:block>
+        <fo:block>9test</fo:block>
+        <fo:block>10test</fo:block>
+        <fo:block>11test</fo:block>
+        <fo:block>12test</fo:block>
+        <fo:block>13test</fo:block>
+        <fo:block>14test</fo:block>
+        <fo:block>15test</fo:block>
+        <fo:block>16test</fo:block>
+        <fo:block>17test</fo:block>
+        <fo:block>18test</fo:block>
+        <fo:block>19test</fo:block>
+        <fo:block>20test</fo:block>
+        <fo:block>21test</fo:block>
+      </fo:block>
+
+    </fo:flow>
+  </fo:page-sequence>
+</fo:root>
+  </fo>
+  <checks>
+    <eval expected="21test" 
xpath="//pageViewport[1]//flow/block/block[21]/lineArea[1]/text/word[1]"/>
+  </checks>
+</testcase>

Propchange: 
xmlgraphics/fop/trunk/fop/test/layoutengine/standard-testcases/page-position_only_2.xml
------------------------------------------------------------------------------
    svn:eol-style = native



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

Reply via email to