# HG changeset patch
# User Frank Benoit
# Date 1200045471 -3600
# Node ID e300eb95bec473865191a456531b2a731845e582
# Parent d48f7334742c9b94668199a41b6fb52a2e6af4a8
RowData, RowLayout
diff -r d48f7334742c -r e300eb95bec4 dwt/layout/RowData.d
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/layout/RowData.d Fri Jan 11 10:57:51 2008 +0100
@@ -0,0 +1,128 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2006 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
+ *******************************************************************************/
+module dwt.layout.RowData;
+
+import dwt.SWT;
+import dwt.graphics.Point;
+import dwt.widgets.Control;
+
+import tango.text.Util;
+import tango.util.Convert;
+
+/**
+ * Each control controlled by a RowLayout
can have its initial
+ * width and height specified by setting a RowData
object
+ * into the control.
+ *
+ * The following code uses a RowData
object to change the initial
+ * size of a Button
in a Shell
:
+ *
+ * Display display = new Display();
+ * Shell shell = new Shell(display);
+ * shell.setLayout(new RowLayout());
+ * Button button1 = new Button(shell, SWT.PUSH);
+ * button1.setText("Button 1");
+ * button1.setLayoutData(new RowData(50, 40));
+ *
+ *
+ *
+ * @see RowLayout
+ */
+public final class RowData {
+ /**
+ * width specifies the desired width in pixels. This value
+ * is the wHint passed into Control.computeSize(int, int, bool)
+ * to determine the preferred size of the control.
+ *
+ * The default value is SWT.DEFAULT.
+ *
+ * @see dwt.widgets.Control#computeSize(int, int, bool)
+ */
+ public int width = SWT.DEFAULT;
+ /**
+ * height specifies the preferred height in pixels. This value
+ * is the hHint passed into Control.computeSize(int, int, bool)
+ * to determine the preferred size of the control.
+ *
+ * The default value is SWT.DEFAULT.
+ *
+ * @see dwt.widgets.Control#computeSize(int, int, bool)
+ */
+ public int height = SWT.DEFAULT;
+
+ /**
+ * exclude informs the layout to ignore this control when sizing
+ * and positioning controls. If this value is true
,
+ * the size and position of the control will not be managed by the
+ * layout. If this value is false
, the size and
+ * position of the control will be computed and assigned.
+ *
+ * The default value is false
.
+ *
+ * @since 3.1
+ */
+ public bool exclude = false;
+
+/**
+ * Constructs a new instance of RowData using
+ * default values.
+ */
+public this () {
+}
+
+/**
+ * Constructs a new instance of RowData according to the parameters.
+ * A value of SWT.DEFAULT indicates that no minimum width or
+ * no minimum height is specified.
+ *
+ * @param width a minimum width for the control
+ * @param height a minimum height for the control
+ */
+public this (int width, int height) {
+ this.width = width;
+ this.height = height;
+}
+
+/**
+ * Constructs a new instance of RowData according to the parameter.
+ * A value of SWT.DEFAULT indicates that no minimum width or
+ * no minimum height is specified.
+ *
+ * @param point a point whose x coordinate specifies a minimum width for the control
+ * and y coordinate specifies a minimum height for the control
+ */
+public this (Point point) {
+ this (point.x, point.y);
+}
+
+char[] getName () {
+ char[] string = this.classinfo.name;
+ int index = locatePrior( string, '.');
+ if (index is string.length ) return string;
+ return string[ index + 1 .. string.length ];
+}
+
+/**
+ * Returns a string containing a concise, human-readable
+ * description of the receiver.
+ *
+ * @return a string representation of the RowData object
+ */
+public char[] toString () {
+ char[] string = getName ()~" {";
+ if (width !is SWT.DEFAULT) string ~= "width="~to!(char[])(width)~" ";
+ if (height !is SWT.DEFAULT) string ~= "height="~to!(char[])(height)~" ";
+ if (exclude) string ~= "exclude="~to!(char[])(exclude)~" ";
+ string = trim( string );
+ string ~= "}";
+ return string;
+}
+}
diff -r d48f7334742c -r e300eb95bec4 dwt/layout/RowLayout.d
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/layout/RowLayout.d Fri Jan 11 10:57:51 2008 +0100
@@ -0,0 +1,475 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2006 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
+ *******************************************************************************/
+module dwt.layout.RowLayout;
+
+import dwt.SWT;
+import dwt.graphics.Point;
+import dwt.graphics.Rectangle;
+import dwt.widgets.Control;
+import dwt.widgets.Layout;
+import dwt.widgets.Composite;
+import dwt.layout.RowData;
+import tango.text.Util;
+import tango.util.Convert;
+import Math = tango.math.Math;
+
+
+/**
+ * Instances of this class determine the size and position of the
+ * children of a Composite
by placing them either in
+ * horizontal rows or vertical columns within the parent Composite
.
+ *
+ * RowLayout
aligns all controls in one row if the
+ * type
is set to horizontal, and one column if it is
+ * set to vertical. It has the ability to wrap, and provides configurable
+ * margins and spacing. RowLayout
has a number of configuration
+ * fields. In addition, the height and width of each control in a
+ * RowLayout
can be specified by setting a RowData
+ * object into the control using setLayoutData ()
.
+ *
+ *
+ * The following example code creates a RowLayout
, sets all
+ * of its fields to non-default values, and then sets it into a
+ * Shell
.
+ *
+ * RowLayout rowLayout = new RowLayout();
+ * rowLayout.wrap = false;
+ * rowLayout.pack = false;
+ * rowLayout.justify = true;
+ * rowLayout.type = SWT.VERTICAL;
+ * rowLayout.marginLeft = 5;
+ * rowLayout.marginTop = 5;
+ * rowLayout.marginRight = 5;
+ * rowLayout.marginBottom = 5;
+ * rowLayout.spacing = 0;
+ * shell.setLayout(rowLayout);
+ *
+ * If you are using the default field values, you only need one line of code:
+ *
+ * shell.setLayout(new RowLayout());
+ *
+ *
+ *
+ * @see RowData
+ */
+public final class RowLayout : Layout {
+
+ /**
+ * type specifies whether the layout places controls in rows or
+ * columns.
+ *
+ * The default value is HORIZONTAL.
+ *
+ * Possible values are:
+ * - HORIZONTAL: Position the controls horizontally from left to right
+ * - VERTICAL: Position the controls vertically from top to bottom
+ *
+ *
+ * @since 2.0
+ */
+ public int type = SWT.HORIZONTAL;
+
+ /**
+ * marginWidth specifies the number of pixels of horizontal margin
+ * that will be placed along the left and right edges of the layout.
+ *
+ * The default value is 0.
+ *
+ * @since 3.0
+ */
+ public int marginWidth = 0;
+
+ /**
+ * marginHeight specifies the number of pixels of vertical margin
+ * that will be placed along the top and bottom edges of the layout.
+ *
+ * The default value is 0.
+ *
+ * @since 3.0
+ */
+ public int marginHeight = 0;
+
+ /**
+ * spacing specifies the number of pixels between the edge of one cell
+ * and the edge of its neighbouring cell.
+ *
+ * The default value is 3.
+ */
+ public int spacing = 3;
+
+ /**
+ * wrap specifies whether a control will be wrapped to the next
+ * row if there is insufficient space on the current row.
+ *
+ * The default value is true.
+ */
+ public bool wrap = true;
+
+ /**
+ * pack specifies whether all controls in the layout take
+ * their preferred size. If pack is false, all controls will
+ * have the same size which is the size required to accommodate the
+ * largest preferred height and the largest preferred width of all
+ * the controls in the layout.
+ *
+ * The default value is true.
+ */
+ public bool pack = true;
+
+ /**
+ * fill specifies whether the controls in a row should be
+ * all the same height for horizontal layouts, or the same
+ * width for vertical layouts.
+ *
+ * The default value is false.
+ *
+ * @since 3.0
+ */
+ public bool fill = false;
+
+ /**
+ * justify specifies whether the controls in a row should be
+ * fully justified, with any extra space placed between the controls.
+ *
+ * The default value is false.
+ */
+ public bool justify = false;
+
+ /**
+ * marginLeft specifies the number of pixels of horizontal margin
+ * that will be placed along the left edge of the layout.
+ *
+ * The default value is 3.
+ */
+ public int marginLeft = 3;
+
+ /**
+ * marginTop specifies the number of pixels of vertical margin
+ * that will be placed along the top edge of the layout.
+ *
+ * The default value is 3.
+ */
+ public int marginTop = 3;
+
+ /**
+ * marginRight specifies the number of pixels of horizontal margin
+ * that will be placed along the right edge of the layout.
+ *
+ * The default value is 3.
+ */
+ public int marginRight = 3;
+
+ /**
+ * marginBottom specifies the number of pixels of vertical margin
+ * that will be placed along the bottom edge of the layout.
+ *
+ * The default value is 3.
+ */
+ public int marginBottom = 3;
+
+/**
+ * Constructs a new instance of this class.
+ */
+public this () {
+}
+
+/**
+ * Constructs a new instance of this class given the type.
+ *
+ * @param type the type of row layout
+ *
+ * @since 2.0
+ */
+public this (int type) {
+ this.type = type;
+}
+
+protected Point computeSize (Composite composite, int wHint, int hHint, bool flushCache_) {
+ Point extent;
+ if (type is SWT.HORIZONTAL) {
+ extent = layoutHorizontal (composite, false, (wHint !is SWT.DEFAULT) && wrap, wHint, flushCache_);
+ } else {
+ extent = layoutVertical (composite, false, (hHint !is SWT.DEFAULT) && wrap, hHint, flushCache_);
+ }
+ if (wHint !is SWT.DEFAULT) extent.x = wHint;
+ if (hHint !is SWT.DEFAULT) extent.y = hHint;
+ return extent;
+}
+
+Point computeSize (Control control, bool flushCache_) {
+ int wHint = SWT.DEFAULT, hHint = SWT.DEFAULT;
+ RowData data = cast(RowData) control.getLayoutData ();
+ if (data !is null) {
+ wHint = data.width;
+ hHint = data.height;
+ }
+ return control.computeSize (wHint, hHint, flushCache_);
+}
+
+protected bool flushCache (Control control) {
+ return true;
+}
+
+char[] getName () {
+ char[] string = this.classinfo.name;
+ int index = locatePrior( string, '.');
+ if (index is string.length ) return string;
+ return string[ index + 1 .. string.length ];
+}
+
+protected void layout (Composite composite, bool flushCache_) {
+ Rectangle clientArea = composite.getClientArea ();
+ if (type is SWT.HORIZONTAL) {
+ layoutHorizontal (composite, true, wrap, clientArea.width, flushCache_);
+ } else {
+ layoutVertical (composite, true, wrap, clientArea.height, flushCache_);
+ }
+}
+
+Point layoutHorizontal (Composite composite, bool move, bool wrap, int width, bool flushCache_) {
+ Control [] children = composite.getChildren ();
+ int count = 0;
+ for (int i=0; i width)) {
+ wrapped = true;
+ if (move && (justify || fill)) wraps [i - 1] = maxHeight;
+ x = marginLeft + marginWidth;
+ y += spacing + maxHeight;
+ if (pack) maxHeight = 0;
+ }
+ if (pack || fill) {
+ maxHeight = Math.max (maxHeight, childHeight);
+ }
+ if (move) {
+ int childX = x + clientX, childY = y + clientY;
+ if (justify || fill) {
+ bounds [i] = new Rectangle (childX, childY, childWidth, childHeight);
+ } else {
+ child.setBounds (childX, childY, childWidth, childHeight);
+ }
+ }
+ x += spacing + childWidth;
+ maxX = Math.max (maxX, x);
+ }
+ maxX = Math.max (clientX + marginLeft + marginWidth, maxX - spacing);
+ if (!wrapped) maxX += marginRight + marginWidth;
+ if (move && (justify || fill)) {
+ int space = 0, margin = 0;
+ if (!wrapped) {
+ space = Math.max (0, (width - maxX) / (count + 1));
+ margin = Math.max (0, ((width - maxX) % (count + 1)) / 2);
+ } else {
+ if (fill || justify) {
+ int last = 0;
+ if (count > 0) wraps [count - 1] = maxHeight;
+ for (int i=0; i height)) {
+ wrapped = true;
+ if (move && (justify || fill)) wraps [i - 1] = maxWidth;
+ x += spacing + maxWidth;
+ y = marginTop + marginHeight;
+ if (pack) maxWidth = 0;
+ }
+ if (pack || fill) {
+ maxWidth = Math.max (maxWidth, childWidth);
+ }
+ if (move) {
+ int childX = x + clientX, childY = y + clientY;
+ if (justify || fill) {
+ bounds [i] = new Rectangle (childX, childY, childWidth, childHeight);
+ } else {
+ child.setBounds (childX, childY, childWidth, childHeight);
+ }
+ }
+ y += spacing + childHeight;
+ maxY = Math.max (maxY, y);
+ }
+ maxY = Math.max (clientY + marginTop + marginHeight, maxY - spacing);
+ if (!wrapped) maxY += marginBottom + marginHeight;
+ if (move && (justify || fill)) {
+ int space = 0, margin = 0;
+ if (!wrapped) {
+ space = Math.max (0, (height - maxY) / (count + 1));
+ margin = Math.max (0, ((height - maxY) % (count + 1)) / 2);
+ } else {
+ if (fill || justify) {
+ int last = 0;
+ if (count > 0) wraps [count - 1] = maxWidth;
+ for (int i=0; i