| /******************************************************************************* |
| * 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: |
| * |
| * <ul> |
| * <li>The same factory can be used many times to create several GridData instances</li> |
| * <li>The setters on GridDataFactory all return "this", allowing them to be chained</li> |
| * <li>GridDataFactory uses vector setters (it accepts Points), making it easy to set X and Y values |
| * together</li> |
| * </ul> |
| * |
| * <p> |
| * GridDataFactory instances are created using one of the static methods on this class. |
| * </p> |
| * |
| * <p> |
| * Example usage: |
| * </p> |
| * <code> |
| * |
| * //////////////////////////////////////////////////////////// |
| * // 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); |
| * </code> |
| * |
| * <p> |
| * IMPORTANT: WHEN ASSIGNING LAYOUT DATA TO A CONTROL, BE SURE TO USE |
| * gridDataFactory.applyTo(control) AND NEVER control.setLayoutData(gridDataFactory). |
| * </p> |
| * |
| * @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 given <code>otherHint</code>. |
| * |
| * @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; |
| } |
| } |