Patch by Seifeddine Dridi, applied with minor modifications git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/branches/Temp_WhitespaceManagement@1588548 13f79535-47bb-0310-9956-ffa450edef68tags/fop-2_0
@@ -64,18 +64,15 @@ public class MultiSwitchLayoutManager extends BlockStackingLayoutManager { | |||
private class DefaultKnuthListGenerator implements KnuthElementsGenerator { | |||
public List<ListElement> getKnuthElement(LayoutContext context, int alignment) { | |||
List<ListElement> knuthList = new LinkedList<ListElement>(); | |||
LayoutManager childLM; | |||
while ((childLM = getChildLM()) != null) { | |||
if (!childLM.isFinished()) { | |||
LayoutContext childLC = makeChildLayoutContext(context); | |||
List childElements = childLM.getNextKnuthElements(childLC, alignment); | |||
if (childElements != null) { | |||
List<ListElement> newList = new LinkedList<ListElement>(); | |||
wrapPositionElements(childElements, newList); | |||
knuthList.addAll(newList); | |||
} | |||
LayoutManager childLM = getChildLM(); | |||
while (!childLM.isFinished()) { | |||
LayoutContext childLC = makeChildLayoutContext(context); | |||
List childElements = childLM.getNextKnuthElements(childLC, alignment); | |||
if (childElements != null) { | |||
List<ListElement> newList = new LinkedList<ListElement>(); | |||
wrapPositionElements(childElements, newList); | |||
knuthList.addAll(newList); | |||
} | |||
} | |||
return knuthList; |
@@ -1026,10 +1026,10 @@ class PageBreakingAlgorithm extends BreakingAlgorithm { | |||
KnuthPageNode pageNode = (KnuthPageNode) bestActiveNode; | |||
KnuthPageNode previousPageNode = ((KnuthPageNode) pageNode.previous); | |||
for (Variant var : previousPageNode.pendingVariants) { | |||
WhitespaceManagementPenalty penalty = var.getBestFitPenalty(); | |||
int penaltyIndex = this.par.indexOf(penalty); | |||
// Make sure penalty is inside the range of the current page node | |||
if (penaltyIndex <= pageNode.position) { | |||
WhitespaceManagementPenalty penalty = var.getWhitespaceManagementPenalty(); | |||
// A WMPenalty should not be activated more than once. The reason is simply | |||
// because a dynamic content cannot occupy multiple pages at the same time. | |||
if (!penalty.hasActiveVariant()) { | |||
penalty.setActiveVariant(var); | |||
} | |||
} |
@@ -46,7 +46,7 @@ public class WhitespaceManagementPenalty extends KnuthPenalty { | |||
return new KnuthPenalty(width, 0, false, null, false); | |||
} | |||
public WhitespaceManagementPenalty getBestFitPenalty() { | |||
public WhitespaceManagementPenalty getWhitespaceManagementPenalty() { | |||
return WhitespaceManagementPenalty.this; | |||
} | |||
@@ -69,7 +69,7 @@ public class WhitespaceManagementPenalty extends KnuthPenalty { | |||
whitespaceManagementPosition.setKnuthList(bestVariant.knuthList); | |||
} | |||
public boolean isActivated() { | |||
public boolean hasActiveVariant() { | |||
return whitespaceManagementPosition.getKnuthList() != null; | |||
} | |||
@@ -0,0 +1,61 @@ | |||
<?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. | |||
--> | |||
<testcase> | |||
<info> | |||
<p> | |||
Test standard fo:multi-switch. | |||
</p> | |||
</info> | |||
<fo> | |||
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:fox="http://xmlgraphics.apache.org/fop/extensions"> | |||
<fo:layout-master-set> | |||
<fo:simple-page-master master-name="page" page-width="300pt" page-height="200pt" margin="10pt"> | |||
<fo:region-body/> | |||
</fo:simple-page-master> | |||
</fo:layout-master-set> | |||
<fo:page-sequence master-reference="page"> | |||
<fo:flow flow-name="xsl-region-body"> | |||
<fo:block>Block 1</fo:block> | |||
<fo:multi-switch> | |||
<fo:multi-case> | |||
<fo:block>MS1 multi-case</fo:block> | |||
</fo:multi-case> | |||
</fo:multi-switch> | |||
<fo:block>Block 2</fo:block> | |||
<fo:multi-switch> | |||
<fo:multi-case> | |||
<fo:block>MS2 multi-case 1</fo:block> | |||
</fo:multi-case> | |||
<fo:multi-case> | |||
<fo:block>MS2 multi-case 2</fo:block> | |||
</fo:multi-case> | |||
</fo:multi-switch> | |||
</fo:flow> | |||
</fo:page-sequence> | |||
</fo:root> | |||
</fo> | |||
<checks> | |||
<eval expected="1" xpath="count(//pageSequence[1]/pageViewport)"/> | |||
<eval expected="4" xpath="count(//pageSequence[1]/pageViewport[1]//flow/block)"/> | |||
<eval expected="Block 1" xpath="//pageSequence[1]/pageViewport[1]//flow/block[1]"/> | |||
<eval expected="MS1 multi-case" xpath="//pageSequence[1]/pageViewport[1]//flow/block[2]"/> | |||
<eval expected="Block 2" xpath="//pageSequence[1]/pageViewport[1]//flow/block[3]"/> | |||
<eval expected="MS2 multi-case 1" xpath="//pageSequence[1]/pageViewport[1]//flow/block[4]"/> | |||
</checks> | |||
</testcase> |
@@ -0,0 +1,67 @@ | |||
<?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. | |||
--> | |||
<testcase> | |||
<info> | |||
<p> | |||
Test forced page breaks. | |||
</p> | |||
</info> | |||
<fo> | |||
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:fox="http://xmlgraphics.apache.org/fop/extensions"> | |||
<fo:layout-master-set> | |||
<fo:simple-page-master master-name="page" page-width="300pt" page-height="200pt" margin="10pt"> | |||
<fo:region-body/> | |||
</fo:simple-page-master> | |||
</fo:layout-master-set> | |||
<fo:page-sequence master-reference="page"> | |||
<fo:flow flow-name="xsl-region-body"> | |||
<fo:block break-after="page"> | |||
Block 1 page 1 | |||
<fo:multi-switch fox:auto-toggle="best-fit"> | |||
<fo:multi-case> | |||
<fo:block>MS1 Variant 1</fo:block> | |||
</fo:multi-case> | |||
</fo:multi-switch> | |||
</fo:block> | |||
<fo:multi-switch fox:auto-toggle="best-fit"> | |||
<fo:multi-case> | |||
<fo:block>MS2 Variant 1</fo:block> | |||
</fo:multi-case> | |||
</fo:multi-switch> | |||
<fo:block break-before="page"> | |||
Block 2 page 3 | |||
<fo:multi-switch fox:auto-toggle="best-fit"> | |||
<fo:multi-case> | |||
<fo:block>MS3 Variant 1</fo:block> | |||
</fo:multi-case> | |||
</fo:multi-switch> | |||
</fo:block> | |||
</fo:flow> | |||
</fo:page-sequence> | |||
</fo:root> | |||
</fo> | |||
<checks> | |||
<eval expected="3" xpath="count(//pageSequence[1]/pageViewport)"/> | |||
<eval expected="Block 1 page 1" xpath="//pageSequence[1]/pageViewport[1]//flow/block[1]/lineArea[1]"/> | |||
<eval expected="MS1 Variant 1" xpath="//pageSequence[1]/pageViewport[1]//flow/block[1]/block[1]"/> | |||
<eval expected="MS2 Variant 1" xpath="//pageSequence[1]/pageViewport[2]//flow/block[1]"/> | |||
<eval expected="Block 2 page 3" xpath="//pageSequence[1]/pageViewport[3]//flow/block[1]/lineArea[1]"/> | |||
<eval expected="MS3 Variant 1" xpath="//pageSequence[1]/pageViewport[3]//flow/block[1]/block[1]"/> | |||
</checks> | |||
</testcase> |
@@ -0,0 +1,70 @@ | |||
<?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. | |||
--> | |||
<testcase> | |||
<info> | |||
<p> | |||
Test padding properties. | |||
</p> | |||
</info> | |||
<fo> | |||
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:fox="http://xmlgraphics.apache.org/fop/extensions"> | |||
<fo:layout-master-set> | |||
<fo:simple-page-master master-name="page" page-width="300pt" page-height="200pt" margin="10pt"> | |||
<fo:region-body/> | |||
</fo:simple-page-master> | |||
</fo:layout-master-set> | |||
<fo:page-sequence master-reference="page"> | |||
<fo:flow flow-name="xsl-region-body"> | |||
<fo:multi-switch fox:auto-toggle="best-fit"> | |||
<fo:multi-case> | |||
<fo:block padding="10pt">MS1 Variant 1</fo:block> | |||
</fo:multi-case> | |||
</fo:multi-switch> | |||
<fo:multi-switch fox:auto-toggle="best-fit"> | |||
<fo:multi-case> | |||
<fo:block padding-before="10pt" padding-after="10pt">MS2 Variant 1</fo:block> | |||
</fo:multi-case> | |||
</fo:multi-switch> | |||
<fo:multi-switch fox:auto-toggle="best-fit"> | |||
<fo:multi-case> | |||
<fo:block> | |||
<fo:inline padding-start="10pt" padding-end="10pt">MS3 Variant 1</fo:inline> | |||
</fo:block> | |||
</fo:multi-case> | |||
</fo:multi-switch> | |||
</fo:flow> | |||
</fo:page-sequence> | |||
</fo:root> | |||
</fo> | |||
<checks> | |||
<eval expected="MS1 Variant 1" xpath="//block[1]"/> | |||
<eval expected="10000" xpath="//block[1]/@padding-start"/> | |||
<eval expected="10000" xpath="//block[1]/@padding-end"/> | |||
<eval expected="10000" xpath="//block[1]/@padding-before"/> | |||
<eval expected="10000" xpath="//block[1]/@padding-after"/> | |||
<eval expected="MS2 Variant 1" xpath="//block[2]"/> | |||
<eval expected="10000" xpath="//block[2]/@padding-before"/> | |||
<eval expected="10000" xpath="//block[2]/@padding-after"/> | |||
<eval expected="MS3 Variant 1" xpath="//block[3]/lineArea[1]"/> | |||
<eval expected="10000" xpath="//block[3]/lineArea[1]/inlineparent/@padding-start"/> | |||
<eval expected="10000" xpath="//block[3]/lineArea[1]/inlineparent/@padding-end"/> | |||
</checks> | |||
</testcase> |