Skip to content

Commit 53ff5e4

Browse files
author
glenn.volckaert
committed
Add null check before aplying RTL to list
DEVSIX-7027
1 parent 317ff08 commit 53ff5e4

File tree

1 file changed

+33
-16
lines changed

1 file changed

+33
-16
lines changed

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

Lines changed: 33 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,9 @@ This file is part of the iText (R) project.
4444
package com.itextpdf.layout.renderer;
4545

4646

47-
import com.itextpdf.io.logs.IoLogMessageConstant;
48-
import com.itextpdf.io.font.constants.StandardFonts;
4947
import com.itextpdf.commons.utils.MessageFormatUtil;
48+
import com.itextpdf.io.font.constants.StandardFonts;
49+
import com.itextpdf.io.logs.IoLogMessageConstant;
5050
import com.itextpdf.io.util.TextUtil;
5151
import com.itextpdf.kernel.font.PdfFontFactory;
5252
import com.itextpdf.kernel.geom.Rectangle;
@@ -68,6 +68,7 @@ This file is part of the iText (R) project.
6868
import com.itextpdf.layout.properties.Property;
6969
import com.itextpdf.layout.properties.UnitValue;
7070
import com.itextpdf.layout.tagging.LayoutTaggingHelper;
71+
7172
import java.io.IOException;
7273
import java.util.ArrayList;
7374
import java.util.List;
@@ -231,6 +232,7 @@ private IRenderer createListSymbolRenderer(int index, IRenderer renderer) {
231232
} else if (defaultListSymbol instanceof IListSymbolFactory) {
232233
return surroundTextBullet(((IListSymbolFactory) defaultListSymbol).createSymbol(index, this, renderer).createRendererSubTree());
233234
} else if (defaultListSymbol == null) {
235+
234236
return null;
235237
} else {
236238
throw new IllegalStateException();
@@ -269,7 +271,8 @@ private LineRenderer surroundTextBullet(IRenderer bulletRenderer) {
269271
* @param occupiedArea the area occupied by layout before correction
270272
* @return corrected {@link com.itextpdf.layout.layout.LayoutResult layout result}
271273
*/
272-
private LayoutResult correctListSplitting(IRenderer splitRenderer, IRenderer overflowRenderer, IRenderer causeOfNothing, LayoutArea occupiedArea) {
274+
private LayoutResult correctListSplitting(IRenderer splitRenderer, IRenderer overflowRenderer,
275+
IRenderer causeOfNothing, LayoutArea occupiedArea) {
273276
// the first not rendered child
274277
int firstNotRendered = splitRenderer.getChildRenderers().get(0).getChildRenderers().indexOf(causeOfNothing);
275278

@@ -278,25 +281,31 @@ private LayoutResult correctListSplitting(IRenderer splitRenderer, IRenderer ove
278281
occupiedArea, splitRenderer, overflowRenderer, this);
279282
}
280283

281-
// Notice that placed item is a son of the first ListItemRenderer (otherwise there would be now FORCED_PLACEMENT applied)
284+
// Notice that placed item is a son of the first ListItemRenderer (otherwise there would be now
285+
// FORCED_PLACEMENT applied)
282286
IRenderer firstListItemRenderer = splitRenderer.getChildRenderers().get(0);
283287

284288
ListRenderer newOverflowRenderer = (ListRenderer) createOverflowRenderer(LayoutResult.PARTIAL);
285289
newOverflowRenderer.deleteOwnProperty(Property.FORCED_PLACEMENT);
286290
// ListItemRenderer for not rendered children of firstListItemRenderer
287-
newOverflowRenderer.childRenderers.add(((ListItemRenderer) firstListItemRenderer).createOverflowRenderer(LayoutResult.PARTIAL));
288-
newOverflowRenderer.childRenderers.addAll(splitRenderer.getChildRenderers().subList(1, splitRenderer.getChildRenderers().size()));
291+
newOverflowRenderer.childRenderers.
292+
add(((ListItemRenderer) firstListItemRenderer).createOverflowRenderer(LayoutResult.PARTIAL));
293+
newOverflowRenderer.childRenderers.
294+
addAll(splitRenderer.getChildRenderers().subList(1, splitRenderer.getChildRenderers().size()));
289295

290296
List<IRenderer> childrenStillRemainingToRender =
291-
new ArrayList<>(firstListItemRenderer.getChildRenderers().subList(firstNotRendered + 1, firstListItemRenderer.getChildRenderers().size()));
297+
new ArrayList<>(firstListItemRenderer.getChildRenderers().
298+
subList(firstNotRendered + 1, firstListItemRenderer.getChildRenderers().size()));
292299

293300
// 'this' renderer will become split renderer
294-
splitRenderer.getChildRenderers().removeAll(splitRenderer.getChildRenderers().subList(1, splitRenderer.getChildRenderers().size()));
301+
splitRenderer.getChildRenderers().removeAll(splitRenderer.getChildRenderers().
302+
subList(1, splitRenderer.getChildRenderers().size()));
295303

296304
if (0 != childrenStillRemainingToRender.size()) {
297305
newOverflowRenderer.getChildRenderers().get(0).getChildRenderers().addAll(childrenStillRemainingToRender);
298306
splitRenderer.getChildRenderers().get(0).getChildRenderers().removeAll(childrenStillRemainingToRender);
299-
newOverflowRenderer.getChildRenderers().get(0).setProperty(Property.MARGIN_LEFT, splitRenderer.getChildRenderers().get(0).<UnitValue>getProperty(Property.MARGIN_LEFT));
307+
newOverflowRenderer.getChildRenderers().get(0).setProperty(Property.MARGIN_LEFT,
308+
splitRenderer.getChildRenderers().get(0).<UnitValue>getProperty(Property.MARGIN_LEFT));
300309
} else {
301310
newOverflowRenderer.childRenderers.remove(0);
302311
}
@@ -318,9 +327,12 @@ private LayoutResult initializeListSymbols(LayoutContext layoutContext) {
318327
int listItemNum = (int)this.<Integer>getProperty(Property.LIST_START, 1);
319328
for (int i = 0; i < childRenderers.size(); i++) {
320329
childRenderers.get(i).setParent(this);
321-
listItemNum = (childRenderers.get(i).<Integer>getProperty(Property.LIST_SYMBOL_ORDINAL_VALUE) != null) ? (int) childRenderers.get(i).<Integer>getProperty(Property.LIST_SYMBOL_ORDINAL_VALUE) : listItemNum;
330+
listItemNum = (childRenderers.get(i).<Integer>getProperty(Property.LIST_SYMBOL_ORDINAL_VALUE) != null) ?
331+
(int) childRenderers.get(i).<Integer>getProperty(Property.LIST_SYMBOL_ORDINAL_VALUE) :
332+
listItemNum;
322333
IRenderer currentSymbolRenderer = makeListSymbolRenderer(listItemNum, childRenderers.get(i));
323-
if (BaseDirection.RIGHT_TO_LEFT.equals(this.<BaseDirection>getProperty(Property.BASE_DIRECTION))) {
334+
if (currentSymbolRenderer != null &&
335+
BaseDirection.RIGHT_TO_LEFT == this.<BaseDirection>getProperty(Property.BASE_DIRECTION)) {
324336
currentSymbolRenderer.setProperty(Property.BASE_DIRECTION, BaseDirection.RIGHT_TO_LEFT);
325337
}
326338
LayoutResult listSymbolLayoutResult = null;
@@ -332,14 +344,16 @@ private LayoutResult initializeListSymbols(LayoutContext layoutContext) {
332344
}
333345
childRenderers.get(i).setParent(null);
334346
boolean isForcedPlacement = Boolean.TRUE.equals(getPropertyAsBoolean(Property.FORCED_PLACEMENT));
335-
boolean listSymbolNotFit = listSymbolLayoutResult != null && listSymbolLayoutResult.getStatus() != LayoutResult.FULL;
347+
boolean listSymbolNotFit = listSymbolLayoutResult != null &&
348+
listSymbolLayoutResult.getStatus() != LayoutResult.FULL;
336349
// TODO DEVSIX-1655: partially not fitting list symbol not shown at all, however this might be improved
337350
if (listSymbolNotFit && isForcedPlacement) {
338351
currentSymbolRenderer = null;
339352
}
340353
symbolRenderers.add(currentSymbolRenderer);
341354
if (listSymbolNotFit && !isForcedPlacement) {
342-
return new LayoutResult(LayoutResult.NOTHING, null, null, this, listSymbolLayoutResult.getCauseOfNothing());
355+
return new LayoutResult(LayoutResult.NOTHING, null, null, this,
356+
listSymbolLayoutResult.getCauseOfNothing());
343357
}
344358
}
345359

@@ -348,8 +362,10 @@ private LayoutResult initializeListSymbols(LayoutContext layoutContext) {
348362
IRenderer symbolRenderer = symbolRenderers.get(i);
349363
if (symbolRenderer != null) {
350364
IRenderer listItemRenderer = childRenderers.get(i);
351-
if ((ListSymbolPosition) getListItemOrListProperty(listItemRenderer, this, Property.LIST_SYMBOL_POSITION) != ListSymbolPosition.INSIDE) {
352-
maxSymbolWidth = Math.max(maxSymbolWidth, symbolRenderer.getOccupiedArea().getBBox().getWidth());
365+
if ((ListSymbolPosition) getListItemOrListProperty(listItemRenderer, this,
366+
Property.LIST_SYMBOL_POSITION) != ListSymbolPosition.INSIDE) {
367+
maxSymbolWidth = Math.max(maxSymbolWidth,
368+
symbolRenderer.getOccupiedArea().getBBox().getWidth());
353369
}
354370
}
355371
}
@@ -373,7 +389,8 @@ private LayoutResult initializeListSymbols(LayoutContext layoutContext) {
373389
marginToSet));
374390
}
375391
float calculatedMargin = marginToSetUV.getValue();
376-
if ((ListSymbolPosition) getListItemOrListProperty(childRenderer, this, Property.LIST_SYMBOL_POSITION) == ListSymbolPosition.DEFAULT) {
392+
if ((ListSymbolPosition) getListItemOrListProperty(childRenderer, this, Property.LIST_SYMBOL_POSITION)
393+
== ListSymbolPosition.DEFAULT) {
377394
calculatedMargin += maxSymbolWidth + (float) (symbolIndent != null ? symbolIndent : 0f);
378395
}
379396
childRenderer.setProperty(marginToSet, UnitValue.createPointValue(calculatedMargin));

0 commit comments

Comments
 (0)