Skip to content

Commit ff71d20

Browse files
ars18wrwiText-CI
authored andcommitted
Consider min and max container's heights while processing line's cross size
DEVSIX-5178
1 parent fcaed1f commit ff71d20

10 files changed

+84
-14
lines changed

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

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -102,8 +102,9 @@ public static List<List<FlexItemInfo>> calculateChildrenRectangles(Rectangle fle
102102
mainSize = layoutBox.getWidth();
103103
}
104104
// We need to have crossSize only if its value is definite.
105-
// The calculation differs from width calculation because if width isn't definite, parent's width shall be taken
106-
Float crossSize = flexContainerRenderer.retrieveMinHeight();
105+
Float crossSize = flexContainerRenderer.retrieveHeight();
106+
Float minCrossSize = flexContainerRenderer.retrieveMinHeight();
107+
Float maxCrossSize = flexContainerRenderer.retrieveMaxHeight();
107108

108109
determineFlexBasisAndHypotheticalMainSizeForFlexItems(flexItemCalculationInfos, (float) mainSize);
109110

@@ -130,7 +131,8 @@ public static List<List<FlexItemInfo>> calculateChildrenRectangles(Rectangle fle
130131
determineHypotheticalCrossSizeForFlexItems(lines);
131132

132133
// 8. Calculate the cross size of each flex line.
133-
List<Float> lineCrossSizes = calculateCrossSizeOfEachFlexLine(lines, isSingleLine, crossSize);
134+
List<Float> lineCrossSizes =
135+
calculateCrossSizeOfEachFlexLine(lines, isSingleLine, minCrossSize, crossSize, maxCrossSize);
134136

135137
// TODO DEVSIX-5003 min/max height calculations are not supported
136138
// If the flex container is single-line, then clamp the line’s cross-size to be within
@@ -409,7 +411,7 @@ static void determineHypotheticalCrossSizeForFlexItems(List<List<FlexItemCalcula
409411
}
410412

411413
static List<Float> calculateCrossSizeOfEachFlexLine(List<List<FlexItemCalculationInfo>> lines,
412-
boolean isSingleLine, Float crossSize) {
414+
boolean isSingleLine, Float minCrossSize, Float crossSize, Float maxCrossSize) {
413415
List<Float> lineCrossSizes = new ArrayList<>();
414416
if (isSingleLine && crossSize != null && !lines.isEmpty()) {
415417
lineCrossSizes.add((float) crossSize);
@@ -435,6 +437,17 @@ static List<Float> calculateCrossSizeOfEachFlexLine(List<List<FlexItemCalculatio
435437
}
436438
flexLinesCrossSize = Math.max(0, largestHypotheticalCrossSize);
437439
}
440+
441+
// 3. If the flex container is single-line, then clamp the line’s cross-size to be
442+
// within the container’s computed min and max cross sizes
443+
if (isSingleLine && !lines.isEmpty()) {
444+
if (null != minCrossSize) {
445+
flexLinesCrossSize = Math.max((float) minCrossSize, flexLinesCrossSize);
446+
}
447+
if (null != maxCrossSize) {
448+
flexLinesCrossSize = Math.min((float) maxCrossSize, flexLinesCrossSize);
449+
}
450+
}
438451
lineCrossSizes.add(flexLinesCrossSize);
439452
}
440453
}

layout/src/test/java/com/itextpdf/layout/element/FlexContainerTest.java

Lines changed: 67 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,16 +31,8 @@ This file is part of the iText (R) project.
3131
import com.itextpdf.layout.Document;
3232
import com.itextpdf.layout.Style;
3333
import com.itextpdf.layout.borders.SolidBorder;
34-
import com.itextpdf.layout.element.AreaBreak;
35-
import com.itextpdf.layout.element.Div;
36-
import com.itextpdf.layout.element.FlexContainer;
37-
import com.itextpdf.layout.element.IElement;
38-
import com.itextpdf.layout.element.Image;
39-
import com.itextpdf.layout.element.List;
40-
import com.itextpdf.layout.element.Paragraph;
41-
import com.itextpdf.layout.element.Table;
42-
import com.itextpdf.layout.property.Background;
4334
import com.itextpdf.layout.property.AlignmentPropertyValue;
35+
import com.itextpdf.layout.property.Background;
4436
import com.itextpdf.layout.property.JustifyContent;
4537
import com.itextpdf.layout.property.ListNumberingType;
4638
import com.itextpdf.layout.property.OverflowPropertyValue;
@@ -50,13 +42,15 @@ This file is part of the iText (R) project.
5042
import com.itextpdf.test.annotations.LogMessage;
5143
import com.itextpdf.test.annotations.LogMessages;
5244
import com.itextpdf.test.annotations.type.IntegrationTest;
45+
46+
import java.io.IOException;
47+
import java.util.Arrays;
5348
import org.junit.Assert;
5449
import org.junit.BeforeClass;
5550
import org.junit.Test;
5651
import org.junit.experimental.categories.Category;
5752
import org.junit.runner.RunWith;
5853
import org.junit.runners.Parameterized;
59-
6054
import java.io.IOException;
6155
import java.util.Arrays;
6256

