Browse Source

By default, only the first child of a multi-switch should be laid out

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-ffa450edef68
tags/fop-2_0
Vincent Hennebert 10 years ago
parent
commit
b376802095

+ 8
- 11
src/java/org/apache/fop/layoutmgr/MultiSwitchLayoutManager.java View File

@@ -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;

+ 4
- 4
src/java/org/apache/fop/layoutmgr/PageBreakingAlgorithm.java View File

@@ -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);
}
}

+ 2
- 2
src/java/org/apache/fop/layoutmgr/WhitespaceManagementPenalty.java View File

@@ -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;
}


+ 61
- 0
test/layoutengine/standard-testcases/multi-switch_basic.xml View File

@@ -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>

+ 67
- 0
test/layoutengine/standard-testcases/multi-switch_best-fit_forced_page_break.xml View File

@@ -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>

+ 70
- 0
test/layoutengine/standard-testcases/multi-switch_best-fit_padding.xml View File

@@ -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>

Loading…
Cancel
Save