Skip to content

Commit bc6666f

Browse files
committed
Fix parent tree of cause of nothing element in case of keep together
DEVSIX-7785
1 parent c277cd7 commit bc6666f

File tree

12 files changed

+250
-194
lines changed

12 files changed

+250
-194
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -672,7 +672,7 @@ AbstractRenderer[] createSplitAndOverflowRenderers(int childPos, int layoutStatu
672672
AbstractRenderer overflowRenderer = createOverflowRenderer(layoutStatus);
673673
overflowRenderer.childRenderers.addAll(waitingOverflowFloatRenderers);
674674
if (childResult.getOverflowRenderer() != null) {
675-
overflowRenderer.childRenderers.add(childResult.getOverflowRenderer());
675+
overflowRenderer.addChildRenderer(childResult.getOverflowRenderer());
676676
}
677677
overflowRenderer.childRenderers.addAll(childRenderers.subList(childPos + 1, childRenderers.size()));
678678

@@ -940,7 +940,7 @@ LayoutResult processNotFullChildResult(LayoutContext layoutContext,
940940
if (keepTogether) {
941941
splitRenderer = null;
942942
overflowRenderer.childRenderers.clear();
943-
overflowRenderer.childRenderers = new ArrayList<>(childRenderers);
943+
overflowRenderer.addAllChildRenderers(childRenderers);
944944
}
945945

946946
correctFixedLayout(layoutBox);

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,9 @@ public LayoutResult layout(LayoutContext layoutContext) {
105105
final MulticolLayoutResult layoutResult = layoutInColumns(layoutContext, actualBBox);
106106

107107
if (layoutResult.getSplitRenderers().isEmpty()) {
108+
for (IRenderer child : elementRenderer.getChildRenderers()) {
109+
child.setParent(elementRenderer);
110+
}
108111
return new LayoutResult(LayoutResult.NOTHING, null, null, this, layoutResult.getCauseOfNothing());
109112
} else if (layoutResult.getOverflowRenderer() == null) {
110113
final ContinuousContainer continuousContainer = this.<ContinuousContainer>getProperty(

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

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -500,12 +500,8 @@ private boolean tryDisableKeepTogether(LayoutResult result,
500500
if (toDisableKeepTogether == null) {
501501
return false;
502502
}
503-
504-
// Ideally the disabling of keep together property should be done on the renderers layer,
505-
// but due to the problem with renderers tree (parent links from causeOfNothing
506-
// may not lead to overflowRenderer) such approach does not work now. So we are
507-
// disabling keep together on the models layer.
508-
toDisableKeepTogether.getModelElement().setProperty(Property.KEEP_TOGETHER, false);
503+
504+
toDisableKeepTogether.setProperty(Property.KEEP_TOGETHER, false);
509505
Logger logger = LoggerFactory.getLogger(RootRenderer.class);
510506
if (logger.isWarnEnabled()) {
511507
logger.warn(MessageFormatUtil.format(

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

Lines changed: 43 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -798,52 +798,51 @@ public LayoutResult layout(LayoutContext layoutContext) {
798798
splitResult[1].deleteOwnProperty(Property.BORDER_BOTTOM);
799799
}
800800
}
801-
if (split) {
802-
int[] rowspans = new int[currentRow.length];
803-
boolean[] columnsWithCellToBeEnlarged = new boolean[currentRow.length];
804-
for (col = 0; col < currentRow.length; col++) {
805-
if (splits[col] != null) {
806-
CellRenderer cellSplit = (CellRenderer) splits[col].getSplitRenderer();
807-
if (null != cellSplit) {
808-
rowspans[col] = ((Cell) cellSplit.getModelElement()).getRowspan();
809-
}
810-
if (splits[col].getStatus() != LayoutResult.NOTHING && (hasContent || cellWithBigRowspanAdded)) {
811-
childRenderers.add(cellSplit);
812-
}
813-
LayoutArea cellOccupiedArea = currentRow[col].getOccupiedArea();
814-
if (hasContent || cellWithBigRowspanAdded || splits[col].getStatus() == LayoutResult.NOTHING) {
815-
CellRenderer cellOverflow = (CellRenderer) splits[col].getOverflowRenderer();
816-
CellRenderer originalCell = currentRow[col];
817-
currentRow[col] = null;
818-
rows.get(targetOverflowRowIndex[col])[col] = originalCell;
819-
overflowRows.setCell(0, col, null);
820-
overflowRows.setCell(targetOverflowRowIndex[col] - row, col, (CellRenderer) cellOverflow.setParent(splitResult[1]));
821-
} else {
822-
overflowRows.setCell(targetOverflowRowIndex[col] - row, col, (CellRenderer) currentRow[col].setParent(splitResult[1]));
823-
}
824-
overflowRows.getCell(targetOverflowRowIndex[col] - row, col).occupiedArea = cellOccupiedArea;
825-
} else if (currentRow[col] != null) {
826-
if (hasContent) {
827-
rowspans[col] = ((Cell) currentRow[col].getModelElement()).getRowspan();
828-
}
829-
boolean isBigRowspannedCell = 1 != ((Cell) currentRow[col].getModelElement()).getRowspan();
830-
if (hasContent || isBigRowspannedCell) {
831-
columnsWithCellToBeEnlarged[col] = true;
832-
}
801+
802+
int[] rowspans = new int[currentRow.length];
803+
boolean[] columnsWithCellToBeEnlarged = new boolean[currentRow.length];
804+
for (col = 0; col < currentRow.length; col++) {
805+
if (splits[col] != null) {
806+
CellRenderer cellSplit = (CellRenderer) splits[col].getSplitRenderer();
807+
if (null != cellSplit) {
808+
rowspans[col] = ((Cell) cellSplit.getModelElement()).getRowspan();
809+
}
810+
if (splits[col].getStatus() != LayoutResult.NOTHING && (hasContent || cellWithBigRowspanAdded)) {
811+
childRenderers.add(cellSplit);
812+
}
813+
LayoutArea cellOccupiedArea = currentRow[col].getOccupiedArea();
814+
if (hasContent || cellWithBigRowspanAdded || splits[col].getStatus() == LayoutResult.NOTHING) {
815+
CellRenderer cellOverflow = (CellRenderer) splits[col].getOverflowRenderer();
816+
CellRenderer originalCell = currentRow[col];
817+
currentRow[col] = null;
818+
rows.get(targetOverflowRowIndex[col])[col] = originalCell;
819+
overflowRows.setCell(0, col, null);
820+
overflowRows.setCell(targetOverflowRowIndex[col] - row, col, cellOverflow);
821+
} else {
822+
overflowRows.setCell(targetOverflowRowIndex[col] - row, col, currentRow[col]);
823+
}
824+
overflowRows.getCell(targetOverflowRowIndex[col] - row, col).occupiedArea = cellOccupiedArea;
825+
} else if (currentRow[col] != null) {
826+
if (hasContent) {
827+
rowspans[col] = ((Cell) currentRow[col].getModelElement()).getRowspan();
828+
}
829+
boolean isBigRowspannedCell = 1 != ((Cell) currentRow[col].getModelElement()).getRowspan();
830+
if (hasContent || isBigRowspannedCell) {
831+
columnsWithCellToBeEnlarged[col] = true;
833832
}
834833
}
834+
}
835835

836-
int minRowspan = Integer.MAX_VALUE;
837-
for (col = 0; col < rowspans.length; col++) {
838-
if (0 != rowspans[col]) {
839-
minRowspan = Math.min(minRowspan, rowspans[col]);
840-
}
836+
int minRowspan = Integer.MAX_VALUE;
837+
for (col = 0; col < rowspans.length; col++) {
838+
if (0 != rowspans[col]) {
839+
minRowspan = Math.min(minRowspan, rowspans[col]);
841840
}
841+
}
842842

843-
for (col = 0; col < numberOfColumns; col++) {
844-
if (columnsWithCellToBeEnlarged[col]) {
845-
enlargeCell(col, row, minRowspan,currentRow, overflowRows, targetOverflowRowIndex, splitResult);
846-
}
843+
for (col = 0; col < numberOfColumns; col++) {
844+
if (columnsWithCellToBeEnlarged[col]) {
845+
enlargeCell(col, row, minRowspan,currentRow, overflowRows, targetOverflowRowIndex, splitResult);
847846
}
848847
}
849848

@@ -1254,20 +1253,18 @@ protected TableRenderer[] split(int row, boolean hasContent) {
12541253
protected TableRenderer[] split(int row, boolean hasContent, boolean cellWithBigRowspanAdded) {
12551254
TableRenderer splitRenderer = createSplitRenderer(new Table.RowRange(rowRange.getStartRow(), rowRange.getStartRow() + row));
12561255
splitRenderer.rows = rows.subList(0, row);
1257-
12581256
splitRenderer.bordersHandler = bordersHandler;
1259-
12601257
splitRenderer.heights = heights;
12611258
splitRenderer.columnWidths = columnWidths;
12621259
splitRenderer.countedColumnWidth = countedColumnWidth;
12631260
splitRenderer.totalWidthForColumns = totalWidthForColumns;
1261+
splitRenderer.occupiedArea = occupiedArea;
1262+
12641263
TableRenderer overflowRenderer = createOverflowRenderer(new Table.RowRange(rowRange.getStartRow() + row, rowRange.getFinishRow()));
12651264
if (0 == row && !(hasContent || cellWithBigRowspanAdded) && 0 == rowRange.getStartRow()) {
12661265
overflowRenderer.isOriginalNonSplitRenderer = isOriginalNonSplitRenderer;
12671266
}
12681267
overflowRenderer.rows = rows.subList(row, rows.size());
1269-
splitRenderer.occupiedArea = occupiedArea;
1270-
12711268
overflowRenderer.bordersHandler = bordersHandler;
12721269

12731270
return new TableRenderer[]{splitRenderer, overflowRenderer};
@@ -1885,7 +1882,6 @@ public CellRendererInfo(CellRenderer cellRenderer, int column, int finishRow) {
18851882
*/
18861883
private static class OverflowRowsWrapper {
18871884
private TableRenderer overflowRenderer;
1888-
private HashMap<Integer, Boolean> isRowReplaced = new HashMap<>();
18891885
private boolean isReplaced = false;
18901886

18911887
public OverflowRowsWrapper(TableRenderer overflowRenderer) {
@@ -1901,9 +1897,7 @@ public CellRenderer setCell(int row, int col, CellRenderer newCell) {
19011897
overflowRenderer.rows = new ArrayList<>(overflowRenderer.rows);
19021898
isReplaced = true;
19031899
}
1904-
if (!Boolean.TRUE.equals(isRowReplaced.get(row))) {
1905-
overflowRenderer.rows.set(row, (CellRenderer[]) overflowRenderer.rows.get(row).clone());
1906-
}
1900+
overflowRenderer.rows.set(row, (CellRenderer[]) overflowRenderer.rows.get(row).clone());
19071901
return overflowRenderer.rows.get(row)[col] = newCell;
19081902
}
19091903
}

0 commit comments

Comments
 (0)