Skip to content

Commit d46e7b9

Browse files
committed
Fix issues in table layout
DEVSIX-1252
1 parent 65d2aaf commit d46e7b9

File tree

5 files changed

+32
-10
lines changed

5 files changed

+32
-10
lines changed

layout/src/main/java/com/itextpdf/layout/element/Table.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -684,7 +684,7 @@ public boolean isComplete() {
684684
}
685685

686686
/**
687-
* Indicates that all the desired content has been added to this large element.
687+
* Indicates that all the desired content has been added to this large element and no more content will be added.
688688
* After this method is called, more precise rendering is activated.
689689
* For instance, a table may have a {@link #setSkipLastFooter(boolean)} method set to true,
690690
* and in case of large table on {@link #flush()} we do not know if any more content will be added,
@@ -695,6 +695,7 @@ public boolean isComplete() {
695695
*/
696696
@Override
697697
public void complete() {
698+
assert !isComplete;
698699
isComplete = true;
699700
flush();
700701
}

layout/src/main/java/com/itextpdf/layout/renderer/CellRenderer.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ public class CellRenderer extends BlockRenderer {
6060
*/
6161
public CellRenderer(Cell modelElement) {
6262
super(modelElement);
63+
assert modelElement != null;
6364
setProperty(Property.ROWSPAN, modelElement.getRowspan());
6465
setProperty(Property.COLSPAN, modelElement.getColspan());
6566
}

layout/src/main/java/com/itextpdf/layout/renderer/TableWidths.java

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ This file is part of the iText (R) project.
5353
import org.slf4j.Logger;
5454
import org.slf4j.LoggerFactory;
5555

56+
import java.text.MessageFormat;
5657
import java.util.ArrayList;
5758
import java.util.Collections;
5859
import java.util.List;
@@ -349,6 +350,7 @@ float[] autoLayout() {
349350
float minTotalNonPercent = 0;
350351
float fixedAddition = 0;
351352
float flexibleAddition = 0;
353+
boolean hasFlexibleCell = false;
352354
//sum of non fixed non percent columns.
353355
for (int i = 0; i < numberOfColumns; i++) {
354356
if (widths[i].isPercent) {
@@ -369,6 +371,7 @@ float[] autoLayout() {
369371
fixedAddition += addition;
370372
} else {
371373
flexibleAddition += addition;
374+
hasFlexibleCell = true;
372375
}
373376
}
374377
}
@@ -384,7 +387,7 @@ float[] autoLayout() {
384387
}
385388
} else {
386389
float extraWidth = tableWidth - totalPercent - minTotalNonPercent;
387-
if (fixedAddition > 0 && (extraWidth < fixedAddition || flexibleAddition == 0)) {
390+
if (fixedAddition > 0 && (extraWidth < fixedAddition || !hasFlexibleCell)) {
388391
for (int i = 0; i < numberOfColumns; i++) {
389392
//only points could be fixed
390393
if (widths[i].isFixed) {
@@ -596,13 +599,12 @@ private float[] getCellBorderIndents(CellInfo cell) {
596599
TableRenderer renderer;
597600
if (cell.region == CellInfo.HEADER) {
598601
renderer = tableRenderer.headerRenderer;
599-
} else if (cell.region == CellInfo.HEADER) {
602+
} else if (cell.region == CellInfo.FOOTER) {
600603
renderer = tableRenderer.footerRenderer;
601604
} else {
602605
renderer = tableRenderer;
603606
}
604607
return renderer.bordersHandler.getCellBorderIndents(cell.getRow(), cell.getCol(), cell.getRowspan(), cell.getColspan());
605-
606608
}
607609

608610
private void fillAndSortCells() {
@@ -624,7 +626,7 @@ private void fillRendererCells(TableRenderer renderer, byte region) {
624626
for (int col = 0; col < numberOfColumns; col++) {
625627
CellRenderer cell = renderer.rows.get(row)[col];
626628
if (cell != null) {
627-
cells.add(new CellInfo(cell, row, region));
629+
cells.add(new CellInfo(cell, row, col, region));
628630
}
629631
}
630632
}
@@ -769,33 +771,37 @@ private static class CellInfo implements Comparable<CellInfo> {
769771

770772
private final CellRenderer cell;
771773
private final int row;
774+
private final int col;
772775
private final byte region;
773776

774-
CellInfo(CellRenderer cell, int row, byte region) {
777+
CellInfo(CellRenderer cell, int row, int col, byte region) {
775778
this.cell = cell;
776779
this.region = region;
780+
//we cannot use getModelElement().getCol() or getRow(), because its may be changed during layout.
777781
this.row = row;
778-
//assert this.row != cell.getModelElement().getRow();
782+
this.col = col;
779783
}
780784

781785
CellRenderer getCell() {
782786
return cell;
783787
}
784788

785789
int getCol() {
786-
return cell.getModelElement().getCol();
790+
return col;
787791
}
788792

789793
int getColspan() {
790-
return cell.getModelElement().getColspan();
794+
//we cannot use getModelElement().getColspan(), because it may be changed during layout.
795+
return (int) cell.getPropertyAsInteger(Property.COLSPAN);
791796
}
792797

793798
int getRow() {
794799
return row;
795800
}
796801

797802
int getRowspan() {
798-
return cell.getModelElement().getRowspan();
803+
//we cannot use getModelElement().getRowspan(), because it may be changed during layout.
804+
return (int) cell.getPropertyAsInteger(Property.ROWSPAN);
799805
}
800806

801807
@Override
@@ -808,6 +814,20 @@ public int compareTo(CellInfo o) {
808814
}
809815
return region == o.region ? getRow() - o.getRow() : region - o.region;
810816
}
817+
818+
@Override
819+
public String toString() {
820+
String str = MessageFormat.format("row={0}, col={1}, rowspan={2}, colspan={3}, ",
821+
getRow(), getCol(), getRowspan(), getColspan());
822+
if (region == HEADER) {
823+
str += "header";
824+
} else if (region == BODY) {
825+
str += "body";
826+
} else if (region == FOOTER) {
827+
str += "footer";
828+
}
829+
return str;
830+
}
811831
}
812832

813833
//endregion
Binary file not shown.

0 commit comments

Comments
 (0)