/*******************************************************************************
* Copyright (c) 2014 Bruno Medeiros and other Contributors.
* 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:
* Bruno Medeiros - initial API and implementation
*******************************************************************************/
package melnorme.util.swt;
import static melnorme.utilbox.core.Assert.AssertNamespace.assertNotNull;
import static melnorme.utilbox.core.CoreUtil.array;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Control;
import melnorme.utilbox.misc.ArrayUtil;
public class SWTLayoutUtil {
public static <CONTROL extends Control, DATA> CONTROL setLayoutData(CONTROL control, Object layoutData) {
control.setLayoutData(layoutData);
return control;
}
public static void layout1Control(Control lastControl) {
layoutControls(array(lastControl), lastControl, lastControl);
}
public static void layout2Controls(Control firstControl, Control lastControl) {
layoutControls(array(firstControl, lastControl), null, null);
}
public static void layout2Controls_expandLast(Control firstControl, Control lastControl) {
layoutControls(array(firstControl, lastControl), lastControl, lastControl);
}
public static void layout2Controls_spanLast(Control firstControl, Control lastControl) {
layoutControls(array(firstControl, lastControl), null, lastControl);
}
public static GridData layoutExpandedControl(Control lastControl) {
GridDataFactory gdf = GridDataFactory.fillDefaults().grab(true, false);
GridData gridData = gdf.create();
lastControl.setLayoutData(gridData);
return gridData;
}
/**
* Layout given controls with GridData instances.
* Optionally, given grabbingControl will have a GridData grabbing vertical space.
* Optionally, given colSpanningControl will have a GridData spanning extra columns in parent layout.
*/
public static void layoutControls(Control[] controls, Control grabbingControl, Control colSpanningControl) {
assertNotNull(controls);
controls = ArrayUtil.removeAll(controls, null);
if(controls.length == 0) {
return;
}
GridLayout gridLayout = (GridLayout) controls[0].getParent().getLayout();
int extraColumns = gridLayout.numColumns - controls.length;
if(extraColumns < 0) {
extraColumns = 0;
}
for (int ix = 0; ix < controls.length; ix++) {
Control control = controls[ix];
GridData gridData;
if(control == grabbingControl) {
gridData = layoutExpandedControl(control);
} else {
gridData = GridDataFactory.swtDefaults().create();
control.setLayoutData(gridData);
}
if(control == colSpanningControl) {
gridData.horizontalSpan = extraColumns + 1;
}
}
}
}