/** Length of the penalty ending the last step, if any. */
private int lastPenaltyLength;
- ActiveCell(PrimaryGridUnit pgu, EffRow row, int rowIndex, int previousRowsLength, TableLayoutManager tableLM) {
+ ActiveCell(PrimaryGridUnit pgu, EffRow row, int rowIndex, int previousRowsLength,
+ TableLayoutManager tableLM) {
this.pgu = pgu;
boolean makeBoxForWholeRow = false;
if (row.getExplicitHeight().min > 0) {
/**
* Returns the total length up to the next legal break, not yet included in the steps.
*
- * @return the total length up to the next legal break
+ * @return the total length up to the next legal break (-1 signals no further step)
*/
int getNextStep() {
if (!includedInLastStep()) {
- return nextStepLength + lastPenaltyLength + borderBefore + borderAfter + paddingBefore + paddingAfter;
+ return nextStepLength + lastPenaltyLength
+ + borderBefore + borderAfter + paddingBefore + paddingAfter;
} else {
start = end + 1;
if (knuthIter.hasNext()) {
goToNextLegalBreak();
- return nextStepLength + lastPenaltyLength + borderBefore + borderAfter + paddingBefore + paddingAfter;
+ return nextStepLength + lastPenaltyLength
+ + borderBefore + borderAfter + paddingBefore + paddingAfter;
} else {
- return 0;
+ return -1;
}
}
}
* @return
*/
boolean signalMinStep(int minStep) {
- if (nextStepLength + lastPenaltyLength + borderBefore + borderAfter + paddingBefore + paddingAfter <= minStep) {
+ if (nextStepLength + lastPenaltyLength
+ + borderBefore + borderAfter + paddingBefore + paddingAfter <= minStep) {
includedLength = nextStepLength;
computeRemainingLength();
return false;
} else {
- return previousRowsLength + borderBefore + borderAfter + paddingBefore + paddingAfter > minStep;
+ return previousRowsLength + borderBefore
+ + borderAfter + paddingBefore + paddingAfter > minStep;
}
}
import org.apache.fop.area.Trait;
import org.apache.fop.datatypes.PercentBaseContext;
import org.apache.fop.fo.Constants;
-import org.apache.fop.fo.FONode;
import org.apache.fop.fo.FObj;
import org.apache.fop.fo.flow.Table;
import org.apache.fop.fo.flow.TableBody;
import org.apache.fop.fo.flow.TableRow;
-import org.apache.fop.fo.properties.CommonBorderPaddingBackground;
-import org.apache.fop.fo.properties.LengthRangeProperty;
import org.apache.fop.layoutmgr.BreakElement;
-import org.apache.fop.layoutmgr.ElementListObserver;
import org.apache.fop.layoutmgr.ElementListUtils;
import org.apache.fop.layoutmgr.KnuthBox;
-import org.apache.fop.layoutmgr.KnuthElement;
import org.apache.fop.layoutmgr.KnuthPenalty;
import org.apache.fop.layoutmgr.KnuthPossPosIter;
import org.apache.fop.layoutmgr.LayoutContext;
import org.apache.fop.layoutmgr.ListElement;
-import org.apache.fop.layoutmgr.MinOptMaxUtil;
import org.apache.fop.layoutmgr.Position;
import org.apache.fop.layoutmgr.PositionIterator;
import org.apache.fop.layoutmgr.TraitSetter;
import org.apache.fop.layoutmgr.SpaceResolver.SpaceHandlingBreakPosition;
-import org.apache.fop.traits.MinOptMax;
/**
* Layout manager for table contents, particularly managing the creation of combined element lists.
/** @see org.apache.fop.layoutmgr.LayoutManager#getNextKnuthElements(LayoutContext, int) */
public LinkedList getNextKnuthElements(LayoutContext context, int alignment) {
- log.debug("==> Columns: " + getTableLM().getColumns());
+ if (log.isDebugEnabled()) {
+ log.debug("==> Columns: " + getTableLM().getColumns());
+ }
KnuthBox headerAsFirst = null;
KnuthBox headerAsSecondToLast = null;
KnuthBox footerAsLast = null;
}
}
if (returnList.size() > 0) {
- //Remove the last penalty produced by the combining algorithm (see TableStepper), for the last step
+ //Remove the last penalty produced by the combining algorithm (see TableStepper),
+ //for the last step
ListElement last = (ListElement)returnList.getLast();
if (last.isPenalty() || last instanceof BreakElement) {
if (!last.isForcedBreak()) {
for (Iterator iter = activeCells.iterator(); iter.hasNext();) {
ActiveCell activeCell = (ActiveCell) iter.next();
int nextStep = activeCell.getNextStep();
- if (nextStep > 0) {
+ if (nextStep >= 0) {
stepFound = true;
minStep = Math.min(minStep, nextStep);
}
<changes>
<release version="FOP Trunk">
+ <action context="Code" dev="JM" type="fix">
+ Bugfix for NPE with empty table-row (regression from 0.93).
+ </action>
<action context="Code" dev="JM" type="add">
Added a configuration setting to the PCL renderer to disable PJL commands.
</action>
--- /dev/null
+<?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 an empty/minimal table body (caused an NPE in 0.94).
+ </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:table table-layout="fixed">
+ <fo:table-column column-width="proportional-column-width(1)"/>
+ <fo:table-column column-width="proportional-column-width(1)"/>
+ <fo:table-header>
+ <fo:table-row>
+ <fo:table-cell>
+ <fo:block>
+ <fo:inline>Header</fo:inline>
+ </fo:block>
+ </fo:table-cell>
+ </fo:table-row>
+ </fo:table-header>
+ <fo:table-body>
+ <fo:table-row>
+ <fo:table-cell id="cell1">
+ <fo:block/>
+ </fo:table-cell>
+ </fo:table-row>
+ </fo:table-body>
+ </fo:table>
+ </fo:flow>
+ </fo:page-sequence>
+ </fo:root>
+ </fo>
+ <checks>
+ <eval expected="1" xpath="count(//pageViewport)"/>
+ <element-list category="table-cell" id="cell1">
+ <box w="0" aux="true"/>
+ </element-list>
+ <element-list category="breaker">
+ <box w="0"/> <!--table body -->
+ <box w="14400"/> <!-- table header -->
+ <skip>3</skip>
+ </element-list>
+ </checks>
+</testcase>