Skip to content

Commit 9cbd170

Browse files
SnipxiText-CI
authored andcommitted
Prepare TargetCounterHandler to used from pure layout code
DEVSIX-5502 Autoported commit. Original commit hash: [e1a238052]
1 parent c25ffdd commit 9cbd170

File tree

5 files changed

+83
-5
lines changed

5 files changed

+83
-5
lines changed

itext.tests/itext.layout.tests/itext/layout/renderer/TargetCounterHandlerTest.cs

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ You should have received a copy of the GNU Affero General Public License
2525
using iText.IO.Image;
2626
using iText.Kernel.Font;
2727
using iText.Kernel.Geom;
28+
using iText.Kernel.Pdf;
29+
using iText.Kernel.Utils;
30+
using iText.Layout;
2831
using iText.Layout.Element;
2932
using iText.Layout.Layout;
3033
using iText.Layout.Properties;
@@ -33,6 +36,17 @@ You should have received a copy of the GNU Affero General Public License
3336

3437
namespace iText.Layout.Renderer {
3538
public class TargetCounterHandlerTest : ExtendedITextTest {
39+
public static readonly String SOURCE_FOLDER = iText.Test.TestUtil.GetParentProjectDirectory(NUnit.Framework.TestContext
40+
.CurrentContext.TestDirectory) + "/resources/itext/layout/renderer/TargetCounterHandlerTest/";
41+
42+
public static readonly String DESTINATION_FOLDER = NUnit.Framework.TestContext.CurrentContext.TestDirectory
43+
+ "/test/itext/layout/renderer/TargetCounterHandlerTest/";
44+
45+
[NUnit.Framework.OneTimeSetUp]
46+
public static void BeforeClass() {
47+
CreateDestinationFolder(DESTINATION_FOLDER);
48+
}
49+
3650
[NUnit.Framework.Test]
3751
public virtual void BlockRendererAddByIDTest() {
3852
DocumentRenderer documentRenderer = new DocumentRenderer(null);
@@ -117,5 +131,62 @@ public virtual void LineRendererAddByIDTest() {
117131
documentRenderer.GetTargetCounterHandler().PrepareHandlerToRelayout();
118132
NUnit.Framework.Assert.AreEqual((int?)4, TargetCounterHandler.GetPageByID(lineRenderer, id));
119133
}
134+
135+
[NUnit.Framework.Test]
136+
public virtual void TargetCounterHandlerEndToEndLayoutTest() {
137+
String targetPdf = DESTINATION_FOLDER + "targetCounterHandlerEndToEndLayoutTest.pdf";
138+
String cmpPdf = SOURCE_FOLDER + "cmp_targetCounterHandlerEndToEndLayoutTest.pdf";
139+
Document document = new Document(new PdfDocument(new PdfWriter(targetPdf)), PageSize.A4, false);
140+
Text pageNumPlaceholder = new Text("x");
141+
String id = "1";
142+
pageNumPlaceholder.SetProperty(Property.ID, id);
143+
pageNumPlaceholder.SetNextRenderer(new TargetCounterHandlerTest.TargetCounterAwareTextRenderer(pageNumPlaceholder
144+
));
145+
Paragraph intro = new Paragraph("The paragraph is on page ").Add(pageNumPlaceholder);
146+
document.Add(intro);
147+
document.Add(new AreaBreak());
148+
Paragraph text = new Paragraph("This is main text");
149+
text.SetProperty(Property.ID, id);
150+
text.SetNextRenderer(new TargetCounterHandlerTest.TargetCounterAwareParagraphRenderer(text));
151+
document.Add(text);
152+
document.Relayout();
153+
document.Close();
154+
NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(targetPdf, cmpPdf, DESTINATION_FOLDER, "diff"
155+
));
156+
}
157+
158+
private class TargetCounterAwareTextRenderer : TextRenderer {
159+
public TargetCounterAwareTextRenderer(Text link)
160+
: base(link) {
161+
}
162+
163+
public override LayoutResult Layout(LayoutContext layoutContext) {
164+
int? targetPageNumber = TargetCounterHandler.GetPageByID(this, this.GetProperty<String>(Property.ID));
165+
if (targetPageNumber != null) {
166+
SetText(targetPageNumber.ToString());
167+
}
168+
return base.Layout(layoutContext);
169+
}
170+
171+
public override IRenderer GetNextRenderer() {
172+
return new TargetCounterHandlerTest.TargetCounterAwareTextRenderer((Text)GetModelElement());
173+
}
174+
}
175+
176+
private class TargetCounterAwareParagraphRenderer : ParagraphRenderer {
177+
public TargetCounterAwareParagraphRenderer(Paragraph modelElement)
178+
: base(modelElement) {
179+
}
180+
181+
public override IRenderer GetNextRenderer() {
182+
return new TargetCounterHandlerTest.TargetCounterAwareParagraphRenderer((Paragraph)modelElement);
183+
}
184+
185+
public override LayoutResult Layout(LayoutContext layoutContext) {
186+
LayoutResult result = base.Layout(layoutContext);
187+
TargetCounterHandler.AddPageByID(this);
188+
return result;
189+
}
190+
}
120191
}
121192
}

