double x = 0.0;
double y = 0.0;
double maxHeight = 0.0;
List<Block> itemsInRow = new ArrayList<Block>();
for (Block block : blocks) {
Size2D size = block.arrange(g2, RectangleConstraint.NONE);
if (x + size.width <= width) {
itemsInRow.add(block);
block.setBounds(
new Rectangle2D.Double(x, y, size.width, size.height)
);
x = x + size.width + this.horizontalGap;
maxHeight = Math.max(maxHeight, size.height);
} else {
if (itemsInRow.isEmpty()) {
// place in this row (truncated) anyway
block.setBounds(
new Rectangle2D.Double(
x, y, Math.min(size.width, width - x), size.height
)
);
x = 0.0;
y = y + size.height + this.verticalGap;
} else {
// start new row
itemsInRow.clear();
x = 0.0;
y = y + maxHeight + this.verticalGap;
maxHeight = size.height;
block.setBounds(
new Rectangle2D.Double(
x, y, Math.min(size.width, width), size.height
)
);
x = size.width + this.horizontalGap;
itemsInRow.add(block);
}
}
}
return new Size2D(constraint.getWidth(), y + maxHeight);
}