Skip to content

Commit 06dd11d

Browse files
author
Egor Martsynkovsky
committed
Refactor method for duplication
Remove ToDo statements Add test for logging DEVSIX-6108
1 parent 6adb924 commit 06dd11d

File tree

2 files changed

+133
-40
lines changed

2 files changed

+133
-40
lines changed

layout/src/main/java/com/itextpdf/layout/margincollapse/MarginsCollapseHandler.java

Lines changed: 41 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -207,8 +207,8 @@ public void endChildMarginsHandling(Rectangle layoutBox) {
207207
}
208208

209209
public void startMarginsCollapse(Rectangle parentBBox) {
210-
collapseInfo.getCollapseBefore().joinMargin(getModelTopMargin(renderer));
211-
collapseInfo.getCollapseAfter().joinMargin(getModelBottomMargin(renderer));
210+
collapseInfo.getCollapseBefore().joinMargin(defineTopMarginValueForCollapse(renderer));
211+
collapseInfo.getCollapseAfter().joinMargin(defineBottomMarginValueForCollapse(renderer));
212212

213213
if (!firstChildMarginAdjoinedToParent(renderer)) {
214214
float topIndent = collapseInfo.getCollapseBefore().getCollapsedMarginsSize();
@@ -253,7 +253,7 @@ public void endMarginsCollapse(Rectangle layoutBox) {
253253
} else {
254254
ownCollapseAfter = new MarginsCollapse();
255255
}
256-
ownCollapseAfter.joinMargin(getModelBottomMargin(renderer));
256+
ownCollapseAfter.joinMargin(defineBottomMarginValueForCollapse(renderer));
257257
collapseInfo.setOwnCollapseAfter(ownCollapseAfter);
258258

259259
if (collapseInfo.isSelfCollapsing()) {
@@ -544,33 +544,19 @@ private static boolean hasPositiveHeight(IRenderer renderer) {
544544
}
545545

546546
private static boolean hasTopPadding(IRenderer renderer) {
547-
UnitValue padding = renderer.getModelElement().<UnitValue>getProperty(Property.PADDING_TOP);
548-
if (null != padding && !padding.isPointValue()) {
549-
Logger logger = LoggerFactory.getLogger(MarginsCollapseHandler.class);
550-
logger.error(MessageFormatUtil.format(IoLogMessageConstant.PROPERTY_IN_PERCENTS_NOT_SUPPORTED,
551-
Property.PADDING_TOP));
552-
}
553-
return padding != null && padding.getValue() > 0;
547+
return MarginsCollapseHandler.hasPadding(renderer, Property.PADDING_TOP);
554548
}
555549

556550
private static boolean hasBottomPadding(IRenderer renderer) {
557-
UnitValue padding = renderer.getModelElement().<UnitValue>getProperty(Property.PADDING_BOTTOM);
558-
if (null != padding && !padding.isPointValue()) {
559-
Logger logger = LoggerFactory.getLogger(MarginsCollapseHandler.class);
560-
logger.error(MessageFormatUtil.format(IoLogMessageConstant.PROPERTY_IN_PERCENTS_NOT_SUPPORTED,
561-
Property.PADDING_BOTTOM));
562-
}
563-
return padding != null && padding.getValue() > 0;
551+
return MarginsCollapseHandler.hasPadding(renderer, Property.PADDING_BOTTOM);
564552
}
565553

566554
private static boolean hasTopBorders(IRenderer renderer) {
567-
IPropertyContainer modelElement = renderer.getModelElement();
568-
return modelElement.hasProperty(Property.BORDER_TOP) || modelElement.hasProperty(Property.BORDER);
555+
return MarginsCollapseHandler.hasBorders(renderer, Property.BORDER_TOP);
569556
}
570557

571558
private static boolean hasBottomBorders(IRenderer renderer) {
572-
IPropertyContainer modelElement = renderer.getModelElement();
573-
return modelElement.hasProperty(Property.BORDER_BOTTOM) || modelElement.hasProperty(Property.BORDER);
559+
return MarginsCollapseHandler.hasBorders(renderer, Property.BORDER_BOTTOM);
574560
}
575561

576562
private static boolean rendererIsFloated(IRenderer renderer) {
@@ -581,41 +567,56 @@ private static boolean rendererIsFloated(IRenderer renderer) {
581567
return floatPropertyValue != null && !floatPropertyValue.equals(FloatPropertyValue.NONE);
582568
}
583569

584-
private static float getModelTopMargin(IRenderer renderer) {
585-
UnitValue marginUV = renderer.getModelElement().<UnitValue>getProperty(Property.MARGIN_TOP);
586-
if (null != marginUV && !marginUV.isPointValue()) {
587-
Logger logger = LoggerFactory.getLogger(MarginsCollapseHandler.class);
588-
logger.error(MessageFormatUtil.format(IoLogMessageConstant.PROPERTY_IN_PERCENTS_NOT_SUPPORTED,
589-
Property.MARGIN_TOP));
590-
}
591-
// TODO Concerning "renderer instanceof CellRenderer" check: may be try to apply more general solution in future
592-
return marginUV != null && !(renderer instanceof CellRenderer) ? marginUV.getValue() : 0;
570+
private static float defineTopMarginValueForCollapse(IRenderer renderer) {
571+
return MarginsCollapseHandler.defineMarginValueForCollapse(renderer, Property.MARGIN_TOP);
593572
}
594573

595574
private static void ignoreModelTopMargin(IRenderer renderer) {
596-
renderer.setProperty(Property.MARGIN_TOP, UnitValue.createPointValue(0f));
575+
MarginsCollapseHandler.overrideModelTopMargin(renderer, 0f);
597576
}
598577

599578
private static void overrideModelTopMargin(IRenderer renderer, float collapsedMargins) {
600-
renderer.setProperty(Property.MARGIN_TOP, UnitValue.createPointValue(collapsedMargins));
579+
MarginsCollapseHandler.overrideModelMargin(renderer, Property.MARGIN_TOP, collapsedMargins);
601580
}
602581

603-
private static float getModelBottomMargin(IRenderer renderer) {
604-
UnitValue marginUV = renderer.getModelElement().<UnitValue>getProperty(Property.MARGIN_BOTTOM);
582+
private static float defineBottomMarginValueForCollapse(IRenderer renderer) {
583+
return MarginsCollapseHandler.defineMarginValueForCollapse(renderer, Property.MARGIN_BOTTOM);
584+
}
585+
586+
private static void ignoreModelBottomMargin(IRenderer renderer) {
587+
MarginsCollapseHandler.overrideModelBottomMargin(renderer, 0f);
588+
}
589+
590+
private static void overrideModelBottomMargin(IRenderer renderer, float collapsedMargins) {
591+
MarginsCollapseHandler.overrideModelMargin(renderer, Property.MARGIN_BOTTOM, collapsedMargins);
592+
}
593+
594+
private static float defineMarginValueForCollapse(IRenderer renderer, int property) {
595+
UnitValue marginUV = renderer.getModelElement().<UnitValue>getProperty(property);
605596
if (null != marginUV && !marginUV.isPointValue()) {
606597
Logger logger = LoggerFactory.getLogger(MarginsCollapseHandler.class);
607598
logger.error(MessageFormatUtil.format(IoLogMessageConstant.PROPERTY_IN_PERCENTS_NOT_SUPPORTED,
608-
Property.MARGIN_TOP));
599+
property));
609600
}
610-
// TODO Concerning "renderer instanceof CellRenderer" check: may be try to apply more general solution in future
611601
return marginUV != null && !(renderer instanceof CellRenderer) ? marginUV.getValue() : 0;
612602
}
613603

614-
private static void ignoreModelBottomMargin(IRenderer renderer) {
615-
renderer.setProperty(Property.MARGIN_BOTTOM, UnitValue.createPointValue(0f));
604+
private static void overrideModelMargin(IRenderer renderer, int property, float collapsedMargins) {
605+
renderer.setProperty(property, UnitValue.createPointValue(collapsedMargins));
616606
}
617607

618-
private static void overrideModelBottomMargin(IRenderer renderer, float collapsedMargins) {
619-
renderer.setProperty(Property.MARGIN_BOTTOM, UnitValue.createPointValue(collapsedMargins));
608+
private static boolean hasPadding(IRenderer renderer, int property) {
609+
UnitValue padding = renderer.getModelElement().<UnitValue>getProperty(property);
610+
if (null != padding && !padding.isPointValue()) {
611+
Logger logger = LoggerFactory.getLogger(MarginsCollapseHandler.class);
612+
logger.error(MessageFormatUtil.format(IoLogMessageConstant.PROPERTY_IN_PERCENTS_NOT_SUPPORTED,
613+
property));
614+
}
615+
return padding != null && padding.getValue() > 0;
616+
}
617+
618+
private static boolean hasBorders(IRenderer renderer, int property) {
619+
IPropertyContainer modelElement = renderer.getModelElement();
620+
return modelElement.hasProperty(property) || modelElement.hasProperty(Property.BORDER);
620621
}
621622
}
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
/*
2+
This file is part of the iText (R) project.
3+
Copyright (c) 1998-2021 iText Group NV
4+
Authors: Bruno Lowagie, Paulo Soares, et al.
5+
6+
This program is free software; you can redistribute it and/or modify
7+
it under the terms of the GNU Affero General Public License version 3
8+
as published by the Free Software Foundation with the addition of the
9+
following permission added to Section 15 as permitted in Section 7(a):
10+
FOR ANY PART OF THE COVERED WORK IN WHICH THE COPYRIGHT IS OWNED BY
11+
ITEXT GROUP. ITEXT GROUP DISCLAIMS THE WARRANTY OF NON INFRINGEMENT
12+
OF THIRD PARTY RIGHTS
13+
14+
This program is distributed in the hope that it will be useful, but
15+
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16+
or FITNESS FOR A PARTICULAR PURPOSE.
17+
See the GNU Affero General Public License for more details.
18+
You should have received a copy of the GNU Affero General Public License
19+
along with this program; if not, see http://www.gnu.org/licenses or write to
20+
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21+
Boston, MA, 02110-1301 USA, or download the license from the following URL:
22+
http://itextpdf.com/terms-of-use/
23+
24+
The interactive user interfaces in modified source and object code versions
25+
of this program must display Appropriate Legal Notices, as required under
26+
Section 5 of the GNU Affero General Public License.
27+
28+
In accordance with Section 7(b) of the GNU Affero General Public License,
29+
a covered work must retain the producer line in every PDF that is created
30+
or manipulated using iText.
31+
32+
You can be released from the requirements of the license by purchasing
33+
a commercial license. Buying such a license is mandatory as soon as you
34+
develop commercial activities involving the iText software without
35+
disclosing the source code of your own applications.
36+
These activities include: offering paid services to customers as an ASP,
37+
serving PDFs on the fly in a web application, shipping iText with a closed
38+
source product.
39+
40+
For more information, please contact iText Software Corp. at this
41+
42+
*/
43+
package com.itextpdf.layout.margincollapse;
44+
45+
import com.itextpdf.io.logs.IoLogMessageConstant;
46+
import com.itextpdf.kernel.geom.Rectangle;
47+
import com.itextpdf.layout.element.Paragraph;
48+
import com.itextpdf.layout.properties.Property;
49+
import com.itextpdf.layout.properties.UnitValue;
50+
import com.itextpdf.layout.renderer.ParagraphRenderer;
51+
import com.itextpdf.test.AssertUtil;
52+
import com.itextpdf.test.ExtendedITextTest;
53+
import com.itextpdf.test.annotations.LogMessage;
54+
import com.itextpdf.test.annotations.LogMessages;
55+
import com.itextpdf.test.annotations.type.UnitTest;
56+
57+
import org.junit.Test;
58+
import org.junit.experimental.categories.Category;
59+
60+
@Category(UnitTest.class)
61+
public class MarginsCollapseHandlerTest extends ExtendedITextTest {
62+
63+
@Test
64+
@LogMessages(messages = {
65+
@LogMessage(messageTemplate = IoLogMessageConstant.PROPERTY_IN_PERCENTS_NOT_SUPPORTED, count = 2)
66+
})
67+
// This test's aim is to test message logging.
68+
public void testDefiningMarginCollapse() {
69+
ParagraphRenderer paragraphRenderer = new ParagraphRenderer(new Paragraph());
70+
Rectangle rectangle = new Rectangle(0f, 0f);
71+
paragraphRenderer.getModelElement().setProperty(Property.MARGIN_TOP, UnitValue.createPercentValue(0f));
72+
paragraphRenderer.getModelElement().setProperty(Property.MARGIN_BOTTOM, UnitValue.createPercentValue(0f));
73+
74+
MarginsCollapseHandler marginsCollapseHandler = new MarginsCollapseHandler(paragraphRenderer, null);
75+
AssertUtil.doesNotThrow(() -> marginsCollapseHandler.startMarginsCollapse(rectangle));
76+
}
77+
78+
@Test
79+
@LogMessages(messages = {
80+
@LogMessage(messageTemplate = IoLogMessageConstant.PROPERTY_IN_PERCENTS_NOT_SUPPORTED, count = 2)
81+
})
82+
// This test's aim is to test message logging.
83+
public void testHasPadding() {
84+
ParagraphRenderer paragraphRenderer = new ParagraphRenderer(new Paragraph());
85+
Rectangle rectangle = new Rectangle(0f, 0f);
86+
paragraphRenderer.getModelElement().setProperty(Property.PADDING_TOP, UnitValue.createPercentValue(0f));
87+
paragraphRenderer.getModelElement().setProperty(Property.PADDING_BOTTOM, UnitValue.createPercentValue(0f));
88+
89+
MarginsCollapseHandler marginsCollapseHandler = new MarginsCollapseHandler(paragraphRenderer, null);
90+
AssertUtil.doesNotThrow(() -> marginsCollapseHandler.startMarginsCollapse(rectangle));
91+
}
92+
}

0 commit comments

Comments
 (0)