itext/itext.layout/itext/layout/Document.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,9 @@ public virtual void Relayout() {
220220
if (immediateFlush) {
221221
throw new InvalidOperationException("Operation not supported with immediate flush");
222222
}
223+
if (rootRenderer is DocumentRenderer) {
224+
((DocumentRenderer)rootRenderer).GetTargetCounterHandler().PrepareHandlerToRelayout();
225+
}
223226
IRenderer nextRelayoutRenderer = rootRenderer != null ? rootRenderer.GetNextRenderer() : null;
224227
if (nextRelayoutRenderer == null || !(nextRelayoutRenderer is RootRenderer)) {
225228
nextRelayoutRenderer = new DocumentRenderer(this, immediateFlush);

itext/itext.layout/itext/layout/renderer/DocumentRenderer.cs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,10 @@ public override LayoutArea GetOccupiedArea() {
9898
/// </summary>
9999
/// <returns>relayout renderer.</returns>
100100
public override IRenderer GetNextRenderer() {
101-
return new iText.Layout.Renderer.DocumentRenderer(document, immediateFlush);
101+
iText.Layout.Renderer.DocumentRenderer renderer = new iText.Layout.Renderer.DocumentRenderer(document, immediateFlush
102+
);
103+
renderer.targetCounterHandler = new TargetCounterHandler(targetCounterHandler);
104+
return renderer;
102105
}
103106

104107
protected internal override LayoutArea UpdateCurrentArea(LayoutResult overflowResult) {
@@ -171,7 +174,8 @@ protected internal virtual PageSize AddNewPage(PageSize customPageSize) {
171174
/// <summary>Adds some pages so that the overall number is at least n.</summary>
172175
/// <remarks>
173176
/// Adds some pages so that the overall number is at least n.
174-
/// Returns the page size of the n'th page.
177+
/// Returns the page size of the page number
178+
/// <paramref name="n"/>.
175179
/// </remarks>
176180
private PageSize EnsureDocumentHasNPages(int n, PageSize customPageSize) {
177181
PageSize lastPageSize = null;
@@ -191,8 +195,8 @@ private Rectangle GetCurrentPageEffectiveArea(PageSize pageSize) {
191195
}
192196

193197
private void MoveToNextPage() {
194-
// We don't flush this page immediately, but only flush previous one because of manipulations with areas in case
195-
// of keepTogether property.
198+
// We don't flush this page immediately, but only flush previous one because of manipulations
199+
// with areas in case of keepTogether property.
196200
if (immediateFlush && currentPageNumber > 1) {
197201
document.GetPdfDocument().GetPage(currentPageNumber - 1).Flush();
198202
}

port-hash

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
a009bcd1103b8b23197dc80b02686acbe3fc9c0e
1+
e1a23805224ab56798adce94240ba5958890c466

0 commit comments

Comments
 (0)