Skip to content

Commit 89ebd13

Browse files
author
Eugene Bochilo
committed
Add support of pages target-counter(s). Finalize whole target-counter logic
DEVSIX-4692
1 parent 169e929 commit 89ebd13

File tree

5 files changed

+128
-24
lines changed

5 files changed

+128
-24
lines changed

kernel/src/main/java/com/itextpdf/kernel/numbering/AlphabetNumbering.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,19 +69,19 @@ public static String toAlphabetNumber(int number, char[] alphabet) {
6969

7070
number--;
7171
int bytes = 1;
72-
int start = 0;
73-
int symbols = cardinality;
72+
long start = 0;
73+
long symbols = cardinality;
7474

7575
while (number >= symbols + start) {
7676
bytes++;
7777
start += symbols;
7878
symbols *= cardinality;
7979
}
8080

81-
int c = number - start;
81+
long c = number - start;
8282
char[] value = new char[bytes];
8383
while (bytes > 0) {
84-
value[--bytes] = alphabet[c % cardinality];
84+
value[--bytes] = alphabet[(int) (c % cardinality)];
8585
c /= cardinality;
8686
}
8787

kernel/src/test/java/com/itextpdf/kernel/numbering/GreekAlphabetNumberingTest.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ This file is part of the iText (R) project.
4242
*/
4343
package com.itextpdf.kernel.numbering;
4444

45-
import com.itextpdf.kernel.numbering.GreekAlphabetNumbering;
4645
import com.itextpdf.test.ExtendedITextTest;
4746
import com.itextpdf.test.annotations.type.UnitTest;
4847
import org.junit.Assert;
@@ -91,4 +90,9 @@ public void testLowerCaseSymbol() {
9190
// Symbol font use regular WinAnsi codes for greek letters.
9291
Assert.assertEquals("abgdezhqiklmnxoprstufcywaa", builder.toString());
9392
}
93+
94+
@Test
95+
public void intIsNotEnoughForInternalCalculationsTest() {
96+
Assert.assertEquals("ζλαββωσ", GreekAlphabetNumbering.toGreekAlphabetNumberLowerCase(1234567890));
97+
}
9498
}

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

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,7 @@ public class TargetCounterHandler {
3737
*/
3838
private Map<String, Integer> renderersPages = new HashMap<>();
3939

40-
/**
41-
* Indicates if relayout is required.
42-
*/
43-
private boolean isRelayoutRequired = false;
40+
private Map<String, Integer> previousRenderersPages = new HashMap<>();
4441

4542
/**
4643
* Creates a copy of the given {@link TargetCounterHandler} instance.
@@ -49,6 +46,7 @@ public class TargetCounterHandler {
4946
*/
5047
public TargetCounterHandler(TargetCounterHandler targetCounterHandler) {
5148
this.renderersPages = targetCounterHandler.renderersPages;
49+
this.previousRenderersPages = targetCounterHandler.previousRenderersPages;
5250
}
5351

5452
/**
@@ -66,12 +64,8 @@ public static void addPageByID(IRenderer renderer) {
6664
if (id != null) {
6765
final TargetCounterHandler targetCounterHandler = getTargetCounterHandler(renderer);
6866
if (targetCounterHandler != null && renderer.getOccupiedArea() != null) {
69-
final Integer prevPageNumber = targetCounterHandler.renderersPages.get(id);
7067
final int currentPageNumber = renderer.getOccupiedArea().getPageNumber();
71-
if (prevPageNumber == null || currentPageNumber > prevPageNumber) {
72-
targetCounterHandler.renderersPages.put(id, currentPageNumber);
73-
targetCounterHandler.isRelayoutRequired = true;
74-
}
68+
targetCounterHandler.renderersPages.put(id, currentPageNumber);
7569
}
7670
}
7771
}
@@ -85,7 +79,7 @@ public static void addPageByID(IRenderer renderer) {
8579
*/
8680
public static Integer getPageByID(IRenderer renderer, String id) {
8781
final TargetCounterHandler targetCounterHandler = getTargetCounterHandler(renderer);
88-
return targetCounterHandler == null ? null : targetCounterHandler.renderersPages.get(id);
82+
return targetCounterHandler == null ? null : targetCounterHandler.previousRenderersPages.get(id);
8983
}
9084

9185
/**
@@ -95,7 +89,7 @@ public static Integer getPageByID(IRenderer renderer, String id) {
9589
* @param id target id
9690
* @return true if value is defined for this id, false otherwise
9791
*/
98-
public static boolean isValueDefinedForThisID(IRenderer renderer, String id) {
92+
public static boolean isValueDefinedForThisId(IRenderer renderer, String id) {
9993
final TargetCounterHandler targetCounterHandler = getTargetCounterHandler(renderer);
10094
return targetCounterHandler != null && targetCounterHandler.renderersPages.containsKey(id);
10195
}
@@ -106,7 +100,19 @@ public static boolean isValueDefinedForThisID(IRenderer renderer, String id) {
106100
* @return true if relayout is required, false otherwise
107101
*/
108102
public boolean isRelayoutRequired() {
109-
return isRelayoutRequired;
103+
for (Map.Entry<String, Integer> rendererPage : renderersPages.entrySet()) {
104+
if (!rendererPage.getValue().equals(previousRenderersPages.get(rendererPage.getKey()))) {
105+
return true;
106+
}
107+
}
108+
return false;
109+
}
110+
111+
/**
112+
* Prepares handler to relayout.
113+
*/
114+
public void prepareHandlerToRelayout() {
115+
previousRenderersPages = new HashMap<>(renderersPages);
110116
}
111117

112118
private static TargetCounterHandler getTargetCounterHandler(IRenderer renderer) {

layout/src/test/java/com/itextpdf/layout/renderer/TargetCounterHandlerTest.java

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,18 +48,21 @@ public class TargetCounterHandlerTest extends ExtendedITextTest {
4848

4949
@Test
5050
public void BlockRendererAddByIDTest() {
51+
DocumentRenderer documentRenderer = new DocumentRenderer(null);
5152
DivRenderer divRenderer = new DivRenderer(new Div());
52-
divRenderer.setParent(new DocumentRenderer(null));
53+
divRenderer.setParent(documentRenderer);
5354
String id = "id5";
5455
divRenderer.setProperty(Property.ID, id);
5556
LayoutContext layoutContext = new LayoutContext(new LayoutArea(4, new Rectangle(50, 50)));
5657
divRenderer.layout(layoutContext);
5758

59+
documentRenderer.getTargetCounterHandler().prepareHandlerToRelayout();
5860
Assert.assertEquals((Integer) 4, TargetCounterHandler.getPageByID(divRenderer, id));
5961
}
6062

6163
@Test
6264
public void TextRendererAddByIDTest() throws IOException {
65+
DocumentRenderer documentRenderer = new DocumentRenderer(null);
6366
TextRenderer textRenderer = new TextRenderer(new Text("a"));
6467

6568
textRenderer.setProperty(Property.TEXT_RISE, 20F);
@@ -68,57 +71,69 @@ public void TextRendererAddByIDTest() throws IOException {
6871
textRenderer.setProperty(Property.FONT, PdfFontFactory.createFont(StandardFonts.HELVETICA));
6972
textRenderer.setProperty(Property.FONT_SIZE, new UnitValue(UnitValue.POINT, 20));
7073

71-
textRenderer.setParent(new DocumentRenderer(null));
74+
textRenderer.setParent(documentRenderer);
7275
String id = "id7";
7376
textRenderer.setProperty(Property.ID, id);
7477
LayoutContext layoutContext = new LayoutContext(new LayoutArea(4, new Rectangle(50, 50)));
7578
textRenderer.layout(layoutContext);
7679

80+
documentRenderer.getTargetCounterHandler().prepareHandlerToRelayout();
7781
Assert.assertEquals((Integer) 4, TargetCounterHandler.getPageByID(textRenderer, id));
7882
}
7983

8084
@Test
8185
public void TableRendererAddByIDTest() {
86+
DocumentRenderer documentRenderer = new DocumentRenderer(null);
8287
TableRenderer tableRenderer = new TableRenderer(new Table(5));
83-
tableRenderer.setParent(new DocumentRenderer(null));
88+
tableRenderer.setParent(documentRenderer);
8489
String id = "id5";
8590
tableRenderer.setProperty(Property.ID, id);
8691
LayoutContext layoutContext = new LayoutContext(new LayoutArea(4, new Rectangle(50, 50)));
8792
tableRenderer.layout(layoutContext);
8893

94+
documentRenderer.getTargetCounterHandler().prepareHandlerToRelayout();
8995
Assert.assertEquals((Integer) 4, TargetCounterHandler.getPageByID(tableRenderer, id));
9096
}
9197

9298
@Test
9399
public void ParagraphRendererAddByIDTest() {
100+
DocumentRenderer documentRenderer = new DocumentRenderer(null);
94101
ParagraphRenderer paragraphRenderer = new ParagraphRenderer(new Paragraph());
95-
paragraphRenderer.setParent(new DocumentRenderer(null));
102+
paragraphRenderer.setParent(documentRenderer);
96103
String id = "id5";
97104
paragraphRenderer.setProperty(Property.ID, id);
98105
LayoutContext layoutContext = new LayoutContext(new LayoutArea(4, new Rectangle(50, 50)));
99106
paragraphRenderer.layout(layoutContext);
107+
108+
documentRenderer.getTargetCounterHandler().prepareHandlerToRelayout();
100109
Assert.assertEquals((Integer) 4, TargetCounterHandler.getPageByID(paragraphRenderer, id));
101110
}
102111

103112
@Test
104113
public void ImageRendererAddByIDTest() {
114+
DocumentRenderer documentRenderer = new DocumentRenderer(null);
105115
ImageRenderer imageRenderer = new ImageRenderer(new Image(ImageDataFactory.createRawImage(new byte[]{50, 21})));
106-
imageRenderer.setParent(new DocumentRenderer(null));
116+
imageRenderer.setParent(documentRenderer);
107117
String id = "id6";
108118
imageRenderer.setProperty(Property.ID, id);
109119
LayoutContext layoutContext = new LayoutContext(new LayoutArea(4, new Rectangle(50, 50)));
110120
imageRenderer.layout(layoutContext);
121+
122+
documentRenderer.getTargetCounterHandler().prepareHandlerToRelayout();
111123
Assert.assertEquals((Integer) 4, TargetCounterHandler.getPageByID(imageRenderer, id));
112124
}
113125

114126
@Test
115127
public void LineRendererAddByIDTest() {
128+
DocumentRenderer documentRenderer = new DocumentRenderer(null);
116129
LineRenderer lineRenderer = new LineRenderer();
117-
lineRenderer.setParent(new DocumentRenderer(null));
130+
lineRenderer.setParent(documentRenderer);
118131
String id = "id6";
119132
lineRenderer.setProperty(Property.ID, id);
120133
LayoutContext layoutContext = new LayoutContext(new LayoutArea(4, new Rectangle(50, 50)));
121134
lineRenderer.layout(layoutContext);
135+
136+
documentRenderer.getTargetCounterHandler().prepareHandlerToRelayout();
122137
Assert.assertEquals((Integer) 4, TargetCounterHandler.getPageByID(lineRenderer, id));
123138
}
124139
}

layout/src/test/java/com/itextpdf/layout/renderer/TargetCounterHandlerUnitTest.java

Lines changed: 80 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,38 @@ public LayoutArea getOccupiedArea() {
7171
Assert.assertNull(page);
7272
}
7373

74+
@Test
75+
public void isValueDefinedForThisIdNotDocumentRendererTest() {
76+
RootRenderer documentRenderer = new RootRenderer() {
77+
78+
@Override
79+
public IRenderer getNextRenderer() {
80+
return null;
81+
}
82+
83+
@Override
84+
protected void flushSingleRenderer(IRenderer resultRenderer) {
85+
}
86+
87+
@Override
88+
protected LayoutArea updateCurrentArea(LayoutResult overflowResult) {
89+
return null;
90+
}
91+
};
92+
final String id = "id";
93+
94+
IRenderer renderer = new TextRenderer(new Text("renderer")) {
95+
@Override
96+
public LayoutArea getOccupiedArea() {
97+
return null;
98+
}
99+
};
100+
renderer.setParent(documentRenderer);
101+
renderer.setProperty(Property.ID, id);
102+
103+
Assert.assertFalse(TargetCounterHandler.isValueDefinedForThisId(renderer, id));
104+
}
105+
74106
@Test
75107
public void addAndGetPageByDestinationNullOccupiedAreaTest() {
76108
DocumentRenderer documentRenderer = new DocumentRenderer(null);
@@ -107,6 +139,7 @@ public LayoutArea getOccupiedArea() {
107139
TargetCounterHandler.addPageByID(renderer);
108140
TargetCounterHandler.addPageByID(renderer);
109141

142+
documentRenderer.getTargetCounterHandler().prepareHandlerToRelayout();
110143
Integer page = TargetCounterHandler.getPageByID(renderer, id);
111144
Assert.assertEquals((Integer) 8, page);
112145
}
@@ -128,8 +161,9 @@ public LayoutArea getOccupiedArea() {
128161
TargetCounterHandler.addPageByID(renderer);
129162
TargetCounterHandler.addPageByID(renderer);
130163

164+
documentRenderer.getTargetCounterHandler().prepareHandlerToRelayout();
131165
Integer page = TargetCounterHandler.getPageByID(renderer, id);
132-
Assert.assertEquals((Integer) 4, page);
166+
Assert.assertEquals((Integer) 2, page);
133167
}
134168

135169
@Test
@@ -148,6 +182,7 @@ public LayoutArea getOccupiedArea() {
148182
renderer.setProperty(Property.ID, id);
149183
TargetCounterHandler.addPageByID(renderer);
150184

185+
documentRenderer.getTargetCounterHandler().prepareHandlerToRelayout();
151186
Integer page = TargetCounterHandler.getPageByID(renderer, id);
152187
Assert.assertEquals((Integer) expectedPage, page);
153188

@@ -172,7 +207,51 @@ public LayoutArea getOccupiedArea() {
172207
};
173208
renderer.setParent(documentRenderer);
174209
renderer.setProperty(Property.ID, id);
210+
Assert.assertFalse(documentRenderer.isRelayoutRequired());
175211
TargetCounterHandler.addPageByID(renderer);
176212
Assert.assertTrue(documentRenderer.isRelayoutRequired());
213+
documentRenderer.getTargetCounterHandler().prepareHandlerToRelayout();
214+
Assert.assertFalse(documentRenderer.isRelayoutRequired());
215+
}
216+
217+
@Test
218+
public void copyConstructorTest() {
219+
DocumentRenderer documentRenderer = new DocumentRenderer(null);
220+
String id = "id";
221+
222+
IRenderer renderer = new TextRenderer(new Text("renderer")) {
223+
224+
@Override
225+
public LayoutArea getOccupiedArea() {
226+
int page = 4;
227+
return new LayoutArea(page, new Rectangle(50, 50));
228+
}
229+
};
230+
renderer.setParent(documentRenderer);
231+
renderer.setProperty(Property.ID, id);
232+
TargetCounterHandler.addPageByID(renderer);
233+
TargetCounterHandler copy = new TargetCounterHandler(documentRenderer.getTargetCounterHandler());
234+
Assert.assertTrue(copy.isRelayoutRequired());
235+
}
236+
237+
@Test
238+
public void isValueDefinedForThisId() {
239+
DocumentRenderer documentRenderer = new DocumentRenderer(null);
240+
String id = "id";
241+
String notAddedId = "not added id";
242+
243+
IRenderer renderer = new TextRenderer(new Text("renderer")) {
244+
245+
@Override
246+
public LayoutArea getOccupiedArea() {
247+
int page = 4;
248+
return new LayoutArea(page, new Rectangle(50, 50));
249+
}
250+
};
251+
renderer.setParent(documentRenderer);
252+
renderer.setProperty(Property.ID, id);
253+
TargetCounterHandler.addPageByID(renderer);
254+
Assert.assertTrue(TargetCounterHandler.isValueDefinedForThisId(renderer, id));
255+
Assert.assertFalse(TargetCounterHandler.isValueDefinedForThisId(renderer, notAddedId));
177256
}
178257
}

0 commit comments

Comments
 (0)