import org.apache.commons.logging.LogFactory;
import org.apache.fop.fo.Constants;
import org.apache.fop.fo.flow.TableRow;
-import org.apache.fop.fo.properties.CommonBorderPaddingBackground;
import org.apache.fop.layoutmgr.BreakElement;
import org.apache.fop.layoutmgr.ElementListUtils;
import org.apache.fop.layoutmgr.KnuthBox;
private int[] borderAfter;
private int[] paddingAfter;
private boolean rowBacktrackForLastStep;
+ private boolean skippedStep;
private boolean[] keepWithNextSignals;
private boolean[] forcedBreaks;
if (signalKeepWithNext || getTableLM().mustKeepTogether()) {
p = KnuthPenalty.INFINITE;
}
+ if (skippedStep) {
+ p = KnuthPenalty.INFINITE;
+ //Need to avoid breaking because borders and/or paddding from other columns would
+ //not fit in the available space (see getNextStep())
+ }
if (isBreakCondition()) {
+ if (skippedStep) {
+ log.error("This is a conflict situation. The output may be wrong."
+ + " Please send your FO file to fop-dev@xmlgraphics.apache.org!");
+ }
p = -KnuthPenalty.INFINITE; //Overrides any keeps (see 4.8 in XSL 1.0)
clearBreakCondition();
}
minStep = Math.min(len, minStep);
}
}
- log.debug("candidate steps: " + sb);
+ if (log.isDebugEnabled()) {
+ log.debug("candidate steps: " + sb + " lastStep=" + lastStep);
+ }
//Check for constellations that would result in overlapping borders
/*
}*/
//Reset bigger-than-minimum sequences
+ //See http://people.apache.org/~jeremias/fop/NextStepAlgoNotes.pdf
rowBacktrackForLastStep = false;
+ skippedStep = false;
for (int i = 0; i < widths.length; i++) {
int len = baseWidth[i] + widths[i];
if (len > minStep) {
widths[i] = backupWidths[i];
end[i] = start[i] - 1;
if (baseWidth[i] + widths[i] > minStep) {
- log.debug("Meeeeep!");
- rowBacktrackForLastStep = true;
+ log.debug("minStep vs. border/padding increase conflict:");
+ if (activeRow == 0) {
+ log.debug(" First row. Skip this step.");
+ skippedStep = true;
+ } else {
+ log.debug(" row-span situation: backtracking to last row");
+ //Stay on the previous row for another step because borders and padding on
+ //columns may make their contribution to the step bigger than the addition
+ //of the next element for this step would make the step to grow.
+ rowBacktrackForLastStep = true;
+ }
}
}
}
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2005 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 <a href="http://issues.apache.org/bugzilla/show_bug.cgi?id=36403">Bugzilla issue 36403</a>.
+ </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" id="skipped-step">
+ <fo:flow flow-name="xsl-region-body">
+ <fo:table table-layout="fixed" width="100%" border-collapse="separate">
+ <fo:table-column column-number="1"/>
+ <fo:table-column column-number="2"/>
+ <fo:table-body>
+ <fo:table-row>
+ <fo:table-cell>
+ <fo:block>Row 1 Col 1</fo:block>
+ </fo:table-cell>
+ <fo:table-cell border="solid 18pt" background-color="yellow">
+ <fo:block>Row 1 Col 3</fo:block>
+ </fo:table-cell>
+ </fo:table-row>
+ </fo:table-body>
+ </fo:table>
+ </fo:flow>
+ </fo:page-sequence>
+ <fo:page-sequence master-reference="normal" id="backtrack">
+ <fo:flow flow-name="xsl-region-body">
+ <!-- This situation is similar to the one on http://wiki.apache.org/xmlgraphics-fop/TableLayout/KnuthElementsForTables/RowBorder2
+ where the algorithm has to backtrack to the previous row. This is simply to verify that the change necessary because
+ of the above test case doesn't break the row backtracking that was already in place. -->
+ <fo:table table-layout="fixed" width="100%" border-collapse="separate">
+ <fo:table-column column-number="1"/>
+ <fo:table-column column-number="2"/>
+ <fo:table-body>
+ <fo:table-row>
+ <fo:table-cell number-rows-spanned="2" font-size="10pt" line-height="10pt">
+ <fo:block>Cell 1/1</fo:block>
+ <fo:block>Cell 1/2</fo:block>
+ <fo:block>Cell 1/3</fo:block>
+ </fo:table-cell>
+ <fo:table-cell border="solid 2pt" background-color="yellow">
+ <fo:block>Cell 2</fo:block>
+ </fo:table-cell>
+ </fo:table-row>
+ <fo:table-row>
+ <fo:table-cell border="solid 5pt" background-color="orange">
+ <fo:block>Cell 3</fo:block>
+ </fo:table-cell>
+ </fo:table-row>
+ </fo:table-body>
+ </fo:table>
+ </fo:flow>
+ </fo:page-sequence>
+ </fo:root>
+ </fo>
+ <checks>
+ <element-list category="breaker" id="skipped-step">
+ <box w="0"/>
+ <penalty w="14400" p="INF"/> <!-- Skipped step has an INFINITE penalty -->
+ <box w="50400"/>
+ <skip>3</skip>
+ </element-list>
+ <element-list category="breaker" id="backtrack">
+ <box w="0"/>
+ <penalty w="10000"/> <!-- p > 0 && p <= INF -->
+ <box w="18400"/>
+ <penalty w="0" p="0"/>
+ <box w="0"/>
+ <penalty w="1600"/> <!-- p = ??? --> <!-- I'm not sure here what the penalty values should be for these two. -->
+ <box w="0"/>
+ <penalty w="11600"/> <!-- p = ??? -->
+ <box w="24400"/>
+ <skip>3</skip>
+ </element-list>
+ </checks>
+</testcase>