long topmostY = Long.MAX_VALUE;
long bottommostY = Long.MIN_VALUE;
for (int i = 0; i < reportElements.length; i++)
{
final Element element = reportElements[i];
final CachedLayoutData layoutData = ModelUtility.getCachedLayoutData(element);
totalHeight += layoutData.getWidth();
topmostY = Math.min(topmostY, layoutData.getX());
bottommostY = Math.max(bottommostY, layoutData.getX() + layoutData.getWidth());
}
final long gap = (bottommostY - topmostY - totalHeight) / (reportElements.length - 1);
long currentY = topmostY;
for (int i = 0; i < reportElements.length; i++)
{
final Element reportElement = reportElements[i];
final CachedLayoutData layoutData = ModelUtility.getCachedLayoutData(reportElement);
final long height = layoutData.getWidth();
carrier[0] = reportElement;
final Point2D.Double originPoint = new Point2D.Double(StrictGeomUtility.toExternalValue(layoutData.getX()), 0);
final MoveDragOperation mop = new MoveDragOperation
(carrier, originPoint, EmptySnapModel.INSTANCE, EmptySnapModel.INSTANCE);
mop.update(new Point2D.Double(StrictGeomUtility.toExternalValue(currentY), 0), 1);
mop.finish();