@@ -870,6 +864,69 @@ public void respectFlexContainersWidthTest() throws IOException, InterruptedExce
870864
Assert.assertNull(new CompareTool().compareByContent(outFileName, cmpFileName, destinationFolder, "diff"));
871865
}
872866

867+
@Test
868+
public void flexItemsMinHeightShouldBeOverriddenTest() throws IOException, InterruptedException {
869+
String outFileName = destinationFolder + "flexItemsMinHeightShouldBeOverriddenTest" + testNumber + ".pdf";
870+
String cmpFileName = sourceFolder + "cmp_flexItemsMinHeightShouldBeOverriddenTest" + testNumber + ".pdf";
871+
PdfDocument pdfDocument = new PdfDocument(new PdfWriter(outFileName));
872+
873+
Document document = new Document(pdfDocument);
874+
875+
Div flexContainer = createFlexContainer();
876+
877+
flexContainer.add(new Div().setWidth(100).setBackgroundColor(ColorConstants.BLUE).setHeight(100));
878+
flexContainer.add(new Div().setWidth(100).setBackgroundColor(ColorConstants.YELLOW).setMinHeight(20));
879+
document.add(flexContainer);
880+
881+
document.close();
882+
883+
Assert.assertNull(new CompareTool().compareByContent(outFileName, cmpFileName, destinationFolder, "diff"));
884+
}
885+
886+
@Test
887+
public void linesMinHeightShouldBeRespectedTest() throws IOException, InterruptedException {
888+
String outFileName = destinationFolder + "linesMinHeightShouldBeRespectedTest" + testNumber + ".pdf";
889+
String cmpFileName = sourceFolder + "cmp_linesMinHeightShouldBeRespectedTest" + testNumber + ".pdf";
890+
PdfDocument pdfDocument = new PdfDocument(new PdfWriter(outFileName));
891+
892+
Document document = new Document(pdfDocument);
893+
894+
Div flexContainer = createFlexContainer();
895+
flexContainer.setMinHeight(100);
896+
897+
Div child = new Div().setWidth(100).setBackgroundColor(ColorConstants.BLUE);
898+
child.add(new Paragraph().setWidth(100).setBackgroundColor(ColorConstants.YELLOW));
899+
flexContainer.add(child);
900+
901+
document.add(flexContainer);
902+
903+
document.close();
904+
905+
Assert.assertNull(new CompareTool().compareByContent(outFileName, cmpFileName, destinationFolder, "diff"));
906+
}
907+
908+
@Test
909+
public void linesMaxHeightShouldBeRespectedTest() throws IOException, InterruptedException {
910+
String outFileName = destinationFolder + "linesMaxHeightShouldBeRespectedTest" + testNumber + ".pdf";
911+
String cmpFileName = sourceFolder + "cmp_linesMaxHeightShouldBeRespectedTest" + testNumber + ".pdf";
912+
PdfDocument pdfDocument = new PdfDocument(new PdfWriter(outFileName));
913+
914+
Document document = new Document(pdfDocument);
915+
916+
Div flexContainer = createFlexContainer();
917+
flexContainer.setMaxHeight(100);
918+
919+
Div child = new Div().setWidth(100).setBackgroundColor(ColorConstants.BLUE).setHeight(150);
920+
child.add(new Paragraph().setWidth(100).setBackgroundColor(ColorConstants.YELLOW));
921+
flexContainer.add(child);
922+
923+
document.add(flexContainer);
924+
925+
document.close();
926+
927+
Assert.assertNull(new CompareTool().compareByContent(outFileName, cmpFileName, destinationFolder, "diff"));
928+
}
929+
873930
private Div getFlexContainer(OverflowPropertyValue overflowX, Style style) {
874931
FlexContainer flexContainer = createFlexContainer();
875932
flexContainer

0 commit comments

Comments
 (0)