diff options
Diffstat (limited to 'src/java/org/apache')
-rw-r--r-- | src/java/org/apache/fop/layoutmgr/table/TableStepper.java | 115 |
1 files changed, 56 insertions, 59 deletions
diff --git a/src/java/org/apache/fop/layoutmgr/table/TableStepper.java b/src/java/org/apache/fop/layoutmgr/table/TableStepper.java index a7fd10d0d..59228ce00 100644 --- a/src/java/org/apache/fop/layoutmgr/table/TableStepper.java +++ b/src/java/org/apache/fop/layoutmgr/table/TableStepper.java @@ -55,8 +55,9 @@ public class TableStepper { * current one. */ private int width; - private int backupWidth; private int baseWidth; + private int totalLength; + private int includedLength; private int borderBefore; private int borderAfter; private int paddingBefore; @@ -93,9 +94,12 @@ public class TableStepper { // log.trace("column " + (column+1) + ": recording " + elementLists.size() + " element(s)"); // } } + totalLength = ElementListUtils.calcContentLength(elementList); if (pgu.getTable().isSeparateBorderModel()) { - borderBefore = pgu.getBorders().getBorderBeforeWidth(false) + tableLM.getHalfBorderSeparationBPD(); - borderAfter = pgu.getBorders().getBorderAfterWidth(false) + tableLM.getHalfBorderSeparationBPD(); + borderBefore = pgu.getBorders().getBorderBeforeWidth(false) + + tableLM.getHalfBorderSeparationBPD(); + borderAfter = pgu.getBorders().getBorderAfterWidth(false) + + tableLM.getHalfBorderSeparationBPD(); } else { borderBefore = pgu.getHalfMaxBeforeBorderWidth(); borderAfter = pgu.getHalfMaxAfterBorderWidth(); @@ -104,17 +108,19 @@ public class TableStepper { paddingAfter = pgu.getBorders().getPaddingAfter(false, pgu.getCellLM()); start = 0; end = -1; - width = 0; startRow = rowIndex; keepWithNextSignal = false; computeBaseWidth(rowGroup); + goToNextLegalBreak(); } private void computeBaseWidth(EffRow[] rowGroup) { - baseWidth = 0; + width = 0; + includedLength = 0; for (int prevRow = 0; prevRow < startRow; prevRow++) { - baseWidth += rowGroup[prevRow].getHeight().opt; + width += rowGroup[prevRow].getHeight().opt; } + baseWidth = width; } private boolean endsOnRow(int rowIndex) { @@ -122,29 +128,17 @@ public class TableStepper { } int getRemainingHeight(int activeRowIndex, EffRow[] rowGroup) { - if (end == elementList.size() - 1) { - return 0; - } if (!endsOnRow(activeRowIndex)) { return 0; + } else if (includedLength == totalLength) { + return 0; + } else { + return totalLength - includedLength + + borderBefore + borderAfter + paddingBefore + paddingAfter; } - int len = width; - if (len > 0) { - len += borderBefore + borderAfter; - len += paddingBefore + paddingAfter; - } - int nominalHeight = 0; - for (int r = startRow; r < startRow + pgu.getCell().getNumberRowsSpanned(); r++) { - nominalHeight += rowGroup[r].getHeight().opt; - } - return nominalHeight - len; } - void backupWidth() { - backupWidth = width; - } - - int getNextStep() { + private void goToNextLegalBreak() { lastPenaltyLength = 0; while (end + 1 < elementList.size()) { end++; @@ -168,34 +162,51 @@ public class TableStepper { width += el.getW(); } } - if (end < start) { -// if (log.isTraceEnabled()) { -// log.trace("column " + (i + 1) + ": (end=" + end + ") < (start=" + start -// + ") => resetting width to backupWidth"); -// } - width = backupWidth; - return 0; + } + + int getNextStep() { + if (!includedInLastStep()) { + return width + borderBefore + borderAfter + paddingBefore + paddingAfter; } else { - return baseWidth + width + borderBefore + borderAfter + paddingBefore - + paddingAfter; + start = end + 1; + if (end < elementList.size() - 1) { + + goToNextLegalBreak(); + return width + borderBefore + borderAfter + paddingBefore + paddingAfter; + } else { + return 0; + } } } + private boolean includedInLastStep() { + return includedLength == width; + } + boolean signalMinStep(int minStep) { - int len = baseWidth + width + borderBefore + borderAfter + paddingBefore + paddingAfter; - if (len > minStep) { - width = backupWidth; - end = start - 1; - return baseWidth + borderBefore + borderAfter + paddingBefore - + paddingAfter + width > minStep; - } else { + if (width + borderBefore + borderAfter + paddingBefore + paddingAfter <= minStep) { + includedLength = width; return false; + } else { + return baseWidth + borderBefore + borderAfter + paddingBefore + paddingAfter > minStep; } } + boolean contributesContent() { + return includedInLastStep() && end >= start; + } + + boolean hasStarted() { + return includedLength > 0; + } + int getLastPenaltyLength() { return lastPenaltyLength; } + + boolean isFinished() { + return includedInLastStep() && (end == elementList.size() - 1); + } } /** Logger **/ private static Log log = LogFactory.getLog(TableStepper.class); @@ -330,7 +341,7 @@ public class TableStepper { List gridUnitParts = new java.util.ArrayList(maxColumnCount); for (Iterator iter = activeCells.iterator(); iter.hasNext();) { ActiveCell activeCell = (ActiveCell) iter.next(); - if (activeCell.end >= activeCell.start) { + if (activeCell.contributesContent()) { PrimaryGridUnit pgu = activeCell.pgu; if (activeCell.start == 0 && activeCell.end == 0 && activeCell.elementList.size() == 1 @@ -414,9 +425,7 @@ public class TableStepper { signalKeepWithNext = false; for (Iterator iter = activeCells.iterator(); iter.hasNext();) { ActiveCell activeCell = (ActiveCell) iter.next(); - if (activeCell.start == 0 && activeCell.end < 0 && activeCell.elementList != null) { - allCellsHaveContributed = false; - } + allCellsHaveContributed &= activeCell.hasStarted(); signalKeepWithNext |= activeCell.keepWithNextSignal; } if (!allCellsHaveContributed) { @@ -476,10 +485,6 @@ public class TableStepper { return -1; }*/ - for (Iterator iter = activeCells.iterator(); iter.hasNext();) { - ((ActiveCell) iter.next()).backupWidth(); - } - //set starting points goToNextRowIfCurrentFinished(); @@ -536,20 +541,12 @@ public class TableStepper { private void goToNextRowIfCurrentFinished() { // We assume that the current grid row is finished. If this is not the case this - // boolean will be reset (see below) + // boolean will be reset boolean currentGridRowFinished = true; for (Iterator iter = activeCells.iterator(); iter.hasNext();) { ActiveCell activeCell = (ActiveCell) iter.next(); - if (activeCell.end < activeCell.elementList.size()) { - activeCell.start = activeCell.end + 1; - if (activeCell.end + 1 < activeCell.elementList.size() - && activeCell.endsOnRow(activeRowIndex)) { - // Ok, so this grid unit is the last in the row-spanning direction and - // there are still unhandled Knuth elements. They /will/ have to be - // put on the current grid row, which means that this row isn't - // finished yet - currentGridRowFinished = false; - } + if (activeCell.endsOnRow(activeRowIndex)) { + currentGridRowFinished &= activeCell.isFinished(); } } |