256 |
int[] offsets, int[] spans, |
int[] offsets, int[] spans, |
257 |
boolean forward) |
boolean forward) |
258 |
{ |
{ |
259 |
|
int span = 0; |
260 |
if (forward) |
if (forward) |
261 |
{ |
{ |
262 |
int offset = 0; |
int offset = 0; |
264 |
{ |
{ |
265 |
offsets[i] = offset; |
offsets[i] = offset; |
266 |
spans[i] = children[i].preferred; |
spans[i] = children[i].preferred; |
267 |
|
span += spans[i]; |
268 |
offset += children[i].preferred; |
offset += children[i].preferred; |
269 |
} |
} |
270 |
} |
} |
275 |
{ |
{ |
276 |
offset -= children[i].preferred; |
offset -= children[i].preferred; |
277 |
offsets[i] = offset; |
offsets[i] = offset; |
278 |
|
span += spans[i]; |
279 |
spans[i] = children[i].preferred; |
spans[i] = children[i].preferred; |
280 |
} |
} |
281 |
} |
} |
282 |
|
// Adjust spans so that we exactly fill the allocated region. If |
283 |
|
if (span > allocated) |
284 |
|
adjustSmaller(allocated, children, spans, span); |
285 |
|
else |
286 |
|
adjustGreater(allocated, children, spans, span); |
287 |
|
|
288 |
|
// Adjust offsets. |
289 |
|
if (forward) |
290 |
|
{ |
291 |
|
int offset = 0; |
292 |
|
for (int i = 0; i < children.length; i++) |
293 |
|
{ |
294 |
|
offsets[i] = offset; |
295 |
|
offset += spans[i]; |
296 |
|
} |
297 |
|
} |
298 |
|
else |
299 |
|
{ |
300 |
|
int offset = allocated; |
301 |
|
for (int i = 0; i < children.length; i++) |
302 |
|
{ |
303 |
|
offset -= spans[i]; |
304 |
|
offsets[i] = offset; |
305 |
|
} |
306 |
|
} |
307 |
|
} |
308 |
|
|
309 |
|
private static void adjustSmaller(int allocated, SizeRequirements[] children, |
310 |
|
int[] spans, int span) |
311 |
|
{ |
312 |
|
// Sum up (prefSize - minSize) over all children |
313 |
|
int sumDelta = 0; |
314 |
|
for (int i = 0; i < children.length; i++) |
315 |
|
sumDelta += children[i].preferred - children[i].minimum; |
316 |
|
|
317 |
|
// Adjust all sizes according to their preferred and minimum sizes. |
318 |
|
for (int i = 0; i < children.length; i++) |
319 |
|
{ |
320 |
|
double factor = ((double) (children[i].preferred - children[i].minimum)) |
321 |
|
/ ((double) sumDelta); |
322 |
|
// In case we have a sumDelta of 0, the factor should also be 0. |
323 |
|
if (Double.isNaN(factor)) |
324 |
|
factor = 0; |
325 |
|
spans[i] -= factor * (span - allocated); |
326 |
|
} |
327 |
|
} |
328 |
|
|
329 |
|
private static void adjustGreater(int allocated, SizeRequirements[] children, |
330 |
|
int[] spans, int span) |
331 |
|
{ |
332 |
|
// Sum up (maxSize - prefSize) over all children |
333 |
|
int sumDelta = 0; |
334 |
|
for (int i = 0; i < children.length; i++) |
335 |
|
sumDelta += children[i].maximum - children[i].preferred; |
336 |
|
|
337 |
|
// Adjust all sizes according to their preferred and minimum sizes. |
338 |
|
for (int i = 0; i < children.length; i++) |
339 |
|
{ |
340 |
|
double factor = ((double) (children[i].maximum - children[i].preferred)) |
341 |
|
/ ((double) sumDelta); |
342 |
|
spans[i] -= factor * (span - allocated); |
343 |
|
} |
344 |
} |
} |
345 |
|
|
346 |
/** |
/** |