Skip to content

Commit a34feaa

Browse files
committed
Fix bug with list splitting
1 parent 0a36cd3 commit a34feaa

File tree

2 files changed

+39
-22
lines changed

2 files changed

+39
-22
lines changed

layout/src/main/java/com/itextpdf/layout/property/Property.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ public enum Property {
9797
LIST_SYMBOL_INDENT,
9898
LIST_SYMBOL_PRE_TEXT,
9999
LIST_SYMBOL_POST_TEXT,
100+
LIST_SYMBOLS_INITIALIZED,
100101
MARGIN_BOTTOM,
101102
MARGIN_LEFT,
102103
MARGIN_RIGHT,

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

Lines changed: 38 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -72,30 +72,32 @@ public ListRenderer(com.itextpdf.layout.element.List modelElement) {
7272

7373
@Override
7474
public LayoutResult layout(LayoutContext layoutContext) {
75-
List<IRenderer> symbolRenderers = new ArrayList<>();
76-
int listItemNum = getProperty(Property.LIST_START, 1);
77-
for (int i = 0; i < childRenderers.size(); i++) {
78-
if (childRenderers.get(i).getModelElement() instanceof ListItem) {
79-
IRenderer currentSymbolRenderer = makeListSymbolRenderer(listItemNum++, childRenderers.get(i));
80-
symbolRenderers.add(currentSymbolRenderer);
81-
LayoutResult listSymbolLayoutResult = currentSymbolRenderer.layout(layoutContext);
82-
if (listSymbolLayoutResult.getStatus() != LayoutResult.FULL) {
83-
return new LayoutResult(LayoutResult.NOTHING, null, null, this);
75+
if (!hasOwnProperty(Property.LIST_SYMBOLS_INITIALIZED)) {
76+
List<IRenderer> symbolRenderers = new ArrayList<>();
77+
int listItemNum = getProperty(Property.LIST_START, 1);
78+
for (int i = 0; i < childRenderers.size(); i++) {
79+
if (childRenderers.get(i).getModelElement() instanceof ListItem) {
80+
IRenderer currentSymbolRenderer = makeListSymbolRenderer(listItemNum++, childRenderers.get(i));
81+
symbolRenderers.add(currentSymbolRenderer);
82+
LayoutResult listSymbolLayoutResult = currentSymbolRenderer.layout(layoutContext);
83+
if (listSymbolLayoutResult.getStatus() != LayoutResult.FULL) {
84+
return new LayoutResult(LayoutResult.NOTHING, null, null, this);
85+
}
8486
}
8587
}
86-
}
87-
float maxSymbolWidth = 0;
88-
for (IRenderer symbolRenderer : symbolRenderers) {
89-
maxSymbolWidth = Math.max(maxSymbolWidth, symbolRenderer.getOccupiedArea().getBBox().getWidth());
90-
}
91-
Float symbolIndent = modelElement.getProperty(Property.LIST_SYMBOL_INDENT);
92-
listItemNum = 0;
93-
for (IRenderer childRenderer : childRenderers) {
94-
childRenderer.deleteOwnProperty(Property.MARGIN_LEFT);
95-
childRenderer.setProperty(Property.MARGIN_LEFT, childRenderer.getProperty(Property.MARGIN_LEFT, 0f) + maxSymbolWidth + (symbolIndent != null ? symbolIndent : 0f));
96-
if (childRenderer.getModelElement() instanceof ListItem) {
97-
IRenderer symbolRenderer = symbolRenderers.get(listItemNum++);
98-
((ListItemRenderer)childRenderer).addSymbolRenderer(symbolRenderer, maxSymbolWidth);
88+
float maxSymbolWidth = 0;
89+
for (IRenderer symbolRenderer : symbolRenderers) {
90+
maxSymbolWidth = Math.max(maxSymbolWidth, symbolRenderer.getOccupiedArea().getBBox().getWidth());
91+
}
92+
Float symbolIndent = modelElement.getProperty(Property.LIST_SYMBOL_INDENT);
93+
listItemNum = 0;
94+
for (IRenderer childRenderer : childRenderers) {
95+
childRenderer.deleteOwnProperty(Property.MARGIN_LEFT);
96+
childRenderer.setProperty(Property.MARGIN_LEFT, childRenderer.getProperty(Property.MARGIN_LEFT, 0f) + maxSymbolWidth + (symbolIndent != null ? symbolIndent : 0f));
97+
if (childRenderer.getModelElement() instanceof ListItem) {
98+
IRenderer symbolRenderer = symbolRenderers.get(listItemNum++);
99+
((ListItemRenderer) childRenderer).addSymbolRenderer(symbolRenderer, maxSymbolWidth);
100+
}
99101
}
100102
}
101103

@@ -107,6 +109,20 @@ public IRenderer getNextRenderer() {
107109
return new ListRenderer((com.itextpdf.layout.element.List) modelElement);
108110
}
109111

112+
@Override
113+
protected AbstractRenderer createSplitRenderer(int layoutResult) {
114+
AbstractRenderer splitRenderer = super.createSplitRenderer(layoutResult);
115+
splitRenderer.setProperty(Property.LIST_SYMBOLS_INITIALIZED, Boolean.valueOf(true));
116+
return splitRenderer;
117+
}
118+
119+
@Override
120+
protected AbstractRenderer createOverflowRenderer(int layoutResult) {
121+
AbstractRenderer overflowRenderer = super.createOverflowRenderer(layoutResult);
122+
overflowRenderer.setProperty(Property.LIST_SYMBOLS_INITIALIZED, Boolean.valueOf(true));
123+
return overflowRenderer;
124+
}
125+
110126
protected IRenderer makeListSymbolRenderer(int index, IRenderer renderer) {
111127
Object defaultListSymbol = renderer.getProperty(Property.LIST_SYMBOL);
112128
if (defaultListSymbol instanceof Text) {

0 commit comments

Comments
 (0)