diff options
-rw-r--r-- | src/java/org/apache/fop/layoutmgr/table/TableStepper.java | 22 | ||||
-rw-r--r-- | test/layoutengine/standard-testcases/table-cell_block_break-after.xml | 82 |
2 files changed, 88 insertions, 16 deletions
diff --git a/src/java/org/apache/fop/layoutmgr/table/TableStepper.java b/src/java/org/apache/fop/layoutmgr/table/TableStepper.java index 20b80c1bd..2c676ae0b 100644 --- a/src/java/org/apache/fop/layoutmgr/table/TableStepper.java +++ b/src/java/org/apache/fop/layoutmgr/table/TableStepper.java @@ -85,7 +85,6 @@ public class TableStepper { private boolean rowBacktrackForLastStep; private boolean skippedStep; private boolean[] keepWithNextSignals; - private boolean forcedBreak; private int lastMaxPenaltyLength; /** @@ -117,15 +116,7 @@ public class TableStepper { keepWithNextSignals = new boolean[columnCount]; Arrays.fill(end, -1); } - - private void clearBreakCondition() { - forcedBreak = false; - } - - private boolean isBreakCondition() { - return forcedBreak; - } - + /** * Returns the row currently being processed. * @@ -307,6 +298,7 @@ public class TableStepper { int boxLen = step - addedBoxLen - penaltyLen; addedBoxLen += boxLen; + boolean forcedBreak = false; //Put all involved grid units into a list List gridUnitParts = new java.util.ArrayList(maxColumnCount); for (int i = 0; i < columnCount; i++) { @@ -320,6 +312,9 @@ public class TableStepper { 0, pgu.getElements().size() - 1)); } else { gridUnitParts.add(new GridUnitPart(pgu, start[i], end[i])); + if (((KnuthElement)elementLists[i].get(end[i])).isForcedBreak()) { + forcedBreak = true; + } } if (end[i] + 1 == elementLists[i].size()) { if (pgu.getFlag(GridUnit.KEEP_WITH_NEXT_PENDING)) { @@ -408,13 +403,12 @@ public class TableStepper { //Need to avoid breaking because borders and/or paddding from other columns would //not fit in the available space (see getNextStep()) } - if (isBreakCondition()) { + if (forcedBreak) { 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(); } returnList.add(new BreakElement(penaltyPos, effPenaltyLen, p, -1, context)); @@ -436,9 +430,6 @@ public class TableStepper { //we have to signal the still pending last keep-with-next using the LayoutContext. context.setFlags(LayoutContext.KEEP_WITH_NEXT_PENDING); } - if (isBreakCondition()) { - ((BreakElement)returnList.getLast()).setPenaltyValue(-KnuthPenalty.INFINITE); - } if (lastTCPos != null) { lastTCPos.setFlag(TableContentPosition.LAST_IN_ROWGROUP, true); } @@ -478,7 +469,6 @@ public class TableStepper { this.lastMaxPenaltyLength = Math.max(this.lastMaxPenaltyLength, el.getW()); if (el.getP() <= -KnuthElement.INFINITE) { log.debug("FORCED break encountered!"); - forcedBreak = true; break; } else if (el.getP() < KnuthElement.INFINITE) { //First legal break point diff --git a/test/layoutengine/standard-testcases/table-cell_block_break-after.xml b/test/layoutengine/standard-testcases/table-cell_block_break-after.xml new file mode 100644 index 000000000..df1ed152c --- /dev/null +++ b/test/layoutengine/standard-testcases/table-cell_block_break-after.xml @@ -0,0 +1,82 @@ +<?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. +--> +<!-- $Id$ --> +<testcase> + <info> + <p> + This test checks breaks on tables: breaks inside table-cell content. It ensures that breaks + are taken into account only once. + </p> + </info> + <fo> + <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> + <fo:layout-master-set> + <fo:simple-page-master master-name="page" page-height="8cm" page-width="15cm" + margin-top="1cm" margin-bottom="1cm" margin-left="1cm" margin-right="1cm"> + <fo:region-body/> + </fo:simple-page-master> + </fo:layout-master-set> + <fo:page-sequence master-reference="page" font-family="serif" font-size="14pt"> + <fo:flow flow-name="xsl-region-body"> + <fo:table width="150pt" table-layout="fixed" + border-collapse="separate" border="2pt solid black"> + <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/> + <fo:table-body> + <fo:table-row> + <fo:table-cell border="4pt solid black"> + <fo:block>Cell 1</fo:block> + <fo:block>Cell 1</fo:block> + <fo:block>Cell 1</fo:block> + </fo:table-cell> + <fo:table-cell border="4pt solid black"> + <fo:block>Cell 2</fo:block> + <fo:block keep-together="always" background-color="yellow"> + <fo:block>Cell 2</fo:block> + <fo:block>Cell 2</fo:block> + <fo:block break-after="page">Cell 2</fo:block> + </fo:block> + <fo:block>Cell 2</fo:block> + </fo:table-cell> + </fo:table-row> + </fo:table-body> + </fo:table> + </fo:flow> + </fo:page-sequence> + </fo:root> + </fo> + <checks> + <eval expected="2" xpath="count(//pageViewport)"/> + <!-- page 1 --> + <!-- 3 blocks in the first cell --> + <eval expected="3" xpath="count(//pageViewport[@nr=1]/page/regionViewport/regionBody/mainReference/span/flow/block[1]/block[1]/block)"/> + <!-- 2 blocks in the second cell --> + <eval expected="2" xpath="count(//pageViewport[@nr=1]/page/regionViewport/regionBody/mainReference/span/flow/block[1]/block[2]/block)"/> + <!-- 3 lines in the second block of the second cell --> + <eval expected="3" xpath="count(//pageViewport[@nr=1]/page/regionViewport/regionBody/mainReference/span/flow/block[1]/block[2]/block[2]//lineArea)"/> + + <!-- page 2 --> + <!-- Nothing in the first cell --> + <eval expected="0" xpath="count(//pageViewport[@nr=2]/page/regionViewport/regionBody/mainReference/span/flow/block[1]/block[1]/block)"/> + <!-- Two blocks expected in the second cell --> + <eval expected="2" xpath="count(//pageViewport[@nr=2]/page/regionViewport/regionBody/mainReference/span/flow/block[1]/block[2]/block)"/> + <!-- First block has zero bpd --> + <eval expected="0" xpath="//pageViewport[@nr=2]/page/regionViewport/regionBody/mainReference/span/flow/block[1]/block[2]/block[1]/@bpd"/> + <!-- One line in the second block --> + <eval expected="1" xpath="count(//pageViewport[@nr=2]/page/regionViewport/regionBody/mainReference/span/flow/block[1]/block[2]/block[2]//lineArea)"/> + </checks> +</testcase> |