git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1768702 13f79535-47bb-0310-9956-ffa450edef68tags/fop-2_2
private LayoutManager originalRestartAtLM; | private LayoutManager originalRestartAtLM; | ||||
private Position positionAtBreak; | private Position positionAtBreak; | ||||
private List firstElementsForRestart; | private List firstElementsForRestart; | ||||
protected PageSequenceLayoutManager pslm; | |||||
/** | /** | ||||
* A page break position. | * A page break position. | ||||
* @param autoHeight true if warnings about overflows should be disabled because the | * @param autoHeight true if warnings about overflows should be disabled because the | ||||
* the BPD is really undefined (for footnote-separators, for example) | * 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(); | LayoutContext childLC = createLayoutContext(); | ||||
childLC.setStackLimitBP(MinOptMax.getInstance(flowBPD)); | childLC.setStackLimitBP(MinOptMax.getInstance(flowBPD)); | ||||
alignment = Constants.EN_START; | alignment = Constants.EN_START; | ||||
onLastPageAndIPDChanges = (lastPageHasIPDChange() && !thereIsANonRestartableLM(alg) | onLastPageAndIPDChanges = (lastPageHasIPDChange() && !thereIsANonRestartableLM(alg) | ||||
&& (shouldRedoLayout() || (wasLayoutRedone() && optimalPageCount > 1))); | && (shouldRedoLayout() || (wasLayoutRedone() && optimalPageCount > 1))); | ||||
} | } | ||||
if ((ipdChangesOnNextPage || hasMoreContent() || optimalPageCount > 1) | |||||
&& pslm != null && pslm.getCurrentPage().isPagePositionOnly) { | |||||
return false; | |||||
} | |||||
if (alg.handlingFloat()) { | if (alg.handlingFloat()) { | ||||
nextSequenceStartsOn = handleFloatLayout(alg, optimalPageCount, blockList, childLC); | nextSequenceStartsOn = handleFloatLayout(alg, optimalPageCount, blockList, childLC); | ||||
} else if (ipdChangesOnNextPage || onLastPageAndIPDChanges) { | } else if (ipdChangesOnNextPage || onLastPageAndIPDChanges) { | ||||
// done | // done | ||||
blockLists = null; | blockLists = null; | ||||
return true; | |||||
} | } | ||||
private LayoutManager getRestartAtLM(PageBreakingAlgorithm alg, boolean ipdChangesOnNextPage, | private LayoutManager getRestartAtLM(PageBreakingAlgorithm alg, boolean ipdChangesOnNextPage, |
public void initialize() { | public void initialize() { | ||||
startPageNum = pageSeq.getStartingPageNumber(); | startPageNum = pageSeq.getStartingPageNumber(); | ||||
currentPageNum = startPageNum - 1; | currentPageNum = startPageNum - 1; | ||||
curPage = null; | |||||
} | } | ||||
/** | /** |
private SimplePageMaster spm; | private SimplePageMaster spm; | ||||
private PageViewport pageViewport; | private PageViewport pageViewport; | ||||
protected boolean isPagePositionOnly; | |||||
/** | /** | ||||
* Main constructor | * Main constructor | ||||
* @param spanAll true if the first span area spans all columns | * @param spanAll true if the first span area spans all columns | ||||
*/ | */ | ||||
public Page(SimplePageMaster spm, int pageNumber, String pageNumberStr, | public Page(SimplePageMaster spm, int pageNumber, String pageNumberStr, | ||||
boolean blank, boolean spanAll) { | |||||
boolean blank, boolean spanAll, boolean isPagePositionOnly) { | |||||
this.spm = spm; | this.spm = spm; | ||||
this.pageViewport = new PageViewport(spm, pageNumber, pageNumberStr, blank, spanAll); | this.pageViewport = new PageViewport(spm, pageNumber, pageNumberStr, blank, spanAll); | ||||
this.isPagePositionOnly = isPagePositionOnly; | |||||
} | } | ||||
/** | /** |
*/ | */ | ||||
public class PageBreaker extends AbstractBreaker { | public class PageBreaker extends AbstractBreaker { | ||||
private PageSequenceLayoutManager pslm; | |||||
private boolean firstPart = true; | private boolean firstPart = true; | ||||
private boolean pageBreakHandled; | private boolean pageBreakHandled; | ||||
private boolean needColumnBalancing; | private boolean needColumnBalancing; | ||||
* Starts the page breaking process. | * Starts the page breaking process. | ||||
* @param flowBPD the constant available block-progression-dimension (used for every part) | * @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} */ | /** {@inheritDoc} */ |
*/ | */ | ||||
private PageSequence pageSeq; | private PageSequence pageSeq; | ||||
protected boolean skipPagePositionOnly; | |||||
/** | /** | ||||
* Main constructor. | * Main constructor. | ||||
* @param ath the area tree handler | * @param ath the area tree handler | ||||
this.startPageOfPageSequence = ps.getStartingPageNumber(); | this.startPageOfPageSequence = ps.getStartingPageNumber(); | ||||
} | } | ||||
public void initialize() { | |||||
cachedPages.clear(); | |||||
} | |||||
/** | /** | ||||
* The page breaker notifies the provider about the page number an element list starts | * 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. | * on so it can later retrieve PageViewports relative to this first page. | ||||
boolean isFirstPage = (startPageOfPageSequence == index); | boolean isFirstPage = (startPageOfPageSequence == index); | ||||
SimplePageMaster spm = pageSeq.getNextSimplePageMaster( | SimplePageMaster spm = pageSeq.getNextSimplePageMaster( | ||||
index, isFirstPage, isLastPage, isBlank); | 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 | //Set unique key obtained from the AreaTreeHandler | ||||
page.getPageViewport().setKey(areaTreeHandler.generatePageViewportKey()); | page.getPageViewport().setKey(areaTreeHandler.generatePageViewportKey()); | ||||
page.getPageViewport().setForeignAttributes(spm.getForeignAttributes()); | page.getPageViewport().setForeignAttributes(spm.getForeignAttributes()); | ||||
int index = this.cachedPages.size(); | int index = this.cachedPages.size(); | ||||
boolean isFirstPage = (startPageOfPageSequence == index); | boolean isFirstPage = (startPageOfPageSequence == index); | ||||
SimplePageMaster spm = pageSeq.getLastSimplePageMaster(index, isFirstPage, false); | 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) { | if (pageSeq.getRoot().getLastSeq() != null && pageSeq.getRoot().getLastSeq() != pageSeq) { | ||||
return -1; | return -1; | ||||
} | } |
log.debug("Starting layout"); | 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(); | finishPage(); | ||||
} | } | ||||
public void initialize() { | |||||
super.initialize(); | |||||
pageProvider.initialize(); | |||||
} | |||||
/** {@inheritDoc} */ | /** {@inheritDoc} */ | ||||
public void finishPageSequence() { | public void finishPageSequence() { | ||||
if (pageSeq.hasId()) { | if (pageSeq.hasId()) { |
<?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> |