/******************************************************************************* * Copyright (c) 2000, 2004 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.erlide.ui.internal.util; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Control; /** * Helper class to layout a number of children if the composite uses a * <code>GridLayout</code>. If the numbers of widgets to be layouted into one row is * smaller than the number of columns defined for the grid layout the helper class assigns * a corresponing value to the <code> * GridData.horizontalSpan</code> field. * * Additionally a row layouter manages a default <code>GridData</code> object for each * column. If set this grid data is used for the widget if it doesn't manage its own grid * data object. * * Call one of the <code>perform</code> methods to assign the correct grid data objects to * a set of widgets according to the number of columns passed to the layouter's * constructor. */ public class RowLayouter { public int spanHorizontalAlignment = -1; public int spanGrabExcessHorizontalSpace = -1; public int spanHorizontalSpan = -1; public int spanHorizontalIndent = -1; public int spanWidthHint = -1; public int spanVerticalAlignment = -1; public int spanGrabExcessVerticalSpace = -1; public int spanVerticalSpan = -1; public int spanHeightHint = -1; private final int fNumColumns; private final boolean fOrder; private Control fLastControl; private GridData[] fDefaultGridDatas = new GridData[4]; public RowLayouter(final int numColumns) { this(numColumns, false); } public RowLayouter(final int numColumns, final boolean order) { fNumColumns = numColumns; fOrder = order; } public void setDefaultSpan() { spanHorizontalAlignment = GridData.FILL; spanGrabExcessHorizontalSpace = 1; } public void perform(final Control c1) { perform(new Control[] { c1 }, 0); } public void perform(final Control c1, final Control c2, final int span) { perform(new Control[] { c1, c2 }, span); } public void perform(final Control c1, final Control c2, final Control c3, final int span) { perform(new Control[] { c1, c2, c3 }, span); } public void perform(final Control[] controls, final int spanColumn) { final int numColumns = numColumns(); order(controls); int gridIndex = 0; for (int i = 0; i < controls.length; i++) { final Control control = controls[i]; GridData gd = (GridData) control.getLayoutData(); if (gd == null) { gd = getGridData(gridIndex); } if (i == spanColumn) { final int span = numColumns - (controls.length - 1); gridIndex += span; if (gd == null) { gd = new GridData(); } applyDelta(gd); gd.horizontalSpan = span; } else { gridIndex++; } control.setLayoutData(gd); } } private void applyDelta(final GridData gd) { if (spanHorizontalAlignment != -1) { gd.horizontalAlignment = spanHorizontalAlignment; } if (spanGrabExcessHorizontalSpace != -1) { if (spanGrabExcessHorizontalSpace == 0) { gd.grabExcessHorizontalSpace = false; } else { gd.grabExcessHorizontalSpace = true; } } if (spanHorizontalSpan != -1) { gd.horizontalSpan = spanHorizontalSpan; } if (spanHorizontalIndent != -1) { gd.horizontalIndent = spanHorizontalIndent; } if (spanWidthHint != -1) { gd.widthHint = spanWidthHint; } if (spanVerticalAlignment != -1) { gd.verticalAlignment = spanVerticalAlignment; } if (spanGrabExcessVerticalSpace != -1) { if (spanGrabExcessVerticalSpace == 0) { gd.grabExcessVerticalSpace = false; } else { gd.grabExcessVerticalSpace = true; } } if (spanVerticalSpan != -1) { gd.verticalSpan = spanVerticalSpan; } if (spanHeightHint != -1) { gd.heightHint = spanHeightHint; } } public void setDefaultGridData(final GridData gd, final int index) { if (index >= fDefaultGridDatas.length) { final GridData[] newDatas = new GridData[index + 4]; System.arraycopy(fDefaultGridDatas, 0, newDatas, 0, fDefaultGridDatas.length); fDefaultGridDatas = newDatas; } fDefaultGridDatas[index] = gd; } public GridData getGridData(final int index) { if (index > fDefaultGridDatas.length) { return null; } return cloneGridData(fDefaultGridDatas[index]); } public int numColumns() { return fNumColumns; } protected void order(final Control[] controls) { if (!fOrder) { return; } for (final Control control : controls) { control.moveBelow(fLastControl); fLastControl = control; } } protected GridData cloneGridData(final GridData gd) { if (gd == null) { return null; } final GridData result = new GridData(); result.horizontalAlignment = gd.horizontalAlignment; result.grabExcessHorizontalSpace = gd.grabExcessHorizontalSpace; result.horizontalSpan = gd.horizontalSpan; result.horizontalIndent = gd.horizontalIndent; result.widthHint = gd.widthHint; result.verticalAlignment = gd.verticalAlignment; result.grabExcessVerticalSpace = gd.grabExcessVerticalSpace; result.verticalSpan = gd.verticalSpan; result.heightHint = gd.heightHint; return result; } }