changeset 0:5406a8f6526d

Add initial files
author John Reimer <terminal.node@gmail.com
date Sun, 20 Jan 2008 21:50:55 -0800
parents
children 8ac7199abbc4
files dwt/DWT.d dwt/DWTError.d dwt/DWTException.d dwt/dwthelper/BufferedInputStream.d dwt/dwthelper/ByteArrayOutputStream.d dwt/dwthelper/File.d dwt/dwthelper/FileInputStream.d dwt/dwthelper/FileOutputStream.d dwt/dwthelper/InflaterInputStream.d dwt/dwthelper/InputStream.d dwt/dwthelper/Integer.d dwt/dwthelper/OutputStream.d dwt/dwthelper/ResourceBundle.d dwt/dwthelper/Runnable.d dwt/dwthelper/System.d dwt/dwthelper/utils.d dwt/events/ArmEvent.d dwt/events/ArmListener.d dwt/events/ControlAdapter.d dwt/events/ControlEvent.d dwt/events/ControlListener.d dwt/events/DisposeEvent.d dwt/events/DisposeListener.d dwt/events/DragDetectEvent.d dwt/events/DragDetectListener.d dwt/events/ExpandAdapter.d dwt/events/ExpandEvent.d dwt/events/ExpandListener.d dwt/events/FocusAdapter.d dwt/events/FocusEvent.d dwt/events/FocusListener.d dwt/events/HelpEvent.d dwt/events/HelpListener.d dwt/events/KeyAdapter.d dwt/events/KeyEvent.d dwt/events/KeyListener.d dwt/events/MenuAdapter.d dwt/events/MenuDetectEvent.d dwt/events/MenuDetectListener.d dwt/events/MenuEvent.d dwt/events/MenuListener.d dwt/events/ModifyEvent.d dwt/events/ModifyListener.d dwt/events/MouseAdapter.d dwt/events/MouseEvent.d dwt/events/MouseListener.d dwt/events/MouseMoveListener.d dwt/events/MouseTrackAdapter.d dwt/events/MouseTrackListener.d dwt/events/MouseWheelListener.d dwt/events/PaintEvent.d dwt/events/PaintListener.d dwt/events/SelectionAdapter.d dwt/events/SelectionEvent.d dwt/events/SelectionListener.d dwt/events/ShellAdapter.d dwt/events/ShellEvent.d dwt/events/ShellListener.d dwt/events/TraverseEvent.d dwt/events/TraverseListener.d dwt/events/TreeAdapter.d dwt/events/TreeEvent.d dwt/events/TreeListener.d dwt/events/TypedEvent.d dwt/events/VerifyEvent.d dwt/events/VerifyListener.d dwt/layout/FillData.d dwt/layout/FillLayout.d dwt/layout/FormAttachment.d dwt/layout/FormData.d dwt/layout/FormLayout.d dwt/layout/GridData.d dwt/layout/GridLayout.d dwt/layout/RowData.d dwt/layout/RowLayout.d
diffstat 75 files changed, 11151 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/DWT.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,3641 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 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
+ * Port to the D Programming language:
+ *      Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+package dwt.DWT;
+
+
+import dwt.internal.Compatibility;
+import dwt.internal.Library;
+import dwt.internal.Platform;
+import dwt.DWTError;
+import dwt.DWTException;
+
+import tango.core.Exception;
+
+/**
+ * This class provides access to a small number of DWT system-wide
+ * methods, and in addition defines the public constants provided
+ * by DWT.
+ * <p>
+ * By defining constants like UP and DOWN in a single class, DWT
+ * can share common names and concepts at the same time minimizing
+ * the number of classes, names and constants for the application
+ * programmer.
+ * </p><p>
+ * Note that some of the constants provided by this class represent
+ * optional, appearance related aspects of widgets which are available
+ * either only on some window systems, or for a differing set of
+ * widgets on each window system. These constants are marked
+ * as <em>HINT</em>s. The set of widgets which support a particular
+ * <em>HINT</em> may change from release to release, although we typically
+ * will not withdraw support for a <em>HINT</em> once it is made available.
+ * </p>
+ */
+
+/* NOTE:
+ *   Good javadoc coding style is to put the values of static const
+ *   constants in the comments. This reinforces the fact that
+ *   consumers are allowed to rely on the value (and they must
+ *   since the values are compiled inline in their code). We
+ *   can <em>not</em> change the values of these constants between
+ *   releases.
+ */
+public class DWT {
+
+    /* Widget Event Constants */
+
+    /**
+     * The null event type (value is 0).
+     *
+     * @since 3.0
+     */
+    public static const int None = 0;
+
+    /**
+     * The key down event type (value is 1).
+     *
+     * @see dwt.widgets.Widget#addListener
+     * @see dwt.widgets.Display#addFilter
+     * @see dwt.widgets.Event
+     *
+     * @see dwt.widgets.Control#addKeyListener
+     * @see dwt.widgets.Tracker#addKeyListener
+     * @see dwt.events.KeyListener#keyPressed
+     * @see dwt.events.KeyEvent
+     */
+    public static const int KeyDown = 1;
+
+    /**
+     * The key up event type (value is 2).
+     *
+     * @see dwt.widgets.Widget#addListener
+     * @see dwt.widgets.Display#addFilter
+     * @see dwt.widgets.Event
+     *
+     * @see dwt.widgets.Control#addKeyListener
+     * @see dwt.widgets.Tracker#addKeyListener
+     * @see dwt.events.KeyListener#keyReleased
+     * @see dwt.events.KeyEvent
+     */
+    public static const int KeyUp = 2;
+
+    /**
+     * The mouse down event type (value is 3).
+     *
+     * @see dwt.widgets.Widget#addListener
+     * @see dwt.widgets.Display#addFilter
+     * @see dwt.widgets.Event
+     *
+     * @see dwt.widgets.Control#addMouseListener
+     * @see dwt.events.MouseListener#mouseDown
+     * @see dwt.events.MouseEvent
+     */
+    public static const int MouseDown = 3;
+
+    /**
+     * The mouse up event type (value is 4).
+     *
+     * @see dwt.widgets.Widget#addListener
+     * @see dwt.widgets.Display#addFilter
+     * @see dwt.widgets.Event
+     *
+     * @see dwt.widgets.Control#addMouseListener
+     * @see dwt.events.MouseListener#mouseUp
+     * @see dwt.events.MouseEvent
+     */
+    public static const int MouseUp = 4;
+
+    /**
+     * The mouse move event type (value is 5).
+     *
+     * @see dwt.widgets.Widget#addListener
+     * @see dwt.widgets.Display#addFilter
+     * @see dwt.widgets.Event
+     *
+     * @see dwt.widgets.Control#addMouseMoveListener
+     * @see dwt.events.MouseMoveListener#mouseMove
+     * @see dwt.events.MouseEvent
+     */
+    public static const int MouseMove = 5;
+
+    /**
+     * The mouse enter event type (value is 6).
+     *
+     * @see dwt.widgets.Widget#addListener
+     * @see dwt.widgets.Display#addFilter
+     * @see dwt.widgets.Event
+     *
+     * @see dwt.widgets.Control#addMouseTrackListener
+     * @see dwt.events.MouseTrackListener#mouseEnter
+     * @see dwt.events.MouseEvent
+     */
+    public static const int MouseEnter = 6;
+
+    /**
+     * The mouse exit event type (value is 7).
+     *
+     * @see dwt.widgets.Widget#addListener
+     * @see dwt.widgets.Display#addFilter
+     * @see dwt.widgets.Event
+     *
+     * @see dwt.widgets.Control#addMouseTrackListener
+     * @see dwt.events.MouseTrackListener#mouseExit
+     * @see dwt.events.MouseEvent
+     */
+    public static const int MouseExit = 7;
+
+    /**
+     * The mouse double click event type (value is 8).
+     *
+     * @see dwt.widgets.Widget#addListener
+     * @see dwt.widgets.Display#addFilter
+     * @see dwt.widgets.Event
+     *
+     * @see dwt.widgets.Control#addMouseListener
+     * @see dwt.events.MouseListener#mouseDoubleClick
+     * @see dwt.events.MouseEvent
+     */
+    public static const int MouseDoubleClick = 8;
+
+    /**
+     * The paint event type (value is 9).
+     *
+     * @see dwt.widgets.Widget#addListener
+     * @see dwt.widgets.Display#addFilter
+     * @see dwt.widgets.Event
+     *
+     * @see dwt.widgets.Control#addPaintListener
+     * @see dwt.events.PaintListener#paintControl
+     * @see dwt.events.PaintEvent
+     */
+    public static const int Paint = 9;
+
+    /**
+     * The move event type (value is 10).
+     *
+     * @see dwt.widgets.Widget#addListener
+     * @see dwt.widgets.Display#addFilter
+     * @see dwt.widgets.Event
+     *
+     * @see dwt.widgets.Control#addControlListener
+     * @see dwt.widgets.TableColumn#addControlListener
+     * @see dwt.widgets.Tracker#addControlListener
+     * @see dwt.widgets.TreeColumn#addControlListener
+     * @see dwt.events.ControlListener#controlMoved
+     * @see dwt.events.ControlEvent
+     */
+    public static const int Move = 10;
+
+    /**
+     * The resize event type (value is 11).
+     *
+     * @see dwt.widgets.Widget#addListener
+     * @see dwt.widgets.Display#addFilter
+     * @see dwt.widgets.Event
+     *
+     * @see dwt.widgets.Control#addControlListener
+     * @see dwt.widgets.TableColumn#addControlListener
+     * @see dwt.widgets.Tracker#addControlListener
+     * @see dwt.widgets.TreeColumn#addControlListener
+     * @see dwt.events.ControlListener#controlResized
+     * @see dwt.events.ControlEvent
+     */
+    public static const int Resize = 11;
+
+    /**
+     * The dispose event type (value is 12).
+     *
+     * @see dwt.widgets.Widget#addListener
+     * @see dwt.widgets.Display#addListener
+     * @see dwt.widgets.Display#addFilter
+     * @see dwt.widgets.Event
+     *
+     * @see dwt.widgets.Widget#addDisposeListener
+     * @see dwt.events.DisposeListener#widgetDisposed
+     * @see dwt.events.DisposeEvent
+     */
+    public static const int Dispose = 12;
+
+    /**
+     * The selection event type (value is 13).
+     *
+     * @see dwt.widgets.Widget#addListener
+     * @see dwt.widgets.Display#addFilter
+     * @see dwt.widgets.Event
+     *
+     * @see dwt.widgets.Button#addSelectionListener
+     * @see dwt.widgets.Combo#addSelectionListener
+     * @see dwt.widgets.CoolItem#addSelectionListener
+     * @see dwt.widgets.Link#addSelectionListener
+     * @see dwt.widgets.List#addSelectionListener
+     * @see dwt.widgets.MenuItem#addSelectionListener
+     * @see dwt.widgets.Sash#addSelectionListener
+     * @see dwt.widgets.Scale#addSelectionListener
+     * @see dwt.widgets.ScrollBar#addSelectionListener
+     * @see dwt.widgets.Slider#addSelectionListener
+     * @see dwt.widgets.TabFolder#addSelectionListener
+     * @see dwt.widgets.Table#addSelectionListener
+     * @see dwt.widgets.TableColumn#addSelectionListener
+     * @see dwt.widgets.ToolItem#addSelectionListener
+     * @see dwt.widgets.TrayItem#addSelectionListener
+     * @see dwt.widgets.Tree#addSelectionListener
+     * @see dwt.widgets.TreeColumn#addSelectionListener
+     * @see dwt.events.SelectionListener#widgetSelected
+     * @see dwt.events.SelectionEvent
+     */
+    public static const int Selection = 13;
+
+    /**
+     * The default selection event type (value is 14).
+     *
+     * @see dwt.widgets.Widget#addListener
+     * @see dwt.widgets.Display#addFilter
+     * @see dwt.widgets.Event
+     *
+     * @see dwt.widgets.Combo#addSelectionListener
+     * @see dwt.widgets.List#addSelectionListener
+     * @see dwt.widgets.Spinner#addSelectionListener
+     * @see dwt.widgets.Table#addSelectionListener
+     * @see dwt.widgets.Text#addSelectionListener
+     * @see dwt.widgets.TrayItem#addSelectionListener
+     * @see dwt.widgets.Tree#addSelectionListener
+     * @see dwt.events.SelectionListener#widgetDefaultSelected
+     * @see dwt.events.SelectionEvent
+     */
+    public static const int DefaultSelection = 14;
+
+    /**
+     * The focus in event type (value is 15).
+     *
+     * @see dwt.widgets.Widget#addListener
+     * @see dwt.widgets.Display#addFilter
+     * @see dwt.widgets.Event
+     *
+     * @see dwt.widgets.Control#addFocusListener
+     * @see dwt.events.FocusListener#focusGained
+     * @see dwt.events.FocusEvent
+     */
+    public static const int FocusIn = 15;
+
+    /**
+     * The focus out event type (value is 16).
+     *
+     * @see dwt.widgets.Widget#addListener
+     * @see dwt.widgets.Display#addFilter
+     * @see dwt.widgets.Event
+     *
+     * @see dwt.widgets.Control#addFocusListener
+     * @see dwt.events.FocusListener#focusLost
+     * @see dwt.events.FocusEvent
+     */
+    public static const int FocusOut = 16;
+
+    /**
+     * The expand event type (value is 17).
+     *
+     * @see dwt.widgets.Widget#addListener
+     * @see dwt.widgets.Display#addFilter
+     * @see dwt.widgets.Event
+     *
+     * @see dwt.widgets.Tree#addTreeListener
+     * @see dwt.events.TreeListener#treeExpanded
+     * @see dwt.events.TreeEvent
+     */
+    public static const int Expand = 17;
+
+    /**
+     * The collapse event type (value is 18).
+     *
+     * @see dwt.widgets.Widget#addListener
+     * @see dwt.widgets.Display#addFilter
+     * @see dwt.widgets.Event
+     *
+     * @see dwt.widgets.Tree#addTreeListener
+     * @see dwt.events.TreeListener#treeCollapsed
+     * @see dwt.events.TreeEvent
+     */
+    public static const int Collapse = 18;
+
+    /**
+     * The iconify event type (value is 19).
+     *
+     * @see dwt.widgets.Widget#addListener
+     * @see dwt.widgets.Display#addFilter
+     * @see dwt.widgets.Event
+     *
+     * @see dwt.widgets.Shell#addShellListener
+     * @see dwt.events.ShellListener#shellIconified
+     * @see dwt.events.ShellEvent
+     */
+    public static const int Iconify = 19;
+
+    /**
+     * The de-iconify event type (value is 20).
+     *
+     * @see dwt.widgets.Widget#addListener
+     * @see dwt.widgets.Display#addFilter
+     * @see dwt.widgets.Event
+     *
+     * @see dwt.widgets.Shell#addShellListener
+     * @see dwt.events.ShellListener#shellDeiconified
+     * @see dwt.events.ShellEvent
+     */
+    public static const int Deiconify = 20;
+
+    /**
+     * The close event type (value is 21).
+     *
+     * @see dwt.widgets.Widget#addListener
+     * @see dwt.widgets.Display#addListener
+     * @see dwt.widgets.Display#addFilter
+     * @see dwt.widgets.Event
+     *
+     * @see dwt.widgets.Shell#addShellListener
+     * @see dwt.events.ShellListener#shellClosed
+     * @see dwt.events.ShellEvent
+     */
+    public static const int Close = 21;
+
+    /**
+     * The show event type (value is 22).
+     *
+     * @see dwt.widgets.Widget#addListener
+     * @see dwt.widgets.Display#addFilter
+     * @see dwt.widgets.Event
+     *
+     * @see dwt.widgets.Menu#addMenuListener
+     * @see dwt.events.MenuListener#menuShown
+     * @see dwt.events.MenuEvent
+     */
+    public static const int Show = 22;
+
+    /**
+     * The hide event type (value is 23).
+     *
+     * @see dwt.widgets.Widget#addListener
+     * @see dwt.widgets.Display#addFilter
+     * @see dwt.widgets.Event
+     *
+     * @see dwt.widgets.Menu#addMenuListener
+     * @see dwt.events.MenuListener#menuHidden
+     * @see dwt.events.MenuEvent
+     */
+    public static const int Hide = 23;
+
+    /**
+     * The modify event type (value is 24).
+     *
+     * @see dwt.widgets.Widget#addListener
+     * @see dwt.widgets.Display#addFilter
+     * @see dwt.widgets.Event
+     *
+     * @see dwt.widgets.Combo#addModifyListener
+     * @see dwt.widgets.Spinner#addModifyListener
+     * @see dwt.widgets.Text#addModifyListener
+     * @see dwt.events.ModifyListener#modifyText
+     * @see dwt.events.ModifyEvent
+     */
+    public static const int Modify = 24;
+
+    /**
+     * The verify event type (value is 25).
+     *
+     * @see dwt.widgets.Widget#addListener
+     * @see dwt.widgets.Display#addFilter
+     * @see dwt.widgets.Event
+     *
+     * @see dwt.widgets.Combo#addVerifyListener
+     * @see dwt.widgets.Text#addVerifyListener
+     * @see dwt.events.VerifyListener#verifyText
+     * @see dwt.events.VerifyEvent
+     */
+    public static const int Verify = 25;
+
+    /**
+     * The activate event type (value is 26).
+     *
+     * @see dwt.widgets.Widget#addListener
+     * @see dwt.widgets.Display#addFilter
+     * @see dwt.widgets.Event
+     *
+     * @see dwt.widgets.Shell#addShellListener
+     * @see dwt.events.ShellListener#shellActivated
+     * @see dwt.events.ShellEvent
+     */
+    public static const int Activate = 26;
+
+    /**
+     * The deactivate event type (value is 27).
+     *
+     * @see dwt.widgets.Widget#addListener
+     * @see dwt.widgets.Display#addFilter
+     * @see dwt.widgets.Event
+     *
+     * @see dwt.widgets.Shell#addShellListener
+     * @see dwt.events.ShellListener#shellDeactivated
+     * @see dwt.events.ShellEvent
+     */
+    public static const int Deactivate = 27;
+
+    /**
+     * The help event type (value is 28).
+     *
+     * @see dwt.widgets.Widget#addListener
+     * @see dwt.widgets.Display#addFilter
+     * @see dwt.widgets.Event
+     *
+     * @see dwt.widgets.Control#addHelpListener
+     * @see dwt.widgets.Menu#addHelpListener
+     * @see dwt.widgets.MenuItem#addHelpListener
+     * @see dwt.events.HelpListener#helpRequested
+     * @see dwt.events.HelpEvent
+     */
+    public static const int Help = 28;
+
+    /**
+     * The drag detect event type (value is 29).
+     *
+     * @see dwt.widgets.Widget#addListener
+     * @see dwt.widgets.Display#addFilter
+     * @see dwt.widgets.Event
+     *
+     * @see dwt.dnd.DragSource
+     */
+    public static const int DragDetect = 29;
+
+    /**
+     * The arm event type (value is 30).
+     *
+     * @see dwt.widgets.Widget#addListener
+     * @see dwt.widgets.Display#addFilter
+     * @see dwt.widgets.Event
+     *
+     * @see dwt.widgets.MenuItem#addArmListener
+     * @see dwt.events.ArmListener#widgetArmed
+     * @see dwt.events.ArmEvent
+     */
+    public static const int Arm = 30;
+
+    /**
+     * The traverse event type (value is 31).
+     *
+     * @see dwt.widgets.Widget#addListener
+     * @see dwt.widgets.Display#addFilter
+     * @see dwt.widgets.Event
+     *
+     * @see dwt.widgets.Control#addTraverseListener
+     * @see dwt.events.TraverseListener#keyTraversed
+     * @see dwt.events.TraverseEvent
+     */
+    public static const int Traverse = 31;
+
+    /**
+     * The mouse hover event type (value is 32).
+     *
+     * @see dwt.widgets.Widget#addListener
+     * @see dwt.widgets.Display#addFilter
+     * @see dwt.widgets.Event
+     *
+     * @see dwt.widgets.Control#addMouseTrackListener
+     * @see dwt.events.MouseTrackListener#mouseHover
+     * @see dwt.events.MouseEvent
+     */
+    public static const int MouseHover = 32;
+
+    /**
+     * The hardware key down event type (value is 33).
+     *
+     * @see dwt.widgets.Widget#addListener
+     * @see dwt.widgets.Display#addFilter
+     * @see dwt.widgets.Event
+     */
+    public static const int HardKeyDown = 33;
+
+    /**
+     * The hardware key up event type (value is 34).
+     *
+     * @see dwt.widgets.Widget#addListener
+     * @see dwt.widgets.Display#addFilter
+     * @see dwt.widgets.Event
+     */
+    public static const int HardKeyUp = 34;
+
+    /**
+     * The menu detect event type (value is 35).
+     *
+     * @see dwt.widgets.Widget#addListener
+     * @see dwt.widgets.Display#addFilter
+     * @see dwt.widgets.Event
+     *
+     * @since 3.0
+     */
+    public static const int MenuDetect = 35;
+
+    /**
+     * The set data event type (value is 36).
+     *
+     * @see dwt.widgets.Widget#addListener
+     * @see dwt.widgets.Display#addFilter
+     * @see dwt.widgets.Event
+     *
+     * @see dwt.widgets.Table
+     * @see dwt.widgets.Tree
+     *
+     * @since 3.0
+     */
+    public static const int SetData = 36;
+
+    /**
+     * The mouse wheel event type (value is 37).
+     *
+     * @see dwt.widgets.Widget#addListener
+     * @see dwt.widgets.Display#addFilter
+     * @see dwt.widgets.Event
+     *
+     * @since 3.1
+     */
+    public static const int MouseWheel = 37;
+
+    /**
+     * The settings changed event type (value is 39).
+     * <p>
+     * The settings changed event is sent when an operating system
+     * property, such as a system font or color, has been changed.
+     * The event occurs after the property has been changed, but
+     * before any widget is redrawn.  Applications that cache operating
+     * system properties can use this event to update their caches.
+     * A specific property change can be detected by querying the
+     * new value of a property and comparing it with the equivalent
+     * cached value.  The operating system automatically redraws and
+     * lays out all widgets after this event is sent.
+     * </p>
+     *
+     * @see dwt.widgets.Display#addListener
+     * @see dwt.widgets.Event
+     *
+     * @since 3.2
+     */
+    public static const int Settings = 39;
+
+    /**
+     * The erase item event type (value is 40).
+     *
+     * @see dwt.widgets.Widget#addListener
+     * @see dwt.widgets.Display#addFilter
+     * @see dwt.widgets.Event
+     *
+     * @since 3.2
+     */
+    public static const int EraseItem = 40;
+
+    /**
+     * The measure item event type (value is 41).
+     *
+     * @see dwt.widgets.Widget#addListener
+     * @see dwt.widgets.Display#addFilter
+     * @see dwt.widgets.Event
+     *
+     * @since 3.2
+     */
+    public static const int MeasureItem = 41;
+
+    /**
+     * The paint item event type (value is 42).
+     *
+     * @see dwt.widgets.Widget#addListener
+     * @see dwt.widgets.Display#addFilter
+     * @see dwt.widgets.Event
+     *
+     * @since 3.2
+     */
+    public static const int PaintItem = 42;
+
+    /* Event Details */
+
+    /**
+     * Indicates that a user-interface component is being dragged,
+     * for example dragging the thumb of a scroll bar (value is 1).
+     */
+    public static const int DRAG = 1;
+
+    /**
+     * Event detail field that indicates a user-interface component
+     * state is selected (value is 1&lt;&lt;1).
+     *
+     * @since 3.2
+     */
+    public static const int SELECTED = 1 << 1;
+
+    /**
+     * Event detail field that indicates a user-interface component
+     * state is focused (value is 1&lt;&lt;2).
+     *
+     * @since 3.2
+     */
+    public static const int FOCUSED = 1 << 2;
+
+    /**
+     * Event detail field that indicates a user-interface component
+     * draws the background (value is 1&lt;&lt;3).
+     *
+     * @since 3.2
+     */
+    public static const int BACKGROUND = 1 << 3;
+
+    /**
+     * Event detail field that indicates a user-interface component
+     * draws the foreground (value is 1&lt;&lt;4).
+     *
+     * @since 3.2
+     */
+    public static const int FOREGROUND = 1 << 4;
+
+    /**
+     * Event detail field that indicates a user-interface component
+     * state is hot (value is 1&lt;&lt;5).
+     *
+     * @since 3.3
+     */
+    public static const int HOT = 1 << 5;
+
+    /* This code is intentionally commented */
+    //public static const int PRESSED = 1 << 3;
+    //public static const int ACTIVE = 1 << 4;
+    //public static const int DISABLED = 1 << 5;
+    //public static const int HOT = 1 << 6;
+    //public static const int DEFAULTED = 1 << 7;
+
+    /**
+     * Traversal event detail field value indicating that no
+     * traversal action should be taken
+     * (value is 0).
+     */
+    public static const int TRAVERSE_NONE = 0;
+
+    /**
+     * Traversal event detail field value indicating that the
+     * key which designates that a dialog should be cancelled was
+     * pressed; typically, this is the ESC key
+     * (value is 1&lt;&lt;1).
+     */
+    public static const int TRAVERSE_ESCAPE = 1 << 1;
+
+    /**
+     * Traversal event detail field value indicating that the
+     * key which activates the default button in a dialog was
+     * pressed; typically, this is the ENTER key
+     * (value is 1&lt;&lt;2).
+     */
+    public static const int TRAVERSE_RETURN = 1 << 2;
+
+    /**
+     * Traversal event detail field value indicating that the
+     * key which designates that focus should be given to the
+     * previous tab group was pressed; typically, this is the
+     * SHIFT-TAB key sequence
+     * (value is 1&lt;&lt;3).
+     */
+    public static const int TRAVERSE_TAB_PREVIOUS = 1 << 3;
+
+    /**
+     * Traversal event detail field value indicating that the
+     * key which designates that focus should be given to the
+     * next tab group was pressed; typically, this is the
+     * TAB key
+     * (value is 1&lt;&lt;4).
+     */
+    public static const int TRAVERSE_TAB_NEXT = 1 << 4;
+
+    /**
+     * Traversal event detail field value indicating that the
+     * key which designates that focus should be given to the
+     * previous tab item was pressed; typically, this is either
+     * the LEFT-ARROW or UP-ARROW keys
+     * (value is 1&lt;&lt;5).
+     */
+    public static const int TRAVERSE_ARROW_PREVIOUS = 1 << 5;
+
+    /**
+     * Traversal event detail field value indicating that the
+     * key which designates that focus should be given to the
+     * previous tab item was pressed; typically, this is either
+     * the RIGHT-ARROW or DOWN-ARROW keys
+     * (value is 1&lt;&lt;6).
+     */
+    public static const int TRAVERSE_ARROW_NEXT = 1 << 6;
+
+    /**
+     * Traversal event detail field value indicating that a
+     * mnemonic key sequence was pressed
+     * (value is 1&lt;&lt;7).
+     */
+    public static const int TRAVERSE_MNEMONIC = 1 << 7;
+
+    /**
+     * Traversal event detail field value indicating that the
+     * key which designates that the previous page of a multi-page
+     * window should be shown was pressed; typically, this
+     * is the CTRL-PAGEUP key sequence
+     * (value is 1&lt;&lt;8).
+     */
+    public static const int TRAVERSE_PAGE_PREVIOUS = 1 << 8;
+
+    /**
+     * Traversal event detail field value indicating that the
+     * key which designates that the next page of a multi-page
+     * window should be shown was pressed; typically, this
+     * is the CTRL-PAGEDOWN key sequence
+     * (value is 1&lt;&lt;9).
+     */
+    public static const int TRAVERSE_PAGE_NEXT = 1 << 9;
+
+    /**
+     * A constant known to be zero (0), typically used in operations
+     * which take bit flags to indicate that "no bits are set".
+     */
+    public static const int NONE = 0;
+
+    /**
+     * A constant known to be zero (0), used in operations which
+     * take pointers to indicate a null argument.
+     */
+    public static const int NULL = 0;
+
+    /**
+     * Indicates that a default should be used (value is -1).
+     */
+    public static const int DEFAULT = -1;
+
+    /**
+     * Indicates that a property is off (value is 0).
+     *
+     * @since 3.1
+     */
+    public static const int OFF = 0;
+
+    /**
+     * Indicates that a property is on (value is 1).
+     *
+     * @since 3.1
+     */
+    public static const int ON = 1;
+
+    /**
+     * Indicates low quality (value is 1).
+     *
+     * @since 3.1
+     */
+    public static const int LOW = 1;
+
+    /**
+     * Indicates high quality (value is 2).
+     *
+     * @since 3.1
+     */
+    public static const int HIGH = 2;
+
+    /**
+     * Style constant for menu bar behavior (value is 1&lt;&lt;1).
+     * <p><b>Used By:</b><ul>
+     * <li><code>Menu</code></li>
+     * </ul></p>
+     */
+    public static const int BAR = 1 << 1;
+
+    /**
+     * Style constant for drop down menu/list behavior (value is 1&lt;&lt;2).
+     * <p><b>Used By:</b><ul>
+     * <li><code>Menu</code></li>
+     * <li><code>ToolItem</code></li>
+     * <li><code>CoolItem</code></li>
+     * <li><code>Combo</code></li>
+     * </ul></p>
+     */
+    public static const int DROP_DOWN = 1 << 2;
+
+    /**
+     * Style constant for pop up menu behavior (value is 1&lt;&lt;3).
+     * <p><b>Used By:</b><ul>
+     * <li><code>Menu</code></li>
+     * </ul></p>
+     */
+    public static const int POP_UP = 1 << 3;
+
+    /**
+     * Style constant for line separator behavior (value is 1&lt;&lt;1).
+     * <p><b>Used By:</b><ul>
+     * <li><code>Label</code></li>
+     * <li><code>MenuItem</code></li>
+     * <li><code>ToolItem</code></li>
+     * </ul></p>
+     */
+    public static const int SEPARATOR = 1 << 1;
+
+    /**
+     * Style constant for toggle button behavior (value is 1&lt;&lt;1).
+     * <p><b>Used By:</b><ul>
+     * <li><code>Button</code></li>
+     * </ul></p>
+     */
+    public static const int TOGGLE = 1 << 1;
+
+    /**
+     * Style constant for arrow button behavior (value is 1&lt;&lt;2).
+     * <p><b>Used By:</b><ul>
+     * <li><code>Button</code></li>
+     * </ul></p>
+     */
+    public static const int ARROW = 1 << 2;
+
+    /**
+     * Style constant for push button behavior (value is 1&lt;&lt;3).
+     * <p><b>Used By:</b><ul>
+     * <li><code>Button</code></li>
+     * <li><code>MenuItem</code></li>
+     * <li><code>ToolItem</code></li>
+     * </ul></p>
+     */
+    public static const int PUSH = 1 << 3;
+
+    /**
+     * Style constant for radio button behavior (value is 1&lt;&lt;4).
+     * <p><b>Used By:</b><ul>
+     * <li><code>Button</code></li>
+     * <li><code>MenuItem</code></li>
+     * <li><code>ToolItem</code></li>
+     * </ul></p>
+     */
+    public static const int RADIO = 1 << 4;
+
+    /**
+     * Style constant for check box behavior (value is 1&lt;&lt;5).
+     * <p><b>Used By:</b><ul>
+     * <li><code>Button</code></li>
+     * <li><code>MenuItem</code></li>
+     * <li><code>ToolItem</code></li>
+     * <li><code>Table</code></li>
+     * <li><code>Tree</code></li>
+     * </ul></p>
+     */
+    public static const int CHECK = 1 << 5;
+
+    /**
+     * Style constant for cascade behavior (value is 1&lt;&lt;6).
+     * <p><b>Used By:</b><ul>
+     * <li><code>MenuItem</code></li>
+     * </ul></p>
+     */
+    public static const int CASCADE = 1 << 6;
+
+    /**
+     * Style constant for multi-selection behavior in lists
+     * and multiple line support on text fields (value is 1&lt;&lt;1).
+     * <p><b>Used By:</b><ul>
+     * <li><code>Text</code></li>
+     * <li><code>List</code></li>
+     * <li><code>FileDialog</code></li>
+     * </ul></p>
+     */
+    public static const int MULTI = 1 << 1;
+
+    /**
+     * Style constant for single selection behavior in lists
+     * and single line support on text fields (value is 1&lt;&lt;2).
+     * <p><b>Used By:</b><ul>
+     * <li><code>Text</code></li>
+     * <li><code>List</code></li>
+     * <li><code>Table</code></li>
+     * <li><code>Tree</code></li>
+     * </ul></p>
+     */
+    public static const int SINGLE = 1 << 2;
+
+    /**
+     * Style constant for read-only behavior (value is 1&lt;&lt;3).
+     * <p><b>Used By:</b><ul>
+     * <li><code>Combo</code></li>
+     * <li><code>Text</code></li>
+     * </ul></p>
+     */
+    public static const int READ_ONLY = 1 << 3;
+
+    /**
+     * Style constant for automatic line wrap behavior (value is 1&lt;&lt;6).
+     * <p><b>Used By:</b><ul>
+     * <li><code>Label</code></li>
+     * <li><code>Text</code></li>
+     * <li><code>ToolBar</code></li>
+     * <li><code>Spinner</code></li>
+     * </ul></p>
+     */
+    public static const int WRAP = 1 << 6;
+
+    /**
+     * Style constant for search behavior (value is 1&lt;&lt;7).
+     * <p><b>Used By:</b><ul>
+     * <li><code>Text</code></li>
+     * </ul></p>
+     *
+     * @since 3.3
+     */
+    public static const int SEARCH = 1 << 7;
+
+    /**
+     * Style constant for simple (not drop down) behavior (value is 1&lt;&lt;6).
+     * <p><b>Used By:</b><ul>
+     * <li><code>Combo</code></li>
+     * </ul></p>
+     */
+    public static const int SIMPLE = 1 << 6;
+
+    /**
+     * Style constant for password behavior (value is 1&lt;&lt;22).
+     * <p><b>Used By:</b><ul>
+     * <li><code>Text</code></li>
+     * </ul></p>
+     *
+     * @since 3.0
+     */
+    public static const int PASSWORD = 1 << 22;
+
+    /**
+     * Style constant for shadow in behavior (value is 1&lt;&lt;2).
+     * <br>Note that this is a <em>HINT</em>.
+     * <p><b>Used By:</b><ul>
+     * <li><code>Label</code></li>
+     * <li><code>Group</code></li>
+     * </ul></p>
+     */
+    public static const int SHADOW_IN = 1 << 2;
+
+    /**
+     * Style constant for shadow out behavior (value is 1&lt;&lt;3).
+     * <br>Note that this is a <em>HINT</em>.
+     * <p><b>Used By:</b><ul>
+     * <li><code>Label</code></li>
+     * <li><code>Group</code></li>
+     * <li><code>ToolBar</code></li>
+     * </ul></p>
+     */
+    public static const int SHADOW_OUT = 1 << 3;
+
+    /**
+     * Style constant for shadow etched in behavior (value is 1&lt;&lt;4).
+     * <br>Note that this is a <em>HINT</em>. It is ignored on all platforms except Motif.
+     * <p><b>Used By:</b><ul>
+     * <li><code>Group</code></li>
+     * </ul></p>
+     */
+    public static const int SHADOW_ETCHED_IN = 1 << 4;
+
+    /**
+     * Style constant for shadow etched out behavior (value is 1&lt;&lt;6).
+     * <br>Note that this is a <em>HINT</em>. It is ignored on all platforms except Motif.
+     * <p><b>Used By:</b><ul>
+     * <li><code>Group</code></li>
+     * </ul></p>
+     */
+    public static const int SHADOW_ETCHED_OUT = 1 << 6;
+
+    /**
+     * Style constant for no shadow behavior (value is 1&lt;&lt;5).
+     * <br>Note that this is a <em>HINT</em>.
+     * <p><b>Used By:</b><ul>
+     * <li><code>Label</code></li>
+     * <li><code>Group</code></li>
+     * </ul></p>
+     */
+    public static const int SHADOW_NONE = 1 << 5;
+
+    /**
+     * Style constant for progress bar behavior (value is 1&lt;&lt;1).
+     * <p><b>Used By:</b><ul>
+     * <li><code>ProgressBar</code></li>
+     * </ul></p>
+     */
+    public static const int INDETERMINATE = 1 << 1;
+
+    /**
+     * Style constant for tool window behavior (value is 1&lt;&lt;2).
+     * <p>
+     * A tool window is a window intended to be used as a floating toolbar.
+     * It typically has a title bar that is shorter than a normal title bar,
+     * and the window title is typically drawn using a smaller font.
+     * <br>Note that this is a <em>HINT</em>.
+     * </p><p><b>Used By:</b><ul>
+     * <li><code>Decorations</code> and subclasses</li>
+     * </ul></p>
+     */
+    public static const int TOOL = 1 << 2;
+
+    /**
+     * Style constant to ensure no trimmings are used (value is 1&lt;&lt;3).
+     * <br>Note that this overrides all other trim styles.
+     * <p><b>Used By:</b><ul>
+     * <li><code>Decorations</code> and subclasses</li>
+     * </ul></p>
+     */
+    public static const int NO_TRIM = 1 << 3;
+
+    /**
+     * Style constant for resize box trim (value is 1&lt;&lt;4).
+     * <p><b>Used By:</b><ul>
+     * <li><code>Decorations</code> and subclasses</li>
+     * <li><code>Tracker</code></li>
+     * </ul></p>
+     */
+    public static const int RESIZE = 1 << 4;
+
+    /**
+     * Style constant for title area trim (value is 1&lt;&lt;5).
+     * <p><b>Used By:</b><ul>
+     * <li><code>Decorations</code> and subclasses</li>
+     * </ul></p>
+     */
+    public static const int TITLE = 1 << 5;
+
+    /**
+     * Style constant for close box trim (value is 1&lt;&lt;6,
+     * since we do not distinguish between CLOSE style and MENU style).
+     * <p><b>Used By:</b><ul>
+     * <li><code>Decorations</code> and subclasses</li>
+     * </ul></p>
+     */
+    public static const int CLOSE = 1 << 6;
+
+    /**
+     * Style constant for shell menu trim (value is 1&lt;&lt;6,
+     * since we do not distinguish between CLOSE style and MENU style).
+     * <p><b>Used By:</b><ul>
+     * <li><code>Decorations</code> and subclasses</li>
+     * </ul></p>
+     */
+    public static const int MENU = CLOSE;
+
+    /**
+     * Style constant for minimize box trim (value is 1&lt;&lt;7).
+     * <p><b>Used By:</b><ul>
+     * <li><code>Decorations</code> and subclasses</li>
+     * </ul></p>
+     */
+    public static const int MIN = 1 << 7;
+
+    /**
+     * Style constant for maximize box trim (value is 1&lt;&lt;10).
+     * <p><b>Used By:</b><ul>
+     * <li><code>Decorations</code> and subclasses</li>
+     * </ul></p>
+     */
+    public static const int MAX = 1 << 10;
+
+    /**
+     * Style constant for horizontal scrollbar behavior (value is 1&lt;&lt;8).
+     * <p><b>Used By:</b><ul>
+     * <li><code>Scrollable</code> and subclasses</li>
+     * </ul></p>
+     */
+    public static const int H_SCROLL = 1 << 8;
+
+    /**
+     * Style constant for vertical scrollbar behavior (value is 1&lt;&lt;9).
+     * <p><b>Used By:</b><ul>
+     * <li><code>Scrollable</code> and subclasses</li>
+     * </ul></p>
+     */
+    public static const int V_SCROLL = 1 << 9;
+
+    /**
+     * Style constant for bordered behavior (value is 1&lt;&lt;11).
+     * <br>Note that this is a <em>HINT</em>.
+     * <p><b>Used By:</b><ul>
+     * <li><code>Control</code> and subclasses</li>
+     * </ul></p>
+     */
+    public static const int BORDER = 1 << 11;
+
+    /**
+     * Style constant indicating that the window manager should clip
+     * a widget's children with respect to its viewable area. (value is 1&lt;&lt;12).
+     * <br>Note that this is a <em>HINT</em>.
+     * <p><b>Used By:</b><ul>
+     * <li><code>Control</code> and subclasses</li>
+     * </ul></p>
+     */
+    public static const int CLIP_CHILDREN = 1 << 12;
+
+    /**
+     * Style constant indicating that the window manager should clip
+     * a widget's siblings with respect to its viewable area. (value is 1&lt;&lt;13).
+     * <br>Note that this is a <em>HINT</em>.
+     * <p><b>Used By:</b><ul>
+     * <li><code>Control</code> and subclasses</li>
+     * </ul></p>
+     */
+    public static const int CLIP_SIBLINGS = 1 << 13;
+
+    /**
+     * Style constant for always on top behavior (value is 1&lt;&lt;14).
+     * <br>Note that this is a <em>HINT</em>.
+     * <p><b>Used By:</b><ul>
+     * <li><code>Shell</code> and subclasses</li>
+     * </ul></p>
+     */
+    public static const int ON_TOP = 1 << 14;
+
+    /**
+     * Trim style convenience constant for the most common top level shell appearance
+     * (value is CLOSE|TITLE|MIN|MAX|RESIZE).
+     * <p><b>Used By:</b><ul>
+     * <li><code>Shell</code></li>
+     * </ul></p>
+     */
+    public static const int SHELL_TRIM = CLOSE | TITLE | MIN | MAX | RESIZE;
+
+    /**
+     * Trim style convenience constant for the most common dialog shell appearance
+     * (value is CLOSE|TITLE|BORDER).
+     * <p><b>Used By:</b><ul>
+     * <li><code>Shell</code></li>
+     * </ul></p>
+     */
+    public static const int DIALOG_TRIM = TITLE | CLOSE | BORDER;
+
+    /**
+     * Style constant for modeless behavior (value is 0).
+     * <br>Note that this is a <em>HINT</em>.
+     * <p><b>Used By:</b><ul>
+     * <li><code>Dialog</code></li>
+     * <li><code>Shell</code></li>
+     * </ul></p>
+     */
+    public static const int MODELESS = 0;
+
+    /**
+     * Style constant for primary modal behavior (value is 1&lt;&lt;15).
+     * <br>Note that this is a <em>HINT</em>.
+     * <p><b>Used By:</b><ul>
+     * <li><code>Dialog</code></li>
+     * <li><code>Shell</code></li>
+     * </ul></p>
+     */
+    public static const int PRIMARY_MODAL = 1 << 15;
+
+    /**
+     * Style constant for application modal behavior (value is 1&lt;&lt;16).
+     * <br>Note that this is a <em>HINT</em>.
+     * <p><b>Used By:</b><ul>
+     * <li><code>Dialog</code></li>
+     * <li><code>Shell</code></li>
+     * </ul></p>
+     */
+    public static const int APPLICATION_MODAL = 1 << 16;
+
+    /**
+     * Style constant for system modal behavior (value is 1&lt;&lt;17).
+     * <br>Note that this is a <em>HINT</em>.
+     * <p><b>Used By:</b><ul>
+     * <li><code>Dialog</code></li>
+     * <li><code>Shell</code></li>
+     * </ul></p>
+     */
+    public static const int SYSTEM_MODAL = 1 << 17;
+
+    /**
+     * Style constant for selection hiding behavior when the widget loses focus (value is 1&lt;&lt;15).
+     * <br>Note that this is a <em>HINT</em>.
+     * <p><b>Used By:</b><ul>
+     * <li><code>Table</code></li>
+     * </ul></p>
+     */
+    public static const int HIDE_SELECTION = 1 << 15;
+
+    /**
+     * Style constant for full row selection behavior and
+     * selection constant indicating that a full line should be
+     * drawn. (value is 1&lt;&lt;16).
+     * <br>Note that for some widgets this is a <em>HINT</em>.
+     * <p><b>Used By:</b><ul>
+     * <li><code>Table</code></li>
+     * <li><code>Tree</code></li>
+     * <li><code>StyledText</code></li>
+     * <li><code>TextLayout</code></li>
+     * </ul></p>
+     */
+    public static const int FULL_SELECTION = 1 << 16;
+
+    /**
+     * Style constant for flat appearance. (value is 1&lt;&lt;23).
+     * <br>Note that this is a <em>HINT</em>.
+     * <p><b>Used By:</b><ul>
+     * <li><code>Button</code></li>
+     * <li><code>ToolBar</code></li>
+     * </ul></p>
+     */
+    public static const int FLAT = 1 << 23;
+
+    /**
+     * Style constant for smooth appearance. (value is 1&lt;&lt;16).
+     * <br>Note that this is a <em>HINT</em>.
+     * <p><b>Used By:</b><ul>
+     * <li><code>ProgressBar</code></li>
+     * <li><code>Sash</code></li>
+     * </ul></p>
+     */
+    public static const int SMOOTH = 1 << 16;
+
+    /**
+     * Style constant for no background behavior (value is 1&lt;&lt;18).
+     * <p>
+     * By default, before a widget paints, the client area is filled with the current background.
+     * When this style is specified, the background is not filled, and the application is responsible
+     * for filling every pixel of the client area.
+     * This style might be used as an alternative to "double-buffering" in order to reduce flicker.
+     * This style does not mean "transparent" - widgets that are obscured will not draw through.
+     * </p><p><b>Used By:</b><ul>
+     * <li><code>Composite</code></li>
+     * </ul></p>
+     */
+    public static const int NO_BACKGROUND = 1 << 18;
+
+    /**
+     * Style constant for no focus from the mouse behavior (value is 1&lt;&lt;19).
+     * <br>Note that this is a <em>HINT</em>.
+     * <p><b>Used By:</b><ul>
+     * <li><code>Composite</code></li>
+     * </ul></p>
+     */
+    public static const int NO_FOCUS = 1 << 19;
+
+    /**
+     * Style constant for no redraw on resize behavior (value is 1&lt;&lt;20).
+     * <p>
+     * This style stops the entire client area from being invalidated when the size
+     * of the Canvas changes. Specifically, when the size of the Canvas gets smaller,
+     * the DWT.Paint event is not sent. When it gets bigger, an DWT.Paint event is
+     * sent with a GC clipped to only the new areas to be painted. Without this
+     * style, the entire client area will be repainted.
+     * </p><p><b>Used By:</b><ul>
+     * <li><code>Composite</code></li>
+     * </ul></p>
+     */
+    public static const int NO_REDRAW_RESIZE = 1 << 20;
+
+    /**
+     * Style constant for no paint event merging behavior (value is 1&lt;&lt;21).
+     * <p><b>Used By:</b><ul>
+     * <li><code>Composite</code></li>
+     * </ul></p>
+     */
+    public static const int NO_MERGE_PAINTS = 1 << 21;
+
+    /**
+     * Style constant for preventing child radio group behavior (value is 1&lt;&lt;22).
+     * <p><b>Used By:</b><ul>
+     * <li><code>Composite</code></li>
+     * </ul></p>
+     */
+    public static const int NO_RADIO_GROUP = 1 << 22;
+
+    /**
+     * Style constant for left to right orientation (value is 1&lt;&lt;25).
+     * <p>
+     * When orientation is not explicitly specified, orientation is
+     * inherited.  This means that children will be assigned the
+     * orientation of their parent.  To override this behavior and
+     * force an orientation for a child, explicitly set the orientation
+     * of the child when that child is created.
+     * <br>Note that this is a <em>HINT</em>.
+     * </p>
+     * <p><b>Used By:</b><ul>
+     * <li><code>Control</code></li>
+     * <li><code>Menu</code></li>
+     * <li><code>GC</code></li>
+     * </ul></p>
+     *
+     * @since 2.1.2
+     */
+    public static const int LEFT_TO_RIGHT = 1 << 25;
+
+    /**
+     * Style constant for right to left orientation (value is 1&lt;&lt;26).
+     * <p>
+     * When orientation is not explicitly specified, orientation is
+     * inherited.  This means that children will be assigned the
+     * orientation of their parent.  To override this behavior and
+     * force an orientation for a child, explicitly set the orientation
+     * of the child when that child is created.
+     * <br>Note that this is a <em>HINT</em>.
+     * </p>
+     * <p><b>Used By:</b><ul>
+     * <li><code>Control</code></li>
+     * <li><code>Menu</code></li>
+     * <li><code>GC</code></li>
+     * </ul></p>
+     *
+     * @since 2.1.2
+     */
+    public static const int RIGHT_TO_LEFT = 1 << 26;
+
+    /**
+     * Style constant to indicate coordinate mirroring (value is 1&lt;&lt;27).
+     * <p><b>Used By:</b><ul>
+     * <li><code>Control</code></li>
+     * <li><code>Menu</code></li>
+     * </ul></p>
+     *
+     * @since 2.1.2
+     */
+    public static const int MIRRORED = 1 << 27;
+
+    /**
+     * Style constant to allow embedding (value is 1&lt;&lt;24).
+     * <p><b>Used By:</b><ul>
+     * <li><code>Composite</code></li>
+     * </ul></p>
+     *
+     * @since 3.0
+     */
+    public static const int EMBEDDED = 1 << 24;
+
+    /**
+     * Style constant to allow virtual data (value is 1&lt;&lt;28).
+     * <p><b>Used By:</b><ul>
+     * <li><code>Table</code></li>
+     * <li><code>Tree</code></li>
+     * </ul></p>
+     *
+     * @since 3.0
+     */
+    public static const int VIRTUAL = 1 << 28;
+
+    /**
+     * Style constant to indicate double buffering (value is 1&lt;&lt;29).
+     * <p><b>Used By:</b><ul>
+     * <li><code>Control</code></li>
+     * </ul></p>
+     *
+     * @since 3.1
+     */
+    public static const int DOUBLE_BUFFERED = 1 << 29;
+
+    /**
+     * Style constant for align up behavior (value is 1&lt;&lt;7,
+     * since align UP and align TOP are considered the same).
+     * <p><b>Used By:</b><ul>
+     * <li><code>Button</code> with <code>ARROW</code> style</li>
+     * <li><code>Tracker</code></li>
+     * </ul></p>
+     */
+    public static const int UP = 1 << 7;
+
+    /**
+     * Style constant for align top behavior (value is 1&lt;&lt;7,
+     * since align UP and align TOP are considered the same).
+     * <p><b>Used By:</b><ul>
+     * <li><code>FormAttachment</code> in a <code>FormLayout</code></li>
+     * </ul></p>
+     */
+    public static const int TOP = UP;
+
+    /**
+     * Style constant for align down behavior (value is 1&lt;&lt;10,
+     * since align DOWN and align BOTTOM are considered the same).
+     * <p><b>Used By:</b><ul>
+     * <li><code>Button</code> with <code>ARROW</code> style</li>
+     * <li><code>Tracker</code></li>
+     * </ul></p>
+     */
+    public static const int DOWN               = 1 << 10;
+
+    /**
+     * Style constant for align bottom behavior (value is 1&lt;&lt;10,
+     * since align DOWN and align BOTTOM are considered the same).
+     * <p><b>Used By:</b><ul>
+     * <li><code>FormAttachment</code> in a <code>FormLayout</code></li>
+     * </ul></p>
+     */
+    public static const int BOTTOM             = DOWN;
+
+    /**
+     * Style constant for leading alignment (value is 1&lt;&lt;14).
+     * <p><b>Used By:</b><ul>
+     * <li><code>Button</code></li>
+     * <li><code>Label</code></li>
+     * <li><code>TableColumn</code></li>
+     * <li><code>Tracker</code></li>
+     * <li><code>FormAttachment</code> in a <code>FormLayout</code></li>
+     * </ul></p>
+     *
+     * @since 2.1.2
+     */
+    public static const int LEAD               = 1 << 14;
+
+    /**
+     * Style constant for align left behavior (value is 1&lt;&lt;14).
+     * This is a synonym for LEAD (value is 1&lt;&lt;14).  Newer
+     * applications should use LEAD instead of LEFT to make code more
+     * understandable on right-to-left platforms.
+     */
+    public static const int LEFT               = LEAD;
+
+    /**
+     * Style constant for trailing alignment (value is 1&lt;&lt;17).
+     * <p><b>Used By:</b><ul>
+     * <li><code>Button</code></li>
+     * <li><code>Label</code></li>
+     * <li><code>TableColumn</code></li>
+     * <li><code>Tracker</code></li>
+     * <li><code>FormAttachment</code> in a <code>FormLayout</code></li>
+     * </ul></p>
+     *
+     * @since 2.1.2
+     */
+    public static const int TRAIL              = 1 << 17;
+
+    /**
+     * Style constant for align right behavior (value is 1&lt;&lt;17).
+     * This is a synonym for TRAIL (value is 1&lt;&lt;17).  Newer
+     * applications should use TRAIL instead of RIGHT to make code more
+     * understandable on right-to-left platforms.
+     */
+    public static const int RIGHT              = TRAIL;
+
+    /**
+     * Style constant for align center behavior (value is 1&lt;&lt;24).
+     * <p><b>Used By:</b><ul>
+     * <li><code>Button</code></li>
+     * <li><code>Label</code></li>
+     * <li><code>TableColumn</code></li>
+     * <li><code>FormAttachment</code> in a <code>FormLayout</code></li>
+     * </ul></p>
+     */
+    public static const int CENTER = 1 << 24;
+
+    /**
+     * Style constant for horizontal alignment or orientation behavior (value is 1&lt;&lt;8).
+     * <p><b>Used By:</b><ul>
+     * <li><code>Label</code></li>
+     * <li><code>ProgressBar</code></li>
+     * <li><code>Sash</code></li>
+     * <li><code>Scale</code></li>
+     * <li><code>ScrollBar</code></li>
+     * <li><code>Slider</code></li>
+     * <li><code>ToolBar</code></li>
+     * <li><code>FillLayout</code> type</li>
+     * <li><code>RowLayout</code> type</li>
+     * </ul></p>
+     */
+    public static const int HORIZONTAL = 1 << 8;
+
+    /**
+     * Style constant for vertical alignment or orientation behavior (value is 1&lt;&lt;9).
+     * <p><b>Used By:</b><ul>
+     * <li><code>Label</code></li>
+     * <li><code>ProgressBar</code></li>
+     * <li><code>Sash</code></li>
+     * <li><code>Scale</code></li>
+     * <li><code>ScrollBar</code></li>
+     * <li><code>Slider</code></li>
+     * <li><code>ToolBar</code></li>
+     * <li><code>CoolBar</code></li>
+     * <li><code>FillLayout</code> type</li>
+     * <li><code>RowLayout</code> type</li>
+     * </ul></p>
+     */
+    public static const int VERTICAL = 1 << 9;
+
+    /**
+     * Style constant for date display (value is 1&lt;&lt;5).
+     * <p><b>Used By:</b><ul>
+     * <li><code>DateTime</code></li>
+     * </ul></p>
+     *
+     * @since 3.3
+     */
+    public static const int DATE = 1 << 5;
+
+    /**
+     * Style constant for time display (value is 1&lt;&lt;7).
+     * <p><b>Used By:</b><ul>
+     * <li><code>DateTime</code></li>
+     * </ul></p>
+     *
+     * @since 3.3
+     */
+    public static const int TIME = 1 << 7;
+
+    /**
+     * Style constant for calendar display (value is 1&lt;&lt;10).
+     * <p><b>Used By:</b><ul>
+     * <li><code>DateTime</code></li>
+     * </ul></p>
+     *
+     * @since 3.3
+     */
+    public static const int CALENDAR = 1 << 10;
+
+    /**
+     * Style constant for short date/time format (value is 1&lt;&lt;15).
+     * <p>
+     * A short date displays the month and year.
+     * A short time displays hours and minutes.
+     * <br>Note that this is a <em>HINT</em>.
+     * </p>
+     * <p><b>Used By:</b><ul>
+     * <li><code>DateTime</code></li>
+     * </ul></p>
+     *
+     * @since 3.3
+     */
+    public static const int SHORT = 1 << 15;
+
+    /**
+     * Style constant for medium date/time format (value is 1&lt;&lt;16).
+     * <p>
+     * A medium date displays the day, month and year.
+     * A medium time displays hours, minutes, and seconds.
+     * <br>Note that this is a <em>HINT</em>.
+     * </p>
+     * <p><b>Used By:</b><ul>
+     * <li><code>DateTime</code></li>
+     * </ul></p>
+     *
+     * @since 3.3
+     */
+    public static const int MEDIUM = 1 << 16;
+
+    /**
+     * Style constant for long date/time format (value is 1&lt;&lt;28).
+     * <p>
+     * A long date displays the day, month and year.
+     * A long time displays hours, minutes, and seconds.
+     * The day and month names may be displayed.
+     * <br>Note that this is a <em>HINT</em>.
+     * </p>
+     * <p><b>Used By:</b><ul>
+     * <li><code>DateTime</code></li>
+     * </ul></p>
+     *
+     * @since 3.3
+     */
+    public static const int LONG = 1 << 28;
+
+    /**
+     * Style constant specifying that a Browser should use a Mozilla GRE
+     * for rendering its content (value is 1&lt;&lt;15).
+     * <p>
+     * <p><b>Used By:</b><ul>
+     * <li><code>Browser</code></li>
+     * </ul></p>
+     *
+     * @since 3.3
+     */
+    public static const int MOZILLA = 1 << 15;
+
+    /**
+     * Style constant for balloon behavior (value is 1&lt;&lt;12).
+     * <p><b>Used By:</b><ul>
+     * <li><code>ToolTip</code></li>
+     * </ul></p>
+     *
+     * @since 3.2
+     */
+    public static const int BALLOON = 1 << 12;
+
+    /**
+     * Style constant for vertical alignment or orientation behavior (value is 1).
+     * <p><b>Used By:</b><ul>
+     * <li><code>GridLayout</code> type</li>
+     * </ul></p>
+     */
+    public static const int BEGINNING = 1;
+
+    /**
+     * Style constant for vertical alignment or orientation behavior (value is 4).
+     * <p><b>Used By:</b><ul>
+     * <li><code>GridLayout</code> type</li>
+     * </ul></p>
+     */
+    public static const int FILL = 4;
+
+    /**
+     * Input Method Editor style constant for double byte
+     * input behavior (value is 1&lt;&lt;1).
+     */
+    public static const int DBCS = 1 << 1;
+
+    /**
+     * Input Method Editor style constant for alpha
+     * input behavior (value is 1&lt;&lt;2).
+     */
+    public static const int ALPHA = 1 << 2;
+
+    /**
+     * Input Method Editor style constant for native
+     * input behavior (value is 1&lt;&lt;3).
+     */
+    public static const int NATIVE = 1 << 3;
+
+    /**
+     * Input Method Editor style constant for phonetic
+     * input behavior (value is 1&lt;&lt;4).
+     */
+    public static const int PHONETIC = 1 << 4;
+
+    /**
+     * Input Method Editor style constant for romanicized
+     * input behavior (value is 1&lt;&lt;5).
+     */
+    public static const int ROMAN = 1 << 5;
+
+    /**
+     * ASCII character convenience constant for the backspace character
+     * (value is the <code>char</code> '\b').
+     */
+    public static const char BS = '\b';
+
+    /**
+     * ASCII character convenience constant for the carriage return character
+     * (value is the <code>char</code> '\r').
+     */
+    public static const char CR = '\r';
+
+    /**
+     * ASCII character convenience constant for the delete character
+     * (value is the <code>char</code> with value 127).
+     */
+    public static const char DEL = 0x7F;
+
+    /**
+     * ASCII character convenience constant for the escape character
+     * (value is the <code>char</code> with value 27).
+     */
+    public static const char ESC = 0x1B;
+
+    /**
+     * ASCII character convenience constant for the line feed character
+     * (value is the <code>char</code> '\n').
+     */
+    public static const char LF = '\n';
+
+    /**
+     * ASCII character convenience constant for the tab character
+     * (value is the <code>char</code> '\t').
+     *
+     * @since 2.1
+     */
+    public static const char TAB = '\t';
+
+    /**
+     * keyboard and/or mouse event mask indicating that the ALT key
+     * was pushed on the keyboard when the event was generated
+     * (value is 1&lt;&lt;16).
+     */
+    public static const int ALT = 1 << 16;
+
+    /**
+     * Keyboard and/or mouse event mask indicating that the SHIFT key
+     * was pushed on the keyboard when the event was generated
+     * (value is 1&lt;&lt;17).
+     */
+    public static const int SHIFT = 1 << 17;
+
+    /**
+     * Keyboard and/or mouse event mask indicating that the CTRL key
+     * was pushed on the keyboard when the event was generated
+     * (value is 1&lt;&lt;18).
+     */
+    public static const int CTRL = 1 << 18;
+
+    /**
+     * Keyboard and/or mouse event mask indicating that the CTRL key
+     * was pushed on the keyboard when the event was generated. This
+     * is a synonym for CTRL (value is 1&lt;&lt;18).
+     */
+    public static const int CONTROL = CTRL;
+
+    /**
+     * Keyboard and/or mouse event mask indicating that the COMMAND key
+     * was pushed on the keyboard when the event was generated
+     * (value is 1&lt;&lt;22).
+     *
+     * @since 2.1
+     */
+    public static const int COMMAND = 1 << 22;
+
+    /**
+     * Keyboard and/or mouse event mask indicating all possible
+     * keyboard modifiers.
+     *
+     * To allow for the future, this mask  is intended to be used in
+     * place of code that references  each individual keyboard mask.
+     *  For example, the following expression will determine whether
+     * any modifier is pressed and will continue to work as new modifier
+     * masks are added.
+     *
+     * <code>(stateMask & DWT.MODIFIER_MASK) !is 0</code>.
+     *
+     * @since 2.1
+     */
+    public static const int MODIFIER_MASK;
+
+    /**
+     * Keyboard and/or mouse event mask indicating that mouse button one
+     * was pushed when the event was generated. (value is 1&lt;&lt;19).
+     */
+    public static const int BUTTON1 = 1 << 19;
+
+    /**
+     * Keyboard and/or mouse event mask indicating that mouse button two
+     * was pushed when the event was generated. (value is 1&lt;&lt;20).
+     */
+    public static const int BUTTON2 = 1 << 20;
+
+    /**
+     * Keyboard and/or mouse event mask indicating that mouse button three
+     * was pushed when the event was generated. (value is 1&lt;&lt;21).
+     */
+    public static const int BUTTON3 = 1 << 21;
+
+    /**
+     * Keyboard and/or mouse event mask indicating that mouse button four
+     * was pushed when the event was generated. (value is 1&lt;&lt;23).
+     *
+     * @since 3.1
+     */
+    public static const int BUTTON4 = 1 << 23;
+
+    /**
+     * Keyboard and/or mouse event mask indicating that mouse button five
+     * was pushed when the event was generated. (value is 1&lt;&lt;25).
+     *
+     * @since 3.1
+     */
+    public static const int BUTTON5 = 1 << 25;
+
+    /**
+     * Keyboard and/or mouse event mask indicating all possible
+     * mouse buttons.
+     *
+     * To allow for the future, this mask  is intended to be used
+     * in place of code that references each individual button mask.
+     * For example, the following expression will determine whether
+     * any button is pressed and will continue to work as new button
+     * masks are added.
+     *
+     * <code>(stateMask & DWT.BUTTON_MASK) !is 0</code>.
+     *
+     * @since 2.1
+     */
+    public static const int BUTTON_MASK;
+
+    /**
+     * Keyboard and/or mouse event mask indicating that the MOD1 key
+     * was pushed on the keyboard when the event was generated.
+     *
+     * This is the primary keyboard modifier for the platform.
+     *
+     * @since 2.1
+     */
+    public static const int MOD1;
+
+    /**
+     * Keyboard and/or mouse event mask indicating that the MOD2 key
+     * was pushed on the keyboard when the event was generated.
+     *
+     * This is the secondary keyboard modifier for the platform.
+     *
+     * @since 2.1
+     */
+    public static const int MOD2;
+
+    /**
+     * Keyboard and/or mouse event mask indicating that the MOD3 key
+     * was pushed on the keyboard when the event was generated.
+     *
+     * @since 2.1
+     */
+    public static const int MOD3;
+
+    /**
+     * Keyboard and/or mouse event mask indicating that the MOD4 key
+     * was pushed on the keyboard when the event was generated.
+     *
+     * @since 2.1
+     */
+    public static const int MOD4;
+
+    /**
+     * Constants to indicate line scrolling (value is 1).
+     * <p><b>Used By:</b><ul>
+     * <li><code>Control</code></li>
+     * </ul></p>
+     *
+     * @since 3.1
+     */
+    public static const int SCROLL_LINE = 1;
+
+    /**
+     * Constants to indicate page scrolling (value is 2).
+     * <p><b>Used By:</b><ul>
+     * <li><code>Control</code></li>
+     * </ul></p>
+     *
+     * @since 3.1
+     */
+    public static const int SCROLL_PAGE = 2;
+
+    /**
+     * Accelerator constant used to differentiate a key code from a
+     * unicode character.
+     *
+     * If this bit is set, then the key stroke
+     * portion of an accelerator represents a key code.  If this bit
+     * is not set, then the key stroke portion of an accelerator is
+     * a unicode character.
+     *
+     * The following expression is false:
+     *
+     * <code>((DWT.MOD1 | DWT.MOD2 | 'T') & DWT.KEYCODE_BIT) !is 0</code>.
+     *
+     * The following expression is true:
+     *
+     * <code>((DWT.MOD3 | DWT.F2) & DWT.KEYCODE_BIT) !is 0</code>.
+     *
+     * (value is (1&lt;&lt;24))
+     *
+     * @since 2.1
+     */
+    public static const int KEYCODE_BIT = (1 << 24);
+
+    /**
+     * Accelerator constant used to extract the key stroke portion of
+     * an accelerator.
+     *
+     * The key stroke may be a key code or a unicode
+     * value.  If the key stroke is a key code <code>KEYCODE_BIT</code>
+     * will be set.
+     *
+     * @since 2.1
+     */
+    public static const int KEY_MASK = KEYCODE_BIT + 0xFFFF;
+
+    /**
+     * Keyboard event constant representing the UP ARROW key
+     * (value is (1&lt;&lt;24)+1).
+     */
+    public static const int ARROW_UP = KEYCODE_BIT + 1;
+
+    /**
+     * Keyboard event constant representing the DOWN ARROW key
+     * (value is (1&lt;&lt;24)+2).
+     */
+    public static const int ARROW_DOWN = KEYCODE_BIT + 2;
+
+    /**
+     * Keyboard event constant representing the LEFT ARROW key
+     * (value is (1&lt;&lt;24)+3).
+     */
+    public static const int ARROW_LEFT = KEYCODE_BIT + 3;
+
+    /**
+     * Keyboard event constant representing the RIGHT ARROW key
+     * (value is (1&lt;&lt;24)+4).
+     */
+    public static const int ARROW_RIGHT = KEYCODE_BIT + 4;
+
+    /**
+     * Keyboard event constant representing the PAGE UP key
+     * (value is (1&lt;&lt;24)+5).
+     */
+    public static const int PAGE_UP = KEYCODE_BIT + 5;
+
+    /**
+     * Keyboard event constant representing the PAGE DOWN key
+     * (value is (1&lt;&lt;24)+6).
+     */
+    public static const int PAGE_DOWN = KEYCODE_BIT + 6;
+
+    /**
+     * Keyboard event constant representing the HOME key
+     * (value is (1&lt;&lt;24)+7).
+     */
+    public static const int HOME = KEYCODE_BIT + 7;
+
+    /**
+     * Keyboard event constant representing the END key
+     * (value is (1&lt;&lt;24)+8).
+     */
+    public static const int END = KEYCODE_BIT + 8;
+
+    /**
+     * Keyboard event constant representing the INSERT key
+     * (value is (1&lt;&lt;24)+9).
+     */
+    public static const int INSERT = KEYCODE_BIT + 9;
+
+    /**
+     * Keyboard event constant representing the F1 key
+     * (value is (1&lt;&lt;24)+10).
+     */
+    public static const int F1 = KEYCODE_BIT + 10;
+
+    /**
+     * Keyboard event constant representing the F2 key
+     * (value is (1&lt;&lt;24)+11).
+     */
+    public static const int F2 = KEYCODE_BIT + 11;
+
+    /**
+     * Keyboard event constant representing the F3 key
+     * (value is (1&lt;&lt;24)+12).
+     */
+    public static const int F3 = KEYCODE_BIT + 12;
+
+    /**
+     * Keyboard event constant representing the F4 key
+     * (value is (1&lt;&lt;24)+13).
+     */
+    public static const int F4 = KEYCODE_BIT + 13;
+
+    /**
+     * Keyboard event constant representing the F5 key
+     * (value is (1&lt;&lt;24)+14).
+     */
+    public static const int F5 = KEYCODE_BIT + 14;
+
+    /**
+     * Keyboard event constant representing the F6 key
+     * (value is (1&lt;&lt;24)+15).
+     */
+    public static const int F6 = KEYCODE_BIT + 15;
+
+    /**
+     * Keyboard event constant representing the F7 key
+     * (value is (1&lt;&lt;24)+16).
+     */
+    public static const int F7 = KEYCODE_BIT + 16;
+
+    /**
+     * Keyboard event constant representing the F8 key
+     * (value is (1&lt;&lt;24)+17).
+     */
+    public static const int F8 = KEYCODE_BIT + 17;
+
+    /**
+     * Keyboard event constant representing the F9 key
+     * (value is (1&lt;&lt;24)+18).
+     */
+    public static const int F9 = KEYCODE_BIT + 18;
+
+    /**
+     * Keyboard event constant representing the F10 key
+     * (value is (1&lt;&lt;24)+19).
+     */
+    public static const int F10 = KEYCODE_BIT + 19;
+
+    /**
+     * Keyboard event constant representing the F11 key
+     * (value is (1&lt;&lt;24)+20).
+     */
+    public static const int F11 = KEYCODE_BIT + 20;
+
+    /**
+     * Keyboard event constant representing the F12 key
+     * (value is (1&lt;&lt;24)+21).
+     */
+    public static const int F12 = KEYCODE_BIT + 21;
+
+    /**
+     * Keyboard event constant representing the F13 key
+     * (value is (1&lt;&lt;24)+22).
+     *
+     * @since 3.0
+     */
+    public static const int F13 = KEYCODE_BIT + 22;
+
+    /**
+     * Keyboard event constant representing the F14 key
+     * (value is (1&lt;&lt;24)+23).
+     *
+     * @since 3.0
+     */
+    public static const int F14 = KEYCODE_BIT + 23;
+
+    /**
+     * Keyboard event constant representing the F15 key
+     * (value is (1&lt;&lt;24)+24).
+     *
+     * @since 3.0
+     */
+    public static const int F15 = KEYCODE_BIT + 24;
+
+    /**
+     * Keyboard event constant representing the numeric key
+     * pad multiply key (value is (1&lt;&lt;24)+42).
+     *
+     * @since 3.0
+     */
+    public static const int KEYPAD_MULTIPLY = KEYCODE_BIT + 42;
+
+    /**
+     * Keyboard event constant representing the numeric key
+     * pad add key (value is (1&lt;&lt;24)+43).
+     *
+     * @since 3.0
+     */
+    public static const int KEYPAD_ADD = KEYCODE_BIT + 43;
+
+    /**
+     * Keyboard event constant representing the numeric key
+     * pad subtract key (value is (1&lt;&lt;24)+45).
+     *
+     * @since 3.0
+     */
+    public static const int KEYPAD_SUBTRACT = KEYCODE_BIT + 45;
+
+    /**
+     * Keyboard event constant representing the numeric key
+     * pad decimal key (value is (1&lt;&lt;24)+46).
+     *
+     * @since 3.0
+     */
+    public static const int KEYPAD_DECIMAL = KEYCODE_BIT + 46;
+
+    /**
+     * Keyboard event constant representing the numeric key
+     * pad divide key (value is (1&lt;&lt;24)+47).
+     *
+     * @since 3.0
+     */
+    public static const int KEYPAD_DIVIDE = KEYCODE_BIT + 47;
+
+    /**
+     * Keyboard event constant representing the numeric key
+     * pad zero key (value is (1&lt;&lt;24)+48).
+     *
+     * @since 3.0
+     */
+    public static const int KEYPAD_0 = KEYCODE_BIT + 48;
+
+    /**
+     * Keyboard event constant representing the numeric key
+     * pad one key (value is (1&lt;&lt;24)+49).
+     *
+     * @since 3.0
+     */
+    public static const int KEYPAD_1 = KEYCODE_BIT + 49;
+
+    /**
+     * Keyboard event constant representing the numeric key
+     * pad two key (value is (1&lt;&lt;24)+50).
+     *
+     * @since 3.0
+     */
+    public static const int KEYPAD_2 = KEYCODE_BIT + 50;
+
+    /**
+     * Keyboard event constant representing the numeric key
+     * pad three key (value is (1&lt;&lt;24)+51).
+     *
+     * @since 3.0
+     */
+    public static const int KEYPAD_3 = KEYCODE_BIT + 51;
+
+    /**
+     * Keyboard event constant representing the numeric key
+     * pad four key (value is (1&lt;&lt;24)+52).
+     *
+     * @since 3.0
+     */
+    public static const int KEYPAD_4 = KEYCODE_BIT + 52;
+
+    /**
+     * Keyboard event constant representing the numeric key
+     * pad five key (value is (1&lt;&lt;24)+53).
+     *
+     * @since 3.0
+     */
+    public static const int KEYPAD_5 = KEYCODE_BIT + 53;
+
+    /**
+     * Keyboard event constant representing the numeric key
+     * pad six key (value is (1&lt;&lt;24)+54).
+     *
+     * @since 3.0
+     */
+    public static const int KEYPAD_6 = KEYCODE_BIT + 54;
+
+    /**
+     * Keyboard event constant representing the numeric key
+     * pad seven key (value is (1&lt;&lt;24)+55).
+     *
+     * @since 3.0
+     */
+    public static const int KEYPAD_7 = KEYCODE_BIT + 55;
+
+    /**
+     * Keyboard event constant representing the numeric key
+     * pad eight key (value is (1&lt;&lt;24)+56).
+     *
+     * @since 3.0
+     */
+    public static const int KEYPAD_8 = KEYCODE_BIT + 56;
+
+    /**
+     * Keyboard event constant representing the numeric key
+     * pad nine key (value is (1&lt;&lt;24)+57).
+     *
+     * @since 3.0
+     */
+    public static const int KEYPAD_9 = KEYCODE_BIT + 57;
+
+    /**
+     * Keyboard event constant representing the numeric key
+     * pad equal key (value is (1&lt;&lt;24)+61).
+     *
+     * @since 3.0
+     */
+    public static const int KEYPAD_EQUAL = KEYCODE_BIT + 61;
+
+    /**
+     * Keyboard event constant representing the numeric key
+     * pad enter key (value is (1&lt;&lt;24)+80).
+     *
+     * @since 3.0
+     */
+    public static const int KEYPAD_CR = KEYCODE_BIT + 80;
+
+    /**
+     * Keyboard event constant representing the help
+     * key (value is (1&lt;&lt;24)+81).
+     *
+     * NOTE: The HELP key maps to the key labeled "help",
+     * not "F1". If your keyboard does not have a HELP key,
+     * you will never see this key press.  To listen for
+     * help on a control, use DWT.Help.
+     *
+     * @since 3.0
+     *
+     * @see DWT#Help
+     */
+    public static const int HELP = KEYCODE_BIT + 81;
+
+    /**
+     * Keyboard event constant representing the caps
+     * lock key (value is (1&lt;&lt;24)+82).
+     *
+     * @since 3.0
+     */
+    public static const int CAPS_LOCK = KEYCODE_BIT + 82;
+
+    /**
+     * Keyboard event constant representing the num
+     * lock key (value is (1&lt;&lt;24)+83).
+     *
+     * @since 3.0
+     */
+    public static const int NUM_LOCK = KEYCODE_BIT + 83;
+
+    /**
+     * Keyboard event constant representing the scroll
+     * lock key (value is (1&lt;&lt;24)+84).
+     *
+     * @since 3.0
+     */
+    public static const int SCROLL_LOCK = KEYCODE_BIT + 84;
+
+    /**
+     * Keyboard event constant representing the pause
+     * key (value is (1&lt;&lt;24)+85).
+     *
+     * @since 3.0
+     */
+    public static const int PAUSE = KEYCODE_BIT + 85;
+
+    /**
+     * Keyboard event constant representing the break
+     * key (value is (1&lt;&lt;24)+86).
+     *
+     * @since 3.0
+     */
+    public static const int BREAK = KEYCODE_BIT + 86;
+
+    /**
+     * Keyboard event constant representing the print screen
+     * key (value is (1&lt;&lt;24)+87).
+     *
+     * @since 3.0
+     */
+    public static const int PRINT_SCREEN = KEYCODE_BIT + 87;
+
+    /**
+     * The <code>MessageBox</code> style constant for error icon
+     * behavior (value is 1).
+     */
+    public static const int ICON_ERROR = 1;
+
+    /**
+     * The <code>MessageBox</code> style constant for information icon
+     * behavior (value is 1&lt;&lt;1).
+     */
+    public static const int ICON_INFORMATION = 1 << 1;
+
+    /**
+     * The <code>MessageBox</code> style constant for question icon
+     * behavior (value is 1&lt;&lt;2).
+     */
+    public static const int ICON_QUESTION = 1 << 2;
+
+    /**
+     * The <code>MessageBox</code> style constant for warning icon
+     * behavior (value is 1&lt;&lt;3).
+     */
+    public static const int ICON_WARNING = 1 << 3;
+
+    /**
+     * The <code>MessageBox</code> style constant for "working" icon
+     * behavior (value is 1&lt;&lt;4).
+     */
+    public static const int ICON_WORKING = 1 << 4;
+
+    /**
+     * The <code>MessageBox</code> style constant for an OK button;
+     * valid combinations are OK, OK|CANCEL
+     * (value is 1&lt;&lt;5).
+     */
+    public static const int OK = 1 << 5;
+
+    /**
+     * The <code>MessageBox</code> style constant for YES button;
+     * valid combinations are YES|NO, YES|NO|CANCEL
+     * (value is 1&lt;&lt;6).
+     */
+    public static const int YES = 1 << 6;
+
+    /**
+     * The <code>MessageBox</code> style constant for NO button;
+     * valid combinations are YES|NO, YES|NO|CANCEL
+     * (value is 1&lt;&lt;7).
+     */
+    public static const int NO = 1 << 7;
+
+    /**
+     * The <code>MessageBox</code> style constant for a CANCEL button;
+     * valid combinations are OK|CANCEL, YES|NO|CANCEL, RETRY|CANCEL
+     * (value is 1&lt;&lt;8).  This style constant is also used with
+     * <code>Text</code> in combination with SEARCH.
+     *
+     * <p><b>Used By:</b><ul>
+     * <li><code>MessageBox</code></li>
+     * <li><code>Text</code></li>
+     * </ul></p>
+     */
+    public static const int CANCEL = 1 << 8;
+
+    /**
+     * The <code>MessageBox</code> style constant for an ABORT button;
+     * the only valid combination is ABORT|RETRY|IGNORE
+     * (value is 1&lt;&lt;9).
+     */
+    public static const int ABORT = 1 << 9;
+
+    /**
+     * The <code>MessageBox</code> style constant for a RETRY button;
+     *  valid combinations are ABORT|RETRY|IGNORE, RETRY|CANCEL
+     * (value is 1&lt;&lt;10).
+     */
+    public static const int RETRY = 1 << 10;
+
+    /**
+     * The <code>MessageBox</code> style constant for an IGNORE button;
+     * the only valid combination is ABORT|RETRY|IGNORE
+     * (value is 1&lt;&lt;11).
+     */
+    public static const int IGNORE = 1 << 11;
+
+    /**
+     * The <code>FileDialog</code> style constant for open file dialog behavior
+     * (value is 1&lt;&lt;12).
+     */
+    public static const int OPEN = 1 << 12;
+
+    /**
+     * The <code>FileDialog</code> style constant for save file dialog behavior
+     * (value is 1&lt;&lt;13).
+     */
+    public static const int SAVE = 1 << 13;
+
+    /**
+     * The <code>Composite</code> constant to indicate that
+     * an attribute (such as background) is not inherited
+     * by the children (value is 0).
+     *
+     * @since 3.2
+     */
+    public static const int INHERIT_NONE = 0;
+
+    /**
+     * The <code>Composite</code> constant to indicate that
+     * an attribute (such as background) is inherited by
+     * children who choose this value as their "default"
+     * (value is 1).  For example, a label child will
+     * typically choose to inherit the background color
+     * of a composite while a list or table will not.
+     *
+     * @since 3.2
+     */
+    public static const int INHERIT_DEFAULT = 1;
+
+    /**
+     * The <code>Composite</code> constant to indicate that
+     * an attribute (such as background) is inherited by
+     * all children.
+     *
+     * @since 3.2
+     */
+    public static const int INHERIT_FORCE = 2;
+
+    /**
+     * Default color white (value is 1).
+     */
+    public static const int COLOR_WHITE = 1;
+
+    /**
+     * Default color black (value is 2).
+     */
+    public static const int COLOR_BLACK = 2;
+
+    /**
+     * Default color red (value is 3).
+     */
+    public static const int COLOR_RED = 3;
+
+    /**
+     * Default color dark red (value is 4).
+     */
+    public static const int COLOR_DARK_RED = 4;
+
+    /**
+     * Default color green (value is 5).
+     */
+    public static const int COLOR_GREEN = 5;
+
+    /**
+     * Default color dark green (value is 6).
+     */
+    public static const int COLOR_DARK_GREEN = 6;
+
+    /**
+     * Default color yellow (value is 7).
+     */
+    public static const int COLOR_YELLOW = 7;
+
+    /**
+     * Default color dark yellow (value is 8).
+     */
+    public static const int COLOR_DARK_YELLOW = 8;
+
+    /**
+     * Default color blue (value is 9).
+     */
+    public static const int COLOR_BLUE = 9;
+
+    /**
+     * Default color dark blue (value is 10).
+     */
+    public static const int COLOR_DARK_BLUE = 10;
+
+    /**
+     * Default color magenta (value is 11).
+     */
+    public static const int COLOR_MAGENTA = 11;
+
+    /**
+     * Default color dark magenta (value is 12).
+     */
+    public static const int COLOR_DARK_MAGENTA = 12;
+
+    /**
+     * Default color cyan (value is 13).
+     */
+    public static const int COLOR_CYAN = 13;
+
+    /**
+     * Default color dark cyan (value is 14).
+     */
+    public static const int COLOR_DARK_CYAN = 14;
+
+    /**
+     * Default color gray (value is 15).
+     */
+    public static const int COLOR_GRAY = 15;
+
+    /**
+     * Default color dark gray (value is 16).
+     */
+    public static const int COLOR_DARK_GRAY = 16;
+
+    /*
+     * System Colors
+     *
+     * Dealing with system colors is an area where there are
+     * many platform differences.  On some platforms, system
+     * colors can change dynamically while the program is
+     * running.  On other platforms, system colors can be
+     * changed for all instances of a particular widget.
+     * Therefore, the only truly portable method to obtain
+     * a widget color query is to query the color from an
+     * instance of the widget.
+     *
+     *  It is expected that the list of supported colors
+     * will grow over time.
+     */
+
+    /**
+     * System color used to paint dark shadow areas (value is 17).
+     */
+    public static const int COLOR_WIDGET_DARK_SHADOW = 17;
+
+    /**
+     * System color used to paint normal shadow areas (value is 18).
+     */
+    public static const int COLOR_WIDGET_NORMAL_SHADOW = 18;
+
+    /**
+     * System color used to paint light shadow areas (value is 19).
+     */
+    public static const int COLOR_WIDGET_LIGHT_SHADOW = 19;
+
+    /**
+     * System color used to paint highlight shadow areas (value is 20).
+     */
+    public static const int COLOR_WIDGET_HIGHLIGHT_SHADOW = 20;
+
+    /**
+     * System color used to paint foreground areas (value is 21).
+     */
+    public static const int COLOR_WIDGET_FOREGROUND = 21;
+
+    /**
+     * System color used to paint background areas (value is 22).
+     */
+    public static const int COLOR_WIDGET_BACKGROUND = 22;
+
+    /**
+     * System color used to paint border areas (value is 23).
+     */
+    public static const int COLOR_WIDGET_BORDER = 23;
+
+    /**
+     * System color used to paint list foreground areas (value is 24).
+     */
+    public static const int COLOR_LIST_FOREGROUND = 24;
+
+    /**
+     * System color used to paint list background areas (value is 25).
+     */
+    public static const int COLOR_LIST_BACKGROUND = 25;
+
+    /**
+     * System color used to paint list selection background areas (value is 26).
+     */
+    public static const int COLOR_LIST_SELECTION = 26;
+
+    /**
+     * System color used to paint list selected text (value is 27).
+     */
+    public static const int COLOR_LIST_SELECTION_TEXT = 27;
+
+    /**
+     * System color used to paint tooltip text (value is 28).
+     */
+    public static const int COLOR_INFO_FOREGROUND = 28;
+
+    /**
+     * System color used to paint tooltip background areas (value is 29).
+     */
+    public static const int COLOR_INFO_BACKGROUND = 29;
+
+    /**
+     * System color used to paint title text (value is 30).
+     */
+    public static const int COLOR_TITLE_FOREGROUND = 30;
+
+    /**
+     * System color used to paint title background areas (value is 31).
+     */
+    public static const int COLOR_TITLE_BACKGROUND = 31;
+
+    /**
+     * System color used to paint title background gradient (value is 32).
+     */
+    public static const int COLOR_TITLE_BACKGROUND_GRADIENT = 32;
+
+    /**
+     * System color used to paint inactive title text (value is 33).
+     */
+    public static const int COLOR_TITLE_INACTIVE_FOREGROUND = 33;
+
+    /**
+     * System color used to paint inactive title background areas (value is 34).
+     */
+    public static const int COLOR_TITLE_INACTIVE_BACKGROUND = 34;
+
+    /**
+     * System color used to paint inactive title background gradient (value is 35).
+     */
+    public static const int COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT = 35;
+
+    /**
+     * Draw constant indicating whether the drawing operation
+     * should fill the background (value is 1&lt;&lt;0).
+     */
+    public static const int DRAW_TRANSPARENT = 1 << 0;
+
+    /**
+     * Draw constant indicating whether the string drawing operation
+     * should handle line-delimiters (value is 1&lt;&lt;1).
+     */
+    public static const int DRAW_DELIMITER = 1 << 1;
+
+    /**
+     * Draw constant indicating whether the string drawing operation
+     * should expand TAB characters (value is 1&lt;&lt;2).
+     */
+    public static const int DRAW_TAB = 1 << 2;
+
+    /**
+     * Draw constant indicating whether the string drawing operation
+     * should handle mnemonics (value is 1&lt;&lt;3).
+     */
+    public static const int DRAW_MNEMONIC = 1 << 3;
+
+
+    /**
+     * Selection constant indicating that a line delimiter should be
+     * drawn (value is 1&lt;&lt;17).
+     *
+     * <p><b>Used By:</b><ul>
+     * <li><code>TextLayout</code></li>
+     * </ul></p>
+     *
+     * @see #FULL_SELECTION
+     * @see #LAST_LINE_SELECTION
+     *
+     * @since 3.3
+     */
+    public static const int DELIMITER_SELECTION = 1 << 17;
+
+    /**
+     * Selection constant indicating that the last line is selected
+     * to the end and should be drawn using either a line delimiter
+     * or full line selection (value is 1&lt;&lt;20).
+     *
+     * <p><b>Used By:</b><ul>
+     * <li><code>TextLayout</code></li>
+     * </ul></p>
+     *
+     * @see #DELIMITER_SELECTION
+     * @see #FULL_SELECTION
+     *
+     * @since 3.3
+     */
+    public static const int LAST_LINE_SELECTION = 1 << 20;
+
+    /**
+     * DWT error constant indicating that no error number was specified
+     * (value is 1).
+     */
+    public static const int ERROR_UNSPECIFIED = 1;
+
+    /**
+     * DWT error constant indicating that no more handles for an
+     * operating system resource are available
+     * (value is 2).
+     */
+    public static const int ERROR_NO_HANDLES = 2;
+
+    /**
+     * DWT error constant indicating that no more callback resources are available
+     * (value is 3).
+     */
+    public static const int ERROR_NO_MORE_CALLBACKS = 3;
+
+    /**
+     * DWT error constant indicating that a null argument was passed in
+     * (value is 4).
+     */
+    public static const int ERROR_NULL_ARGUMENT = 4;
+
+    /**
+     * DWT error constant indicating that an invalid argument was passed in
+     * (value is 5).
+     */
+    public static const int ERROR_INVALID_ARGUMENT = 5;
+
+    /**
+     * DWT error constant indicating that a value was found to be
+     * outside the allowable range
+     * (value is 6).
+     */
+    public static const int ERROR_INVALID_RANGE = 6;
+
+    /**
+     * DWT error constant indicating that a value which can not be
+     * zero was found to be
+     * (value is 7).
+     */
+    public static const int ERROR_CANNOT_BE_ZERO = 7;
+
+    /**
+     * DWT error constant indicating that the underlying operating
+     * system was unable to provide the value of an item
+     * (value is 8).
+     */
+    public static const int ERROR_CANNOT_GET_ITEM = 8;
+
+    /**
+     * DWT error constant indicating that the underlying operating
+     * system was unable to provide the selection
+     * (value is 9).
+     */
+    public static const int ERROR_CANNOT_GET_SELECTION = 9;
+
+    /**
+     * DWT error constant indicating that the matrix is not invertible
+     * (value is 10).
+     *
+     * @since 3.1
+     */
+    public static const int ERROR_CANNOT_INVERT_MATRIX = 10;
+
+    /**
+     * DWT error constant indicating that the underlying operating
+     * system was unable to provide the height of an item
+     * (value is 11).
+     */
+    public static const int ERROR_CANNOT_GET_ITEM_HEIGHT = 11;
+
+    /**
+     * DWT error constant indicating that the underlying operating
+     * system was unable to provide the text of a widget
+     * (value is 12).
+     */
+    public static const int ERROR_CANNOT_GET_TEXT = 12;
+
+    /**
+     * DWT error constant indicating that the underlying operating
+     * system was unable to set the text of a widget
+     * (value is 13).
+     */
+    public static const int ERROR_CANNOT_SET_TEXT = 13;
+
+    /**
+     * DWT error constant indicating that the underlying operating
+     * system was unable to add an item
+     * (value is 14).
+     */
+    public static const int ERROR_ITEM_NOT_ADDED = 14;
+
+    /**
+     * DWT error constant indicating that the underlying operating
+     * system was unable to remove an item
+     * (value is 15).
+     */
+    public static const int ERROR_ITEM_NOT_REMOVED = 15;
+
+    /**
+     * DWT error constant indicating that the graphics library
+     * is not available
+     * (value is 16).
+     */
+    public static const int ERROR_NO_GRAPHICS_LIBRARY = 16;
+
+    /**
+     * DWT error constant indicating that a particular feature has
+     * not been implemented on this platform
+     * (value is 20).
+     */
+    public static const int ERROR_NOT_IMPLEMENTED = 20;
+
+    /**
+     * DWT error constant indicating that a menu which needed
+     * to have the drop down style had some other style instead
+     * (value is 21).
+     */
+    public static const int ERROR_MENU_NOT_DROP_DOWN = 21;
+
+    /**
+     * DWT error constant indicating that an attempt was made to
+     * invoke an DWT operation which can only be executed by the
+     * user-interface thread from some other thread
+     * (value is 22).
+     */
+    public static const int ERROR_THREAD_INVALID_ACCESS = 22;
+
+    /**
+     * DWT error constant indicating that an attempt was made to
+     * invoke an DWT operation using a widget which had already
+     * been disposed
+     * (value is 24).
+     */
+    public static const int ERROR_WIDGET_DISPOSED = 24;
+
+    /**
+     * DWT error constant indicating that a menu item which needed
+     * to have the cascade style had some other style instead
+     * (value is 27).
+     */
+    public static const int ERROR_MENUITEM_NOT_CASCADE = 27;
+
+    /**
+     * DWT error constant indicating that the underlying operating
+     * system was unable to set the selection of a widget
+     * (value is 28).
+     */
+    public static const int ERROR_CANNOT_SET_SELECTION = 28;
+
+    /**
+     * DWT error constant indicating that the underlying operating
+     * system was unable to set the menu
+     * (value is 29).
+     */
+    public static const int ERROR_CANNOT_SET_MENU = 29;
+
+    /**
+     * DWT error constant indicating that the underlying operating
+     * system was unable to set the enabled state
+     * (value is 30).
+     */
+    public static const int ERROR_CANNOT_SET_ENABLED = 30;
+
+    /**
+     * DWT error constant indicating that the underlying operating
+     * system was unable to provide enabled/disabled state information
+     * (value is 31).
+     */
+    public static const int ERROR_CANNOT_GET_ENABLED = 31;
+
+    /**
+     * DWT error constant indicating that a provided widget can
+     * not be used as a parent in the current operation
+     * (value is 32).
+     */
+    public static const int ERROR_INVALID_PARENT = 32;
+
+    /**
+     * DWT error constant indicating that a menu which needed
+     * to have the menu bar style had some other style instead
+     * (value is 33).
+     */
+    public static const int ERROR_MENU_NOT_BAR = 33;
+
+    /**
+     * DWT error constant indicating that the underlying operating
+     * system was unable to provide count information
+     * (value is 36).
+     */
+    public static const int ERROR_CANNOT_GET_COUNT = 36;
+
+    /**
+     * DWT error constant indicating that a menu which needed
+     * to have the pop up menu style had some other style instead
+     * (value is 37).
+     */
+    public static const int ERROR_MENU_NOT_POP_UP = 37;
+
+    /**
+     * DWT error constant indicating that a graphics operation
+     * was attempted with an image of an unsupported depth
+     * (value is 38).
+     */
+    public static const int ERROR_UNSUPPORTED_DEPTH = 38;
+
+    /**
+     * DWT error constant indicating that an input/output operation
+     * failed during the execution of an DWT operation
+     * (value is 39).
+     */
+    public static const int ERROR_IO = 39;
+
+    /**
+     * DWT error constant indicating that a graphics operation
+     * was attempted with an image having an invalid format
+     * (value is 40).
+     */
+    public static const int ERROR_INVALID_IMAGE = 40;
+
+    /**
+     * DWT error constant indicating that a graphics operation
+     * was attempted with an image having a valid but unsupported
+     * format
+     * (value is 42).
+     */
+    public static const int ERROR_UNSUPPORTED_FORMAT = 42;
+
+    /**
+     * DWT error constant indicating that an attempt was made
+     * to subclass an DWT widget class without implementing the
+     * <code>checkSubclass()</code> method
+     * (value is 43).
+     *
+     * For additional information see the comment in
+     * <code>Widget.checkSubclass()</code>.
+     *
+     * @see dwt.widgets.Widget#checkSubclass
+     */
+    public static const int ERROR_INVALID_SUBCLASS = 43;
+
+    /**
+     * DWT error constant indicating that an attempt was made to
+     * invoke an DWT operation using a graphics object which had
+     * already been disposed
+     * (value is 44).
+     */
+    public static const int ERROR_GRAPHIC_DISPOSED = 44;
+
+    /**
+     * DWT error constant indicating that an attempt was made to
+     * invoke an DWT operation using a device which had already
+     * been disposed
+     * (value is 45).
+     */
+    public static const int ERROR_DEVICE_DISPOSED = 45;
+
+    /**
+     * DWT error constant indicating that an exception happened
+     * when executing a runnable
+     * (value is 46).
+     */
+    public static const int ERROR_FAILED_EXEC = 46;
+
+    /**
+     * DWT error constant indicating that an unsatisfied link
+     * error occurred while attempting to load a library
+     * (value is 47).
+     *
+     * @since 3.1
+     */
+    public static const int ERROR_FAILED_LOAD_LIBRARY = 47;
+
+    /**
+     * DWT error constant indicating that a font is not valid
+     * (value is 48).
+     *
+     * @since 3.1
+     */
+    public static const int ERROR_INVALID_FONT = 48;
+
+    /**
+     * Constant indicating that an image or operation is of type bitmap  (value is 0).
+     */
+    public static const int BITMAP = 0;
+
+    /**
+     * Constant indicating that an image or operation is of type icon  (value is 1).
+     */
+    public static const int ICON = 1;
+
+    /**
+     * The <code>Image</code> constructor argument indicating that
+     * the new image should be a copy of the image provided as
+     * an argument  (value is 0).
+     */
+    public static const int IMAGE_COPY = 0;
+
+    /**
+     * The <code>Image</code> constructor argument indicating that
+     * the new image should have the appearance of a "disabled"
+     * (using the platform's rules for how this should look)
+     * copy of the image provided as an argument  (value is 1).
+     */
+    public static const int IMAGE_DISABLE = 1;
+
+    /**
+     * The <code>Image</code> constructor argument indicating that
+     * the new image should have the appearance of a "gray scaled"
+     * copy of the image provided as an argument  (value is 2).
+     */
+    public static const int IMAGE_GRAY = 2;
+
+    /**
+     * The font style constant indicating a normal weight, non-italic font
+     * (value is 0).
+     */
+    public static const int NORMAL = 0;
+
+    /**
+     * The font style constant indicating a bold weight font
+     * (value is 1&lt;&lt;0).
+     */
+    public static const int BOLD = 1 << 0;
+
+    /**
+     * The font style constant indicating an italic font
+     * (value is 1&lt;&lt;1).
+     */
+    public static const int ITALIC = 1 << 1;
+
+    /**
+     * System arrow cursor  (value is 0).
+     */
+    public static const int CURSOR_ARROW = 0;
+
+    /**
+     * System wait cursor  (value is 1).
+     */
+    public static const int CURSOR_WAIT = 1;
+
+    /**
+     * System cross hair cursor  (value is 2).
+     */
+    public static const int CURSOR_CROSS = 2;
+
+    /**
+     * System app startup cursor  (value is 3).
+     */
+    public static const int CURSOR_APPSTARTING = 3;
+
+    /**
+     * System help cursor  (value is 4).
+     */
+    public static const int CURSOR_HELP = 4;
+
+    /**
+     * System resize all directions cursor (value is 5).
+     */
+    public static const int CURSOR_SIZEALL = 5;
+
+    /**
+     * System resize north-east-south-west cursor  (value is 6).
+     */
+    public static const int CURSOR_SIZENESW = 6;
+
+    /**
+     * System resize north-south cursor  (value is 7).
+     */
+    public static const int CURSOR_SIZENS = 7;
+
+    /**
+     * System resize north-west-south-east cursor  (value is 8).
+     */
+    public static const int CURSOR_SIZENWSE = 8;
+
+    /**
+     * System resize west-east cursor  (value is 9).
+     */
+    public static const int CURSOR_SIZEWE = 9;
+
+    /**
+     * System resize north cursor  (value is 10).
+     */
+    public static const int CURSOR_SIZEN = 10;
+
+    /**
+     * System resize south cursor  (value is 11).
+     */
+    public static const int CURSOR_SIZES = 11;
+
+    /**
+     * System resize east cursor  (value is 12).
+     */
+    public static const int CURSOR_SIZEE = 12;
+
+    /**
+     * System resize west cursor  (value is 13).
+     */
+    public static const int CURSOR_SIZEW = 13;
+
+    /**
+     * System resize north-east cursor (value is 14).
+     */
+    public static const int CURSOR_SIZENE = 14;
+
+    /**
+     * System resize south-east cursor (value is 15).
+     */
+    public static const int CURSOR_SIZESE = 15;
+
+    /**
+     * System resize south-west cursor (value is 16).
+     */
+    public static const int CURSOR_SIZESW = 16;
+
+    /**
+     * System resize north-west cursor (value is 17).
+     */
+    public static const int CURSOR_SIZENW = 17;
+
+    /**
+     * System up arrow cursor  (value is 18).
+     */
+    public static const int CURSOR_UPARROW = 18;
+
+    /**
+     * System i-beam cursor (value is 19).
+     */
+    public static const int CURSOR_IBEAM = 19;
+
+    /**
+     * System "not allowed" cursor (value is 20).
+     */
+    public static const int CURSOR_NO = 20;
+
+    /**
+     * System hand cursor (value is 21).
+     */
+    public static const int CURSOR_HAND = 21;
+
+    /**
+     * Line drawing style for flat end caps (value is 1).
+     *
+     * @see dwt.graphics.GC#setLineCap(int)
+     * @see dwt.graphics.GC#getLineCap()
+     *
+     * @since 3.1
+     */
+    public static const int CAP_FLAT = 1;
+
+    /**
+     * Line drawing style for rounded end caps (value is 2).
+     *
+     * @see dwt.graphics.GC#setLineCap(int)
+     * @see dwt.graphics.GC#getLineCap()
+     *
+     * @since 3.1
+     */
+    public static const int CAP_ROUND = 2;
+
+    /**
+     * Line drawing style for square end caps (value is 3).
+     *
+     * @see dwt.graphics.GC#setLineCap(int)
+     * @see dwt.graphics.GC#getLineCap()
+     *
+     * @since 3.1
+     */
+    public static const int CAP_SQUARE = 3;
+
+    /**
+     * Line drawing style for miter joins (value is 1).
+     *
+     * @see dwt.graphics.GC#setLineJoin(int)
+     * @see dwt.graphics.GC#getLineJoin()
+     *
+     * @since 3.1
+     */
+    public static const int JOIN_MITER = 1;
+
+    /**
+     * Line drawing  style for rounded joins (value is 2).
+     *
+     * @see dwt.graphics.GC#setLineJoin(int)
+     * @see dwt.graphics.GC#getLineJoin()
+     *
+     * @since 3.1
+     */
+    public static const int JOIN_ROUND = 2;
+
+    /**
+     * Line drawing style for bevel joins (value is 3).
+     *
+     * @see dwt.graphics.GC#setLineJoin(int)
+     * @see dwt.graphics.GC#getLineJoin()
+     *
+     * @since 3.1
+     */
+    public static const int JOIN_BEVEL = 3;
+
+    /**
+     * Line drawing style for solid lines  (value is 1).
+     */
+    public static const int LINE_SOLID = 1;
+
+    /**
+     * Line drawing style for dashed lines (value is 2).
+     */
+    public static const int LINE_DASH = 2;
+
+    /**
+     * Line drawing style for dotted lines (value is 3).
+     */
+    public static const int LINE_DOT = 3;
+
+    /**
+     * Line drawing style for alternating dash-dot lines (value is 4).
+     */
+    public static const int LINE_DASHDOT = 4;
+
+    /**
+     * Line drawing style for dash-dot-dot lines (value is 5).
+     */
+    public static const int LINE_DASHDOTDOT = 5;
+
+    /**
+     * Line drawing style for custom dashed lines (value is 6).
+     *
+     * @see dwt.graphics.GC#setLineDash(int[])
+     * @see dwt.graphics.GC#getLineDash()
+     *
+     * @since 3.1
+     */
+    public static const int LINE_CUSTOM = 6;
+
+    /**
+     * Path constant that represents a "move to" operation (value is 1).
+     *
+     * @since 3.1
+     */
+    public static const int PATH_MOVE_TO = 1;
+
+    /**
+     * Path constant that represents a "line to" operation (value is 2).
+     *
+     * @since 3.1
+     */
+    public static const int PATH_LINE_TO = 2;
+
+    /**
+     * Path constant that represents a "quadratic curve to" operation (value is 3).
+     *
+     * @since 3.1
+     */
+    public static const int PATH_QUAD_TO = 3;
+
+    /**
+     * Path constant that represents a "cubic curve to" operation (value is 4).
+     *
+     * @since 3.1
+     */
+    public static const int PATH_CUBIC_TO = 4;
+
+    /**
+     * Path constant that represents a "close" operation (value is 5).
+     *
+     * @since 3.1
+     */
+    public static const int PATH_CLOSE = 5;
+
+    /**
+     * Even odd rule for filling operations (value is 1).
+     *
+     * @since 3.1
+     */
+    public static const int FILL_EVEN_ODD = 1;
+
+    /**
+     * Winding rule for filling operations (value is 2).
+     *
+     * @since 3.1
+     */
+    public static const int FILL_WINDING = 2;
+
+    /**
+     * Image format constant indicating an unknown image type (value is -1).
+     */
+    public static const int IMAGE_UNDEFINED = -1;
+
+    /**
+     * Image format constant indicating a Windows BMP format image (value is 0).
+     */
+    public static const int IMAGE_BMP = 0;
+
+    /**
+     * Image format constant indicating a run-length encoded
+     * Windows BMP format image (value is 1).
+     */
+    public static const int IMAGE_BMP_RLE = 1;
+
+    /**
+     * Image format constant indicating a GIF format image (value is 2).
+     */
+    public static const int IMAGE_GIF = 2;
+
+    /**
+     * Image format constant indicating a ICO format image (value is 3).
+     */
+    public static const int IMAGE_ICO = 3;
+
+    /**
+     * Image format constant indicating a JPEG format image (value is 4).
+     */
+    public static const int IMAGE_JPEG = 4;
+
+    /**
+     * Image format constant indicating a PNG format image (value is 5).
+     */
+    public static const int IMAGE_PNG = 5;
+
+    /**
+     * Image format constant indicating a TIFF format image (value is 6).
+     */
+    public static const int IMAGE_TIFF = 6;
+
+    /**
+     * Image format constant indicating an OS/2 BMP format image (value is 7).
+     */
+    public static const int IMAGE_OS2_BMP = 7;
+
+    /**
+     * GIF image disposal method constants indicating that the
+     * disposal method is unspecified (value is 0).
+     */
+    public static const int DM_UNSPECIFIED = 0x0;
+
+    /**
+     * GIF image disposal method constants indicating that the
+     * disposal method is to do nothing; that is, to leave the
+     * previous image in place (value is 1).
+     */
+    public static const int DM_FILL_NONE = 0x1;
+
+    /**
+     * GIF image disposal method constants indicating that the
+     * the previous images should be covered with the background
+     * color before displaying the next image (value is 2).
+     */
+    public static const int DM_FILL_BACKGROUND = 0x2;
+
+    /**
+     * GIF image disposal method constants indicating that the
+     * disposal method is to restore the previous picture
+     * (value is 3).
+     */
+    public static const int DM_FILL_PREVIOUS = 0x3;
+
+    /**
+     * Image transparency constant indicating that the image
+     * contains no transparency information (value is 0).
+     */
+    public static const int TRANSPARENCY_NONE = 0x0;
+
+    /**
+     * Image transparency constant indicating that the image
+     * contains alpha transparency information (value is 1&lt;&lt;0).
+     */
+    public static const int TRANSPARENCY_ALPHA = 1 << 0;
+
+    /**
+     * Image transparency constant indicating that the image
+     * contains a transparency mask (value is 1&lt;&lt;1).
+     */
+    public static const int TRANSPARENCY_MASK = 1 << 1;
+
+    /**
+     * Image transparency constant indicating that the image
+     * contains a transparent pixel (value is 1&lt;&lt;2).
+     */
+    public static const int TRANSPARENCY_PIXEL = 1 << 2;
+
+    /**
+     * The character movement type (value is 1&lt;&lt;0).
+     * This constant is used to move a text offset over a character.
+     *
+     * @see dwt.graphics.TextLayout#getNextOffset(int, int)
+     * @see dwt.graphics.TextLayout#getPreviousOffset(int, int)
+     *
+     * @since 3.0
+     */
+    public static const int MOVEMENT_CHAR = 1 << 0;
+
+    /**
+     * The cluster movement type (value is 1&lt;&lt;1).
+     * This constant is used to move a text offset over a cluster.
+     * A cluster groups one or more characters. A cluster is
+     * undivisible, this means that a caret offset can not be placed in the
+     * middle of a cluster.
+     *
+     * @see dwt.graphics.TextLayout#getNextOffset(int, int)
+     * @see dwt.graphics.TextLayout#getPreviousOffset(int, int)
+     *
+     * @since 3.0
+     */
+    public static const int MOVEMENT_CLUSTER = 1 << 1;
+
+    /**
+     * The word movement type (value is 1&lt;&lt;2).
+     * This constant is used to move a text offset over a word.
+     * The behavior of this constant depends on the platform and on the
+     * direction of the movement. For example, on Windows the stop is
+     * always at the start of the word. On GTK and Mac the stop is at the end
+     * of the word if the direction is next and at the start of the word if the
+     * direction is previous.
+     *
+     * @see dwt.graphics.TextLayout#getNextOffset(int, int)
+     * @see dwt.graphics.TextLayout#getPreviousOffset(int, int)
+     *
+     * @since 3.0
+     */
+    public static const int MOVEMENT_WORD = 1 << 2;
+
+    /**
+     * The word end movement type (value is 1&lt;&lt;3).
+     * This constant is used to move a text offset to the next or previous
+     * word end. The behavior of this constant does not depend on the platform.
+     *
+     *
+     * @see dwt.graphics.TextLayout#getNextOffset(int, int)
+     * @see dwt.graphics.TextLayout#getPreviousOffset(int, int)
+     *
+     * @since 3.3
+     */
+    public static const int MOVEMENT_WORD_END = 1 << 3;
+
+    /**
+     * The word start movement type (value is 1&lt;&lt;4).
+     * This constant is used to move a text offset to the next or previous
+     * word start. The behavior of this constant does not depend on the platform.
+     *
+     * @see dwt.graphics.TextLayout#getNextOffset(int, int)
+     * @see dwt.graphics.TextLayout#getPreviousOffset(int, int)
+     *
+     * @since 3.3
+     */
+    public static const int MOVEMENT_WORD_START = 1 << 4;
+
+
+/**
+ * Answers a concise, human readable description of the error code.
+ *
+ * @param code the DWT error code.
+ * @return a description of the error code.
+ *
+ * @see DWT
+ */
+static char[] findErrorText (int code) {
+    switch (code) {
+        case ERROR_UNSPECIFIED:            return "Unspecified error"; //$NON-NLS-1$
+        case ERROR_NO_HANDLES:             return "No more handles"; //$NON-NLS-1$
+        case ERROR_NO_MORE_CALLBACKS:      return "No more callbacks"; //$NON-NLS-1$
+        case ERROR_NULL_ARGUMENT:          return "Argument cannot be null"; //$NON-NLS-1$
+        case ERROR_INVALID_ARGUMENT:       return "Argument not valid"; //$NON-NLS-1$
+        case ERROR_INVALID_RANGE:          return "Index out of bounds"; //$NON-NLS-1$
+        case ERROR_CANNOT_BE_ZERO:         return "Argument cannot be zero"; //$NON-NLS-1$
+        case ERROR_CANNOT_GET_ITEM:        return "Cannot get item"; //$NON-NLS-1$
+        case ERROR_CANNOT_GET_SELECTION:   return "Cannot get selection"; //$NON-NLS-1$
+        case ERROR_CANNOT_GET_ITEM_HEIGHT: return "Cannot get item height"; //$NON-NLS-1$
+        case ERROR_CANNOT_GET_TEXT:        return "Cannot get text"; //$NON-NLS-1$
+        case ERROR_CANNOT_SET_TEXT:        return "Cannot set text"; //$NON-NLS-1$
+        case ERROR_ITEM_NOT_ADDED:         return "Item not added"; //$NON-NLS-1$
+        case ERROR_ITEM_NOT_REMOVED:       return "Item not removed"; //$NON-NLS-1$
+        case ERROR_NOT_IMPLEMENTED:        return "Not implemented"; //$NON-NLS-1$
+        case ERROR_MENU_NOT_DROP_DOWN:     return "Menu must be a drop down"; //$NON-NLS-1$
+        case ERROR_THREAD_INVALID_ACCESS:  return "Invalid thread access"; //$NON-NLS-1$
+        case ERROR_WIDGET_DISPOSED:        return "Widget is disposed"; //$NON-NLS-1$
+        case ERROR_MENUITEM_NOT_CASCADE:   return "Menu item is not a CASCADE"; //$NON-NLS-1$
+        case ERROR_CANNOT_SET_SELECTION:   return "Cannot set selection";  //$NON-NLS-1$
+        case ERROR_CANNOT_SET_MENU:        return "Cannot set menu";  //$NON-NLS-1$
+        case ERROR_CANNOT_SET_ENABLED:     return "Cannot set the enabled state";  //$NON-NLS-1$
+        case ERROR_CANNOT_GET_ENABLED:     return "Cannot get the enabled state";  //$NON-NLS-1$
+        case ERROR_INVALID_PARENT:         return "Widget has the wrong parent";  //$NON-NLS-1$
+        case ERROR_MENU_NOT_BAR:           return "Menu is not a BAR";  //$NON-NLS-1$
+        case ERROR_CANNOT_GET_COUNT:       return "Cannot get count"; //$NON-NLS-1$
+        case ERROR_MENU_NOT_POP_UP:        return "Menu is not a POP_UP"; //$NON-NLS-1$
+        case ERROR_UNSUPPORTED_DEPTH:      return "Unsupported color depth"; //$NON-NLS-1$
+        case ERROR_IO:                     return "i/o error"; //$NON-NLS-1$
+        case ERROR_INVALID_IMAGE:          return "Invalid image"; //$NON-NLS-1$
+        case ERROR_UNSUPPORTED_FORMAT:     return "Unsupported or unrecognized format"; //$NON-NLS-1$
+        case ERROR_INVALID_SUBCLASS:       return "Subclassing not allowed"; //$NON-NLS-1$
+        case ERROR_GRAPHIC_DISPOSED:       return "Graphic is disposed"; //$NON-NLS-1$
+        case ERROR_DEVICE_DISPOSED:        return "Device is disposed"; //$NON-NLS-1$
+        case ERROR_FAILED_EXEC:            return "Failed to execute runnable"; //$NON-NLS-1$
+        case ERROR_FAILED_LOAD_LIBRARY:    return "Unable to load library"; //$NON-NLS-1$
+        case ERROR_CANNOT_INVERT_MATRIX:   return "Cannot invert matrix"; //$NON-NLS-1$
+        case ERROR_NO_GRAPHICS_LIBRARY:    return "Unable to load graphics library"; //$NON-NLS-1$
+        case ERROR_INVALID_FONT:           return "Font not valid"; //$NON-NLS-1$
+        default:
+    }
+    return "Unknown error"; //$NON-NLS-1$
+}
+
+/**
+ * Returns the NLS'ed message for the given argument.
+ *
+ * @param key the key to look up
+ * @return the message for the given key
+ *
+ * @exception IllegalArgumentException <ul>
+ *    <li>ERROR_NULL_ARGUMENT - if the key is null</li>
+ * </ul>
+ */
+public static char[] getMessage(char[] key) {
+    return Compatibility.getMessage(key);
+}
+
+/**
+ * Returns the DWT platform name.
+ * Examples: "win32", "motif", "gtk", "photon", "carbon"
+ *
+ * @return the DWT platform name
+ */
+public static char[] getPlatform () {
+    return Platform.PLATFORM;
+}
+
+/**
+ * Returns the DWT version number as an integer.
+ * Example: "SWT051" is 51
+ *
+ * @return the DWT version number
+ */
+public static int getVersion () {
+    return Library.SWT_VERSION;
+}
+
+/**
+ * Throws an appropriate exception based on the passed in error code.
+ *
+ * @param code the DWT error code
+ */
+public static void error (int code) {
+    error (code, null);
+}
+
+/**
+ * Throws an appropriate exception based on the passed in error code.
+ * The <code>throwable</code> argument should be either null, or the
+ * throwable which caused DWT to throw an exception.
+ * <p>
+ * In DWT, errors are reported by throwing one of three exceptions:
+ * <dl>
+ * <dd>java.lang.IllegalArgumentException</dd>
+ * <dt>thrown whenever one of the API methods is invoked with an illegal argument</dt>
+ * <dd>org.eclipse.swt.DWTException (extends java.lang.RuntimeException)</dd>
+ * <dt>thrown whenever a recoverable error happens internally in DWT</dt>
+ * <dd>org.eclipse.swt.DWTError (extends java.lang.Error)</dd>
+ * <dt>thrown whenever a <b>non-recoverable</b> error happens internally in DWT</dt>
+ * </dl>
+ * This method provides the logic which maps between error codes
+ * and one of the above exceptions.
+ * </p>
+ *
+ * @param code the DWT error code.
+ * @param throwable the exception which caused the error to occur.
+ *
+ * @see DWTError
+ * @see DWTException
+ * @see IllegalArgumentException
+ */
+public static void error (int code, TracedException throwable) {
+    error (code, throwable, null);
+}
+
+/**
+ * Throws an appropriate exception based on the passed in error code.
+ * The <code>throwable</code> argument should be either null, or the
+ * throwable which caused DWT to throw an exception.
+ * <p>
+ * In DWT, errors are reported by throwing one of three exceptions:
+ * <dl>
+ * <dd>java.lang.IllegalArgumentException</dd>
+ * <dt>thrown whenever one of the API methods is invoked with an illegal argument</dt>
+ * <dd>org.eclipse.swt.DWTException (extends java.lang.RuntimeException)</dd>
+ * <dt>thrown whenever a recoverable error happens internally in DWT</dt>
+ * <dd>org.eclipse.swt.DWTError (extends java.lang.Error)</dd>
+ * <dt>thrown whenever a <b>non-recoverable</b> error happens internally in DWT</dt>
+ * </dl>
+ * This method provides the logic which maps between error codes
+ * and one of the above exceptions.
+ * </p>
+ *
+ * @param code the DWT error code.
+ * @param throwable the exception which caused the error to occur.
+ * @param detail more information about error.
+ *
+ * @see DWTError
+ * @see DWTException
+ * @see IllegalArgumentException
+ *
+ * @since 3.0
+ */
+public static void error (int code, TracedException throwable, char[] detail) {
+
+    /*
+    * This code prevents the creation of "chains" of SWTErrors and
+    * SWTExceptions which in turn contain other SWTErrors and
+    * SWTExceptions as their throwable. This can occur when low level
+    * code throws an exception past a point where a higher layer is
+    * being "safe" and catching all exceptions. (Note that, this is
+    * _a_bad_thing_ which we always try to avoid.)
+    *
+    * On the theory that the low level code is closest to the
+    * original problem, we simply re-throw the original exception here.
+    *
+    * NOTE: Exceptions thrown in syncExec and asyncExec must be
+    * wrapped.
+    */
+    if (code !is DWT.ERROR_FAILED_EXEC) {
+        if (auto t = cast(DWTError)throwable ) throw t;
+        if (auto t = cast(DWTException)throwable ) throw t;
+    }
+
+    char[] message = findErrorText (code);
+    if (detail != null) message ~= detail;
+    switch (code) {
+
+        /* Illegal Arguments (non-fatal) */
+        case ERROR_NULL_ARGUMENT:
+        case ERROR_CANNOT_BE_ZERO:
+        case ERROR_INVALID_ARGUMENT:
+        case ERROR_MENU_NOT_BAR:
+        case ERROR_MENU_NOT_DROP_DOWN:
+        case ERROR_MENU_NOT_POP_UP:
+        case ERROR_MENUITEM_NOT_CASCADE:
+        case ERROR_INVALID_PARENT:
+        case ERROR_INVALID_RANGE: {
+            throw new IllegalArgumentException (message);
+        }
+
+        /* DWT Exceptions (non-fatal) */
+        case ERROR_INVALID_SUBCLASS:
+        case ERROR_THREAD_INVALID_ACCESS:
+        case ERROR_WIDGET_DISPOSED:
+        case ERROR_GRAPHIC_DISPOSED:
+        case ERROR_DEVICE_DISPOSED:
+        case ERROR_INVALID_IMAGE:
+        case ERROR_UNSUPPORTED_DEPTH:
+        case ERROR_UNSUPPORTED_FORMAT:
+        case ERROR_FAILED_EXEC:
+        case ERROR_CANNOT_INVERT_MATRIX:
+        case ERROR_NO_GRAPHICS_LIBRARY:
+        case ERROR_IO: {
+            auto exception = new DWTException (code, message);
+            exception.throwable = throwable;
+            throw exception;
+        }
+
+        /* Operation System Errors (fatal, may occur only on some platforms) */
+        case ERROR_CANNOT_GET_COUNT:
+        case ERROR_CANNOT_GET_ENABLED:
+        case ERROR_CANNOT_GET_ITEM:
+        case ERROR_CANNOT_GET_ITEM_HEIGHT:
+        case ERROR_CANNOT_GET_SELECTION:
+        case ERROR_CANNOT_GET_TEXT:
+        case ERROR_CANNOT_SET_ENABLED:
+        case ERROR_CANNOT_SET_MENU:
+        case ERROR_CANNOT_SET_SELECTION:
+        case ERROR_CANNOT_SET_TEXT:
+        case ERROR_ITEM_NOT_ADDED:
+        case ERROR_ITEM_NOT_REMOVED:
+        case ERROR_NO_HANDLES:
+        //FALL THROUGH
+
+        /* DWT Errors (fatal, may occur only on some platforms) */
+        case ERROR_FAILED_LOAD_LIBRARY:
+        case ERROR_NO_MORE_CALLBACKS:
+        case ERROR_NOT_IMPLEMENTED:
+        case ERROR_UNSPECIFIED: {
+            auto error = new DWTError (code, message);
+            error.throwable = throwable;
+            throw error;
+        }
+        default:
+    }
+
+    /* Unknown/Undefined Error */
+    DWTError error = new DWTError (code, message);
+    error.throwable = throwable;
+    throw error;
+}
+
+/+
+static {
+    /*
+    * These values represent bit masks that may need to
+    * expand in the future.  Therefore they are not initialized
+    * in the declaration to stop the compiler from inlining.
+    */
+    BUTTON_MASK = BUTTON1 | BUTTON2 | BUTTON3 | BUTTON4 | BUTTON5;
+    MODIFIER_MASK = ALT | SHIFT | CTRL | COMMAND;
+
+    /*
+    * These values can be different on different platforms.
+    * Therefore they are not initialized in the declaration
+    * to stop the compiler from inlining.
+    */
+    char[] platform = getPlatform ();
+    if ("carbon".equals (platform)) { //$NON-NLS-1$
+        MOD1 = COMMAND;
+        MOD2 = SHIFT;
+        MOD3 = ALT;
+        MOD4 = CONTROL;
+    } else {
+        MOD1 = CONTROL;
+        MOD2 = SHIFT;
+        MOD3 = ALT;
+        MOD4 = 0;
+    }
+}
++/
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/DWTError.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,155 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2005 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.DWTError;
+
+import dwt.DWT;
+
+import tango.core.Exception;
+import tango.io.Stdout;
+
+/**
+ * This error is thrown whenever an unrecoverable error
+ * occurs internally in DWT. The message text and error code
+ * provide a further description of the problem. The exception
+ * has a <code>throwable</code> field which holds the underlying
+ * throwable that caused the problem (if this information is
+ * available (i.e. it may be null)).
+ * <p>
+ * SWTErrors are thrown when something fails internally which
+ * either leaves DWT in an unknown state (eg. the o/s call to
+ * remove an item from a list returns an error code) or when DWT
+ * is left in a known-to-be-unrecoverable state (eg. it runs out
+ * of callback resources). SWTErrors should not occur in typical
+ * programs, although "high reliability" applications should
+ * still catch them.
+ * </p><p>
+ * This class also provides support methods used by DWT to match
+ * error codes to the appropriate exception class (DWTError,
+ * DWTException, or IllegalArgumentException) and to provide
+ * human readable strings for DWT error codes.
+ * </p>
+ *
+ * @see DWTException
+ * @see DWT#error(int)
+ */
+
+public class DWTError : PlatformException {
+    /**
+     * The DWT error code, one of DWT.ERROR_*.
+     */
+    public int code;
+
+    /**
+     * The underlying throwable that caused the problem,
+     * or null if this information is not available.
+     */
+    public TracedException throwable;
+
+    //static final long serialVersionUID = 3833467327105808433L;
+
+/**
+ * Constructs a new instance of this class with its
+ * stack trace filled in. The error code is set to an
+ * unspecified value.
+ */
+public this () {
+    this (DWT.ERROR_UNSPECIFIED);
+}
+
+/**
+ * Constructs a new instance of this class with its
+ * stack trace and message filled in. The error code is
+ * set to an unspecified value.  Specifying <code>null</code>
+ * as the message is equivalent to specifying an empty string.
+ *
+ * @param message the detail message for the exception
+ */
+public this (String message) {
+    this (DWT.ERROR_UNSPECIFIED, message);
+}
+
+/**
+ * Constructs a new instance of this class with its
+ * stack trace and error code filled in.
+ *
+ * @param code the DWT error code
+ */
+public this (int code) {
+    this (code, DWT.findErrorText (code));
+}
+
+/**
+ * Constructs a new instance of this class with its
+ * stack trace, error code and message filled in.
+ * Specifying <code>null</code> as the message is
+ * equivalent to specifying an empty string.
+ *
+ * @param code the DWT error code
+ * @param message the detail message for the exception
+ */
+public this (int code, char[] message) {
+    super (message);
+    this.code = code;
+}
+
+/**
+ * Returns the underlying throwable that caused the problem,
+ * or null if this information is not available.
+ * <p>
+ * NOTE: This method overrides Throwable.getCause() that was
+ * added to JDK1.4. It is necessary to override this method
+ * in order for inherited printStackTrace() methods to work.
+ * </p>
+ * @return the underlying throwable
+ *
+ * @since 3.1
+ */
+public Exception getCause() {
+    return throwable;
+}
+
+/**
+ *  Returns the string describing this DWTError object.
+ *  <p>
+ *  It is combined with the message string of the Throwable
+ *  which caused this DWTError (if this information is available).
+ *  </p>
+ *  @return the error message string of this DWTError object
+ */
+public char[] getMessage () {
+    if (throwable is null)
+        return super.toString ();
+    return super.toString () ~ " (" ~ throwable.toString () ~ ")"; //$NON-NLS-1$ //$NON-NLS-2$
+}
+
+/**
+ * Outputs a printable representation of this error's
+ * stack trace on the standard error stream.
+ * <p>
+ * Note: printStackTrace(PrintStream) and printStackTrace(PrintWriter)
+ * are not provided in order to maintain compatibility with CLDC.
+ * </p>
+ */
+public void printStackTrace () {
+    Stderr.formatln( "stacktrace follows (if feature compiled in)" );
+    foreach( msg; this ){
+        Stderr.formatln( "{}", msg );
+    }
+    if ( throwable !is null) {
+        Stderr.formatln ("*** Stack trace of contained error ***"); //$NON-NLS-1$
+        foreach( msg; throwable ){
+            Stderr.formatln( "{}", msg );
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/DWTException.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,147 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2005 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.DWTException;
+
+import dwt.DWT;
+
+import tango.core.Exception;
+import tango.io.Stdout;
+
+/**
+ * This runtime exception is thrown whenever a recoverable error
+ * occurs internally in DWT. The message text and error code
+ * provide a further description of the problem. The exception
+ * has a <code>throwable</code> field which holds the underlying
+ * exception that caused the problem (if this information is
+ * available (i.e. it may be null)).
+ * <p>
+ * SWTExceptions are thrown when something fails internally,
+ * but DWT is left in a known stable state (eg. a widget call
+ * was made from a non-u/i thread, or there is failure while
+ * reading an Image because the source file was corrupt).
+ * </p>
+ *
+ * @see DWTError
+ */
+
+public class DWTException : TracedException {
+    /**
+     * The DWT error code, one of DWT.ERROR_*.
+     */
+    public int code;
+
+    /**
+     * The underlying throwable that caused the problem,
+     * or null if this information is not available.
+     */
+    public TracedException throwable;
+
+    //static final long serialVersionUID = 3257282552304842547L;
+
+/**
+ * Constructs a new instance of this class with its
+ * stack trace filled in. The error code is set to an
+ * unspecified value.
+ */
+public this () {
+    this (DWT.ERROR_UNSPECIFIED);
+}
+
+/**
+ * Constructs a new instance of this class with its
+ * stack trace and message filled in. The error code is
+ * set to an unspecified value.  Specifying <code>null</code>
+ * as the message is equivalent to specifying an empty string.
+ *
+ * @param message the detail message for the exception
+ */
+public this (char[] message) {
+    this (DWT.ERROR_UNSPECIFIED, message);
+}
+
+/**
+ * Constructs a new instance of this class with its
+ * stack trace and error code filled in.
+ *
+ * @param code the DWT error code
+ */
+public this (int code) {
+    this (code, DWT.findErrorText (code));
+}
+
+/**
+ * Constructs a new instance of this class with its
+ * stack trace, error code and message filled in.
+ * Specifying <code>null</code> as the message is
+ * equivalent to specifying an empty string.
+ *
+ * @param code the DWT error code
+ * @param message the detail message for the exception
+ */
+public this (int code, char[] message) {
+    super (message);
+    this.code = code;
+}
+
+/**
+ * Returns the underlying throwable that caused the problem,
+ * or null if this information is not available.
+ * <p>
+ * NOTE: This method overrides Throwable.getCause() that was
+ * added to JDK1.4. It is necessary to override this method
+ * in order for inherited printStackTrace() methods to work.
+ * </p>
+ * @return the underlying throwable
+ *
+ * @since 3.1
+ */
+public TracedException getCause() {
+    return throwable;
+}
+
+/**
+ *  Returns the string describing this DWTException object.
+ *  <p>
+ *  It is combined with the message string of the Throwable
+ *  which caused this DWTException (if this information is available).
+ *  </p>
+ *  @return the error message string of this DWTException object
+ */
+public char[] getMessage () {
+    if (throwable is null)
+        return super.toString ();
+    return super.toString () ~ " (" ~ throwable.toString () ~ ")"; //$NON-NLS-1$ //$NON-NLS-2$
+}
+
+/**
+ * Outputs a printable representation of this exception's
+ * stack trace on the standard error stream.
+ * <p>
+ * Note: printStackTrace(PrintStream) and printStackTrace(PrintWriter)
+ * are not provided in order to maintain compatibility with CLDC.
+ * </p>
+ */
+public void printStackTrace () {
+    Stderr.formatln( "stacktrace follows (if feature compiled in)" );
+    foreach( msg; this ){
+        Stderr.formatln( "{}", msg );
+    }
+    if ( throwable !is null) {
+        Stderr.formatln ("*** Stack trace of contained exception ***"); //$NON-NLS-1$
+        foreach( msg; throwable ){
+            Stderr.formatln( "{}", msg );
+        }
+    }
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/dwthelper/BufferedInputStream.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,107 @@
+/**
+ * Authors: Frank Benoit <keinfarbton@googlemail.com>
+ */
+module dwt.dwthelper.BufferedInputStream;
+
+import dwt.dwthelper.InputStream;
+import dwt.dwthelper.utils;
+
+import tango.core.Exception;
+
+public class BufferedInputStream : dwt.dwthelper.InputStream.InputStream {
+
+    alias dwt.dwthelper.InputStream.InputStream.read read;
+
+    private const int defaultSize = 8192;
+    protected byte[] buf;
+    protected int count = 0; /// The index one greater than the index of the last valid byte in the buffer.
+    protected int pos   = 0; /// The current position in the buffer.
+    protected int markpos = (-1);
+    protected int marklimit;
+    dwt.dwthelper.InputStream.InputStream istr;
+
+    public this ( dwt.dwthelper.InputStream.InputStream istr ){
+        this( istr, defaultSize );
+    }
+
+    public this ( dwt.dwthelper.InputStream.InputStream istr, int size ){
+        this.istr = istr;
+        if( size <= 0 ){
+            throw new IllegalArgumentException( "Buffer size <= 0" );
+        }
+        buf.length = size;
+    }
+
+    private InputStream getAndCheckIstr(){
+        InputStream res = istr;
+        if( res is null ){
+            throw new IOException( "Stream closed" );
+        }
+        return res;
+    }
+    private byte[] getAndCheckBuf(){
+        byte[] res = buf;
+        if( res is null ){
+            throw new IOException( "Stream closed" );
+        }
+        return res;
+    }
+    private void fill(){
+        assert( pos == count );
+        pos = 0;
+        count = 0;
+        int count = getAndCheckIstr().read( buf );
+        if( count < 0 ){
+            count = 0;
+            istr = null;
+        }
+    }
+    public synchronized int read(){
+        if( pos >= count ){
+            fill();
+            if( pos >= count ){
+                return -1;
+            }
+        }
+        return getAndCheckBuf()[pos++] & 0xFF;
+    }
+
+    public synchronized int read( byte[] b, int off, int len ){
+        return super.read( b, off, len );
+    }
+
+    public synchronized long skip( long n ){
+        return this.istr.skip(n);
+    }
+
+    public synchronized int available(){
+        int istr_avail = 0;
+        if( istr !is null ){
+            istr_avail = istr.available();
+        }
+        return istr_avail + (count - pos);
+    }
+
+    public synchronized void mark( int readlimit ){
+        implMissing( __FILE__, __LINE__ );
+        this.istr.mark( readlimit );
+    }
+
+    public synchronized void reset(){
+        implMissing( __FILE__, __LINE__ );
+        this.istr.reset();
+    }
+
+    public bool markSupported(){
+        implMissing( __FILE__, __LINE__ );
+        return false;
+    }
+
+    public void close(){
+        this.istr.close();
+    }
+
+
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/dwthelper/ByteArrayOutputStream.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,69 @@
+/**
+ * Authors: Frank Benoit <keinfarbton@googlemail.com>
+ */
+module dwt.dwthelper.ByteArrayOutputStream;
+
+public import dwt.dwthelper.OutputStream;
+import dwt.dwthelper.utils;
+
+public class ByteArrayOutputStream : dwt.dwthelper.OutputStream.OutputStream {
+
+    alias dwt.dwthelper.OutputStream.OutputStream.write write;
+
+    protected byte[] buf;
+    protected int count;
+    public this (){
+    }
+
+    public this ( int par_size ){
+    }
+
+    public synchronized void write( int b ){
+        implMissing( __FILE__, __LINE__ );
+    }
+
+    public synchronized void write( byte[] b, int off, int len ){
+        implMissing( __FILE__, __LINE__ );
+    }
+
+    public synchronized void writeTo( dwt.dwthelper.OutputStream.OutputStream out_KEYWORDESCAPE ){
+        implMissing( __FILE__, __LINE__ );
+    }
+
+    public synchronized void reset(){
+        implMissing( __FILE__, __LINE__ );
+    }
+
+    public synchronized byte[] toByteArray(){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+
+    public int size(){
+        implMissing( __FILE__, __LINE__ );
+        return 0;
+    }
+
+    public override char[] toString(){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+
+    public char[] toString( char[] enc ){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+
+    public char[] toString( int hibyte ){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+
+    public  override void close(){
+        implMissing( __FILE__, __LINE__ );
+    }
+
+
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/dwthelper/File.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,202 @@
+/**
+ * Authors: Frank Benoit <keinfarbton@googlemail.com>
+ */
+module dwt.dwthelper.File;
+
+import dwt.dwthelper.utils;
+
+static import tango.io.FileConst;
+static import tango.io.FilePath;
+static import tango.io.FileSystem;
+
+public class File {
+
+    public static char separatorChar;
+    public static char[] separator;
+    public static char pathSeparatorChar;
+    public static char[] pathSeparator;
+
+    private tango.io.FilePath.FilePath mFilePath;
+
+    static this(){
+        separator = tango.io.FileConst.FileConst.PathSeparatorString;
+        separatorChar = tango.io.FileConst.FileConst.PathSeparatorChar;
+        pathSeparator = tango.io.FileConst.FileConst.SystemPathString;
+        pathSeparatorChar = tango.io.FileConst.FileConst.SystemPathChar;
+    }
+
+    public this ( char[] pathname ){
+        mFilePath = new tango.io.FilePath.FilePath( pathname );
+    }
+
+    public this ( char[] parent, char[] child ){
+        mFilePath = new tango.io.FilePath.FilePath( tango.io.FilePath.FilePath.join( parent, child ) );
+    }
+
+    public this ( dwt.dwthelper.File.File parent, char[] child ){
+        mFilePath = new tango.io.FilePath.FilePath( tango.io.FilePath.FilePath.join( parent.mFilePath.toString, child ) );
+    }
+
+    public int getPrefixLength(){
+        implMissing( __FILE__, __LINE__ );
+        return 0;
+    }
+
+    public char[] getName(){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+
+    public char[] getParent(){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+
+    public dwt.dwthelper.File.File getParentFile(){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+
+    public char[] getPath(){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+
+    public bool isAbsolute(){
+        implMissing( __FILE__, __LINE__ );
+        return false;
+    }
+
+    public char[] getAbsolutePath(){
+        return tango.io.FileSystem.FileSystem.toAbsolute( mFilePath ).toString;
+    }
+
+    public dwt.dwthelper.File.File getAbsoluteFile(){
+        return new File( getAbsolutePath() );
+    }
+
+    public char[] getCanonicalPath(){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+
+    public dwt.dwthelper.File.File getCanonicalFile(){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+
+    public bool canRead(){
+        implMissing( __FILE__, __LINE__ );
+        return false;
+    }
+
+    public bool canWrite(){
+        return mFilePath.isWritable;
+    }
+
+    public bool exists(){
+        return mFilePath.exists;
+    }
+
+    public bool isDirectory(){
+        return mFilePath.isFolder;
+    }
+
+    public bool isFile(){
+        implMissing( __FILE__, __LINE__ );
+        return false;
+    }
+
+    public bool isHidden(){
+        implMissing( __FILE__, __LINE__ );
+        return false;
+    }
+
+    public long lastModified(){
+        implMissing( __FILE__, __LINE__ );
+        return 0L;
+    }
+
+    public long length(){
+        implMissing( __FILE__, __LINE__ );
+        return 0L;
+    }
+
+    public bool createNewFile(){
+        implMissing( __FILE__, __LINE__ );
+        return false;
+    }
+
+    public bool delete_KEYWORDESCAPE(){
+        implMissing( __FILE__, __LINE__ );
+        return false;
+    }
+
+    public void deleteOnExit(){
+        implMissing( __FILE__, __LINE__ );
+    }
+
+    public char[][] list(){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+
+    public dwt.dwthelper.File.File[] listFiles(){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+
+    public bool mkdir(){
+        implMissing( __FILE__, __LINE__ );
+        return false;
+    }
+
+    public bool mkdirs(){
+        implMissing( __FILE__, __LINE__ );
+        return false;
+    }
+
+    public bool renameTo( dwt.dwthelper.File.File dest ){
+        implMissing( __FILE__, __LINE__ );
+        return false;
+    }
+
+    public bool setLastModified( long time ){
+        implMissing( __FILE__, __LINE__ );
+        return false;
+    }
+
+    public bool setReadOnly(){
+        implMissing( __FILE__, __LINE__ );
+        return false;
+    }
+
+    public static dwt.dwthelper.File.File[] listRoots(){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+
+    public static dwt.dwthelper.File.File createTempFile( char[] prefix, char[] suffix, dwt.dwthelper.File.File directory ){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+
+    public static dwt.dwthelper.File.File createTempFile( char[] prefix, char[] suffix ){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+
+    public int compareTo( dwt.dwthelper.File.File pathname ){
+        implMissing( __FILE__, __LINE__ );
+        return 0;
+    }
+
+    public char[] toString(){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+
+
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/dwthelper/FileInputStream.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,77 @@
+/**
+ * Authors: Frank Benoit <keinfarbton@googlemail.com>
+ */
+module dwt.dwthelper.FileInputStream;
+
+import dwt.dwthelper.utils;
+import dwt.dwthelper.File;
+import dwt.dwthelper.InputStream;
+
+import tango.io.FileConduit;
+import tango.io.protocol.Reader;
+import tango.core.Exception;
+import tango.text.convert.Format;
+
+public class FileInputStream : dwt.dwthelper.InputStream.InputStream {
+
+    alias dwt.dwthelper.InputStream.InputStream.read read;
+
+    private FileConduit conduit;
+    private ubyte[] buffer;
+    private int buf_pos;
+    private int buf_size;
+    private const int BUFFER_SIZE = 0x10000;
+    private bool eof;
+
+    public this ( char[] name ){
+        conduit = new FileConduit( name );
+        buffer = new ubyte[]( BUFFER_SIZE );
+    }
+
+    public this ( dwt.dwthelper.File.File file ){
+        implMissing( __FILE__, __LINE__ );
+        conduit = new FileConduit( file.getAbsolutePath(), FileConduit.ReadExisting );
+        buffer = new ubyte[]( BUFFER_SIZE );
+    }
+
+    public override int read(){
+        if( eof ){
+            return -1;
+        }
+        try{
+            if( buf_pos == buf_size ){
+                buf_pos = 0;
+                buf_size = conduit.input.read( buffer );
+            }
+            if( buf_size <= 0 ){
+                eof = true;
+                return -1;
+            }
+            assert( buf_pos < BUFFER_SIZE, Format( "{0} {1}", buf_pos, buf_size ) );
+            assert( buf_size <= BUFFER_SIZE );
+            int res = cast(int) buffer[ buf_pos ];
+            buf_pos++;
+            return res;
+        }
+        catch( IOException e ){
+            eof = true;
+            return -1;
+        }
+    }
+
+    public long skip( long n ){
+        implMissing( __FILE__, __LINE__ );
+        return 0L;
+    }
+
+    public int available(){
+        implMissing( __FILE__, __LINE__ );
+        return 0;
+    }
+
+    public override void close(){
+        conduit.close();
+    }
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/dwthelper/FileOutputStream.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,55 @@
+/**
+ * Authors: Frank Benoit <keinfarbton@googlemail.com>
+ */
+module dwt.dwthelper.FileOutputStream;
+
+public import dwt.dwthelper.File;
+public import dwt.dwthelper.OutputStream;
+
+import dwt.dwthelper.utils;
+
+public class FileOutputStream : dwt.dwthelper.OutputStream.OutputStream {
+
+    alias dwt.dwthelper.OutputStream.OutputStream.write write;
+    alias dwt.dwthelper.OutputStream.OutputStream.close close;
+
+    public this ( char[] name ){
+        implMissing( __FILE__, __LINE__ );
+    }
+
+    public this ( char[] name, bool append ){
+        implMissing( __FILE__, __LINE__ );
+    }
+
+    public this ( dwt.dwthelper.File.File file ){
+        implMissing( __FILE__, __LINE__ );
+    }
+
+    public this ( dwt.dwthelper.File.File file, bool append ){
+        implMissing( __FILE__, __LINE__ );
+    }
+
+    public void write( int b ){
+        implMissing( __FILE__, __LINE__ );
+    }
+
+    public void write( byte[] b ){
+        implMissing( __FILE__, __LINE__ );
+    }
+
+    public void write( byte[] b, int off, int len ){
+        implMissing( __FILE__, __LINE__ );
+    }
+
+    public void close(){
+        implMissing( __FILE__, __LINE__ );
+    }
+
+    public void finalize(){
+        implMissing( __FILE__, __LINE__ );
+    }
+
+
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/dwthelper/InflaterInputStream.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,68 @@
+/**
+ * Authors: Frank Benoit <keinfarbton@googlemail.com>
+ */
+module dwt.dwthelper.InflaterInputStream;
+
+public import dwt.dwthelper.InputStream;
+import dwt.dwthelper.utils;
+
+public class InflaterInputStream : dwt.dwthelper.InputStream.InputStream {
+
+    alias dwt.dwthelper.InputStream.InputStream.read read;
+    alias dwt.dwthelper.InputStream.InputStream.skip skip;
+    alias dwt.dwthelper.InputStream.InputStream.available available;
+    alias dwt.dwthelper.InputStream.InputStream.close close;
+    alias dwt.dwthelper.InputStream.InputStream.mark mark;
+    alias dwt.dwthelper.InputStream.InputStream.reset reset;
+    alias dwt.dwthelper.InputStream.InputStream.markSupported markSupported;
+
+    protected byte[] buf;
+    protected int len;
+    package bool usesDefaultInflater = false;
+
+    public this ( dwt.dwthelper.InputStream.InputStream istr ){
+    }
+
+    public int read(){
+        implMissing( __FILE__, __LINE__ );
+        return 0;
+    }
+
+    public int read( byte[] b, int off, int len ){
+        implMissing( __FILE__, __LINE__ );
+        return 0;
+    }
+
+    public int available(){
+        implMissing( __FILE__, __LINE__ );
+        return 0;
+    }
+
+    public long skip( long n ){
+        implMissing( __FILE__, __LINE__ );
+        return 0L;
+    }
+
+    public void close(){
+        implMissing( __FILE__, __LINE__ );
+    }
+
+    public void fill(){
+        implMissing( __FILE__, __LINE__ );
+    }
+
+    public bool markSupported(){
+        implMissing( __FILE__, __LINE__ );
+        return false;
+    }
+
+    public synchronized void mark( int readlimit ){
+        implMissing( __FILE__, __LINE__ );
+    }
+
+    public synchronized void reset(){
+        implMissing( __FILE__, __LINE__ );
+    }
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/dwthelper/InputStream.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,61 @@
+/**
+ * Authors: Frank Benoit <keinfarbton@googlemail.com>
+ */
+
+module dwt.dwthelper.InputStream;
+
+import dwt.dwthelper.utils;
+
+public abstract class InputStream {
+
+
+    public this (){
+    }
+
+    public abstract int read();
+
+    public int read( byte[] b ){
+        foreach( uint idx, inout byte val; b ){
+            int c = read();
+            if( c == -1 ){
+                return idx;
+            }
+            b[ idx] = cast(byte)( c & 0xFF );
+        }
+        return b.length;
+    }
+
+    public int read( byte[] b, int off, int len ){
+        return read( b[ off .. off+len ] );
+    }
+
+    public long skip( long n ){
+        implMissing( __FILE__, __LINE__ );
+        return 0L;
+    }
+
+    public int available(){
+        return 0;
+    }
+
+    public void close(){
+        implMissing( __FILE__, __LINE__ );
+    }
+
+    public synchronized void mark( int readlimit ){
+        implMissing( __FILE__, __LINE__ );
+    }
+
+    public synchronized void reset(){
+        implMissing( __FILE__, __LINE__ );
+    }
+
+    public bool markSupported(){
+        implMissing( __FILE__, __LINE__ );
+        return false;
+    }
+
+
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/dwthelper/Integer.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,118 @@
+/**
+ * Authors: Frank Benoit <keinfarbton@googlemail.com>
+ */
+
+module dwt.dwthelper.Integer;
+
+import dwt.dwthelper.utils;
+
+static import tango.text.convert.Integer;
+
+public final class Integer {
+
+    public static int MIN_VALUE = 0x80000000;
+    public static int MAX_VALUE = 0x7fffffff;
+    public static int SIZE = 32;
+
+    public int value;
+    public this ( int value ){
+        this.value = value;
+    }
+
+    public this ( char[] s ){
+    }
+
+    public static char[] toString( int i, int radix ){
+        switch( radix ){
+        case 2:
+            return toBinaryString(i);
+        case 8:
+            return toOctalString(i);
+        case 10:
+            return toString(i);
+        case 16:
+            return toHexString(i);
+        default:
+            implMissing( __FILE__, __LINE__ );
+            return null;
+        }
+    }
+
+    public static char[] toHexString( int i ){
+        return tango.text.convert.Integer.toString(i, tango.text.convert.Integer.Style.Hex );
+    }
+
+    public static char[] toOctalString( int i ){
+        return tango.text.convert.Integer.toString(i, tango.text.convert.Integer.Style.Octal );
+    }
+
+    public static char[] toBinaryString( int i ){
+        return tango.text.convert.Integer.toString(i, tango.text.convert.Integer.Style.Binary );
+    }
+
+    public static char[] toString( int i ){
+        return tango.text.convert.Integer.toString(i);
+    }
+
+    public static int parseInt( char[] s, int radix ){
+        return tango.text.convert.Integer.parse( s, cast(uint)radix );
+    }
+
+    public static int parseInt( char[] s ){
+        return tango.text.convert.Integer.parse( s );
+    }
+
+    public static Integer valueOf( char[] s, int radix ){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+
+    public static Integer valueOf( char[] s ){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+
+    public static Integer valueOf( int i ){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+
+    public byte byteValue(){
+        return cast(byte)value;
+    }
+
+    public short shortValue(){
+        return cast(short)value;
+    }
+
+    public int intValue(){
+        return value;
+    }
+
+    public long longValue(){
+        return cast(long)value;
+    }
+
+    public float floatValue(){
+        return cast(float)value;
+    }
+
+    public double doubleValue(){
+        return cast(double)value;
+    }
+
+    public override  hash_t toHash(){
+        return intValue();
+    }
+
+    public override int opEquals( Object obj ){
+        implMissing( __FILE__, __LINE__ );
+        return false;
+    }
+
+    public override char[] toString(){
+        return tango.text.convert.Integer.toString( value );
+    }
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/dwthelper/OutputStream.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,50 @@
+/**
+ * Authors: Frank Benoit <keinfarbton@googlemail.com>
+ */
+module dwt.dwthelper.OutputStream;
+
+import dwt.dwthelper.utils;
+static import tango.io.model.IConduit;
+
+public abstract class OutputStream {
+
+    private tango.io.model.IConduit.OutputStream ostr;
+
+    public this(){
+    }
+
+    protected this( tango.io.model.IConduit.OutputStream aOutStream) {
+        this.ostr = aOutStream;
+    }
+
+    protected this(OutputStream rhs) {
+        ostr = rhs.ostr;
+    }
+
+    public abstract void write( int b );
+
+    public void write( byte[] b ){
+        ostr.write(b);
+    }
+
+    public void write(char[] c) {
+        ostr.write(c);
+    }
+
+    public void write( byte[] b, int off, int len ){
+        implMissing( __FILE__, __LINE__ );
+    }
+
+    public void flush(){
+        ostr.flush();
+    }
+
+    public void close(){
+        ostr.flush();
+        implMissing( __FILE__, __LINE__ );
+    }
+
+
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/dwthelper/ResourceBundle.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,21 @@
+/**
+ * Authors: Frank Benoit <keinfarbton@googlemail.com>
+ */
+module dwt.dwthelper.ResourceBundle;
+
+class ResourceBundle {
+
+    public this( char[] name ){
+    }
+
+    public char[] getString( char[] key ){
+        return key;
+    }
+
+    public static ResourceBundle getBundle( char[] name ){
+        return new ResourceBundle( name );
+    }
+
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/dwthelper/Runnable.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,12 @@
+/**
+ * Authors: Frank Benoit <benoit@tionex.de>
+ */
+module dwt.dwthelper.Runnable;
+
+public interface Runnable  {
+
+    public abstract void run();
+
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/dwthelper/System.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,128 @@
+/**
+ * Authors: Frank Benoit <keinfarbton@googlemail.com>
+ */
+module dwt.dwthelper.System;
+
+import tango.core.Exception;
+
+template SimpleType(T) {
+    debug{
+        static void validCheck(uint SrcLen, uint DestLen, uint copyLen){
+            if(SrcLen < copyLen || DestLen < copyLen|| SrcLen < 0 || DestLen < 0){
+                Util.trace("Error : SimpleType.arraycopy(), out of bounds.");
+                assert(0);
+            }
+        }
+    }
+
+    static void remove(inout T[] items, int index) {
+        if(items.length == 0)
+            return;
+
+        if(index < 0 || index >= items.length){
+            throw new ArrayBoundsException(__FILE__, __LINE__);
+        }
+
+        T element = items[index];
+
+        int length = items.length;
+        if(length == 1){
+            items.length = 0;
+            return;// element;
+        }
+
+        if(index == 0)
+            items = items[1 .. $];
+        else if(index == length - 1)
+            items = items[0 .. index];
+        else
+            items = items[0 .. index] ~ items[index + 1 .. $];
+    }
+
+    static void insert(inout T[] items, T item, int index = -1) {
+        if(index == -1)
+            index = items.length;
+
+        if(index < 0 || index > items.length ){
+            throw new ArrayBoundsException(__FILE__, __LINE__);
+        }
+
+        if(index == items.length){
+            items ~= item;
+        }else if(index == 0){
+            T[] newVect;
+            newVect ~= item;
+            items = newVect ~ items;
+        }else if(index < items.length ){
+            T[] arr1 = items[0 .. index];
+            T[] arr2 = items[index .. $];
+
+            // Important : if you write like the following commented,
+            // you get wrong data
+            // code:  T[] arr1 = items[0..index];
+            //        T[] arr2 = items[index..$];
+            //        items = arr1 ~ item;      // error, !!!
+            //        items ~= arr2;            // item replace the arrr2[0] here
+            items = arr1 ~ item ~ arr2;
+        }
+    }
+
+    static void arraycopy(T[] src, uint srcPos, T[] dest, uint destPos, uint len)
+    {
+        if(len == 0) return;
+
+        assert(src);
+        assert(dest);
+        debug{validCheck(src.length - srcPos, dest.length - destPos, len);}
+
+        if(src is dest){
+            for(int i=0; i<len; ++i){
+                dest[destPos+i] = src[srcPos+i];
+            }
+        }else{
+            dest[destPos..(len+destPos)] = src[srcPos..(len+srcPos)];
+        }
+    }
+}
+
+
+class System {
+
+    alias SimpleType!(int).arraycopy arraycopy;
+    alias SimpleType!(byte).arraycopy arraycopy;
+    alias SimpleType!(double).arraycopy arraycopy;
+    alias SimpleType!(float).arraycopy arraycopy;
+    alias SimpleType!(short).arraycopy arraycopy;
+    alias SimpleType!(long).arraycopy arraycopy;
+    alias SimpleType!(uint).arraycopy arraycopy;
+    alias SimpleType!(ushort).arraycopy arraycopy;
+    alias SimpleType!(ubyte).arraycopy arraycopy;
+    alias SimpleType!(ulong).arraycopy arraycopy;
+    alias SimpleType!(char).arraycopy arraycopy;
+    alias SimpleType!(wchar).arraycopy arraycopy;
+    alias SimpleType!(Object).arraycopy arraycopy;
+    alias SimpleType!(void*).arraycopy arraycopy;
+
+    alias SimpleType!(int[]).arraycopy arraycopy;
+    alias SimpleType!(byte[]).arraycopy arraycopy;
+    alias SimpleType!(double[]).arraycopy arraycopy;
+    alias SimpleType!(float[]).arraycopy arraycopy;
+    alias SimpleType!(short[]).arraycopy arraycopy;
+    alias SimpleType!(long[]).arraycopy arraycopy;
+    alias SimpleType!(uint[]).arraycopy arraycopy;
+    alias SimpleType!(ushort[]).arraycopy arraycopy;
+    alias SimpleType!(ubyte[]).arraycopy arraycopy;
+    alias SimpleType!(ulong[]).arraycopy arraycopy;
+    alias SimpleType!(char[]).arraycopy arraycopy;
+    alias SimpleType!(wchar[]).arraycopy arraycopy;
+    alias SimpleType!(Object[]).arraycopy arraycopy;
+    alias SimpleType!(void*[]).arraycopy arraycopy;
+    alias SimpleType!(void*[]).arraycopy arraycopy;
+
+    static long currentTimeMillis(){
+        //PORTING_FIXMe
+        return 0;
+    }
+
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/dwthelper/utils.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,47 @@
+/**
+ * Authors: Frank Benoit <keinfarbton@googlemail.com>
+ */
+module dwt.dwthelper.utils;
+
+public import dwt.dwthelper.System;
+
+import tango.io.Stdout;
+import tango.text.Unicode;
+import tango.stdc.stdlib : exit;
+
+void implMissing( char[] file, uint line ){
+    Stderr.formatln( "implementation missing in file {} line {}", file, line );
+    Stderr.formatln( "exiting ..." );
+    exit(1);
+}
+
+abstract class ArrayWrapper{
+}
+
+class ArrayWrapperT(T) : ArrayWrapper {
+    public T[] array;
+    public this( T[] data ){
+        array = data;
+    }
+}
+
+alias ArrayWrapperT!(byte)    ArrayWrapperByte;
+alias ArrayWrapperT!(int)     ArrayWrapperInt;
+alias ArrayWrapperT!(Object)  ArrayWrapperObject;
+alias ArrayWrapperT!(char)    ArrayWrapperString;
+alias ArrayWrapperT!(char[])  ArrayWrapperString2;
+
+dchar getFirstCodepoint( char[] str ){
+    foreach( dchar d; str ){
+        return d;
+    }
+}
+dchar CharacterToLower( dchar c ){
+    dchar[] r = tango.text.Unicode.toLower( [c] );
+    return r[0];
+}
+dchar CharacterToUpper( dchar c ){
+    dchar[] r = tango.text.Unicode.toUpper( [c] );
+    return r[0];
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/events/ArmEvent.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.events.ArmEvent;
+
+import dwt.widgets.Event;
+import dwt.events.TypedEvent;
+
+/**
+ * Instances of this class are sent as a result of
+ * a widget such as a menu item being armed.
+ *
+ * @see ArmListener
+ */
+
+public final class ArmEvent : TypedEvent {
+
+    //static final long serialVersionUID = 3258126964249212217L;
+
+/**
+ * Constructs a new instance of this class based on the
+ * information in the given untyped event.
+ *
+ * @param e the untyped event containing the information
+ */
+public this(Event e) {
+    super(e);
+}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/events/ArmListener.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2003 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.events.ArmListener;
+
+public import dwt.internal.DWTEventListener;
+public import dwt.events.ArmEvent;
+
+/**
+ * Classes which implement this interface provide a method
+ * that deals with the event that is generated when a widget,
+ * such as a menu item, is armed.
+ * <p>
+ * After creating an instance of a class that extends
+ * this interface it can be added to a widget using the
+ * <code>addArmListener</code> method and removed using
+ * the <code>removeArmListener</code> method. When the
+ * widget is armed, the widgetArmed method will be invoked.
+ * </p>
+ *
+ * @see ArmEvent
+ */
+public interface ArmListener : DWTEventListener {
+
+/**
+ * Sent when a widget is armed, or 'about to be selected'.
+ *
+ * @param e an event containing information about the arm
+ */
+public void widgetArmed(ArmEvent e);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/events/ControlAdapter.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2003 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.events.ControlAdapter;
+
+import dwt.events.ControlListener;
+/**
+ * This adapter class provides default implementations for the
+ * methods described by the <code>ControlListener</code> interface.
+ * <p>
+ * Classes that wish to deal with <code>ControlEvent</code>s can
+ * extend this class and override only the methods which they are
+ * interested in.
+ * </p>
+ *
+ * @see ControlListener
+ * @see ControlEvent
+ */
+public abstract class ControlAdapter : ControlListener {
+
+/**
+ * Sent when the location (x, y) of a control changes relative
+ * to its parent (or relative to the display, for <code>Shell</code>s).
+ * The default behavior is to do nothing.
+ *
+ * @param e an event containing information about the move
+ */
+public void controlMoved(ControlEvent e) {
+}
+
+/**
+ * Sent when the size (width, height) of a control changes.
+ * The default behavior is to do nothing.
+ *
+ * @param e an event containing information about the resize
+ */
+public void controlResized(ControlEvent e) {
+}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/events/ControlEvent.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.events.ControlEvent;
+
+
+import dwt.widgets.Event;
+import dwt.events.TypedEvent;
+
+/**
+ * Instances of this class are sent as a result of
+ * controls being moved or resized.
+ *
+ * @see ControlListener
+ */
+
+public final class ControlEvent : TypedEvent {
+
+    //static final long serialVersionUID = 3258132436155119161L;
+
+/**
+ * Constructs a new instance of this class based on the
+ * information in the given untyped event.
+ *
+ * @param e the untyped event containing the information
+ */
+public this(Event e) {
+    super(e);
+}
+
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/events/ControlListener.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2003 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.events.ControlListener;
+
+public import dwt.internal.DWTEventListener;
+public import dwt.events.ControlEvent;
+
+/**
+ * Classes which implement this interface provide methods
+ * that deal with the events that are generated by moving
+ * and resizing controls.
+ * <p>
+ * After creating an instance of a class that extends
+ * this interface it can be added to a control using the
+ * <code>addControlListener</code> method and removed using
+ * the <code>removeControlListener</code> method. When a
+ * control is moved or resized, the appropriate method will
+ * be invoked.
+ * </p>
+ *
+ * @see ControlAdapter
+ * @see ControlEvent
+ */
+public interface ControlListener : DWTEventListener {
+
+/**
+ * Sent when the location (x, y) of a control changes relative
+ * to its parent (or relative to the display, for <code>Shell</code>s).
+ *
+ * @param e an event containing information about the move
+ */
+public void controlMoved(ControlEvent e);
+
+/**
+ * Sent when the size (width, height) of a control changes.
+ *
+ * @param e an event containing information about the resize
+ */
+public void controlResized(ControlEvent e);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/events/DisposeEvent.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.events.DisposeEvent;
+
+
+import dwt.widgets.Event;
+import dwt.events.TypedEvent;
+
+/**
+ * Instances of this class are sent as a result of
+ * widgets being disposed.
+ *
+ * @see DisposeListener
+ */
+
+public final class DisposeEvent : TypedEvent {
+
+    //static final long serialVersionUID = 3257566187633521206L;
+
+/**
+ * Constructs a new instance of this class based on the
+ * information in the given untyped event.
+ *
+ * @param e the untyped event containing the information
+ */
+public this(Event e) {
+    super(e);
+}
+
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/events/DisposeListener.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2003 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.events.DisposeListener;
+
+
+public import dwt.internal.DWTEventListener;
+public import dwt.events.DisposeEvent;
+
+/**
+ * Classes which implement this interface provide a method
+ * that deals with the event that is generated when a widget
+ * is disposed.
+ * <p>
+ * After creating an instance of a class that extends
+ * this interface it can be added to a widget using the
+ * <code>addDisposeListener</code> method and removed using
+ * the <code>removeDisposeListener</code> method. When a
+ * widget is disposed, the widgetDisposed method will
+ * be invoked.
+ * </p>
+ *
+ * @see DisposeEvent
+ */
+public interface DisposeListener : DWTEventListener {
+
+/**
+ * Sent when the widget is disposed.
+ *
+ * @param e an event containing information about the dispose
+ */
+public void widgetDisposed(DisposeEvent e);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/events/DragDetectEvent.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.events.DragDetectEvent;
+
+import dwt.widgets.Event;
+import dwt.events.MouseEvent;
+
+/**
+ * Instances of this class are sent as a result of
+ * a drag gesture.
+ *
+ * @see DragDetectListener
+ *
+ * @since 3.3
+ */
+
+public final class DragDetectEvent : MouseEvent {
+
+    //private static final long serialVersionUID = -7229172519733647232L;
+
+/**
+ * Constructs a new instance of this class based on the
+ * information in the given untyped event.
+ *
+ * @param e the untyped event containing the information
+ */
+public this(Event e) {
+    super(e);
+}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/events/DragDetectListener.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.events.DragDetectListener;
+
+
+public import dwt.internal.DWTEventListener;
+public import dwt.events.DragDetectEvent;
+
+/**
+ * Classes which implement this interface provide methods
+ * that deal with the events that are generated when a drag
+ * gesture is detected.
+ * <p>
+ * After creating an instance of a class that extends
+ * this interface it can be added to a control using the
+ * <code>addDragDetectListener</code> method and removed using
+ * the <code>removeDragDetectListener</code> method. When the
+ * drag is detected, the drageDetected method will be invoked.
+ * </p>
+ *
+ * @see DragDetectEvent
+ *
+ * @since 3.3
+ */
+public interface DragDetectListener : DWTEventListener {
+
+/**
+ * Sent when a drag gesture is detected.
+ *
+ * @param e an event containing information about the drag
+ */
+public void dragDetected(DragDetectEvent e);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/events/ExpandAdapter.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.events.ExpandAdapter;
+
+import dwt.events.ExpandListener;
+
+/**
+ * This adapter class provides default implementations for the
+ * methods described by the <code>ExpandListener</code> interface.
+ * <p>
+ * Classes that wish to deal with <code>ExpandEvent</code>s can
+ * extend this class and override only the methods which they are
+ * interested in.
+ * </p>
+ *
+ * @see ExpandListener
+ * @see ExpandEvent
+ *
+ * @since 3.2
+ */
+public abstract class ExpandAdapter : ExpandListener {
+
+/**
+ * Sent when an item is collapsed.
+ * The default behavior is to do nothing.
+ *
+ * @param e an event containing information about the operation
+ */
+public void itemCollapsed(ExpandEvent e) {
+}
+
+/**
+ * Sent when an item is expanded.
+ * The default behavior is to do nothing.
+ *
+ * @param e an event containing information about the operation
+ */
+public void itemExpanded(ExpandEvent e) {
+}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/events/ExpandEvent.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.events.ExpandEvent;
+
+
+import dwt.widgets.Event;
+import dwt.events.SelectionEvent;
+
+/**
+ * Instances of this class are sent as a result of
+ * <code>ExpandItem</code>s being expanded or collapsed.
+ *
+ * @see ExpandListener
+ *
+ * @since 3.2
+ */
+
+public class ExpandEvent : SelectionEvent {
+
+    //static final long serialVersionUID = 3976735856884987356L;
+
+/**
+ * Constructs a new instance of this class based on the
+ * information in the given untyped event.
+ *
+ * @param e the untyped event containing the information
+ */
+public this(Event e) {
+    super(e);
+}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/events/ExpandListener.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.events.ExpandListener;
+
+
+public import dwt.internal.DWTEventListener;
+public import dwt.events.ExpandEvent;
+
+/**
+ * Classes which implement this interface provide methods
+ * that deal with the expanding and collapsing of <code>ExpandItem</code>s.
+ *
+ * <p>
+ * After creating an instance of a class that extends
+ * this interface it can be added to a <code>ExpandBar</code>
+ * control using the <code>addExpandListener</code> method and
+ * removed using the <code>removeExpandListener</code> method.
+ * When a item of the <code>ExpandBar</code> is expanded or
+ * collapsed, the appropriate method will be invoked.
+ * </p>
+ *
+ * @see ExpandAdapter
+ * @see ExpandEvent
+ *
+ * @since 3.2
+ */
+public interface ExpandListener : DWTEventListener {
+
+/**
+ * Sent when an item is collapsed.
+ *
+ * @param e an event containing information about the operation
+ */
+public void itemCollapsed(ExpandEvent e);
+
+/**
+ * Sent when an item is expanded.
+ *
+ * @param e an event containing information about the operation
+ */
+public void itemExpanded(ExpandEvent e);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/events/FocusAdapter.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2003 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.events.FocusAdapter;
+
+import dwt.events.FocusListener;
+
+/**
+ * This adapter class provides default implementations for the
+ * methods described by the <code>FocusListener</code> interface.
+ * <p>
+ * Classes that wish to deal with <code>FocusEvent</code>s can
+ * extend this class and override only the methods which they are
+ * interested in.
+ * </p>
+ *
+ * @see FocusListener
+ * @see FocusEvent
+ */
+public abstract class FocusAdapter : FocusListener {
+
+/**
+ * Sent when a control gets focus.
+ * The default behavior is to do nothing.
+ *
+ * @param e an event containing information about the focus change
+ */
+public void focusGained(FocusEvent e) {
+}
+
+/**
+ * Sent when a control loses focus.
+ * The default behavior is to do nothing.
+ *
+ * @param e an event containing information about the focus change
+ */
+public void focusLost(FocusEvent e) {
+}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/events/FocusEvent.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.events.FocusEvent;
+
+
+import dwt.widgets.Event;
+import dwt.events.TypedEvent;
+
+/**
+ * Instances of this class are sent as a result of
+ * widgets gaining and losing focus.
+ *
+ * @see FocusListener
+ */
+
+public final class FocusEvent : TypedEvent {
+
+    //static final long serialVersionUID = 3258134643684227381L;
+
+/**
+ * Constructs a new instance of this class based on the
+ * information in the given untyped event.
+ *
+ * @param e the untyped event containing the information
+ */
+public this(Event e) {
+    super(e);
+}
+
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/events/FocusListener.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2003 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.events.FocusListener;
+
+
+public import dwt.internal.DWTEventListener;
+public import dwt.events.FocusEvent;
+
+/**
+ * Classes which implement this interface provide methods
+ * that deal with the events that are generated as controls
+ * gain and lose focus.
+ * <p>
+ * After creating an instance of a class that extends
+ * this interface it can be added to a control using the
+ * <code>addFocusListener</code> method and removed using
+ * the <code>removeFocusListener</code> method. When a
+ * control gains or loses focus, the appropriate method
+ * will be invoked.
+ * </p>
+ *
+ * @see FocusAdapter
+ * @see FocusEvent
+ */
+public interface FocusListener : DWTEventListener {
+
+/**
+ * Sent when a control gets focus.
+ *
+ * @param e an event containing information about the focus change
+ */
+public void focusGained(FocusEvent e);
+
+/**
+ * Sent when a control loses focus.
+ *
+ * @param e an event containing information about the focus change
+ */
+public void focusLost(FocusEvent e);
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/events/HelpEvent.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.events.HelpEvent;
+
+
+import dwt.widgets.Event;
+import dwt.events.TypedEvent;
+
+/**
+ * Instances of this class are sent as a result of
+ * help being requested for a widget.
+ *
+ * @see HelpListener
+ */
+
+public final class HelpEvent : TypedEvent {
+
+    //static final long serialVersionUID = 3257001038606251315L;
+
+/**
+ * Constructs a new instance of this class based on the
+ * information in the given untyped event.
+ *
+ * @param e the untyped event containing the information
+ */
+public this(Event e) {
+    super(e);
+}
+
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/events/HelpListener.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2003 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.events.HelpListener;
+
+
+public import dwt.internal.DWTEventListener;
+public import dwt.events.HelpEvent;
+
+/**
+ * Classes which implement this interface provide a method
+ * that deals with the event that is generated when help is
+ * requested for a control, typically when the user presses F1.
+ * <p>
+ * After creating an instance of a class that extends
+ * this interface it can be added to a control using the
+ * <code>addHelpListener</code> method and removed using
+ * the <code>removeHelpListener</code> method. When help
+ * is requested for a control, the helpRequested method
+ * will be invoked.
+ * </p>
+ *
+ * @see HelpEvent
+ */
+public interface HelpListener : DWTEventListener {
+
+/**
+ * Sent when help is requested for a control, typically
+ * when the user presses F1.
+ *
+ * @param e an event containing information about the help
+ */
+public void helpRequested(HelpEvent e);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/events/KeyAdapter.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2003 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.events.KeyAdapter;
+
+import dwt.events.KeyListener;
+
+/**
+ * This adapter class provides default implementations for the
+ * methods described by the <code>KeyListener</code> interface.
+ * <p>
+ * Classes that wish to deal with <code>KeyEvent</code>s can
+ * extend this class and override only the methods which they are
+ * interested in.
+ * </p>
+ *
+ * @see KeyListener
+ * @see KeyEvent
+ */
+public abstract class KeyAdapter : KeyListener {
+
+/**
+ * Sent when a key is pressed on the system keyboard.
+ * The default behavior is to do nothing.
+ *
+ * @param e an event containing information about the key press
+ */
+public void keyPressed(KeyEvent e) {
+}
+
+/**
+ * Sent when a key is released on the system keyboard.
+ * The default behavior is to do nothing.
+ *
+ * @param e an event containing information about the key release
+ */
+public void keyReleased(KeyEvent e) {
+}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/events/KeyEvent.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.events.KeyEvent;
+
+
+import dwt.widgets.Event;
+import dwt.events.TypedEvent;
+
+import tango.text.convert.Format;
+
+/**
+ * Instances of this class are sent as a result of
+ * keys being pressed and released on the keyboard.
+ * <p>
+ * When a key listener is added to a control, the control
+ * will take part in widget traversal.  By default, all
+ * traversal keys (such as the tab key and so on) are
+ * delivered to the control.  In order for a control to take
+ * part in traversal, it should listen for traversal events.
+ * Otherwise, the user can traverse into a control but not
+ * out.  Note that native controls such as table and tree
+ * implement key traversal in the operating system.  It is
+ * not necessary to add traversal listeners for these controls,
+ * unless you want to override the default traversal.
+ * </p>
+ * @see KeyListener
+ * @see TraverseListener
+ */
+
+public class KeyEvent : TypedEvent {
+
+    /**
+     * the character represented by the key that was typed.
+     * This is the final character that results after all modifiers have been
+     * applied.  For example, when the user types Ctrl+A, the character value
+     * is 0x01.  It is important that applications do not attempt to modify the
+     * character value based on a stateMask (such as DWT.CTRL) or the resulting
+     * character will not be correct.
+     */
+    public wchar character = '\0';
+
+    /**
+     * the key code of the key that was typed,
+     * as defined by the key code constants in class <code>DWT</code>.
+     * When the character field of the event is ambiguous, this field
+     * contains the unicode value of the original character.  For example,
+     * typing Ctrl+M or Return both result in the character '\r' but the
+     * keyCode field will also contain '\r' when Return was typed.
+     *
+     * @see dwt.DWT
+     */
+    public int keyCode;
+
+    /**
+     * the state of the keyboard modifier keys at the time
+     * the event was generated, as defined by the key code
+     * constants in class <code>DWT</code>.
+     *
+     * @see dwt.DWT
+     */
+    public int stateMask;
+
+    /**
+     * A flag indicating whether the operation should be allowed.
+     * Setting this field to <code>false</code> will cancel the operation.
+     */
+    public bool doit;
+
+    static final long serialVersionUID = 3256442491011412789L;
+
+/**
+ * Constructs a new instance of this class based on the
+ * information in the given untyped event.
+ *
+ * @param e the untyped event containing the information
+ */
+public this(Event e) {
+    super(e);
+    this.character = e.character;
+    this.keyCode = e.keyCode;
+    this.stateMask = e.stateMask;
+    this.doit = e.doit;
+}
+
+/**
+ * Returns a string containing a concise, human-readable
+ * description of the receiver.
+ *
+ * @return a string representation of the event
+ */
+public char[] toString() {
+    return Format( "{} character={} keyCode={} stateMask={} doit={}}",
+        super.toString[ 0 .. $-2 ],
+        character, keyCode, stateMask, doit );
+}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/events/KeyListener.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2003 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.events.KeyListener;
+
+
+public import dwt.internal.DWTEventListener;
+public import dwt.events.KeyEvent;
+
+/**
+ * Classes which implement this interface provide methods
+ * that deal with the events that are generated as keys
+ * are pressed on the system keyboard.
+ * <p>
+ * After creating an instance of a class that extends
+ * this interface it can be added to a control using the
+ * <code>addKeyListener</code> method and removed using
+ * the <code>removeKeyListener</code> method. When a
+ * key is pressed or released, the appropriate method will
+ * be invoked.
+ * </p>
+ *
+ * @see KeyAdapter
+ * @see KeyEvent
+ */
+public interface KeyListener : DWTEventListener {
+
+/**
+ * Sent when a key is pressed on the system keyboard.
+ *
+ * @param e an event containing information about the key press
+ */
+public void keyPressed(KeyEvent e);
+
+/**
+ * Sent when a key is released on the system keyboard.
+ *
+ * @param e an event containing information about the key release
+ */
+public void keyReleased(KeyEvent e);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/events/MenuAdapter.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2003 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.events.MenuAdapter;
+
+import dwt.events.MenuListener;
+
+/**
+ * This adapter class provides default implementations for the
+ * methods described by the <code>MenuListener</code> interface.
+ * <p>
+ * Classes that wish to deal with <code>MenuEvent</code>s can
+ * extend this class and override only the methods which they are
+ * interested in.
+ * </p>
+ *
+ * @see MenuListener
+ * @see MenuEvent
+ */
+public abstract class MenuAdapter : MenuListener {
+
+/**
+ * Sent when a menu is hidden.
+ * The default behavior is to do nothing.
+ *
+ * @param e an event containing information about the menu operation
+ */
+public void menuHidden(MenuEvent e) {
+}
+
+/**
+ * Sent when a menu is shown.
+ * The default behavior is to do nothing.
+ *
+ * @param e an event containing information about the menu operation
+ */
+public void menuShown(MenuEvent e) {
+}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/events/MenuDetectEvent.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,73 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.events.MenuDetectEvent;
+
+
+import dwt.widgets.Event;
+import dwt.events.TypedEvent;
+
+import tango.text.convert.Format;
+/**
+ * Instances of this class are sent whenever the platform-
+ * specific trigger for showing a context menu is detected.
+ *
+ * @see MenuDetectListener
+ *
+ * @since 3.3
+ */
+
+public final class MenuDetectEvent : TypedEvent {
+
+    /**
+     * the display-relative x coordinate of the pointer
+     * at the time the context menu trigger occurred
+     */
+    public int x;
+
+    /**
+     * the display-relative y coordinate of the pointer
+     * at the time the context menu trigger occurred
+     */
+    public int y;
+
+    /**
+     * A flag indicating whether the operation should be allowed.
+     * Setting this field to <code>false</code> will cancel the operation.
+     */
+    public bool doit;
+
+    //private static final long serialVersionUID = -3061660596590828941L;
+
+/**
+ * Constructs a new instance of this class based on the
+ * information in the given untyped event.
+ *
+ * @param e the untyped event containing the information
+ */
+public this(Event e) {
+    super(e);
+    this.x = e.x;
+    this.y = e.y;
+    this.doit = e.doit;
+}
+
+/**
+ * Returns a string containing a concise, human-readable
+ * description of the receiver.
+ *
+ * @return a string representation of the event
+ */
+public char[] toString() {
+    return Format( "{} x={} y={} doit={}}", super.toString[ 0 .. $-2 ], x, y, doit );
+}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/events/MenuDetectListener.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.events.MenuDetectListener;
+
+
+public import dwt.internal.DWTEventListener;
+public import dwt.events.MenuDetectEvent;
+
+/**
+ * Classes which implement this interface provide methods
+ * that deal with the events that are generated when the
+ * platform-specific trigger for showing a context menu is
+ * detected.
+ * <p>
+ * After creating an instance of a class that extends
+ * this interface it can be added to a control or TrayItem
+ * using the <code>addMenuDetectListener</code> method and
+ * removed using the <code>removeMenuDetectListener</code> method.
+ * When the context menu trigger occurs, the
+ * <code>menuDetected</code> method will be invoked.
+ * </p>
+ *
+ * @see MenuDetectEvent
+ *
+ * @since 3.3
+ */
+public interface MenuDetectListener : DWTEventListener {
+
+/**
+ * Sent when the platform-dependent trigger for showing a menu item is detected.
+ *
+ * @param e an event containing information about the menu detect
+ */
+public void menuDetected (MenuDetectEvent e);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/events/MenuEvent.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.events.MenuEvent;
+
+
+import dwt.widgets.Event;
+import dwt.events.TypedEvent;
+
+/**
+ * Instances of this class are sent as a result of
+ * menus being shown and hidden.
+ *
+ * @see MenuListener
+ */
+
+public final class MenuEvent : TypedEvent {
+
+    //static final long serialVersionUID = 3258132440332383025L;
+
+/**
+ * Constructs a new instance of this class based on the
+ * information in the given untyped event.
+ *
+ * @param e the untyped event containing the information
+ */
+public this(Event e) {
+    super(e);
+}
+
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/events/MenuListener.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2005 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.events.MenuListener;
+
+
+public import dwt.internal.DWTEventListener;
+public import dwt.events.MenuEvent;
+
+/**
+ * Classes which implement this interface provide methods
+ * that deal with the hiding and showing of menus.
+ * <p>
+ * After creating an instance of a class that extends
+ * this interface it can be added to a menu using the
+ * <code>addMenuListener</code> method and removed using
+ * the <code>removeMenuListener</code> method. When the
+ * menu is hidden or shown, the appropriate method will
+ * be invoked.
+ * </p>
+ *
+ * @see MenuAdapter
+ * @see MenuEvent
+ */
+public interface MenuListener : DWTEventListener {
+
+/**
+ * Sent when a menu is hidden.
+ *
+ * @param e an event containing information about the menu operation
+ */
+public void menuHidden(MenuEvent e);
+
+/**
+ * Sent when a menu is shown.
+ *
+ * @param e an event containing information about the menu operation
+ */
+public void menuShown(MenuEvent e);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/events/ModifyEvent.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.events.ModifyEvent;
+
+
+import dwt.widgets.Event;
+import dwt.events.TypedEvent;
+
+/**
+ * Instances of this class are sent as a result of
+ * text being modified.
+ *
+ * @see ModifyListener
+ */
+
+public final class ModifyEvent : TypedEvent {
+
+    //static final long serialVersionUID = 3258129146227011891L;
+
+/**
+ * Constructs a new instance of this class based on the
+ * information in the given untyped event.
+ *
+ * @param e the untyped event containing the information
+ */
+public this(Event e) {
+    super(e);
+}
+
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/events/ModifyListener.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2003 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.events.ModifyListener;
+
+
+public import dwt.internal.DWTEventListener;
+public import dwt.events.ModifyEvent;
+
+/**
+ * Classes which implement this interface provide a method
+ * that deals with the events that are generated when text
+ * is modified.
+ * <p>
+ * After creating an instance of a class that extends
+ * this interface it can be added to a text widget using the
+ * <code>addModifyListener</code> method and removed using
+ * the <code>removeModifyListener</code> method. When the
+ * text is modified, the modifyText method will be invoked.
+ * </p>
+ *
+ * @see ModifyEvent
+ */
+public interface ModifyListener : DWTEventListener {
+
+/**
+ * Sent when the text is modified.
+ *
+ * @param e an event containing information about the modify
+ */
+public void modifyText(ModifyEvent e);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/events/MouseAdapter.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.events.MouseAdapter;
+
+import dwt.events.MouseListener;
+
+/**
+ * This adapter class provides default implementations for the
+ * methods described by the <code>MouseListener</code> interface.
+ * <p>
+ * Classes that wish to deal with <code>MouseEvent</code>s
+ * which occur as mouse buttons are pressed and released can
+ * extend this class and override only the methods which they are
+ * interested in.
+ * </p>
+ *
+ * @see MouseListener
+ * @see MouseEvent
+ */
+public abstract class MouseAdapter : MouseListener {
+
+/**
+ * Sent when a mouse button is pressed twice within the
+ * (operating system specified) double click period.
+ * The default behavior is to do nothing.
+ *
+ * @param e an event containing information about the mouse double click
+ *
+ * @see dwt.widgets.Display#getDoubleClickTime()
+ */
+public void mouseDoubleClick(MouseEvent e) {
+}
+
+/**
+ * Sent when a mouse button is pressed.
+ * The default behavior is to do nothing.
+ *
+ * @param e an event containing information about the mouse button press
+ */
+public void mouseDown(MouseEvent e) {
+}
+
+/**
+ * Sent when a mouse button is released.
+ * The default behavior is to do nothing.
+ *
+ * @param e an event containing information about the mouse button release
+ */
+public void mouseUp(MouseEvent e) {
+}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/events/MouseEvent.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,101 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.events.MouseEvent;
+
+
+import dwt.widgets.Event;
+import dwt.events.TypedEvent;
+
+import tango.text.convert.Format;
+
+/**
+ * Instances of this class are sent whenever mouse
+ * related actions occur. This includes mouse buttons
+ * being pressed and released, the mouse pointer being
+ * moved and the mouse pointer crossing widget boundaries.
+ * <p>
+ * Note: The <code>button</code> field is an integer that
+ * represents the mouse button number.  This is not the same
+ * as the <code>DWT</code> mask constants <code>BUTTONx</code>.
+ * </p>
+ *
+ * @see MouseListener
+ * @see MouseMoveListener
+ * @see MouseTrackListener
+ */
+
+public class MouseEvent : TypedEvent {
+
+    /**
+     * the button that was pressed or released; 1 for the
+     * first button, 2 for the second button, and 3 for the
+     * third button, etc.
+     */
+    public int button;
+
+    /**
+     * the state of the keyboard modifier keys at the time
+     * the event was generated
+     */
+    public int stateMask;
+
+    /**
+     * the widget-relative, x coordinate of the pointer
+     * at the time the mouse button was pressed or released
+     */
+    public int x;
+
+    /**
+     * the widget-relative, y coordinate of the pointer
+     * at the time the mouse button was pressed or released
+     */
+    public int y;
+
+    /**
+     * the number times the mouse has been clicked, as defined
+     * by the operating system; 1 for the first click, 2 for the
+     * second click and so on.
+     *
+     * @since 3.3
+     */
+    public int count;
+
+    //static final long serialVersionUID = 3257288037011566898L;
+
+/**
+ * Constructs a new instance of this class based on the
+ * information in the given untyped event.
+ *
+ * @param e the untyped event containing the information
+ */
+public this(Event e) {
+    super(e);
+    this.x = e.x;
+    this.y = e.y;
+    this.button = e.button;
+    this.stateMask = e.stateMask;
+    this.count = e.count;
+}
+
+/**
+ * Returns a string containing a concise, human-readable
+ * description of the receiver.
+ *
+ * @return a string representation of the event
+ */
+public char[] toString() {
+    return Format( "{} button={} stateMask={} x={} y={} count={}}",
+        super.toString[ 0 .. $-2 ],
+        button, stateMask, x, y, count );
+}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/events/MouseListener.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.events.MouseListener;
+
+
+public import dwt.internal.DWTEventListener;
+public import dwt.events.MouseEvent;
+
+/**
+ * Classes which implement this interface provide methods
+ * that deal with the events that are generated as mouse buttons
+ * are pressed.
+ * <p>
+ * After creating an instance of a class that extends
+ * this interface it can be added to a control using the
+ * <code>addMouseListener</code> method and removed using
+ * the <code>removeMouseListener</code> method. When a
+ * mouse button is pressed or released, the appropriate method
+ * will be invoked.
+ * </p>
+ *
+ * @see MouseAdapter
+ * @see MouseEvent
+ */
+public interface MouseListener : DWTEventListener {
+
+/**
+ * Sent when a mouse button is pressed twice within the
+ * (operating system specified) double click period.
+ *
+ * @param e an event containing information about the mouse double click
+ *
+ * @see dwt.widgets.Display#getDoubleClickTime()
+ */
+public void mouseDoubleClick(MouseEvent e);
+
+/**
+ * Sent when a mouse button is pressed.
+ *
+ * @param e an event containing information about the mouse button press
+ */
+public void mouseDown(MouseEvent e);
+
+/**
+ * Sent when a mouse button is released.
+ *
+ * @param e an event containing information about the mouse button release
+ */
+public void mouseUp(MouseEvent e);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/events/MouseMoveListener.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2003 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.events.MouseMoveListener;
+
+
+public import dwt.internal.DWTEventListener;
+public import dwt.events.MouseEvent;
+
+/**
+ * Classes which implement this interface provide a method
+ * that deals with the events that are generated as the mouse
+ * pointer moves.
+ * <p>
+ * After creating an instance of a class that extends
+ * this interface it can be added to a control using the
+ * <code>addMouseMoveListener</code> method and removed using
+ * the <code>removeMouseMoveListener</code> method. As the
+ * mouse moves, the mouseMove method will be invoked.
+ * </p>
+ *
+ * @see MouseEvent
+ */
+public interface MouseMoveListener : DWTEventListener {
+
+/**
+ * Sent when the mouse moves.
+ *
+ * @param e an event containing information about the mouse move
+ */
+public void mouseMove(MouseEvent e);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/events/MouseTrackAdapter.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.events.MouseTrackAdapter;
+
+import dwt.events.MouseTrackListener;
+
+/**
+ * This adapter class provides default implementations for the
+ * methods described by the <code>MouseTrackListener</code> interface.
+ * <p>
+ * Classes that wish to deal with <code>MouseEvent</code>s which
+ * occur as the mouse pointer passes (or hovers) over controls can
+ * extend this class and override only the methods which they are
+ * interested in.
+ * </p>
+ *
+ * @see MouseTrackListener
+ * @see MouseEvent
+ */
+public abstract class MouseTrackAdapter : MouseTrackListener {
+
+/**
+ * Sent when the mouse pointer passes into the area of
+ * the screen covered by a control.
+ * The default behavior is to do nothing.
+ *
+ * @param e an event containing information about the mouse enter
+ */
+public void mouseEnter(MouseEvent e) {
+}
+
+/**
+ * Sent when the mouse pointer passes out of the area of
+ * the screen covered by a control.
+ * The default behavior is to do nothing.
+ *
+ * @param e an event containing information about the mouse exit
+ */
+public void mouseExit(MouseEvent e) {
+}
+
+/**
+ * Sent when the mouse pointer hovers (that is, stops moving
+ * for an (operating system specified) period of time) over
+ * a control.
+ * The default behavior is to do nothing.
+ *
+ * @param e an event containing information about the hover
+ */
+public void mouseHover(MouseEvent e) {
+}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/events/MouseTrackListener.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2003 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.events.MouseTrackListener;
+
+
+public import dwt.internal.DWTEventListener;
+public import dwt.events.MouseEvent;
+
+/**
+ * Classes which implement this interface provide methods
+ * that deal with the events that are generated as the mouse
+ * pointer passes (or hovers) over controls.
+ * <p>
+ * After creating an instance of a class that extends
+ * this interface it can be added to a control using the
+ * <code>addMouseTrackListener</code> method and removed using
+ * the <code>removeMouseTrackListener</code> method. When the
+ * mouse pointer passes into or out of the area of the screen
+ * covered by a control or pauses while over a control, the
+ * appropriate method will be invoked.
+ * </p>
+ *
+ * @see MouseTrackAdapter
+ * @see MouseEvent
+ */
+public interface MouseTrackListener : DWTEventListener {
+
+/**
+ * Sent when the mouse pointer passes into the area of
+ * the screen covered by a control.
+ *
+ * @param e an event containing information about the mouse enter
+ */
+public void mouseEnter(MouseEvent e);
+
+/**
+ * Sent when the mouse pointer passes out of the area of
+ * the screen covered by a control.
+ *
+ * @param e an event containing information about the mouse exit
+ */
+public void mouseExit(MouseEvent e);
+
+/**
+ * Sent when the mouse pointer hovers (that is, stops moving
+ * for an (operating system specified) period of time) over
+ * a control.
+ *
+ * @param e an event containing information about the hover
+ */
+public void mouseHover(MouseEvent e);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/events/MouseWheelListener.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.events.MouseWheelListener;
+
+
+public import dwt.internal.DWTEventListener;
+public import dwt.events.MouseEvent;
+
+/**
+ * Classes which implement this interface provide a method
+ * that deals with the event that is generated as the mouse
+ * wheel is scrolled.
+ * <p>
+ * After creating an instance of a class that extends
+ * this interface it can be added to a control using the
+ * <code>addMouseWheelListener</code> method and removed using
+ * the <code>removeMouseWheelListener</code> method. When the
+ * mouse wheel is scrolled the <code>mouseScrolled</code> method
+ * will be invoked.
+ * </p>
+ *
+ * @see MouseEvent
+ *
+ * @since 3.3
+ */
+public interface MouseWheelListener : DWTEventListener {
+
+/**
+ * Sent when the mouse wheel is scrolled.
+ *
+ * @param e an event containing information about the mouse wheel action
+ */
+public void mouseScrolled (MouseEvent e);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/events/PaintEvent.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,101 @@
+/*******************************************************************************
+ * 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.events.PaintEvent;
+
+
+import dwt.widgets.Event;
+import dwt.graphics.GC;
+
+import dwt.events.TypedEvent;
+
+import tango.text.convert.Format;
+
+/**
+ * Instances of this class are sent as a result of
+ * visible areas of controls requiring re-painting.
+ *
+ * @see PaintListener
+ */
+
+public final class PaintEvent : TypedEvent {
+
+    /**
+     * the graphics context to use when painting
+     * that is configured to use the colors, font and
+     * damaged region of the control.  It is valid
+     * only during the paint and must not be disposed
+     */
+    public GC gc;
+
+    /**
+     * the x offset of the bounding rectangle of the
+     * region that requires painting
+     */
+    public int x;
+
+    /**
+     * the y offset of the bounding rectangle of the
+     * region that requires painting
+     */
+    public int y;
+
+    /**
+     * the width of the bounding rectangle of the
+     * region that requires painting
+     */
+    public int width;
+
+    /**
+     * the height of the bounding rectangle of the
+     * region that requires painting
+     */
+    public int height;
+
+    /**
+     * the number of following paint events which
+     * are pending which may always be zero on
+     * some platforms
+     */
+    public int count;
+
+    //static final long serialVersionUID = 3256446919205992497L;
+
+/**
+ * Constructs a new instance of this class based on the
+ * information in the given untyped event.
+ *
+ * @param e the untyped event containing the information
+ */
+public this(Event e) {
+    super(e);
+    this.gc = e.gc;
+    this.x = e.x;
+    this.y = e.y;
+    this.width = e.width;
+    this.height = e.height;
+    this.count = e.count;
+}
+
+/**
+ * Returns a string containing a concise, human-readable
+ * description of the receiver.
+ *
+ * @return a string representation of the event
+ */
+public char[] toString() {
+    return Format( "{} gc={} x={} y={} width={} height={} count={}}",
+        super.toString[ 0 .. $-2 ],
+        gc, x, y, width, height, count );
+}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/events/PaintListener.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2003 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.events.PaintListener;
+
+
+public import dwt.internal.DWTEventListener;
+public import dwt.events.PaintEvent;
+
+/**
+ * Classes which implement this interface provide methods
+ * that deal with the events that are generated when the
+ * control needs to be painted.
+ * <p>
+ * After creating an instance of a class that extends
+ * this interface it can be added to a control using the
+ * <code>addPaintListener</code> method and removed using
+ * the <code>removePaintListener</code> method. When a
+ * paint event occurs, the paintControl method will be
+ * invoked.
+ * </p>
+ *
+ * @see PaintEvent
+ */
+public interface PaintListener : DWTEventListener {
+
+/**
+ * Sent when a paint event occurs for the control.
+ *
+ * @param e an event containing information about the paint
+ */
+public void paintControl(PaintEvent e);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/events/SelectionAdapter.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2003 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.events.SelectionAdapter;
+
+import dwt.events.SelectionListener;
+
+/**
+ * This adapter class provides default implementations for the
+ * methods described by the <code>SelectionListener</code> interface.
+ * <p>
+ * Classes that wish to deal with <code>SelectionEvent</code>s can
+ * extend this class and override only the methods which they are
+ * interested in.
+ * </p>
+ *
+ * @see SelectionListener
+ * @see SelectionEvent
+ */
+public abstract class SelectionAdapter : SelectionListener {
+
+/**
+ * Sent when selection occurs in the control.
+ * The default behavior is to do nothing.
+ *
+ * @param e an event containing information about the selection
+ */
+public void widgetSelected(SelectionEvent e) {
+}
+
+/**
+ * Sent when default selection occurs in the control.
+ * The default behavior is to do nothing.
+ *
+ * @param e an event containing information about the default selection
+ */
+public void widgetDefaultSelected(SelectionEvent e) {
+}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/events/SelectionEvent.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,145 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.events.SelectionEvent;
+
+
+import dwt.widgets.Event;
+import dwt.widgets.Widget;
+import dwt.events.TypedEvent;
+
+import tango.text.convert.Format;
+/**
+ * Instances of this class are sent as a result of
+ * widgets being selected.
+ * <p>
+ * Note: The fields that are filled in depend on the widget.
+ * </p>
+ *
+ * @see SelectionListener
+ */
+
+public class SelectionEvent : TypedEvent {
+
+    /**
+     * The item that was selected.
+     */
+    public Widget item;
+
+    /**
+     * Extra detail information about the selection, depending on the widget.
+     *
+     * <p><b>Sash</b><ul>
+     * <li>{@link dwt.DWT#DRAG}</li>
+     * </ul></p><p><b>ScrollBar and Slider</b><ul>
+     * <li>{@link dwt.DWT#DRAG}</li>
+     * <li>{@link dwt.DWT#HOME}</li>
+     * <li>{@link dwt.DWT#END}</li>
+     * <li>{@link dwt.DWT#ARROW_DOWN}</li>
+     * <li>{@link dwt.DWT#ARROW_UP}</li>
+     * <li>{@link dwt.DWT#PAGE_DOWN}</li>
+     * <li>{@link dwt.DWT#PAGE_UP}</li>
+     * </ul></p><p><b>Table and Tree</b><ul>
+     * <li>{@link dwt.DWT#CHECK}</li>
+     * </ul></p><p><b>Text</b><ul>
+     * <li>{@link dwt.DWT#CANCEL}</li>
+     * </ul></p><p><b>CoolItem and ToolItem</b><ul>
+     * <li>{@link dwt.DWT#ARROW}</li>
+     * </ul></p>
+     */
+    public int detail;
+
+    /**
+     * The x location of the selected area.
+     */
+    public int x;
+
+    /**
+     * The y location of selected area.
+     */
+    public int y;
+
+    /**
+     * The width of selected area.
+     */
+    public int width;
+
+    /**
+     * The height of selected area.
+     */
+    public int height;
+
+    /**
+     * The state of the keyboard modifier keys at the time
+     * the event was generated.
+     */
+    public int stateMask;
+
+    /**
+     * The text of the hyperlink that was selected.
+     * This will be either the text of the hyperlink or the value of its HREF,
+     * if one was specified.
+     *
+     * @see dwt.widgets.Link#setText(String)
+     * @since 3.1
+     */
+    public char[] text;
+
+    /**
+     * A flag indicating whether the operation should be allowed.
+     * Setting this field to <code>false</code> will cancel the
+     * operation, depending on the widget.
+     */
+    public bool doit;
+
+    //static final long serialVersionUID = 3976735856884987953L;
+
+/**
+ * Constructs a new instance of this class based on the
+ * information in the given untyped event.
+ *
+ * @param e the untyped event containing the information
+ */
+public this(Event e) {
+    super(e);
+    this.item = e.item;
+    this.x = e.x;
+    this.y = e.y;
+    this.width = e.width;
+    this.height = e.height;
+    this.detail = e.detail;
+    this.stateMask = e.stateMask;
+    this.text = e.text;
+    this.doit = e.doit;
+}
+
+/**
+ * Returns a string containing a concise, human-readable
+ * description of the receiver.
+ *
+ * @return a string representation of the event
+ */
+public char[] toString() {
+    return Format( "{} item={} detail={} x={} y={} width={} height={} stateMask={} text={} doit={}}",
+        super.toString[ 0 .. $-2 ],
+        item,
+        detail,
+        x,
+        y,
+        width,
+        height,
+        stateMask,
+        text,
+        doit );
+}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/events/SelectionListener.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2005 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.events.SelectionListener;
+
+
+public import dwt.internal.DWTEventListener;
+public import dwt.events.SelectionEvent;
+
+/**
+ * Classes which implement this interface provide methods
+ * that deal with the events that are generated when selection
+ * occurs in a control.
+ * <p>
+ * After creating an instance of a class that extends
+ * this interface it can be added to a control using the
+ * <code>addSelectionListener</code> method and removed using
+ * the <code>removeSelectionListener</code> method. When
+ * selection occurs in a control the appropriate method
+ * will be invoked.
+ * </p>
+ *
+ * @see SelectionAdapter
+ * @see SelectionEvent
+ */
+public interface SelectionListener : DWTEventListener {
+
+/**
+ * Sent when selection occurs in the control.
+ * <p>
+ * For example, selection occurs in a List when the user selects
+ * an item or items with the keyboard or mouse.  On some platforms,
+ * the event occurs when a mouse button or key is pressed.  On others,
+ * it happens when the mouse or key is released.  The exact key or
+ * mouse gesture that causes this event is platform specific.
+ * </p>
+ *
+ * @param e an event containing information about the selection
+ */
+public void widgetSelected(SelectionEvent e);
+
+/**
+ * Sent when default selection occurs in the control.
+ * <p>
+ * For example, on some platforms default selection occurs in a List
+ * when the user double-clicks an item or types return in a Text.
+ * On some platforms, the event occurs when a mouse button or key is
+ * pressed.  On others, it happens when the mouse or key is released.
+ * The exact key or mouse gesture that causes this event is platform
+ * specific.
+ * </p>
+ *
+ * @param e an event containing information about the default selection
+ */
+public void widgetDefaultSelected(SelectionEvent e);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/events/ShellAdapter.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,123 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2003 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.events.ShellAdapter;
+
+import dwt.events.ShellListener;
+
+/**
+ * This adapter class provides default implementations for the
+ * methods described by the <code>ShellListener</code> interface.
+ * <p>
+ * Classes that wish to deal with <code>ShellEvent</code>s can
+ * extend this class and override only the methods which they are
+ * interested in.
+ * </p>
+ *
+ * @see ShellListener
+ * @see ShellEvent
+ */
+public abstract class ShellAdapter : ShellListener {
+
+/**
+ * Sent when a shell becomes the active window.
+ * The default behavior is to do nothing.
+ *
+ * @param e an event containing information about the activation
+ */
+public void shellActivated(ShellEvent e) {
+}
+
+/**
+ * Sent when a shell is closed.
+ * The default behavior is to do nothing.
+ *
+ * @param e an event containing information about the close
+ */
+public void shellClosed(ShellEvent e) {
+}
+
+/**
+ * Sent when a shell stops being the active window.
+ * The default behavior is to do nothing.
+ *
+ * @param e an event containing information about the deactivation
+ */
+public void shellDeactivated(ShellEvent e) {
+}
+
+/**
+ * Sent when a shell is un-minimized.
+ * The default behavior is to do nothing.
+ *
+ * @param e an event containing information about the un-minimization
+ */
+public void shellDeiconified(ShellEvent e) {
+}
+
+/**
+ * Sent when a shell is minimized.
+ * The default behavior is to do nothing.
+ *
+ * @param e an event containing information about the minimization
+ */
+public void shellIconified(ShellEvent e) {
+}
+}
+
+class ShellDelegator : ShellAdapter {
+    alias void delegate(ShellEvent) DFunc;
+    DFunc delShellActivated;
+    DFunc delShellClosed;
+    DFunc delShellDeactivated;
+    DFunc delShellDeiconified;
+    DFunc delShellIconified;
+
+private this(
+    DFunc delShellActivated,
+    DFunc delShellClosed,
+    DFunc delShellDeactivated,
+    DFunc delShellDeiconified,
+    DFunc delShellIconified )
+{
+    this.delShellActivated = delShellActivated;
+    this.delShellClosed = delShellClosed;
+    this.delShellDeactivated = delShellDeactivated;
+    this.delShellDeiconified = delShellDeiconified;
+    this.delShellIconified = delShellIconified;
+}
+
+static ShellDelegator createShellActivated( DFunc del ){
+    return new ShellDelegator( del, null, null, null, null );
+}
+static ShellDelegator createShellClosed( DFunc del ){
+    return new ShellDelegator( null, del, null, null, null );
+}
+
+public void shellActivated(ShellEvent e) {
+    if( delShellActivated !is null ) delShellActivated(e);
+}
+public void shellClosed(ShellEvent e) {
+    if( delShellClosed !is null ) delShellClosed(e);
+}
+public void shellDeactivated(ShellEvent e) {
+    if( delShellDeactivated !is null ) delShellDeactivated(e);
+}
+public void shellDeiconified(ShellEvent e) {
+    if( delShellDeiconified !is null ) delShellDeiconified(e);
+}
+public void shellIconified(ShellEvent e) {
+    if( delShellIconified !is null ) delShellIconified(e);
+}
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/events/ShellEvent.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.events.ShellEvent;
+
+
+import dwt.widgets.Event;
+import dwt.events.TypedEvent;
+
+import tango.text.convert.Format;
+
+/**
+ * Instances of this class are sent as a result of
+ * operations being performed on shells.
+ *
+ * @see ShellListener
+ */
+
+public final class ShellEvent : TypedEvent {
+
+    /**
+     * A flag indicating whether the operation should be allowed.
+     * Setting this field to <code>false</code> will cancel the operation.
+     */
+    public bool doit;
+
+    //static final long serialVersionUID = 3257569490479888441L;
+
+/**
+ * Constructs a new instance of this class based on the
+ * information in the given untyped event.
+ *
+ * @param e the untyped event containing the information
+ */
+public this(Event e) {
+    super(e);
+    this.doit = e.doit;
+}
+
+/**
+ * Returns a string containing a concise, human-readable
+ * description of the receiver.
+ *
+ * @return a string representation of the event
+ */
+public char[] toString() {
+    return Format( "{} doit={}}", super.toString[ 0 .. $-2 ], doit );
+}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/events/ShellListener.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2005 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.events.ShellListener;
+
+
+public import dwt.internal.DWTEventListener;
+public import dwt.events.ShellEvent;
+
+/**
+ * Classes which implement this interface provide methods
+ * that deal with changes in state of <code>Shell</code>s.
+ * <p>
+ * After creating an instance of a class that extends
+ * this interface it can be added to a shell using the
+ * <code>addShellListener</code> method and removed using
+ * the <code>removeShellListener</code> method. When the
+ * state of the shell changes, the appropriate method will
+ * be invoked.
+ * </p>
+ *
+ * @see ShellAdapter
+ * @see ShellEvent
+ */
+public interface ShellListener : DWTEventListener {
+
+/**
+ * Sent when a shell becomes the active window.
+ *
+ * @param e an event containing information about the activation
+ */
+public void shellActivated(ShellEvent e);
+
+/**
+ * Sent when a shell is closed.
+ *
+ * @param e an event containing information about the close
+ */
+public void shellClosed(ShellEvent e);
+
+/**
+ * Sent when a shell stops being the active window.
+ *
+ * @param e an event containing information about the deactivation
+ */
+public void shellDeactivated(ShellEvent e);
+
+/**
+ * Sent when a shell is un-minimized.
+ *
+ * @param e an event containing information about the un-minimization
+ */
+public void shellDeiconified(ShellEvent e);
+
+/**
+ * Sent when a shell is minimized.
+ *
+ * @param e an event containing information about the minimization
+ */
+public void shellIconified(ShellEvent e);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/events/TraverseEvent.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,137 @@
+/*******************************************************************************
+ * 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.events.TraverseEvent;
+
+
+import dwt.widgets.Event;
+import dwt.events.KeyEvent;
+
+import tango.text.convert.Format;
+/**
+ * Instances of this class are sent as a result of
+ * widget traversal actions.
+ * <p>
+ * The traversal event allows fine control over keyboard traversal
+ * in a control both to implement traversal and override the default
+ * traversal behavior defined by the system.  This is achieved using
+ * two fields, <code>detail</code> and <code>doit</code>.
+ * </p><p>
+ * When a control is traversed, a traverse event is sent.  The detail
+ * describes the type of traversal and the doit field indicates the default
+ * behavior of the system.  For example, when a right arrow key is pressed
+ * in a text control, the detail field is <code>TRAVERSE_ARROW_NEXT</code>
+ * and the doit field is <code>false</code>, indicating that the system
+ * will not traverse to the next tab item and the arrow key will be
+ * delivered to the text control.  If the same key is pressed in a radio
+ * button, the doit field will be <code>true</code>, indicating that
+ * traversal is to proceed to the next tab item, possibly another radio
+ * button in the group and that the arrow key is not to be delivered
+ * to the radio button.
+ * </p><p>
+ * How can the traversal event be used to implement traversal?
+ * When a tab key is pressed in a canvas, the detail field will be
+ * <code>TRAVERSE_TAB_NEXT</code> and the doit field will be
+ * <code>false</code>.  The default behavior of the system is to
+ * provide no traversal for canvas controls.  This means that by
+ * default in a canvas, a key listener will see every key that the
+ * user types, including traversal keys.  To understand why this
+ * is so, it is important to understand that only the widget implementor
+ * can decide which traversal is appropriate for the widget.  Returning
+ * to the <code>TRAVERSE_TAB_NEXT</code> example, a text widget implemented
+ * by a canvas would typically want to use the tab key to insert a
+ * tab character into the widget.  A list widget implementation, on the
+ * other hand, would like the system default traversal behavior.  Using
+ * only the doit flag, both implementations are possible.  The text widget
+ * implementor sets doit to <code>false</code>, ensuring that the system
+ * will not traverse and that the tab key will be delivered to key listeners.
+ * The list widget implementor sets doit to <code>true</code>, indicating
+ * that the system should perform tab traversal and that the key should not
+ * be delivered to the list widget.
+ * </p><p>
+ * How can the traversal event be used to override system traversal?
+ * When the return key is pressed in a single line text control, the
+ * detail field is <code>TRAVERSE_RETURN</code> and the doit field
+ * is <code>true</code>.  This means that the return key will be processed
+ * by the default button, not the text widget.  If the text widget has
+ * a default selection listener, it will not run because the return key
+ * will be processed by the default button.  Imagine that the text control
+ * is being used as an in-place editor and return is used to dispose the
+ * widget.  Setting doit to <code>false</code> will stop the system from
+ * activating the default button but the key will be delivered to the text
+ * control, running the key and selection listeners for the text.  How
+ * can <code>TRAVERSE_RETURN</code> be implemented so that the default button
+ * will not be activated and the text widget will not see the return key?
+ * This is achieved by setting doit to <code>true</code>, and the detail
+ * to <code>TRAVERSE_NONE</code>.
+ * </p><p>
+ * Note: A widget implementor will typically implement traversal using
+ * only the doit flag to either enable or disable system traversal.
+ * </p>
+ *
+ * @see TraverseListener
+ */
+
+public final class TraverseEvent : KeyEvent {
+
+    /**
+     * The traversal type.
+     * <p><ul>
+     * <li>{@link dwt.DWT#TRAVERSE_NONE}</li>
+     * <li>{@link dwt.DWT#TRAVERSE_ESCAPE}</li>
+     * <li>{@link dwt.DWT#TRAVERSE_RETURN}</li>
+     * <li>{@link dwt.DWT#TRAVERSE_TAB_NEXT}</li>
+     * <li>{@link dwt.DWT#TRAVERSE_TAB_PREVIOUS}</li>
+     * <li>{@link dwt.DWT#TRAVERSE_ARROW_NEXT}</li>
+     * <li>{@link dwt.DWT#TRAVERSE_ARROW_PREVIOUS}</li>
+     * <li>{@link dwt.DWT#TRAVERSE_MNEMONIC}</li>
+     * <li>{@link dwt.DWT#TRAVERSE_PAGE_NEXT}</li>
+     * <li>{@link dwt.DWT#TRAVERSE_PAGE_PREVIOUS}</li>
+     * </ul></p>
+     *
+     * Setting this field will change the type of traversal.
+     * For example, setting the detail to <code>TRAVERSE_NONE</code>
+     * causes no traversal action to be taken.
+     *
+     * When used in conjunction with the <code>doit</code> field, the
+     * traversal detail field can be useful when overriding the default
+     * traversal mechanism for a control. For example, setting the doit
+     * field to <code>false</code> will cancel the operation and allow
+     * the traversal key stroke to be delivered to the control. Setting
+     * the doit field to <code>true</code> indicates that the traversal
+     * described by the detail field is to be performed.
+     */
+    public int detail;
+
+    //static final long serialVersionUID = 3257565105301239349L;
+
+/**
+ * Constructs a new instance of this class based on the
+ * information in the given untyped event.
+ *
+ * @param e the untyped event containing the information
+ */
+public this(Event e) {
+    super(e);
+    this.detail = e.detail;
+}
+
+/**
+ * Returns a string containing a concise, human-readable
+ * description of the receiver.
+ *
+ * @return a string representation of the event
+ */
+public char[] toString() {
+    return Format( "{} detail={}}", super.toString[ 0 .. $-2 ], detail );
+}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/events/TraverseListener.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2003 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.events.TraverseListener;
+
+
+public import dwt.internal.DWTEventListener;
+public import dwt.events.TraverseEvent;
+
+/**
+ * Classes which implement this interface provide a method
+ * that deals with the events that are generated when a
+ * traverse event occurs in a control.
+ * <p>
+ * After creating an instance of a class that extends
+ * this interface it can be added to a control using the
+ * <code>addTraverseListener</code> method and removed using
+ * the <code>removeTraverseListener</code> method. When a
+ * traverse event occurs in a control, the keyTraversed method
+ * will be invoked.
+ * </p>
+ *
+ * @see TraverseEvent
+ */
+public interface TraverseListener : DWTEventListener {
+
+/**
+ * Sent when a traverse event occurs in a control.
+ * <p>
+ * A traverse event occurs when the user presses a traversal
+ * key. Traversal keys are typically tab and arrow keys, along
+ * with certain other keys on some platforms. Traversal key
+ * constants beginning with <code>TRAVERSE_</code> are defined
+ * in the <code>DWT</code> class.
+ * </p>
+ *
+ * @param e an event containing information about the traverse
+ */
+public void keyTraversed(TraverseEvent e);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/events/TreeAdapter.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2003 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.events.TreeAdapter;
+
+import dwt.events.TreeListener;
+
+/**
+ * This adapter class provides default implementations for the
+ * methods described by the <code>TreeListener</code> interface.
+ * <p>
+ * Classes that wish to deal with <code>TreeEvent</code>s can
+ * extend this class and override only the methods which they are
+ * interested in.
+ * </p>
+ *
+ * @see TreeListener
+ * @see TreeEvent
+ */
+public abstract class TreeAdapter : TreeListener {
+
+/**
+ * Sent when a tree branch is collapsed.
+ * The default behavior is to do nothing.
+ *
+ * @param e an event containing information about the tree operation
+ */
+public void treeCollapsed(TreeEvent e) {
+}
+
+/**
+ * Sent when a tree branch is expanded.
+ * The default behavior is to do nothing.
+ *
+ * @param e an event containing information about the tree operation
+ */
+public void treeExpanded(TreeEvent e) {
+}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/events/TreeEvent.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.events.TreeEvent;
+
+
+import dwt.widgets.Event;
+import dwt.events.SelectionEvent;
+
+/**
+ * Instances of this class are sent as a result of
+ * trees being expanded and collapsed.
+ *
+ * @see TreeListener
+ */
+
+public final class TreeEvent : SelectionEvent {
+
+    //static final long serialVersionUID = 3257282548009677109L;
+
+/**
+ * Constructs a new instance of this class based on the
+ * information in the given untyped event.
+ *
+ * @param e the untyped event containing the information
+ */
+public this(Event e) {
+    super(e);
+}
+
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/events/TreeListener.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2005 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.events.TreeListener;
+
+
+public import dwt.internal.DWTEventListener;
+public import dwt.events.TreeEvent;
+
+/**
+ * Classes which implement this interface provide methods
+ * that deal with the expanding and collapsing of tree
+ * branches.
+ * <p>
+ * After creating an instance of a class that extends
+ * this interface it can be added to a tree control using the
+ * <code>addTreeListener</code> method and removed using
+ * the <code>removeTreeListener</code> method. When a branch
+ * of the tree is expanded or collapsed, the appropriate method
+ * will be invoked.
+ * </p>
+ *
+ * @see TreeAdapter
+ * @see TreeEvent
+ */
+public interface TreeListener : DWTEventListener {
+
+/**
+ * Sent when a tree branch is collapsed.
+ *
+ * @param e an event containing information about the tree operation
+ */
+public void treeCollapsed(TreeEvent e);
+
+/**
+ * Sent when a tree branch is expanded.
+ *
+ * @param e an event containing information about the tree operation
+ */
+public void treeExpanded(TreeEvent e);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/events/TypedEvent.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,104 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.events.TypedEvent;
+
+
+import dwt.widgets.Event;
+import dwt.widgets.Display;
+import dwt.widgets.Widget;
+import dwt.internal.DWTEventObject;
+
+import tango.text.convert.Format;
+import tango.text.Util : split;
+
+/**
+ * This is the super class for all typed event classes provided
+ * by DWT. Typed events contain particular information which is
+ * applicable to the event occurrence.
+ *
+ * @see dwt.widgets.Event
+ */
+public class TypedEvent : DWTEventObject {
+
+    /**
+     * the display where the event occurred
+     *
+     * @since 2.0
+     */
+    public Display display;
+
+    /**
+     * the widget that issued the event
+     */
+    public Widget widget;
+
+    /**
+     * the time that the event occurred.
+     *
+     * NOTE: This field is an unsigned integer and should
+     * be AND'ed with 0xFFFFFFFFL so that it can be treated
+     * as a signed long.
+     */
+    public int time;
+
+    /**
+     * a field for application use
+     */
+    public Object data;
+
+    //static final long serialVersionUID = 3257285846578377524L;
+
+/**
+ * Constructs a new instance of this class.
+ *
+ * @param object the object that fired the event
+ */
+public this(Object object) {
+    super(object);
+}
+
+/**
+ * Constructs a new instance of this class based on the
+ * information in the argument.
+ *
+ * @param e the low level event to initialize the receiver with
+ */
+public this(Event e) {
+    super(e.widget);
+    this.display = e.display;
+    this.widget = e.widget;
+    this.time = e.time;
+    this.data = e.data;
+}
+
+/**
+ * Returns the name of the event. This is the name of
+ * the class without the module name.
+ *
+ * @return the name of the event
+ */
+char[] getName () {
+    char[] str = this.classinfo.name;
+    return split( str, "." )[$-1];
+}
+
+/**
+ * Returns a string containing a concise, human-readable
+ * description of the receiver.
+ *
+ * @return a string representation of the event
+ */
+public char[] toString() {
+    return Format( "{}{{{} time={} data={}}", widget.toString(), time, data.toString() );
+}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/events/VerifyEvent.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.events.VerifyEvent;
+
+
+import dwt.widgets.Event;
+import dwt.events.KeyEvent;
+
+import tango.text.convert.Format;
+/**
+ * Instances of this class are sent as a result of
+ * widgets handling keyboard events
+ *
+ * @see VerifyListener
+ */
+
+public final class VerifyEvent : KeyEvent {
+
+    /**
+     * the range of text being modified.
+     * Setting these fields has no effect.
+     */
+    public int start, end;
+
+    /**
+     * the new text that will be inserted.
+     * Setting this field will change the text that is about to
+     * be inserted or deleted.
+     */
+    public char[] text;
+
+    //static final long serialVersionUID = 3257003246269577014L;
+
+/**
+ * Constructs a new instance of this class based on the
+ * information in the given untyped event.
+ *
+ * @param e the untyped event containing the information
+ */
+public this(Event e) {
+    super(e);
+    this.start = e.start;
+    this.end = e.end;
+    this.text = e.text;
+}
+
+/**
+ * Returns a string containing a concise, human-readable
+ * description of the receiver.
+ *
+ * @return a string representation of the event
+ */
+public char[] toString() {
+    return Format( "{} start={} end={} text={}}", super.toString[ 0 .. $-2 ], start, end, text );
+}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/events/VerifyListener.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2005 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.events.VerifyListener;
+
+
+public import dwt.internal.DWTEventListener;
+public import dwt.events.VerifyEvent;
+
+/**
+ * Classes which implement this interface provide a method
+ * that deals with the events that are generated when text
+ * is about to be modified.
+ * <p>
+ * After creating an instance of a class that extends
+ * this interface it can be added to a text control using the
+ * <code>addVerifyListener</code> method and removed using
+ * the <code>removeVerifyListener</code> method. When the
+ * text is about to be modified, the verifyText method
+ * will be invoked.
+ * </p>
+ *
+ * @see VerifyEvent
+ */
+public interface VerifyListener : DWTEventListener {
+
+/**
+ * Sent when the text is about to be modified.
+ * <p>
+ * A verify event occurs after the user has done something
+ * to modify the text (typically typed a key), but before
+ * the text is modified. The doit field in the verify event
+ * indicates whether or not to modify the text.
+ * </p>
+ *
+ * @param e an event containing information about the verify
+ */
+public void verifyText(VerifyEvent e);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/layout/FillData.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2005 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.layout.FillData;
+
+import dwt.DWT;
+import dwt.graphics.Point;
+import dwt.widgets.Control;
+
+class FillData {
+
+    int defaultWidth = -1, defaultHeight = -1;
+    int currentWhint, currentHhint, currentWidth = -1, currentHeight = -1;
+
+Point computeSize (Control control, int wHint, int hHint, bool flushCache_) {
+    if (flushCache_) flushCache();
+    if (wHint is DWT.DEFAULT && hHint is DWT.DEFAULT) {
+        if (defaultWidth is -1 || defaultHeight is -1) {
+            Point size = control.computeSize (wHint, hHint, flushCache_);
+            defaultWidth = size.x;
+            defaultHeight = size.y;
+        }
+        return new Point(defaultWidth, defaultHeight);
+    }
+    if (currentWidth is -1 || currentHeight is -1 || wHint !is currentWhint || hHint !is currentHhint) {
+        Point size = control.computeSize (wHint, hHint, flushCache_);
+        currentWhint = wHint;
+        currentHhint = hHint;
+        currentWidth = size.x;
+        currentHeight = size.y;
+    }
+    return new Point(currentWidth, currentHeight);
+}
+void flushCache () {
+    defaultWidth = defaultHeight = -1;
+    currentWidth = currentHeight = -1;
+}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/layout/FillLayout.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,245 @@
+/*******************************************************************************
+ * 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.layout.FillLayout;
+
+import dwt.DWT;
+import dwt.graphics.Point;
+import dwt.graphics.Rectangle;
+import dwt.widgets.Control;
+import dwt.widgets.Layout;
+import dwt.widgets.Composite;
+import dwt.widgets.Scrollable;
+import dwt.layout.FillData;
+
+import tango.text.Util;
+import tango.util.Convert;
+
+/**
+ * <code>FillLayout</code> is the simplest layout class. It lays out
+ * controls in a single row or column, forcing them to be the same size.
+ * <p>
+ * Initially, the controls will all be as tall as the tallest control,
+ * and as wide as the widest. <code>FillLayout</code> does not wrap,
+ * but you can specify margins and spacing. You might use it to
+ * lay out buttons in a task bar or tool bar, or to stack checkboxes
+ * in a <code>Group</code>. <code>FillLayout</code> can also be used
+ * when a <code>Composite</code> only has one child. For example,
+ * if a <code>Shell</code> has a single <code>Group</code> child,
+ * <code>FillLayout</code> will cause the <code>Group</code> to
+ * completely fill the <code>Shell</code> (if margins are 0).
+ * </p>
+ * <p>
+ * Example code: first a <code>FillLayout</code> is created and
+ * its type field is set, and then the layout is set into the
+ * <code>Composite</code>. Note that in a <code>FillLayout</code>,
+ * children are always the same size, and they fill all available space.
+ * <pre>
+ *      FillLayout fillLayout = new FillLayout();
+ *      fillLayout.type = DWT.VERTICAL;
+ *      shell.setLayout(fillLayout);
+ * </pre>
+ * </p>
+ */
+public final class FillLayout : Layout {
+    /**
+     * type specifies how controls will be positioned
+     * within the layout.
+     *
+     * The default value is HORIZONTAL.
+     *
+     * Possible values are: <ul>
+     *    <li>HORIZONTAL: Position the controls horizontally from left to right</li>
+     *    <li>VERTICAL: Position the controls vertically from top to bottom</li>
+     * </ul>
+     */
+    public int type = DWT.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 0.
+     *
+     * @since 3.0
+     */
+    public int spacing = 0;
+
+/**
+ * Constructs a new instance of this class.
+ */
+public this () {
+}
+
+/**
+ * Constructs a new instance of this class given the type.
+ *
+ * @param type the type of fill layout
+ *
+ * @since 2.0
+ */
+public this (int type) {
+    this.type = type;
+}
+
+protected Point computeSize (Composite composite, int wHint, int hHint, bool flushCache) {
+    Control [] children = composite.getChildren ();
+    int count = children.length;
+    int maxWidth = 0, maxHeight = 0;
+    for (int i=0; i<count; i++) {
+        Control child = children [i];
+        int w = wHint, h = hHint;
+        if (count > 0) {
+            if (type is DWT.HORIZONTAL && wHint !is DWT.DEFAULT) {
+                w = Math.max (0, (wHint - (count - 1) * spacing) / count);
+            }
+            if (type is DWT.VERTICAL && hHint !is DWT.DEFAULT) {
+                h = Math.max (0, (hHint - (count - 1) * spacing) / count);
+            }
+        }
+        Point size = computeChildSize (child, w, h, flushCache);
+        maxWidth = Math.max (maxWidth, size.x);
+        maxHeight = Math.max (maxHeight, size.y);
+    }
+    int width = 0, height = 0;
+    if (type is DWT.HORIZONTAL) {
+        width = count * maxWidth;
+        if (count !is 0) width += (count - 1) * spacing;
+        height = maxHeight;
+    } else {
+        width = maxWidth;
+        height = count * maxHeight;
+        if (count !is 0) height += (count - 1) * spacing;
+    }
+    width += marginWidth * 2;
+    height += marginHeight * 2;
+    if (wHint !is DWT.DEFAULT) width = wHint;
+    if (hHint !is DWT.DEFAULT) height = hHint;
+    return new Point (width, height);
+}
+
+Point computeChildSize (Control control, int wHint, int hHint, bool flushCache) {
+    FillData data = cast(FillData)control.getLayoutData ();
+    if (data is null) {
+        data = new FillData ();
+        control.setLayoutData (data);
+    }
+    Point size = null;
+    if (wHint is DWT.DEFAULT && hHint is DWT.DEFAULT) {
+        size = data.computeSize (control, wHint, hHint, flushCache);
+    } else {
+        // TEMPORARY CODE
+        int trimX, trimY;
+        if ( auto sa = cast(Scrollable)control ) {
+            Rectangle rect = sa.computeTrim (0, 0, 0, 0);
+            trimX = rect.width;
+            trimY = rect.height;
+        } else {
+            trimX = trimY = control.getBorderWidth () * 2;
+        }
+        int w = wHint is DWT.DEFAULT ? wHint : Math.max (0, wHint - trimX);
+        int h = hHint is DWT.DEFAULT ? hHint : Math.max (0, hHint - trimY);
+        size = data.computeSize (control, w, h, flushCache);
+    }
+    return size;
+}
+
+protected bool flushCache (Control control) {
+    Object data = control.getLayoutData();
+    if (data !is null) (cast(FillData)data).flushCache();
+    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 rect = composite.getClientArea ();
+    Control [] children = composite.getChildren ();
+    int count = children.length;
+    if (count is 0) return;
+    int width = rect.width - marginWidth * 2;
+    int height = rect.height - marginHeight * 2;
+    if (type is DWT.HORIZONTAL) {
+        width -= (count - 1) * spacing;
+        int x = rect.x + marginWidth, extra = width % count;
+        int y = rect.y + marginHeight, cellWidth = width / count;
+        for (int i=0; i<count; i++) {
+            Control child = children [i];
+            int childWidth = cellWidth;
+            if (i is 0) {
+                childWidth += extra / 2;
+            } else {
+                if (i is count - 1) childWidth += (extra + 1) / 2;
+            }
+            child.setBounds (x, y, childWidth, height);
+            x += childWidth + spacing;
+        }
+    } else {
+        height -= (count - 1) * spacing;
+        int x = rect.x + marginWidth, cellHeight = height / count;
+        int y = rect.y + marginHeight, extra = height % count;
+        for (int i=0; i<count; i++) {
+            Control child = children [i];
+            int childHeight = cellHeight;
+            if (i is 0) {
+                childHeight += extra / 2;
+            } else {
+                if (i is count - 1) childHeight += (extra + 1) / 2;
+            }
+            child.setBounds (x, y, width, childHeight);
+            y += childHeight + spacing;
+        }
+    }
+}
+
+/**
+ * Returns a string containing a concise, human-readable
+ * description of the receiver.
+ *
+ * @return a string representation of the layout
+ */
+public char[] toString () {
+    char[] string = getName () ~ " {";
+    string ~= "type="~((type is DWT.VERTICAL) ? "DWT.VERTICAL" : "DWT.HORIZONTAL")~" ";
+    if (marginWidth !is 0) string ~= "marginWidth="~to!(char[])(marginWidth)~" ";
+    if (marginHeight !is 0) string ~= "marginHeight="~to!(char[])(marginHeight)~" ";
+    if (spacing !is 0) string ~= "spacing="~to!(char[])(spacing)~" ";
+    string = trim( string );
+    string ~= "}";
+    return string;
+}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/layout/FormAttachment.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,306 @@
+/*******************************************************************************
+ * 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.layout.FormAttachment;
+
+import dwt.DWT;
+import dwt.widgets.Control;
+import dwt.layout.FormLayout;
+import dwt.layout.FormData;
+
+import tango.text.convert.Format;
+
+/**
+ * Instances of this class are used to define the edges of a control
+ * within a <code>FormLayout</code>.
+ * <p>
+ * <code>FormAttachments</code> are set into the top, bottom, left,
+ * and right fields of the <code>FormData</code> for a control.
+ * For example:
+ * <pre>
+ *      FormData data = new FormData();
+ *      data.top = new FormAttachment(0,5);
+ *      data.bottom = new FormAttachment(100,-5);
+ *      data.left = new FormAttachment(0,5);
+ *      data.right = new FormAttachment(100,-5);
+ *      button.setLayoutData(data);
+ * </pre>
+ * </p>
+ * <p>
+ * A <code>FormAttachment</code> defines where to attach the side of
+ * a control by using the equation, y = ax + b. The "a" term represents
+ * a fraction of the parent composite's width (from the left) or height
+ * (from the top). It can be defined using a numerator and denominator,
+ * or just a percentage value. If a percentage is used, the denominator
+ * is set to 100. The "b" term in the equation represents an offset, in
+ * pixels, from the attachment position. For example:
+ * <pre>
+ *      FormAttachment attach = new FormAttachment (20, -5);
+ * </pre>
+ * specifies that the side to which the <code>FormAttachment</code>
+ * object belongs will lie at 20% of the parent composite, minus 5 pixels.
+ * </p>
+ * <p>
+ * Control sides can also be attached to another control.
+ * For example:
+ * <pre>
+ *      FormAttachment attach = new FormAttachment (button, 10);
+ * </pre>
+ * specifies that the side to which the <code>FormAttachment</code>
+ * object belongs will lie in the same position as the adjacent side of
+ * the <code>button</code> control, plus 10 pixels. The control side can
+ * also be attached to the opposite side of the specified control.
+ * For example:
+ * <pre>
+ *      FormData data = new FormData ();
+ *      data.left = new FormAttachment (button, 0, DWT.LEFT);
+ * </pre>
+ * specifies that the left side of the control will lie in the same position
+ * as the left side of the <code>button</code> control. The control can also
+ * be attached in a position that will center the control on the specified
+ * control. For example:
+ * <pre>
+ *      data.left = new FormAttachment (button, 0, DWT.CENTER);
+ * </pre>
+ * specifies that the left side of the control will be positioned so that it is
+ * centered between the left and right sides of the <code>button</code> control.
+ * If the alignment is not specified, the default is to attach to the adjacent side.
+ * </p>
+ *
+ * @see FormLayout
+ * @see FormData
+ *
+ * @since 2.0
+ */
+public final class FormAttachment {
+    /**
+     * numerator specifies the numerator of the "a" term in the
+     * equation, y = ax + b, which defines the attachment.
+     */
+    public int numerator;
+
+    /**
+     * denominator specifies the denominator of the "a" term in the
+     * equation, y = ax + b, which defines the attachment.
+     *
+     * The default value is 100.
+     */
+    public int denominator = 100;
+
+    /**
+     * offset specifies the offset, in pixels, of the control side
+     * from the attachment position.
+     * If the offset is positive, then the control side is offset
+     * to the right of or below the attachment position. If it is
+     * negative, then the control side is offset to the left of or
+     * above the attachment position.
+     *
+     * This is equivalent to the "b" term in the equation y = ax + b.
+     * The default value is 0.
+     */
+    public int offset;
+
+    /**
+     * control specifies the control to which the control side is
+     * attached.
+     */
+    public Control control;
+
+    /**
+     * alignment specifies the alignment of the control side that is
+     * attached to a control.
+     * <p>
+     * For top and bottom attachments, TOP, BOTTOM and CENTER are used. For left
+     * and right attachments, LEFT, RIGHT and CENTER are used. If any other case
+     * occurs, the default will be used instead.
+     * </p>
+     *
+     * <br>Possible values are: <ul>
+     *    <li>TOP: Attach the side to the top side of the specified control.</li>
+     *    <li>BOTTOM : Attach the side to the bottom side of the specified control.</li>
+     *    <li>LEFT: Attach the side to the left side of the specified control.</li>
+     *    <li>RIGHT: Attach the side to the right side of the specified control.</li>
+     *    <li>CENTER: Attach the side at a position which will center the control on the specified control.</li>
+     *    <li>DEFAULT: Attach the side to the adjacent side of the specified control.</li>
+     * </ul>
+     */
+    public int alignment;
+
+/**
+ * Constructs a new instance of this class.
+ * Since no numerator, denominator or offset is specified,
+ * the attachment is treated as a percentage of the form.
+ * The numerator is zero, the denominator is 100 and the
+ * offset is zero.
+ *
+ * @since 3.2
+ */
+public this () {
+}
+
+/**
+ * Constructs a new instance of this class given a numerator
+ * Since no denominator or offset is specified, the default
+ * is to treat the numerator as a percentage of the form, with a
+ * denominator of 100. The offset is zero.
+ *
+ * @param numerator the percentage of the position
+ *
+ * @since 3.0
+ */
+public this (int numerator) {
+    this (numerator, 100, 0);
+}
+
+/**
+ * Constructs a new instance of this class given a numerator
+ * and an offset. Since no denominator is specified, the default
+ * is to treat the numerator as a percentage of the form, with a
+ * denominator of 100.
+ *
+ * @param numerator the percentage of the position
+ * @param offset the offset of the side from the position
+ */
+public this (int numerator, int offset) {
+    this (numerator, 100, offset);
+}
+
+/**
+ * Constructs a new instance of this class given a numerator
+ * and denominator and an offset. The position of the side is
+ * given by the fraction of the form defined by the numerator
+ * and denominator.
+ *
+ * @param numerator the numerator of the position
+ * @param denominator the denominator of the position
+ * @param offset the offset of the side from the position
+ */
+public this (int numerator, int denominator, int offset) {
+    if (denominator == 0) DWT.error (DWT.ERROR_CANNOT_BE_ZERO);
+    this.numerator = numerator;
+    this.denominator = denominator;
+    this.offset = offset;
+}
+
+/**
+ * Constructs a new instance of this class given a control.
+ * Since no alignment is specified, the default alignment is
+ * to attach the side to the adjacent side of the specified
+ * control. Since no offset is specified, an offset of 0 is
+ * used.
+ *
+ * @param control the control the side is attached to
+ */
+public this (Control control) {
+    this (control, 0, DWT.DEFAULT);
+}
+
+/**
+ * Constructs a new instance of this class given a control
+ * and an offset. Since no alignment is specified, the default
+ * alignment is to attach the side to the adjacent side of the
+ * specified control.
+ *
+ * @param control the control the side is attached to
+ * @param offset the offset of the side from the control
+ */
+public this (Control control, int offset) {
+    this (control, offset, DWT.DEFAULT);
+}
+
+/**
+ * Constructs a new instance of this class given a control,
+ * an offset and an alignment.
+ *
+ * @param control the control the side is attached to
+ * @param offset the offset of the side from the control
+ * @param alignment the alignment of the side to the control it is attached to
+ */
+public this (Control control, int offset, int alignment) {
+    this.control = control;
+    this.offset = offset;
+    this.alignment = alignment;
+}
+
+FormAttachment divide (int value) {
+    return new FormAttachment (numerator, denominator * value, offset / value);
+}
+
+int gcd (int m, int n) {
+    int temp;
+    m = Math.abs (m);
+    n = Math.abs (n);
+    if (m < n) {
+        temp = m;
+        m = n;
+        n = temp;
+    }
+    while (n != 0){
+        temp = m;
+        m = n;
+        n = temp % n;
+    }
+    return m;
+}
+
+FormAttachment minus (FormAttachment attachment) {
+    FormAttachment solution = new FormAttachment ();
+    solution.numerator = numerator * attachment.denominator - denominator * attachment.numerator;
+    solution.denominator = denominator * attachment.denominator;
+    int gcd = gcd (solution.denominator, solution.numerator);
+    solution.numerator = solution.numerator / gcd;
+    solution.denominator = solution.denominator / gcd;
+    solution.offset = offset - attachment.offset;
+    return solution;
+}
+
+FormAttachment minus (int value) {
+    return new FormAttachment (numerator, denominator, offset - value);
+}
+
+FormAttachment plus (FormAttachment attachment) {
+    FormAttachment solution = new FormAttachment ();
+    solution.numerator = numerator * attachment.denominator + denominator * attachment.numerator;
+    solution.denominator = denominator * attachment.denominator;
+    int gcd = gcd (solution.denominator, solution.numerator);
+    solution.numerator = solution.numerator / gcd;
+    solution.denominator = solution.denominator / gcd;
+    solution.offset = offset + attachment.offset;
+    return solution;
+}
+
+FormAttachment plus (int value) {
+    return new FormAttachment (numerator, denominator, offset + value);
+}
+
+int solveX (int value) {
+    if (denominator == 0) DWT.error (DWT.ERROR_CANNOT_BE_ZERO);
+    return ((numerator * value) / denominator) + offset;
+}
+
+int solveY (int value) {
+    if (numerator == 0) DWT.error (DWT.ERROR_CANNOT_BE_ZERO);
+    return (value - offset) * denominator / numerator;
+}
+
+/**
+ * Returns a string containing a concise, human-readable
+ * description of the receiver.
+ *
+ * @return a string representation of the FormAttachment
+ */
+public char[] toString () {
+    char[] string = control != null ? control.toString () : Format( "{}/{}", numerator, denominator );
+    return Format("{{y = ({})x + {}}", string, ( offset >= 0 ? Format(")x + {}", offset ) : Format( ")x - {}", -offset)));
+}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/layout/FormData.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,350 @@
+/*******************************************************************************
+ * 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.layout.FormData;
+
+
+import dwt.DWT;
+import dwt.graphics.Point;
+import dwt.widgets.Control;
+import dwt.layout.FormAttachment;
+import tango.text.Util;
+
+import tango.text.Util;
+import tango.util.Convert;
+
+/**
+ * Instances of this class are used to define the attachments
+ * of a control in a <code>FormLayout</code>.
+ * <p>
+ * To set a <code>FormData</code> object into a control, you use the
+ * <code>setLayoutData ()</code> method. To define attachments for the
+ * <code>FormData</code>, set the fields directly, like this:
+ * <pre>
+ *      FormData data = new FormData();
+ *      data.left = new FormAttachment(0,5);
+ *      data.right = new FormAttachment(100,-5);
+ *      button.setLayoutData(formData);
+ * </pre>
+ * </p>
+ * <p>
+ * <code>FormData</code> contains the <code>FormAttachments</code> for
+ * each edge of the control that the <code>FormLayout</code> uses to
+ * determine the size and position of the control. <code>FormData</code>
+ * objects also allow you to set the width and height of controls within
+ * a <code>FormLayout</code>.
+ * </p>
+ *
+ * @see FormLayout
+ * @see FormAttachment
+ *
+ * @since 2.0
+ */
+public final class FormData {
+    /**
+     * width specifies the preferred 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 DWT.DEFAULT.
+     *
+     * @see Control#computeSize(int, int, bool)
+     */
+    public int width = DWT.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 DWT.DEFAULT.
+     *
+     * @see Control#computeSize(int, int, bool)
+     */
+    public int height = DWT.DEFAULT;
+    /**
+     * left specifies the attachment of the left side of
+     * the control.
+     */
+    public FormAttachment left;
+    /**
+     * right specifies the attachment of the right side of
+     * the control.
+     */
+    public FormAttachment right;
+    /**
+     * top specifies the attachment of the top of the control.
+     */
+    public FormAttachment top;
+    /**
+     * bottom specifies the attachment of the bottom of the
+     * control.
+     */
+    public FormAttachment bottom;
+
+    int cacheWidth = -1, cacheHeight = -1;
+    int defaultWhint, defaultHhint, defaultWidth = -1, defaultHeight = -1;
+    int currentWhint, currentHhint, currentWidth = -1, currentHeight = -1;
+    FormAttachment cacheLeft, cacheRight, cacheTop, cacheBottom;
+    bool isVisited, needed;
+
+/**
+ * Constructs a new instance of FormData using
+ * default values.
+ */
+public this () {
+}
+
+/**
+ * Constructs a new instance of FormData according to the parameters.
+ * A value of DWT.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;
+}
+
+void computeSize (Control control, int wHint, int hHint, bool flushCache_) {
+    if (cacheWidth !is -1 && cacheHeight !is -1) return;
+    if (wHint is this.width && hHint is this.height) {
+        if (defaultWidth is -1 || defaultHeight is -1 || wHint !is defaultWhint || hHint !is defaultHhint) {
+            Point size =  control.computeSize (wHint, hHint, flushCache_);
+            defaultWhint = wHint;
+            defaultHhint = hHint;
+            defaultWidth = size.x;
+            defaultHeight = size.y;
+        }
+        cacheWidth = defaultWidth;
+        cacheHeight = defaultHeight;
+        return;
+    }
+    if (currentWidth is -1 || currentHeight is -1 || wHint !is currentWhint || hHint !is currentHhint) {
+        Point size =  control.computeSize (wHint, hHint, flushCache_);
+        currentWhint = wHint;
+        currentHhint = hHint;
+        currentWidth = size.x;
+        currentHeight = size.y;
+    }
+    cacheWidth = currentWidth;
+    cacheHeight = currentHeight;
+}
+
+void flushCache () {
+    cacheWidth = cacheHeight = -1;
+    defaultHeight = defaultWidth = -1;
+    currentHeight = currentWidth = -1;
+}
+
+int getWidth (Control control, bool flushCache) {
+    needed = true;
+    computeSize (control, width, height, flushCache);
+    return cacheWidth;
+}
+
+int getHeight (Control control, bool flushCache) {
+    computeSize (control, width, height, flushCache);
+    return cacheHeight;
+}
+
+FormAttachment getBottomAttachment (Control control, int spacing, bool flushCache) {
+    if (cacheBottom !is null) return cacheBottom;
+    if (isVisited) return cacheBottom = new FormAttachment (0, getHeight (control, flushCache));
+    if (bottom is null) {
+        if (top is null) return cacheBottom = new FormAttachment (0, getHeight (control, flushCache));
+        return cacheBottom = getTopAttachment (control, spacing, flushCache).plus (getHeight (control, flushCache));
+    }
+    Control bottomControl = bottom.control;
+    if (bottomControl !is null) {
+        if (bottomControl.isDisposed ()) {
+            bottom.control = bottomControl = null;
+        } else {
+            if (bottomControl.getParent () !is control.getParent ()) {
+                bottomControl = null;
+            }
+        }
+    }
+    if (bottomControl is null) return cacheBottom = bottom;
+    isVisited = true;
+    FormData bottomData = cast(FormData) bottomControl.getLayoutData ();
+    FormAttachment bottomAttachment = bottomData.getBottomAttachment (bottomControl, spacing, flushCache);
+    switch (bottom.alignment) {
+        case DWT.BOTTOM:
+            cacheBottom = bottomAttachment.plus (bottom.offset);
+            break;
+        case DWT.CENTER: {
+            FormAttachment topAttachment = bottomData.getTopAttachment (bottomControl, spacing, flushCache);
+            FormAttachment bottomHeight = bottomAttachment.minus (topAttachment);
+            cacheBottom = bottomAttachment.minus (bottomHeight.minus (getHeight (control, flushCache)).divide (2));
+            break;
+        }
+        default: {
+            FormAttachment topAttachment = bottomData.getTopAttachment (bottomControl, spacing, flushCache);
+            cacheBottom = topAttachment.plus (bottom.offset - spacing);
+            break;
+        }
+    }
+    isVisited = false;
+    return cacheBottom;
+}
+
+FormAttachment getLeftAttachment (Control control, int spacing, bool flushCache) {
+    if (cacheLeft !is null) return cacheLeft;
+    if (isVisited) return cacheLeft = new FormAttachment (0, 0);
+    if (left is null) {
+        if (right is null) return cacheLeft = new FormAttachment (0, 0);
+        return cacheLeft = getRightAttachment (control, spacing, flushCache).minus (getWidth (control, flushCache));
+    }
+    Control leftControl = left.control;
+    if (leftControl !is null) {
+        if (leftControl.isDisposed ()) {
+            left.control = leftControl = null;
+        } else {
+            if (leftControl.getParent () !is control.getParent ()) {
+                leftControl = null;
+            }
+        }
+    }
+    if (leftControl is null) return cacheLeft = left;
+    isVisited = true;
+    FormData leftData = cast(FormData) leftControl.getLayoutData ();
+    FormAttachment leftAttachment = leftData.getLeftAttachment (leftControl, spacing, flushCache);
+    switch (left.alignment) {
+        case DWT.LEFT:
+            cacheLeft = leftAttachment.plus (left.offset);
+            break;
+        case DWT.CENTER: {
+            FormAttachment rightAttachment = leftData.getRightAttachment (leftControl, spacing, flushCache);
+            FormAttachment leftWidth = rightAttachment.minus (leftAttachment);
+            cacheLeft = leftAttachment.plus (leftWidth.minus (getWidth (control, flushCache)).divide (2));
+            break;
+        }
+        default: {
+            FormAttachment rightAttachment = leftData.getRightAttachment (leftControl, spacing, flushCache);
+            cacheLeft = rightAttachment.plus (left.offset + spacing);
+        }
+    }
+    isVisited = false;
+    return cacheLeft;
+}
+
+char[] getName () {
+    char[] string = this.classinfo.name;
+    int index = locatePrior( string, '.');
+    if (index is string.length ) return string;
+    return string[ index + 1 .. string.length ];
+}
+
+FormAttachment getRightAttachment (Control control, int spacing, bool flushCache) {
+    if (cacheRight !is null) return cacheRight;
+    if (isVisited) return cacheRight = new FormAttachment (0, getWidth (control, flushCache));
+    if (right is null) {
+        if (left is null) return cacheRight = new FormAttachment (0, getWidth (control, flushCache));
+        return cacheRight = getLeftAttachment (control, spacing, flushCache).plus (getWidth (control, flushCache));
+    }
+    Control rightControl = right.control;
+    if (rightControl !is null) {
+        if (rightControl.isDisposed ()) {
+            right.control = rightControl = null;
+        } else {
+            if (rightControl.getParent () !is control.getParent ()) {
+                rightControl = null;
+            }
+        }
+    }
+    if (rightControl is null) return cacheRight = right;
+    isVisited = true;
+    FormData rightData = cast(FormData) rightControl.getLayoutData ();
+    FormAttachment rightAttachment = rightData.getRightAttachment (rightControl, spacing, flushCache);
+    switch (right.alignment) {
+        case DWT.RIGHT:
+            cacheRight = rightAttachment.plus (right.offset);
+            break;
+        case DWT.CENTER: {
+            FormAttachment leftAttachment = rightData.getLeftAttachment (rightControl, spacing, flushCache);
+            FormAttachment rightWidth = rightAttachment.minus (leftAttachment);
+            cacheRight = rightAttachment.minus (rightWidth.minus (getWidth (control, flushCache)).divide (2));
+            break;
+        }
+        default: {
+            FormAttachment leftAttachment = rightData.getLeftAttachment (rightControl, spacing, flushCache);
+            cacheRight = leftAttachment.plus (right.offset - spacing);
+            break;
+        }
+    }
+    isVisited = false;
+    return cacheRight;
+}
+
+FormAttachment getTopAttachment (Control control, int spacing, bool flushCache) {
+    if (cacheTop !is null) return cacheTop;
+    if (isVisited) return cacheTop = new FormAttachment (0, 0);
+    if (top is null) {
+        if (bottom is null) return cacheTop = new FormAttachment (0, 0);
+        return cacheTop = getBottomAttachment (control, spacing, flushCache).minus (getHeight (control, flushCache));
+    }
+    Control topControl = top.control;
+    if (topControl !is null) {
+        if (topControl.isDisposed ()) {
+            top.control = topControl = null;
+        } else {
+            if (topControl.getParent () !is control.getParent ()) {
+                topControl = null;
+            }
+        }
+    }
+    if (topControl is null) return cacheTop = top;
+    isVisited = true;
+    FormData topData = cast(FormData) topControl.getLayoutData ();
+    FormAttachment topAttachment = topData.getTopAttachment (topControl, spacing, flushCache);
+    switch (top.alignment) {
+        case DWT.TOP:
+            cacheTop = topAttachment.plus (top.offset);
+            break;
+        case DWT.CENTER: {
+            FormAttachment bottomAttachment = topData.getBottomAttachment (topControl, spacing, flushCache);
+            FormAttachment topHeight = bottomAttachment.minus (topAttachment);
+            cacheTop = topAttachment.plus (topHeight.minus (getHeight (control, flushCache)).divide (2));
+            break;
+        }
+        default: {
+            FormAttachment bottomAttachment = topData.getBottomAttachment (topControl, spacing, flushCache);
+            cacheTop = bottomAttachment.plus (top.offset + spacing);
+            break;
+        }
+    }
+    isVisited = false;
+    return cacheTop;
+}
+
+/**
+ * Returns a string containing a concise, human-readable
+ * description of the receiver.
+ *
+ * @return a string representation of the FormData object
+ */
+public char[] toString () {
+    char[] string = getName()~" {";
+    if (width !is DWT.DEFAULT) string ~= "width="~to!(char[])(width)~" ";
+    if (height !is DWT.DEFAULT) string ~= "height="~to!(char[])(height)~" ";
+    if (left !is null) string ~= "left="~to!(char[])(left)~" ";
+    if (right !is null) string ~= "right="~to!(char[])(right)~" ";
+    if (top !is null) string ~= "top="~to!(char[])(top)~" ";
+    if (bottom !is null) string ~= "bottom="~to!(char[])(bottom)~" ";
+    string = trim( string );
+    string ~= "}";
+    return string;
+}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/layout/FormLayout.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,395 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.layout.FormLayout;
+
+import dwt.layout.FormAttachment;
+import dwt.layout.FormData;
+import dwt.DWT;
+import dwt.graphics.Point;
+import dwt.graphics.Rectangle;
+import dwt.widgets.Control;
+import dwt.widgets.Layout;
+import dwt.widgets.Composite;
+import dwt.widgets.Scrollable;
+
+import tango.text.Util;
+import tango.util.Convert;
+import Math = tango.math.Math;
+
+/**
+ * Instances of this class control the position and size of the
+ * children of a composite control by using <code>FormAttachments</code>
+ * to optionally configure the left, top, right and bottom edges of
+ * each child.
+ * <p>
+ * The following example code creates a <code>FormLayout</code> and then sets
+ * it into a <code>Shell</code>:
+ * <pre>
+ *      Display display = new Display ();
+ *      Shell shell = new Shell(display);
+ *      FormLayout layout = new FormLayout();
+ *      layout.marginWidth = 3;
+ *      layout.marginHeight = 3;
+ *      shell.setLayout(layout);
+ * </pre>
+ * </p>
+ * <p>
+ * To use a <code>FormLayout</code>, create a <code>FormData</code> with
+ * <code>FormAttachment</code> for each child of <code>Composite</code>.
+ * The following example code attaches <code>button1</code> to the top
+ * and left edge of the composite and <code>button2</code> to the right
+ * edge of <code>button1</code> and the top and right edges of the
+ * composite:
+ * <pre>
+ *      FormData data1 = new FormData();
+ *      data1.left = new FormAttachment(0, 0);
+ *      data1.top = new FormAttachment(0, 0);
+ *      button1.setLayoutData(data1);
+ *      FormData data2 = new FormData();
+ *      data2.left = new FormAttachment(button1);
+ *      data2.top = new FormAttachment(0, 0);
+ *      data2.right = new FormAttachment(100, 0);
+ *      button2.setLayoutData(data2);
+ * </pre>
+ * </p>
+ * <p>
+ * Each side of a child control can be attached to a position in the parent
+ * composite, or to other controls within the <code>Composite</code> by
+ * creating instances of <code>FormAttachment</code> and setting them into
+ * the top, bottom, left, and right fields of the child's <code>FormData</code>.
+ * </p>
+ * <p>
+ * If a side is not given an attachment, it is defined as not being attached
+ * to anything, causing the child to remain at its preferred size.  If a child
+ * is given no attachment on either the left or the right or top or bottom, it is
+ * automatically attached to the left and top of the composite respectively.
+ * The following code positions <code>button1</code> and <code>button2</code>
+ * but relies on default attachments:
+ * <pre>
+ *      FormData data2 = new FormData();
+ *      data2.left = new FormAttachment(button1);
+ *      data2.right = new FormAttachment(100, 0);
+ *      button2.setLayoutData(data2);
+ * </pre>
+ * </p>
+ * <p>
+ * IMPORTANT: Do not define circular attachments.  For example, do not attach
+ * the right edge of <code>button1</code> to the left edge of <code>button2</code>
+ * and then attach the left edge of <code>button2</code> to the right edge of
+ * <code>button1</code>.  This will over constrain the layout, causing undefined
+ * behavior.  The algorithm will terminate, but the results are undefined.
+ * </p>
+ *
+ * @see FormData
+ * @see FormAttachment
+ *
+ * @since 2.0
+ *
+ */
+public final class FormLayout : Layout {
+
+    /**
+     * 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.
+     */
+    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.
+     */
+    public int marginHeight = 0;
+
+
+    /**
+     * marginLeft specifies the number of pixels of horizontal margin
+     * that will be placed along the left edge of the layout.
+     *
+     * The default value is 0.
+     *
+     * @since 3.1
+     */
+    public int marginLeft = 0;
+
+    /**
+     * marginTop specifies the number of pixels of vertical margin
+     * that will be placed along the top edge of the layout.
+     *
+     * The default value is 0.
+     *
+     * @since 3.1
+     */
+    public int marginTop = 0;
+
+    /**
+     * marginRight specifies the number of pixels of horizontal margin
+     * that will be placed along the right edge of the layout.
+     *
+     * The default value is 0.
+     *
+     * @since 3.1
+     */
+    public int marginRight = 0;
+
+    /**
+     * marginBottom specifies the number of pixels of vertical margin
+     * that will be placed along the bottom edge of the layout.
+     *
+     * The default value is 0.
+     *
+     * @since 3.1
+     */
+    public int marginBottom = 0;
+
+    /**
+     * spacing specifies the number of pixels between the edge of one control
+     * and the edge of its neighbouring control.
+     *
+     * The default value is 0.
+     *
+     * @since 3.0
+     */
+    public int spacing = 0;
+
+/**
+ * Constructs a new instance of this class.
+ */
+public this () {
+}
+
+/*
+ * Computes the preferred height of the form with
+ * respect to the preferred height of the control.
+ *
+ * Given that the equations for top (T) and bottom (B)
+ * of the control in terms of the height of the form (X)
+ * are:
+ *      T = AX + B
+ *      B = CX + D
+ *
+ * The equation for the height of the control (H)
+ * is bottom (B) minus top (T) or (H = B - T) or:
+ *
+ *      H = (CX + D) - (AX + B)
+ *
+ * Solving for (X), the height of the form, we get:
+ *
+ *      X = (H + B - D) / (C - A)
+ *
+ * When (A = C), (C - A = 0) and the equation has no
+ * solution for X.  This is a special case meaning that
+ * the control does not constrain the height of the
+ * form.  In this case, we need to arbitrarily define
+ * the height of the form (X):
+ *
+ * Case 1: A = C, A = 0, C = 0
+ *
+ *      Let X = D, the distance from the top of the form
+ *      to the bottom edge of the control.  In this case,
+ *      the control was attached to the top of the form
+ *      and the form needs to be large enough to show the
+ *      bottom edge of the control.
+ *
+ * Case 2: A = C, A = 1, C = 1
+ *
+ *      Let X = -B, the distance from the bottom of the
+ *      form to the top edge of the control.  In this case,
+ *      the control was attached to the bottom of the form
+ *      and the only way that the control would be visible
+ *      is if the offset is negative.  If the offset is
+ *      positive, there is no possible height for the form
+ *      that will show the control as it will always be
+ *      below the bottom edge of the form.
+ *
+ * Case 3: A = C, A !is 0, C !is 0 and A !is 1, C !is 0
+ *
+ *      Let X = D / (1 - C), the distance from the top of the
+ *      form to the bottom edge of the control.  In this case,
+ *      since C is not 0 or 1, it must be a fraction, U / V.
+ *      The offset D is the distance from CX to the bottom edge
+ *      of the control.  This represents a fraction of the form
+ *      (1 - C)X. Since the height of a fraction of the form is
+ *      known, the height of the entire form can be found by setting
+ *      (1 - C)X = D.  We solve this equation for X in terms of U
+ *      and V, giving us X = (U * D) / (U - V). Similarly, if the
+ *      offset D is negative, the control is positioned above CX.
+ *      The offset -B is the distance from the top edge of the control
+ *      to CX. We can find the height of the entire form by setting
+ *      CX = -B. Solving in terms of U and V gives us X = (-B * V) / U.
+ */
+int computeHeight (Control control, FormData data, bool flushCache) {
+    FormAttachment top = data.getTopAttachment (control, spacing, flushCache);
+    FormAttachment bottom = data.getBottomAttachment (control, spacing, flushCache);
+    FormAttachment height = bottom.minus (top);
+    if (height.numerator is 0) {
+        if (bottom.numerator is 0) return bottom.offset;
+        if (bottom.numerator is bottom.denominator) return -top.offset;
+        if (bottom.offset <= 0) {
+            return -top.offset * top.denominator / bottom.numerator;
+        }
+        int divider = bottom.denominator - bottom.numerator;
+        return bottom.denominator * bottom.offset / divider;
+    }
+    return height.solveY (data.getHeight (control, flushCache));
+}
+
+protected Point computeSize (Composite composite, int wHint, int hHint, bool flushCache) {
+    Point size = layout (composite, false, 0, 0, wHint, hHint, flushCache);
+    if (wHint !is DWT.DEFAULT) size.x = wHint;
+    if (hHint !is DWT.DEFAULT) size.y = hHint;
+    return size;
+}
+
+protected bool flushCache (Control control) {
+    Object data = control.getLayoutData ();
+    if (data !is null) (cast(FormData) data).flushCache ();
+    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 ];
+}
+
+/*
+ * Computes the preferred height of the form with
+ * respect to the preferred height of the control.
+ */
+int computeWidth (Control control, FormData data, bool flushCache) {
+    FormAttachment left = data.getLeftAttachment (control, spacing, flushCache);
+    FormAttachment right = data.getRightAttachment (control, spacing, flushCache);
+    FormAttachment width = right.minus (left);
+    if (width.numerator is 0) {
+        if (right.numerator is 0) return right.offset;
+        if (right.numerator is right.denominator) return -left.offset;
+        if (right.offset <= 0) {
+            return -left.offset * left.denominator / left.numerator;
+        }
+        int divider = right.denominator - right.numerator;
+        return right.denominator * right.offset / divider;
+    }
+    return width.solveY (data.getWidth (control, flushCache));
+}
+
+protected void layout (Composite composite, bool flushCache) {
+    Rectangle rect = composite.getClientArea ();
+    int x = rect.x + marginLeft + marginWidth;
+    int y = rect.y + marginTop + marginHeight;
+    int width = Math.max (0, rect.width - marginLeft - 2 * marginWidth - marginRight);
+    int height = Math.max (0, rect.height - marginTop - 2 * marginHeight - marginBottom);
+    layout (composite, true, x, y, width, height, flushCache);
+}
+
+Point layout (Composite composite, bool move, int x, int y, int width, int height, bool flushCache) {
+    Control [] children = composite.getChildren ();
+    for (int i=0; i<children.length; i++) {
+        Control child = children [i];
+        FormData data = cast(FormData) child.getLayoutData ();
+        if (data is null) child.setLayoutData (data = new FormData ());
+        if (flushCache) data.flushCache ();
+        data.cacheLeft = data.cacheRight = data.cacheTop = data.cacheBottom = null;
+    }
+    bool [] flush = null;
+    Rectangle [] bounds = null;
+    int w = 0, h = 0;
+    for (int i=0; i<children.length; i++) {
+        Control child = children [i];
+        FormData data = cast(FormData) child.getLayoutData ();
+        if (width !is DWT.DEFAULT) {
+            data.needed = false;
+            FormAttachment left = data.getLeftAttachment (child, spacing, flushCache);
+            FormAttachment right = data.getRightAttachment (child, spacing, flushCache);
+            int x1 = left.solveX (width), x2 = right.solveX (width);
+            if (data.height is DWT.DEFAULT && !data.needed) {
+                int trim = 0;
+                //TEMPORARY CODE
+                if ( auto sa = cast(Scrollable)child) {
+                    Rectangle rect = sa.computeTrim (0, 0, 0, 0);
+                    trim = rect.width;
+                } else {
+                    trim = child.getBorderWidth () * 2;
+                }
+                data.cacheWidth = data.cacheHeight = -1;
+                int currentWidth = Math.max (0, x2 - x1 - trim);
+                data.computeSize (child, currentWidth, data.height, flushCache);
+                if (flush is null) flush = new bool [children.length];
+                flush [i] = true;
+            }
+            w = Math.max (x2, w);
+            if (move) {
+                if (bounds is null) bounds = new Rectangle [children.length];
+                bounds [i] = new Rectangle (0, 0, 0, 0);
+                bounds [i].x = x + x1;
+                bounds [i].width = x2 - x1;
+            }
+        } else {
+            w = Math.max (computeWidth (child, data, flushCache), w);
+        }
+    }
+    for (int i=0; i<children.length; i++) {
+        Control child = children [i];
+        FormData data = cast(FormData) child.getLayoutData ();
+        if (height !is DWT.DEFAULT) {
+            int y1 = data.getTopAttachment (child, spacing, flushCache).solveX (height);
+            int y2 = data.getBottomAttachment (child, spacing, flushCache).solveX (height);
+            h = Math.max (y2, h);
+            if (move) {
+                bounds [i].y = y + y1;
+                bounds [i].height = y2 - y1;
+            }
+        } else {
+            h = Math.max (computeHeight (child, data, flushCache), h);
+        }
+    }
+    for (int i=0; i<children.length; i++) {
+        Control child = children [i];
+        FormData data = cast(FormData) child.getLayoutData ();
+        if (flush !is null && flush [i]) data.cacheWidth = data.cacheHeight = -1;
+        data.cacheLeft = data.cacheRight = data.cacheTop = data.cacheBottom = null;
+    }
+    if (move) {
+        for (int i=0; i<children.length; i++) {
+            children [i].setBounds (bounds [i]);
+        }
+    }
+    w += marginLeft + marginWidth * 2 + marginRight;
+    h += marginTop + marginHeight * 2 + marginBottom;
+    return new Point (w, h);
+}
+
+/**
+ * Returns a string containing a concise, human-readable
+ * description of the receiver.
+ *
+ * @return a string representation of the layout
+ */
+public char[] toString () {
+    char[] string =  getName ()~" {";
+    if (marginWidth !is 0) string ~= "marginWidth="~to!(char[])(marginWidth)~" ";
+    if (marginHeight !is 0) string ~= "marginHeight="~to!(char[])(marginHeight)~" ";
+    if (marginLeft !is 0) string ~= "marginLeft="~to!(char[])(marginLeft)~" ";
+    if (marginRight !is 0) string ~= "marginRight="~to!(char[])(marginRight)~" ";
+    if (marginTop !is 0) string ~= "marginTop="~to!(char[])(marginTop)~" ";
+    if (marginBottom !is 0) string ~= "marginBottom="~to!(char[])(marginBottom)~" ";
+    if (spacing !is 0) string ~= "spacing="~to!(char[])(spacing)~" ";
+    string = trim( string );
+    string ~= "}";
+    return string;
+}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/layout/GridData.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,562 @@
+/*******************************************************************************
+ * 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.layout.GridData;
+
+import dwt.DWT;
+import dwt.graphics.Point;
+import dwt.widgets.Control;
+
+import tango.text.Util;
+import tango.util.Convert;
+
+/**
+ * <code>GridData</code> is the layout data object associated with
+ * <code>GridLayout</code>. To set a <code>GridData</code> object into a
+ * control, you use the <code>Control.setLayoutData(Object)</code> method.
+ * <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;
+ *      button1.setLayoutData(gridData);
+ * </pre>
+ * The second is to take advantage of convenience style bits defined
+ * by <code>GridData</code>:
+ * <pre>
+ *      button1.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL));
+ * </pre>
+ * </p>
+ * <p>
+ * NOTE: Do not reuse <code>GridData</code> objects. Every control in a
+ * <code>Composite</code> that is managed by a <code>GridLayout</code>
+ * must have a unique <code>GridData</code> object. If the layout data
+ * for a control in a <code>GridLayout</code> is null at layout time,
+ * a unique <code>GridData</code> object is created for it.
+ * </p>
+ *
+ * @see GridLayout
+ * @see Control#setLayoutData
+ */
+public final class GridData {
+    /**
+     * verticalAlignment specifies how controls will be positioned
+     * vertically within a cell.
+     *
+     * The default value is CENTER.
+     *
+     * Possible values are: <ul>
+     *    <li>DWT.BEGINNING (or DWT.TOP): Position the control at the top of the cell</li>
+     *    <li>DWT.CENTER: Position the control in the vertical center of the cell</li>
+     *    <li>DWT.END (or DWT.BOTTOM): Position the control at the bottom of the cell</li>
+     *    <li>DWT.FILL: Resize the control to fill the cell vertically</li>
+     * </ul>
+     */
+    public int verticalAlignment = CENTER;
+
+    /**
+     * horizontalAlignment specifies how controls will be positioned
+     * horizontally within a cell.
+     *
+     * The default value is BEGINNING.
+     *
+     * Possible values are: <ul>
+     *    <li>DWT.BEGINNING (or DWT.LEFT): Position the control at the left of the cell</li>
+     *    <li>DWT.CENTER: Position the control in the horizontal center of the cell</li>
+     *    <li>DWT.END (or DWT.RIGHT): Position the control at the right of the cell</li>
+     *    <li>DWT.FILL: Resize the control to fill the cell horizontally</li>
+     * </ul>
+     */
+    public int horizontalAlignment = BEGINNING;
+
+    /**
+     * widthHint specifies the preferred 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 DWT.DEFAULT.
+     *
+     * @see Control#computeSize(int, int, bool)
+     */
+    public int widthHint = DWT.DEFAULT;
+
+    /**
+     * heightHint 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 DWT.DEFAULT.
+     *
+     * @see Control#computeSize(int, int, bool)
+     */
+    public int heightHint = DWT.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;
+
+    /**
+     * verticalIndent specifies the number of pixels of indentation
+     * that will be placed along the top side of the cell.
+     *
+     * The default value is 0.
+     *
+     * @since 3.1
+     */
+    public int verticalIndent = 0;
+
+    /**
+     * horizontalSpan specifies the number of column cells that the control
+     * will take up.
+     *
+     * The default value is 1.
+     */
+    public int horizontalSpan = 1;
+
+    /**
+     * verticalSpan specifies the number of row cells that the control
+     * will take up.
+     *
+     * The default value is 1.
+     */
+    public int verticalSpan = 1;
+
+    /**
+     * <p>grabExcessHorizontalSpace specifies whether the width of the cell
+     * changes depending on the size of the parent Composite.  If
+     * grabExcessHorizontalSpace is <code>true</code>, the following rules
+     * apply to the width of the cell:</p>
+     * <ul>
+     * <li>If extra horizontal space is available in the parent, the cell will
+     * grow to be wider than its preferred width.  The new width
+     * will be "preferred width + delta" where delta is the extra
+     * horizontal space divided by the number of grabbing columns.</li>
+     * <li>If there is not enough horizontal space available in the parent, the
+     * cell will shrink until it reaches its minimum width as specified by
+     * GridData.minimumWidth. The new width will be the maximum of
+     * "minimumWidth" and "preferred width - delta", where delta is
+     * the amount of space missing divided by the number of grabbing columns.</li>
+     * <li>If the parent is packed, the cell will be its preferred width
+     * as specified by GridData.widthHint.</li>
+     * <li>If the control spans multiple columns and there are no other grabbing
+     * controls in any of the spanned columns, the last column in the span will
+     * grab the extra space.  If there is at least one other grabbing control
+     * in the span, the grabbing will be spread over the columns already
+     * marked as grabExcessHorizontalSpace.</li>
+     * </ul>
+     *
+     * <p>The default value is false.</p>
+     *
+     * @see GridData#minimumWidth
+     * @see GridData#widthHint
+     */
+    public bool grabExcessHorizontalSpace = false;
+
+    /**
+     * <p>grabExcessVerticalSpace specifies whether the height of the cell
+     * changes depending on the size of the parent Composite.  If
+     * grabExcessVerticalSpace is <code>true</code>, the following rules
+     * apply to the height of the cell:</p>
+     * <ul>
+     * <li>If extra vertical space is available in the parent, the cell will
+     * grow to be taller than its preferred height.  The new height
+     * will be "preferred height + delta" where delta is the extra
+     * vertical space divided by the number of grabbing rows.</li>
+     * <li>If there is not enough vertical space available in the parent, the
+     * cell will shrink until it reaches its minimum height as specified by
+     * GridData.minimumHeight. The new height will be the maximum of
+     * "minimumHeight" and "preferred height - delta", where delta is
+     * the amount of space missing divided by the number of grabbing rows.</li>
+     * <li>If the parent is packed, the cell will be its preferred height
+     * as specified by GridData.heightHint.</li>
+     * <li>If the control spans multiple rows and there are no other grabbing
+     * controls in any of the spanned rows, the last row in the span will
+     * grab the extra space.  If there is at least one other grabbing control
+     * in the span, the grabbing will be spread over the rows already
+     * marked as grabExcessVerticalSpace.</li>
+     * </ul>
+     *
+     * <p>The default value is false.</p>
+     *
+     * @see GridData#minimumHeight
+     * @see GridData#heightHint
+     */
+    public bool grabExcessVerticalSpace = false;
+
+    /**
+     * minimumWidth specifies the minimum width in pixels.  This value
+     * applies only if grabExcessHorizontalSpace is true. A value of
+     * DWT.DEFAULT means that the minimum width will be the result
+     * of Control.computeSize(int, int, bool) where wHint is
+     * determined by GridData.widthHint.
+     *
+     * The default value is 0.
+     *
+     * @since 3.1
+     * @see Control#computeSize(int, int, bool)
+     * @see GridData#widthHint
+     */
+    public int minimumWidth = 0;
+
+    /**
+     * minimumHeight specifies the minimum height in pixels.  This value
+     * applies only if grabExcessVerticalSpace is true.  A value of
+     * DWT.DEFAULT means that the minimum height will be the result
+     * of Control.computeSize(int, int, bool) where hHint is
+     * determined by GridData.heightHint.
+     *
+     * The default value is 0.
+     *
+     * @since 3.1
+     * @see Control#computeSize(int, int, bool)
+     * @see GridData#heightHint
+     */
+    public int minimumHeight = 0;
+
+    /**
+     * exclude informs the layout to ignore this control when sizing
+     * and positioning controls.  If this value is <code>true</code>,
+     * the size and position of the control will not be managed by the
+     * layout.  If this value is <code>false</code>, the size and
+     * position of the control will be computed and assigned.
+     *
+     * The default value is <code>false</code>.
+     *
+     * @since 3.1
+     */
+    public bool exclude = false;
+
+    /**
+     * Value for horizontalAlignment or verticalAlignment.
+     * Position the control at the top or left of the cell.
+     * Not recommended. Use DWT.BEGINNING, DWT.TOP or DWT.LEFT instead.
+     */
+    public static const int BEGINNING = DWT.BEGINNING;
+
+    /**
+     * Value for horizontalAlignment or verticalAlignment.
+     * Position the control in the vertical or horizontal center of the cell
+     * Not recommended. Use DWT.CENTER instead.
+     */
+    public static const int CENTER = 2;
+
+    /**
+     * Value for horizontalAlignment or verticalAlignment.
+     * Position the control at the bottom or right of the cell
+     * Not recommended. Use DWT.END, DWT.BOTTOM or DWT.RIGHT instead.
+     */
+    public static const int END = 3;
+
+    /**
+     * Value for horizontalAlignment or verticalAlignment.
+     * Resize the control to fill the cell horizontally or vertically.
+     * Not recommended. Use DWT.FILL instead.
+     */
+    public static const int FILL = DWT.FILL;
+
+    /**
+     * Style bit for <code>new GridData(int)</code>.
+     * Position the control at the top of the cell.
+     * Not recommended. Use
+     * <code>new GridData(int, DWT.BEGINNING, bool, bool)</code>
+     * instead.
+     */
+    public static const int VERTICAL_ALIGN_BEGINNING =  1 << 1;
+
+    /**
+     * Style bit for <code>new GridData(int)</code> to position the
+     * control in the vertical center of the cell.
+     * Not recommended. Use
+     * <code>new GridData(int, DWT.CENTER, bool, bool)</code>
+     * instead.
+     */
+    public static const int VERTICAL_ALIGN_CENTER = 1 << 2;
+
+    /**
+     * Style bit for <code>new GridData(int)</code> to position the
+     * control at the bottom of the cell.
+     * Not recommended. Use
+     * <code>new GridData(int, DWT.END, bool, bool)</code>
+     * instead.
+     */
+    public static const int VERTICAL_ALIGN_END = 1 << 3;
+
+    /**
+     * Style bit for <code>new GridData(int)</code> to resize the
+     * control to fill the cell vertically.
+     * Not recommended. Use
+     * <code>new GridData(int, DWT.FILL, bool, bool)</code>
+     * instead
+     */
+    public static const int VERTICAL_ALIGN_FILL = 1 << 4;
+
+    /**
+     * Style bit for <code>new GridData(int)</code> to position the
+     * control at the left of the cell.
+     * Not recommended. Use
+     * <code>new GridData(DWT.BEGINNING, int, bool, bool)</code>
+     * instead.
+     */
+    public static const int HORIZONTAL_ALIGN_BEGINNING =  1 << 5;
+
+    /**
+     * Style bit for <code>new GridData(int)</code> to position the
+     * control in the horizontal center of the cell.
+     * Not recommended. Use
+     * <code>new GridData(DWT.CENTER, int, bool, bool)</code>
+     * instead.
+     */
+    public static const int HORIZONTAL_ALIGN_CENTER = 1 << 6;
+
+    /**
+     * Style bit for <code>new GridData(int)</code> to position the
+     * control at the right of the cell.
+     * Not recommended. Use
+     * <code>new GridData(DWT.END, int, bool, bool)</code>
+     * instead.
+     */
+    public static const int HORIZONTAL_ALIGN_END = 1 << 7;
+
+    /**
+     * Style bit for <code>new GridData(int)</code> to resize the
+     * control to fill the cell horizontally.
+     * Not recommended. Use
+     * <code>new GridData(DWT.FILL, int, bool, bool)</code>
+     * instead.
+     */
+    public static const int HORIZONTAL_ALIGN_FILL = 1 << 8;
+
+    /**
+     * Style bit for <code>new GridData(int)</code> to resize the
+     * control to fit the remaining horizontal space.
+     * Not recommended. Use
+     * <code>new GridData(int, int, true, bool)</code>
+     * instead.
+     */
+    public static const int GRAB_HORIZONTAL = 1 << 9;
+
+    /**
+     * Style bit for <code>new GridData(int)</code> to resize the
+     * control to fit the remaining vertical space.
+     * Not recommended. Use
+     * <code>new GridData(int, int, bool, true)</code>
+     * instead.
+     */
+    public static const int GRAB_VERTICAL = 1 << 10;
+
+    /**
+     * Style bit for <code>new GridData(int)</code> to resize the
+     * control 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, DWT.FILL, bool, true)</code>
+     * instead.
+     */
+    public static const int FILL_VERTICAL = VERTICAL_ALIGN_FILL | GRAB_VERTICAL;
+
+    /**
+     * Style bit for <code>new GridData(int)</code> to resize the
+     * control 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(DWT.FILL, int, true, bool)</code>
+     * instead.
+     */
+    public static const int FILL_HORIZONTAL = HORIZONTAL_ALIGN_FILL | GRAB_HORIZONTAL;
+
+    /**
+     * Style bit for <code>new GridData(int)</code> to resize the
+     * control 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(DWT.FILL, DWT.FILL, true, true)</code>
+     * instead.
+     */
+    public static const int FILL_BOTH = FILL_VERTICAL | FILL_HORIZONTAL;
+
+    int cacheWidth = -1, cacheHeight = -1;
+    int defaultWhint, defaultHhint, defaultWidth = -1, defaultHeight = -1;
+    int currentWhint, currentHhint, currentWidth = -1, currentHeight = -1;
+
+/**
+ * Constructs a new instance of GridData using
+ * default values.
+ */
+public this () {
+}
+
+/**
+ * Constructs a new instance based on the GridData style.
+ * This constructor is not recommended.
+ *
+ * @param style the GridData style
+ */
+public this (int style) {
+    if ((style & VERTICAL_ALIGN_BEGINNING) !is 0) verticalAlignment = BEGINNING;
+    if ((style & VERTICAL_ALIGN_CENTER) !is 0) verticalAlignment = CENTER;
+    if ((style & VERTICAL_ALIGN_FILL) !is 0) verticalAlignment = FILL;
+    if ((style & VERTICAL_ALIGN_END) !is 0) verticalAlignment = END;
+    if ((style & HORIZONTAL_ALIGN_BEGINNING) !is 0) horizontalAlignment = BEGINNING;
+    if ((style & HORIZONTAL_ALIGN_CENTER) !is 0) horizontalAlignment = CENTER;
+    if ((style & HORIZONTAL_ALIGN_FILL) !is 0) horizontalAlignment = FILL;
+    if ((style & HORIZONTAL_ALIGN_END) !is 0) horizontalAlignment = END;
+    grabExcessHorizontalSpace = (style & GRAB_HORIZONTAL) !is 0;
+    grabExcessVerticalSpace = (style & GRAB_VERTICAL) !is 0;
+}
+
+/**
+ * Constructs a new instance of GridData according to the parameters.
+ *
+ * @param horizontalAlignment how control will be positioned horizontally within a cell
+ * @param verticalAlignment how control 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
+ *
+ * @since 3.0
+ */
+public this (int horizontalAlignment, int verticalAlignment, bool grabExcessHorizontalSpace, bool grabExcessVerticalSpace) {
+    this (horizontalAlignment, verticalAlignment, grabExcessHorizontalSpace, grabExcessVerticalSpace, 1, 1);
+}
+
+/**
+ * Constructs a new instance of GridData according to the parameters.
+ *
+ * @param horizontalAlignment how control will be positioned horizontally within a cell
+ * @param verticalAlignment how control 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 control will take up
+ * @param verticalSpan the number of row cells that the control will take up
+ *
+ * @since 3.0
+ */
+public this (int horizontalAlignment, int verticalAlignment, bool grabExcessHorizontalSpace, bool grabExcessVerticalSpace, int horizontalSpan, int verticalSpan) {
+    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 DWT.DEFAULT indicates that no minimum width or
+ * no minimum height is specified.
+ *
+ * @param width a minimum width for the column
+ * @param height a minimum height for the row
+ *
+ * @since 3.0
+ */
+public this (int width, int height) {
+    this.widthHint = width;
+    this.heightHint = height;
+}
+
+void computeSize (Control control, int wHint, int hHint, bool flushCache) {
+    if (cacheWidth !is -1 && cacheHeight !is -1) return;
+    if (wHint is this.widthHint && hHint is this.heightHint) {
+        if (defaultWidth is -1 || defaultHeight is -1 || wHint !is defaultWhint || hHint !is defaultHhint) {
+            Point size = control.computeSize (wHint, hHint, flushCache);
+            defaultWhint = wHint;
+            defaultHhint = hHint;
+            defaultWidth = size.x;
+            defaultHeight = size.y;
+        }
+        cacheWidth = defaultWidth;
+        cacheHeight = defaultHeight;
+        return;
+    }
+    if (currentWidth is -1 || currentHeight is -1 || wHint !is currentWhint || hHint !is currentHhint) {
+        Point size = control.computeSize (wHint, hHint, flushCache);
+        currentWhint = wHint;
+        currentHhint = hHint;
+        currentWidth = size.x;
+        currentHeight = size.y;
+    }
+    cacheWidth = currentWidth;
+    cacheHeight = currentHeight;
+}
+
+void flushCache () {
+    cacheWidth = cacheHeight = -1;
+    defaultWidth = defaultHeight = -1;
+    currentWidth = currentHeight = -1;
+}
+
+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 GridData object
+ */
+public char[] toString () {
+    char[] hAlign = "";
+    switch (horizontalAlignment) {
+        case DWT.FILL: hAlign = "DWT.FILL"; break;
+        case DWT.BEGINNING: hAlign = "DWT.BEGINNING"; break;
+        case DWT.LEFT: hAlign = "DWT.LEFT"; break;
+        case DWT.END: hAlign = "DWT.END"; break;
+        case END: hAlign = "GridData.END"; break;
+        case DWT.RIGHT: hAlign = "DWT.RIGHT"; break;
+        case DWT.CENTER: hAlign = "DWT.CENTER"; break;
+        case CENTER: hAlign = "GridData.CENTER"; break;
+        default: hAlign = "Undefined "~to!(char[])(horizontalAlignment); break;
+    }
+    char[] vAlign = "";
+    switch (verticalAlignment) {
+        case DWT.FILL: vAlign = "DWT.FILL"; break;
+        case DWT.BEGINNING: vAlign = "DWT.BEGINNING"; break;
+        case DWT.TOP: vAlign = "DWT.TOP"; break;
+        case DWT.END: vAlign = "DWT.END"; break;
+        case END: vAlign = "GridData.END"; break;
+        case DWT.BOTTOM: vAlign = "DWT.BOTTOM"; break;
+        case DWT.CENTER: vAlign = "DWT.CENTER"; break;
+        case CENTER: vAlign = "GridData.CENTER"; break;
+        default: vAlign = "Undefined "~to!(char[])(verticalAlignment); break;
+    }
+    char[] string = getName()~" {";
+    string ~= "horizontalAlignment="~to!(char[])(hAlign)~" ";
+    if (horizontalIndent !is 0) string ~= "horizontalIndent="~to!(char[])(horizontalIndent)~" ";
+    if (horizontalSpan !is 1) string ~= "horizontalSpan="~to!(char[])(horizontalSpan)~" ";
+    if (grabExcessHorizontalSpace) string ~= "grabExcessHorizontalSpace="~to!(char[])(grabExcessHorizontalSpace)~" ";
+    if (widthHint !is DWT.DEFAULT) string ~= "widthHint="~to!(char[])(widthHint)~" ";
+    if (minimumWidth !is 0) string ~= "minimumWidth="~to!(char[])(minimumWidth)~" ";
+    string ~= "verticalAlignment="~vAlign~" ";
+    if (verticalIndent !is 0) string ~= "verticalIndent="~to!(char[])(verticalIndent)~" ";
+    if (verticalSpan !is 1) string ~= "verticalSpan="~to!(char[])(verticalSpan)~" ";
+    if (grabExcessVerticalSpace) string ~= "grabExcessVerticalSpace="~to!(char[])(grabExcessVerticalSpace)~" ";
+    if (heightHint !is DWT.DEFAULT) string ~= "heightHint="~to!(char[])(heightHint)~" ";
+    if (minimumHeight !is 0) string ~= "minimumHeight="~to!(char[])(minimumHeight)~" ";
+    if (exclude) string ~= "exclude="~to!(char[])(exclude)~" ";
+    string = string.trim();
+    string ~= "}";
+    return string;
+}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/layout/GridLayout.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,759 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.layout.GridLayout;
+
+import dwt.layout.GridData;
+import dwt.DWT;
+import dwt.graphics.Point;
+import dwt.graphics.Rectangle;
+import dwt.widgets.Control;
+import dwt.widgets.Composite;
+import dwt.widgets.Layout;
+import dwt.widgets.Scrollable;
+
+import dwt.dwthelper.System;
+import dwt.dwthelper.Integer;
+
+import tango.text.Util;
+import tango.util.Convert;
+import Math = tango.math.Math;
+
+
+/**
+ * Instances of this class lay out the control children of a
+ * <code>Composite</code> in a grid.
+ * <p>
+ * <code>GridLayout</code> has a number of configuration fields, and the
+ * controls it lays out can have an associated layout data object, called
+ * <code>GridData</code>. The power of <code>GridLayout</code> lies in the
+ * ability to configure <code>GridData</code> for each control in the layout.
+ * </p>
+ * <p>
+ * The following code creates a shell managed by a <code>GridLayout</code>
+ * with 3 columns:
+ * <pre>
+ *      Display display = new Display();
+ *      Shell shell = new Shell(display);
+ *      GridLayout gridLayout = new GridLayout();
+ *      gridLayout.numColumns = 3;
+ *      shell.setLayout(gridLayout);
+ * </pre>
+ * The <code>numColumns</code> field is the most important field in a
+ * <code>GridLayout</code>. Widgets are laid out in columns from left
+ * to right, and a new row is created when <code>numColumns</code> + 1
+ * controls are added to the <code>Composite<code>.
+ * </p>
+ *
+ * @see GridData
+ */
+public final class GridLayout : Layout {
+
+    /**
+     * numColumns specifies the number of cell columns in the layout.
+     * If numColumns has a value less than 1, the layout will not
+     * set the size and position of any controls.
+     *
+     * The default value is 1.
+     */
+    public int numColumns = 1;
+
+    /**
+     * makeColumnsEqualWidth specifies whether all columns in the layout
+     * will be forced to have the same width.
+     *
+     * The default value is false.
+     */
+    public bool makeColumnsEqualWidth = false;
+
+    /**
+     * 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 5.
+     */
+    public int marginWidth = 5;
+
+    /**
+     * 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 5.
+     */
+    public int marginHeight = 5;
+
+    /**
+     * marginLeft specifies the number of pixels of horizontal margin
+     * that will be placed along the left edge of the layout.
+     *
+     * The default value is 0.
+     *
+     * @since 3.1
+     */
+    public int marginLeft = 0;
+
+    /**
+     * marginTop specifies the number of pixels of vertical margin
+     * that will be placed along the top edge of the layout.
+     *
+     * The default value is 0.
+     *
+     * @since 3.1
+     */
+    public int marginTop = 0;
+
+    /**
+     * marginRight specifies the number of pixels of horizontal margin
+     * that will be placed along the right edge of the layout.
+     *
+     * The default value is 0.
+     *
+     * @since 3.1
+     */
+    public int marginRight = 0;
+
+    /**
+     * marginBottom specifies the number of pixels of vertical margin
+     * that will be placed along the bottom edge of the layout.
+     *
+     * The default value is 0.
+     *
+     * @since 3.1
+     */
+    public int marginBottom = 0;
+
+    /**
+     * horizontalSpacing specifies the number of pixels between the right
+     * edge of one cell and the left edge of its neighbouring cell to
+     * the right.
+     *
+     * The default value is 5.
+     */
+    public int horizontalSpacing = 5;
+
+    /**
+     * verticalSpacing specifies the number of pixels between the bottom
+     * edge of one cell and the top edge of its neighbouring cell underneath.
+     *
+     * The default value is 5.
+     */
+    public int verticalSpacing = 5;
+
+/**
+ * Constructs a new instance of this class.
+ */
+public this () {}
+
+/**
+ * Constructs a new instance of this class given the
+ * number of columns, and whether or not the columns
+ * should be forced to have the same width.
+ * If numColumns has a value less than 1, the layout will not
+ * set the size and position of any controls.
+ *
+ * @param numColumns the number of columns in the grid
+ * @param makeColumnsEqualWidth whether or not the columns will have equal width
+ *
+ * @since 2.0
+ */
+public this (int numColumns, bool makeColumnsEqualWidth) {
+    this.numColumns = numColumns;
+    this.makeColumnsEqualWidth = makeColumnsEqualWidth;
+}
+
+protected Point computeSize (Composite composite, int wHint, int hHint, bool flushCache_) {
+    Point size = layout (composite, false, 0, 0, wHint, hHint, flushCache_);
+    if (wHint !is DWT.DEFAULT) size.x = wHint;
+    if (hHint !is DWT.DEFAULT) size.y = hHint;
+    return size;
+}
+
+protected bool flushCache (Control control) {
+    Object data = control.getLayoutData ();
+    if (data !is null) (cast(GridData) data).flushCache ();
+    return true;
+}
+
+GridData getData (Control [][] grid, int row, int column, int rowCount, int columnCount, bool first) {
+    Control control = grid [row] [column];
+    if (control !is null) {
+        GridData data = cast(GridData) control.getLayoutData ();
+        int hSpan = Math.max (1, Math.min (data.horizontalSpan, columnCount));
+        int vSpan = Math.max (1, data.verticalSpan);
+        int i = first ? row + vSpan - 1 : row - vSpan + 1;
+        int j = first ? column + hSpan - 1 : column - hSpan + 1;
+        if (0 <= i && i < rowCount) {
+            if (0 <= j && j < columnCount) {
+                if (control is grid [i][j]) return data;
+            }
+        }
+    }
+    return null;
+}
+
+protected void layout (Composite composite, bool flushCache_) {
+    Rectangle rect = composite.getClientArea ();
+    layout (composite, true, rect.x, rect.y, rect.width, rect.height, flushCache_);
+}
+
+Point layout (Composite composite, bool move, int x, int y, int width, int height, bool flushCache_) {
+    if (numColumns < 1) {
+        return new Point (marginLeft + marginWidth * 2 + marginRight, marginTop + marginHeight * 2 + marginBottom);
+    }
+    Control [] children = composite.getChildren ();
+    int count = 0;
+    for (int i=0; i<children.length; i++) {
+        Control control = children [i];
+        GridData data = cast(GridData) control.getLayoutData ();
+        if (data is null || !data.exclude) {
+            children [count++] = children [i];
+        }
+    }
+    if (count is 0) {
+        return new Point (marginLeft + marginWidth * 2 + marginRight, marginTop + marginHeight * 2 + marginBottom);
+    }
+    for (int i=0; i<count; i++) {
+        Control child = children [i];
+        GridData data = cast(GridData) child.getLayoutData ();
+        if (data is null) child.setLayoutData (data = new GridData ());
+        if (flushCache_) data.flushCache ();
+        data.computeSize (child, data.widthHint, data.heightHint, flushCache_);
+        if (data.grabExcessHorizontalSpace && data.minimumWidth > 0) {
+            if (data.cacheWidth < data.minimumWidth) {
+                int trim = 0;
+                //TEMPORARY CODE
+                if ( auto sa = cast(Scrollable)child ) {
+                    Rectangle rect = sa.computeTrim (0, 0, 0, 0);
+                    trim = rect.width;
+                } else {
+                    trim = child.getBorderWidth () * 2;
+                }
+                data.cacheWidth = data.cacheHeight = DWT.DEFAULT;
+                data.computeSize (child, Math.max (0, data.minimumWidth - trim), data.heightHint, false);
+            }
+        }
+        if (data.grabExcessVerticalSpace && data.minimumHeight > 0) {
+            data.cacheHeight = Math.max (data.cacheHeight, data.minimumHeight);
+        }
+    }
+
+    /* Build the grid */
+    int row = 0, column = 0, rowCount = 0, columnCount = numColumns;
+    Control [][] grid = new Control [][]( 4, columnCount );
+    for (int i=0; i<count; i++) {
+        Control child = children [i];
+        GridData data = cast(GridData) child.getLayoutData ();
+        int hSpan = Math.max (1, Math.min (data.horizontalSpan, columnCount));
+        int vSpan = Math.max (1, data.verticalSpan);
+        while (true) {
+            int lastRow = row + vSpan;
+            if (lastRow >= grid.length) {
+                Control [][] newGrid = new Control[][]( lastRow + 4, columnCount );
+                SimpleType!(Control[]).arraycopy (grid, 0, newGrid, 0, grid.length);
+                grid = newGrid;
+            }
+            if (grid [row] is null) {
+                grid [row] = new Control [columnCount];
+            }
+            while (column < columnCount && grid [row] [column] !is null) {
+                column++;
+            }
+            int endCount = column + hSpan;
+            if (endCount <= columnCount) {
+                int index = column;
+                while (index < endCount && grid [row] [index] is null) {
+                    index++;
+                }
+                if (index is endCount) break;
+                column = index;
+            }
+            if (column + hSpan >= columnCount) {
+                column = 0;
+                row++;
+            }
+        }
+        for (int j=0; j<vSpan; j++) {
+            if (grid [row + j] is null) {
+                grid [row + j] = new Control [columnCount];
+            }
+            for (int k=0; k<hSpan; k++) {
+                grid [row + j] [column + k] = child;
+            }
+        }
+        rowCount = Math.max (rowCount, row + vSpan);
+        column += hSpan;
+    }
+
+    /* Column widths */
+    int availableWidth = width - horizontalSpacing * (columnCount - 1) - (marginLeft + marginWidth * 2 + marginRight);
+    int expandCount = 0;
+    int [] widths = new int [columnCount];
+    int [] minWidths = new int [columnCount];
+    bool [] expandColumn = new bool [columnCount];
+    for (int j=0; j<columnCount; j++) {
+        for (int i=0; i<rowCount; i++) {
+            GridData data = getData (grid, i, j, rowCount, columnCount, true);
+            if (data !is null) {
+                int hSpan = Math.max (1, Math.min (data.horizontalSpan, columnCount));
+                if (hSpan is 1) {
+                    int w = data.cacheWidth + data.horizontalIndent;
+                    widths [j] = Math.max (widths [j], w);
+                    if (data.grabExcessHorizontalSpace) {
+                        if (!expandColumn [j]) expandCount++;
+                        expandColumn [j] = true;
+                    }
+                    if (!data.grabExcessHorizontalSpace || data.minimumWidth !is 0) {
+                        w = !data.grabExcessHorizontalSpace || data.minimumWidth is DWT.DEFAULT ? data.cacheWidth : data.minimumWidth;
+                        w += data.horizontalIndent;
+                        minWidths [j] = Math.max (minWidths [j], w);
+                    }
+                }
+            }
+        }
+        for (int i=0; i<rowCount; i++) {
+            GridData data = getData (grid, i, j, rowCount, columnCount, false);
+            if (data !is null) {
+                int hSpan = Math.max (1, Math.min (data.horizontalSpan, columnCount));
+                if (hSpan > 1) {
+                    int spanWidth = 0, spanMinWidth = 0, spanExpandCount = 0;
+                    for (int k=0; k<hSpan; k++) {
+                        spanWidth += widths [j-k];
+                        spanMinWidth += minWidths [j-k];
+                        if (expandColumn [j-k]) spanExpandCount++;
+                    }
+                    if (data.grabExcessHorizontalSpace && spanExpandCount is 0) {
+                        expandCount++;
+                        expandColumn [j] = true;
+                    }
+                    int w = data.cacheWidth + data.horizontalIndent - spanWidth - (hSpan - 1) * horizontalSpacing;
+                    if (w > 0) {
+                        if (makeColumnsEqualWidth) {
+                            int equalWidth = (w + spanWidth) / hSpan;
+                            int remainder = (w + spanWidth) % hSpan, last = -1;
+                            for (int k = 0; k < hSpan; k++) {
+                                widths [last=j-k] = Math.max (equalWidth, widths [j-k]);
+                            }
+                            if (last > -1) widths [last] += remainder;
+                        } else {
+                            if (spanExpandCount is 0) {
+                                widths [j] += w;
+                            } else {
+                                int delta = w / spanExpandCount;
+                                int remainder = w % spanExpandCount, last = -1;
+                                for (int k = 0; k < hSpan; k++) {
+                                    if (expandColumn [j-k]) {
+                                        widths [last=j-k] += delta;
+                                    }
+                                }
+                                if (last > -1) widths [last] += remainder;
+                            }
+                        }
+                    }
+                    if (!data.grabExcessHorizontalSpace || data.minimumWidth !is 0) {
+                        w = !data.grabExcessHorizontalSpace || data.minimumWidth is DWT.DEFAULT ? data.cacheWidth : data.minimumWidth;
+                        w += data.horizontalIndent - spanMinWidth - (hSpan - 1) * horizontalSpacing;
+                        if (w > 0) {
+                            if (spanExpandCount is 0) {
+                                minWidths [j] += w;
+                            } else {
+                                int delta = w / spanExpandCount;
+                                int remainder = w % spanExpandCount, last = -1;
+                                for (int k = 0; k < hSpan; k++) {
+                                    if (expandColumn [j-k]) {
+                                        minWidths [last=j-k] += delta;
+                                    }
+                                }
+                                if (last > -1) minWidths [last] += remainder;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+    if (makeColumnsEqualWidth) {
+        int minColumnWidth = 0;
+        int columnWidth = 0;
+        for (int i=0; i<columnCount; i++) {
+            minColumnWidth = Math.max (minColumnWidth, minWidths [i]);
+            columnWidth = Math.max (columnWidth, widths [i]);
+        }
+        columnWidth = width is DWT.DEFAULT || expandCount is 0 ? columnWidth : Math.max (minColumnWidth, availableWidth / columnCount);
+        for (int i=0; i<columnCount; i++) {
+            expandColumn [i] = expandCount > 0;
+            widths [i] = columnWidth;
+        }
+    } else {
+        if (width !is DWT.DEFAULT && expandCount > 0) {
+            int totalWidth = 0;
+            for (int i=0; i<columnCount; i++) {
+                totalWidth += widths [i];
+            }
+            int c = expandCount;
+            int delta = (availableWidth - totalWidth) / c;
+            int remainder = (availableWidth - totalWidth) % c;
+            int last = -1;
+            while (totalWidth !is availableWidth) {
+                for (int j=0; j<columnCount; j++) {
+                    if (expandColumn [j]) {
+                        if (widths [j] + delta > minWidths [j]) {
+                            widths [last = j] = widths [j] + delta;
+                        } else {
+                            widths [j] = minWidths [j];
+                            expandColumn [j] = false;
+                            c--;
+                        }
+                    }
+                }
+                if (last > -1) widths [last] += remainder;
+
+                for (int j=0; j<columnCount; j++) {
+                    for (int i=0; i<rowCount; i++) {
+                        GridData data = getData (grid, i, j, rowCount, columnCount, false);
+                        if (data !is null) {
+                            int hSpan = Math.max (1, Math.min (data.horizontalSpan, columnCount));
+                            if (hSpan > 1) {
+                                if (!data.grabExcessHorizontalSpace || data.minimumWidth !is 0) {
+                                    int spanWidth = 0, spanExpandCount = 0;
+                                    for (int k=0; k<hSpan; k++) {
+                                        spanWidth += widths [j-k];
+                                        if (expandColumn [j-k]) spanExpandCount++;
+                                    }
+                                    int w = !data.grabExcessHorizontalSpace || data.minimumWidth is DWT.DEFAULT ? data.cacheWidth : data.minimumWidth;
+                                    w += data.horizontalIndent - spanWidth - (hSpan - 1) * horizontalSpacing;
+                                    if (w > 0) {
+                                        if (spanExpandCount is 0) {
+                                            widths [j] += w;
+                                        } else {
+                                            int delta2 = w / spanExpandCount;
+                                            int remainder2 = w % spanExpandCount, last2 = -1;
+                                            for (int k = 0; k < hSpan; k++) {
+                                                if (expandColumn [j-k]) {
+                                                    widths [last2=j-k] += delta2;
+                                                }
+                                            }
+                                            if (last2 > -1) widths [last2] += remainder2;
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+                if (c is 0) break;
+                totalWidth = 0;
+                for (int i=0; i<columnCount; i++) {
+                    totalWidth += widths [i];
+                }
+                delta = (availableWidth - totalWidth) / c;
+                remainder = (availableWidth - totalWidth) % c;
+                last = -1;
+            }
+        }
+    }
+
+    /* Wrapping */
+    GridData [] flush = null;
+    int flushLength = 0;
+    if (width !is DWT.DEFAULT) {
+        for (int j=0; j<columnCount; j++) {
+            for (int i=0; i<rowCount; i++) {
+                GridData data = getData (grid, i, j, rowCount, columnCount, false);
+                if (data !is null) {
+                    if (data.heightHint is DWT.DEFAULT) {
+                        Control child = grid [i][j];
+                        //TEMPORARY CODE
+                        int hSpan = Math.max (1, Math.min (data.horizontalSpan, columnCount));
+                        int currentWidth = 0;
+                        for (int k=0; k<hSpan; k++) {
+                            currentWidth += widths [j-k];
+                        }
+                        currentWidth += (hSpan - 1) * horizontalSpacing - data.horizontalIndent;
+                        if ((currentWidth !is data.cacheWidth && data.horizontalAlignment is DWT.FILL) || (data.cacheWidth > currentWidth)) {
+                            int trim = 0;
+                            if ( auto sa = cast(Scrollable)child ) {
+                                Rectangle rect = sa.computeTrim (0, 0, 0, 0);
+                                trim = rect.width;
+                            } else {
+                                trim = child.getBorderWidth () * 2;
+                            }
+                            data.cacheWidth = data.cacheHeight = DWT.DEFAULT;
+                            data.computeSize (child, Math.max (0, currentWidth - trim), data.heightHint, false);
+                            if (data.grabExcessVerticalSpace && data.minimumHeight > 0) {
+                                data.cacheHeight = Math.max (data.cacheHeight, data.minimumHeight);
+                            }
+                            if (flush is null) flush = new GridData [count];
+                            flush [flushLength++] = data;
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    /* Row heights */
+    int availableHeight = height - verticalSpacing * (rowCount - 1) - (marginTop + marginHeight * 2 + marginBottom);
+    expandCount = 0;
+    int [] heights = new int [rowCount];
+    int [] minHeights = new int [rowCount];
+    bool [] expandRow = new bool [rowCount];
+    for (int i=0; i<rowCount; i++) {
+        for (int j=0; j<columnCount; j++) {
+            GridData data = getData (grid, i, j, rowCount, columnCount, true);
+            if (data !is null) {
+                int vSpan = Math.max (1, Math.min (data.verticalSpan, rowCount));
+                if (vSpan is 1) {
+                    int h = data.cacheHeight + data.verticalIndent;
+                    heights [i] = Math.max (heights [i], h);
+                    if (data.grabExcessVerticalSpace) {
+                        if (!expandRow [i]) expandCount++;
+                        expandRow [i] = true;
+                    }
+                    if (!data.grabExcessVerticalSpace || data.minimumHeight !is 0) {
+                        h = !data.grabExcessVerticalSpace || data.minimumHeight is DWT.DEFAULT ? data.cacheHeight : data.minimumHeight;
+                        h += data.verticalIndent;
+                        minHeights [i] = Math.max (minHeights [i], h);
+                    }
+                }
+            }
+        }
+        for (int j=0; j<columnCount; j++) {
+            GridData data = getData (grid, i, j, rowCount, columnCount, false);
+            if (data !is null) {
+                int vSpan = Math.max (1, Math.min (data.verticalSpan, rowCount));
+                if (vSpan > 1) {
+                    int spanHeight = 0, spanMinHeight = 0, spanExpandCount = 0;
+                    for (int k=0; k<vSpan; k++) {
+                        spanHeight += heights [i-k];
+                        spanMinHeight += minHeights [i-k];
+                        if (expandRow [i-k]) spanExpandCount++;
+                    }
+                    if (data.grabExcessVerticalSpace && spanExpandCount is 0) {
+                        expandCount++;
+                        expandRow [i] = true;
+                    }
+                    int h = data.cacheHeight + data.verticalIndent - spanHeight - (vSpan - 1) * verticalSpacing;
+                    if (h > 0) {
+                        if (spanExpandCount is 0) {
+                            heights [i] += h;
+                        } else {
+                            int delta = h / spanExpandCount;
+                            int remainder = h % spanExpandCount, last = -1;
+                            for (int k = 0; k < vSpan; k++) {
+                                if (expandRow [i-k]) {
+                                    heights [last=i-k] += delta;
+                                }
+                            }
+                            if (last > -1) heights [last] += remainder;
+                        }
+                    }
+                    if (!data.grabExcessVerticalSpace || data.minimumHeight !is 0) {
+                        h = !data.grabExcessVerticalSpace || data.minimumHeight is DWT.DEFAULT ? data.cacheHeight : data.minimumHeight;
+                        h += data.verticalIndent - spanMinHeight - (vSpan - 1) * verticalSpacing;
+                        if (h > 0) {
+                            if (spanExpandCount is 0) {
+                                minHeights [i] += h;
+                            } else {
+                                int delta = h / spanExpandCount;
+                                int remainder = h % spanExpandCount, last = -1;
+                                for (int k = 0; k < vSpan; k++) {
+                                    if (expandRow [i-k]) {
+                                        minHeights [last=i-k] += delta;
+                                    }
+                                }
+                                if (last > -1) minHeights [last] += remainder;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+    if (height !is DWT.DEFAULT && expandCount > 0) {
+        int totalHeight = 0;
+        for (int i=0; i<rowCount; i++) {
+            totalHeight += heights [i];
+        }
+        int c = expandCount;
+        int delta = (availableHeight - totalHeight) / c;
+        int remainder = (availableHeight - totalHeight) % c;
+        int last = -1;
+        while (totalHeight !is availableHeight) {
+            for (int i=0; i<rowCount; i++) {
+                if (expandRow [i]) {
+                    if (heights [i] + delta > minHeights [i]) {
+                        heights [last = i] = heights [i] + delta;
+                    } else {
+                        heights [i] = minHeights [i];
+                        expandRow [i] = false;
+                        c--;
+                    }
+                }
+            }
+            if (last > -1) heights [last] += remainder;
+
+            for (int i=0; i<rowCount; i++) {
+                for (int j=0; j<columnCount; j++) {
+                    GridData data = getData (grid, i, j, rowCount, columnCount, false);
+                    if (data !is null) {
+                        int vSpan = Math.max (1, Math.min (data.verticalSpan, rowCount));
+                        if (vSpan > 1) {
+                            if (!data.grabExcessVerticalSpace || data.minimumHeight !is 0) {
+                                int spanHeight = 0, spanExpandCount = 0;
+                                for (int k=0; k<vSpan; k++) {
+                                    spanHeight += heights [i-k];
+                                    if (expandRow [i-k]) spanExpandCount++;
+                                }
+                                int h = !data.grabExcessVerticalSpace || data.minimumHeight is DWT.DEFAULT ? data.cacheHeight : data.minimumHeight;
+                                h += data.verticalIndent - spanHeight - (vSpan - 1) * verticalSpacing;
+                                if (h > 0) {
+                                    if (spanExpandCount is 0) {
+                                        heights [i] += h;
+                                    } else {
+                                        int delta2 = h / spanExpandCount;
+                                        int remainder2 = h % spanExpandCount, last2 = -1;
+                                        for (int k = 0; k < vSpan; k++) {
+                                            if (expandRow [i-k]) {
+                                                heights [last2=i-k] += delta2;
+                                            }
+                                        }
+                                        if (last2 > -1) heights [last2] += remainder2;
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+            if (c is 0) break;
+            totalHeight = 0;
+            for (int i=0; i<rowCount; i++) {
+                totalHeight += heights [i];
+            }
+            delta = (availableHeight - totalHeight) / c;
+            remainder = (availableHeight - totalHeight) % c;
+            last = -1;
+        }
+    }
+
+    /* Position the controls */
+    if (move) {
+        int gridY = y + marginTop + marginHeight;
+        for (int i=0; i<rowCount; i++) {
+            int gridX = x + marginLeft + marginWidth;
+            for (int j=0; j<columnCount; j++) {
+                GridData data = getData (grid, i, j, rowCount, columnCount, true);
+                if (data !is null) {
+                    int hSpan = Math.max (1, Math.min (data.horizontalSpan, columnCount));
+                    int vSpan = Math.max (1, data.verticalSpan);
+                    int cellWidth = 0, cellHeight = 0;
+                    for (int k=0; k<hSpan; k++) {
+                        cellWidth += widths [j+k];
+                    }
+                    for (int k=0; k<vSpan; k++) {
+                        cellHeight += heights [i+k];
+                    }
+                    cellWidth += horizontalSpacing * (hSpan - 1);
+                    int childX = gridX + data.horizontalIndent;
+                    int childWidth = Math.min (data.cacheWidth, cellWidth);
+                    switch (data.horizontalAlignment) {
+                        case DWT.CENTER:
+                        case GridData.CENTER:
+                            childX += Math.max (0, (cellWidth - data.horizontalIndent - childWidth) / 2);
+                            break;
+                        case DWT.RIGHT:
+                        case DWT.END:
+                        case GridData.END:
+                            childX += Math.max (0, cellWidth - data.horizontalIndent - childWidth);
+                            break;
+                        case DWT.FILL:
+                            childWidth = cellWidth - data.horizontalIndent;
+                            break;
+                        default:
+                    }
+                    cellHeight += verticalSpacing * (vSpan - 1);
+                    int childY = gridY + data.verticalIndent;
+                    int childHeight = Math.min (data.cacheHeight, cellHeight);
+                    switch (data.verticalAlignment) {
+                        case DWT.CENTER:
+                        case GridData.CENTER:
+                            childY += Math.max (0, (cellHeight - data.verticalIndent - childHeight) / 2);
+                            break;
+                        case DWT.BOTTOM:
+                        case DWT.END:
+                        case GridData.END:
+                            childY += Math.max (0, cellHeight - data.verticalIndent - childHeight);
+                            break;
+                        case DWT.FILL:
+                            childHeight = cellHeight - data.verticalIndent;
+                            break;
+                        default:
+                    }
+                    Control child = grid [i][j];
+                    if (child !is null) {
+                        child.setBounds (childX, childY, childWidth, childHeight);
+                    }
+                }
+                gridX += widths [j] + horizontalSpacing;
+            }
+            gridY += heights [i] + verticalSpacing;
+        }
+    }
+
+    // clean up cache
+    for (int i = 0; i < flushLength; i++) {
+        flush [i].cacheWidth = flush [i].cacheHeight = -1;
+    }
+
+    int totalDefaultWidth = 0;
+    int totalDefaultHeight = 0;
+    for (int i=0; i<columnCount; i++) {
+        totalDefaultWidth += widths [i];
+    }
+    for (int i=0; i<rowCount; i++) {
+        totalDefaultHeight += heights [i];
+    }
+    totalDefaultWidth += horizontalSpacing * (columnCount - 1) + marginLeft + marginWidth * 2 + marginRight;
+    totalDefaultHeight += verticalSpacing * (rowCount - 1) + marginTop + marginHeight * 2 + marginBottom;
+    return new Point (totalDefaultWidth, totalDefaultHeight);
+}
+
+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 layout
+ */
+public char[] toString () {
+    char[] string = getName ()~" {";
+    if (numColumns !is 1) string ~= "numColumns="~to!(char[])(numColumns)~" ";
+    if (makeColumnsEqualWidth) string ~= "makeColumnsEqualWidth="~to!(char[])(makeColumnsEqualWidth)~" ";
+    if (marginWidth !is 0) string ~= "marginWidth="~to!(char[])(marginWidth)~" ";
+    if (marginHeight !is 0) string ~= "marginHeight="~to!(char[])(marginHeight)~" ";
+    if (marginLeft !is 0) string ~= "marginLeft="~to!(char[])(marginLeft)~" ";
+    if (marginRight !is 0) string ~= "marginRight="~to!(char[])(marginRight)~" ";
+    if (marginTop !is 0) string ~= "marginTop="~to!(char[])(marginTop)~" ";
+    if (marginBottom !is 0) string ~= "marginBottom="~to!(char[])(marginBottom)~" ";
+    if (horizontalSpacing !is 0) string ~= "horizontalSpacing="~to!(char[])(horizontalSpacing)~" ";
+    if (verticalSpacing !is 0) string ~= "verticalSpacing="~to!(char[])(verticalSpacing)~" ";
+    string = string.trim();
+    string ~= "}";
+    return string;
+}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/layout/RowData.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,130 @@
+/*******************************************************************************
+ * 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.layout.RowData;
+
+import dwt.DWT;
+import dwt.graphics.Point;
+import dwt.widgets.Control;
+
+import tango.text.Util;
+import tango.util.Convert;
+
+/**
+ * Each control controlled by a <code>RowLayout</code> can have its initial
+ * width and height specified by setting a <code>RowData</code> object
+ * into the control.
+ * <p>
+ * The following code uses a <code>RowData</code> object to change the initial
+ * size of a <code>Button</code> in a <code>Shell</code>:
+ * <pre>
+ *      Display display = new Display();
+ *      Shell shell = new Shell(display);
+ *      shell.setLayout(new RowLayout());
+ *      Button button1 = new Button(shell, DWT.PUSH);
+ *      button1.setText("Button 1");
+ *      button1.setLayoutData(new RowData(50, 40));
+ * </pre>
+ * </p>
+ *
+ * @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 DWT.DEFAULT.
+     *
+     * @see dwt.widgets.Control#computeSize(int, int, bool)
+     */
+    public int width = DWT.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 DWT.DEFAULT.
+     *
+     * @see dwt.widgets.Control#computeSize(int, int, bool)
+     */
+    public int height = DWT.DEFAULT;
+
+    /**
+     * exclude informs the layout to ignore this control when sizing
+     * and positioning controls.  If this value is <code>true</code>,
+     * the size and position of the control will not be managed by the
+     * layout.  If this value is <code>false</code>, the size and
+     * position of the control will be computed and assigned.
+     *
+     * The default value is <code>false</code>.
+     *
+     * @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 DWT.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 DWT.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 DWT.DEFAULT) string ~= "width="~to!(char[])(width)~" ";
+    if (height !is DWT.DEFAULT) string ~= "height="~to!(char[])(height)~" ";
+    if (exclude) string ~= "exclude="~to!(char[])(exclude)~" ";
+    string = trim( string );
+    string ~= "}";
+    return string;
+}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/layout/RowLayout.d	Sun Jan 20 21:50:55 2008 -0800
@@ -0,0 +1,477 @@
+/*******************************************************************************
+ * 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwt.layout.RowLayout;
+
+import dwt.DWT;
+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 <code>Composite</code> by placing them either in
+ * horizontal rows or vertical columns within the parent <code>Composite</code>.
+ * <p>
+ * <code>RowLayout</code> aligns all controls in one row if the
+ * <code>type</code> 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. <code>RowLayout</code> has a number of configuration
+ * fields. In addition, the height and width of each control in a
+ * <code>RowLayout</code> can be specified by setting a <code>RowData</code>
+ * object into the control using <code>setLayoutData ()</code>.
+ * </p>
+ * <p>
+ * The following example code creates a <code>RowLayout</code>, sets all
+ * of its fields to non-default values, and then sets it into a
+ * <code>Shell</code>.
+ * <pre>
+ *      RowLayout rowLayout = new RowLayout();
+ *      rowLayout.wrap = false;
+ *      rowLayout.pack = false;
+ *      rowLayout.justify = true;
+ *      rowLayout.type = DWT.VERTICAL;
+ *      rowLayout.marginLeft = 5;
+ *      rowLayout.marginTop = 5;
+ *      rowLayout.marginRight = 5;
+ *      rowLayout.marginBottom = 5;
+ *      rowLayout.spacing = 0;
+ *      shell.setLayout(rowLayout);
+ * </pre>
+ * If you are using the default field values, you only need one line of code:
+ * <pre>
+ *      shell.setLayout(new RowLayout());
+ * </pre>
+ * </p>
+ *
+ * @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: <ul>
+     *    <li>HORIZONTAL: Position the controls horizontally from left to right</li>
+     *    <li>VERTICAL: Position the controls vertically from top to bottom</li>
+     * </ul>
+     *
+     * @since 2.0
+     */
+    public int type = DWT.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 DWT.HORIZONTAL) {
+        extent = layoutHorizontal (composite, false, (wHint !is DWT.DEFAULT) && wrap, wHint, flushCache_);
+    } else {
+        extent = layoutVertical (composite, false, (hHint !is DWT.DEFAULT) && wrap, hHint, flushCache_);
+    }
+    if (wHint !is DWT.DEFAULT) extent.x = wHint;
+    if (hHint !is DWT.DEFAULT) extent.y = hHint;
+    return extent;
+}
+
+Point computeSize (Control control, bool flushCache_) {
+    int wHint = DWT.DEFAULT, hHint = DWT.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 DWT.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<children.length; i++) {
+        Control control = children [i];
+        RowData data = cast(RowData) control.getLayoutData ();
+        if (data is null || !data.exclude) {
+            children [count++] = children [i];
+        }
+    }
+    if (count is 0) {
+        return new Point (marginLeft + marginWidth * 2 + marginRight, marginTop + marginHeight * 2 + marginBottom);
+    }
+    int childWidth = 0, childHeight = 0, maxHeight = 0;
+    if (!pack) {
+        for (int i=0; i<count; i++) {
+            Control child = children [i];
+            Point size = computeSize (child, flushCache_);
+            childWidth = Math.max (childWidth, size.x);
+            childHeight = Math.max (childHeight, size.y);
+        }
+        maxHeight = childHeight;
+    }
+    int clientX = 0, clientY = 0;
+    if (move) {
+        Rectangle rect = composite.getClientArea ();
+        clientX = rect.x;
+        clientY = rect.y;
+    }
+    int [] wraps = null;
+    bool wrapped = false;
+    Rectangle [] bounds = null;
+    if (move && (justify || fill)) {
+        bounds = new Rectangle [count];
+        wraps = new int [count];
+    }
+    int maxX = 0, x = marginLeft + marginWidth, y = marginTop + marginHeight;
+    for (int i=0; i<count; i++) {
+        Control child = children [i];
+        if (pack) {
+            Point size = computeSize (child, flushCache_);
+            childWidth = size.x;
+            childHeight = size.y;
+        }
+        if (wrap && (i !is 0) && (x + childWidth > 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<count; i++) {
+                    if (wraps [i] !is 0) {
+                        int wrapCount = i - last + 1;
+                        if (justify) {
+                            int wrapX = 0;
+                            for (int j=last; j<=i; j++) {
+                                wrapX += bounds [j].width + spacing;
+                            }
+                            space = Math.max (0, (width - wrapX) / (wrapCount + 1));
+                            margin = Math.max (0, ((width - wrapX) % (wrapCount + 1)) / 2);
+                        }
+                        for (int j=last; j<=i; j++) {
+                            if (justify) bounds [j].x += (space * (j - last + 1)) + margin;
+                            if (fill) bounds [j].height = wraps [i];
+                        }
+                        last = i + 1;
+                    }
+                }
+            }
+        }
+        for (int i=0; i<count; i++) {
+            if (!wrapped) {
+                if (justify) bounds [i].x += (space * (i + 1)) + margin;
+                if (fill) bounds [i].height = maxHeight;
+            }
+            children [i].setBounds (bounds [i]);
+        }
+    }
+    return new Point (maxX, y + maxHeight + marginBottom + marginHeight);
+}
+
+Point layoutVertical (Composite composite, bool move, bool wrap, int height, bool flushCache_) {
+    Control [] children = composite.getChildren ();
+    int count = 0;
+    for (int i=0; i<children.length; i++) {
+        Control control = children [i];
+        RowData data = cast(RowData) control.getLayoutData ();
+        if (data is null || !data.exclude) {
+            children [count++] = children [i];
+        }
+    }
+    if (count is 0) {
+        return new Point (marginLeft + marginWidth * 2 + marginRight, marginTop + marginHeight * 2 + marginBottom);
+    }
+    int childWidth = 0, childHeight = 0, maxWidth = 0;
+    if (!pack) {
+        for (int i=0; i<count; i++) {
+            Control child = children [i];
+            Point size = computeSize (child, flushCache_);
+            childWidth = Math.max (childWidth, size.x);
+            childHeight = Math.max (childHeight, size.y);
+        }
+        maxWidth = childWidth;
+    }
+    int clientX = 0, clientY = 0;
+    if (move) {
+        Rectangle rect = composite.getClientArea ();
+        clientX = rect.x;
+        clientY = rect.y;
+    }
+    int [] wraps = null;
+    bool wrapped = false;
+    Rectangle [] bounds = null;
+    if (move && (justify || fill)) {
+        bounds = new Rectangle [count];
+        wraps = new int [count];
+    }
+    int maxY = 0, x = marginLeft + marginWidth, y = marginTop + marginHeight;
+    for (int i=0; i<count; i++) {
+        Control child = children [i];
+        if (pack) {
+            Point size = computeSize (child, flushCache_);
+            childWidth = size.x;
+            childHeight = size.y;
+        }
+        if (wrap && (i !is 0) && (y + childHeight > 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<count; i++) {
+                    if (wraps [i] !is 0) {
+                        int wrapCount = i - last + 1;
+                        if (justify) {
+                            int wrapY = 0;
+                            for (int j=last; j<=i; j++) {
+                                wrapY += bounds [j].height + spacing;
+                            }
+                            space = Math.max (0, (height - wrapY) / (wrapCount + 1));
+                            margin = Math.max (0, ((height - wrapY) % (wrapCount + 1)) / 2);
+                        }
+                        for (int j=last; j<=i; j++) {
+                            if (justify) bounds [j].y += (space * (j - last + 1)) + margin;
+                            if (fill) bounds [j].width = wraps [i];
+                        }
+                        last = i + 1;
+                    }
+                }
+            }
+        }
+        for (int i=0; i<count; i++) {
+            if (!wrapped) {
+                if (justify) bounds [i].y += (space * (i + 1)) + margin;
+                if (fill) bounds [i].width = maxWidth;
+            }
+            children [i].setBounds (bounds [i]);
+        }
+    }
+    return new Point (x + maxWidth + marginRight + marginWidth, maxY);
+}
+
+/**
+ * Returns a string containing a concise, human-readable
+ * description of the receiver.
+ *
+ * @return a string representation of the layout
+ */
+public char[] toString () {
+    char[] string = getName ()~" {";
+    string ~= "type="~((type !is DWT.HORIZONTAL) ? "DWT.VERTICAL" : "DWT.HORIZONTAL")~" ";
+    if (marginWidth !is 0) string ~= "marginWidth="~to!(char[])(marginWidth)~" ";
+    if (marginHeight !is 0) string ~= "marginHeight="~to!(char[])(marginHeight)~" ";
+    if (marginLeft !is 0) string ~= "marginLeft="~to!(char[])(marginLeft)~" ";
+    if (marginTop !is 0) string ~= "marginTop="~to!(char[])(marginTop)~" ";
+    if (marginRight !is 0) string ~= "marginRight="~to!(char[])(marginRight)~" ";
+    if (marginBottom !is 0) string ~= "marginBottom="~to!(char[])(marginBottom)~" ";
+    if (spacing !is 0) string ~= "spacing="~to!(char[])(spacing)~" ";
+    string ~= "wrap="~to!(char[])(wrap)~" ";
+    string ~= "pack="~to!(char[])(pack)~" ";
+    string ~= "fill="~to!(char[])(fill)~" ";
+    string ~= "justify="~to!(char[])(justify)~" ";
+    string = trim( string );
+    string ~= "}";
+    return string;
+}
+}