/******************************************************************************* * Copyright (c) 2005, 2011 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.wb.internal.core.utils.ui; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Control; /** * This class provides a convienient shorthand for creating and initializing GridData. This offers * several benefits over creating GridData normal way: * *
* GridDataFactory instances are created using one of the static methods on this class. *
* ** Example usage: *
*
*
* ////////////////////////////////////////////////////////////
* // Example 1: Typical grid data for a non-wrapping label
*
* // GridDataFactory version
* GridDataFactory.fillDefaults().applyTo(myLabel);
*
* // Equivalent SWT version
* GridData labelData = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL);
* myLabel.setLayoutData(labelData);
*
* ///////////////////////////////////////////////////////////
* // Example 2: Typical grid data for a wrapping label
*
* // GridDataFactory version
* GridDataFactory.fillDefaults()
* .align(SWT.FILL, SWT.CENTER)
* .hint(150, SWT.DEFAULT)
* .grab(true, false)
* .applyTo(wrappingLabel);
*
* // Equivalent SWT version
* GridData wrappingLabelData = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_CENTER);
* wrappingLabelData.minimumWidth = 1;
* wrappingLabelData.widthHint = 150;
* wrappingLabel.setLayoutData(wrappingLabelData);
*
* //////////////////////////////////////////////////////////////
* // Example 3: Typical grid data for a scrollable control (a list box, tree, table, etc.)
*
* // GridDataFactory version
* GridDataFactory.fillDefaults().grab(true, true).hint(150, 150).applyTo(listBox);
*
* // Equivalent SWT version
* GridData listBoxData = new GridData(GridData.FILL_BOTH);
* listBoxData.widthHint = 150;
* listBoxData.heightHint = 150;
* listBoxData.minimumWidth = 1;
* listBoxData.minimumHeight = 1;
* listBox.setLayoutData(listBoxData);
*
* /////////////////////////////////////////////////////////////
* // Example 4: Typical grid data for a button
*
* // GridDataFactory version
* Point preferredSize = button.computeSize(SWT.DEFAULT, SWT.DEFAULT, false);
* Point hint = Geometry.max(LayoutConstants.getMinButtonSize(), preferredSize);
* GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).hint(hint).applyTo(button);
*
* // Equivalent SWT version
* Point preferredSize = button.computeSize(SWT.DEFAULT, SWT.DEFAULT, false);
* Point hint = Geometry.max(LayoutConstants.getMinButtonSize(), preferredSize);
* GridData buttonData = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_CENTER);
* buttonData.widthHint = hint.x;
* buttonData.heightHint = hint.y;
* button.setLayoutData(buttonData);
*
*
* * IMPORTANT: WHEN ASSIGNING LAYOUT DATA TO A CONTROL, BE SURE TO USE * gridDataFactory.applyTo(control) AND NEVER control.setLayoutData(gridDataFactory). *
* * @since 3.2 */ public final class GridDataFactory { private final Control m_control; private final PixelConverter m_pixelConverter; private final GridData m_data; //////////////////////////////////////////////////////////////////////////// // // Constructor // //////////////////////////////////////////////////////////////////////////// private GridDataFactory(Control control, GridData gridData) { m_control = control; m_pixelConverter = new PixelConverter(m_control); // m_data = gridData; if (m_control.getLayoutData() != m_data) { m_control.setLayoutData(m_data); } } /** * Creates new {@link GridDataFactory} with new {@link GridData}. */ public static GridDataFactory create(Control control) { return new GridDataFactory(control, new GridData()); } /** * Creates new {@link GridDataFactory} for modifying {@link GridData} already installed in * control. */ public static GridDataFactory modify(Control control) { GridData gridData; { Object existingLayoutData = control.getLayoutData(); if (existingLayoutData instanceof GridData) { gridData = (GridData) existingLayoutData; } else { gridData = new GridData(); } } return new GridDataFactory(control, gridData); } //////////////////////////////////////////////////////////////////////////// // // Span // //////////////////////////////////////////////////////////////////////////// /** * Sets the GridData span. The span controls how many cells are filled by the control. * * @param hSpan * number of columns spanned by the control * @param vSpan * number of rows spanned by the control * @return this */ public GridDataFactory span(int hSpan, int vSpan) { m_data.horizontalSpan = hSpan; m_data.verticalSpan = vSpan; return this; } /** * Sets the GridData span. The span controls how many cells are filled by the control. * * @param hSpan * number of columns spanned by the control * @return this */ public GridDataFactory spanH(int hSpan) { m_data.horizontalSpan = hSpan; return this; } /** * Sets the GridData span. The span controls how many cells are filled by the control. * * @param vSpan * number of rows spanned by the control * @return this */ public GridDataFactory spanV(int vSpan) { m_data.verticalSpan = vSpan; return this; } //////////////////////////////////////////////////////////////////////////// // // Hint // //////////////////////////////////////////////////////////////////////////// /** * Sets the width and height hints. The width and height hints override the control's preferred * size. If either hint is set to SWT.DEFAULT, the control's preferred size is used. * * @param xHint * horizontal hint (pixels), or SWT.DEFAULT to use the control's preferred size * @param yHint * vertical hint (pixels), or SWT.DEFAULT to use the control's preferred size * @return this */ public GridDataFactory hint(int xHint, int yHint) { m_data.widthHint = xHint; m_data.heightHint = yHint; return this; } /** * Sets hint in chars. */ public GridDataFactory hintC(int xHintInChars, int yHintInChars) { hintHC(xHintInChars); hintVC(yHintInChars); return this; } /** * Sets the width hint. * * @return this */ public GridDataFactory hintH(int xHint) { m_data.widthHint = xHint; return this; } /** * Sets the width hint to the minimum of current hint and givenotherHint
.
*
* @return this
*/
public GridDataFactory hintHMin(int otherHint) {
m_data.widthHint = Math.min(m_data.widthHint, otherHint);
return this;
}
/**
* Sets the width hint in chars.
*
* @return this
*/
public GridDataFactory hintHC(int hintInChars) {
return hintH(m_pixelConverter.convertWidthInCharsToPixels(hintInChars));
}
/**
* Sets the width hint.
*
* @return this
*/
public GridDataFactory hintHU(int hintInDLU) {
return hintH(m_pixelConverter.convertHorizontalDLUsToPixels(hintInDLU));
}
/**
* Sets the height hint.
*
* @return this
*/
public GridDataFactory hintV(int yHint) {
m_data.heightHint = yHint;
return this;
}
/**
* Sets the height hint in chars.
*
* @return this
*/
public GridDataFactory hintVC(int hintInChars) {
return hintV(m_pixelConverter.convertHeightInCharsToPixels(hintInChars));
}
/**
* Increments horizontal hint on given value.
*
* @return this
*/
public GridDataFactory hintHAdd(int increment) {
return hintV(m_data.widthHint + increment);
}
/**
* Increments vertical hint on given value.
*
* @return this
*/
public GridDataFactory hintVAdd(int increment) {
return hintV(m_data.heightHint + increment);
}
/**
* Sets the width and height hints. The width and height hints override the control's preferred
* size. If either hint is set to SWT.DEFAULT, the control's preferred size is used.
*
* @param hint
* size (pixels) to be used instead of the control's preferred size. If the x or y values
* are set to SWT.DEFAULT, the control's computeSize() method will be used to obtain that
* dimension of the preferred size.
* @return this
*/
public GridDataFactory hint(Point hint) {
m_data.widthHint = hint.x;
m_data.heightHint = hint.y;
return this;
}
////////////////////////////////////////////////////////////////////////////
//
// Minimum size
//
////////////////////////////////////////////////////////////////////////////
public GridDataFactory minH(int minimumWidth) {
m_data.minimumWidth = minimumWidth;
return this;
}
public GridDataFactory minHC(int widthInChars) {
return minH(m_pixelConverter.convertWidthInCharsToPixels(widthInChars));
}
public GridDataFactory minV(int minimumHeight) {
m_data.minimumHeight = minimumHeight;
return this;
}
public GridDataFactory minVC(int heightInChars) {
return minV(m_pixelConverter.convertHeightInCharsToPixels(heightInChars));
}
////////////////////////////////////////////////////////////////////////////
//
// Alignment
//
////////////////////////////////////////////////////////////////////////////
/**
* Sets the alignment of the control within its cell.
*
* @param hAlign
* horizontal alignment. One of SWT.BEGINNING, SWT.CENTER, SWT.END, or SWT.FILL.
* @param vAlign
* vertical alignment. One of SWT.BEGINNING, SWT.CENTER, SWT.END, or SWT.FILL.
* @return this
*/
public GridDataFactory align(int hAlign, int vAlign) {
m_data.horizontalAlignment = hAlign;
m_data.verticalAlignment = vAlign;
return this;
}
/**
* Sets the horizontal and vertical alignment to GridData.FILL.
*/
public GridDataFactory fill() {
return align(GridData.FILL, GridData.FILL);
}
/**
* Sets the horizontal alignment of the control within its cell.
*
* @param hAlign
* horizontal alignment. One of SWT.BEGINNING, SWT.CENTER, SWT.END, or SWT.FILL.
* @return this
*/
public GridDataFactory alignH(int hAlign) {
m_data.horizontalAlignment = hAlign;
return this;
}
/**
* Sets the horizontal alignment of the control to GridData.BEGINNING
*
* @return this
*/
public GridDataFactory alignHL() {
return alignH(GridData.BEGINNING);
}
/**
* Sets the horizontal alignment of the control to GridData.CENTER
*
* @return this
*/
public GridDataFactory alignHC() {
return alignH(GridData.CENTER);
}
/**
* Sets the horizontal alignment of the control to GridData.FILL
*
* @return this
*/
public GridDataFactory alignHF() {
return alignH(GridData.FILL);
}
/**
* Sets the horizontal alignment of the control to GridData.FILL
*
* @return this
*/
public GridDataFactory fillH() {
return alignHF();
}
/**
* Sets the horizontal alignment of the control to GridData.END
*
* @return this
*/
public GridDataFactory alignHR() {
return alignH(GridData.END);
}
/**
* Sets the vertical alignment of the control within its cell.
*
* @param vAlign
* vertical alignment. One of SWT.BEGINNING, SWT.CENTER, SWT.END, or SWT.FILL.
* @return this
*/
public GridDataFactory alignV(int vAlign) {
m_data.verticalAlignment = vAlign;
return this;
}
/**
* Sets the vertical alignment of the control to GridData.BEGINNING
*
* @return this
*/
public GridDataFactory alignVT() {
return alignV(GridData.BEGINNING);
}
/**
* Sets the vertical alignment of the control to GridData.CENTER
*
* @return this
*/
public GridDataFactory alignVM() {
return alignV(GridData.CENTER);
}
/**
* Sets the vertical alignment of the control to GridData.FILL
*
* @return this
*/
public GridDataFactory alignVF() {
return alignV(GridData.FILL);
}
/**
* Sets the vertical alignment of the control to GridData.FILL
*
* @return this
*/
public GridDataFactory fillV() {
return alignVF();
}
/**
* Sets the vertical alignment of the control to GridData.END
*
* @return this
*/
public GridDataFactory alignVB() {
return alignV(GridData.END);
}
////////////////////////////////////////////////////////////////////////////
//
// Indent
//
////////////////////////////////////////////////////////////////////////////
/**
* Sets the indent of the control within the cell in pixels.
*/
public GridDataFactory indentH(int hIndent) {
m_data.horizontalIndent = hIndent;
return this;
}
/**
* Sets the indent of the control within the cell in characters.
*/
public GridDataFactory indentHC(int hIndent) {
m_data.horizontalIndent = m_pixelConverter.convertWidthInCharsToPixels(hIndent);
return this;
}
////////////////////////////////////////////////////////////////////////////
//
// Grab
//
////////////////////////////////////////////////////////////////////////////
/**
* Determines whether extra horizontal or vertical space should be allocated to this control's
* column when the layout resizes. If any control in the column is set to grab horizontal then the
* whole column will grab horizontal space. If any control in the row is set to grab vertical then
* the whole row will grab vertical space.
*
* @param horizontal
* true if the control's column should grow horizontally
* @param vertical
* true if the control's row should grow vertically
* @return this
*/
public GridDataFactory grab(boolean horizontal, boolean vertical) {
m_data.grabExcessHorizontalSpace = horizontal;
m_data.grabExcessVerticalSpace = vertical;
return this;
}
public GridDataFactory grabH() {
m_data.grabExcessHorizontalSpace = true;
return this;
}
public GridDataFactory grabV() {
m_data.grabExcessVerticalSpace = true;
return this;
}
public GridDataFactory grab() {
return grab(true, true);
}
////////////////////////////////////////////////////////////////////////////
//
// Exclude
//
////////////////////////////////////////////////////////////////////////////
public GridDataFactory exclude(boolean value) {
m_data.exclude = value;
return this;
}
}