Browse Source

Bugfix: padding-top and padding-bottom on list-items could lead to wrong page break decisions and thus to overlapping text.

Bugfix: break-before and break-after were ignored on list-items.


git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@376226 13f79535-47bb-0310-9956-ffa450edef68
pull/16/head
Jeremias Maerki 18 years ago
parent
commit
af7689b522

+ 15
- 15
src/java/org/apache/fop/layoutmgr/BlockStackingLayoutManager.java View File

/* /*
* Copyright 1999-2005 The Apache Software Foundation.
* Copyright 1999-2006 The Apache Software Foundation.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
contentList.addAll(returnedList); contentList.addAll(returnedList);
if (((ListElement) returnedList.getLast()).isForcedBreak()) { if (((ListElement) returnedList.getLast()).isForcedBreak()) {
// a descendant of this block has break-after // a descendant of this block has break-after
if (curLM.isFinished()) {
// there is no other content in this block;
// it's useless to add space after before a page break
setFinished(true);
}


/* extension: conversione di tutta la sequenza fin'ora ottenuta */ /* extension: conversione di tutta la sequenza fin'ora ottenuta */
if (bpUnit > 0) { if (bpUnit > 0) {


return returnList; return returnList;
} }
/*
if (allocatedSpace.min > context.getStackLimit().max) {
log.debug("Allocated space exceeds stack limit, returning early.");
return returnList;
}*/
} }
// propagate and clear // propagate and clear
context.setFlags(LayoutContext.KEEP_WITH_NEXT_PENDING, childLC.isKeepWithNextPending()); context.setFlags(LayoutContext.KEEP_WITH_NEXT_PENDING, childLC.isKeepWithNextPending());
/** /**
* Creates Knuth elements for before border padding and adds them to the return list. * Creates Knuth elements for before border padding and adds them to the return list.
* @param returnList return list to add the additional elements to * @param returnList return list to add the additional elements to
* @param isFirst true if this is the first time a layout manager instance needs to generate
* border and padding
*/ */
protected void addKnuthElementsForBorderPaddingBefore(LinkedList returnList, boolean isFirst) { protected void addKnuthElementsForBorderPaddingBefore(LinkedList returnList, boolean isFirst) {
//Border and Padding (before) //Border and Padding (before)
/** /**
* Creates Knuth elements for after border padding and adds them to the return list. * Creates Knuth elements for after border padding and adds them to the return list.
* @param returnList return list to add the additional elements to * @param returnList return list to add the additional elements to
* @param isLast true if this is the last time a layout manager instance needs to generate
* border and padding
*/ */
protected void addKnuthElementsForBorderPaddingAfter(LinkedList returnList, boolean isLast) { protected void addKnuthElementsForBorderPaddingAfter(LinkedList returnList, boolean isLast) {
//Border and Padding (after) //Border and Padding (after)
/** /**
* Creates Knuth elements for break-before and adds them to the return list. * Creates Knuth elements for break-before and adds them to the return list.
* @param returnList return list to add the additional elements to * @param returnList return list to add the additional elements to
* @param context the layout context
* @return true if an element has been added due to a break-before. * @return true if an element has been added due to a break-before.
*/ */
protected boolean addKnuthElementsForBreakBefore(LinkedList returnList, protected boolean addKnuthElementsForBreakBefore(LinkedList returnList,
breakBefore = ((org.apache.fop.fo.flow.Block) fobj).getBreakBefore(); breakBefore = ((org.apache.fop.fo.flow.Block) fobj).getBreakBefore();
} else if (fobj instanceof org.apache.fop.fo.flow.BlockContainer) { } else if (fobj instanceof org.apache.fop.fo.flow.BlockContainer) {
breakBefore = ((org.apache.fop.fo.flow.BlockContainer) fobj).getBreakBefore(); breakBefore = ((org.apache.fop.fo.flow.BlockContainer) fobj).getBreakBefore();
} else if (fobj instanceof org.apache.fop.fo.flow.ListBlock) {
breakBefore = ((org.apache.fop.fo.flow.ListBlock) fobj).getBreakBefore();
} else if (fobj instanceof org.apache.fop.fo.flow.ListItem) {
breakBefore = ((org.apache.fop.fo.flow.ListItem) fobj).getBreakBefore();
} else if (fobj instanceof org.apache.fop.fo.flow.Table) { } else if (fobj instanceof org.apache.fop.fo.flow.Table) {
breakBefore = ((org.apache.fop.fo.flow.Table) fobj).getBreakBefore(); breakBefore = ((org.apache.fop.fo.flow.Table) fobj).getBreakBefore();
} }
// return a penalty element, representing a forced page break // return a penalty element, representing a forced page break
returnList.add(new BreakElement(getAuxiliaryPosition(), returnList.add(new BreakElement(getAuxiliaryPosition(),
0, -KnuthElement.INFINITE, breakBefore, context)); 0, -KnuthElement.INFINITE, breakBefore, context));
//returnList.add(new KnuthPenalty(0, -KnuthElement.INFINITE, false,
// breakBefore, getAuxiliaryPosition(), false));
return true; return true;
} else { } else {
return false; return false;
/** /**
* Creates Knuth elements for break-after and adds them to the return list. * Creates Knuth elements for break-after and adds them to the return list.
* @param returnList return list to add the additional elements to * @param returnList return list to add the additional elements to
* @param context the layout context
* @return true if an element has been added due to a break-after. * @return true if an element has been added due to a break-after.
*/ */
protected boolean addKnuthElementsForBreakAfter(LinkedList returnList, protected boolean addKnuthElementsForBreakAfter(LinkedList returnList,
breakAfter = ((org.apache.fop.fo.flow.Block) fobj).getBreakAfter(); breakAfter = ((org.apache.fop.fo.flow.Block) fobj).getBreakAfter();
} else if (fobj instanceof org.apache.fop.fo.flow.BlockContainer) { } else if (fobj instanceof org.apache.fop.fo.flow.BlockContainer) {
breakAfter = ((org.apache.fop.fo.flow.BlockContainer) fobj).getBreakAfter(); breakAfter = ((org.apache.fop.fo.flow.BlockContainer) fobj).getBreakAfter();
} else if (fobj instanceof org.apache.fop.fo.flow.ListBlock) {
breakAfter = ((org.apache.fop.fo.flow.ListBlock) fobj).getBreakAfter();
} else if (fobj instanceof org.apache.fop.fo.flow.ListItem) {
breakAfter = ((org.apache.fop.fo.flow.ListItem) fobj).getBreakAfter();
} else if (fobj instanceof org.apache.fop.fo.flow.Table) { } else if (fobj instanceof org.apache.fop.fo.flow.Table) {
breakAfter = ((org.apache.fop.fo.flow.Table) fobj).getBreakAfter(); breakAfter = ((org.apache.fop.fo.flow.Table) fobj).getBreakAfter();
} }
// add a penalty element, representing a forced page break // add a penalty element, representing a forced page break
returnList.add(new BreakElement(getAuxiliaryPosition(), returnList.add(new BreakElement(getAuxiliaryPosition(),
0, -KnuthElement.INFINITE, breakAfter, context)); 0, -KnuthElement.INFINITE, breakAfter, context));
//returnList.add(new KnuthPenalty(0, -KnuthElement.INFINITE, false,
// breakAfter, getAuxiliaryPosition(), false));
return true; return true;
} else { } else {
return false; return false;

+ 15
- 0
src/java/org/apache/fop/layoutmgr/list/ListItemLayoutManager.java View File

LinkedList returnList = new LinkedList(); LinkedList returnList = new LinkedList();
if (!breakBeforeServed) {
try {
if (addKnuthElementsForBreakBefore(returnList, context)) {
return returnList;
}
} finally {
breakBeforeServed = true;
}
}

addKnuthElementsForSpaceBefore(returnList, alignment); addKnuthElementsForSpaceBefore(returnList, alignment);
addKnuthElementsForBorderPaddingBefore(returnList, !firstVisibleMarkServed);
firstVisibleMarkServed = true;

//Spaces, border and padding to be repeated at each break //Spaces, border and padding to be repeated at each break
addPendingMarks(context); addPendingMarks(context);


// "wrap" the Position inside each element // "wrap" the Position inside each element
wrapPositionElements(returnedList, returnList, true); wrapPositionElements(returnedList, returnList, true);
addKnuthElementsForBorderPaddingAfter(returnList, true);
addKnuthElementsForSpaceAfter(returnList, alignment); addKnuthElementsForSpaceAfter(returnList, alignment);
addKnuthElementsForBreakAfter(returnList, context);


if (keepWithNextPendingOnLabel || keepWithNextPendingOnBody || mustKeepWithNext()) { if (keepWithNextPendingOnLabel || keepWithNextPendingOnBody || mustKeepWithNext()) {
context.setFlags(LayoutContext.KEEP_WITH_NEXT_PENDING); context.setFlags(LayoutContext.KEEP_WITH_NEXT_PENDING);

+ 7
- 0
status.xml View File



<changes> <changes>
<release version="FOP Trunk"> <release version="FOP Trunk">
<action context="Code" dev="JM" type="fix">
Bugfix: padding-top and padding-bottom on list-items could lead to wrong page
break decisions and thus to overlapping text.
</action>
<action context="Code" dev="JM" type="fix">
Bugfix: break-before and break-after were ignored on list-items.
</action>
<action context="Code" dev="LF" type="fix" fixes-bug="38507"> <action context="Code" dev="LF" type="fix" fixes-bug="38507">
Bugfix: The elements representing a non-breaking space weren't always correct. Bugfix: The elements representing a non-breaking space weren't always correct.
</action> </action>

+ 83
- 0
test/layoutengine/standard-testcases/list-item_break-before_break-after.xml View File

<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright 2006 The Apache Software Foundation

Licensed 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 element list generation with breaks on list-items.
</p>
</info>
<fo>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master master-name="normal" page-width="5in" page-height="5in">
<fo:region-body/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="normal">
<fo:flow flow-name="xsl-region-body">
<fo:list-block provisional-distance-between-starts="1in" provisional-label-separation="0.1in">
<fo:list-item background-color="yellow" break-after="page">
<fo:list-item-label end-indent="label-end()">
<fo:block>label 1</fo:block>
</fo:list-item-label>
<fo:list-item-body start-indent="body-start()">
<fo:block>
body 1: We'll break after this yellow list item.
</fo:block>
</fo:list-item-body>
</fo:list-item>
<fo:list-item>
<fo:list-item-label end-indent="label-end()">
<fo:block>label 2</fo:block>
</fo:list-item-label>
<fo:list-item-body start-indent="body-start()">
<fo:block>
body 2: This is just a boring list item.
</fo:block>
</fo:list-item-body>
</fo:list-item>
<fo:list-item background-color="orange" break-before="page">
<fo:list-item-label end-indent="label-end()">
<fo:block>label 3</fo:block>
</fo:list-item-label>
<fo:list-item-body start-indent="body-start()">
<fo:block>
body 3: We had a break before this orange list item.
</fo:block>
</fo:list-item-body>
</fo:list-item>
</fo:list-block>
</fo:flow>
</fo:page-sequence>
</fo:root>
</fo>
<checks>
<element-list category="breaker" index="0">
<box w="14400"/>
<skip>3</skip>
</element-list>
<element-list category="breaker" index="1">
<box w="14400"/>
<skip>3</skip>
</element-list>
<element-list category="breaker" index="2">
<box w="14400"/>
<skip>3</skip>
</element-list>
</checks>
</testcase>

+ 82
- 0
test/layoutengine/standard-testcases/list-item_padding.xml View File

<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright 2006 The Apache Software Foundation

Licensed 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 element list generation with padding in lists (list-item).
</p>
</info>
<fo>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master master-name="normal" page-width="5in" page-height="5in">
<fo:region-body/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="normal">
<fo:flow flow-name="xsl-region-body">
<fo:list-block provisional-distance-between-starts="1in" provisional-label-separation="0.1in">
<fo:list-item padding-top="5pt" padding-bottom="8pt" background-color="yellow">
<fo:list-item-label end-indent="label-end()">
<fo:block>label 1</fo:block>
</fo:list-item-label>
<fo:list-item-body start-indent="body-start()">
<fo:block>
body 1: We should have 5pt padding-before and 8pt padding-after for this yellow list item.
</fo:block>
</fo:list-item-body>
</fo:list-item>
<fo:list-item padding-top="5pt" padding-bottom="8pt">
<fo:list-item-label end-indent="label-end()">
<fo:block>label 2</fo:block>
</fo:list-item-label>
<fo:list-item-body start-indent="body-start()">
<fo:block>
body 2: We should have 5pt padding-before and 8pt padding-after for this list item.
</fo:block>
</fo:list-item-body>
</fo:list-item>
</fo:list-block>
</fo:flow>
</fo:page-sequence>
</fo:root>
</fo>
<checks>
<element-list category="breaker">
<box w="0"/> <!-- Starting SpaceHandlingPosition -->
<penalty w="0" p="INF"/>
<glue w="5000" y="0" z="0"/>
<box w="28800"/>
<penalty w="0" p="INF"/>
<glue w="8000" y="0" z="0"/>
<penalty w="0" p="0"/>
<box w="0"/>
<penalty w="0" p="INF"/>
<glue w="5000" y="0" z="0"/>
<box w="28800"/>
<box w="0"/> <!-- SpaceHandlingPosition -->
<penalty w="0" p="INF"/>
<glue w="8000" y="0" z="0"/>
<box w="0"/>
<skip>3</skip>
</element-list>
</checks>
</testcase>

Loading…
Cancel
Save