private LayoutManager originalRestartAtLM;
private Position positionAtBreak;
private List firstElementsForRestart;
+ protected PageSequenceLayoutManager pslm;
/**
* A page break position.
* @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;
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) {
// done
blockLists = null;
+ return true;
}
private LayoutManager getRestartAtLM(PageBreakingAlgorithm alg, boolean ipdChangesOnNextPage,
public void initialize() {
startPageNum = pageSeq.getStartingPageNumber();
currentPageNum = startPageNum - 1;
+ curPage = null;
}
/**
private SimplePageMaster spm;
private PageViewport pageViewport;
+ protected boolean isPagePositionOnly;
/**
* Main constructor
* @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;
}
/**
*/
public class PageBreaker extends AbstractBreaker {
- private PageSequenceLayoutManager pslm;
private boolean firstPart = true;
private boolean pageBreakHandled;
private boolean needColumnBalancing;
* 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} */
*/
private PageSequence pageSeq;
+ protected boolean skipPagePositionOnly;
+
/**
* Main constructor.
* @param ath the area tree handler
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.
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());
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;
}
log.debug("Starting layout");
}
- curPage = makeNewPage(false);
-
- pageBreaker = new PageBreaker(this);
- int flowBPD = getCurrentPV().getBodyRegion().getRemainingBPD();
- pageBreaker.doLayout(flowBPD);
+ boolean finished = false;
+ while (!finished) {
+ initialize();
+ curPage = makeNewPage(false);
+
+ 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()) {
--- /dev/null
+<?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>