@@ -155,61 +155,55 @@ public TableBorders(List<CellRenderer[]> rows, int numberOfColumns, Border[] tab
155
155
protected abstract float getCellVerticalAddition (float [] indents );
156
156
// endregion
157
157
158
+ /**
159
+ * @deprecated Remove rowspansToDeduct parameter which is not used anymore.
160
+ */
161
+ @ Deprecated
158
162
protected abstract void buildBordersArrays (CellRenderer cell , int row , int col , int [] rowspansToDeduct );
159
163
160
164
protected abstract TableBorders updateBordersOnNewPage (boolean isOriginalNonSplitRenderer , boolean isFooterOrHeader , TableRenderer currentRenderer , TableRenderer headerRenderer , TableRenderer footerRenderer );
161
165
// endregion
162
166
163
167
protected TableBorders processAllBordersAndEmptyRows () {
164
168
CellRenderer [] currentRow ;
165
- int [] rowspansToDeduct = new int [numberOfColumns ];
166
169
int numOfRowsToRemove = 0 ;
167
170
if (!rows .isEmpty ()) {
168
171
for (int row = startRow - largeTableIndexOffset ; row <= finishRow - largeTableIndexOffset ; row ++) {
169
172
currentRow = rows .get (row );
170
173
boolean hasCells = false ;
171
174
for (int col = 0 ; col < numberOfColumns ; col ++) {
172
175
if (null != currentRow [col ]) {
173
- int colspan = (int ) currentRow [col ].getPropertyAsInteger (Property .COLSPAN );
174
- if (rowspansToDeduct [col ] > 0 ) {
175
- int rowspan = (int ) currentRow [col ].getPropertyAsInteger (Property .ROWSPAN ) - rowspansToDeduct [col ];
176
- if (rowspan < 1 ) {
177
- Logger logger = LoggerFactory .getLogger (TableRenderer .class );
178
- logger .warn (IoLogMessageConstant .UNEXPECTED_BEHAVIOUR_DURING_TABLE_ROW_COLLAPSING );
179
- rowspan = 1 ;
180
- }
181
- currentRow [col ].setProperty (Property .ROWSPAN , rowspan );
182
- if (0 != numOfRowsToRemove ) {
183
- removeRows (row - numOfRowsToRemove , numOfRowsToRemove );
184
- row -= numOfRowsToRemove ;
185
- numOfRowsToRemove = 0 ;
186
- }
176
+ if (0 != numOfRowsToRemove ) {
177
+ // Decrease rowspans if necessary
178
+ updateRowspanForNextNonEmptyCellInEachColumn (numOfRowsToRemove , row );
179
+
180
+ // Remove empty rows
181
+ removeRows (row - numOfRowsToRemove , numOfRowsToRemove );
182
+ row -= numOfRowsToRemove ;
183
+ numOfRowsToRemove = 0 ;
187
184
}
188
- buildBordersArrays (currentRow [col ], row , col , rowspansToDeduct );
185
+
186
+ buildBordersArrays (currentRow [col ], row , col , null );
189
187
hasCells = true ;
190
- for (int i = 0 ; i < colspan ; i ++) {
191
- rowspansToDeduct [col + i ] = 0 ;
192
- }
188
+ int colspan = (int ) currentRow [col ].getPropertyAsInteger (Property .COLSPAN );
193
189
col += colspan - 1 ;
194
190
} else {
195
191
if (horizontalBorders .get (row ).size () <= col ) {
196
192
horizontalBorders .get (row ).add (null );
197
193
}
198
194
}
199
195
}
196
+
200
197
if (!hasCells ) {
201
198
if (row == rows .size () - 1 ) {
202
- removeRows (row - rowspansToDeduct [ 0 ], rowspansToDeduct [ 0 ] );
199
+ removeRows (row - numOfRowsToRemove , numOfRowsToRemove );
203
200
// delete current row
204
- rows .remove (row - rowspansToDeduct [ 0 ] );
201
+ rows .remove (row - numOfRowsToRemove );
205
202
setFinishRow (finishRow - 1 );
206
203
207
204
Logger logger = LoggerFactory .getLogger (TableRenderer .class );
208
205
logger .warn (IoLogMessageConstant .LAST_ROW_IS_NOT_COMPLETE );
209
206
} else {
210
- for (int i = 0 ; i < numberOfColumns ; i ++) {
211
- rowspansToDeduct [i ]++;
212
- }
213
207
numOfRowsToRemove ++;
214
208
}
215
209
}
@@ -221,17 +215,6 @@ protected TableBorders processAllBordersAndEmptyRows() {
221
215
return this ;
222
216
}
223
217
224
- private void removeRows (int startRow , int numOfRows ) {
225
- for (int row = startRow ; row < startRow + numOfRows ; row ++) {
226
- rows .remove (startRow );
227
- horizontalBorders .remove (startRow + 1 );
228
- for (int j = 0 ; j <= numberOfColumns ; j ++) {
229
- verticalBorders .get (j ).remove (startRow + 1 );
230
- }
231
- }
232
- setFinishRow (finishRow - numOfRows );
233
- }
234
-
235
218
// region init
236
219
protected TableBorders initializeBorders () {
237
220
List <Border > tempBorders ;
@@ -415,4 +398,62 @@ public float[] getCellBorderIndents(int row, int col, int rowspan, int colspan)
415
398
return indents ;
416
399
}
417
400
// endregion
401
+
402
+ private void removeRows (int startRow , int numOfRows ) {
403
+ for (int row = startRow ; row < startRow + numOfRows ; row ++) {
404
+ rows .remove (startRow );
405
+ horizontalBorders .remove (startRow + 1 );
406
+ for (int j = 0 ; j <= numberOfColumns ; j ++) {
407
+ verticalBorders .get (j ).remove (startRow + 1 );
408
+ }
409
+ }
410
+ setFinishRow (finishRow - numOfRows );
411
+ }
412
+
413
+ private void updateRowspanForNextNonEmptyCellInEachColumn (int numOfRowsToRemove , int row ) {
414
+ // We go by columns in a current row which is not empty. For each column we look for
415
+ // a non-empty cell going up by rows (going down in a table). For each such cell we
416
+ // collect data to be able to analyze its rowspan.
417
+
418
+ // Iterate by columns
419
+ int c = 0 ;
420
+ while (c < numberOfColumns ) {
421
+ int r = row ;
422
+ CellRenderer [] cr = null ;
423
+ // Look for non-empty cell in a column
424
+ while (r < rows .size () && (cr == null || cr [c ] == null )) {
425
+ cr = rows .get (r );
426
+ ++r ;
427
+ }
428
+
429
+ // Found a cell
430
+ if (cr != null && cr [c ] != null ) {
431
+ CellRenderer cell = cr [c ];
432
+ final int origRowspan = (int ) cell .getPropertyAsInteger (Property .ROWSPAN );
433
+ int spansToRestore = 0 ;
434
+ // Here we analyze whether current cell's rowspan touches a non-empty row before
435
+ // numOfRowsToRemove. If it doesn't touch it we will need to 'restore' a few
436
+ // rowspans which is a difference between the current (non-empty) row and the row
437
+ // where we found non-empty cell for this column
438
+ if (row - numOfRowsToRemove < r - origRowspan ) {
439
+ spansToRestore = r - row - 1 ;
440
+ }
441
+
442
+ int rowspan = origRowspan ;
443
+ rowspan = rowspan - numOfRowsToRemove ;
444
+ if (rowspan < 1 ) {
445
+ rowspan = 1 ;
446
+ }
447
+ rowspan += spansToRestore ;
448
+ rowspan = Math .min (rowspan , origRowspan );
449
+
450
+ cell .setProperty (Property .ROWSPAN , rowspan );
451
+
452
+ final int colspan = (int ) cell .getPropertyAsInteger (Property .COLSPAN );
453
+ c += colspan ;
454
+ } else {
455
+ ++c ;
456
+ }
457
+ }
458
+ }
418
459
}
0 commit comments