blob: f2666f4874a71a849665cc8762ca6011ee7a97ed [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2010 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
* Asim Ullah - Ported for use in draw2d (c.f Bugzilla 71684).[Sep 10, 2004]
*******************************************************************************/
package org.eclipse.draw2d;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.rap.swt.SWT;
/**
* <code>GridData</code> is the layout data object associated with
* <code>GridLayout</code>. To set a <code>GridData</code> object into a
* <code>Figure</code>, you use the <code>setConstraint()</code> method of
* <code>GridLayout</code> to map the <code>Figure</code> to its layout
* <code>GridData</code>.
* <p>
* There are two ways to create a <code>GridData</code> object with certain
* fields set. The first is to set the fields directly, like this:
*
* <pre>
* GridData gridData = new GridData();
* gridData.horizontalAlignment = GridData.FILL;
* gridData.grabExcessHorizontalSpace = true;
*
* // associate the figure to the GridData object
* myGridlayout.setConstraint(myFigure, gridData);
* </pre>
*
* The second is to take advantage of convenience style bits defined by
* <code>GridData</code>:
*
* <pre>
* GridData gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL
* | GridData.GRAB_HORIZONTAL);
* </pre>
*
* </p>
* <p>
* NOTE: Do not reuse <code>GridData</code> objects. Every child in the parent
* <code>Figure</code> that is managed by the <code>GridLayout</code> must have
* a unique <code>GridData</code> object. If the layout data for a Grid member
* in a <code>GridLayout</code> is null at layout time, a unique
* <code>GridData</code> object is created for it.
* </p>
*
* @see GridLayout
*/
public final class GridData {
/**
* verticalAlignment specifies how figures will be positioned vertically
* within a cell.
*
* The default value is CENTER.
*
* Possible values are:
*
* SWT.BEGINNING (or SWT.TOP): Position the figure at the top of the cell
* SWT.CENTER: Position the figure in the vertical center of the cell
* SWT.END (or SWT.BOTTOM): Position the figure at the bottom of the cell
* SWT.FILL: Resize the figure to fill the cell vertically
*/
public int verticalAlignment = CENTER;
/**
* horizontalAlignment specifies how figures will be positioned horizontally
* within a cell.
*
* The default value is BEGINNING.
*
* Possible values are:
*
* SWT.BEGINNING (or SWT.LEFT): Position the figure at the left of the cell
* SWT.CENTER: Position the figure in the horizontal center of the cell
* SWT.END (or SWT.RIGHT): Position the figure at the right of the cell
* SWT.FILL: Resize the figure to fill the cell horizontally
*/
public int horizontalAlignment = BEGINNING;
/**
* widthHint specifies a minimum width for the column. A value of
* SWT.DEFAULT indicates that no minimum width is specified.
*
* The default value is SWT.DEFAULT.
*/
public int widthHint = SWT.DEFAULT;
/**
* heightHint specifies a minimum height for the row. A value of SWT.DEFAULT
* indicates that no minimum height is specified.
*
* The default value is SWT.DEFAULT.
*/
public int heightHint = SWT.DEFAULT;
/**
* horizontalIndent specifies the number of pixels of indentation that will
* be placed along the left side of the cell.
*
* The default value is 0.
*/
public int horizontalIndent = 0;
/**
* horizontalSpan specifies the number of column cells that the figure will
* take up.
*
* The default value is 1.
*/
public int horizontalSpan = 1;
/**
* verticalSpan specifies the number of row cells that the figure will take
* up.
*
* The default value is 1.
*/
public int verticalSpan = 1;
/**
* grabExcessHorizontalSpace specifies whether the cell will be made wide
* enough to fit the remaining horizontal space.
*
* The default value is false.
*/
public boolean grabExcessHorizontalSpace = false;
/**
* grabExcessVerticalSpace specifies whether the cell will be made tall
* enough to fit the remaining vertical space.
*
* The default value is false.
*/
public boolean grabExcessVerticalSpace = false;
/**
* Value for horizontalAlignment or verticalAlignment. Position the figure
* at the top or left of the cell. Not recommended. Use SWT.BEGINNING,
* SWT.TOP or SWT.LEFT instead.
*/
public static final int BEGINNING = SWT.BEGINNING;
/**
* Value for horizontalAlignment or verticalAlignment. Position the figure
* in the vertical or horizontal center of the cell Not recommended. Use
* SWT.CENTER instead.
*/
public static final int CENTER = 2;
/**
* Value for horizontalAlignment or verticalAlignment. Position the figure
* at the bottom or right of the cell Not recommended. Use SWT.END,
* SWT.BOTTOM or SWT.RIGHT instead.
*/
public static final int END = 3;
/**
* Value for horizontalAlignment or verticalAlignment. Resize the figure to
* fill the cell horizontally or vertically. Not recommended. Use SWT.FILL
* instead.
*/
public static final int FILL = SWT.FILL;
/**
* Style bit for <code>new GridData(int)</code>. Position the figure at the
* top of the cell. Not recommended. Use
* <code>new GridData(int, SWT.BEGINNING, boolean, boolean)</code> instead.
*/
public static final int VERTICAL_ALIGN_BEGINNING = 1 << 1;
/**
* Style bit for <code>new GridData(int)</code> to position the figure in
* the vertical center of the cell. Not recommended. Use
* <code>new GridData(int, SWT.CENTER, boolean, boolean)</code> instead.
*/
public static final int VERTICAL_ALIGN_CENTER = 1 << 2;
/**
* Style bit for <code>new GridData(int)</code> to position the figure at
* the bottom of the cell. Not recommended. Use
* <code>new GridData(int, SWT.END, boolean, boolean)</code> instead.
*/
public static final int VERTICAL_ALIGN_END = 1 << 3;
/**
* Style bit for <code>new GridData(int)</code> to resize the figure to fill
* the cell vertically. Not recommended. Use
* <code>new GridData(int, SWT.FILL, boolean, boolean)</code> instead
*/
public static final int VERTICAL_ALIGN_FILL = 1 << 4;
/**
* Style bit for <code>new GridData(int)</code> to position the figure at
* the left of the cell. Not recommended. Use
* <code>new GridData(SWT.BEGINNING, int, boolean, boolean)</code> instead.
*/
public static final int HORIZONTAL_ALIGN_BEGINNING = 1 << 5;
/**
* Style bit for <code>new GridData(int)</code> to position the figure in
* the horizontal center of the cell. Not recommended. Use
* <code>new GridData(SWT.CENTER, int, boolean, boolean)</code> instead.
*/
public static final int HORIZONTAL_ALIGN_CENTER = 1 << 6;
/**
* Style bit for <code>new GridData(int)</code> to position the figure at
* the right of the cell. Not recommended. Use
* <code>new GridData(SWT.END, int, boolean, boolean)</code> instead.
*/
public static final int HORIZONTAL_ALIGN_END = 1 << 7;
/**
* Style bit for <code>new GridData(int)</code> to resize the figure to fill
* the cell horizontally. Not recommended. Use
* <code>new GridData(SWT.FILL, int, boolean, boolean)</code> instead.
*/
public static final int HORIZONTAL_ALIGN_FILL = 1 << 8;
/**
* Style bit for <code>new GridData(int)</code> to resize the figure to fit
* the remaining horizontal space. Not recommended. Use
* <code>new GridData(int, int, true, boolean)</code> instead.
*/
public static final int GRAB_HORIZONTAL = 1 << 9;
/**
* Style bit for <code>new GridData(int)</code> to resize the figure to fit
* the remaining vertical space. Not recommended. Use
* <code>new GridData(int, int, boolean, true)</code> instead.
*/
public static final int GRAB_VERTICAL = 1 << 10;
/**
* Style bit for <code>new GridData(int)</code> to resize the figure to fill
* the cell vertically and to fit the remaining vertical space.
* FILL_VERTICAL = VERTICAL_ALIGN_FILL | GRAB_VERTICAL Not recommended. Use
* <code>new GridData(int, SWT.FILL, boolean, true)</code> instead.
*/
public static final int FILL_VERTICAL = VERTICAL_ALIGN_FILL | GRAB_VERTICAL;
/**
* Style bit for <code>new GridData(int)</code> to resize the figure to fill
* the cell horizontally and to fit the remaining horizontal space.
* FILL_HORIZONTAL = HORIZONTAL_ALIGN_FILL | GRAB_HORIZONTAL Not
* recommended. Use <code>new GridData(SWT.FILL, int, true, boolean)</code>
* instead.
*/
public static final int FILL_HORIZONTAL = HORIZONTAL_ALIGN_FILL
| GRAB_HORIZONTAL;
/**
* Style bit for <code>new GridData(int)</code> to resize the figure to fill
* the cell horizontally and vertically and to fit the remaining horizontal
* and vertical space. FILL_BOTH = FILL_VERTICAL | FILL_HORIZONTAL Not
* recommended. Use
* <code>new GridData(SWT.FILL, SWT.FILL, true, true)</code> instead.
*/
public static final int FILL_BOTH = FILL_VERTICAL | FILL_HORIZONTAL;
int cacheWidth = -1, cacheHeight = -1;
int[][] cache = new int[2][4];
int cacheIndex = -1;
/**
* Constructs a new instance of GridData using default values.
*/
public GridData() {
super();
}
/**
* Constructs a new instance based on the GridData style. This constructor
* is not recommended.
*
* @param style
* the GridData style
*/
public GridData(int style) {
super();
if ((style & VERTICAL_ALIGN_BEGINNING) != 0)
verticalAlignment = BEGINNING;
if ((style & VERTICAL_ALIGN_CENTER) != 0)
verticalAlignment = CENTER;
if ((style & VERTICAL_ALIGN_FILL) != 0)
verticalAlignment = FILL;
if ((style & VERTICAL_ALIGN_END) != 0)
verticalAlignment = END;
if ((style & HORIZONTAL_ALIGN_BEGINNING) != 0)
horizontalAlignment = BEGINNING;
if ((style & HORIZONTAL_ALIGN_CENTER) != 0)
horizontalAlignment = CENTER;
if ((style & HORIZONTAL_ALIGN_FILL) != 0)
horizontalAlignment = FILL;
if ((style & HORIZONTAL_ALIGN_END) != 0)
horizontalAlignment = END;
grabExcessHorizontalSpace = (style & GRAB_HORIZONTAL) != 0;
grabExcessVerticalSpace = (style & GRAB_VERTICAL) != 0;
}
/**
* Constructs a new instance of GridData according to the parameters.
*
* @param horizontalAlignment
* how figure will be positioned horizontally within a cell
* @param verticalAlignment
* how figure will be positioned vertically within a cell
* @param grabExcessHorizontalSpace
* whether cell will be made wide enough to fit the remaining
* horizontal space
* @param grabExcessVerticalSpace
* whether cell will be made high enough to fit the remaining
* vertical space
*
*/
public GridData(int horizontalAlignment, int verticalAlignment,
boolean grabExcessHorizontalSpace, boolean grabExcessVerticalSpace) {
this(horizontalAlignment, verticalAlignment, grabExcessHorizontalSpace,
grabExcessVerticalSpace, 1, 1);
}
/**
* Constructs a new instance of GridData according to the parameters.
*
* @param horizontalAlignment
* how figure will be positioned horizontally within a cell
* @param verticalAlignment
* how figure will be positioned vertically within a cell
* @param grabExcessHorizontalSpace
* whether cell will be made wide enough to fit the remaining
* horizontal space
* @param grabExcessVerticalSpace
* whether cell will be made high enough to fit the remaining
* vertical space
* @param horizontalSpan
* the number of column cells that the figure will take up
* @param verticalSpan
* the number of row cells that the figure will take up
*
*/
public GridData(int horizontalAlignment, int verticalAlignment,
boolean grabExcessHorizontalSpace, boolean grabExcessVerticalSpace,
int horizontalSpan, int verticalSpan) {
super();
this.horizontalAlignment = horizontalAlignment;
this.verticalAlignment = verticalAlignment;
this.grabExcessHorizontalSpace = grabExcessHorizontalSpace;
this.grabExcessVerticalSpace = grabExcessVerticalSpace;
this.horizontalSpan = horizontalSpan;
this.verticalSpan = verticalSpan;
}
/**
* Constructs a new instance of GridData according to the parameters. A
* value of SWT.DEFAULT indicates that no minimum width or no minumum height
* is specified.
*
* @param width
* a minimum width for the column
* @param height
* a minimum height for the row
*
*/
public GridData(int width, int height) {
super();
this.widthHint = width;
this.heightHint = height;
}
Dimension computeSize(IFigure figure, boolean flushCache) {
if (cacheWidth != -1 && cacheHeight != -1) {
return new Dimension(cacheWidth, cacheHeight);
}
for (int i = 0; i < cacheIndex + 1; i++) {
if (cache[i][0] == widthHint && cache[i][1] == heightHint) {
cacheWidth = cache[i][2];
cacheHeight = cache[i][3];
return new Dimension(cacheWidth, cacheHeight);
}
}
Dimension size = figure.getPreferredSize(widthHint, heightHint)
.getCopy();
if (widthHint != -1)
size.width = widthHint;
if (heightHint != -1)
size.height = heightHint;
if (cacheIndex < cache.length - 1)
cacheIndex++;
cache[cacheIndex][0] = widthHint;
cache[cacheIndex][1] = heightHint;
cacheWidth = cache[cacheIndex][2] = size.width;
cacheHeight = cache[cacheIndex][3] = size.height;
return size;
}
void flushCache() {
cacheWidth = cacheHeight = -1;
cacheIndex = -1;
}
String getName() {
String string = getClass().getName();
int index = string.lastIndexOf('.');
if (index == -1)
return string;
return string.substring(index + 1, string.length());
}
public String toString() {
String hAlign = ""; //$NON-NLS-1$
switch (horizontalAlignment) {
case SWT.FILL:
hAlign = "SWT.FILL"; //$NON-NLS-1$
break;
case SWT.BEGINNING:
hAlign = "SWT.BEGINNING"; //$NON-NLS-1$
break;
case SWT.LEFT:
hAlign = "SWT.LEFT"; //$NON-NLS-1$
break;
case SWT.END:
hAlign = "SWT.END"; //$NON-NLS-1$
break;
case END:
hAlign = "GridData.END"; //$NON-NLS-1$
break;
case SWT.RIGHT:
hAlign = "SWT.RIGHT"; //$NON-NLS-1$
break;
case SWT.CENTER:
hAlign = "SWT.CENTER"; //$NON-NLS-1$
break;
case CENTER:
hAlign = "GridData.CENTER"; //$NON-NLS-1$
break;
default:
hAlign = "Undefined " + horizontalAlignment; //$NON-NLS-1$
break;
}
String vAlign = ""; //$NON-NLS-1$
switch (verticalAlignment) {
case SWT.FILL:
vAlign = "SWT.FILL"; //$NON-NLS-1$
break;
case SWT.BEGINNING:
vAlign = "SWT.BEGINNING"; //$NON-NLS-1$
break;
case SWT.TOP:
vAlign = "SWT.TOP"; //$NON-NLS-1$
break;
case SWT.END:
vAlign = "SWT.END"; //$NON-NLS-1$
break;
case END:
vAlign = "GridData.END"; //$NON-NLS-1$
break;
case SWT.BOTTOM:
vAlign = "SWT.BOTTOM"; //$NON-NLS-1$
break;
case SWT.CENTER:
vAlign = "SWT.CENTER"; //$NON-NLS-1$
break;
case CENTER:
vAlign = "GridData.CENTER"; //$NON-NLS-1$
break;
default:
vAlign = "Undefined " + verticalAlignment; //$NON-NLS-1$
break;
}
String string = getName() + " {"; //$NON-NLS-1$
string += "horizontalAlignment=" + hAlign + " "; //$NON-NLS-1$ //$NON-NLS-2$
if (horizontalIndent != 0)
string += "horizontalIndent=" + horizontalIndent + " "; //$NON-NLS-1$ //$NON-NLS-2$
if (horizontalSpan != 1)
string += "horizontalSpan=" + horizontalSpan + " "; //$NON-NLS-1$//$NON-NLS-2$
if (grabExcessHorizontalSpace)
string += "grabExcessHorizontalSpace=" + grabExcessHorizontalSpace //$NON-NLS-1$
+ " "; //$NON-NLS-1$
if (widthHint != SWT.DEFAULT)
string += "widthHint=" + widthHint + " "; //$NON-NLS-1$ //$NON-NLS-2$
string += "verticalAlignment=" + vAlign + " "; //$NON-NLS-1$ //$NON-NLS-2$
if (verticalSpan != 1)
string += "verticalSpan=" + verticalSpan + " "; //$NON-NLS-1$ //$NON-NLS-2$
if (grabExcessVerticalSpace)
string += "grabExcessVerticalSpace=" + grabExcessVerticalSpace //$NON-NLS-1$
+ " "; //$NON-NLS-1$
if (heightHint != SWT.DEFAULT)
string += "heightHint=" + heightHint + " "; //$NON-NLS-1$ //$NON-NLS-2$
string = string.trim();
string += "}"; //$NON-NLS-1$
return string;
}
}