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
private class DefaultKnuthListGenerator implements KnuthElementsGenerator { | private class DefaultKnuthListGenerator implements KnuthElementsGenerator { | ||||
public List<ListElement> getKnuthElement(LayoutContext context, int alignment) { | public List<ListElement> getKnuthElement(LayoutContext context, int alignment) { | ||||
List<ListElement> knuthList = new LinkedList<ListElement>(); | 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; | return knuthList; |
KnuthPageNode pageNode = (KnuthPageNode) bestActiveNode; | KnuthPageNode pageNode = (KnuthPageNode) bestActiveNode; | ||||
KnuthPageNode previousPageNode = ((KnuthPageNode) pageNode.previous); | KnuthPageNode previousPageNode = ((KnuthPageNode) pageNode.previous); | ||||
for (Variant var : previousPageNode.pendingVariants) { | 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); | penalty.setActiveVariant(var); | ||||
} | } | ||||
} | } |
return new KnuthPenalty(width, 0, false, null, false); | return new KnuthPenalty(width, 0, false, null, false); | ||||
} | } | ||||
public WhitespaceManagementPenalty getBestFitPenalty() { | |||||
public WhitespaceManagementPenalty getWhitespaceManagementPenalty() { | |||||
return WhitespaceManagementPenalty.this; | return WhitespaceManagementPenalty.this; | ||||
} | } | ||||
whitespaceManagementPosition.setKnuthList(bestVariant.knuthList); | whitespaceManagementPosition.setKnuthList(bestVariant.knuthList); | ||||
} | } | ||||
public boolean isActivated() { | |||||
public boolean hasActiveVariant() { | |||||
return whitespaceManagementPosition.getKnuthList() != null; | return whitespaceManagementPosition.getKnuthList() != 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. | |||||
--> | |||||
<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> |
<?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> |
<?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> |