/*******************************************************************************
* Copyright (c) 2011, 2015 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ui.internal.forms.widgets;
import org.eclipse.swt.graphics.Point;
public class ColumnLayoutUtils {
/*
* Compute the minimum required height by iteration. The first guess is to
*
* This method is public to allow for JUnit testing
*/
public static int computeColumnHeight(int ncolumns, Point[] sizes, int totalHeight, int verticalMargin) {
int averageHeight = ( totalHeight + sizes.length * verticalMargin ) / ncolumns;
int requiredHeight = computeActualHeight(ncolumns, sizes, averageHeight, verticalMargin);
if (averageHeight == requiredHeight) {
return requiredHeight;
}
// Try making the columns shorter, repeat up to 10 times, usually one or two iterations will be sufficient
for ( int i = 0; i < 10; i++ ) {
int candidateHeight = computeActualHeight(ncolumns, sizes, requiredHeight - 1, verticalMargin);
if ( candidateHeight >= requiredHeight ) {
return requiredHeight;
}
requiredHeight = candidateHeight;
}
return requiredHeight;
}
private static int computeActualHeight(int ncolumns, Point[] sizes, int candidateHeight, int verticalMargin ) {
int colHeight = 0;
int maxHeight = 0;
int column = 1;
for (int i = 0; i < sizes.length; i++) {
int childHeight = sizes[i].y;
if (i > 0 && column < ncolumns && colHeight + childHeight + verticalMargin > candidateHeight) {
maxHeight = Math.max(colHeight, maxHeight);
column++;
colHeight = 0;
}
if (colHeight > 0)
colHeight += verticalMargin;
colHeight += childHeight;
}
maxHeight = Math.max(colHeight, maxHeight);
return maxHeight;
}
}