@@ -84,29 +84,17 @@ public IRenderer getNextRenderer() {
84
84
@ Override
85
85
public LayoutResult layout (LayoutContext layoutContext ) {
86
86
Rectangle layoutContextRectangle = layoutContext .getArea ().getBBox ();
87
- for (final IRenderer childRenderer : this .getChildRenderers ()) {
88
- if (childRenderer instanceof AbstractRenderer ) {
89
- final AbstractRenderer abstractChildRenderer = (AbstractRenderer ) childRenderer ;
90
- abstractChildRenderer .setParent (this );
91
- }
92
- }
93
- Float containerWidth = retrieveWidth (layoutContextRectangle .getWidth ());
94
- if (containerWidth == null ) {
95
- containerWidth = layoutContextRectangle .getWidth ();
96
- }
97
- Float containerHeight = retrieveHeight ();
98
- if (containerHeight == null ) {
99
- containerHeight = layoutContextRectangle .getHeight ();
100
- }
101
- lines = FlexUtil .calculateChildrenRectangles (
102
- new Rectangle ((float ) containerWidth , (float ) containerHeight ), this );
87
+ setThisAsParent (getChildRenderers ());
88
+ lines = FlexUtil .calculateChildrenRectangles (layoutContextRectangle , this );
103
89
final List <UnitValue > previousWidths = new ArrayList <>();
90
+ final List <UnitValue > previousHeights = new ArrayList <>();
104
91
for (final List <FlexItemInfo > line : lines ) {
105
92
for (final FlexItemInfo itemInfo : line ) {
106
93
final Rectangle rectangleWithoutBordersMarginsPaddings =
107
94
itemInfo .getRenderer ().applyMarginsBordersPaddings (itemInfo .getRectangle ().clone (), false );
108
95
109
96
previousWidths .add (itemInfo .getRenderer ().<UnitValue >getProperty (Property .WIDTH ));
97
+ previousHeights .add (itemInfo .getRenderer ().<UnitValue >getProperty (Property .HEIGHT ));
110
98
111
99
itemInfo .getRenderer ().setProperty (Property .WIDTH ,
112
100
UnitValue .createPointValue (rectangleWithoutBordersMarginsPaddings .getWidth ()));
@@ -123,6 +111,7 @@ public LayoutResult layout(LayoutContext layoutContext) {
123
111
for (final List <FlexItemInfo > line : lines ) {
124
112
for (final FlexItemInfo itemInfo : line ) {
125
113
itemInfo .getRenderer ().setProperty (Property .WIDTH , previousWidths .get (counter ));
114
+ itemInfo .getRenderer ().setProperty (Property .HEIGHT , previousHeights .get (counter ));
126
115
++counter ;
127
116
}
128
117
}
@@ -171,19 +160,17 @@ AbstractRenderer[] createSplitAndOverflowRenderers(int childPos, int layoutStatu
171
160
List <IRenderer > waitingOverflowFloatRenderers ) {
172
161
final AbstractRenderer splitRenderer = createSplitRenderer (layoutStatus );
173
162
final AbstractRenderer overflowRenderer = createOverflowRenderer (layoutStatus );
174
- final IRenderer childRenderer = childRenderers .get (childPos );
163
+ final IRenderer childRenderer = getChildRenderers () .get (childPos );
175
164
final boolean forcedPlacement = Boolean .TRUE .equals (this .<Boolean >getProperty (Property .FORCED_PLACEMENT ));
176
165
boolean metChildRenderer = false ;
177
166
for (final List <FlexItemInfo > line : lines ) {
178
167
metChildRenderer = metChildRenderer ||
179
168
line .stream ().anyMatch (flexItem -> flexItem .getRenderer () == childRenderer );
180
169
for (final FlexItemInfo itemInfo : line ) {
181
170
if (metChildRenderer && !forcedPlacement ) {
182
- overflowRenderer .childRenderers .add (itemInfo .getRenderer ());
183
- itemInfo .getRenderer ().setParent (overflowRenderer );
171
+ overflowRenderer .addChildRenderer (itemInfo .getRenderer ());
184
172
} else {
185
- splitRenderer .childRenderers .add (itemInfo .getRenderer ());
186
- itemInfo .getRenderer ().setParent (splitRenderer );
173
+ splitRenderer .addChildRenderer (itemInfo .getRenderer ());
187
174
}
188
175
}
189
176
}
@@ -220,8 +207,7 @@ LayoutResult processNotFullChildResult(LayoutContext layoutContext,
220
207
221
208
if (keepTogether ) {
222
209
splitRenderer = null ;
223
- overflowRenderer .childRenderers .clear ();
224
- overflowRenderer .childRenderers = new ArrayList <>(childRenderers );
210
+ overflowRenderer .setChildRenderers (getChildRenderers ());
225
211
}
226
212
227
213
correctFixedLayout (layoutBox );
@@ -230,17 +216,14 @@ LayoutResult processNotFullChildResult(LayoutContext layoutContext,
230
216
231
217
if (Boolean .TRUE .equals (getPropertyAsBoolean (Property .FORCED_PLACEMENT )) || wasHeightClipped ) {
232
218
if (splitRenderer != null ) {
233
- splitRenderer .childRenderers = new ArrayList <>(childRenderers );
234
- for (final IRenderer childRenderer : splitRenderer .childRenderers ) {
235
- childRenderer .setParent (splitRenderer );
236
- }
219
+ splitRenderer .setChildRenderers (getChildRenderers ());
237
220
}
238
221
return new LayoutResult (LayoutResult .FULL , result .getOccupiedArea (), splitRenderer , null , null );
239
222
} else {
240
223
applyPaddings (occupiedArea .getBBox (), paddings , true );
241
224
applyBorderBox (occupiedArea .getBBox (), borders , true );
242
225
applyMargins (occupiedArea .getBBox (), true );
243
- if (splitRenderer == null || splitRenderer .childRenderers .isEmpty ()) {
226
+ if (splitRenderer == null || splitRenderer .getChildRenderers () .isEmpty ()) {
244
227
return new LayoutResult (LayoutResult .NOTHING , null , null , overflowRenderer ,
245
228
result .getCauseOfNothing ()).setAreaBreak (result .getAreaBreak ());
246
229
} else {
@@ -255,18 +238,55 @@ boolean stopLayoutingChildrenIfChildResultNotFull(LayoutResult returnResult) {
255
238
return returnResult .getStatus () != LayoutResult .FULL ;
256
239
}
257
240
241
+ @ Override
242
+ void recalculateOccupiedAreaAfterChildLayout (LayoutResult result ) {
243
+ // TODO DEVSIX-5098 Occupied area shall not be bigger than width or max-width
244
+ Rectangle recalculatedRectangle =
245
+ Rectangle .getCommonRectangle (occupiedArea .getBBox (), result .getOccupiedArea ().getBBox ());
246
+ occupiedArea .getBBox ().setY (recalculatedRectangle .getY ());
247
+ occupiedArea .getBBox ().setHeight (recalculatedRectangle .getHeight ());
248
+ }
249
+
258
250
@ Override
259
251
void decreaseLayoutBoxAfterChildPlacement (Rectangle layoutBox , LayoutResult result , IRenderer childRenderer ) {
260
252
// TODO DEVSIX-5086 When flex-wrap will be fully supported
261
253
// we'll need to decrease layout box with respect to the lines
262
- layoutBox .decreaseWidth (result .getOccupiedArea ().getBBox ().getWidth ());
263
- layoutBox .moveRight (result .getOccupiedArea ().getBBox ().getWidth ());
254
+ layoutBox .decreaseWidth (result .getOccupiedArea ().getBBox ().getRight () - layoutBox .getLeft ());
255
+ layoutBox .setX (result .getOccupiedArea ().getBBox ().getRight ());
256
+ }
257
+
258
+ @ Override
259
+ Rectangle recalculateLayoutBoxBeforeChildLayout (Rectangle layoutBox ,
260
+ IRenderer childRenderer , Rectangle initialLayoutBox ) {
261
+ Rectangle layoutBoxCopy = layoutBox .clone ();
262
+ if (childRenderer instanceof AbstractRenderer ) {
263
+ FlexItemInfo childFlexItemInfo = findFlexItemInfo ((AbstractRenderer ) childRenderer );
264
+ if (childFlexItemInfo != null ) {
265
+ layoutBoxCopy .decreaseWidth (childFlexItemInfo .getRectangle ().getX ());
266
+ layoutBoxCopy .moveRight (childFlexItemInfo .getRectangle ().getX ());
267
+
268
+ layoutBoxCopy .decreaseHeight (childFlexItemInfo .getRectangle ().getY ());
269
+ }
270
+ }
271
+ return layoutBoxCopy ;
272
+ }
273
+
274
+ private FlexItemInfo findFlexItemInfo (AbstractRenderer renderer ) {
275
+ for (List <FlexItemInfo > line : lines ) {
276
+ for (FlexItemInfo itemInfo : line ) {
277
+ if (itemInfo .getRenderer ().equals (renderer )) {
278
+ return itemInfo ;
279
+ }
280
+ }
281
+ }
282
+ return null ;
264
283
}
265
284
266
285
private void findMinMaxWidthIfCorrespondingPropertiesAreNotSet (MinMaxWidth minMaxWidth ,
267
286
AbstractWidthHandler minMaxWidthHandler ) {
268
287
// TODO DEVSIX-5086 When flex-wrap will be fully supported we'll find min/max width with respect to the lines
269
- for (final IRenderer childRenderer : childRenderers ) {
288
+ setThisAsParent (getChildRenderers ());
289
+ for (final IRenderer childRenderer : getChildRenderers ()) {
270
290
MinMaxWidth childMinMaxWidth ;
271
291
childRenderer .setParent (this );
272
292
if (childRenderer instanceof AbstractRenderer ) {
0 commit comments