changeset 128:e32a6d7506c9

Added files for the controlexample, work in progress
author Frank Benoit <benoit@tionex.de>
date Mon, 21 Jan 2008 01:40:01 +0100
parents e49a0f04c689
children 26d15eea99db 021f78dcc160
files dsss.conf dwtexamples/controlexample/AlignableTab.d dwtexamples/controlexample/ButtonTab.d dwtexamples/controlexample/CComboTab.d dwtexamples/controlexample/CLabelTab.d dwtexamples/controlexample/CTabFolderTab.d dwtexamples/controlexample/CanvasTab.d dwtexamples/controlexample/ComboTab.d dwtexamples/controlexample/ControlExample.d dwtexamples/controlexample/CoolBarTab.d dwtexamples/controlexample/CustomControlExample.d dwtexamples/controlexample/DateTimeTab.d dwtexamples/controlexample/DialogTab.d dwtexamples/controlexample/ExpandBarTab.d dwtexamples/controlexample/GroupTab.d dwtexamples/controlexample/LabelTab.d dwtexamples/controlexample/LinkTab.d dwtexamples/controlexample/ListTab.d dwtexamples/controlexample/MenuTab.d dwtexamples/controlexample/ProgressBarTab.d dwtexamples/controlexample/RangeTab.d dwtexamples/controlexample/SashFormTab.d dwtexamples/controlexample/SashTab.d dwtexamples/controlexample/ScaleTab.d dwtexamples/controlexample/ScrollableTab.d dwtexamples/controlexample/ShellTab.d dwtexamples/controlexample/SliderTab.d dwtexamples/controlexample/SpinnerTab.d dwtexamples/controlexample/StyledTextTab.d dwtexamples/controlexample/Tab.d dwtexamples/controlexample/TabFolderTab.d dwtexamples/controlexample/TableTab.d dwtexamples/controlexample/TextTab.d dwtexamples/controlexample/ToolBarTab.d dwtexamples/controlexample/ToolTipTab.d dwtexamples/controlexample/TreeTab.d
diffstat 36 files changed, 10448 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/dsss.conf	Mon Jan 21 00:26:03 2008 +0100
+++ b/dsss.conf	Mon Jan 21 01:40:01 2008 +0100
@@ -36,4 +36,5 @@
 [dwtexamples/helloworld/HelloWorld4.d]
 [dwtexamples/helloworld/HelloWorld5.d]
 [dwtexamples/addressbook/AddressBook.d]
-[t.d]
+[dwtexamples/controlexample/ControlExample.d]
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/controlexample/AlignableTab.d	Mon Jan 21 01:40:01 2008 +0100
@@ -0,0 +1,98 @@
+/*******************************************************************************
+ * 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
+ *******************************************************************************/
+module dwtexamples.controlexample.AlignableTab;
+
+
+
+import dwt.DWT;
+import dwt.events.SelectionAdapter;
+import dwt.events.SelectionEvent;
+import dwt.events.SelectionListener;
+import dwt.layout.GridData;
+import dwt.layout.GridLayout;
+import dwt.widgets.Button;
+import dwt.widgets.Group;
+import dwt.widgets.Widget;
+
+import  dwtexamples.controlexample.Tab;
+import dwtexamples.controlexample.ControlExample;
+
+/**
+ * <code>AlignableTab</code> is the abstract
+ * superclass of example controls that can be
+ * aligned.
+ */
+abstract class AlignableTab : Tab {
+
+    /* Alignment Controls */
+    Button leftButton, rightButton, centerButton;
+
+    /* Alignment Group */
+    Group alignmentGroup;
+
+    /**
+     * Creates the Tab within a given instance of ControlExample.
+     */
+    this(ControlExample instance) {
+        super(instance);
+    }
+
+    /**
+     * Creates the "Other" group.
+     */
+    void createOtherGroup () {
+        super.createOtherGroup ();
+
+        /* Create the group */
+        alignmentGroup = new Group (otherGroup, DWT.NONE);
+        alignmentGroup.setLayout (new GridLayout ());
+        alignmentGroup.setLayoutData (new GridData(GridData.HORIZONTAL_ALIGN_FILL |
+            GridData.VERTICAL_ALIGN_FILL));
+        alignmentGroup.setText (ControlExample.getResourceString("Alignment"));
+
+        /* Create the controls */
+        leftButton = new Button (alignmentGroup, DWT.RADIO);
+        leftButton.setText (ControlExample.getResourceString("Left"));
+        centerButton = new Button (alignmentGroup, DWT.RADIO);
+        centerButton.setText(ControlExample.getResourceString("Center"));
+        rightButton = new Button (alignmentGroup, DWT.RADIO);
+        rightButton.setText (ControlExample.getResourceString("Right"));
+
+        /* Add the listeners */
+        SelectionListener selectionListener = new class() SelectionAdapter {
+            public void widgetSelected(SelectionEvent event) {
+                if (!(cast(Button) event.widget).getSelection ()) return;
+                setExampleWidgetAlignment ();
+            }
+        };
+        leftButton.addSelectionListener (selectionListener);
+        centerButton.addSelectionListener (selectionListener);
+        rightButton.addSelectionListener (selectionListener);
+    }
+
+    /**
+     * Sets the alignment of the "Example" widgets.
+     */
+    abstract void setExampleWidgetAlignment ();
+
+    /**
+     * Sets the state of the "Example" widgets.
+     */
+    void setExampleWidgetState () {
+        super.setExampleWidgetState ();
+        Widget [] widgets = getExampleWidgets ();
+        if (widgets.length !is 0) {
+            leftButton.setSelection ((widgets [0].getStyle () & DWT.LEFT) !is 0);
+            centerButton.setSelection ((widgets [0].getStyle () & DWT.CENTER) !is 0);
+            rightButton.setSelection ((widgets [0].getStyle () & DWT.RIGHT) !is 0);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/controlexample/ButtonTab.d	Mon Jan 21 01:40:01 2008 +0100
@@ -0,0 +1,242 @@
+/*******************************************************************************
+ * 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
+ *******************************************************************************/
+module dwtexamples.controlexample.ButtonTab;
+
+
+
+import dwt.DWT;
+import dwt.events.SelectionAdapter;
+import dwt.events.SelectionEvent;
+import dwt.events.SelectionListener;
+import dwt.layout.GridData;
+import dwt.layout.GridLayout;
+import dwt.widgets.Button;
+import dwt.widgets.Group;
+import dwt.widgets.Widget;
+
+import dwtexamples.controlexample.AlignableTab;
+import dwtexamples.controlexample.ControlExample;
+
+/**
+ * <code>ButtonTab</code> is the class that
+ * demonstrates DWT buttons.
+ */
+class ButtonTab : AlignableTab {
+
+    /* Example widgets and groups that contain them */
+    Button button1, button2, button3, button4, button5, button6, button7, button8, button9;
+    Group textButtonGroup, imageButtonGroup, imagetextButtonGroup;
+
+    /* Alignment widgets added to the "Control" group */
+    Button upButton, downButton;
+
+    /* Style widgets added to the "Style" group */
+    Button pushButton, checkButton, radioButton, toggleButton, arrowButton, flatButton;
+
+    /**
+     * Creates the Tab within a given instance of ControlExample.
+     */
+    this(ControlExample instance) {
+        super(instance);
+    }
+
+    /**
+     * Creates the "Control" group.
+     */
+    void createControlGroup () {
+        super.createControlGroup ();
+
+        /* Create the controls */
+        upButton = new Button (alignmentGroup, DWT.RADIO);
+        upButton.setText (ControlExample.getResourceString("Up"));
+        downButton = new Button (alignmentGroup, DWT.RADIO);
+        downButton.setText (ControlExample.getResourceString("Down"));
+
+        /* Add the listeners */
+        SelectionListener selectionListener = new class() SelectionAdapter {
+            public void widgetSelected(SelectionEvent event) {
+                if (!(cast(Button) event.widget).getSelection()) return;
+                setExampleWidgetAlignment ();
+            }
+        };
+        upButton.addSelectionListener(selectionListener);
+        downButton.addSelectionListener(selectionListener);
+    }
+
+    /**
+     * Creates the "Example" group.
+     */
+    void createExampleGroup () {
+        super.createExampleGroup ();
+
+        /* Create a group for text buttons */
+        textButtonGroup = new Group(exampleGroup, DWT.NONE);
+        GridLayout gridLayout = new GridLayout ();
+        textButtonGroup.setLayout(gridLayout);
+        gridLayout.numColumns = 3;
+        textButtonGroup.setLayoutData (new GridData (DWT.FILL, DWT.FILL, true, true));
+        textButtonGroup.setText (ControlExample.getResourceString("Text_Buttons"));
+
+        /* Create a group for the image buttons */
+        imageButtonGroup = new Group(exampleGroup, DWT.NONE);
+        gridLayout = new GridLayout();
+        imageButtonGroup.setLayout(gridLayout);
+        gridLayout.numColumns = 3;
+        imageButtonGroup.setLayoutData (new GridData (DWT.FILL, DWT.FILL, true, true));
+        imageButtonGroup.setText (ControlExample.getResourceString("Image_Buttons"));
+
+        /* Create a group for the image and text buttons */
+        imagetextButtonGroup = new Group(exampleGroup, DWT.NONE);
+        gridLayout = new GridLayout();
+        imagetextButtonGroup.setLayout(gridLayout);
+        gridLayout.numColumns = 3;
+        imagetextButtonGroup.setLayoutData (new GridData (DWT.FILL, DWT.FILL, true, true));
+        imagetextButtonGroup.setText (ControlExample.getResourceString("Image_Text_Buttons"));
+    }
+
+    /**
+     * Creates the "Example" widgets.
+     */
+    void createExampleWidgets () {
+
+        /* Compute the widget style */
+        int style = getDefaultStyle();
+        if (pushButton.getSelection()) style |= DWT.PUSH;
+        if (checkButton.getSelection()) style |= DWT.CHECK;
+        if (radioButton.getSelection()) style |= DWT.RADIO;
+        if (toggleButton.getSelection()) style |= DWT.TOGGLE;
+        if (flatButton.getSelection()) style |= DWT.FLAT;
+        if (borderButton.getSelection()) style |= DWT.BORDER;
+        if (leftButton.getSelection()) style |= DWT.LEFT;
+        if (rightButton.getSelection()) style |= DWT.RIGHT;
+        if (arrowButton.getSelection()) {
+            style |= DWT.ARROW;
+            if (upButton.getSelection()) style |= DWT.UP;
+            if (downButton.getSelection()) style |= DWT.DOWN;
+        } else {
+            if (centerButton.getSelection()) style |= DWT.CENTER;
+        }
+
+        /* Create the example widgets */
+        button1 = new Button(textButtonGroup, style);
+        button1.setText(ControlExample.getResourceString("One"));
+        button2 = new Button(textButtonGroup, style);
+        button2.setText(ControlExample.getResourceString("Two"));
+        button3 = new Button(textButtonGroup, style);
+        button3.setText(ControlExample.getResourceString("Three"));
+        button4 = new Button(imageButtonGroup, style);
+        button4.setImage(instance.images[ControlExample.ciClosedFolder]);
+        button5 = new Button(imageButtonGroup, style);
+        button5.setImage(instance.images[ControlExample.ciOpenFolder]);
+        button6 = new Button(imageButtonGroup, style);
+        button6.setImage(instance.images[ControlExample.ciTarget]);
+        button7 = new Button(imagetextButtonGroup, style);
+        button7.setText(ControlExample.getResourceString("One"));
+        button7.setImage(instance.images[ControlExample.ciClosedFolder]);
+        button8 = new Button(imagetextButtonGroup, style);
+        button8.setText(ControlExample.getResourceString("Two"));
+        button8.setImage(instance.images[ControlExample.ciOpenFolder]);
+        button9 = new Button(imagetextButtonGroup, style);
+        button9.setText(ControlExample.getResourceString("Three"));
+        button9.setImage(instance.images[ControlExample.ciTarget]);
+    }
+
+    /**
+     * Creates the "Style" group.
+     */
+    void createStyleGroup() {
+        super.createStyleGroup ();
+
+        /* Create the extra widgets */
+        pushButton = new Button (styleGroup, DWT.RADIO);
+        pushButton.setText("DWT.PUSH");
+        checkButton = new Button (styleGroup, DWT.RADIO);
+        checkButton.setText ("DWT.CHECK");
+        radioButton = new Button (styleGroup, DWT.RADIO);
+        radioButton.setText ("DWT.RADIO");
+        toggleButton = new Button (styleGroup, DWT.RADIO);
+        toggleButton.setText ("DWT.TOGGLE");
+        arrowButton = new Button (styleGroup, DWT.RADIO);
+        arrowButton.setText ("DWT.ARROW");
+        flatButton = new Button (styleGroup, DWT.CHECK);
+        flatButton.setText ("DWT.FLAT");
+        borderButton = new Button (styleGroup, DWT.CHECK);
+        borderButton.setText ("DWT.BORDER");
+    }
+
+    /**
+     * Gets the "Example" widget children.
+     */
+    Widget [] getExampleWidgets () {
+        return [ cast(Widget) button1, button2, button3, button4, button5, button6, button7, button8, button9 ];
+    }
+
+    /**
+     * Returns a list of set/get API method names (without the set/get prefix)
+     * that can be used to set/get values in the example control(s).
+     */
+    char[][] getMethodNames() {
+        return [ cast(char[])"Selection", "Text", "ToolTipText" ];
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    char[] getTabText () {
+        return "Button";
+    }
+
+    /**
+     * Sets the alignment of the "Example" widgets.
+     */
+    void setExampleWidgetAlignment () {
+        int alignment = 0;
+        if (leftButton.getSelection ()) alignment = DWT.LEFT;
+        if (centerButton.getSelection ()) alignment = DWT.CENTER;
+        if (rightButton.getSelection ()) alignment = DWT.RIGHT;
+        if (upButton.getSelection ()) alignment = DWT.UP;
+        if (downButton.getSelection ()) alignment = DWT.DOWN;
+        button1.setAlignment (alignment);
+        button2.setAlignment (alignment);
+        button3.setAlignment (alignment);
+        button4.setAlignment (alignment);
+        button5.setAlignment (alignment);
+        button6.setAlignment (alignment);
+        button7.setAlignment (alignment);
+        button8.setAlignment (alignment);
+        button9.setAlignment (alignment);
+    }
+
+    /**
+     * Sets the state of the "Example" widgets.
+     */
+    void setExampleWidgetState () {
+        super.setExampleWidgetState ();
+        if (arrowButton.getSelection ()) {
+            upButton.setEnabled (true);
+            centerButton.setEnabled (false);
+            downButton.setEnabled (true);
+        } else {
+            upButton.setEnabled (false);
+            centerButton.setEnabled (true);
+            downButton.setEnabled (false);
+        }
+        upButton.setSelection ((button1.getStyle () & DWT.UP) !is 0);
+        downButton.setSelection ((button1.getStyle () & DWT.DOWN) !is 0);
+        pushButton.setSelection ((button1.getStyle () & DWT.PUSH) !is 0);
+        checkButton.setSelection ((button1.getStyle () & DWT.CHECK) !is 0);
+        radioButton.setSelection ((button1.getStyle () & DWT.RADIO) !is 0);
+        toggleButton.setSelection ((button1.getStyle () & DWT.TOGGLE) !is 0);
+        arrowButton.setSelection ((button1.getStyle () & DWT.ARROW) !is 0);
+        flatButton.setSelection ((button1.getStyle () & DWT.FLAT) !is 0);
+        borderButton.setSelection ((button1.getStyle () & DWT.BORDER) !is 0);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/controlexample/CComboTab.d	Mon Jan 21 01:40:01 2008 +0100
@@ -0,0 +1,127 @@
+/*******************************************************************************
+ * 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
+ *******************************************************************************/
+module dwtexamples.controlexample.CComboTab;
+
+
+
+import dwt.DWT;
+import dwt.custom.CCombo;
+import dwt.layout.GridData;
+import dwt.layout.GridLayout;
+import dwt.widgets.Button;
+import dwt.widgets.Group;
+import dwt.widgets.Widget;
+
+class CComboTab : Tab {
+
+    /* Example widgets and groups that contain them */
+    CCombo combo1;
+    Group comboGroup;
+
+    /* Style widgets added to the "Style" group */
+    Button flatButton, readOnlyButton;
+
+    static String [] ListData = {ControlExample.getResourceString("ListData1_0"),
+                                 ControlExample.getResourceString("ListData1_1"),
+                                 ControlExample.getResourceString("ListData1_2"),
+                                 ControlExample.getResourceString("ListData1_3"),
+                                 ControlExample.getResourceString("ListData1_4"),
+                                 ControlExample.getResourceString("ListData1_5"),
+                                 ControlExample.getResourceString("ListData1_6"),
+                                 ControlExample.getResourceString("ListData1_7"),
+                                 ControlExample.getResourceString("ListData1_8")};
+
+    /**
+     * Creates the Tab within a given instance of ControlExample.
+     */
+    CComboTab(ControlExample instance) {
+        super(instance);
+    }
+
+    /**
+     * Creates the "Example" group.
+     */
+    void createExampleGroup () {
+        super.createExampleGroup ();
+
+        /* Create a group for the combo box */
+        comboGroup = new Group (exampleGroup, DWT.NONE);
+        comboGroup.setLayout (new GridLayout ());
+        comboGroup.setLayoutData (new GridData (DWT.FILL, DWT.FILL, true, true));
+        comboGroup.setText (ControlExample.getResourceString("Custom_Combo"));
+    }
+
+    /**
+     * Creates the "Example" widgets.
+     */
+    void createExampleWidgets () {
+
+        /* Compute the widget style */
+        int style = getDefaultStyle();
+        if (flatButton.getSelection ()) style |= DWT.FLAT;
+        if (readOnlyButton.getSelection ()) style |= DWT.READ_ONLY;
+        if (borderButton.getSelection ()) style |= DWT.BORDER;
+
+        /* Create the example widgets */
+        combo1 = new CCombo (comboGroup, style);
+        combo1.setItems (ListData);
+        if (ListData.length >= 3) {
+            combo1.setText(ListData [2]);
+        }
+    }
+
+    /**
+     * Creates the "Style" group.
+     */
+    void createStyleGroup () {
+        super.createStyleGroup ();
+
+        /* Create the extra widgets */
+        readOnlyButton = new Button (styleGroup, DWT.CHECK);
+        readOnlyButton.setText ("DWT.READ_ONLY");
+        borderButton = new Button (styleGroup, DWT.CHECK);
+        borderButton.setText ("DWT.BORDER");
+        flatButton = new Button (styleGroup, DWT.CHECK);
+        flatButton.setText ("DWT.FLAT");
+    }
+
+    /**
+     * Gets the "Example" widget children.
+     */
+    Widget [] getExampleWidgets () {
+        return new Widget [] {combo1};
+    }
+
+    /**
+     * Returns a list of set/get API method names (without the set/get prefix)
+     * that can be used to set/get values in the example control(s).
+     */
+    String[] getMethodNames() {
+        return new String[] {"Editable", "Items", "Selection", "Text", "TextLimit", "ToolTipText", "VisibleItemCount"};
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    String getTabText () {
+        return "CCombo";
+    }
+
+    /**
+     * Sets the state of the "Example" widgets.
+     */
+    void setExampleWidgetState () {
+        super.setExampleWidgetState ();
+        flatButton.setSelection ((combo1.getStyle () & DWT.FLAT) !is 0);
+        readOnlyButton.setSelection ((combo1.getStyle () & DWT.READ_ONLY) !is 0);
+        borderButton.setSelection ((combo1.getStyle () & DWT.BORDER) !is 0);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/controlexample/CLabelTab.d	Mon Jan 21 01:40:01 2008 +0100
@@ -0,0 +1,139 @@
+/*******************************************************************************
+ * 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
+ *******************************************************************************/
+module dwtexamples.controlexample.CLabelTab;
+
+
+
+import dwt.DWT;
+import dwt.custom.CLabel;
+import dwt.layout.GridData;
+import dwt.layout.GridLayout;
+import dwt.widgets.Button;
+import dwt.widgets.Group;
+import dwt.widgets.Widget;
+
+class CLabelTab : AlignableTab {
+    /* Example widgets and groups that contain them */
+    CLabel label1, label2, label3;
+    Group textLabelGroup;
+
+    /* Style widgets added to the "Style" group */
+    Button shadowInButton, shadowOutButton, shadowNoneButton;
+
+    /**
+     * Creates the Tab within a given instance of ControlExample.
+     */
+    CLabelTab(ControlExample instance) {
+        super(instance);
+    }
+
+    /**
+     * Creates the "Example" group.
+     */
+    void createExampleGroup () {
+        super.createExampleGroup ();
+
+        /* Create a group for the text labels */
+        textLabelGroup = new Group(exampleGroup, DWT.NONE);
+        GridLayout gridLayout = new GridLayout ();
+        textLabelGroup.setLayout (gridLayout);
+        gridLayout.numColumns = 3;
+        textLabelGroup.setLayoutData (new GridData (DWT.FILL, DWT.FILL, true, true));
+        textLabelGroup.setText (ControlExample.getResourceString("Custom_Labels"));
+    }
+
+    /**
+     * Creates the "Example" widgets.
+     */
+    void createExampleWidgets () {
+
+        /* Compute the widget style */
+        int style = getDefaultStyle();
+        if (shadowInButton.getSelection ()) style |= DWT.SHADOW_IN;
+        if (shadowNoneButton.getSelection ()) style |= DWT.SHADOW_NONE;
+        if (shadowOutButton.getSelection ()) style |= DWT.SHADOW_OUT;
+        if (leftButton.getSelection ()) style |= DWT.LEFT;
+        if (centerButton.getSelection ()) style |= DWT.CENTER;
+        if (rightButton.getSelection ()) style |= DWT.RIGHT;
+
+        /* Create the example widgets */
+        label1 = new CLabel (textLabelGroup, style);
+        label1.setText(ControlExample.getResourceString("One"));
+        label1.setImage (instance.images[ControlExample.ciClosedFolder]);
+        label2 = new CLabel (textLabelGroup, style);
+        label2.setImage (instance.images[ControlExample.ciTarget]);
+        label3 = new CLabel (textLabelGroup, style);
+        label3.setText(ControlExample.getResourceString("Example_string") + "\n" + ControlExample.getResourceString("One_Two_Three"));
+    }
+
+    /**
+     * Creates the "Style" group.
+     */
+    void createStyleGroup() {
+        super.createStyleGroup ();
+
+        /* Create the extra widgets */
+        shadowNoneButton = new Button (styleGroup, DWT.RADIO);
+        shadowNoneButton.setText ("DWT.SHADOW_NONE");
+        shadowInButton = new Button (styleGroup, DWT.RADIO);
+        shadowInButton.setText ("DWT.SHADOW_IN");
+        shadowOutButton = new Button (styleGroup, DWT.RADIO);
+        shadowOutButton.setText ("DWT.SHADOW_OUT");
+    }
+
+    /**
+     * Gets the "Example" widget children.
+     */
+    Widget [] getExampleWidgets () {
+        return new Widget [] {label1, label2, label3};
+    }
+
+    /**
+     * Returns a list of set/get API method names (without the set/get prefix)
+     * that can be used to set/get values in the example control(s).
+     */
+    String[] getMethodNames() {
+        return new String[] {"Text", "ToolTipText"};
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    String getTabText () {
+        return "CLabel";
+    }
+
+    /**
+     * Sets the alignment of the "Example" widgets.
+     */
+    void setExampleWidgetAlignment () {
+        int alignment = 0;
+        if (leftButton.getSelection ()) alignment = DWT.LEFT;
+        if (centerButton.getSelection ()) alignment = DWT.CENTER;
+        if (rightButton.getSelection ()) alignment = DWT.RIGHT;
+        label1.setAlignment (alignment);
+        label2.setAlignment (alignment);
+        label3.setAlignment (alignment);
+    }
+
+    /**
+     * Sets the state of the "Example" widgets.
+     */
+    void setExampleWidgetState () {
+        super.setExampleWidgetState ();
+        leftButton.setSelection ((label1.getStyle () & DWT.LEFT) !is 0);
+        centerButton.setSelection ((label1.getStyle () & DWT.CENTER) !is 0);
+        rightButton.setSelection ((label1.getStyle () & DWT.RIGHT) !is 0);
+        shadowInButton.setSelection ((label1.getStyle () & DWT.SHADOW_IN) !is 0);
+        shadowOutButton.setSelection ((label1.getStyle () & DWT.SHADOW_OUT) !is 0);
+        shadowNoneButton.setSelection ((label1.getStyle () & (DWT.SHADOW_IN | DWT.SHADOW_OUT)) is 0);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/controlexample/CTabFolderTab.d	Mon Jan 21 01:40:01 2008 +0100
@@ -0,0 +1,465 @@
+/*******************************************************************************
+ * 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
+ *******************************************************************************/
+module dwtexamples.controlexample.CTabFolderTab;
+
+
+
+import dwt.DWT;
+import dwt.custom.CTabFolder;
+import dwt.custom.CTabFolder2Adapter;
+import dwt.custom.CTabFolderEvent;
+import dwt.custom.CTabItem;
+import dwt.events.DisposeEvent;
+import dwt.events.DisposeListener;
+import dwt.events.SelectionAdapter;
+import dwt.events.SelectionEvent;
+import dwt.graphics.Color;
+import dwt.graphics.Font;
+import dwt.graphics.FontData;
+import dwt.graphics.Image;
+import dwt.graphics.RGB;
+import dwt.layout.GridData;
+import dwt.layout.GridLayout;
+import dwt.widgets.Button;
+import dwt.widgets.Event;
+import dwt.widgets.Group;
+import dwt.widgets.Item;
+import dwt.widgets.Listener;
+import dwt.widgets.TableItem;
+import dwt.widgets.Text;
+import dwt.widgets.Widget;
+
+class CTabFolderTab : Tab {
+    int lastSelectedTab = 0;
+
+    /* Example widgets and groups that contain them */
+    CTabFolder tabFolder1;
+    Group tabFolderGroup, itemGroup;
+
+    /* Style widgets added to the "Style" group */
+    Button topButton, bottomButton, flatButton, closeButton;
+
+    static String [] CTabItems1 = {ControlExample.getResourceString("CTabItem1_0"),
+                                  ControlExample.getResourceString("CTabItem1_1"),
+                                  ControlExample.getResourceString("CTabItem1_2")};
+
+    /* Controls and resources added to the "Fonts" group */
+    static final int SELECTION_FOREGROUND_COLOR = 3;
+    static final int SELECTION_BACKGROUND_COLOR = 4;
+    static final int ITEM_FONT = 5;
+    Color selectionForegroundColor, selectionBackgroundColor;
+    Font itemFont;
+
+    /* Other widgets added to the "Other" group */
+    Button simpleTabButton, singleTabButton, imageButton, showMinButton, showMaxButton, unselectedCloseButton, unselectedImageButton;
+
+    /**
+     * Creates the Tab within a given instance of ControlExample.
+     */
+    this(ControlExample instance) {
+        super(instance);
+    }
+
+    /**
+     * Creates the "Colors and Fonts" group.
+     */
+    void createColorAndFontGroup () {
+        super.createColorAndFontGroup();
+
+        TableItem item = new TableItem(colorAndFontTable, DWT.None);
+        item.setText(ControlExample.getResourceString ("Selection_Foreground_Color"));
+        item = new TableItem(colorAndFontTable, DWT.None);
+        item.setText(ControlExample.getResourceString ("Selection_Background_Color"));
+        item = new TableItem(colorAndFontTable, DWT.None);
+        item.setText(ControlExample.getResourceString ("Item_Font"));
+
+        shell.addDisposeListener(new DisposeListener() {
+            public void widgetDisposed(DisposeEvent event) {
+                if (selectionBackgroundColor !is null) selectionBackgroundColor.dispose();
+                if (selectionForegroundColor !is null) selectionForegroundColor.dispose();
+                if (itemFont !is null) itemFont.dispose();
+                selectionBackgroundColor = null;
+                selectionForegroundColor = null;
+                itemFont = null;
+            }
+        });
+    }
+
+    void changeFontOrColor(int index) {
+        switch (index) {
+            case SELECTION_FOREGROUND_COLOR: {
+                Color oldColor = selectionForegroundColor;
+                if (oldColor is null) oldColor = tabFolder1.getSelectionForeground();
+                colorDialog.setRGB(oldColor.getRGB());
+                RGB rgb = colorDialog.open();
+                if (rgb is null) return;
+                oldColor = selectionForegroundColor;
+                selectionForegroundColor = new Color (display, rgb);
+                setSelectionForeground ();
+                if (oldColor !is null) oldColor.dispose ();
+            }
+            break;
+            case SELECTION_BACKGROUND_COLOR: {
+                Color oldColor = selectionBackgroundColor;
+                if (oldColor is null) oldColor = tabFolder1.getSelectionBackground();
+                colorDialog.setRGB(oldColor.getRGB());
+                RGB rgb = colorDialog.open();
+                if (rgb is null) return;
+                oldColor = selectionBackgroundColor;
+                selectionBackgroundColor = new Color (display, rgb);
+                setSelectionBackground ();
+                if (oldColor !is null) oldColor.dispose ();
+            }
+            break;
+            case ITEM_FONT: {
+                Font oldFont = itemFont;
+                if (oldFont is null) oldFont = tabFolder1.getItem (0).getFont ();
+                fontDialog.setFontList(oldFont.getFontData());
+                FontData fontData = fontDialog.open ();
+                if (fontData is null) return;
+                oldFont = itemFont;
+                itemFont = new Font (display, fontData);
+                setItemFont ();
+                setExampleWidgetSize ();
+                if (oldFont !is null) oldFont.dispose ();
+            }
+            break;
+            default:
+                super.changeFontOrColor(index);
+        }
+    }
+
+    /**
+     * Creates the "Other" group.
+     */
+    void createOtherGroup () {
+        super.createOtherGroup ();
+
+        /* Create display controls specific to this example */
+        simpleTabButton = new Button (otherGroup, DWT.CHECK);
+        simpleTabButton.setText (ControlExample.getResourceString("Set_Simple_Tabs"));
+        simpleTabButton.setSelection(true);
+        simpleTabButton.addSelectionListener (new SelectionAdapter () {
+            public void widgetSelected (SelectionEvent event) {
+                setSimpleTabs();
+            }
+        });
+
+        singleTabButton = new Button (otherGroup, DWT.CHECK);
+        singleTabButton.setText (ControlExample.getResourceString("Set_Single_Tabs"));
+        singleTabButton.setSelection(false);
+        singleTabButton.addSelectionListener (new SelectionAdapter () {
+            public void widgetSelected (SelectionEvent event) {
+                setSingleTabs();
+            }
+        });
+
+        showMinButton = new Button (otherGroup, DWT.CHECK);
+        showMinButton.setText (ControlExample.getResourceString("Set_Min_Visible"));
+        showMinButton.setSelection(false);
+        showMinButton.addSelectionListener (new SelectionAdapter () {
+            public void widgetSelected (SelectionEvent event) {
+                setMinimizeVisible();
+            }
+        });
+
+        showMaxButton = new Button (otherGroup, DWT.CHECK);
+        showMaxButton.setText (ControlExample.getResourceString("Set_Max_Visible"));
+        showMaxButton.setSelection(false);
+        showMaxButton.addSelectionListener (new SelectionAdapter () {
+            public void widgetSelected (SelectionEvent event) {
+                setMaximizeVisible();
+            }
+        });
+
+        imageButton = new Button (otherGroup, DWT.CHECK);
+        imageButton.setText (ControlExample.getResourceString("Set_Image"));
+        imageButton.addSelectionListener (new SelectionAdapter () {
+            public void widgetSelected (SelectionEvent event) {
+                setImages();
+            }
+        });
+
+        unselectedImageButton = new Button (otherGroup, DWT.CHECK);
+        unselectedImageButton.setText (ControlExample.getResourceString("Set_Unselected_Image_Visible"));
+        unselectedImageButton.setSelection(true);
+        unselectedImageButton.addSelectionListener (new SelectionAdapter () {
+            public void widgetSelected (SelectionEvent event) {
+                setUnselectedImageVisible();
+            }
+        });
+        unselectedCloseButton = new Button (otherGroup, DWT.CHECK);
+        unselectedCloseButton.setText (ControlExample.getResourceString("Set_Unselected_Close_Visible"));
+        unselectedCloseButton.setSelection(true);
+        unselectedCloseButton.addSelectionListener (new SelectionAdapter () {
+            public void widgetSelected (SelectionEvent event) {
+                setUnselectedCloseVisible();
+            }
+        });
+    }
+
+    /**
+     * Creates the "Example" group.
+     */
+    void createExampleGroup () {
+        super.createExampleGroup ();
+
+        /* Create a group for the CTabFolder */
+        tabFolderGroup = new Group (exampleGroup, DWT.NONE);
+        tabFolderGroup.setLayout (new GridLayout ());
+        tabFolderGroup.setLayoutData (new GridData (DWT.FILL, DWT.FILL, true, true));
+        tabFolderGroup.setText ("CTabFolder");
+    }
+
+    /**
+     * Creates the "Example" widgets.
+     */
+    void createExampleWidgets () {
+
+        /* Compute the widget style */
+        int style = getDefaultStyle();
+        if (topButton.getSelection ()) style |= DWT.TOP;
+        if (bottomButton.getSelection ()) style |= DWT.BOTTOM;
+        if (borderButton.getSelection ()) style |= DWT.BORDER;
+        if (flatButton.getSelection ()) style |= DWT.FLAT;
+        if (closeButton.getSelection ()) style |= DWT.CLOSE;
+
+        /* Create the example widgets */
+        tabFolder1 = new CTabFolder (tabFolderGroup, style);
+        for (int i = 0; i < CTabItems1.length; i++) {
+            CTabItem item = new CTabItem(tabFolder1, DWT.NONE);
+            item.setText(CTabItems1[i]);
+            Text text = new Text(tabFolder1, DWT.READ_ONLY);
+            text.setText(ControlExample.getResourceString("CTabItem_content") + ": " + i);
+            item.setControl(text);
+        }
+        tabFolder1.addListener(DWT.Selection, new Listener() {
+            public void handleEvent(Event event) {
+                lastSelectedTab = tabFolder1.getSelectionIndex();
+            }
+        });
+        tabFolder1.setSelection(lastSelectedTab);
+    }
+
+    /**
+     * Creates the "Style" group.
+     */
+    void createStyleGroup() {
+        super.createStyleGroup ();
+
+        /* Create the extra widgets */
+        topButton = new Button (styleGroup, DWT.RADIO);
+        topButton.setText ("DWT.TOP");
+        topButton.setSelection(true);
+        bottomButton = new Button (styleGroup, DWT.RADIO);
+        bottomButton.setText ("DWT.BOTTOM");
+        borderButton = new Button (styleGroup, DWT.CHECK);
+        borderButton.setText ("DWT.BORDER");
+        flatButton = new Button (styleGroup, DWT.CHECK);
+        flatButton.setText ("DWT.FLAT");
+        closeButton = new Button (styleGroup, DWT.CHECK);
+        closeButton.setText ("DWT.CLOSE");
+    }
+
+    /**
+     * Gets the list of custom event names.
+     *
+     * @return an array containing custom event names
+     */
+    String [] getCustomEventNames () {
+        return new String [] {"CTabFolderEvent"};
+    }
+
+    /**
+     * Gets the "Example" widget children's items, if any.
+     *
+     * @return an array containing the example widget children's items
+     */
+    Item [] getExampleWidgetItems () {
+        return tabFolder1.getItems();
+    }
+
+    /**
+     * Gets the "Example" widget children.
+     */
+    Widget [] getExampleWidgets () {
+        return new Widget [] {tabFolder1};
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    String getTabText () {
+        return "CTabFolder";
+    }
+
+    /**
+     * Hooks the custom listener specified by eventName.
+     */
+    void hookCustomListener (final String eventName) {
+        if (eventName is "CTabFolderEvent") {
+            tabFolder1.addCTabFolder2Listener (new CTabFolder2Adapter () {
+                public void close (CTabFolderEvent event) {
+                    log (eventName, event);
+                }
+            });
+        }
+    }
+
+    /**
+     * Sets the foreground color, background color, and font
+     * of the "Example" widgets to their default settings.
+     * Also sets foreground and background color of the Node 1
+     * TreeItems to default settings.
+     */
+    void resetColorsAndFonts () {
+        super.resetColorsAndFonts ();
+        Color oldColor = selectionForegroundColor;
+        selectionForegroundColor = null;
+        setSelectionForeground ();
+        if (oldColor !is null) oldColor.dispose();
+        oldColor = selectionBackgroundColor;
+        selectionBackgroundColor = null;
+        setSelectionBackground ();
+        if (oldColor !is null) oldColor.dispose();
+        Font oldFont = itemFont;
+        itemFont = null;
+        setItemFont ();
+        if (oldFont !is null) oldFont.dispose();
+    }
+
+    /**
+     * Sets the state of the "Example" widgets.
+     */
+    void setExampleWidgetState () {
+        super.setExampleWidgetState();
+        setSimpleTabs();
+        setSingleTabs();
+        setImages();
+        setMinimizeVisible();
+        setMaximizeVisible();
+        setUnselectedCloseVisible();
+        setUnselectedImageVisible();
+        setSelectionBackground ();
+        setSelectionForeground ();
+        setItemFont ();
+        setExampleWidgetSize();
+    }
+
+    /**
+     * Sets the shape that the CTabFolder will use to render itself.
+     */
+    void setSimpleTabs () {
+        tabFolder1.setSimple (simpleTabButton.getSelection ());
+        setExampleWidgetSize();
+    }
+
+    /**
+     * Sets the number of tabs that the CTabFolder should display.
+     */
+    void setSingleTabs () {
+        tabFolder1.setSingle (singleTabButton.getSelection ());
+        setExampleWidgetSize();
+    }
+    /**
+     * Sets an image into each item of the "Example" widgets.
+     */
+    void setImages () {
+        bool setImage = imageButton.getSelection ();
+        CTabItem items[] = tabFolder1.getItems ();
+        for (int i = 0; i < items.length; i++) {
+            if (setImage) {
+                items[i].setImage (instance.images[ControlExample.ciClosedFolder]);
+            } else {
+                items[i].setImage (null);
+            }
+        }
+        setExampleWidgetSize ();
+    }
+    /**
+     * Sets the visibility of the minimize button
+     */
+    void setMinimizeVisible () {
+        tabFolder1.setMinimizeVisible(showMinButton.getSelection ());
+        setExampleWidgetSize();
+    }
+    /**
+     * Sets the visibility of the maximize button
+     */
+    void setMaximizeVisible () {
+        tabFolder1.setMaximizeVisible(showMaxButton.getSelection ());
+        setExampleWidgetSize();
+    }
+    /**
+     * Sets the visibility of the close button on unselected tabs
+     */
+    void setUnselectedCloseVisible () {
+        tabFolder1.setUnselectedCloseVisible(unselectedCloseButton.getSelection ());
+        setExampleWidgetSize();
+    }
+    /**
+     * Sets the visibility of the image on unselected tabs
+     */
+    void setUnselectedImageVisible () {
+        tabFolder1.setUnselectedImageVisible(unselectedImageButton.getSelection ());
+        setExampleWidgetSize();
+    }
+    /**
+     * Sets the background color of CTabItem 0.
+     */
+    void setSelectionBackground () {
+        if (!instance.startup) {
+            tabFolder1.setSelectionBackground(selectionBackgroundColor);
+        }
+        // Set the selection background item's image to match the background color of the selection.
+        Color color = selectionBackgroundColor;
+        if (color is null) color = tabFolder1.getSelectionBackground ();
+        TableItem item = colorAndFontTable.getItem(SELECTION_BACKGROUND_COLOR);
+        Image oldImage = item.getImage();
+        if (oldImage !is null) oldImage.dispose();
+        item.setImage (colorImage(color));
+    }
+
+    /**
+     * Sets the foreground color of CTabItem 0.
+     */
+    void setSelectionForeground () {
+        if (!instance.startup) {
+            tabFolder1.setSelectionForeground(selectionForegroundColor);
+        }
+        // Set the selection foreground item's image to match the foreground color of the selection.
+        Color color = selectionForegroundColor;
+        if (color is null) color = tabFolder1.getSelectionForeground ();
+        TableItem item = colorAndFontTable.getItem(SELECTION_FOREGROUND_COLOR);
+        Image oldImage = item.getImage();
+        if (oldImage !is null) oldImage.dispose();
+        item.setImage (colorImage(color));
+    }
+
+    /**
+     * Sets the font of CTabItem 0.
+     */
+    void setItemFont () {
+        if (!instance.startup) {
+            tabFolder1.getItem (0).setFont (itemFont);
+            setExampleWidgetSize();
+        }
+        /* Set the font item's image to match the font of the item. */
+        Font ft = itemFont;
+        if (ft is null) ft = tabFolder1.getItem (0).getFont ();
+        TableItem item = colorAndFontTable.getItem(ITEM_FONT);
+        Image oldImage = item.getImage();
+        if (oldImage !is null) oldImage.dispose();
+        item.setImage (fontImage(ft));
+        item.setFont(ft);
+        colorAndFontTable.layout ();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/controlexample/CanvasTab.d	Mon Jan 21 01:40:01 2008 +0100
@@ -0,0 +1,330 @@
+/*******************************************************************************
+ * 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
+ *******************************************************************************/
+module dwtexamples.controlexample.CanvasTab;
+
+
+
+import dwt.DWT;
+import dwt.events.ControlAdapter;
+import dwt.events.ControlEvent;
+import dwt.events.PaintEvent;
+import dwt.events.PaintListener;
+import dwt.events.SelectionAdapter;
+import dwt.events.SelectionEvent;
+import dwt.graphics.Color;
+import dwt.graphics.Font;
+import dwt.graphics.GC;
+import dwt.graphics.Point;
+import dwt.graphics.Rectangle;
+import dwt.layout.GridData;
+import dwt.layout.GridLayout;
+import dwt.widgets.Button;
+import dwt.widgets.Canvas;
+import dwt.widgets.Caret;
+import dwt.widgets.Composite;
+import dwt.widgets.Group;
+import dwt.widgets.ScrollBar;
+import dwt.widgets.TabFolder;
+import dwt.widgets.Widget;
+
+class CanvasTab : Tab {
+    static final int colors [] = {
+        DWT.COLOR_RED,
+        DWT.COLOR_GREEN,
+        DWT.COLOR_BLUE,
+        DWT.COLOR_MAGENTA,
+        DWT.COLOR_YELLOW,
+        DWT.COLOR_CYAN,
+        DWT.COLOR_DARK_RED,
+        DWT.COLOR_DARK_GREEN,
+        DWT.COLOR_DARK_BLUE,
+        DWT.COLOR_DARK_MAGENTA,
+        DWT.COLOR_DARK_YELLOW,
+        DWT.COLOR_DARK_CYAN
+    };
+    static final String canvasString = "Canvas"; //$NON-NLS-1$
+
+    /* Example widgets and groups that contain them */
+    Canvas canvas;
+    Group canvasGroup;
+
+    /* Style widgets added to the "Style" group */
+    Button horizontalButton, verticalButton, noBackgroundButton, noFocusButton,
+    noMergePaintsButton, noRedrawResizeButton, doubleBufferedButton;
+
+    /* Other widgets added to the "Other" group */
+    Button caretButton, fillDamageButton;
+
+    int paintCount;
+    int cx, cy;
+    int maxX, maxY;
+
+    /**
+     * Creates the Tab within a given instance of ControlExample.
+     */
+    CanvasTab(ControlExample instance) {
+        super(instance);
+    }
+
+    /**
+     * Creates the "Other" group.
+     */
+    void createOtherGroup () {
+        super.createOtherGroup ();
+
+        /* Create display controls specific to this example */
+        caretButton = new Button (otherGroup, DWT.CHECK);
+        caretButton.setText (ControlExample.getResourceString("Caret"));
+        fillDamageButton = new Button (otherGroup, DWT.CHECK);
+        fillDamageButton.setText (ControlExample.getResourceString("FillDamage"));
+
+        /* Add the listeners */
+        caretButton.addSelectionListener (new SelectionAdapter () {
+            public void widgetSelected (SelectionEvent event) {
+                setCaret ();
+            }
+        });
+    }
+
+    /**
+     * Creates the "Example" group.
+     */
+    void createExampleGroup () {
+        super.createExampleGroup ();
+
+        /* Create a group for the canvas widget */
+        canvasGroup = new Group (exampleGroup, DWT.NONE);
+        canvasGroup.setLayout (new GridLayout ());
+        canvasGroup.setLayoutData (new GridData (DWT.FILL, DWT.FILL, true, true));
+        canvasGroup.setText ("Canvas");
+    }
+
+    /**
+     * Creates the "Example" widgets.
+     */
+    void createExampleWidgets () {
+
+        /* Compute the widget style */
+        int style = getDefaultStyle();
+        if (horizontalButton.getSelection ()) style |= DWT.H_SCROLL;
+        if (verticalButton.getSelection ()) style |= DWT.V_SCROLL;
+        if (borderButton.getSelection ()) style |= DWT.BORDER;
+        if (noBackgroundButton.getSelection ()) style |= DWT.NO_BACKGROUND;
+        if (noFocusButton.getSelection ()) style |= DWT.NO_FOCUS;
+        if (noMergePaintsButton.getSelection ()) style |= DWT.NO_MERGE_PAINTS;
+        if (noRedrawResizeButton.getSelection ()) style |= DWT.NO_REDRAW_RESIZE;
+        if (doubleBufferedButton.getSelection ()) style |= DWT.DOUBLE_BUFFERED;
+
+        /* Create the example widgets */
+        paintCount = 0; cx = 0; cy = 0;
+        canvas = new Canvas (canvasGroup, style);
+        canvas.addPaintListener(new PaintListener () {
+            public void paintControl(PaintEvent e) {
+                paintCount++;
+                GC gc = e.gc;
+                if (fillDamageButton.getSelection ()) {
+                    Color color = e.display.getSystemColor (colors [paintCount % colors.length]);
+                    gc.setBackground(color);
+                    gc.fillRectangle(e.x, e.y, e.width, e.height);
+                }
+                Point size = canvas.getSize ();
+                gc.drawArc(cx + 1, cy + 1, size.x - 2, size.y - 2, 0, 360);
+                gc.drawRectangle(cx + (size.x - 10) / 2, cy + (size.y - 10) / 2, 10, 10);
+                Point extent = gc.textExtent(canvasString);
+                gc.drawString(canvasString, cx + (size.x - extent.x) / 2, cy - extent.y + (size.y - 10) / 2, true);
+            }
+        });
+        canvas.addControlListener(new ControlAdapter() {
+            public void controlResized(ControlEvent event) {
+                Point size = canvas.getSize ();
+                maxX = size.x * 3 / 2; maxY = size.y * 3 / 2;
+                resizeScrollBars ();
+            }
+        });
+        ScrollBar bar = canvas.getHorizontalBar();
+        if (bar !is null) {
+            hookListeners (bar);
+            bar.addSelectionListener(new SelectionAdapter() {
+                public void widgetSelected(SelectionEvent event) {
+                    scrollHorizontal ((ScrollBar)event.widget);
+                }
+            });
+        }
+        bar = canvas.getVerticalBar();
+        if (bar !is null) {
+            hookListeners (bar);
+            bar.addSelectionListener(new SelectionAdapter() {
+                public void widgetSelected(SelectionEvent event) {
+                    scrollVertical ((ScrollBar)event.widget);
+                }
+            });
+        }
+    }
+
+    /**
+     * Creates the "Style" group.
+     */
+    void createStyleGroup() {
+        super.createStyleGroup();
+
+        /* Create the extra widgets */
+        horizontalButton = new Button (styleGroup, DWT.CHECK);
+        horizontalButton.setText ("DWT.H_SCROLL");
+        horizontalButton.setSelection(true);
+        verticalButton = new Button (styleGroup, DWT.CHECK);
+        verticalButton.setText ("DWT.V_SCROLL");
+        verticalButton.setSelection(true);
+        borderButton = new Button (styleGroup, DWT.CHECK);
+        borderButton.setText ("DWT.BORDER");
+        noBackgroundButton = new Button (styleGroup, DWT.CHECK);
+        noBackgroundButton.setText ("DWT.NO_BACKGROUND");
+        noFocusButton = new Button (styleGroup, DWT.CHECK);
+        noFocusButton.setText ("DWT.NO_FOCUS");
+        noMergePaintsButton = new Button (styleGroup, DWT.CHECK);
+        noMergePaintsButton.setText ("DWT.NO_MERGE_PAINTS");
+        noRedrawResizeButton = new Button (styleGroup, DWT.CHECK);
+        noRedrawResizeButton.setText ("DWT.NO_REDRAW_RESIZE");
+        doubleBufferedButton = new Button (styleGroup, DWT.CHECK);
+        doubleBufferedButton.setText ("DWT.DOUBLE_BUFFERED");
+    }
+
+    /**
+     * Creates the tab folder page.
+     *
+     * @param tabFolder org.eclipse.swt.widgets.TabFolder
+     * @return the new page for the tab folder
+     */
+    Composite createTabFolderPage (TabFolder tabFolder) {
+        super.createTabFolderPage (tabFolder);
+
+        /*
+         * Add a resize listener to the tabFolderPage so that
+         * if the user types into the example widget to change
+         * its preferred size, and then resizes the shell, we
+         * recalculate the preferred size correctly.
+         */
+        tabFolderPage.addControlListener(new ControlAdapter() {
+            public void controlResized(ControlEvent e) {
+                setExampleWidgetSize ();
+            }
+        });
+
+        return tabFolderPage;
+    }
+
+    /**
+     * Gets the "Example" widget children.
+     */
+    Widget [] getExampleWidgets () {
+        return new Widget [] {canvas};
+    }
+
+    /**
+     * Returns a list of set/get API method names (without the set/get prefix)
+     * that can be used to set/get values in the example control(s).
+     */
+    String[] getMethodNames() {
+        return new String[] {"ToolTipText"};
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    String getTabText () {
+        return "Canvas";
+    }
+
+    /**
+     * Resizes the maximum and thumb of both scrollbars.
+     */
+    void resizeScrollBars () {
+        Rectangle clientArea = canvas.getClientArea();
+        ScrollBar bar = canvas.getHorizontalBar();
+        if (bar !is null) {
+            bar.setMaximum(maxX);
+            bar.setThumb(clientArea.width);
+            bar.setPageIncrement(clientArea.width);
+        }
+        bar = canvas.getVerticalBar();
+        if (bar !is null) {
+            bar.setMaximum(maxY);
+            bar.setThumb(clientArea.height);
+            bar.setPageIncrement(clientArea.height);
+        }
+    }
+
+    /**
+     * Scrolls the canvas horizontally.
+     *
+     * @param scrollBar
+     */
+    void scrollHorizontal (ScrollBar scrollBar) {
+        Rectangle bounds = canvas.getClientArea();
+        int x = -scrollBar.getSelection();
+        if (x + maxX < bounds.width) {
+            x = bounds.width - maxX;
+        }
+        canvas.scroll(x, cy, cx, cy, maxX, maxY, false);
+        cx = x;
+    }
+
+    /**
+     * Scrolls the canvas vertically.
+     *
+     * @param scrollBar
+     */
+    void scrollVertical (ScrollBar scrollBar) {
+        Rectangle bounds = canvas.getClientArea();
+        int y = -scrollBar.getSelection();
+        if (y + maxY < bounds.height) {
+            y = bounds.height - maxY;
+        }
+        canvas.scroll(cx, y, cx, cy, maxX, maxY, false);
+        cy = y;
+    }
+
+    /**
+     * Sets or clears the caret in the "Example" widget.
+     */
+    void setCaret () {
+        Caret oldCaret = canvas.getCaret ();
+        if (caretButton.getSelection ()) {
+            Caret newCaret = new Caret(canvas, DWT.NONE);
+            Font font = canvas.getFont();
+            newCaret.setFont(font);
+            GC gc = new GC(canvas);
+            gc.setFont(font);
+            newCaret.setBounds(1, 1, 1, gc.getFontMetrics().getHeight());
+            gc.dispose();
+            canvas.setCaret (newCaret);
+            canvas.setFocus();
+        } else {
+            canvas.setCaret (null);
+        }
+        if (oldCaret !is null) oldCaret.dispose ();
+    }
+
+    /**
+     * Sets the state of the "Example" widgets.
+     */
+    void setExampleWidgetState () {
+        super.setExampleWidgetState ();
+        horizontalButton.setSelection ((canvas.getStyle () & DWT.H_SCROLL) !is 0);
+        verticalButton.setSelection ((canvas.getStyle () & DWT.V_SCROLL) !is 0);
+        borderButton.setSelection ((canvas.getStyle () & DWT.BORDER) !is 0);
+        noBackgroundButton.setSelection ((canvas.getStyle () & DWT.NO_BACKGROUND) !is 0);
+        noFocusButton.setSelection ((canvas.getStyle () & DWT.NO_FOCUS) !is 0);
+        noMergePaintsButton.setSelection ((canvas.getStyle () & DWT.NO_MERGE_PAINTS) !is 0);
+        noRedrawResizeButton.setSelection ((canvas.getStyle () & DWT.NO_REDRAW_RESIZE) !is 0);
+        doubleBufferedButton.setSelection ((canvas.getStyle () & DWT.DOUBLE_BUFFERED) !is 0);
+        if (!instance.startup) setCaret ();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/controlexample/ComboTab.d	Mon Jan 21 01:40:01 2008 +0100
@@ -0,0 +1,156 @@
+/*******************************************************************************
+ * 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
+ *******************************************************************************/
+package dwtexamples.controlexample;
+
+
+
+import dwt.DWT;
+import dwt.events.ControlAdapter;
+import dwt.events.ControlEvent;
+import dwt.layout.GridData;
+import dwt.layout.GridLayout;
+import dwt.widgets.Button;
+import dwt.widgets.Combo;
+import dwt.widgets.Composite;
+import dwt.widgets.Group;
+import dwt.widgets.TabFolder;
+import dwt.widgets.Widget;
+
+class ComboTab extends Tab {
+
+    /* Example widgets and groups that contain them */
+    Combo combo1;
+    Group comboGroup;
+    
+    /* Style widgets added to the "Style" group */
+    Button dropDownButton, readOnlyButton, simpleButton;
+    
+    static String [] ListData = {ControlExample.getResourceString("ListData0_0"),
+                                 ControlExample.getResourceString("ListData0_1"),
+                                 ControlExample.getResourceString("ListData0_2"),
+                                 ControlExample.getResourceString("ListData0_3"),
+                                 ControlExample.getResourceString("ListData0_4"),
+                                 ControlExample.getResourceString("ListData0_5"),
+                                 ControlExample.getResourceString("ListData0_6"),
+                                 ControlExample.getResourceString("ListData0_7"),
+                                 ControlExample.getResourceString("ListData0_8")};
+
+    /**
+     * Creates the Tab within a given instance of ControlExample.
+     */
+    ComboTab(ControlExample instance) {
+        super(instance);
+    }
+    
+    /**
+     * Creates the "Example" group.
+     */
+    void createExampleGroup () {
+        super.createExampleGroup ();
+        
+        /* Create a group for the combo box */
+        comboGroup = new Group (exampleGroup, DWT.NONE);
+        comboGroup.setLayout (new GridLayout ());
+        comboGroup.setLayoutData (new GridData (DWT.FILL, DWT.FILL, true, true));
+        comboGroup.setText ("Combo");
+    }
+    
+    /**
+     * Creates the "Example" widgets.
+     */
+    void createExampleWidgets () {
+        
+        /* Compute the widget style */
+        int style = getDefaultStyle();
+        if (dropDownButton.getSelection ()) style |= DWT.DROP_DOWN;
+        if (readOnlyButton.getSelection ()) style |= DWT.READ_ONLY;
+        if (simpleButton.getSelection ()) style |= DWT.SIMPLE;
+        
+        /* Create the example widgets */
+        combo1 = new Combo (comboGroup, style);
+        combo1.setItems (ListData);
+        if (ListData.length >= 3) {
+            combo1.setText(ListData [2]);
+        }
+    }
+    
+    /**
+     * Creates the tab folder page.
+     *
+     * @param tabFolder org.eclipse.swt.widgets.TabFolder
+     * @return the new page for the tab folder
+     */
+    Composite createTabFolderPage (TabFolder tabFolder) {
+        super.createTabFolderPage (tabFolder);
+
+        /*
+         * Add a resize listener to the tabFolderPage so that
+         * if the user types into the example widget to change
+         * its preferred size, and then resizes the shell, we
+         * recalculate the preferred size correctly.
+         */
+        tabFolderPage.addControlListener(new ControlAdapter() {
+            public void controlResized(ControlEvent e) {
+                setExampleWidgetSize ();
+            }
+        });
+        
+        return tabFolderPage;
+    }
+
+    /**
+     * Creates the "Style" group.
+     */
+    void createStyleGroup () {
+        super.createStyleGroup ();
+    
+        /* Create the extra widgets */
+        dropDownButton = new Button (styleGroup, DWT.RADIO);
+        dropDownButton.setText ("DWT.DROP_DOWN");
+        simpleButton = new Button (styleGroup, DWT.RADIO);
+        simpleButton.setText("DWT.SIMPLE");
+        readOnlyButton = new Button (styleGroup, DWT.CHECK);
+        readOnlyButton.setText ("DWT.READ_ONLY");
+    }
+    
+    /**
+     * Gets the "Example" widget children.
+     */
+    Widget [] getExampleWidgets () {
+        return new Widget [] {combo1};
+    }
+    
+    /**
+     * Returns a list of set/get API method names (without the set/get prefix)
+     * that can be used to set/get values in the example control(s).
+     */
+    String[] getMethodNames() {
+        return new String[] {"Items", "Orientation", "Selection", "Text", "TextLimit", "ToolTipText", "VisibleItemCount"};
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    String getTabText () {
+        return "Combo";
+    }
+    
+    /**
+     * Sets the state of the "Example" widgets.
+     */
+    void setExampleWidgetState () {
+        super.setExampleWidgetState ();
+        dropDownButton.setSelection ((combo1.getStyle () & DWT.DROP_DOWN) !is 0);
+        simpleButton.setSelection ((combo1.getStyle () & DWT.SIMPLE) !is 0);
+        readOnlyButton.setSelection ((combo1.getStyle () & DWT.READ_ONLY) !is 0);
+        readOnlyButton.setEnabled(!simpleButton.getSelection());
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/controlexample/ControlExample.d	Mon Jan 21 01:40:01 2008 +0100
@@ -0,0 +1,308 @@
+/*******************************************************************************
+ * 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
+ *******************************************************************************/
+module dwtexamples.controlexample.ControlExample;
+
+pragma( msg, " === The ControlExample is work in progress ===" );
+
+
+/+
+import java.io.IOException;
+import java.io.InputStream;
+import java.text.MessageFormat;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
++/
+
+class MessageFormat {
+    char[] format( char[], ... );
+}
+
+import dwt.DWT;
+import dwt.graphics.Image;
+import dwt.graphics.ImageData;
+import dwt.graphics.Point;
+import dwt.graphics.Rectangle;
+import dwt.layout.FillLayout;
+import dwt.widgets.Composite;
+import dwt.widgets.Display;
+import dwt.widgets.Shell;
+import dwt.widgets.TabFolder;
+import dwt.widgets.TabItem;
+import dwt.dwthelper.ResourceBundle;
+
+
+import dwtexamples.controlexample.Tab;
+import dwtexamples.controlexample.ButtonTab;
+/+
+import dwtexamples.controlexample.CanvasTab;
+import dwtexamples.controlexample.ComboTab;
+import dwtexamples.controlexample.CoolBarTab;
+import dwtexamples.controlexample.DateTimeTab;
+import dwtexamples.controlexample.DialogTab;
+import dwtexamples.controlexample.ExpandBarTab;
+import dwtexamples.controlexample.GroupTab;
+import dwtexamples.controlexample.LabelTab;
+import dwtexamples.controlexample.LinkTab;
+import dwtexamples.controlexample.ListTab;
+import dwtexamples.controlexample.MenuTab;
+import dwtexamples.controlexample.ProgressBarTab;
+import dwtexamples.controlexample.SashTab;
+import dwtexamples.controlexample.ScaleTab;
++/
+import dwtexamples.controlexample.ShellTab;
+/+
+import dwtexamples.controlexample.SliderTab;
+import dwtexamples.controlexample.SpinnerTab;
+import dwtexamples.controlexample.TabFolderTab;
+import dwtexamples.controlexample.TableTab;
+import dwtexamples.controlexample.TextTab;
+import dwtexamples.controlexample.ToolBarTab;
+import dwtexamples.controlexample.ToolTipTab;
+import dwtexamples.controlexample.TreeTab;
++/
+
+
+import tango.core.Exception;
+
+public class ControlExample {
+    private static ResourceBundle resourceBundle;
+    private ShellTab shellTab;
+    private TabFolder tabFolder;
+    private Tab [] tabs;
+    Image images[];
+
+    static const int ciClosedFolder = 0, ciOpenFolder = 1, ciTarget = 2, ciBackground = 3, ciParentBackground = 4;
+    static const char[][] imageLocations = [ cast(char[])
+        "closedFolder.gif",             //$NON-NLS-1$
+        "openFolder.gif",               //$NON-NLS-1$
+        "target.gif",                   //$NON-NLS-1$
+        "backgroundImage.png",          //$NON-NLS-1$
+        "parentBackgroundImage.png"];   //$NON-NLS-1$
+    static const int[] imageTypes = [
+        DWT.ICON,
+        DWT.ICON,
+        DWT.ICON,
+        DWT.BITMAP,
+        DWT.BITMAP];
+
+    bool startup = true;
+
+    static this(){
+        resourceBundle = ResourceBundle.getBundle("examples_control"); //$NON-NLS-1$
+    }
+
+    /**
+     * Creates an instance of a ControlExample embedded inside
+     * the supplied parent Composite.
+     *
+     * @param parent the container of the example
+     */
+    public this(Composite parent) {
+        initResources();
+        tabFolder = new TabFolder (parent, DWT.NONE);
+        tabs = createTabs();
+        for (int i=0; i<tabs.length; i++) {
+            TabItem item = new TabItem (tabFolder, DWT.NONE);
+            item.setText (tabs [i].getTabText ());
+            item.setControl (tabs [i].createTabFolderPage (tabFolder));
+            item.setData (tabs [i]);
+        }
+        startup = false;
+    }
+
+    /**
+     * Answers the set of example Tabs
+     */
+    Tab[] createTabs() {
+        return [ cast(Tab)
+            new ButtonTab (this),
+            /+
+            new CanvasTab (this),
+            new ComboTab (this),
+            new CoolBarTab (this),
+            new DateTimeTab (this),
+            new DialogTab (this),
+            new ExpandBarTab (this),
+            new GroupTab (this),
+            new LabelTab (this),
+            new LinkTab (this),
+            new ListTab (this),
+            new MenuTab (this),
+            new ProgressBarTab (this),
+            new SashTab (this),
+            new ScaleTab (this),
+            +/
+            shellTab = new ShellTab(this)
+            /+
+            new SliderTab (this),
+            new SpinnerTab (this),
+            new TabFolderTab (this),
+            new TableTab (this),
+            new TextTab (this),
+            new ToolBarTab (this),
+            new ToolTipTab (this),
+            new TreeTab (this),
+            +/
+        ];
+    }
+
+    /**
+     * Disposes of all resources associated with a particular
+     * instance of the ControlExample.
+     */
+    public void dispose() {
+        /*
+         * Destroy any shells that may have been created
+         * by the Shells tab.  When a shell is disposed,
+         * all child shells are also disposed.  Therefore
+         * it is necessary to check for disposed shells
+         * in the shells list to avoid disposing a shell
+         * twice.
+         */
+        if (shellTab !is null) shellTab.closeAllShells ();
+        shellTab = null;
+        tabFolder = null;
+        freeResources();
+    }
+
+    /**
+     * Frees the resources
+     */
+    void freeResources() {
+        if (images !is null) {
+            for (int i = 0; i < images.length; ++i) {
+                final Image image = images[i];
+                if (image !is null) image.dispose();
+            }
+            images = null;
+        }
+    }
+
+    /**
+     * Gets a string from the resource bundle.
+     * We don't want to crash because of a missing String.
+     * Returns the key if not found.
+     */
+    static char[] getResourceString(char[] key) {
+        char[] res;
+        try {
+            res = resourceBundle.getString(key);
+        } catch (NoSuchElementException e) {
+            return key;
+        }
+        if( res is null ){
+            return "!" ~ key ~ "!"; //$NON-NLS-1$ //$NON-NLS-2$
+        }
+        return res;
+    }
+
+    /**
+     * Gets a string from the resource bundle and binds it
+     * with the given arguments. If the key is not found,
+     * return the key.
+     */
+    static char[] getResourceString(char[] key, Object[] args) {
+        char[] res;
+        try {
+            res = MessageFormat.format(getResourceString(key), args);
+        } catch (NoSuchElementException e) {
+            return key;
+        }
+        if( res is null ){
+            return "!" ~ key ~ "!"; //$NON-NLS-1$ //$NON-NLS-2$
+        }
+        return res;
+    }
+
+    /**
+     * Loads the resources
+     */
+    void initResources() {
+        //final Class clazz = ControlExample.class;
+        if (resourceBundle !is null) {
+            try {
+                if (images is null) {
+                    images = new Image[imageLocations.length];
+
+                    for (int i = 0; i < imageLocations.length; ++i) {
+                        InputStream sourceStream = clazz.getResourceAsStream(imageLocations[i]);
+                        ImageData source = new ImageData(sourceStream);
+                        if (imageTypes[i] is DWT.ICON) {
+                            ImageData mask = source.getTransparencyMask();
+                            images[i] = new Image(null, source, mask);
+                        } else {
+                            images[i] = new Image(null, source);
+                        }
+                        try {
+                            sourceStream.close();
+                        } catch (IOException e) {
+                            e.printStackTrace();
+                        }
+                    }
+                }
+                return;
+            } catch (Throwable t) {
+            }
+        }
+        char[] error = (resourceBundle !is null) ?
+            getResourceString("error.CouldNotLoadResources") :
+            "Unable to load resources"; //$NON-NLS-1$
+        freeResources();
+        throw new RuntimeException(error);
+    }
+
+    /**
+     * Invokes as a standalone program.
+     */
+    public static void main(char[][] args) {
+        Display display = new Display();
+        Shell shell = new Shell(display, DWT.SHELL_TRIM);
+        shell.setLayout(new FillLayout());
+        ControlExample instance = new ControlExample(shell);
+        shell.setText(getResourceString("window.title"));
+        setShellSize(instance, shell);
+        shell.open();
+        while (! shell.isDisposed()) {
+            if (! display.readAndDispatch()) display.sleep();
+        }
+        instance.dispose();
+        display.dispose();
+    }
+
+    /**
+     * Grabs input focus.
+     */
+    public void setFocus() {
+        tabFolder.setFocus();
+    }
+
+    /**
+     * Sets the size of the shell to it's "packed" size,
+     * unless that makes it larger than the monitor it is being displayed on,
+     * in which case just set the shell size to be slightly smaller than the monitor.
+     */
+    static void setShellSize(ControlExample instance, Shell shell) {
+        Point size = shell.computeSize(DWT.DEFAULT, DWT.DEFAULT);
+        Rectangle monitorArea = shell.getMonitor().getClientArea();
+        /* Workaround: if the tab folder is wider than the screen,
+         * carbon clips instead of somehow scrolling the tab items.
+         * We try to recover some width by using shorter tab names. */
+        if (size.x > monitorArea.width && DWT.getPlatform().equals("carbon")) {
+            TabItem [] tabItems = instance.tabFolder.getItems();
+            for (int i=0; i<tabItems.length; i++) {
+                tabItems[i].setText (instance.tabs [i].getShortTabText ());
+            }
+            size = shell.computeSize(DWT.DEFAULT, DWT.DEFAULT);
+        }
+        shell.setSize(Math.min(size.x, monitorArea.width), Math.min(size.y, monitorArea.height));
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/controlexample/CoolBarTab.d	Mon Jan 21 01:40:01 2008 +0100
@@ -0,0 +1,510 @@
+/*******************************************************************************
+ * 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
+ *******************************************************************************/
+module dwtexamples.controlexample.CoolBarTab;
+
+
+
+import dwt.DWT;
+import dwt.events.MenuAdapter;
+import dwt.events.MenuEvent;
+import dwt.events.SelectionAdapter;
+import dwt.events.SelectionEvent;
+import dwt.graphics.Image;
+import dwt.graphics.Point;
+import dwt.graphics.Rectangle;
+import dwt.layout.GridData;
+import dwt.layout.GridLayout;
+import dwt.widgets.Button;
+import dwt.widgets.Control;
+import dwt.widgets.CoolBar;
+import dwt.widgets.CoolItem;
+import dwt.widgets.Event;
+import dwt.widgets.Group;
+import dwt.widgets.Item;
+import dwt.widgets.Listener;
+import dwt.widgets.Menu;
+import dwt.widgets.MenuItem;
+import dwt.widgets.Text;
+import dwt.widgets.ToolBar;
+import dwt.widgets.ToolItem;
+import dwt.widgets.Widget;
+
+class CoolBarTab : Tab {
+    /* Example widgets and group that contains them */
+    CoolBar coolBar;
+    CoolItem pushItem, dropDownItem, radioItem, checkItem, textItem;
+    Group coolBarGroup;
+
+    /* Style widgets added to the "Style" group */
+    Button horizontalButton, verticalButton;
+    Button dropDownButton, flatButton;
+
+    /* Other widgets added to the "Other" group */
+    Button lockedButton;
+
+    Point[] sizes;
+    int[] wrapIndices;
+    int[] order;
+
+    /**
+     * Creates the Tab within a given instance of ControlExample.
+     */
+    this(ControlExample instance) {
+        super(instance);
+    }
+
+    /**
+     * Creates the "Other" group.
+     */
+    void createOtherGroup () {
+        super.createOtherGroup ();
+
+        /* Create display controls specific to this example */
+        lockedButton = new Button (otherGroup, DWT.CHECK);
+        lockedButton.setText (ControlExample.getResourceString("Locked"));
+
+        /* Add the listeners */
+        lockedButton.addSelectionListener (new SelectionAdapter () {
+            public void widgetSelected (SelectionEvent event) {
+                setWidgetLocked ();
+            }
+        });
+    }
+
+    /**
+     * Creates the "Example" group.
+     */
+    void createExampleGroup () {
+        super.createExampleGroup ();
+        coolBarGroup = new Group (exampleGroup, DWT.NONE);
+        coolBarGroup.setLayout (new GridLayout ());
+        coolBarGroup.setLayoutData (new GridData (DWT.FILL, DWT.FILL, true, true));
+        coolBarGroup.setText ("CoolBar");
+    }
+
+    /**
+     * Creates the "Example" widgets.
+     */
+    void createExampleWidgets () {
+        int style = getDefaultStyle(), itemStyle = 0;
+
+        /* Compute the widget, item, and item toolBar styles */
+        int toolBarStyle = DWT.FLAT;
+        bool vertical = false;
+        if (horizontalButton.getSelection ()) {
+            style |= DWT.HORIZONTAL;
+            toolBarStyle |= DWT.HORIZONTAL;
+        }
+        if (verticalButton.getSelection ()) {
+            style |= DWT.VERTICAL;
+            toolBarStyle |= DWT.VERTICAL;
+            vertical = true;
+        }
+        if (borderButton.getSelection()) style |= DWT.BORDER;
+        if (flatButton.getSelection()) style |= DWT.FLAT;
+        if (dropDownButton.getSelection()) itemStyle |= DWT.DROP_DOWN;
+
+        /*
+        * Create the example widgets.
+        */
+        coolBar = new CoolBar (coolBarGroup, style);
+
+        /* Create the push button toolbar cool item */
+        ToolBar toolBar = new ToolBar (coolBar, toolBarStyle);
+        ToolItem item = new ToolItem (toolBar, DWT.PUSH);
+        item.setImage (instance.images[ControlExample.ciClosedFolder]);
+        item.setToolTipText ("DWT.PUSH");
+        item = new ToolItem (toolBar, DWT.PUSH);
+        item.setImage (instance.images[ControlExample.ciOpenFolder]);
+        item.setToolTipText ("DWT.PUSH");
+        item = new ToolItem (toolBar, DWT.PUSH);
+        item.setImage (instance.images[ControlExample.ciTarget]);
+        item.setToolTipText ("DWT.PUSH");
+        item = new ToolItem (toolBar, DWT.SEPARATOR);
+        item = new ToolItem (toolBar, DWT.PUSH);
+        item.setImage (instance.images[ControlExample.ciClosedFolder]);
+        item.setToolTipText ("DWT.PUSH");
+        item = new ToolItem (toolBar, DWT.PUSH);
+        item.setImage (instance.images[ControlExample.ciOpenFolder]);
+        item.setToolTipText ("DWT.PUSH");
+        pushItem = new CoolItem (coolBar, itemStyle);
+        pushItem.setControl (toolBar);
+        pushItem.addSelectionListener (new CoolItemSelectionListener());
+
+        /* Create the dropdown toolbar cool item */
+        toolBar = new ToolBar (coolBar, toolBarStyle);
+        item = new ToolItem (toolBar, DWT.DROP_DOWN);
+        item.setImage (instance.images[ControlExample.ciOpenFolder]);
+        item.setToolTipText ("DWT.DROP_DOWN");
+        item.addSelectionListener (new DropDownSelectionListener());
+        item = new ToolItem (toolBar, DWT.DROP_DOWN);
+        item.setImage (instance.images[ControlExample.ciClosedFolder]);
+        item.setToolTipText ("DWT.DROP_DOWN");
+        item.addSelectionListener (new DropDownSelectionListener());
+        dropDownItem = new CoolItem (coolBar, itemStyle);
+        dropDownItem.setControl (toolBar);
+        dropDownItem.addSelectionListener (new CoolItemSelectionListener());
+
+        /* Create the radio button toolbar cool item */
+        toolBar = new ToolBar (coolBar, toolBarStyle);
+        item = new ToolItem (toolBar, DWT.RADIO);
+        item.setImage (instance.images[ControlExample.ciClosedFolder]);
+        item.setToolTipText ("DWT.RADIO");
+        item = new ToolItem (toolBar, DWT.RADIO);
+        item.setImage (instance.images[ControlExample.ciClosedFolder]);
+        item.setToolTipText ("DWT.RADIO");
+        item = new ToolItem (toolBar, DWT.RADIO);
+        item.setImage (instance.images[ControlExample.ciClosedFolder]);
+        item.setToolTipText ("DWT.RADIO");
+        radioItem = new CoolItem (coolBar, itemStyle);
+        radioItem.setControl (toolBar);
+        radioItem.addSelectionListener (new CoolItemSelectionListener());
+
+        /* Create the check button toolbar cool item */
+        toolBar = new ToolBar (coolBar, toolBarStyle);
+        item = new ToolItem (toolBar, DWT.CHECK);
+        item.setImage (instance.images[ControlExample.ciClosedFolder]);
+        item.setToolTipText ("DWT.CHECK");
+        item = new ToolItem (toolBar, DWT.CHECK);
+        item.setImage (instance.images[ControlExample.ciTarget]);
+        item.setToolTipText ("DWT.CHECK");
+        item = new ToolItem (toolBar, DWT.CHECK);
+        item.setImage (instance.images[ControlExample.ciOpenFolder]);
+        item.setToolTipText ("DWT.CHECK");
+        item = new ToolItem (toolBar, DWT.CHECK);
+        item.setImage (instance.images[ControlExample.ciTarget]);
+        item.setToolTipText ("DWT.CHECK");
+        checkItem = new CoolItem (coolBar, itemStyle);
+        checkItem.setControl (toolBar);
+        checkItem.addSelectionListener (new CoolItemSelectionListener());
+
+        /* Create the text cool item */
+        if (!vertical) {
+            Text text = new Text (coolBar, DWT.BORDER | DWT.SINGLE);
+            textItem = new CoolItem (coolBar, itemStyle);
+            textItem.setControl (text);
+            textItem.addSelectionListener (new CoolItemSelectionListener());
+            Point textSize = text.computeSize(DWT.DEFAULT, DWT.DEFAULT);
+            textSize = textItem.computeSize(textSize.x, textSize.y);
+            textItem.setMinimumSize(textSize);
+            textItem.setPreferredSize(textSize);
+            textItem.setSize(textSize);
+        }
+
+        /* Set the sizes after adding all cool items */
+        CoolItem[] coolItems = coolBar.getItems();
+        for (int i = 0; i < coolItems.length; i++) {
+            CoolItem coolItem = coolItems[i];
+            Control control = coolItem.getControl();
+            Point size = control.computeSize(DWT.DEFAULT, DWT.DEFAULT);
+            Point coolSize = coolItem.computeSize(size.x, size.y);
+            if (control instanceof ToolBar) {
+                ToolBar bar = (ToolBar)control;
+                if (bar.getItemCount() > 0) {
+                    if (vertical) {
+                        size.y = bar.getItem(0).getBounds().height;
+                    } else {
+                        size.x = bar.getItem(0).getWidth();
+                    }
+                }
+            }
+            coolItem.setMinimumSize(size);
+            coolItem.setPreferredSize(coolSize);
+            coolItem.setSize(coolSize);
+        }
+
+        /* If we have saved state, restore it */
+        if (order !is null && order.length is coolBar.getItemCount()) {
+            coolBar.setItemLayout(order, wrapIndices, sizes);
+        } else {
+            coolBar.setWrapIndices(new int[] {1, 3});
+        }
+
+        /* Add a listener to resize the group box to match the coolbar */
+        coolBar.addListener(DWT.Resize, new Listener() {
+            public void handleEvent(Event event) {
+                exampleGroup.layout();
+            }
+        });
+    }
+
+    /**
+     * Creates the "Style" group.
+     */
+    void createStyleGroup() {
+        super.createStyleGroup();
+
+        /* Create the extra widgets */
+        horizontalButton = new Button (styleGroup, DWT.RADIO);
+        horizontalButton.setText ("DWT.HORIZONTAL");
+        verticalButton = new Button (styleGroup, DWT.RADIO);
+        verticalButton.setText ("DWT.VERTICAL");
+        borderButton = new Button (styleGroup, DWT.CHECK);
+        borderButton.setText ("DWT.BORDER");
+        flatButton = new Button (styleGroup, DWT.CHECK);
+        flatButton.setText ("DWT.FLAT");
+        Group itemGroup = new Group(styleGroup, DWT.NONE);
+        itemGroup.setLayout (new GridLayout ());
+        itemGroup.setLayoutData (new GridData (GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
+        itemGroup.setText(ControlExample.getResourceString("Item_Styles"));
+        dropDownButton = new Button (itemGroup, DWT.CHECK);
+        dropDownButton.setText ("DWT.DROP_DOWN");
+    }
+
+    /**
+     * Disposes the "Example" widgets.
+     */
+    void disposeExampleWidgets () {
+        /* store the state of the toolbar if applicable */
+        if (coolBar !is null) {
+            sizes = coolBar.getItemSizes();
+            wrapIndices = coolBar.getWrapIndices();
+            order = coolBar.getItemOrder();
+        }
+        super.disposeExampleWidgets();
+    }
+
+    /**
+     * Gets the "Example" widget children's items, if any.
+     *
+     * @return an array containing the example widget children's items
+     */
+    Item [] getExampleWidgetItems () {
+        return coolBar.getItems();
+    }
+
+    /**
+     * Gets the "Example" widget children.
+     */
+    Widget [] getExampleWidgets () {
+        return new Widget [] {coolBar};
+    }
+
+    /**
+     * Returns a list of set/get API method names (without the set/get prefix)
+     * that can be used to set/get values in the example control(s).
+     */
+    String[] getMethodNames() {
+        return new String[] {"ToolTipText"};
+    }
+
+    /**
+     * Gets the short text for the tab folder item.
+     */
+    public String getShortTabText() {
+        return "CB";
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    String getTabText () {
+        return "CoolBar";
+    }
+
+    /**
+     * Sets the state of the "Example" widgets.
+     */
+    void setExampleWidgetState () {
+        super.setExampleWidgetState ();
+        horizontalButton.setSelection ((coolBar.getStyle () & DWT.HORIZONTAL) !is 0);
+        verticalButton.setSelection ((coolBar.getStyle () & DWT.VERTICAL) !is 0);
+        borderButton.setSelection ((coolBar.getStyle () & DWT.BORDER) !is 0);
+        flatButton.setSelection ((coolBar.getStyle () & DWT.FLAT) !is 0);
+        dropDownButton.setSelection ((coolBar.getItem(0).getStyle () & DWT.DROP_DOWN) !is 0);
+        lockedButton.setSelection(coolBar.getLocked());
+        if (!instance.startup) setWidgetLocked ();
+    }
+
+    /**
+     * Sets the header visible state of the "Example" widgets.
+     */
+    void setWidgetLocked () {
+        coolBar.setLocked (lockedButton.getSelection ());
+    }
+
+    /**
+     * Listens to widgetSelected() events on DWT.DROP_DOWN type ToolItems
+     * and opens/closes a menu when appropriate.
+     */
+    class DropDownSelectionListener extends SelectionAdapter {
+        private Menu menu = null;
+        private bool visible = false;
+
+        public void widgetSelected(SelectionEvent event) {
+            // Create the menu if it has not already been created
+            if (menu is null) {
+                // Lazy create the menu.
+                menu = new Menu(shell);
+                menu.addMenuListener(new MenuAdapter() {
+                    public void menuHidden(MenuEvent e) {
+                        visible = false;
+                    }
+                });
+                for (int i = 0; i < 9; ++i) {
+                    final String text = ControlExample.getResourceString("DropDownData_" + i);
+                    if (text.length() !is 0) {
+                        MenuItem menuItem = new MenuItem(menu, DWT.NONE);
+                        menuItem.setText(text);
+                        /*
+                         * Add a menu selection listener so that the menu is hidden
+                         * when the user selects an item from the drop down menu.
+                         */
+                        menuItem.addSelectionListener(new SelectionAdapter() {
+                            public void widgetSelected(SelectionEvent e) {
+                                setMenuVisible(false);
+                            }
+                        });
+                    } else {
+                        new MenuItem(menu, DWT.SEPARATOR);
+                    }
+                }
+            }
+
+            /**
+             * A selection event will be fired when a drop down tool
+             * item is selected in the main area and in the drop
+             * down arrow.  Examine the event detail to determine
+             * where the widget was selected.
+             */
+            if (event.detail is DWT.ARROW) {
+                /*
+                 * The drop down arrow was selected.
+                 */
+                if (visible) {
+                    // Hide the menu to give the Arrow the appearance of being a toggle button.
+                    setMenuVisible(false);
+                } else {
+                    // Position the menu below and vertically aligned with the the drop down tool button.
+                    final ToolItem toolItem = (ToolItem) event.widget;
+                    final ToolBar  toolBar = toolItem.getParent();
+
+                    Rectangle toolItemBounds = toolItem.getBounds();
+                    Point point = toolBar.toDisplay(new Point(toolItemBounds.x, toolItemBounds.y));
+                    menu.setLocation(point.x, point.y + toolItemBounds.height);
+                    setMenuVisible(true);
+                }
+            } else {
+                /*
+                 * Main area of drop down tool item selected.
+                 * An application would invoke the code to perform the action for the tool item.
+                 */
+            }
+        }
+        private void setMenuVisible(bool visible) {
+            menu.setVisible(visible);
+            this.visible = visible;
+        }
+    }
+
+    /**
+     * Listens to widgetSelected() events on DWT.DROP_DOWN type CoolItems
+     * and opens/closes a menu when appropriate.
+     */
+    class CoolItemSelectionListener extends SelectionAdapter {
+        private Menu menu = null;
+
+        public void widgetSelected(SelectionEvent event) {
+            /**
+             * A selection event will be fired when the cool item
+             * is selected by its gripper or if the drop down arrow
+             * (or 'chevron') is selected. Examine the event detail
+             * to determine where the widget was selected.
+             */
+            if (event.detail is DWT.ARROW) {
+                /* If the popup menu is already up (i.e. user pressed arrow twice),
+                 * then dispose it.
+                 */
+                if (menu !is null) {
+                    menu.dispose();
+                    menu = null;
+                    return;
+                }
+
+                /* Get the cool item and convert its bounds to display coordinates. */
+                CoolItem coolItem = (CoolItem) event.widget;
+                Rectangle itemBounds = coolItem.getBounds ();
+                itemBounds.width = event.x - itemBounds.x;
+                Point pt = coolBar.toDisplay(new Point (itemBounds.x, itemBounds.y));
+                itemBounds.x = pt.x;
+                itemBounds.y = pt.y;
+
+                /* Get the toolbar from the cool item. */
+                ToolBar toolBar = (ToolBar) coolItem.getControl ();
+                ToolItem[] tools = toolBar.getItems ();
+                int toolCount = tools.length;
+
+                /* Convert the bounds of each tool item to display coordinates,
+                 * and determine which ones are past the bounds of the cool item.
+                 */
+                int i = 0;
+                while (i < toolCount) {
+                    Rectangle toolBounds = tools[i].getBounds ();
+                    pt = toolBar.toDisplay(new Point(toolBounds.x, toolBounds.y));
+                    toolBounds.x = pt.x;
+                    toolBounds.y = pt.y;
+                    Rectangle intersection = itemBounds.intersection (toolBounds);
+                    if (!intersection.equals (toolBounds)) break;
+                    i++;
+                }
+
+                /* Create a pop-up menu with items for each of the hidden buttons. */
+                menu = new Menu (coolBar);
+                for (int j = i; j < toolCount; j++) {
+                    ToolItem tool = tools[j];
+                    Image image = tool.getImage();
+                    if (image is null) {
+                        new MenuItem (menu, DWT.SEPARATOR);
+                    } else {
+                        if ((tool.getStyle() & DWT.DROP_DOWN) !is 0) {
+                            MenuItem menuItem = new MenuItem (menu, DWT.CASCADE);
+                            menuItem.setImage(image);
+                            String text = tool.getToolTipText();
+                            if (text !is null) menuItem.setText(text);
+                            Menu m = new Menu(menu);
+                            menuItem.setMenu(m);
+                            for (int k = 0; k < 9; ++k) {
+                                text = ControlExample.getResourceString("DropDownData_" + k);
+                                if (text.length() !is 0) {
+                                    MenuItem mi = new MenuItem(m, DWT.NONE);
+                                    mi.setText(text);
+                                    /* Application code to perform the action for the submenu item would go here. */
+                                } else {
+                                    new MenuItem(m, DWT.SEPARATOR);
+                                }
+                            }
+                        } else {
+                            MenuItem menuItem = new MenuItem (menu, DWT.NONE);
+                            menuItem.setImage(image);
+                            String text = tool.getToolTipText();
+                            if (text !is null) menuItem.setText(text);
+                        }
+                        /* Application code to perform the action for the menu item would go here. */
+                    }
+                }
+
+                /* Display the pop-up menu at the lower left corner of the arrow button.
+                 * Dispose the menu when the user is done with it.
+                 */
+                pt = coolBar.toDisplay(new Point(event.x, event.y));
+                menu.setLocation (pt.x, pt.y);
+                menu.setVisible (true);
+                while (menu !is null && !menu.isDisposed() && menu.isVisible ()) {
+                    if (!display.readAndDispatch ()) display.sleep ();
+                }
+                if (menu !is null) {
+                    menu.dispose ();
+                    menu = null;
+                }
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/controlexample/CustomControlExample.d	Mon Jan 21 01:40:01 2008 +0100
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+module dwtexamples.controlexample.CustomControlExample;
+
+
+import dwt.layout.FillLayout;
+import dwt.widgets.Composite;
+import dwt.widgets.Display;
+import dwt.widgets.Shell;
+
+
+public class CustomControlExample : ControlExample {
+
+    /**
+     * Creates an instance of a CustomControlExample embedded
+     * inside the supplied parent Composite.
+     *
+     * @param parent the container of the example
+     */
+    public this(Composite parent) {
+        super (parent);
+    }
+
+    /**
+     * Answers the set of example Tabs
+     */
+    Tab[] createTabs() {
+        return new Tab [] {
+            new CComboTab (this),
+            new CLabelTab (this),
+            new CTabFolderTab (this),
+            new SashFormTab (this),
+            new StyledTextTab (this),
+        };
+    }
+
+    /**
+     * Invokes as a standalone program.
+     */
+    public static void main(String[] args) {
+        Display display = new Display();
+        Shell shell = new Shell(display);
+        shell.setLayout(new FillLayout());
+        CustomControlExample instance = new CustomControlExample(shell);
+        shell.setText(getResourceString("custom.window.title"));
+        setShellSize(instance, shell);
+        shell.open();
+        while (! shell.isDisposed()) {
+            if (! display.readAndDispatch()) display.sleep();
+        }
+        instance.dispose();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/controlexample/DateTimeTab.d	Mon Jan 21 01:40:01 2008 +0100
@@ -0,0 +1,130 @@
+/*******************************************************************************
+ * 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
+ *******************************************************************************/
+module dwtexamples.controlexample.DateTimeTab;
+
+
+
+import dwt.DWT;
+import dwt.layout.GridData;
+import dwt.layout.GridLayout;
+import dwt.widgets.Button;
+import dwt.widgets.DateTime;
+import dwt.widgets.Group;
+import dwt.widgets.Widget;
+
+class DateTimeTab : Tab {
+    /* Example widgets and groups that contain them */
+    DateTime dateTime1;
+    Group dateTimeGroup;
+
+    /* Style widgets added to the "Style" group */
+    Button dateButton, timeButton, calendarButton, shortButton, mediumButton, longButton;
+
+    /**
+     * Creates the Tab within a given instance of ControlExample.
+     */
+    this(ControlExample instance) {
+        super(instance);
+    }
+
+    /**
+     * Creates the "Example" group.
+     */
+    void createExampleGroup () {
+        super.createExampleGroup ();
+
+        /* Create a group for the list */
+        dateTimeGroup = new Group (exampleGroup, DWT.NONE);
+        dateTimeGroup.setLayout (new GridLayout ());
+        dateTimeGroup.setLayoutData (new GridData (DWT.FILL, DWT.FILL, true, true));
+        dateTimeGroup.setText ("DateTime");
+    }
+
+    /**
+     * Creates the "Example" widgets.
+     */
+    void createExampleWidgets () {
+
+        /* Compute the widget style */
+        int style = getDefaultStyle();
+        if (dateButton.getSelection ()) style |= DWT.DATE;
+        if (timeButton.getSelection ()) style |= DWT.TIME;
+        if (calendarButton.getSelection ()) style |= DWT.CALENDAR;
+        if (shortButton.getSelection ()) style |= DWT.SHORT;
+        if (mediumButton.getSelection ()) style |= DWT.MEDIUM;
+        if (longButton.getSelection ()) style |= DWT.LONG;
+        if (borderButton.getSelection ()) style |= DWT.BORDER;
+
+        /* Create the example widgets */
+        dateTime1 = new DateTime (dateTimeGroup, style);
+    }
+
+    /**
+     * Creates the "Style" group.
+     */
+    void createStyleGroup() {
+        super.createStyleGroup ();
+
+        /* Create the extra widgets */
+        dateButton = new Button(styleGroup, DWT.RADIO);
+        dateButton.setText("DWT.DATE");
+        timeButton = new Button(styleGroup, DWT.RADIO);
+        timeButton.setText("DWT.TIME");
+        calendarButton = new Button(styleGroup, DWT.RADIO);
+        calendarButton.setText("DWT.CALENDAR");
+        Group formatGroup = new Group(styleGroup, DWT.NONE);
+        formatGroup.setLayout(new GridLayout());
+        shortButton = new Button(formatGroup, DWT.RADIO);
+        shortButton.setText("DWT.SHORT");
+        mediumButton = new Button(formatGroup, DWT.RADIO);
+        mediumButton.setText("DWT.MEDIUM");
+        longButton = new Button(formatGroup, DWT.RADIO);
+        longButton.setText("DWT.LONG");
+        borderButton = new Button(styleGroup, DWT.CHECK);
+        borderButton.setText("DWT.BORDER");
+    }
+
+    /**
+     * Gets the "Example" widget children.
+     */
+    Widget [] getExampleWidgets () {
+        return new Widget [] {dateTime1};
+    }
+
+    /**
+     * Returns a list of set/get API method names (without the set/get prefix)
+     * that can be used to set/get values in the example control(s).
+     */
+    String[] getMethodNames() {
+        return new String[] {"Day", "Hours", "Minutes", "Month", "Seconds", "Year"};
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    String getTabText () {
+        return "DateTime";
+    }
+
+    /**
+     * Sets the state of the "Example" widgets.
+     */
+    void setExampleWidgetState () {
+        super.setExampleWidgetState ();
+        dateButton.setSelection ((dateTime1.getStyle () & DWT.DATE) !is 0);
+        timeButton.setSelection ((dateTime1.getStyle () & DWT.TIME) !is 0);
+        calendarButton.setSelection ((dateTime1.getStyle () & DWT.CALENDAR) !is 0);
+        shortButton.setSelection ((dateTime1.getStyle () & DWT.SHORT) !is 0);
+        mediumButton.setSelection ((dateTime1.getStyle () & DWT.MEDIUM) !is 0);
+        longButton.setSelection ((dateTime1.getStyle () & DWT.LONG) !is 0);
+        borderButton.setSelection ((dateTime1.getStyle () & DWT.BORDER) !is 0);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/controlexample/DialogTab.d	Mon Jan 21 01:40:01 2008 +0100
@@ -0,0 +1,503 @@
+/*******************************************************************************
+ * 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
+ *******************************************************************************/
+module dwtexamples.controlexample.DialogTab;
+
+
+
+import dwt.DWT;
+import dwt.events.SelectionAdapter;
+import dwt.events.SelectionEvent;
+import dwt.events.SelectionListener;
+import dwt.graphics.FontData;
+import dwt.graphics.RGB;
+import dwt.layout.GridData;
+import dwt.layout.GridLayout;
+import dwt.printing.PrintDialog;
+import dwt.printing.PrinterData;
+import dwt.widgets.Button;
+import dwt.widgets.ColorDialog;
+import dwt.widgets.Combo;
+import dwt.widgets.DirectoryDialog;
+import dwt.widgets.FileDialog;
+import dwt.widgets.FontDialog;
+import dwt.widgets.Group;
+import dwt.widgets.MessageBox;
+import dwt.widgets.Text;
+import dwt.widgets.Widget;
+
+class DialogTab : Tab {
+    /* Example widgets and groups that contain them */
+    Group dialogStyleGroup, resultGroup;
+    Text textWidget;
+
+    /* Style widgets added to the "Style" group */
+    Combo dialogCombo;
+    Button createButton;
+    Button okButton, cancelButton;
+    Button yesButton, noButton;
+    Button retryButton;
+    Button abortButton, ignoreButton;
+    Button iconErrorButton, iconInformationButton, iconQuestionButton;
+    Button iconWarningButton, iconWorkingButton, noIconButton;
+    Button primaryModalButton, applicationModalButton, systemModalButton;
+    Button saveButton, openButton, multiButton;
+
+    static String [] FilterExtensions   = {"*.txt", "*.bat", "*.doc", "*"};
+    static String [] FilterNames        = {ControlExample.getResourceString("FilterName_0"),
+                                           ControlExample.getResourceString("FilterName_1"),
+                                           ControlExample.getResourceString("FilterName_2"),
+                                           ControlExample.getResourceString("FilterName_3")};
+
+    /**
+     * Creates the Tab within a given instance of ControlExample.
+     */
+    this(ControlExample instance) {
+        super(instance);
+    }
+
+    /**
+     * Handle a button style selection event.
+     *
+     * @param event the selection event
+     */
+    void buttonStyleSelected(SelectionEvent event) {
+        /*
+         * Only certain combinations of button styles are
+         * supported for various dialogs.  Make sure the
+         * control widget reflects only valid combinations.
+         */
+        bool ok = okButton.getSelection ();
+        bool cancel = cancelButton.getSelection ();
+        bool yes = yesButton.getSelection ();
+        bool no = noButton.getSelection ();
+        bool abort = abortButton.getSelection ();
+        bool retry = retryButton.getSelection ();
+        bool ignore = ignoreButton.getSelection ();
+
+        okButton.setEnabled (!(yes || no || retry || abort || ignore));
+        cancelButton.setEnabled (!(abort || ignore || (yes !is no)));
+        yesButton.setEnabled (!(ok || retry || abort || ignore || (cancel && !yes && !no)));
+        noButton.setEnabled (!(ok || retry || abort || ignore || (cancel && !yes && !no)));
+        retryButton.setEnabled (!(ok || yes || no));
+        abortButton.setEnabled (!(ok || cancel || yes || no));
+        ignoreButton.setEnabled (!(ok || cancel || yes || no));
+
+        createButton.setEnabled (
+                !(ok || cancel || yes || no || retry || abort || ignore) ||
+                ok ||
+                (ok && cancel) ||
+                (yes && no) ||
+                (yes && no && cancel) ||
+                (retry && cancel) ||
+                (abort && retry && ignore));
+
+
+    }
+
+    /**
+     * Handle the create button selection event.
+     *
+     * @param event org.eclipse.swt.events.SelectionEvent
+     */
+    void createButtonSelected(SelectionEvent event) {
+
+        /* Compute the appropriate dialog style */
+        int style = getDefaultStyle();
+        if (okButton.getEnabled () && okButton.getSelection ()) style |= DWT.OK;
+        if (cancelButton.getEnabled () && cancelButton.getSelection ()) style |= DWT.CANCEL;
+        if (yesButton.getEnabled () && yesButton.getSelection ()) style |= DWT.YES;
+        if (noButton.getEnabled () && noButton.getSelection ()) style |= DWT.NO;
+        if (retryButton.getEnabled () && retryButton.getSelection ()) style |= DWT.RETRY;
+        if (abortButton.getEnabled () && abortButton.getSelection ()) style |= DWT.ABORT;
+        if (ignoreButton.getEnabled () && ignoreButton.getSelection ()) style |= DWT.IGNORE;
+        if (iconErrorButton.getEnabled () && iconErrorButton.getSelection ()) style |= DWT.ICON_ERROR;
+        if (iconInformationButton.getEnabled () && iconInformationButton.getSelection ()) style |= DWT.ICON_INFORMATION;
+        if (iconQuestionButton.getEnabled () && iconQuestionButton.getSelection ()) style |= DWT.ICON_QUESTION;
+        if (iconWarningButton.getEnabled () && iconWarningButton.getSelection ()) style |= DWT.ICON_WARNING;
+        if (iconWorkingButton.getEnabled () && iconWorkingButton.getSelection ()) style |= DWT.ICON_WORKING;
+        if (primaryModalButton.getEnabled () && primaryModalButton.getSelection ()) style |= DWT.PRIMARY_MODAL;
+        if (applicationModalButton.getEnabled () && applicationModalButton.getSelection ()) style |= DWT.APPLICATION_MODAL;
+        if (systemModalButton.getEnabled () && systemModalButton.getSelection ()) style |= DWT.SYSTEM_MODAL;
+        if (saveButton.getEnabled () && saveButton.getSelection ()) style |= DWT.SAVE;
+        if (openButton.getEnabled () && openButton.getSelection ()) style |= DWT.OPEN;
+        if (multiButton.getEnabled () && multiButton.getSelection ()) style |= DWT.MULTI;
+
+        /* Open the appropriate dialog type */
+        String name = dialogCombo.getText ();
+
+        if (name.equals (ControlExample.getResourceString("ColorDialog"))) {
+            ColorDialog dialog = new ColorDialog (shell ,style);
+            dialog.setRGB (new RGB (100, 100, 100));
+            dialog.setText (ControlExample.getResourceString("Title"));
+            RGB result = dialog.open ();
+            textWidget.append (ControlExample.getResourceString("ColorDialog") + Text.DELIMITER);
+            textWidget.append (ControlExample.getResourceString("Result", new String [] {"" + result}) + Text.DELIMITER + Text.DELIMITER);
+            return;
+        }
+
+        if (name.equals (ControlExample.getResourceString("DirectoryDialog"))) {
+            DirectoryDialog dialog = new DirectoryDialog (shell, style);
+            dialog.setMessage (ControlExample.getResourceString("Example_string"));
+            dialog.setText (ControlExample.getResourceString("Title"));
+            String result = dialog.open ();
+            textWidget.append (ControlExample.getResourceString("DirectoryDialog") + Text.DELIMITER);
+            textWidget.append (ControlExample.getResourceString("Result", new String [] {"" + result}) + Text.DELIMITER + Text.DELIMITER);
+            return;
+        }
+
+        if (name.equals (ControlExample.getResourceString("FileDialog"))) {
+            FileDialog dialog = new FileDialog (shell, style);
+            dialog.setFileName (ControlExample.getResourceString("readme_txt"));
+            dialog.setFilterNames (FilterNames);
+            dialog.setFilterExtensions (FilterExtensions);
+            dialog.setText (ControlExample.getResourceString("Title"));
+            String result = dialog.open();
+            textWidget.append (ControlExample.getResourceString("FileDialog") + Text.DELIMITER);
+            textWidget.append (ControlExample.getResourceString("Result", new String [] {"" + result}) + Text.DELIMITER);
+            if ((dialog.getStyle () & DWT.MULTI) !is 0) {
+                String [] files = dialog.getFileNames ();
+                for (int i=0; i<files.length; i++) {
+                    textWidget.append ("\t" + files [i] + Text.DELIMITER);
+                }
+            }
+            textWidget.append (Text.DELIMITER);
+            return;
+        }
+
+        if (name.equals (ControlExample.getResourceString("FontDialog"))) {
+            FontDialog dialog = new FontDialog (shell, style);
+            dialog.setText (ControlExample.getResourceString("Title"));
+            FontData result = dialog.open ();
+            textWidget.append (ControlExample.getResourceString("FontDialog") + Text.DELIMITER);
+            textWidget.append (ControlExample.getResourceString("Result", new String [] {"" + result}) + Text.DELIMITER + Text.DELIMITER);
+            return;
+        }
+
+        if (name.equals (ControlExample.getResourceString("PrintDialog"))) {
+            PrintDialog dialog = new PrintDialog (shell, style);
+            dialog.setText(ControlExample.getResourceString("Title"));
+            PrinterData result = dialog.open ();
+            textWidget.append (ControlExample.getResourceString("PrintDialog") + Text.DELIMITER);
+            textWidget.append (ControlExample.getResourceString("Result", new String [] {"" + result}) + Text.DELIMITER + Text.DELIMITER);
+            return;
+        }
+
+        if (name.equals(ControlExample.getResourceString("MessageBox"))) {
+            MessageBox dialog = new MessageBox (shell, style);
+            dialog.setMessage (ControlExample.getResourceString("Example_string"));
+            dialog.setText (ControlExample.getResourceString("Title"));
+            int result = dialog.open ();
+            textWidget.append (ControlExample.getResourceString("MessageBox") + Text.DELIMITER);
+            /*
+             * The resulting integer depends on the original
+             * dialog style.  Decode the result and display it.
+             */
+            switch (result) {
+                case DWT.OK:
+                    textWidget.append (ControlExample.getResourceString("Result", new String [] {"DWT.OK"}));
+                    break;
+                case DWT.YES:
+                    textWidget.append (ControlExample.getResourceString("Result", new String [] {"DWT.YES"}));
+                    break;
+                case DWT.NO:
+                    textWidget.append (ControlExample.getResourceString("Result", new String [] {"DWT.NO"}));
+                    break;
+                case DWT.CANCEL:
+                    textWidget.append (ControlExample.getResourceString("Result", new String [] {"DWT.CANCEL"}));
+                    break;
+                case DWT.ABORT:
+                    textWidget.append (ControlExample.getResourceString("Result", new String [] {"DWT.ABORT"}));
+                    break;
+                case DWT.RETRY:
+                    textWidget.append (ControlExample.getResourceString("Result", new String [] {"DWT.RETRY"}));
+                    break;
+                case DWT.IGNORE:
+                    textWidget.append (ControlExample.getResourceString("Result", new String [] {"DWT.IGNORE"}));
+                    break;
+                default:
+                    textWidget.append(ControlExample.getResourceString("Result", new String [] {"" + result}));
+                    break;
+            }
+            textWidget.append (Text.DELIMITER + Text.DELIMITER);
+        }
+    }
+
+    /**
+     * Creates the "Control" group.
+     */
+    void createControlGroup () {
+        /*
+         * Create the "Control" group.  This is the group on the
+         * right half of each example tab.  It consists of the
+         * style group, the display group and the size group.
+         */
+        controlGroup = new Group (tabFolderPage, DWT.NONE);
+        GridLayout gridLayout= new GridLayout ();
+        controlGroup.setLayout(gridLayout);
+        gridLayout.numColumns = 2;
+        gridLayout.makeColumnsEqualWidth = true;
+        controlGroup.setLayoutData (new GridData (GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
+        controlGroup.setText (ControlExample.getResourceString("Parameters"));
+
+        /*
+         * Create a group to hold the dialog style combo box and
+         * create dialog button.
+         */
+        dialogStyleGroup = new Group (controlGroup, DWT.NONE);
+        dialogStyleGroup.setLayout (new GridLayout ());
+        GridData gridData = new GridData (GridData.HORIZONTAL_ALIGN_CENTER);
+        gridData.horizontalSpan = 2;
+        dialogStyleGroup.setLayoutData (gridData);
+        dialogStyleGroup.setText (ControlExample.getResourceString("Dialog_Type"));
+    }
+
+    /**
+     * Creates the "Control" widget children.
+     */
+    void createControlWidgets () {
+
+        /* Create the combo */
+        String [] strings = {
+            ControlExample.getResourceString("ColorDialog"),
+            ControlExample.getResourceString("DirectoryDialog"),
+            ControlExample.getResourceString("FileDialog"),
+            ControlExample.getResourceString("FontDialog"),
+            ControlExample.getResourceString("PrintDialog"),
+            ControlExample.getResourceString("MessageBox"),
+        };
+        dialogCombo = new Combo (dialogStyleGroup, DWT.READ_ONLY);
+        dialogCombo.setItems (strings);
+        dialogCombo.setText (strings [0]);
+        dialogCombo.setVisibleItemCount(strings.length);
+
+        /* Create the create dialog button */
+        createButton = new Button(dialogStyleGroup, DWT.NONE);
+        createButton.setText (ControlExample.getResourceString("Create_Dialog"));
+        createButton.setLayoutData (new GridData(GridData.HORIZONTAL_ALIGN_CENTER));
+
+        /* Create a group for the various dialog button style controls */
+        Group buttonStyleGroup = new Group (controlGroup, DWT.NONE);
+        buttonStyleGroup.setLayout (new GridLayout ());
+        buttonStyleGroup.setLayoutData (new GridData (GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
+        buttonStyleGroup.setText (ControlExample.getResourceString("Button_Styles"));
+
+        /* Create the button style buttons */
+        okButton = new Button (buttonStyleGroup, DWT.CHECK);
+        okButton.setText ("DWT.OK");
+        cancelButton = new Button (buttonStyleGroup, DWT.CHECK);
+        cancelButton.setText ("DWT.CANCEL");
+        yesButton = new Button (buttonStyleGroup, DWT.CHECK);
+        yesButton.setText ("DWT.YES");
+        noButton = new Button (buttonStyleGroup, DWT.CHECK);
+        noButton.setText ("DWT.NO");
+        retryButton = new Button (buttonStyleGroup, DWT.CHECK);
+        retryButton.setText ("DWT.RETRY");
+        abortButton = new Button (buttonStyleGroup, DWT.CHECK);
+        abortButton.setText ("DWT.ABORT");
+        ignoreButton = new Button (buttonStyleGroup, DWT.CHECK);
+        ignoreButton.setText ("DWT.IGNORE");
+
+        /* Create a group for the icon style controls */
+        Group iconStyleGroup = new Group (controlGroup, DWT.NONE);
+        iconStyleGroup.setLayout (new GridLayout ());
+        iconStyleGroup.setLayoutData (new GridData (GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
+        iconStyleGroup.setText (ControlExample.getResourceString("Icon_Styles"));
+
+        /* Create the icon style buttons */
+        iconErrorButton = new Button (iconStyleGroup, DWT.RADIO);
+        iconErrorButton.setText ("DWT.ICON_ERROR");
+        iconInformationButton = new Button (iconStyleGroup, DWT.RADIO);
+        iconInformationButton.setText ("DWT.ICON_INFORMATION");
+        iconQuestionButton = new Button (iconStyleGroup, DWT.RADIO);
+        iconQuestionButton.setText ("DWT.ICON_QUESTION");
+        iconWarningButton = new Button (iconStyleGroup, DWT.RADIO);
+        iconWarningButton.setText ("DWT.ICON_WARNING");
+        iconWorkingButton = new Button (iconStyleGroup, DWT.RADIO);
+        iconWorkingButton.setText ("DWT.ICON_WORKING");
+        noIconButton = new Button (iconStyleGroup, DWT.RADIO);
+        noIconButton.setText (ControlExample.getResourceString("No_Icon"));
+
+        /* Create a group for the modal style controls */
+        Group modalStyleGroup = new Group (controlGroup, DWT.NONE);
+        modalStyleGroup.setLayout (new GridLayout ());
+        modalStyleGroup.setLayoutData (new GridData (GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
+        modalStyleGroup.setText (ControlExample.getResourceString("Modal_Styles"));
+
+        /* Create the modal style buttons */
+        primaryModalButton = new Button (modalStyleGroup, DWT.RADIO);
+        primaryModalButton.setText ("DWT.PRIMARY_MODAL");
+        applicationModalButton = new Button (modalStyleGroup, DWT.RADIO);
+        applicationModalButton.setText ("DWT.APPLICATION_MODAL");
+        systemModalButton = new Button (modalStyleGroup, DWT.RADIO);
+        systemModalButton.setText ("DWT.SYSTEM_MODAL");
+
+        /* Create a group for the file dialog style controls */
+        Group fileDialogStyleGroup = new Group (controlGroup, DWT.NONE);
+        fileDialogStyleGroup.setLayout (new GridLayout ());
+        fileDialogStyleGroup.setLayoutData (new GridData (GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
+        fileDialogStyleGroup.setText (ControlExample.getResourceString("File_Dialog_Styles"));
+
+        /* Create the file dialog style buttons */
+        openButton = new Button(fileDialogStyleGroup, DWT.RADIO);
+        openButton.setText("DWT.OPEN");
+        saveButton = new Button (fileDialogStyleGroup, DWT.RADIO);
+        saveButton.setText ("DWT.SAVE");
+        multiButton = new Button(fileDialogStyleGroup, DWT.CHECK);
+        multiButton.setText("DWT.MULTI");
+
+        /* Create the orientation group */
+        if (RTL_SUPPORT_ENABLE) {
+            createOrientationGroup();
+        }
+
+        /* Add the listeners */
+        dialogCombo.addSelectionListener (new SelectionAdapter () {
+            public void widgetSelected (SelectionEvent event) {
+                dialogSelected (event);
+            }
+        });
+        createButton.addSelectionListener (new SelectionAdapter () {
+            public void widgetSelected (SelectionEvent event) {
+                createButtonSelected (event);
+            }
+        });
+        SelectionListener buttonStyleListener = new SelectionAdapter () {
+            public void widgetSelected (SelectionEvent event) {
+                buttonStyleSelected (event);
+            }
+        };
+        okButton.addSelectionListener (buttonStyleListener);
+        cancelButton.addSelectionListener (buttonStyleListener);
+        yesButton.addSelectionListener (buttonStyleListener);
+        noButton.addSelectionListener (buttonStyleListener);
+        retryButton.addSelectionListener (buttonStyleListener);
+        abortButton.addSelectionListener (buttonStyleListener);
+        ignoreButton.addSelectionListener (buttonStyleListener);
+
+        /* Set default values for style buttons */
+        okButton.setEnabled (false);
+        cancelButton.setEnabled (false);
+        yesButton.setEnabled (false);
+        noButton.setEnabled (false);
+        retryButton.setEnabled (false);
+        abortButton.setEnabled (false);
+        ignoreButton.setEnabled (false);
+        iconErrorButton.setEnabled (false);
+        iconInformationButton.setEnabled (false);
+        iconQuestionButton.setEnabled (false);
+        iconWarningButton.setEnabled (false);
+        iconWorkingButton.setEnabled (false);
+        noIconButton.setEnabled (false);
+        saveButton.setEnabled (false);
+        openButton.setEnabled (false);
+        openButton.setSelection (true);
+        multiButton.setEnabled (false);
+        noIconButton.setSelection (true);
+    }
+
+    /**
+     * Creates the "Example" group.
+     */
+    void createExampleGroup () {
+        super.createExampleGroup ();
+        exampleGroup.setLayoutData (new GridData (DWT.FILL, DWT.FILL, true, true));
+
+        /*
+         * Create a group for the text widget to display
+         * the results returned by the example dialogs.
+         */
+        resultGroup = new Group (exampleGroup, DWT.NONE);
+        resultGroup.setLayout (new GridLayout ());
+        resultGroup.setLayoutData (new GridData (DWT.FILL, DWT.FILL, true, true));
+        resultGroup.setText (ControlExample.getResourceString("Dialog_Result"));
+    }
+
+    /**
+     * Creates the "Example" widgets.
+     */
+    void createExampleWidgets () {
+        /*
+         * Create a multi lined, scrolled text widget for output.
+         */
+        textWidget = new Text(resultGroup, DWT.H_SCROLL | DWT.V_SCROLL | DWT.BORDER);
+        GridData gridData = new GridData (GridData.FILL_BOTH);
+        textWidget.setLayoutData (gridData);
+    }
+
+    /**
+     * The platform dialogs do not have DWT listeners.
+     */
+    void createListenersGroup () {
+    }
+
+    /**
+     * Handle a dialog type combo selection event.
+     *
+     * @param event the selection event
+     */
+    void dialogSelected (SelectionEvent event) {
+
+        /* Enable/Disable the buttons */
+        String name = dialogCombo.getText ();
+        bool isMessageBox = name.equals (ControlExample.getResourceString("MessageBox"));
+        bool isFileDialog = name.equals (ControlExample.getResourceString("FileDialog"));
+        okButton.setEnabled (isMessageBox);
+        cancelButton.setEnabled (isMessageBox);
+        yesButton.setEnabled (isMessageBox);
+        noButton.setEnabled (isMessageBox);
+        retryButton.setEnabled (isMessageBox);
+        abortButton.setEnabled (isMessageBox);
+        ignoreButton.setEnabled (isMessageBox);
+        iconErrorButton.setEnabled (isMessageBox);
+        iconInformationButton.setEnabled (isMessageBox);
+        iconQuestionButton.setEnabled (isMessageBox);
+        iconWarningButton.setEnabled (isMessageBox);
+        iconWorkingButton.setEnabled (isMessageBox);
+        noIconButton.setEnabled (isMessageBox);
+        saveButton.setEnabled (isFileDialog);
+        openButton.setEnabled (isFileDialog);
+        multiButton.setEnabled (isFileDialog);
+
+        /* Unselect the buttons */
+        if (!isMessageBox) {
+            okButton.setSelection (false);
+            cancelButton.setSelection (false);
+            yesButton.setSelection (false);
+            noButton.setSelection (false);
+            retryButton.setSelection (false);
+            abortButton.setSelection (false);
+            ignoreButton.setSelection (false);
+        }
+    }
+
+    /**
+     * Gets the "Example" widget children.
+     */
+    Widget [] getExampleWidgets () {
+        return new Widget [0];
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    String getTabText () {
+        return "Dialog";
+    }
+
+    /**
+     * Recreates the "Example" widgets.
+     */
+    void recreateExampleWidgets () {
+        if (textWidget is null) {
+            super.recreateExampleWidgets ();
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/controlexample/ExpandBarTab.d	Mon Jan 21 01:40:01 2008 +0100
@@ -0,0 +1,153 @@
+/*******************************************************************************
+ * 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
+ *******************************************************************************/
+module dwtexamples.controlexample.ExpandBarTab;
+
+
+
+import dwt.DWT;
+import dwt.layout.GridData;
+import dwt.layout.GridLayout;
+import dwt.widgets.Button;
+import dwt.widgets.Composite;
+import dwt.widgets.ExpandBar;
+import dwt.widgets.ExpandItem;
+import dwt.widgets.Group;
+import dwt.widgets.Label;
+import dwt.widgets.Widget;
+
+class ExpandBarTab : Tab {
+    /* Example widgets and groups that contain them */
+    ExpandBar expandBar1;
+    Group expandBarGroup;
+
+    /* Style widgets added to the "Style" group */
+    Button verticalButton;
+
+    /**
+     * Creates the Tab within a given instance of ControlExample.
+     */
+    this(ControlExample instance) {
+        super(instance);
+    }
+
+    /**
+     * Creates the "Example" group.
+     */
+    void createExampleGroup () {
+        super.createExampleGroup ();
+
+        /* Create a group for the list */
+        expandBarGroup = new Group (exampleGroup, DWT.NONE);
+        expandBarGroup.setLayout (new GridLayout ());
+        expandBarGroup.setLayoutData (new GridData (DWT.FILL, DWT.FILL, true, true));
+        expandBarGroup.setText ("ExpandBar");
+    }
+
+    /**
+     * Creates the "Example" widgets.
+     */
+    void createExampleWidgets () {
+
+        /* Compute the widget style */
+        int style = getDefaultStyle();
+        if (borderButton.getSelection ()) style |= DWT.BORDER;
+        if (verticalButton.getSelection()) style |= DWT.V_SCROLL;
+
+        /* Create the example widgets */
+        expandBar1 = new ExpandBar (expandBarGroup, style);
+
+        // First item
+        Composite composite = new Composite (expandBar1, DWT.NONE);
+        composite.setLayout(new GridLayout ());
+        new Button (composite, DWT.PUSH).setText("DWT.PUSH");
+        new Button (composite, DWT.RADIO).setText("DWT.RADIO");
+        new Button (composite, DWT.CHECK).setText("DWT.CHECK");
+        new Button (composite, DWT.TOGGLE).setText("DWT.TOGGLE");
+        ExpandItem item = new ExpandItem (expandBar1, DWT.NONE, 0);
+        item.setText(ControlExample.getResourceString("Item1_Text"));
+        item.setHeight(composite.computeSize(DWT.DEFAULT, DWT.DEFAULT).y);
+        item.setControl(composite);
+        item.setImage(instance.images[ControlExample.ciClosedFolder]);
+
+        // Second item
+        composite = new Composite (expandBar1, DWT.NONE);
+        composite.setLayout(new GridLayout (2, false));
+        new Label (composite, DWT.NONE).setImage(display.getSystemImage(DWT.ICON_ERROR));
+        new Label (composite, DWT.NONE).setText("DWT.ICON_ERROR");
+        new Label (composite, DWT.NONE).setImage(display.getSystemImage(DWT.ICON_INFORMATION));
+        new Label (composite, DWT.NONE).setText("DWT.ICON_INFORMATION");
+        new Label (composite, DWT.NONE).setImage(display.getSystemImage(DWT.ICON_WARNING));
+        new Label (composite, DWT.NONE).setText("DWT.ICON_WARNING");
+        new Label (composite, DWT.NONE).setImage(display.getSystemImage(DWT.ICON_QUESTION));
+        new Label (composite, DWT.NONE).setText("DWT.ICON_QUESTION");
+        item = new ExpandItem (expandBar1, DWT.NONE, 1);
+        item.setText(ControlExample.getResourceString("Item2_Text"));
+        item.setHeight(composite.computeSize(DWT.DEFAULT, DWT.DEFAULT).y);
+        item.setControl(composite);
+        item.setImage(instance.images[ControlExample.ciOpenFolder]);
+        item.setExpanded(true);
+    }
+
+    /**
+     * Creates the "Style" group.
+     */
+    void createStyleGroup() {
+        super.createStyleGroup ();
+
+        /* Create the extra widgets */
+        verticalButton = new Button (styleGroup, DWT.CHECK);
+        verticalButton.setText ("DWT.V_SCROLL");
+        verticalButton.setSelection(true);
+        borderButton = new Button(styleGroup, DWT.CHECK);
+        borderButton.setText("DWT.BORDER");
+    }
+
+    /**
+     * Gets the "Example" widget children.
+     */
+    Widget [] getExampleWidgets () {
+        return new Widget [] {expandBar1};
+    }
+
+    /**
+     * Returns a list of set/get API method names (without the set/get prefix)
+     * that can be used to set/get values in the example control(s).
+     */
+    String[] getMethodNames() {
+        return new String[] {"Spacing"};
+    }
+
+    /**
+     * Gets the short text for the tab folder item.
+     */
+    public String getShortTabText() {
+        return "EB";
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    String getTabText () {
+        return "ExpandBar";
+    }
+
+    /**
+     * Sets the state of the "Example" widgets.
+     */
+    void setExampleWidgetState () {
+        super.setExampleWidgetState ();
+        Widget [] widgets = getExampleWidgets ();
+        if (widgets.length !is 0){
+            verticalButton.setSelection ((widgets [0].getStyle () & DWT.V_SCROLL) !is 0);
+            borderButton.setSelection ((widgets [0].getStyle () & DWT.BORDER) !is 0);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/controlexample/GroupTab.d	Mon Jan 21 01:40:01 2008 +0100
@@ -0,0 +1,159 @@
+/*******************************************************************************
+ * 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
+ *******************************************************************************/
+module dwtexamples.controlexample.GroupTab;
+
+
+
+import dwt.DWT;
+import dwt.events.SelectionAdapter;
+import dwt.events.SelectionEvent;
+import dwt.layout.GridData;
+import dwt.layout.GridLayout;
+import dwt.widgets.Button;
+import dwt.widgets.Group;
+import dwt.widgets.Widget;
+
+class GroupTab : Tab {
+    Button titleButton;
+
+    /* Example widgets and groups that contain them */
+    Group group1;
+    Group groupGroup;
+
+    /* Style widgets added to the "Style" group */
+    Button shadowEtchedInButton, shadowEtchedOutButton, shadowInButton, shadowOutButton, shadowNoneButton;
+
+    /**
+     * Creates the Tab within a given instance of ControlExample.
+     */
+    this(ControlExample instance) {
+        super(instance);
+    }
+
+    /**
+     * Creates the "Other" group.
+     */
+    void createOtherGroup () {
+        super.createOtherGroup ();
+
+        /* Create display controls specific to this example */
+        titleButton = new Button (otherGroup, DWT.CHECK);
+        titleButton.setText (ControlExample.getResourceString("Title_Text"));
+
+        /* Add the listeners */
+        titleButton.addSelectionListener (new SelectionAdapter () {
+            public void widgetSelected (SelectionEvent event) {
+                setTitleText ();
+            }
+        });
+    }
+
+    /**
+     * Creates the "Example" group.
+     */
+    void createExampleGroup () {
+        super.createExampleGroup ();
+
+        /* Create a group for the Group */
+        groupGroup = new Group (exampleGroup, DWT.NONE);
+        groupGroup.setLayout (new GridLayout ());
+        groupGroup.setLayoutData (new GridData (DWT.FILL, DWT.FILL, true, true));
+        groupGroup.setText ("Group");
+    }
+
+    /**
+     * Creates the "Example" widgets.
+     */
+    void createExampleWidgets () {
+
+        /* Compute the widget style */
+        int style = getDefaultStyle();
+        if (shadowEtchedInButton.getSelection ()) style |= DWT.SHADOW_ETCHED_IN;
+        if (shadowEtchedOutButton.getSelection ()) style |= DWT.SHADOW_ETCHED_OUT;
+        if (shadowInButton.getSelection ()) style |= DWT.SHADOW_IN;
+        if (shadowOutButton.getSelection ()) style |= DWT.SHADOW_OUT;
+        if (shadowNoneButton.getSelection ()) style |= DWT.SHADOW_NONE;
+        if (borderButton.getSelection ()) style |= DWT.BORDER;
+
+        /* Create the example widgets */
+        group1 = new Group (groupGroup, style);
+    }
+
+    /**
+     * Creates the "Style" group.
+     */
+    void createStyleGroup() {
+        super.createStyleGroup ();
+
+        /* Create the extra widgets */
+        shadowEtchedInButton = new Button (styleGroup, DWT.RADIO);
+        shadowEtchedInButton.setText ("DWT.SHADOW_ETCHED_IN");
+        shadowEtchedInButton.setSelection(true);
+        shadowEtchedOutButton = new Button (styleGroup, DWT.RADIO);
+        shadowEtchedOutButton.setText ("DWT.SHADOW_ETCHED_OUT");
+        shadowInButton = new Button (styleGroup, DWT.RADIO);
+        shadowInButton.setText ("DWT.SHADOW_IN");
+        shadowOutButton = new Button (styleGroup, DWT.RADIO);
+        shadowOutButton.setText ("DWT.SHADOW_OUT");
+        shadowNoneButton = new Button (styleGroup, DWT.RADIO);
+        shadowNoneButton.setText ("DWT.SHADOW_NONE");
+        borderButton = new Button (styleGroup, DWT.CHECK);
+        borderButton.setText ("DWT.BORDER");
+    }
+
+    /**
+     * Gets the "Example" widget children.
+     */
+    Widget [] getExampleWidgets () {
+        return new Widget [] {group1};
+    }
+
+    /**
+     * Returns a list of set/get API method names (without the set/get prefix)
+     * that can be used to set/get values in the example control(s).
+     */
+    String[] getMethodNames() {
+        return new String[] {"ToolTipText"};
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    String getTabText () {
+        return "Group";
+    }
+
+    /**
+     * Sets the title text of the "Example" widgets.
+     */
+    void setTitleText () {
+        if (titleButton.getSelection ()) {
+            group1.setText (ControlExample.getResourceString("Title_Text"));
+        } else {
+            group1.setText ("");
+        }
+        setExampleWidgetSize ();
+    }
+
+    /**
+     * Sets the state of the "Example" widgets.
+     */
+    void setExampleWidgetState () {
+        super.setExampleWidgetState ();
+        shadowEtchedInButton.setSelection ((group1.getStyle () & DWT.SHADOW_ETCHED_IN) !is 0);
+        shadowEtchedOutButton.setSelection ((group1.getStyle () & DWT.SHADOW_ETCHED_OUT) !is 0);
+        shadowInButton.setSelection ((group1.getStyle () & DWT.SHADOW_IN) !is 0);
+        shadowOutButton.setSelection ((group1.getStyle () & DWT.SHADOW_OUT) !is 0);
+        shadowNoneButton.setSelection ((group1.getStyle () & DWT.SHADOW_NONE) !is 0);
+        borderButton.setSelection ((group1.getStyle () & DWT.BORDER) !is 0);
+        if (!instance.startup) setTitleText ();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/controlexample/LabelTab.d	Mon Jan 21 01:40:01 2008 +0100
@@ -0,0 +1,189 @@
+/*******************************************************************************
+ * 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
+ *******************************************************************************/
+module dwtexamples.controlexample.LabelTab;
+
+
+
+import dwt.DWT;
+import dwt.layout.GridData;
+import dwt.layout.GridLayout;
+import dwt.widgets.Button;
+import dwt.widgets.Group;
+import dwt.widgets.Label;
+import dwt.widgets.Widget;
+
+class LabelTab : AlignableTab {
+    /* Example widgets and groups that contain them */
+    Label label1, label2, label3, label4, label5, label6;
+    Group textLabelGroup, imageLabelGroup;
+
+    /* Style widgets added to the "Style" group */
+    Button wrapButton, separatorButton, horizontalButton, verticalButton, shadowInButton, shadowOutButton, shadowNoneButton;
+
+    /**
+     * Creates the Tab within a given instance of ControlExample.
+     */
+    this(ControlExample instance) {
+        super(instance);
+    }
+
+    /**
+     * Creates the "Example" group.
+     */
+    void createExampleGroup () {
+        super.createExampleGroup ();
+
+        /* Create a group for the text labels */
+        textLabelGroup = new Group(exampleGroup, DWT.NONE);
+        GridLayout gridLayout = new GridLayout ();
+        textLabelGroup.setLayout (gridLayout);
+        gridLayout.numColumns = 3;
+        textLabelGroup.setLayoutData (new GridData (DWT.FILL, DWT.FILL, true, true));
+        textLabelGroup.setText (ControlExample.getResourceString("Text_Labels"));
+
+        /* Create a group for the image labels */
+        imageLabelGroup = new Group (exampleGroup, DWT.SHADOW_NONE);
+        gridLayout = new GridLayout ();
+        imageLabelGroup.setLayout (gridLayout);
+        gridLayout.numColumns = 3;
+        imageLabelGroup.setLayoutData (new GridData (DWT.FILL, DWT.FILL, true, true));
+        imageLabelGroup.setText (ControlExample.getResourceString("Image_Labels"));
+    }
+
+    /**
+     * Creates the "Example" widgets.
+     */
+    void createExampleWidgets () {
+
+        /* Compute the widget style */
+        int style = getDefaultStyle();
+        if (wrapButton.getSelection ()) style |= DWT.WRAP;
+        if (separatorButton.getSelection ()) style |= DWT.SEPARATOR;
+        if (horizontalButton.getSelection ()) style |= DWT.HORIZONTAL;
+        if (verticalButton.getSelection ()) style |= DWT.VERTICAL;
+        if (shadowInButton.getSelection ()) style |= DWT.SHADOW_IN;
+        if (shadowOutButton.getSelection ()) style |= DWT.SHADOW_OUT;
+        if (shadowNoneButton.getSelection ()) style |= DWT.SHADOW_NONE;
+        if (borderButton.getSelection ()) style |= DWT.BORDER;
+        if (leftButton.getSelection ()) style |= DWT.LEFT;
+        if (centerButton.getSelection ()) style |= DWT.CENTER;
+        if (rightButton.getSelection ()) style |= DWT.RIGHT;
+
+        /* Create the example widgets */
+        label1 = new Label (textLabelGroup, style);
+        label1.setText(ControlExample.getResourceString("One"));
+        label2 = new Label (textLabelGroup, style);
+        label2.setText(ControlExample.getResourceString("Two"));
+        label3 = new Label (textLabelGroup, style);
+        if (wrapButton.getSelection ()) {
+            label3.setText (ControlExample.getResourceString("Wrap_Text"));
+        } else {
+            label3.setText (ControlExample.getResourceString("Three"));
+        }
+        label4 = new Label (imageLabelGroup, style);
+        label4.setImage (instance.images[ControlExample.ciClosedFolder]);
+        label5 = new Label (imageLabelGroup, style);
+        label5.setImage (instance.images[ControlExample.ciOpenFolder]);
+        label6 = new Label(imageLabelGroup, style);
+        label6.setImage (instance.images[ControlExample.ciTarget]);
+    }
+
+    /**
+     * Creates the "Style" group.
+     */
+    void createStyleGroup() {
+        super.createStyleGroup ();
+
+        /* Create the extra widgets */
+        wrapButton = new Button (styleGroup, DWT.CHECK);
+        wrapButton.setText ("DWT.WRAP");
+        separatorButton = new Button (styleGroup, DWT.CHECK);
+        separatorButton.setText ("DWT.SEPARATOR");
+        horizontalButton = new Button (styleGroup, DWT.RADIO);
+        horizontalButton.setText ("DWT.HORIZONTAL");
+        verticalButton = new Button (styleGroup, DWT.RADIO);
+        verticalButton.setText ("DWT.VERTICAL");
+        Group styleSubGroup = new Group (styleGroup, DWT.NONE);
+        styleSubGroup.setLayout (new GridLayout ());
+        shadowInButton = new Button (styleSubGroup, DWT.RADIO);
+        shadowInButton.setText ("DWT.SHADOW_IN");
+        shadowOutButton = new Button (styleSubGroup, DWT.RADIO);
+        shadowOutButton.setText ("DWT.SHADOW_OUT");
+        shadowNoneButton = new Button (styleSubGroup, DWT.RADIO);
+        shadowNoneButton.setText ("DWT.SHADOW_NONE");
+        borderButton = new Button(styleGroup, DWT.CHECK);
+        borderButton.setText("DWT.BORDER");
+    }
+
+    /**
+     * Gets the "Example" widget children.
+     */
+    Widget [] getExampleWidgets () {
+        return new Widget [] {label1, label2, label3, label4, label5, label6};
+    }
+
+    /**
+     * Returns a list of set/get API method names (without the set/get prefix)
+     * that can be used to set/get values in the example control(s).
+     */
+    String[] getMethodNames() {
+        return new String[] {"Text", "ToolTipText"};
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    String getTabText () {
+        return "Label";
+    }
+
+    /**
+     * Sets the alignment of the "Example" widgets.
+     */
+    void setExampleWidgetAlignment () {
+        int alignment = 0;
+        if (leftButton.getSelection ()) alignment = DWT.LEFT;
+        if (centerButton.getSelection ()) alignment = DWT.CENTER;
+        if (rightButton.getSelection ()) alignment = DWT.RIGHT;
+        label1.setAlignment (alignment);
+        label2.setAlignment (alignment);
+        label3.setAlignment (alignment);
+        label4.setAlignment (alignment);
+        label5.setAlignment (alignment);
+        label6.setAlignment (alignment);
+    }
+
+    /**
+     * Sets the state of the "Example" widgets.
+     */
+    void setExampleWidgetState () {
+        super.setExampleWidgetState ();
+        bool isSeparator = (label1.getStyle () & DWT.SEPARATOR) !is 0;
+        wrapButton.setSelection (!isSeparator && (label1.getStyle () & DWT.WRAP) !is 0);
+        leftButton.setSelection (!isSeparator && (label1.getStyle () & DWT.LEFT) !is 0);
+        centerButton.setSelection (!isSeparator && (label1.getStyle () & DWT.CENTER) !is 0);
+        rightButton.setSelection (!isSeparator && (label1.getStyle () & DWT.RIGHT) !is 0);
+        shadowInButton.setSelection (isSeparator && (label1.getStyle () & DWT.SHADOW_IN) !is 0);
+        shadowOutButton.setSelection (isSeparator && (label1.getStyle () & DWT.SHADOW_OUT) !is 0);
+        shadowNoneButton.setSelection (isSeparator && (label1.getStyle () & DWT.SHADOW_NONE) !is 0);
+        horizontalButton.setSelection (isSeparator && (label1.getStyle () & DWT.HORIZONTAL) !is 0);
+        verticalButton.setSelection (isSeparator && (label1.getStyle () & DWT.VERTICAL) !is 0);
+        wrapButton.setEnabled (!isSeparator);
+        leftButton.setEnabled (!isSeparator);
+        centerButton.setEnabled (!isSeparator);
+        rightButton.setEnabled (!isSeparator);
+        shadowInButton.setEnabled (isSeparator);
+        shadowOutButton.setEnabled (isSeparator);
+        shadowNoneButton.setEnabled (isSeparator);
+        horizontalButton.setEnabled (isSeparator);
+        verticalButton.setEnabled (isSeparator);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/controlexample/LinkTab.d	Mon Jan 21 01:40:01 2008 +0100
@@ -0,0 +1,105 @@
+/*******************************************************************************
+ * 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
+ *******************************************************************************/
+module dwtexamples.controlexample.LinkTab;
+
+
+
+import dwt.DWT;
+import dwt.DWTError;
+import dwt.layout.GridData;
+import dwt.layout.GridLayout;
+import dwt.widgets.Button;
+import dwt.widgets.Group;
+import dwt.widgets.Label;
+import dwt.widgets.Link;
+import dwt.widgets.Widget;
+
+class LinkTab : Tab {
+    /* Example widgets and groups that contain them */
+    Link link1;
+    Group linkGroup;
+
+    /**
+     * Creates the Tab within a given instance of ControlExample.
+     */
+    this(ControlExample instance) {
+        super(instance);
+    }
+
+    /**
+     * Creates the "Example" group.
+     */
+    void createExampleGroup () {
+        super.createExampleGroup ();
+
+        /* Create a group for the list */
+        linkGroup = new Group (exampleGroup, DWT.NONE);
+        linkGroup.setLayout (new GridLayout ());
+        linkGroup.setLayoutData (new GridData (DWT.FILL, DWT.FILL, true, true));
+        linkGroup.setText ("Link");
+    }
+
+    /**
+     * Creates the "Example" widgets.
+     */
+    void createExampleWidgets () {
+
+        /* Compute the widget style */
+        int style = getDefaultStyle();
+        if (borderButton.getSelection ()) style |= DWT.BORDER;
+
+        /* Create the example widgets */
+        try {
+            link1 = new Link (linkGroup, style);
+            link1.setText (ControlExample.getResourceString("LinkText"));
+        } catch (DWTError e) {
+            // temporary code for photon
+            Label label = new Label (linkGroup, DWT.CENTER | DWT.WRAP);
+            label.setText ("Link widget not suported");
+        }
+    }
+
+    /**
+     * Creates the "Style" group.
+     */
+    void createStyleGroup() {
+        super.createStyleGroup ();
+
+        /* Create the extra widgets */
+        borderButton = new Button(styleGroup, DWT.CHECK);
+        borderButton.setText("DWT.BORDER");
+    }
+
+    /**
+     * Gets the "Example" widget children.
+     */
+    Widget [] getExampleWidgets () {
+//       temporary code for photon
+        if (link1 !is null) return new Widget [] {link1};
+        return new Widget[] {};
+    }
+
+    /**
+     * Returns a list of set/get API method names (without the set/get prefix)
+     * that can be used to set/get values in the example control(s).
+     */
+    String[] getMethodNames() {
+        return new String[] {"Text", "ToolTipText"};
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    String getTabText () {
+        return "Link";
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/controlexample/ListTab.d	Mon Jan 21 01:40:01 2008 +0100
@@ -0,0 +1,97 @@
+/*******************************************************************************
+ * 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
+ *******************************************************************************/
+module dwtexamples.controlexample.ListTab;
+
+
+
+import dwt.DWT;
+import dwt.layout.GridData;
+import dwt.layout.GridLayout;
+import dwt.widgets.Group;
+import dwt.widgets.List;
+import dwt.widgets.Widget;
+
+class ListTab : ScrollableTab {
+
+    /* Example widgets and groups that contain them */
+    List list1;
+    Group listGroup;
+
+    static String [] ListData1 = {ControlExample.getResourceString("ListData1_0"),
+                                  ControlExample.getResourceString("ListData1_1"),
+                                  ControlExample.getResourceString("ListData1_2"),
+                                  ControlExample.getResourceString("ListData1_3"),
+                                  ControlExample.getResourceString("ListData1_4"),
+                                  ControlExample.getResourceString("ListData1_5"),
+                                  ControlExample.getResourceString("ListData1_6"),
+                                  ControlExample.getResourceString("ListData1_7"),
+                                  ControlExample.getResourceString("ListData1_8")};
+
+    /**
+     * Creates the Tab within a given instance of ControlExample.
+     */
+    this(ControlExample instance) {
+        super(instance);
+    }
+
+    /**
+     * Creates the "Example" group.
+     */
+    void createExampleGroup () {
+        super.createExampleGroup ();
+
+        /* Create a group for the list */
+        listGroup = new Group (exampleGroup, DWT.NONE);
+        listGroup.setLayout (new GridLayout ());
+        listGroup.setLayoutData (new GridData (DWT.FILL, DWT.FILL, true, true));
+        listGroup.setText ("List");
+    }
+
+    /**
+     * Creates the "Example" widgets.
+     */
+    void createExampleWidgets () {
+
+        /* Compute the widget style */
+        int style = getDefaultStyle();
+        if (singleButton.getSelection ()) style |= DWT.SINGLE;
+        if (multiButton.getSelection ()) style |= DWT.MULTI;
+        if (horizontalButton.getSelection ()) style |= DWT.H_SCROLL;
+        if (verticalButton.getSelection ()) style |= DWT.V_SCROLL;
+        if (borderButton.getSelection ()) style |= DWT.BORDER;
+
+        /* Create the example widgets */
+        list1 = new List (listGroup, style);
+        list1.setItems (ListData1);
+    }
+
+    /**
+     * Gets the "Example" widget children.
+     */
+    Widget [] getExampleWidgets () {
+        return new Widget [] {list1};
+    }
+
+    /**
+     * Returns a list of set/get API method names (without the set/get prefix)
+     * that can be used to set/get values in the example control(s).
+     */
+    String[] getMethodNames() {
+        return new String[] {"Items", "Selection", "ToolTipText", "TopIndex"};
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    String getTabText () {
+        return "List";
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/controlexample/MenuTab.d	Mon Jan 21 01:40:01 2008 +0100
@@ -0,0 +1,319 @@
+/*******************************************************************************
+ * 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
+ *******************************************************************************/
+module dwtexamples.controlexample.MenuTab;
+
+
+
+import dwt.DWT;
+import dwt.events.PaintEvent;
+import dwt.events.PaintListener;
+import dwt.events.SelectionAdapter;
+import dwt.events.SelectionEvent;
+import dwt.layout.GridData;
+import dwt.layout.GridLayout;
+import dwt.widgets.Button;
+import dwt.widgets.Group;
+import dwt.widgets.Label;
+import dwt.widgets.Menu;
+import dwt.widgets.MenuItem;
+import dwt.widgets.Shell;
+
+class MenuTab : Tab {
+    /* Widgets added to the "Menu Style", "MenuItem Style" and "Other" groups */
+    Button barButton, dropDownButton, popUpButton, noRadioGroupButton, leftToRightButton, rightToLeftButton;
+    Button checkButton, cascadeButton, pushButton, radioButton, separatorButton;
+    Button imagesButton, acceleratorsButton, mnemonicsButton, subMenuButton, subSubMenuButton;
+    Button createButton, closeAllButton;
+    Group menuItemStyleGroup;
+
+    /* Variables used to track the open shells */
+    int shellCount = 0;
+    Shell [] shells = new Shell [4];
+
+    /**
+     * Creates the Tab within a given instance of ControlExample.
+     */
+    this(ControlExample instance) {
+        super(instance);
+    }
+
+    /**
+     * Close all the example shells.
+     */
+    void closeAllShells() {
+        for (int i = 0; i<shellCount; i++) {
+            if (shells[i] !is null & !shells [i].isDisposed ()) {
+                shells [i].dispose();
+            }
+        }
+        shellCount = 0;
+    }
+
+    /**
+     * Handle the Create button selection event.
+     *
+     * @param event org.eclipse.swt.events.SelectionEvent
+     */
+    public void createButtonSelected(SelectionEvent event) {
+
+        /*
+         * Remember the example shells so they
+         * can be disposed by the user.
+         */
+        if (shellCount >= shells.length) {
+            Shell [] newShells = new Shell [shells.length + 4];
+            System.arraycopy (shells, 0, newShells, 0, shells.length);
+            shells = newShells;
+        }
+
+        int orientation = 0;
+        if (leftToRightButton.getSelection()) orientation |= DWT.LEFT_TO_RIGHT;
+        if (rightToLeftButton.getSelection()) orientation |= DWT.RIGHT_TO_LEFT;
+        int radioBehavior = 0;
+        if (noRadioGroupButton.getSelection()) radioBehavior |= DWT.NO_RADIO_GROUP;
+
+        /* Create the shell and menu(s) */
+        Shell shell = new Shell (DWT.SHELL_TRIM | orientation);
+        shells [shellCount] = shell;
+        if (barButton.getSelection ()) {
+            /* Create menu bar. */
+            Menu menuBar = new Menu(shell, DWT.BAR | radioBehavior);
+            shell.setMenuBar(menuBar);
+            hookListeners(menuBar);
+
+            if (dropDownButton.getSelection() && cascadeButton.getSelection()) {
+                /* Create cascade button and drop-down menu in menu bar. */
+                MenuItem item = new MenuItem(menuBar, DWT.CASCADE);
+                item.setText(getMenuItemText("Cascade"));
+                if (imagesButton.getSelection()) item.setImage(instance.images[ControlExample.ciOpenFolder]);
+                hookListeners(item);
+                Menu dropDownMenu = new Menu(shell, DWT.DROP_DOWN | radioBehavior);
+                item.setMenu(dropDownMenu);
+                hookListeners(dropDownMenu);
+
+                /* Create various menu items, depending on selections. */
+                createMenuItems(dropDownMenu, subMenuButton.getSelection(), subSubMenuButton.getSelection());
+            }
+        }
+
+        if (popUpButton.getSelection()) {
+            /* Create pop-up menu. */
+            Menu popUpMenu = new Menu(shell, DWT.POP_UP | radioBehavior);
+            shell.setMenu(popUpMenu);
+            hookListeners(popUpMenu);
+
+            /* Create various menu items, depending on selections. */
+            createMenuItems(popUpMenu, subMenuButton.getSelection(), subSubMenuButton.getSelection());
+        }
+
+        /* Set the size, title and open the shell. */
+        shell.setSize (300, 100);
+        shell.setText (ControlExample.getResourceString("Title") + shellCount);
+        shell.addPaintListener(new PaintListener() {
+            public void paintControl(PaintEvent e) {
+                e.gc.drawString(ControlExample.getResourceString("PopupMenuHere"), 20, 20);
+            }
+        });
+        shell.open ();
+        shellCount++;
+    }
+
+    /**
+     * Creates the "Control" group.
+     */
+    void createControlGroup () {
+        /*
+         * Create the "Control" group.  This is the group on the
+         * right half of each example tab.  For MenuTab, it consists of
+         * the Menu style group, the MenuItem style group and the 'other' group.
+         */
+        controlGroup = new Group (tabFolderPage, DWT.NONE);
+        controlGroup.setLayout (new GridLayout (2, true));
+        controlGroup.setLayoutData (new GridData (GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
+        controlGroup.setText (ControlExample.getResourceString("Parameters"));
+
+        /* Create a group for the menu style controls */
+        styleGroup = new Group (controlGroup, DWT.NONE);
+        styleGroup.setLayout (new GridLayout ());
+        styleGroup.setLayoutData (new GridData (GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
+        styleGroup.setText (ControlExample.getResourceString("Menu_Styles"));
+
+        /* Create a group for the menu item style controls */
+        menuItemStyleGroup = new Group (controlGroup, DWT.NONE);
+        menuItemStyleGroup.setLayout (new GridLayout ());
+        menuItemStyleGroup.setLayoutData (new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
+        menuItemStyleGroup.setText (ControlExample.getResourceString("MenuItem_Styles"));
+
+        /* Create a group for the 'other' controls */
+        otherGroup = new Group (controlGroup, DWT.NONE);
+        otherGroup.setLayout (new GridLayout ());
+        otherGroup.setLayoutData (new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
+        otherGroup.setText (ControlExample.getResourceString("Other"));
+    }
+
+    /**
+     * Creates the "Control" widget children.
+     */
+    void createControlWidgets () {
+
+        /* Create the menu style buttons */
+        barButton = new Button (styleGroup, DWT.CHECK);
+        barButton.setText ("DWT.BAR");
+        dropDownButton = new Button (styleGroup, DWT.CHECK);
+        dropDownButton.setText ("DWT.DROP_DOWN");
+        popUpButton = new Button (styleGroup, DWT.CHECK);
+        popUpButton.setText ("DWT.POP_UP");
+        noRadioGroupButton = new Button (styleGroup, DWT.CHECK);
+        noRadioGroupButton.setText ("DWT.NO_RADIO_GROUP");
+        leftToRightButton = new Button (styleGroup, DWT.RADIO);
+        leftToRightButton.setText ("DWT.LEFT_TO_RIGHT");
+        leftToRightButton.setSelection(true);
+        rightToLeftButton = new Button (styleGroup, DWT.RADIO);
+        rightToLeftButton.setText ("DWT.RIGHT_TO_LEFT");
+
+        /* Create the menu item style buttons */
+        cascadeButton = new Button (menuItemStyleGroup, DWT.CHECK);
+        cascadeButton.setText ("DWT.CASCADE");
+        checkButton = new Button (menuItemStyleGroup, DWT.CHECK);
+        checkButton.setText ("DWT.CHECK");
+        pushButton = new Button (menuItemStyleGroup, DWT.CHECK);
+        pushButton.setText ("DWT.PUSH");
+        radioButton = new Button (menuItemStyleGroup, DWT.CHECK);
+        radioButton.setText ("DWT.RADIO");
+        separatorButton = new Button (menuItemStyleGroup, DWT.CHECK);
+        separatorButton.setText ("DWT.SEPARATOR");
+
+        /* Create the 'other' buttons */
+        imagesButton = new Button (otherGroup, DWT.CHECK);
+        imagesButton.setText (ControlExample.getResourceString("Images"));
+        acceleratorsButton = new Button (otherGroup, DWT.CHECK);
+        acceleratorsButton.setText (ControlExample.getResourceString("Accelerators"));
+        mnemonicsButton = new Button (otherGroup, DWT.CHECK);
+        mnemonicsButton.setText (ControlExample.getResourceString("Mnemonics"));
+        subMenuButton = new Button (otherGroup, DWT.CHECK);
+        subMenuButton.setText (ControlExample.getResourceString("SubMenu"));
+        subSubMenuButton = new Button (otherGroup, DWT.CHECK);
+        subSubMenuButton.setText (ControlExample.getResourceString("SubSubMenu"));
+
+        /* Create the "create" and "closeAll" buttons (and a 'filler' label to place them) */
+        new Label(controlGroup, DWT.NONE);
+        createButton = new Button (controlGroup, DWT.NONE);
+        createButton.setLayoutData (new GridData (GridData.HORIZONTAL_ALIGN_END));
+        createButton.setText (ControlExample.getResourceString("Create_Shell"));
+        closeAllButton = new Button (controlGroup, DWT.NONE);
+        closeAllButton.setLayoutData (new GridData (GridData.HORIZONTAL_ALIGN_BEGINNING));
+        closeAllButton.setText (ControlExample.getResourceString("Close_All_Shells"));
+
+        /* Add the listeners */
+        createButton.addSelectionListener(new SelectionAdapter() {
+            public void widgetSelected(SelectionEvent e) {
+                createButtonSelected(e);
+            }
+        });
+        closeAllButton.addSelectionListener(new SelectionAdapter() {
+            public void widgetSelected(SelectionEvent e) {
+                closeAllShells ();
+            }
+        });
+        subMenuButton.addSelectionListener(new SelectionAdapter() {
+            public void widgetSelected(SelectionEvent e) {
+                subSubMenuButton.setEnabled (subMenuButton.getSelection ());
+            }
+        });
+
+        /* Set the default state */
+        barButton.setSelection (true);
+        dropDownButton.setSelection (true);
+        popUpButton.setSelection (true);
+        cascadeButton.setSelection (true);
+        checkButton.setSelection (true);
+        pushButton.setSelection (true);
+        radioButton.setSelection (true);
+        separatorButton.setSelection (true);
+        subSubMenuButton.setEnabled (subMenuButton.getSelection ());
+    }
+
+    /* Create various menu items, depending on selections. */
+    void createMenuItems(Menu menu, bool createSubMenu, bool createSubSubMenu) {
+        MenuItem item;
+        if (pushButton.getSelection()) {
+            item = new MenuItem(menu, DWT.PUSH);
+            item.setText(getMenuItemText("Push"));
+            if (acceleratorsButton.getSelection()) item.setAccelerator(DWT.MOD1 + DWT.MOD2 + 'P');
+            if (imagesButton.getSelection()) item.setImage(instance.images[ControlExample.ciClosedFolder]);
+            hookListeners(item);
+        }
+
+        if (separatorButton.getSelection()) {
+            new MenuItem(menu, DWT.SEPARATOR);
+        }
+
+        if (checkButton.getSelection()) {
+            item = new MenuItem(menu, DWT.CHECK);
+            item.setText(getMenuItemText("Check"));
+            if (acceleratorsButton.getSelection()) item.setAccelerator(DWT.MOD1 + DWT.MOD2 + 'C');
+            if (imagesButton.getSelection()) item.setImage(instance.images[ControlExample.ciOpenFolder]);
+            hookListeners(item);
+        }
+
+        if (radioButton.getSelection()) {
+            item = new MenuItem(menu, DWT.RADIO);
+            item.setText(getMenuItemText("1Radio"));
+            if (acceleratorsButton.getSelection()) item.setAccelerator(DWT.MOD1 + DWT.MOD2 + '1');
+            if (imagesButton.getSelection()) item.setImage(instance.images[ControlExample.ciTarget]);
+            item.setSelection(true);
+            hookListeners(item);
+
+            item = new MenuItem(menu, DWT.RADIO);
+            item.setText(getMenuItemText("2Radio"));
+            if (acceleratorsButton.getSelection()) item.setAccelerator(DWT.MOD1 + DWT.MOD2 + '2');
+            if (imagesButton.getSelection()) item.setImage(instance.images[ControlExample.ciTarget]);
+            hookListeners(item);
+        }
+
+        if (createSubMenu && cascadeButton.getSelection()) {
+            /* Create cascade button and drop-down menu for the sub-menu. */
+            item = new MenuItem(menu, DWT.CASCADE);
+            item.setText(getMenuItemText("Cascade"));
+            if (imagesButton.getSelection()) item.setImage(instance.images[ControlExample.ciOpenFolder]);
+            hookListeners(item);
+            Menu subMenu = new Menu(menu.getShell(), DWT.DROP_DOWN);
+            item.setMenu(subMenu);
+            hookListeners(subMenu);
+
+            createMenuItems(subMenu, createSubSubMenu, false);
+        }
+    }
+
+    String getMenuItemText(String item) {
+        bool cascade = item.equals("Cascade");
+        bool mnemonic = mnemonicsButton.getSelection();
+        bool accelerator = acceleratorsButton.getSelection();
+        char acceleratorKey = item.charAt(0);
+        if (mnemonic && accelerator && !cascade) {
+            return ControlExample.getResourceString(item + "WithMnemonic") + "\tCtrl+Shift+" + acceleratorKey;
+        }
+        if (accelerator && !cascade) {
+            return ControlExample.getResourceString(item) + "\tCtrl+Shift+" + acceleratorKey;
+        }
+        if (mnemonic) {
+            return ControlExample.getResourceString(item + "WithMnemonic");
+        }
+        return ControlExample.getResourceString(item);
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    String getTabText () {
+        return "Menu";
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/controlexample/ProgressBarTab.d	Mon Jan 21 01:40:01 2008 +0100
@@ -0,0 +1,183 @@
+/*******************************************************************************
+ * 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
+ *******************************************************************************/
+module dwtexamples.controlexample.ProgressBarTab;
+
+
+
+import dwt.DWT;
+import dwt.layout.GridData;
+import dwt.layout.GridLayout;
+import dwt.widgets.Button;
+import dwt.widgets.Group;
+import dwt.widgets.ProgressBar;
+import dwt.widgets.Widget;
+
+class ProgressBarTab : RangeTab {
+    /* Example widgets and groups that contain them */
+    ProgressBar progressBar1;
+    Group progressBarGroup;
+
+    /* Style widgets added to the "Style" group */
+    Button smoothButton;
+    Button indeterminateButton;
+
+    /**
+     * Creates the Tab within a given instance of ControlExample.
+     */
+    this(ControlExample instance) {
+        super(instance);
+    }
+
+    /**
+     * Creates the "Example" group.
+     */
+    void createExampleGroup() {
+        super.createExampleGroup ();
+
+        /* Create a group for the progress bar */
+        progressBarGroup = new Group (exampleGroup, DWT.NONE);
+        progressBarGroup.setLayout (new GridLayout ());
+        progressBarGroup.setLayoutData (new GridData (DWT.FILL, DWT.FILL, true, true));
+        progressBarGroup.setText ("ProgressBar");
+    }
+
+    /**
+     * Creates the "Example" widgets.
+     */
+    void createExampleWidgets () {
+
+        /* Compute the widget style */
+        int style = getDefaultStyle();
+        if (horizontalButton.getSelection ()) style |= DWT.HORIZONTAL;
+        if (verticalButton.getSelection ()) style |= DWT.VERTICAL;
+        if (smoothButton.getSelection ()) style |= DWT.SMOOTH;
+        if (borderButton.getSelection ()) style |= DWT.BORDER;
+        if (indeterminateButton.getSelection ()) style |= DWT.INDETERMINATE;
+
+        /* Create the example widgets */
+        progressBar1 = new ProgressBar (progressBarGroup, style);
+    }
+
+    /**
+     * Creates the "Style" group.
+     */
+    void createStyleGroup () {
+        super.createStyleGroup ();
+
+        /* Create the extra widgets */
+        smoothButton = new Button (styleGroup, DWT.CHECK);
+        smoothButton.setText ("DWT.SMOOTH");
+        indeterminateButton = new Button (styleGroup, DWT.CHECK);
+        indeterminateButton.setText ("DWT.INDETERMINATE");
+    }
+
+    /**
+     * Gets the "Example" widget children.
+     */
+    Widget [] getExampleWidgets () {
+        return new Widget [] {progressBar1};
+    }
+
+    /**
+     * Returns a list of set/get API method names (without the set/get prefix)
+     * that can be used to set/get values in the example control(s).
+     */
+    String[] getMethodNames() {
+        return new String[] {"Selection", "ToolTipText"};
+    }
+
+    /**
+     * Gets the short text for the tab folder item.
+     */
+    public String getShortTabText() {
+        return "PB";
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    String getTabText () {
+        return "ProgressBar";
+    }
+
+    /**
+     * Sets the state of the "Example" widgets.
+     */
+    void setExampleWidgetState () {
+        super.setExampleWidgetState ();
+        if (indeterminateButton.getSelection ()) {
+            selectionSpinner.setEnabled (false);
+            minimumSpinner.setEnabled (false);
+            maximumSpinner.setEnabled (false);
+        } else {
+            selectionSpinner.setEnabled (true);
+            minimumSpinner.setEnabled (true);
+            maximumSpinner.setEnabled (true);
+        }
+        smoothButton.setSelection ((progressBar1.getStyle () & DWT.SMOOTH) !is 0);
+        indeterminateButton.setSelection ((progressBar1.getStyle () & DWT.INDETERMINATE) !is 0);
+    }
+
+    /**
+     * Gets the default maximum of the "Example" widgets.
+     */
+    int getDefaultMaximum () {
+        return progressBar1.getMaximum();
+    }
+
+    /**
+     * Gets the default minimim of the "Example" widgets.
+     */
+    int getDefaultMinimum () {
+        return progressBar1.getMinimum();
+    }
+
+    /**
+     * Gets the default selection of the "Example" widgets.
+     */
+    int getDefaultSelection () {
+        return progressBar1.getSelection();
+    }
+
+    /**
+     * Sets the maximum of the "Example" widgets.
+     */
+    void setWidgetMaximum () {
+        progressBar1.setMaximum (maximumSpinner.getSelection ());
+        updateSpinners ();
+    }
+
+    /**
+     * Sets the minimim of the "Example" widgets.
+     */
+    void setWidgetMinimum () {
+        progressBar1.setMinimum (minimumSpinner.getSelection ());
+        updateSpinners ();
+    }
+
+    /**
+     * Sets the selection of the "Example" widgets.
+     */
+    void setWidgetSelection () {
+        progressBar1.setSelection (selectionSpinner.getSelection ());
+        updateSpinners ();
+    }
+
+    /**
+     * Update the Spinner widgets to reflect the actual value set
+     * on the "Example" widget.
+     */
+    void updateSpinners () {
+        minimumSpinner.setSelection (progressBar1.getMinimum ());
+        selectionSpinner.setSelection (progressBar1.getSelection ());
+        maximumSpinner.setSelection (progressBar1.getMaximum ());
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/controlexample/RangeTab.d	Mon Jan 21 01:40:01 2008 +0100
@@ -0,0 +1,203 @@
+/*******************************************************************************
+ * 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
+ *******************************************************************************/
+module dwtexamples.controlexample.RangeTab;
+
+
+
+import dwt.DWT;
+import dwt.events.SelectionAdapter;
+import dwt.events.SelectionEvent;
+import dwt.layout.GridData;
+import dwt.layout.GridLayout;
+import dwt.widgets.Button;
+import dwt.widgets.Group;
+import dwt.widgets.Spinner;
+import dwt.widgets.Widget;
+
+abstract class RangeTab : Tab {
+    /* Style widgets added to the "Style" group */
+    Button horizontalButton, verticalButton;
+    bool orientationButtons = true;
+
+    /* Scale widgets added to the "Control" group */
+    Spinner minimumSpinner, selectionSpinner, maximumSpinner;
+
+    /**
+     * Creates the Tab within a given instance of ControlExample.
+     */
+    this(ControlExample instance) {
+        super(instance);
+    }
+
+    /**
+     * Creates the "Control" widget children.
+     */
+    void createControlWidgets () {
+        /* Create controls specific to this example */
+        createMinimumGroup ();
+        createMaximumGroup ();
+        createSelectionGroup ();
+    }
+
+    /**
+     * Create a group of widgets to control the maximum
+     * attribute of the example widget.
+     */
+    void createMaximumGroup() {
+
+        /* Create the group */
+        Group maximumGroup = new Group (controlGroup, DWT.NONE);
+        maximumGroup.setLayout (new GridLayout ());
+        maximumGroup.setText (ControlExample.getResourceString("Maximum"));
+        maximumGroup.setLayoutData (new GridData (GridData.FILL_HORIZONTAL));
+
+        /* Create a Spinner widget */
+        maximumSpinner = new Spinner (maximumGroup, DWT.BORDER);
+        maximumSpinner.setMaximum (100000);
+        maximumSpinner.setSelection (getDefaultMaximum());
+        maximumSpinner.setPageIncrement (100);
+        maximumSpinner.setIncrement (1);
+        maximumSpinner.setLayoutData (new GridData (DWT.FILL, DWT.CENTER, true, false));
+
+        /* Add the listeners */
+        maximumSpinner.addSelectionListener(new SelectionAdapter () {
+            public void widgetSelected (SelectionEvent event) {
+                setWidgetMaximum ();
+            }
+        });
+    }
+
+    /**
+     * Create a group of widgets to control the minimum
+     * attribute of the example widget.
+     */
+    void createMinimumGroup() {
+
+        /* Create the group */
+        Group minimumGroup = new Group (controlGroup, DWT.NONE);
+        minimumGroup.setLayout (new GridLayout ());
+        minimumGroup.setText (ControlExample.getResourceString("Minimum"));
+        minimumGroup.setLayoutData (new GridData (GridData.FILL_HORIZONTAL));
+
+        /* Create a Spinner widget */
+        minimumSpinner = new Spinner (minimumGroup, DWT.BORDER);
+        minimumSpinner.setMaximum (100000);
+        minimumSpinner.setSelection(getDefaultMinimum());
+        minimumSpinner.setPageIncrement (100);
+        minimumSpinner.setIncrement (1);
+        minimumSpinner.setLayoutData (new GridData (DWT.FILL, DWT.CENTER, true, false));
+
+        /* Add the listeners */
+        minimumSpinner.addSelectionListener (new SelectionAdapter () {
+            public void widgetSelected (SelectionEvent event) {
+                setWidgetMinimum ();
+            }
+        });
+
+    }
+
+    /**
+     * Create a group of widgets to control the selection
+     * attribute of the example widget.
+     */
+    void createSelectionGroup() {
+
+        /* Create the group */
+        Group selectionGroup = new Group(controlGroup, DWT.NONE);
+        selectionGroup.setLayout(new GridLayout());
+        GridData gridData = new GridData(DWT.FILL, DWT.BEGINNING, false, false);
+        selectionGroup.setLayoutData(gridData);
+        selectionGroup.setText(ControlExample.getResourceString("Selection"));
+
+        /* Create a Spinner widget */
+        selectionSpinner = new Spinner (selectionGroup, DWT.BORDER);
+        selectionSpinner.setMaximum (100000);
+        selectionSpinner.setSelection (getDefaultSelection());
+        selectionSpinner.setPageIncrement (100);
+        selectionSpinner.setIncrement (1);
+        selectionSpinner.setLayoutData (new GridData (DWT.FILL, DWT.CENTER, true, false));
+
+        /* Add the listeners */
+        selectionSpinner.addSelectionListener(new SelectionAdapter() {
+            public void widgetSelected(SelectionEvent event) {
+                setWidgetSelection ();
+            }
+        });
+
+    }
+
+    /**
+     * Creates the "Style" group.
+     */
+    void createStyleGroup () {
+        super.createStyleGroup ();
+
+        /* Create the extra widgets */
+        if (orientationButtons) {
+            horizontalButton = new Button (styleGroup, DWT.RADIO);
+            horizontalButton.setText ("DWT.HORIZONTAL");
+            verticalButton = new Button (styleGroup, DWT.RADIO);
+            verticalButton.setText ("DWT.VERTICAL");
+        }
+        borderButton = new Button (styleGroup, DWT.CHECK);
+        borderButton.setText ("DWT.BORDER");
+    }
+
+    /**
+     * Sets the state of the "Example" widgets.
+     */
+    void setExampleWidgetState () {
+        super.setExampleWidgetState ();
+        if (!instance.startup) {
+            setWidgetMinimum ();
+            setWidgetMaximum ();
+            setWidgetSelection ();
+        }
+        Widget [] widgets = getExampleWidgets ();
+        if (widgets.length !is 0) {
+            if (orientationButtons) {
+                horizontalButton.setSelection ((widgets [0].getStyle () & DWT.HORIZONTAL) !is 0);
+                verticalButton.setSelection ((widgets [0].getStyle () & DWT.VERTICAL) !is 0);
+            }
+            borderButton.setSelection ((widgets [0].getStyle () & DWT.BORDER) !is 0);
+        }
+    }
+
+    /**
+     * Gets the default maximum of the "Example" widgets.
+     */
+    abstract int getDefaultMaximum ();
+
+    /**
+     * Gets the default minimim of the "Example" widgets.
+     */
+    abstract int getDefaultMinimum ();
+
+    /**
+     * Gets the default selection of the "Example" widgets.
+     */
+    abstract int getDefaultSelection ();
+
+    /**
+     * Sets the maximum of the "Example" widgets.
+     */
+    abstract void setWidgetMaximum ();
+
+    /**
+     * Sets the minimim of the "Example" widgets.
+     */
+    abstract void setWidgetMinimum ();
+
+    /**
+     * Sets the selection of the "Example" widgets.
+     */
+    abstract void setWidgetSelection ();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/controlexample/SashFormTab.d	Mon Jan 21 01:40:01 2008 +0100
@@ -0,0 +1,128 @@
+/*******************************************************************************
+ * 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
+ *******************************************************************************/
+module dwtexamples.controlexample.SashFormTab;
+
+
+
+import dwt.DWT;
+import dwt.custom.SashForm;
+import dwt.layout.GridData;
+import dwt.layout.GridLayout;
+import dwt.widgets.Button;
+import dwt.widgets.Group;
+import dwt.widgets.List;
+import dwt.widgets.Text;
+import dwt.widgets.Widget;
+
+class SashFormTab : Tab {
+    /* Example widgets and groups that contain them */
+    Group sashFormGroup;
+    SashForm form;
+    List list1, list2;
+    Text text;
+
+    /* Style widgets added to the "Style" group */
+    Button horizontalButton, verticalButton, smoothButton;
+
+    static String [] ListData0 = {ControlExample.getResourceString("ListData0_0"), //$NON-NLS-1$
+                                  ControlExample.getResourceString("ListData0_1"), //$NON-NLS-1$
+                                  ControlExample.getResourceString("ListData0_2"), //$NON-NLS-1$
+                                  ControlExample.getResourceString("ListData0_3"), //$NON-NLS-1$
+                                  ControlExample.getResourceString("ListData0_4"), //$NON-NLS-1$
+                                  ControlExample.getResourceString("ListData0_5"), //$NON-NLS-1$
+                                  ControlExample.getResourceString("ListData0_6"), //$NON-NLS-1$
+                                  ControlExample.getResourceString("ListData0_7")}; //$NON-NLS-1$
+
+    static String [] ListData1 = {ControlExample.getResourceString("ListData1_0"), //$NON-NLS-1$
+                                  ControlExample.getResourceString("ListData1_1"), //$NON-NLS-1$
+                                  ControlExample.getResourceString("ListData1_2"), //$NON-NLS-1$
+                                  ControlExample.getResourceString("ListData1_3"), //$NON-NLS-1$
+                                  ControlExample.getResourceString("ListData1_4"), //$NON-NLS-1$
+                                  ControlExample.getResourceString("ListData1_5"), //$NON-NLS-1$
+                                  ControlExample.getResourceString("ListData1_6"), //$NON-NLS-1$
+                                  ControlExample.getResourceString("ListData1_7")}; //$NON-NLS-1$
+
+
+    /**
+     * Creates the Tab within a given instance of ControlExample.
+     */
+    this(ControlExample instance) {
+        super(instance);
+    }
+    void createExampleGroup () {
+        super.createExampleGroup ();
+
+        /* Create a group for the sashform widget */
+        sashFormGroup = new Group (exampleGroup, DWT.NONE);
+        sashFormGroup.setLayout (new GridLayout ());
+        sashFormGroup.setLayoutData (new GridData (DWT.FILL, DWT.FILL, true, true));
+        sashFormGroup.setText ("SashForm");
+    }
+    void createExampleWidgets () {
+
+        /* Compute the widget style */
+        int style = getDefaultStyle();
+        if (horizontalButton.getSelection ()) style |= DWT.H_SCROLL;
+        if (verticalButton.getSelection ()) style |= DWT.V_SCROLL;
+        if (smoothButton.getSelection ()) style |= DWT.SMOOTH;
+
+        /* Create the example widgets */
+        form = new SashForm (sashFormGroup, style);
+        list1 = new List (form, DWT.V_SCROLL | DWT.H_SCROLL | DWT.BORDER);
+        list1.setItems (ListData0);
+        list2 = new List (form, DWT.V_SCROLL | DWT.H_SCROLL | DWT.BORDER);
+        list2.setItems (ListData1);
+        text = new Text (form, DWT.MULTI | DWT.BORDER);
+        text.setText (ControlExample.getResourceString("Multi_line")); //$NON-NLS-1$
+        form.setWeights(new int[] {1, 1, 1});
+    }
+    /**
+     * Creates the "Style" group.
+     */
+    void createStyleGroup() {
+        super.createStyleGroup();
+
+        /* Create the extra widgets */
+        horizontalButton = new Button (styleGroup, DWT.RADIO);
+        horizontalButton.setText ("DWT.HORIZONTAL");
+        horizontalButton.setSelection(true);
+        verticalButton = new Button (styleGroup, DWT.RADIO);
+        verticalButton.setText ("DWT.VERTICAL");
+        verticalButton.setSelection(false);
+        smoothButton = new Button (styleGroup, DWT.CHECK);
+        smoothButton.setText ("DWT.SMOOTH");
+        smoothButton.setSelection(false);
+    }
+
+    /**
+     * Gets the "Example" widget children.
+     */
+    Widget [] getExampleWidgets () {
+        return new Widget [] {form};
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    String getTabText () {
+        return "SashForm"; //$NON-NLS-1$
+    }
+
+        /**
+     * Sets the state of the "Example" widgets.
+     */
+    void setExampleWidgetState () {
+        super.setExampleWidgetState ();
+        horizontalButton.setSelection ((form.getStyle () & DWT.H_SCROLL) !is 0);
+        verticalButton.setSelection ((form.getStyle () & DWT.V_SCROLL) !is 0);
+        smoothButton.setSelection ((form.getStyle () & DWT.SMOOTH) !is 0);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/controlexample/SashTab.d	Mon Jan 21 01:40:01 2008 +0100
@@ -0,0 +1,252 @@
+/*******************************************************************************
+ * 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
+ *******************************************************************************/
+module dwtexamples.controlexample.SashTab;
+
+
+
+import dwt.DWT;
+import dwt.events.ControlAdapter;
+import dwt.events.ControlEvent;
+import dwt.events.SelectionAdapter;
+import dwt.events.SelectionEvent;
+import dwt.graphics.Rectangle;
+import dwt.layout.FillLayout;
+import dwt.layout.GridData;
+import dwt.widgets.Button;
+import dwt.widgets.Composite;
+import dwt.widgets.Group;
+import dwt.widgets.List;
+import dwt.widgets.Sash;
+import dwt.widgets.Text;
+import dwt.widgets.Widget;
+
+class SashTab : Tab {
+    /* Example widgets and groups that contain them */
+    Sash hSash, vSash;
+    Composite sashComp;
+    Group sashGroup;
+    List list1, list2, list3;
+    Text text;
+    Button smoothButton;
+
+    static String [] ListData0 = {ControlExample.getResourceString("ListData0_0"),
+                                  ControlExample.getResourceString("ListData0_1"),
+                                  ControlExample.getResourceString("ListData0_2"),
+                                  ControlExample.getResourceString("ListData0_3"),
+                                  ControlExample.getResourceString("ListData0_4"),
+                                  ControlExample.getResourceString("ListData0_5"),
+                                  ControlExample.getResourceString("ListData0_6"),
+                                  ControlExample.getResourceString("ListData0_7"),
+                                  ControlExample.getResourceString("ListData0_8")};
+
+    static String [] ListData1 = {ControlExample.getResourceString("ListData1_0"),
+                                  ControlExample.getResourceString("ListData1_1"),
+                                  ControlExample.getResourceString("ListData1_2"),
+                                  ControlExample.getResourceString("ListData1_3"),
+                                  ControlExample.getResourceString("ListData1_4"),
+                                  ControlExample.getResourceString("ListData1_5"),
+                                  ControlExample.getResourceString("ListData1_6"),
+                                  ControlExample.getResourceString("ListData1_7"),
+                                  ControlExample.getResourceString("ListData1_8")};
+
+    /* Constants */
+    static final int SASH_WIDTH = 3;
+    static final int SASH_LIMIT = 20;
+
+    /**
+     * Creates the Tab within a given instance of ControlExample.
+     */
+    SashTab(ControlExample instance) {
+        super(instance);
+    }
+
+    /**
+     * Creates the "Example" group.
+     */
+    void createExampleGroup () {
+        super.createExampleGroup ();
+        exampleGroup.setLayoutData (new GridData (DWT.FILL, DWT.FILL, true, true));
+        exampleGroup.setLayout(new FillLayout());
+
+        /* Create a group for the sash widgets */
+        sashGroup = new Group (exampleGroup, DWT.NONE);
+        FillLayout layout = new FillLayout();
+        layout.marginHeight = layout.marginWidth = 5;
+        sashGroup.setLayout(layout);
+        sashGroup.setText ("Sash");
+    }
+
+    /**
+     * Creates the "Example" widgets.
+     */
+    void createExampleWidgets () {
+        /*
+         * Create the page.  This example does not use layouts.
+         */
+        sashComp = new Composite(sashGroup, DWT.BORDER);
+
+        /* Create the list and text widgets */
+        list1 = new List (sashComp, DWT.V_SCROLL | DWT.H_SCROLL | DWT.BORDER);
+        list1.setItems (ListData0);
+        list2 = new List (sashComp, DWT.V_SCROLL | DWT.H_SCROLL | DWT.BORDER);
+        list2.setItems (ListData1);
+        text = new Text (sashComp, DWT.MULTI | DWT.BORDER);
+        text.setText (ControlExample.getResourceString("Multi_line"));
+
+        /* Create the sashes */
+        int style = getDefaultStyle();
+        if (smoothButton.getSelection()) style |= DWT.SMOOTH;
+        vSash = new Sash (sashComp, DWT.VERTICAL | style);
+        hSash = new Sash (sashComp, DWT.HORIZONTAL | style);
+
+        /* Add the listeners */
+        hSash.addSelectionListener (new SelectionAdapter () {
+            public void widgetSelected (SelectionEvent event) {
+                Rectangle rect = vSash.getParent().getClientArea();
+                event.y = Math.min (Math.max (event.y, SASH_LIMIT), rect.height - SASH_LIMIT);
+                if (event.detail !is DWT.DRAG) {
+                    hSash.setBounds (event.x, event.y, event.width, event.height);
+                    layout ();
+                }
+            }
+        });
+        vSash.addSelectionListener (new SelectionAdapter () {
+            public void widgetSelected (SelectionEvent event) {
+                Rectangle rect = vSash.getParent().getClientArea();
+                event.x = Math.min (Math.max (event.x, SASH_LIMIT), rect.width - SASH_LIMIT);
+                if (event.detail !is DWT.DRAG) {
+                    vSash.setBounds (event.x, event.y, event.width, event.height);
+                    layout ();
+                }
+            }
+        });
+        sashComp.addControlListener (new ControlAdapter () {
+            public void controlResized (ControlEvent event) {
+                resized ();
+            }
+        });
+    }
+
+    /**
+     * Creates the "Size" group.  The "Size" group contains
+     * controls that allow the user to change the size of
+     * the example widgets.
+     */
+    void createSizeGroup () {
+    }
+
+    /**
+     * Creates the "Style" group.
+     */
+    void createStyleGroup() {
+        super.createStyleGroup ();
+
+        /* Create the extra widgets */
+        smoothButton = new Button (styleGroup, DWT.CHECK);
+        smoothButton.setText("DWT.SMOOTH");
+    }
+
+    void disposeExampleWidgets () {
+        sashComp.dispose();
+        sashComp = null;
+    }
+
+    /**
+     * Gets the "Example" widget children.
+     */
+    Widget [] getExampleWidgets () {
+        return new Widget [] {hSash, vSash};
+    }
+
+    /**
+     * Returns a list of set/get API method names (without the set/get prefix)
+     * that can be used to set/get values in the example control(s).
+     */
+    String[] getMethodNames() {
+        return new String[] {"ToolTipText"};
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    String getTabText () {
+        return "Sash";
+    }
+
+    /**
+     * Layout the list and text widgets according to the new
+     * positions of the sashes..events.SelectionEvent
+     */
+    void layout () {
+
+        Rectangle clientArea = sashComp.getClientArea ();
+        Rectangle hSashBounds = hSash.getBounds ();
+        Rectangle vSashBounds = vSash.getBounds ();
+
+        list1.setBounds (0, 0, vSashBounds.x, hSashBounds.y);
+        list2.setBounds (vSashBounds.x + vSashBounds.width, 0, clientArea.width - (vSashBounds.x + vSashBounds.width), hSashBounds.y);
+        text.setBounds (0, hSashBounds.y + hSashBounds.height, clientArea.width, clientArea.height - (hSashBounds.y + hSashBounds.height));
+
+        /**
+        * If the horizontal sash has been moved then the vertical
+        * sash is either too long or too short and its size must
+        * be adjusted.
+        */
+        vSashBounds.height = hSashBounds.y;
+        vSash.setBounds (vSashBounds);
+    }
+    /**
+     * Sets the size of the "Example" widgets.
+     */
+    void setExampleWidgetSize () {
+        sashGroup.layout (true);
+    }
+
+    /**
+     * Sets the state of the "Example" widgets.
+     */
+    void setExampleWidgetState () {
+        super.setExampleWidgetState ();
+        smoothButton.setSelection ((hSash.getStyle () & DWT.SMOOTH) !is 0);
+    }
+
+    /**
+     * Handle the shell resized event.
+     */
+    void resized () {
+
+        /* Get the client area for the shell */
+        Rectangle clientArea = sashComp.getClientArea ();
+
+        /*
+        * Make list 1 half the width and half the height of the tab leaving room for the sash.
+        * Place list 1 in the top left quadrant of the tab.
+        */
+        Rectangle list1Bounds = new Rectangle (0, 0, (clientArea.width - SASH_WIDTH) / 2, (clientArea.height - SASH_WIDTH) / 2);
+        list1.setBounds (list1Bounds);
+
+        /*
+        * Make list 2 half the width and half the height of the tab leaving room for the sash.
+        * Place list 2 in the top right quadrant of the tab.
+        */
+        list2.setBounds (list1Bounds.width + SASH_WIDTH, 0, clientArea.width - (list1Bounds.width + SASH_WIDTH), list1Bounds.height);
+
+        /*
+        * Make the text area the full width and half the height of the tab leaving room for the sash.
+        * Place the text area in the bottom half of the tab.
+        */
+        text.setBounds (0, list1Bounds.height + SASH_WIDTH, clientArea.width, clientArea.height - (list1Bounds.height + SASH_WIDTH));
+
+        /* Position the sashes */
+        vSash.setBounds (list1Bounds.width, 0, SASH_WIDTH, list1Bounds.height);
+        hSash.setBounds (0, list1Bounds.height, clientArea.width, SASH_WIDTH);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/controlexample/ScaleTab.d	Mon Jan 21 01:40:01 2008 +0100
@@ -0,0 +1,236 @@
+/*******************************************************************************
+ * 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
+ *******************************************************************************/
+module dwtexamples.controlexample.ScaleTab;
+
+
+
+import dwt.DWT;
+import dwt.events.SelectionAdapter;
+import dwt.events.SelectionEvent;
+import dwt.layout.GridData;
+import dwt.layout.GridLayout;
+import dwt.widgets.Group;
+import dwt.widgets.Scale;
+import dwt.widgets.Spinner;
+import dwt.widgets.Widget;
+
+class ScaleTab : RangeTab {
+    /* Example widgets and groups that contain them */
+    Scale scale1;
+    Group scaleGroup;
+
+    /* Spinner widgets added to the "Control" group */
+    Spinner incrementSpinner, pageIncrementSpinner;
+
+    /**
+     * Creates the Tab within a given instance of ControlExample.
+     */
+    this(ControlExample instance) {
+        super(instance);
+    }
+
+    /**
+     * Creates the "Control" widget children.
+     */
+    void createControlWidgets () {
+        super.createControlWidgets ();
+        createIncrementGroup ();
+        createPageIncrementGroup ();
+    }
+
+    /**
+     * Creates the "Example" group.
+     */
+    void createExampleGroup () {
+        super.createExampleGroup ();
+
+        /* Create a group for the scale */
+        scaleGroup = new Group (exampleGroup, DWT.NONE);
+        scaleGroup.setLayout (new GridLayout ());
+        scaleGroup.setLayoutData (new GridData (DWT.FILL, DWT.FILL, true, true));
+        scaleGroup.setText ("Scale");
+
+    }
+
+    /**
+     * Creates the "Example" widgets.
+     */
+    void createExampleWidgets () {
+
+        /* Compute the widget style */
+        int style = getDefaultStyle();
+        if (horizontalButton.getSelection ()) style |= DWT.HORIZONTAL;
+        if (verticalButton.getSelection ()) style |= DWT.VERTICAL;
+        if (borderButton.getSelection ()) style |= DWT.BORDER;
+
+        /* Create the example widgets */
+        scale1 = new Scale (scaleGroup, style);
+    }
+
+    /**
+     * Create a group of widgets to control the increment
+     * attribute of the example widget.
+     */
+    void createIncrementGroup() {
+
+        /* Create the group */
+        Group incrementGroup = new Group (controlGroup, DWT.NONE);
+        incrementGroup.setLayout (new GridLayout ());
+        incrementGroup.setText (ControlExample.getResourceString("Increment"));
+        incrementGroup.setLayoutData (new GridData (GridData.FILL_HORIZONTAL));
+
+        /* Create the Spinner widget */
+        incrementSpinner = new Spinner (incrementGroup, DWT.BORDER);
+        incrementSpinner.setMaximum (100000);
+        incrementSpinner.setSelection (getDefaultIncrement());
+        incrementSpinner.setPageIncrement (100);
+        incrementSpinner.setIncrement (1);
+        incrementSpinner.setLayoutData (new GridData (DWT.FILL, DWT.CENTER, true, false));
+
+        /* Add the listeners */
+        incrementSpinner.addSelectionListener (new SelectionAdapter () {
+            public void widgetSelected (SelectionEvent e) {
+                setWidgetIncrement ();
+            }
+        });
+    }
+
+    /**
+     * Create a group of widgets to control the page increment
+     * attribute of the example widget.
+     */
+    void createPageIncrementGroup() {
+
+        /* Create the group */
+        Group pageIncrementGroup = new Group (controlGroup, DWT.NONE);
+        pageIncrementGroup.setLayout (new GridLayout ());
+        pageIncrementGroup.setText (ControlExample.getResourceString("Page_Increment"));
+        pageIncrementGroup.setLayoutData (new GridData (GridData.FILL_HORIZONTAL));
+
+        /* Create the Spinner widget */
+        pageIncrementSpinner = new Spinner (pageIncrementGroup, DWT.BORDER);
+        pageIncrementSpinner.setMaximum (100000);
+        pageIncrementSpinner.setSelection (getDefaultPageIncrement());
+        pageIncrementSpinner.setPageIncrement (100);
+        pageIncrementSpinner.setIncrement (1);
+        pageIncrementSpinner.setLayoutData (new GridData (DWT.FILL, DWT.CENTER, true, false));
+
+        /* Add the listeners */
+        pageIncrementSpinner.addSelectionListener (new SelectionAdapter () {
+            public void widgetSelected (SelectionEvent event) {
+                setWidgetPageIncrement ();
+            }
+        });
+    }
+
+    /**
+     * Gets the "Example" widget children.
+     */
+    Widget [] getExampleWidgets () {
+        return new Widget [] {scale1};
+    }
+
+    /**
+     * Returns a list of set/get API method names (without the set/get prefix)
+     * that can be used to set/get values in the example control(s).
+     */
+    String[] getMethodNames() {
+        return new String[] {"Selection", "ToolTipText"};
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    String getTabText () {
+        return "Scale";
+    }
+
+    /**
+     * Sets the state of the "Example" widgets.
+     */
+    void setExampleWidgetState () {
+        super.setExampleWidgetState ();
+        if (!instance.startup) {
+            setWidgetIncrement ();
+            setWidgetPageIncrement ();
+        }
+    }
+
+    /**
+     * Gets the default maximum of the "Example" widgets.
+     */
+    int getDefaultMaximum () {
+        return scale1.getMaximum();
+    }
+
+    /**
+     * Gets the default minimim of the "Example" widgets.
+     */
+    int getDefaultMinimum () {
+        return scale1.getMinimum();
+    }
+
+    /**
+     * Gets the default selection of the "Example" widgets.
+     */
+    int getDefaultSelection () {
+        return scale1.getSelection();
+    }
+
+    /**
+     * Gets the default increment of the "Example" widgets.
+     */
+    int getDefaultIncrement () {
+        return scale1.getIncrement();
+    }
+
+    /**
+     * Gets the default page increment of the "Example" widgets.
+     */
+    int getDefaultPageIncrement () {
+        return scale1.getPageIncrement();
+    }
+
+    /**
+     * Sets the increment of the "Example" widgets.
+     */
+    void setWidgetIncrement () {
+        scale1.setIncrement (incrementSpinner.getSelection ());
+    }
+
+    /**
+     * Sets the minimim of the "Example" widgets.
+     */
+    void setWidgetMaximum () {
+        scale1.setMaximum (maximumSpinner.getSelection ());
+    }
+
+    /**
+     * Sets the minimim of the "Example" widgets.
+     */
+    void setWidgetMinimum () {
+        scale1.setMinimum (minimumSpinner.getSelection ());
+    }
+
+    /**
+     * Sets the page increment of the "Example" widgets.
+     */
+    void setWidgetPageIncrement () {
+        scale1.setPageIncrement (pageIncrementSpinner.getSelection ());
+    }
+
+    /**
+     * Sets the selection of the "Example" widgets.
+     */
+    void setWidgetSelection () {
+        scale1.setSelection (selectionSpinner.getSelection ());
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/controlexample/ScrollableTab.d	Mon Jan 21 01:40:01 2008 +0100
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * 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
+ *******************************************************************************/
+module dwtexamples.controlexample.ScrollableTab;
+
+
+
+import dwt.DWT;
+import dwt.widgets.Button;
+import dwt.widgets.Widget;
+
+abstract class ScrollableTab : Tab {
+    /* Style widgets added to the "Style" group */
+    Button singleButton, multiButton, horizontalButton, verticalButton;
+
+    /**
+     * Creates the Tab within a given instance of ControlExample.
+     */
+    this(ControlExample instance) {
+        super(instance);
+    }
+
+    /**
+     * Creates the "Style" group.
+     */
+    void createStyleGroup () {
+        super.createStyleGroup ();
+
+        /* Create the extra widgets */
+        singleButton = new Button (styleGroup, DWT.RADIO);
+        singleButton.setText ("DWT.SINGLE");
+        multiButton = new Button (styleGroup, DWT.RADIO);
+        multiButton.setText ("DWT.MULTI");
+        horizontalButton = new Button (styleGroup, DWT.CHECK);
+        horizontalButton.setText ("DWT.H_SCROLL");
+        horizontalButton.setSelection(true);
+        verticalButton = new Button (styleGroup, DWT.CHECK);
+        verticalButton.setText ("DWT.V_SCROLL");
+        verticalButton.setSelection(true);
+        borderButton = new Button (styleGroup, DWT.CHECK);
+        borderButton.setText ("DWT.BORDER");
+    }
+
+    /**
+     * Sets the state of the "Example" widgets.
+     */
+    void setExampleWidgetState () {
+        super.setExampleWidgetState ();
+        Widget [] widgets = getExampleWidgets ();
+        if (widgets.length !is 0){
+            singleButton.setSelection ((widgets [0].getStyle () & DWT.SINGLE) !is 0);
+            multiButton.setSelection ((widgets [0].getStyle () & DWT.MULTI) !is 0);
+            horizontalButton.setSelection ((widgets [0].getStyle () & DWT.H_SCROLL) !is 0);
+            verticalButton.setSelection ((widgets [0].getStyle () & DWT.V_SCROLL) !is 0);
+            borderButton.setSelection ((widgets [0].getStyle () & DWT.BORDER) !is 0);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/controlexample/ShellTab.d	Mon Jan 21 01:40:01 2008 +0100
@@ -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
+ *******************************************************************************/
+module dwtexamples.controlexample.ShellTab;
+
+
+
+import dwt.DWT;
+import dwt.events.SelectionAdapter;
+import dwt.events.SelectionEvent;
+import dwt.events.SelectionListener;
+import dwt.layout.GridData;
+import dwt.layout.GridLayout;
+import dwt.widgets.Button;
+import dwt.widgets.Event;
+import dwt.widgets.Group;
+import dwt.widgets.Listener;
+import dwt.widgets.Shell;
+
+import dwtexamples.controlexample.Tab;
+import dwtexamples.controlexample.ControlExample;
+
+
+class ShellTab : Tab {
+    /* Style widgets added to the "Style" groups, and "Other" group */
+    Button noParentButton, parentButton;
+    Button noTrimButton, closeButton, titleButton, minButton, maxButton, borderButton, resizeButton, onTopButton, toolButton;
+    Button createButton, closeAllButton;
+    Button modelessButton, primaryModalButton, applicationModalButton, systemModalButton;
+    Button imageButton;
+    Group parentStyleGroup, modalStyleGroup;
+
+    /* Variables used to track the open shells */
+    int shellCount = 0;
+    Shell [] shells = new Shell [4];
+
+    /**
+     * Creates the Tab within a given instance of ControlExample.
+     */
+    this(ControlExample instance) {
+        super(instance);
+    }
+
+    /**
+     * Close all the example shells.
+     */
+    void closeAllShells() {
+        for (int i = 0; i<shellCount; i++) {
+            if (shells[i] !is null & !shells [i].isDisposed ()) {
+                shells [i].dispose();
+            }
+        }
+        shellCount = 0;
+    }
+
+    /**
+     * Handle the Create button selection event.
+     *
+     * @param event org.eclipse.swt.events.SelectionEvent
+     */
+    public void createButtonSelected(SelectionEvent event) {
+
+        /*
+         * Remember the example shells so they
+         * can be disposed by the user.
+         */
+        if (shellCount >= shells.length) {
+            Shell [] newShells = new Shell [shells.length + 4];
+            System.arraycopy (shells, 0, newShells, 0, shells.length);
+            shells = newShells;
+        }
+
+        /* Compute the shell style */
+        int style = DWT.NONE;
+        if (noTrimButton.getSelection()) style |= DWT.NO_TRIM;
+        if (closeButton.getSelection()) style |= DWT.CLOSE;
+        if (titleButton.getSelection()) style |= DWT.TITLE;
+        if (minButton.getSelection()) style |= DWT.MIN;
+        if (maxButton.getSelection()) style |= DWT.MAX;
+        if (borderButton.getSelection()) style |= DWT.BORDER;
+        if (resizeButton.getSelection()) style |= DWT.RESIZE;
+        if (onTopButton.getSelection()) style |= DWT.ON_TOP;
+        if (toolButton.getSelection()) style |= DWT.TOOL;
+        if (modelessButton.getSelection()) style |= DWT.MODELESS;
+        if (primaryModalButton.getSelection()) style |= DWT.PRIMARY_MODAL;
+        if (applicationModalButton.getSelection()) style |= DWT.APPLICATION_MODAL;
+        if (systemModalButton.getSelection()) style |= DWT.SYSTEM_MODAL;
+
+        /* Create the shell with or without a parent */
+        if (noParentButton.getSelection ()) {
+            shells [shellCount] = new Shell (style);
+        } else {
+            shells [shellCount] = new Shell (shell, style);
+        }
+        final Shell currentShell = shells [shellCount];
+        Button button = new Button(currentShell, DWT.PUSH);
+        button.setBounds(20, 20, 120, 30);
+        Button closeButton = new Button(currentShell, DWT.PUSH);
+        closeButton.setBounds(160, 20, 120, 30);
+        closeButton.setText(ControlExample.getResourceString("Close"));
+        closeButton.addListener(DWT.Selection, new class() Listener {
+            public void handleEvent(Event event) {
+                currentShell.dispose();
+            }
+        });
+
+        /* Set the size, title, and image, and open the shell */
+        currentShell.setSize (300, 100);
+        currentShell.setText (ControlExample.getResourceString("Title") + shellCount);
+        if (imageButton.getSelection()) currentShell.setImage(instance.images[ControlExample.ciTarget]);
+        if (backgroundImageButton.getSelection()) currentShell.setBackgroundImage(instance.images[ControlExample.ciBackground]);
+        hookListeners (currentShell);
+        currentShell.open ();
+        shellCount++;
+    }
+
+    /**
+     * Creates the "Control" group.
+     */
+    void createControlGroup () {
+        /*
+         * Create the "Control" group.  This is the group on the
+         * right half of each example tab.  It consists of the
+         * style group, the 'other' group and the size group.
+         */
+        controlGroup = new Group (tabFolderPage, DWT.NONE);
+        controlGroup.setLayout (new GridLayout (2, true));
+        controlGroup.setLayoutData (new GridData (GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
+        controlGroup.setText (ControlExample.getResourceString("Parameters"));
+
+        /* Create a group for the decoration style controls */
+        styleGroup = new Group (controlGroup, DWT.NONE);
+        styleGroup.setLayout (new GridLayout ());
+        styleGroup.setLayoutData (new GridData (DWT.FILL, DWT.FILL, false, false, 1, 3));
+        styleGroup.setText (ControlExample.getResourceString("Decoration_Styles"));
+
+        /* Create a group for the modal style controls */
+        modalStyleGroup = new Group (controlGroup, DWT.NONE);
+        modalStyleGroup.setLayout (new GridLayout ());
+        modalStyleGroup.setLayoutData (new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
+        modalStyleGroup.setText (ControlExample.getResourceString("Modal_Styles"));
+
+        /* Create a group for the 'other' controls */
+        otherGroup = new Group (controlGroup, DWT.NONE);
+        otherGroup.setLayout (new GridLayout ());
+        otherGroup.setLayoutData (new GridData(DWT.FILL, DWT.FILL, false, false));
+        otherGroup.setText (ControlExample.getResourceString("Other"));
+
+        /* Create a group for the parent style controls */
+        parentStyleGroup = new Group (controlGroup, DWT.NONE);
+        parentStyleGroup.setLayout (new GridLayout ());
+        GridData gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+        parentStyleGroup.setLayoutData (gridData);
+        parentStyleGroup.setText (ControlExample.getResourceString("Parent"));
+    }
+
+    /**
+     * Creates the "Control" widget children.
+     */
+    void createControlWidgets () {
+
+        /* Create the parent style buttons */
+        noParentButton = new Button (parentStyleGroup, DWT.RADIO);
+        noParentButton.setText (ControlExample.getResourceString("No_Parent"));
+        parentButton = new Button (parentStyleGroup, DWT.RADIO);
+        parentButton.setText (ControlExample.getResourceString("Parent"));
+
+        /* Create the decoration style buttons */
+        noTrimButton = new Button (styleGroup, DWT.CHECK);
+        noTrimButton.setText ("DWT.NO_TRIM");
+        closeButton = new Button (styleGroup, DWT.CHECK);
+        closeButton.setText ("DWT.CLOSE");
+        titleButton = new Button (styleGroup, DWT.CHECK);
+        titleButton.setText ("DWT.TITLE");
+        minButton = new Button (styleGroup, DWT.CHECK);
+        minButton.setText ("DWT.MIN");
+        maxButton = new Button (styleGroup, DWT.CHECK);
+        maxButton.setText ("DWT.MAX");
+        borderButton = new Button (styleGroup, DWT.CHECK);
+        borderButton.setText ("DWT.BORDER");
+        resizeButton = new Button (styleGroup, DWT.CHECK);
+        resizeButton.setText ("DWT.RESIZE");
+        onTopButton = new Button (styleGroup, DWT.CHECK);
+        onTopButton.setText ("DWT.ON_TOP");
+        toolButton = new Button (styleGroup, DWT.CHECK);
+        toolButton.setText ("DWT.TOOL");
+
+        /* Create the modal style buttons */
+        modelessButton = new Button (modalStyleGroup, DWT.RADIO);
+        modelessButton.setText ("DWT.MODELESS");
+        primaryModalButton = new Button (modalStyleGroup, DWT.RADIO);
+        primaryModalButton.setText ("DWT.PRIMARY_MODAL");
+        applicationModalButton = new Button (modalStyleGroup, DWT.RADIO);
+        applicationModalButton.setText ("DWT.APPLICATION_MODAL");
+        systemModalButton = new Button (modalStyleGroup, DWT.RADIO);
+        systemModalButton.setText ("DWT.SYSTEM_MODAL");
+
+        /* Create the 'other' buttons */
+        imageButton = new Button (otherGroup, DWT.CHECK);
+        imageButton.setText (ControlExample.getResourceString("Image"));
+        backgroundImageButton = new Button(otherGroup, DWT.CHECK);
+        backgroundImageButton.setText(ControlExample.getResourceString("BackgroundImage"));
+
+        /* Create the "create" and "closeAll" buttons */
+        createButton = new Button (controlGroup, DWT.NONE);
+        GridData gridData = new GridData (GridData.HORIZONTAL_ALIGN_END);
+        createButton.setLayoutData (gridData);
+        createButton.setText (ControlExample.getResourceString("Create_Shell"));
+        closeAllButton = new Button (controlGroup, DWT.NONE);
+        gridData = new GridData (GridData.HORIZONTAL_ALIGN_BEGINNING);
+        closeAllButton.setText (ControlExample.getResourceString("Close_All_Shells"));
+        closeAllButton.setLayoutData (gridData);
+
+        /* Add the listeners */
+        createButton.addSelectionListener(new class() SelectionAdapter {
+            public void widgetSelected(SelectionEvent e) {
+                createButtonSelected(e);
+            }
+        });
+        closeAllButton.addSelectionListener(new class() SelectionAdapter {
+            public void widgetSelected(SelectionEvent e) {
+                closeAllShells ();
+            }
+        });
+        SelectionListener decorationButtonListener = new class() SelectionAdapter {
+            public void widgetSelected(SelectionEvent event) {
+                decorationButtonSelected(event);
+            }
+        };
+        noTrimButton.addSelectionListener (decorationButtonListener);
+        closeButton.addSelectionListener (decorationButtonListener);
+        titleButton.addSelectionListener (decorationButtonListener);
+        minButton.addSelectionListener (decorationButtonListener);
+        maxButton.addSelectionListener (decorationButtonListener);
+        borderButton.addSelectionListener (decorationButtonListener);
+        resizeButton.addSelectionListener (decorationButtonListener);
+        applicationModalButton.addSelectionListener (decorationButtonListener);
+        systemModalButton.addSelectionListener (decorationButtonListener);
+
+        /* Set the default state */
+        noParentButton.setSelection (true);
+        modelessButton.setSelection (true);
+        backgroundImageButton.setSelection(false);
+    }
+
+    /**
+     * Handle a decoration button selection event.
+     *
+     * @param event org.eclipse.swt.events.SelectionEvent
+     */
+    public void decorationButtonSelected(SelectionEvent event) {
+
+        /* Make sure if the modal style is DWT.APPLICATION_MODAL or
+         * DWT.SYSTEM_MODAL the style DWT.CLOSE is also selected.
+         * This is to make sure the user can close the shell.
+         */
+        Button widget = cast(Button) event.widget;
+        if (widget is applicationModalButton || widget is systemModalButton) {
+            if (widget.getSelection()) {
+                closeButton.setSelection (true);
+                noTrimButton.setSelection (false);
+            }
+            return;
+        }
+        if (widget is closeButton) {
+            if (applicationModalButton.getSelection() || systemModalButton.getSelection()) {
+                closeButton.setSelection (true);
+            }
+        }
+        /*
+         * Make sure if the No Trim button is selected then
+         * all other decoration buttons are deselected.
+         */
+        if (widget.getSelection() && widget !is noTrimButton) {
+            noTrimButton.setSelection (false);
+            return;
+        }
+        if (widget.getSelection() && widget is noTrimButton) {
+            if (applicationModalButton.getSelection() || systemModalButton.getSelection()) {
+                noTrimButton.setSelection (false);
+                return;
+            }
+            closeButton.setSelection (false);
+            titleButton.setSelection (false);
+            minButton.setSelection (false);
+            maxButton.setSelection (false);
+            borderButton.setSelection (false);
+            resizeButton.setSelection (false);
+            return;
+        }
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    char[] getTabText () {
+        return "Shell";
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/controlexample/SliderTab.d	Mon Jan 21 01:40:01 2008 +0100
@@ -0,0 +1,279 @@
+/*******************************************************************************
+ * 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
+ *******************************************************************************/
+module dwtexamples.controlexample.SliderTab;
+
+
+
+import dwt.DWT;
+import dwt.events.SelectionAdapter;
+import dwt.events.SelectionEvent;
+import dwt.layout.GridData;
+import dwt.layout.GridLayout;
+import dwt.widgets.Group;
+import dwt.widgets.Slider;
+import dwt.widgets.Spinner;
+import dwt.widgets.Widget;
+
+class SliderTab : RangeTab {
+    /* Example widgets and groups that contain them */
+    Slider slider1;
+    Group sliderGroup;
+
+    /* Spinner widgets added to the "Control" group */
+    Spinner incrementSpinner, pageIncrementSpinner, thumbSpinner;
+
+    /**
+     * Creates the Tab within a given instance of ControlExample.
+     */
+    this(ControlExample instance) {
+        super(instance);
+    }
+
+    /**
+     * Creates the "Control" widget children.
+     */
+    void createControlWidgets () {
+        super.createControlWidgets ();
+        createThumbGroup ();
+        createIncrementGroup ();
+        createPageIncrementGroup ();
+    }
+
+    /**
+     * Creates the "Example" group.
+     */
+    void createExampleGroup () {
+        super.createExampleGroup ();
+
+        /* Create a group for the slider */
+        sliderGroup = new Group (exampleGroup, DWT.NONE);
+        sliderGroup.setLayout (new GridLayout ());
+        sliderGroup.setLayoutData (new GridData (DWT.FILL, DWT.FILL, true, true));
+        sliderGroup.setText ("Slider");
+    }
+
+    /**
+     * Creates the "Example" widgets.
+     */
+    void createExampleWidgets () {
+
+        /* Compute the widget style */
+        int style = getDefaultStyle();
+        if (horizontalButton.getSelection ()) style |= DWT.HORIZONTAL;
+        if (verticalButton.getSelection ()) style |= DWT.VERTICAL;
+        if (borderButton.getSelection ()) style |= DWT.BORDER;
+
+        /* Create the example widgets */
+        slider1 = new Slider(sliderGroup, style);
+    }
+
+    /**
+     * Create a group of widgets to control the increment
+     * attribute of the example widget.
+     */
+    void createIncrementGroup() {
+
+        /* Create the group */
+        Group incrementGroup = new Group (controlGroup, DWT.NONE);
+        incrementGroup.setLayout (new GridLayout ());
+        incrementGroup.setText (ControlExample.getResourceString("Increment"));
+        incrementGroup.setLayoutData (new GridData (GridData.FILL_HORIZONTAL));
+
+        /* Create the Spinner widget */
+        incrementSpinner = new Spinner (incrementGroup, DWT.BORDER);
+        incrementSpinner.setMaximum (100000);
+        incrementSpinner.setSelection (getDefaultIncrement());
+        incrementSpinner.setPageIncrement (100);
+        incrementSpinner.setIncrement (1);
+        incrementSpinner.setLayoutData (new GridData (DWT.FILL, DWT.CENTER, true, false));
+
+        /* Add the listeners */
+        incrementSpinner.addSelectionListener (new SelectionAdapter () {
+            public void widgetSelected (SelectionEvent e) {
+                setWidgetIncrement ();
+            }
+        });
+    }
+
+    /**
+     * Create a group of widgets to control the page increment
+     * attribute of the example widget.
+     */
+    void createPageIncrementGroup() {
+
+        /* Create the group */
+        Group pageIncrementGroup = new Group (controlGroup, DWT.NONE);
+        pageIncrementGroup.setLayout (new GridLayout ());
+        pageIncrementGroup.setText (ControlExample.getResourceString("Page_Increment"));
+        pageIncrementGroup.setLayoutData (new GridData (GridData.FILL_HORIZONTAL));
+
+        /* Create the Spinner widget */
+        pageIncrementSpinner = new Spinner (pageIncrementGroup, DWT.BORDER);
+        pageIncrementSpinner.setMaximum (100000);
+        pageIncrementSpinner.setSelection (getDefaultPageIncrement());
+        pageIncrementSpinner.setPageIncrement (100);
+        pageIncrementSpinner.setIncrement (1);
+        pageIncrementSpinner.setLayoutData (new GridData (DWT.FILL, DWT.CENTER, true, false));
+
+        /* Add the listeners */
+        pageIncrementSpinner.addSelectionListener (new SelectionAdapter () {
+            public void widgetSelected (SelectionEvent event) {
+                setWidgetPageIncrement ();
+            }
+        });
+    }
+
+    /**
+     * Create a group of widgets to control the thumb
+     * attribute of the example widget.
+     */
+    void createThumbGroup() {
+
+        /* Create the group */
+        Group thumbGroup = new Group (controlGroup, DWT.NONE);
+        thumbGroup.setLayout (new GridLayout ());
+        thumbGroup.setText (ControlExample.getResourceString("Thumb"));
+        thumbGroup.setLayoutData (new GridData (GridData.FILL_HORIZONTAL));
+
+        /* Create the Spinner widget */
+        thumbSpinner = new Spinner (thumbGroup, DWT.BORDER);
+        thumbSpinner.setMaximum (100000);
+        thumbSpinner.setSelection (getDefaultThumb());
+        thumbSpinner.setPageIncrement (100);
+        thumbSpinner.setIncrement (1);
+        thumbSpinner.setLayoutData (new GridData (DWT.FILL, DWT.CENTER, true, false));
+
+        /* Add the listeners */
+        thumbSpinner.addSelectionListener (new SelectionAdapter () {
+            public void widgetSelected (SelectionEvent event) {
+                setWidgetThumb ();
+            }
+        });
+    }
+
+    /**
+     * Gets the "Example" widget children.
+     */
+    Widget [] getExampleWidgets () {
+        return new Widget [] {slider1};
+    }
+
+    /**
+     * Returns a list of set/get API method names (without the set/get prefix)
+     * that can be used to set/get values in the example control(s).
+     */
+    String[] getMethodNames() {
+        return new String[] {"Selection", "ToolTipText"};
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    String getTabText () {
+        return "Slider";
+    }
+
+    /**
+     * Sets the state of the "Example" widgets.
+     */
+    void setExampleWidgetState () {
+        super.setExampleWidgetState ();
+        if (!instance.startup) {
+            setWidgetIncrement ();
+            setWidgetPageIncrement ();
+            setWidgetThumb ();
+        }
+    }
+
+    /**
+     * Gets the default maximum of the "Example" widgets.
+     */
+    int getDefaultMaximum () {
+        return slider1.getMaximum();
+    }
+
+    /**
+     * Gets the default minimim of the "Example" widgets.
+     */
+    int getDefaultMinimum () {
+        return slider1.getMinimum();
+    }
+
+    /**
+     * Gets the default selection of the "Example" widgets.
+     */
+    int getDefaultSelection () {
+        return slider1.getSelection();
+    }
+
+    /**
+     * Gets the default increment of the "Example" widgets.
+     */
+    int getDefaultIncrement () {
+        return slider1.getIncrement();
+    }
+
+    /**
+     * Gets the default page increment of the "Example" widgets.
+     */
+    int getDefaultPageIncrement () {
+        return slider1.getPageIncrement();
+    }
+
+    /**
+     * Gets the default thumb of the "Example" widgets.
+     */
+    int getDefaultThumb () {
+        return slider1.getThumb();
+    }
+
+    /**
+     * Sets the increment of the "Example" widgets.
+     */
+    void setWidgetIncrement () {
+        slider1.setIncrement (incrementSpinner.getSelection ());
+    }
+
+    /**
+     * Sets the minimim of the "Example" widgets.
+     */
+    void setWidgetMaximum () {
+        slider1.setMaximum (maximumSpinner.getSelection ());
+    }
+
+    /**
+     * Sets the minimim of the "Example" widgets.
+     */
+    void setWidgetMinimum () {
+        slider1.setMinimum (minimumSpinner.getSelection ());
+    }
+
+    /**
+     * Sets the page increment of the "Example" widgets.
+     */
+    void setWidgetPageIncrement () {
+        slider1.setPageIncrement (pageIncrementSpinner.getSelection ());
+    }
+
+    /**
+     * Sets the selection of the "Example" widgets.
+     */
+    void setWidgetSelection () {
+        slider1.setSelection (selectionSpinner.getSelection ());
+    }
+
+    /**
+     * Sets the thumb of the "Example" widgets.
+     */
+    void setWidgetThumb () {
+        slider1.setThumb (thumbSpinner.getSelection ());
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/controlexample/SpinnerTab.d	Mon Jan 21 01:40:01 2008 +0100
@@ -0,0 +1,327 @@
+/*******************************************************************************
+ * 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
+ *******************************************************************************/
+module dwtexamples.controlexample.SpinnerTab;
+
+
+
+import dwt.DWT;
+import dwt.events.ControlAdapter;
+import dwt.events.ControlEvent;
+import dwt.events.SelectionAdapter;
+import dwt.events.SelectionEvent;
+import dwt.layout.GridData;
+import dwt.layout.GridLayout;
+import dwt.widgets.Button;
+import dwt.widgets.Composite;
+import dwt.widgets.Group;
+import dwt.widgets.Spinner;
+import dwt.widgets.TabFolder;
+import dwt.widgets.Widget;
+
+class SpinnerTab : RangeTab {
+
+    /* Example widgets and groups that contain them */
+    Spinner spinner1;
+    Group spinnerGroup;
+
+    /* Style widgets added to the "Style" group */
+    Button readOnlyButton, wrapButton;
+
+    /* Spinner widgets added to the "Control" group */
+    Spinner incrementSpinner, pageIncrementSpinner, digitsSpinner;
+
+    /**
+     * Creates the Tab within a given instance of ControlExample.
+     */
+    this(ControlExample instance) {
+        super(instance);
+    }
+
+    /**
+     * Creates the "Control" widget children.
+     */
+    void createControlWidgets () {
+        super.createControlWidgets ();
+        createIncrementGroup ();
+        createPageIncrementGroup ();
+        createDigitsGroup ();
+    }
+
+    /**
+     * Creates the "Example" group.
+     */
+    void createExampleGroup () {
+        super.createExampleGroup ();
+
+        /* Create a group for the spinner */
+        spinnerGroup = new Group (exampleGroup, DWT.NONE);
+        spinnerGroup.setLayout (new GridLayout ());
+        spinnerGroup.setLayoutData (new GridData (DWT.FILL, DWT.FILL, true, true));
+        spinnerGroup.setText ("Spinner");
+    }
+
+    /**
+     * Creates the "Example" widgets.
+     */
+    void createExampleWidgets () {
+
+        /* Compute the widget style */
+        int style = getDefaultStyle();
+        if (readOnlyButton.getSelection ()) style |= DWT.READ_ONLY;
+        if (borderButton.getSelection ()) style |= DWT.BORDER;
+        if (wrapButton.getSelection ()) style |= DWT.WRAP;
+
+        /* Create the example widgets */
+        spinner1 = new Spinner (spinnerGroup, style);
+    }
+
+    /**
+     * Create a group of widgets to control the increment
+     * attribute of the example widget.
+     */
+    void createIncrementGroup() {
+
+        /* Create the group */
+        Group incrementGroup = new Group (controlGroup, DWT.NONE);
+        incrementGroup.setLayout (new GridLayout ());
+        incrementGroup.setText (ControlExample.getResourceString("Increment"));
+        incrementGroup.setLayoutData (new GridData (GridData.FILL_HORIZONTAL));
+
+        /* Create the Spinner widget */
+        incrementSpinner = new Spinner (incrementGroup, DWT.BORDER);
+        incrementSpinner.setMaximum (100000);
+        incrementSpinner.setSelection (getDefaultIncrement());
+        incrementSpinner.setPageIncrement (100);
+        incrementSpinner.setIncrement (1);
+        incrementSpinner.setLayoutData (new GridData (DWT.FILL, DWT.CENTER, true, false));
+
+        /* Add the listeners */
+        incrementSpinner.addSelectionListener (new SelectionAdapter () {
+            public void widgetSelected (SelectionEvent e) {
+                setWidgetIncrement ();
+            }
+        });
+    }
+
+    /**
+     * Create a group of widgets to control the page increment
+     * attribute of the example widget.
+     */
+    void createPageIncrementGroup() {
+
+        /* Create the group */
+        Group pageIncrementGroup = new Group (controlGroup, DWT.NONE);
+        pageIncrementGroup.setLayout (new GridLayout ());
+        pageIncrementGroup.setText (ControlExample.getResourceString("Page_Increment"));
+        pageIncrementGroup.setLayoutData (new GridData (GridData.FILL_HORIZONTAL));
+
+        /* Create the Spinner widget */
+        pageIncrementSpinner = new Spinner (pageIncrementGroup, DWT.BORDER);
+        pageIncrementSpinner.setMaximum (100000);
+        pageIncrementSpinner.setSelection (getDefaultPageIncrement());
+        pageIncrementSpinner.setPageIncrement (100);
+        pageIncrementSpinner.setIncrement (1);
+        pageIncrementSpinner.setLayoutData (new GridData (DWT.FILL, DWT.CENTER, true, false));
+
+        /* Add the listeners */
+        pageIncrementSpinner.addSelectionListener (new SelectionAdapter () {
+            public void widgetSelected (SelectionEvent event) {
+                setWidgetPageIncrement ();
+            }
+        });
+    }
+
+    /**
+     * Create a group of widgets to control the digits
+     * attribute of the example widget.
+     */
+    void createDigitsGroup() {
+
+        /* Create the group */
+        Group digitsGroup = new Group (controlGroup, DWT.NONE);
+        digitsGroup.setLayout (new GridLayout ());
+        digitsGroup.setText (ControlExample.getResourceString("Digits"));
+        digitsGroup.setLayoutData (new GridData (GridData.FILL_HORIZONTAL));
+
+        /* Create the Spinner widget */
+        digitsSpinner = new Spinner (digitsGroup, DWT.BORDER);
+        digitsSpinner.setMaximum (100000);
+        digitsSpinner.setSelection (getDefaultDigits());
+        digitsSpinner.setPageIncrement (100);
+        digitsSpinner.setIncrement (1);
+        digitsSpinner.setLayoutData (new GridData (DWT.FILL, DWT.CENTER, true, false));
+
+        /* Add the listeners */
+        digitsSpinner.addSelectionListener (new SelectionAdapter () {
+            public void widgetSelected (SelectionEvent e) {
+                setWidgetDigits ();
+            }
+        });
+    }
+
+    /**
+     * Creates the tab folder page.
+     *
+     * @param tabFolder org.eclipse.swt.widgets.TabFolder
+     * @return the new page for the tab folder
+     */
+    Composite createTabFolderPage (TabFolder tabFolder) {
+        super.createTabFolderPage (tabFolder);
+
+        /*
+         * Add a resize listener to the tabFolderPage so that
+         * if the user types into the example widget to change
+         * its preferred size, and then resizes the shell, we
+         * recalculate the preferred size correctly.
+         */
+        tabFolderPage.addControlListener(new ControlAdapter() {
+            public void controlResized(ControlEvent e) {
+                setExampleWidgetSize ();
+            }
+        });
+
+        return tabFolderPage;
+    }
+
+    /**
+     * Creates the "Style" group.
+     */
+    void createStyleGroup () {
+        orientationButtons = false;
+        super.createStyleGroup ();
+
+        /* Create the extra widgets */
+        readOnlyButton = new Button (styleGroup, DWT.CHECK);
+        readOnlyButton.setText ("DWT.READ_ONLY");
+        wrapButton = new Button (styleGroup, DWT.CHECK);
+        wrapButton.setText ("DWT.WRAP");
+    }
+
+    /**
+     * Gets the "Example" widget children.
+     */
+    Widget [] getExampleWidgets () {
+        return new Widget [] {spinner1};
+    }
+
+    /**
+     * Returns a list of set/get API method names (without the set/get prefix)
+     * that can be used to set/get values in the example control(s).
+     */
+    String[] getMethodNames() {
+        return new String[] {"Selection", "ToolTipText"};
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    String getTabText () {
+        return "Spinner";
+    }
+
+    /**
+     * Sets the state of the "Example" widgets.
+     */
+    void setExampleWidgetState () {
+        super.setExampleWidgetState ();
+        readOnlyButton.setSelection ((spinner1.getStyle () & DWT.READ_ONLY) !is 0);
+        wrapButton.setSelection ((spinner1.getStyle () & DWT.WRAP) !is 0);
+        if (!instance.startup) {
+            setWidgetIncrement ();
+            setWidgetPageIncrement ();
+            setWidgetDigits ();
+        }
+    }
+
+    /**
+     * Gets the default maximum of the "Example" widgets.
+     */
+    int getDefaultMaximum () {
+        return spinner1.getMaximum();
+    }
+
+    /**
+     * Gets the default minimim of the "Example" widgets.
+     */
+    int getDefaultMinimum () {
+        return spinner1.getMinimum();
+    }
+
+    /**
+     * Gets the default selection of the "Example" widgets.
+     */
+    int getDefaultSelection () {
+        return spinner1.getSelection();
+    }
+
+    /**
+     * Gets the default increment of the "Example" widgets.
+     */
+    int getDefaultIncrement () {
+        return spinner1.getIncrement();
+    }
+
+    /**
+     * Gets the default page increment of the "Example" widgets.
+     */
+    int getDefaultPageIncrement () {
+        return spinner1.getPageIncrement();
+    }
+
+    /**
+     * Gets the default digits of the "Example" widgets.
+     */
+    int getDefaultDigits () {
+        return spinner1.getDigits();
+    }
+
+    /**
+     * Sets the increment of the "Example" widgets.
+     */
+    void setWidgetIncrement () {
+        spinner1.setIncrement (incrementSpinner.getSelection ());
+    }
+
+    /**
+     * Sets the minimim of the "Example" widgets.
+     */
+    void setWidgetMaximum () {
+        spinner1.setMaximum (maximumSpinner.getSelection ());
+    }
+
+    /**
+     * Sets the minimim of the "Example" widgets.
+     */
+    void setWidgetMinimum () {
+        spinner1.setMinimum (minimumSpinner.getSelection ());
+    }
+
+    /**
+     * Sets the page increment of the "Example" widgets.
+     */
+    void setWidgetPageIncrement () {
+        spinner1.setPageIncrement (pageIncrementSpinner.getSelection ());
+    }
+
+    /**
+     * Sets the digits of the "Example" widgets.
+     */
+    void setWidgetDigits () {
+        spinner1.setDigits (digitsSpinner.getSelection ());
+    }
+
+    /**
+     * Sets the selection of the "Example" widgets.
+     */
+    void setWidgetSelection () {
+        spinner1.setSelection (selectionSpinner.getSelection ());
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/controlexample/StyledTextTab.d	Mon Jan 21 01:40:01 2008 +0100
@@ -0,0 +1,350 @@
+/*******************************************************************************
+ * 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
+ *******************************************************************************/
+module dwtexamples.controlexample.StyledTextTab;
+
+
+import java.io.IOException;
+import java.io.InputStream;
+
+
+import dwt.DWT;
+import dwt.custom.StyleRange;
+import dwt.custom.StyledText;
+import dwt.events.ControlAdapter;
+import dwt.events.ControlEvent;
+import dwt.events.DisposeEvent;
+import dwt.events.DisposeListener;
+import dwt.events.SelectionAdapter;
+import dwt.events.SelectionEvent;
+import dwt.events.SelectionListener;
+import dwt.graphics.Color;
+import dwt.graphics.Image;
+import dwt.graphics.ImageData;
+import dwt.graphics.Point;
+import dwt.layout.GridData;
+import dwt.layout.GridLayout;
+import dwt.widgets.Button;
+import dwt.widgets.Composite;
+import dwt.widgets.Display;
+import dwt.widgets.Group;
+import dwt.widgets.Label;
+import dwt.widgets.TabFolder;
+import dwt.widgets.Widget;
+
+class StyledTextTab : ScrollableTab {
+    /* Example widgets and groups that contain them */
+    StyledText styledText;
+    Group styledTextGroup, styledTextStyleGroup;
+
+    /* Style widgets added to the "Style" group */
+    Button wrapButton, readOnlyButton, fullSelectionButton;
+
+    /* Buttons for adding StyleRanges to StyledText */
+    Button boldButton, italicButton, redButton, yellowButton, underlineButton, strikeoutButton;
+    Image boldImage, italicImage, redImage, yellowImage, underlineImage, strikeoutImage;
+
+    /* Variables for saving state. */
+    String text;
+    StyleRange[] styleRanges;
+
+    /**
+     * Creates the Tab within a given instance of ControlExample.
+     */
+    this(ControlExample instance) {
+        super(instance);
+    }
+
+    /**
+     * Creates a bitmap image.
+     */
+    Image createBitmapImage (Display display, String name) {
+        InputStream sourceStream = ControlExample.class.getResourceAsStream (name + ".bmp");
+        InputStream maskStream = ControlExample.class.getResourceAsStream (name + "_mask.bmp");
+        ImageData source = new ImageData (sourceStream);
+        ImageData mask = new ImageData (maskStream);
+        Image result = new Image (display, source, mask);
+        try {
+            sourceStream.close ();
+            maskStream.close ();
+        } catch (IOException e) {
+            e.printStackTrace ();
+        }
+        return result;
+    }
+
+    /**
+     * Creates the "Control" widget children.
+     */
+    void createControlWidgets () {
+        super.createControlWidgets ();
+
+        /* Add a group for modifying the StyledText widget */
+        createStyledTextStyleGroup ();
+    }
+
+    /**
+     * Creates the "Example" group.
+     */
+    void createExampleGroup () {
+        super.createExampleGroup ();
+
+        /* Create a group for the styled text widget */
+        styledTextGroup = new Group (exampleGroup, DWT.NONE);
+        styledTextGroup.setLayout (new GridLayout ());
+        styledTextGroup.setLayoutData (new GridData (DWT.FILL, DWT.FILL, true, true));
+        styledTextGroup.setText ("StyledText");
+    }
+
+    /**
+     * Creates the "Example" widgets.
+     */
+    void createExampleWidgets () {
+
+        /* Compute the widget style */
+        int style = getDefaultStyle();
+        if (singleButton.getSelection ()) style |= DWT.SINGLE;
+        if (multiButton.getSelection ()) style |= DWT.MULTI;
+        if (horizontalButton.getSelection ()) style |= DWT.H_SCROLL;
+        if (verticalButton.getSelection ()) style |= DWT.V_SCROLL;
+        if (wrapButton.getSelection ()) style |= DWT.WRAP;
+        if (readOnlyButton.getSelection ()) style |= DWT.READ_ONLY;
+        if (borderButton.getSelection ()) style |= DWT.BORDER;
+        if (fullSelectionButton.getSelection ()) style |= DWT.FULL_SELECTION;
+
+        /* Create the example widgets */
+        styledText = new StyledText (styledTextGroup, style);
+        styledText.setText (ControlExample.getResourceString("Example_string"));
+        styledText.append ("\n");
+        styledText.append (ControlExample.getResourceString("One_Two_Three"));
+
+        if (text !is null) {
+            styledText.setText(text);
+            text = null;
+        }
+        if (styleRanges !is null) {
+            styledText.setStyleRanges(styleRanges);
+            styleRanges = null;
+        }
+    }
+
+    /**
+     * Creates the "Style" group.
+     */
+    void createStyleGroup() {
+        super.createStyleGroup();
+
+        /* Create the extra widgets */
+        wrapButton = new Button (styleGroup, DWT.CHECK);
+        wrapButton.setText ("DWT.WRAP");
+        readOnlyButton = new Button (styleGroup, DWT.CHECK);
+        readOnlyButton.setText ("DWT.READ_ONLY");
+        fullSelectionButton = new Button (styleGroup, DWT.CHECK);
+        fullSelectionButton.setText ("DWT.FULL_SELECTION");
+    }
+
+    /**
+     * Creates the "StyledText Style" group.
+     */
+    void createStyledTextStyleGroup () {
+        styledTextStyleGroup = new Group (controlGroup, DWT.NONE);
+        styledTextStyleGroup.setText (ControlExample.getResourceString ("StyledText_Styles"));
+        styledTextStyleGroup.setLayout (new GridLayout(6, false));
+        GridData data = new GridData (GridData.HORIZONTAL_ALIGN_FILL);
+        data.horizontalSpan = 2;
+        styledTextStyleGroup.setLayoutData (data);
+
+        /* Get images */
+        boldImage = createBitmapImage (display, "bold");
+        italicImage = createBitmapImage (display, "italic");
+        redImage = createBitmapImage (display, "red");
+        yellowImage = createBitmapImage (display, "yellow");
+        underlineImage = createBitmapImage (display, "underline");
+        strikeoutImage = createBitmapImage (display, "strikeout");
+
+        /* Create controls to modify the StyledText */
+        Label label = new Label (styledTextStyleGroup, DWT.NONE);
+        label.setText (ControlExample.getResourceString ("StyledText_Style_Instructions"));
+        label.setLayoutData(new GridData(DWT.FILL, DWT.CENTER, false, false, 6, 1));
+        label = new Label (styledTextStyleGroup, DWT.NONE);
+        label.setText (ControlExample.getResourceString ("Bold"));
+        label.setLayoutData(new GridData(DWT.END, DWT.CENTER, true, false));
+        boldButton = new Button (styledTextStyleGroup, DWT.PUSH);
+        boldButton.setImage (boldImage);
+        label = new Label (styledTextStyleGroup, DWT.NONE);
+        label.setText (ControlExample.getResourceString ("Underline"));
+        label.setLayoutData(new GridData(DWT.END, DWT.CENTER, true, false));
+        underlineButton = new Button (styledTextStyleGroup, DWT.PUSH);
+        underlineButton.setImage (underlineImage);
+        label = new Label (styledTextStyleGroup, DWT.NONE);
+        label.setText (ControlExample.getResourceString ("Foreground_Style"));
+        label.setLayoutData(new GridData(DWT.END, DWT.CENTER, true, false));
+        redButton = new Button (styledTextStyleGroup, DWT.PUSH);
+        redButton.setImage (redImage);
+        label = new Label (styledTextStyleGroup, DWT.NONE);
+        label.setText (ControlExample.getResourceString ("Italic"));
+        label.setLayoutData(new GridData(DWT.END, DWT.CENTER, true, false));
+        italicButton = new Button (styledTextStyleGroup, DWT.PUSH);
+        italicButton.setImage (italicImage);
+        label = new Label (styledTextStyleGroup, DWT.NONE);
+        label.setText (ControlExample.getResourceString ("Strikeout"));
+        label.setLayoutData(new GridData(DWT.END, DWT.CENTER, true, false));
+        strikeoutButton = new Button (styledTextStyleGroup, DWT.PUSH);
+        strikeoutButton.setImage (strikeoutImage);
+        label = new Label (styledTextStyleGroup, DWT.NONE);
+        label.setText (ControlExample.getResourceString ("Background_Style"));
+        label.setLayoutData(new GridData(DWT.END, DWT.CENTER, true, false));
+        yellowButton = new Button (styledTextStyleGroup, DWT.PUSH);
+        yellowButton.setImage (yellowImage);
+        SelectionListener styleListener = new SelectionAdapter () {
+            public void widgetSelected (SelectionEvent e) {
+                Point sel = styledText.getSelectionRange();
+                if ((sel is null) || (sel.y is 0)) return;
+                StyleRange style;
+                for (int i = sel.x; i<sel.x+sel.y; i++) {
+                    StyleRange range = styledText.getStyleRangeAtOffset(i);
+                    if (range !is null) {
+                        style = (StyleRange)range.clone();
+                        style.start = i;
+                        style.length = 1;
+                    } else {
+                        style = new StyleRange(i, 1, null, null, DWT.NORMAL);
+                    }
+                    if (e.widget is boldButton) {
+                        style.fontStyle ^= DWT.BOLD;
+                    } else if (e.widget is italicButton) {
+                        style.fontStyle ^= DWT.ITALIC;
+                    } else if (e.widget is underlineButton) {
+                        style.underline = !style.underline;
+                    } else if (e.widget is strikeoutButton) {
+                        style.strikeout = !style.strikeout;
+                    }
+                    styledText.setStyleRange(style);
+                }
+                styledText.setSelectionRange(sel.x + sel.y, 0);
+            }
+        };
+        SelectionListener colorListener = new SelectionAdapter () {
+            public void widgetSelected (SelectionEvent e) {
+                Point sel = styledText.getSelectionRange();
+                if ((sel is null) || (sel.y is 0)) return;
+                Color fg = null, bg = null;
+                if (e.widget is redButton) {
+                    fg = display.getSystemColor (DWT.COLOR_RED);
+                } else if (e.widget is yellowButton) {
+                    bg = display.getSystemColor (DWT.COLOR_YELLOW);
+                }
+                StyleRange style;
+                for (int i = sel.x; i<sel.x+sel.y; i++) {
+                    StyleRange range = styledText.getStyleRangeAtOffset(i);
+                    if (range !is null) {
+                        style = (StyleRange)range.clone();
+                        style.start = i;
+                        style.length = 1;
+                        style.foreground = style.foreground !is null ? null : fg;
+                        style.background = style.background !is null ? null : bg;
+                    } else {
+                        style = new StyleRange (i, 1, fg, bg, DWT.NORMAL);
+                    }
+                    styledText.setStyleRange(style);
+                }
+                styledText.setSelectionRange(sel.x + sel.y, 0);
+            }
+        };
+        boldButton.addSelectionListener(styleListener);
+        italicButton.addSelectionListener(styleListener);
+        underlineButton.addSelectionListener(styleListener);
+        strikeoutButton.addSelectionListener(styleListener);
+        redButton.addSelectionListener(colorListener);
+        yellowButton.addSelectionListener(colorListener);
+        yellowButton.addDisposeListener(new DisposeListener () {
+            public void widgetDisposed (DisposeEvent e) {
+                boldImage.dispose();
+                italicImage.dispose();
+                redImage.dispose();
+                yellowImage.dispose();
+                underlineImage.dispose();
+                strikeoutImage.dispose();
+            }
+        });
+    }
+
+    /**
+     * Creates the tab folder page.
+     *
+     * @param tabFolder org.eclipse.swt.widgets.TabFolder
+     * @return the new page for the tab folder
+     */
+    Composite createTabFolderPage (TabFolder tabFolder) {
+        super.createTabFolderPage (tabFolder);
+
+        /*
+         * Add a resize listener to the tabFolderPage so that
+         * if the user types into the example widget to change
+         * its preferred size, and then resizes the shell, we
+         * recalculate the preferred size correctly.
+         */
+        tabFolderPage.addControlListener(new ControlAdapter() {
+            public void controlResized(ControlEvent e) {
+                setExampleWidgetSize ();
+            }
+        });
+
+        return tabFolderPage;
+    }
+
+    /**
+     * Disposes the "Example" widgets.
+     */
+    void disposeExampleWidgets () {
+        /* store the state of the styledText if applicable */
+        if (styledText !is null) {
+            styleRanges = styledText.getStyleRanges();
+            text = styledText.getText();
+        }
+        super.disposeExampleWidgets();
+    }
+
+    /**
+     * Gets the "Example" widget children.
+     */
+    Widget [] getExampleWidgets () {
+        return new Widget [] {styledText};
+    }
+
+    /**
+     * Returns a list of set/get API method names (without the set/get prefix)
+     * that can be used to set/get values in the example control(s).
+     */
+    String[] getMethodNames() {
+        return new String[] {"CaretOffset", "DoubleClickEnabled", "Editable", "HorizontalIndex", "HorizontalPixel", "Orientation", "Selection", "Tabs", "Text", "TextLimit", "ToolTipText", "TopIndex", "TopPixel", "WordWrap"};
+    }
+
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    String getTabText () {
+        return "StyledText";
+    }
+
+    /**
+     * Sets the state of the "Example" widgets.
+     */
+    void setExampleWidgetState () {
+        super.setExampleWidgetState ();
+        wrapButton.setSelection ((styledText.getStyle () & DWT.WRAP) !is 0);
+        readOnlyButton.setSelection ((styledText.getStyle () & DWT.READ_ONLY) !is 0);
+        fullSelectionButton.setSelection ((styledText.getStyle () & DWT.FULL_SELECTION) !is 0);
+        horizontalButton.setEnabled ((styledText.getStyle () & DWT.MULTI) !is 0);
+        verticalButton.setEnabled ((styledText.getStyle () & DWT.MULTI) !is 0);
+        wrapButton.setEnabled ((styledText.getStyle () & DWT.MULTI) !is 0);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/controlexample/Tab.d	Mon Jan 21 01:40:01 2008 +0100
@@ -0,0 +1,1507 @@
+/*******************************************************************************
+ * 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
+ *******************************************************************************/
+module dwtexamples.controlexample.Tab;
+
+
+
+import dwt.DWT;
+import dwt.events.ArmEvent;
+import dwt.events.ControlEvent;
+import dwt.events.DisposeEvent;
+import dwt.events.DisposeListener;
+import dwt.events.FocusEvent;
+import dwt.events.HelpEvent;
+import dwt.events.KeyAdapter;
+import dwt.events.KeyEvent;
+import dwt.events.MenuEvent;
+import dwt.events.ModifyEvent;
+import dwt.events.MouseEvent;
+import dwt.events.PaintEvent;
+import dwt.events.SelectionAdapter;
+import dwt.events.SelectionEvent;
+import dwt.events.SelectionListener;
+import dwt.events.ShellEvent;
+import dwt.events.TraverseEvent;
+import dwt.events.TreeEvent;
+import dwt.events.TypedEvent;
+import dwt.events.VerifyEvent;
+import dwt.graphics.Color;
+import dwt.graphics.Font;
+import dwt.graphics.FontData;
+import dwt.graphics.GC;
+import dwt.graphics.Image;
+import dwt.graphics.Point;
+import dwt.graphics.RGB;
+import dwt.graphics.Rectangle;
+import dwt.layout.GridData;
+import dwt.layout.GridLayout;
+import dwt.widgets.Button;
+import dwt.widgets.ColorDialog;
+import dwt.widgets.Combo;
+import dwt.widgets.Composite;
+import dwt.widgets.Control;
+import dwt.widgets.Display;
+import dwt.widgets.Event;
+import dwt.widgets.FontDialog;
+import dwt.widgets.Group;
+import dwt.widgets.Item;
+import dwt.widgets.Label;
+import dwt.widgets.Listener;
+import dwt.widgets.Menu;
+import dwt.widgets.MenuItem;
+import dwt.widgets.Shell;
+import dwt.widgets.TabFolder;
+import dwt.widgets.Table;
+import dwt.widgets.TableItem;
+import dwt.widgets.Text;
+import dwt.widgets.Widget;
+
+import dwtexamples.controlexample.ControlExample;
+
+/**
+ * <code>Tab</code> is the abstract superclass of every page
+ * in the example's tab folder.  Each page in the tab folder
+ * describes a control.
+ *
+ * A Tab itself is not a control but instead provides a
+ * hierarchy with which to share code that is common to
+ * every page in the folder.
+ *
+ * A typical page in a Tab contains a two column composite.
+ * The left column contains the "Example" group.  The right
+ * column contains "Control" group.  The "Control" group
+ * contains controls that allow the user to interact with
+ * the example control.  The "Control" group typically
+ * contains a "Style", "Other" and "Size" group.  Subclasses
+ * can override these defaults to augment a group or stop
+ * a group from being created.
+ */
+    struct EventName {
+        char[] name;
+        int id;
+    }
+abstract class Tab {
+    Shell shell;
+    Display display;
+
+    /* Common control buttons */
+    Button borderButton, enabledButton, visibleButton, backgroundImageButton, popupMenuButton;
+    Button preferredButton, tooSmallButton, smallButton, largeButton, fillHButton, fillVButton;
+
+    /* Common groups and composites */
+    Composite tabFolderPage;
+    Group exampleGroup, controlGroup, listenersGroup, otherGroup, sizeGroup, styleGroup, colorGroup, backgroundModeGroup;
+
+    /* Controlling instance */
+    final ControlExample instance;
+
+    /* Sizing constants for the "Size" group */
+    static final int TOO_SMALL_SIZE = 10;
+    static final int SMALL_SIZE     = 50;
+    static final int LARGE_SIZE     = 100;
+
+    /* Right-to-left support */
+    static final bool RTL_SUPPORT_ENABLE = false;
+    Group orientationGroup;
+    Button rtlButton, ltrButton, defaultOrietationButton;
+
+    /* Controls and resources for the "Colors & Fonts" group */
+    static final int IMAGE_SIZE = 12;
+    static final int FOREGROUND_COLOR = 0;
+    static final int BACKGROUND_COLOR = 1;
+    static final int FONT = 2;
+    Table colorAndFontTable;
+    ColorDialog colorDialog;
+    FontDialog fontDialog;
+    Color foregroundColor, backgroundColor;
+    Font font;
+
+    /* Controls and resources for the "Background Mode" group */
+    Combo backgroundModeCombo;
+    Button backgroundModeImageButton, backgroundModeColorButton;
+
+    /* Event logging variables and controls */
+    Text eventConsole;
+    bool logging = false;
+    bool [] eventsFilter;
+
+    /* Set/Get API controls */
+    Combo nameCombo;
+    Label returnTypeLabel;
+    Button getButton, setButton;
+    Text setText, getText;
+
+    static EventName[] EVENT_NAMES = [
+        {"Activate"[], DWT.Activate},
+        {"Arm", DWT.Arm},
+        {"Close", DWT.Close},
+        {"Collapse", DWT.Collapse},
+        {"Deactivate", DWT.Deactivate},
+        {"DefaultSelection", DWT.DefaultSelection},
+        {"Deiconify", DWT.Deiconify},
+        {"Dispose", DWT.Dispose},
+        {"DragDetect", DWT.DragDetect},
+        {"EraseItem", DWT.EraseItem},
+        {"Expand", DWT.Expand},
+        {"FocusIn", DWT.FocusIn},
+        {"FocusOut", DWT.FocusOut},
+        {"HardKeyDown", DWT.HardKeyDown},
+        {"HardKeyUp", DWT.HardKeyUp},
+        {"Help", DWT.Help},
+        {"Hide", DWT.Hide},
+        {"Iconify", DWT.Iconify},
+        {"KeyDown", DWT.KeyDown},
+        {"KeyUp", DWT.KeyUp},
+        {"MeasureItem", DWT.MeasureItem},
+        {"MenuDetect", DWT.MenuDetect},
+        {"Modify", DWT.Modify},
+        {"MouseDoubleClick", DWT.MouseDoubleClick},
+        {"MouseDown", DWT.MouseDown},
+        {"MouseEnter", DWT.MouseEnter},
+        {"MouseExit", DWT.MouseExit},
+        {"MouseHover", DWT.MouseHover},
+        {"MouseMove", DWT.MouseMove},
+        {"MouseUp", DWT.MouseUp},
+        {"MouseWheel", DWT.MouseWheel},
+        {"Move", DWT.Move},
+        {"Paint", DWT.Paint},
+        {"PaintItem", DWT.PaintItem},
+        {"Resize", DWT.Resize},
+        {"Selection", DWT.Selection},
+        {"SetData", DWT.SetData},
+//      {"Settings", DWT.Settings},  // note: this event only goes to Display
+        {"Show", DWT.Show},
+        {"Traverse", DWT.Traverse},
+        {"Verify", DWT.Verify}
+    ];
+
+    bool samplePopup = false;
+
+    /**
+     * Creates the Tab within a given instance of ControlExample.
+     */
+    this(ControlExample instance) {
+        this.instance = instance;
+    }
+
+    /**
+     * Creates the "Control" group.  The "Control" group
+     * is typically the right hand column in the tab.
+     */
+    void createControlGroup () {
+
+        /*
+         * Create the "Control" group.  This is the group on the
+         * right half of each example tab.  It consists of the
+         * "Style" group, the "Other" group and the "Size" group.
+         */
+        controlGroup = new Group (tabFolderPage, DWT.NONE);
+        controlGroup.setLayout (new GridLayout (2, true));
+        controlGroup.setLayoutData (new GridData(DWT.FILL, DWT.FILL, false, false));
+        controlGroup.setText (ControlExample.getResourceString("Parameters"));
+
+        /* Create individual groups inside the "Control" group */
+        createStyleGroup ();
+        createOtherGroup ();
+        createSetGetGroup();
+        createSizeGroup ();
+        createColorAndFontGroup ();
+        if (RTL_SUPPORT_ENABLE) {
+            createOrientationGroup ();
+        }
+
+        /*
+         * For each Button child in the style group, add a selection
+         * listener that will recreate the example controls.  If the
+         * style group button is a RADIO button, ensure that the radio
+         * button is selected before recreating the example controls.
+         * When the user selects a RADIO button, the current RADIO
+         * button in the group is deselected and the new RADIO button
+         * is selected automatically.  The listeners are notified for
+         * both these operations but typically only do work when a RADIO
+         * button is selected.
+         */
+        SelectionListener selectionListener = new class() SelectionAdapter {
+            public void widgetSelected (SelectionEvent event) {
+                if ((event.widget.getStyle () & DWT.RADIO) !is 0) {
+                    if (!(cast(Button) event.widget).getSelection ()) return;
+                }
+                recreateExampleWidgets ();
+            }
+        };
+        Control [] children = styleGroup.getChildren ();
+        for (int i=0; i<children.length; i++) {
+            if ( auto button = cast(Button)children [i]) {
+                button.addSelectionListener (selectionListener);
+            } else {
+                if ( auto composite = cast(Composite)children [i]) {
+                    /* Look down one more level of children in the style group. */
+                    Control [] grandchildren = composite.getChildren ();
+                    for (int j=0; j<grandchildren.length; j++) {
+                        if ( auto button = cast(Button)grandchildren [j]) {
+                            button.addSelectionListener (selectionListener);
+                        }
+                    }
+                }
+            }
+        }
+        if (RTL_SUPPORT_ENABLE) {
+            rtlButton.addSelectionListener (selectionListener);
+            ltrButton.addSelectionListener (selectionListener);
+            defaultOrietationButton.addSelectionListener (selectionListener);
+        }
+    }
+
+    /**
+     * Append the Set/Get API controls to the "Other" group.
+     */
+    void createSetGetGroup() {
+        /*
+         * Create the button to access set/get API functionality.
+         */
+        final char[] [] methodNames = getMethodNames ();
+        if (methodNames !is null) {
+            Button setGetButton = new Button (otherGroup, DWT.PUSH);
+            setGetButton.setText (ControlExample.getResourceString ("Set_Get"));
+            setGetButton.setLayoutData(new GridData(DWT.FILL, DWT.CENTER, false, false));
+            setGetButton.addSelectionListener (new class() SelectionAdapter {
+                public void widgetSelected (SelectionEvent e) {
+                    Button button = cast(Button)e.widget;
+                    Point pt = button.getLocation();
+                    pt = e.display.map(button, null, pt);
+                    createSetGetDialog(pt.x, pt.y, methodNames);
+                }
+            });
+        }
+    }
+
+    /**
+     * Creates the "Control" widget children.
+     * Subclasses override this method to augment
+     * the standard controls created in the "Style",
+     * "Other" and "Size" groups.
+     */
+    void createControlWidgets () {
+    }
+
+    /**
+     * Creates the "Colors and Fonts" group. This is typically
+     * a child of the "Control" group. Subclasses override
+     * this method to customize color and font settings.
+     */
+    void createColorAndFontGroup () {
+        /* Create the group. */
+        colorGroup = new Group(controlGroup, DWT.NONE);
+        colorGroup.setLayout (new GridLayout (2, true));
+        colorGroup.setLayoutData (new GridData (DWT.FILL, DWT.FILL, false, false));
+        colorGroup.setText (ControlExample.getResourceString ("Colors"));
+        colorAndFontTable = new Table(colorGroup, DWT.BORDER | DWT.V_SCROLL);
+        colorAndFontTable.setLayoutData(new GridData(DWT.FILL, DWT.BEGINNING, true, false, 2, 1));
+        TableItem item = new TableItem(colorAndFontTable, DWT.None);
+        item.setText(ControlExample.getResourceString ("Foreground_Color"));
+        colorAndFontTable.setSelection(0);
+        item = new TableItem(colorAndFontTable, DWT.None);
+        item.setText(ControlExample.getResourceString ("Background_Color"));
+        item = new TableItem(colorAndFontTable, DWT.None);
+        item.setText(ControlExample.getResourceString ("Font"));
+        Button changeButton = new Button (colorGroup, DWT.PUSH);
+        changeButton.setText(ControlExample.getResourceString("Change"));
+        changeButton.setLayoutData(new GridData(DWT.FILL, DWT.CENTER, false, false));
+        Button defaultsButton = new Button (colorGroup, DWT.PUSH);
+        defaultsButton.setText(ControlExample.getResourceString("Defaults"));
+        defaultsButton.setLayoutData(new GridData(DWT.FILL, DWT.CENTER, false, false));
+
+        /* Add listeners to set/reset colors and fonts. */
+        colorDialog = new ColorDialog (shell);
+        fontDialog = new FontDialog (shell);
+        colorAndFontTable.addSelectionListener(new class() SelectionAdapter {
+            public void widgetDefaultSelected(SelectionEvent event) {
+                changeFontOrColor (colorAndFontTable.getSelectionIndex());
+            }
+        });
+        changeButton.addSelectionListener(new class() SelectionAdapter {
+            public void widgetSelected(SelectionEvent event) {
+                changeFontOrColor (colorAndFontTable.getSelectionIndex());
+            }
+        });
+        defaultsButton.addSelectionListener(new class() SelectionAdapter {
+            public void widgetSelected (SelectionEvent e) {
+                resetColorsAndFonts ();
+            }
+        });
+        shell.addDisposeListener(new class() DisposeListener {
+            public void widgetDisposed(DisposeEvent event) {
+                if (foregroundColor !is null) foregroundColor.dispose();
+                if (backgroundColor !is null) backgroundColor.dispose();
+                if (font !is null) font.dispose();
+                foregroundColor = null;
+                backgroundColor = null;
+                font = null;
+                if (colorAndFontTable !is null && !colorAndFontTable.isDisposed()) {
+                    TableItem [] items = colorAndFontTable.getItems();
+                    for (int i = 0; i < items.length; i++) {
+                        Image image = items[i].getImage();
+                        if (image !is null) image.dispose();
+                    }
+                }
+            }
+        });
+    }
+
+    void changeFontOrColor(int index) {
+        switch (index) {
+            case FOREGROUND_COLOR: {
+                Color oldColor = foregroundColor;
+                if (oldColor is null) {
+                    Control [] controls = getExampleControls ();
+                    if (controls.length > 0) oldColor = controls [0].getForeground ();
+                }
+                if (oldColor !is null) colorDialog.setRGB(oldColor.getRGB()); // seed dialog with current color
+                RGB rgb = colorDialog.open();
+                if (rgb is null) return;
+                oldColor = foregroundColor; // save old foreground color to dispose when done
+                foregroundColor = new Color (display, rgb);
+                setExampleWidgetForeground ();
+                if (oldColor !is null) oldColor.dispose ();
+            }
+            break;
+            case BACKGROUND_COLOR: {
+                Color oldColor = backgroundColor;
+                if (oldColor is null) {
+                    Control [] controls = getExampleControls ();
+                    if (controls.length > 0) oldColor = controls [0].getBackground (); // seed dialog with current color
+                }
+                if (oldColor !is null) colorDialog.setRGB(oldColor.getRGB());
+                RGB rgb = colorDialog.open();
+                if (rgb is null) return;
+                oldColor = backgroundColor; // save old background color to dispose when done
+                backgroundColor = new Color (display, rgb);
+                setExampleWidgetBackground ();
+                if (oldColor !is null) oldColor.dispose ();
+            }
+            break;
+            case FONT: {
+                Font oldFont = font;
+                if (oldFont is null) {
+                    Control [] controls = getExampleControls ();
+                    if (controls.length > 0) oldFont = controls [0].getFont ();
+                }
+                if (oldFont !is null) fontDialog.setFontList(oldFont.getFontData()); // seed dialog with current font
+                FontData fontData = fontDialog.open ();
+                if (fontData is null) return;
+                oldFont = font; // dispose old font when done
+                font = new Font (display, fontData);
+                setExampleWidgetFont ();
+                setExampleWidgetSize ();
+                if (oldFont !is null) oldFont.dispose ();
+            }
+            break;
+            default:
+        }
+    }
+
+    /**
+     * Creates the "Other" group.  This is typically
+     * a child of the "Control" group.
+     */
+    void createOtherGroup () {
+        /* Create the group */
+        otherGroup = new Group (controlGroup, DWT.NONE);
+        otherGroup.setLayout (new GridLayout ());
+        otherGroup.setLayoutData (new GridData (DWT.FILL, DWT.FILL, false, false));
+        otherGroup.setText (ControlExample.getResourceString("Other"));
+
+        /* Create the controls */
+        enabledButton = new Button(otherGroup, DWT.CHECK);
+        enabledButton.setText(ControlExample.getResourceString("Enabled"));
+        visibleButton = new Button(otherGroup, DWT.CHECK);
+        visibleButton.setText(ControlExample.getResourceString("Visible"));
+        backgroundImageButton = new Button(otherGroup, DWT.CHECK);
+        backgroundImageButton.setText(ControlExample.getResourceString("BackgroundImage"));
+        popupMenuButton = new Button(otherGroup, DWT.CHECK);
+        popupMenuButton.setText(ControlExample.getResourceString("PopupMenu"));
+
+        /* Add the listeners */
+        enabledButton.addSelectionListener (new class() SelectionAdapter {
+            public void widgetSelected (SelectionEvent event) {
+                setExampleWidgetEnabled ();
+            }
+        });
+        visibleButton.addSelectionListener (new class() SelectionAdapter {
+            public void widgetSelected (SelectionEvent event) {
+                setExampleWidgetVisibility ();
+            }
+        });
+        backgroundImageButton.addSelectionListener (new class() SelectionAdapter {
+            public void widgetSelected (SelectionEvent event) {
+                setExampleWidgetBackgroundImage ();
+            }
+        });
+        popupMenuButton.addSelectionListener (new class() SelectionAdapter {
+            public void widgetSelected (SelectionEvent event) {
+                setExampleWidgetPopupMenu ();
+            }
+        });
+
+        /* Set the default state */
+        enabledButton.setSelection(true);
+        visibleButton.setSelection(true);
+        backgroundImageButton.setSelection(false);
+        popupMenuButton.setSelection(false);
+    }
+
+    /**
+     * Creates the "Background Mode" group.
+     */
+    void createBackgroundModeGroup () {
+        // note that this method must be called after createExampleWidgets
+        if (getExampleControls ().length is 0) return;
+
+        /* Create the group */
+        backgroundModeGroup = new Group (controlGroup, DWT.NONE);
+        backgroundModeGroup.setLayout (new GridLayout ());
+        backgroundModeGroup.setLayoutData (new GridData (DWT.FILL, DWT.FILL, false, false));
+        backgroundModeGroup.setText (ControlExample.getResourceString("Background_Mode"));
+
+        /* Create the controls */
+        backgroundModeCombo = new Combo(backgroundModeGroup, DWT.READ_ONLY);
+        backgroundModeCombo.setItems(["DWT.INHERIT_NONE", "DWT.INHERIT_DEFAULT", "DWT.INHERIT_FORCE"]);
+        backgroundModeImageButton = new Button(backgroundModeGroup, DWT.CHECK);
+        backgroundModeImageButton.setText(ControlExample.getResourceString("BackgroundImage"));
+        backgroundModeColorButton = new Button(backgroundModeGroup, DWT.CHECK);
+        backgroundModeColorButton.setText(ControlExample.getResourceString("BackgroundColor"));
+
+        /* Add the listeners */
+        backgroundModeCombo.addSelectionListener (new class() SelectionAdapter {
+            public void widgetSelected (SelectionEvent event) {
+                setExampleGroupBackgroundMode ();
+            }
+        });
+        backgroundModeImageButton.addSelectionListener (new class() SelectionAdapter {
+            public void widgetSelected (SelectionEvent event) {
+                setExampleGroupBackgroundImage ();
+            }
+        });
+        backgroundModeColorButton.addSelectionListener (new class() SelectionAdapter {
+            public void widgetSelected (SelectionEvent event) {
+                setExampleGroupBackgroundColor ();
+            }
+        });
+
+        /* Set the default state */
+        backgroundModeCombo.setText(backgroundModeCombo.getItem(0));
+        backgroundModeImageButton.setSelection(false);
+        backgroundModeColorButton.setSelection(false);
+    }
+
+    /**
+     * Create the event console popup menu.
+     */
+    void createEventConsolePopup () {
+        Menu popup = new Menu (shell, DWT.POP_UP);
+        eventConsole.setMenu (popup);
+
+        MenuItem cut = new MenuItem (popup, DWT.PUSH);
+        cut.setText (ControlExample.getResourceString("MenuItem_Cut"));
+        cut.addListener (DWT.Selection, new class() Listener {
+            public void handleEvent (Event event) {
+                eventConsole.cut ();
+            }
+        });
+        MenuItem copy = new MenuItem (popup, DWT.PUSH);
+        copy.setText (ControlExample.getResourceString("MenuItem_Copy"));
+        copy.addListener (DWT.Selection, new class() Listener {
+            public void handleEvent (Event event) {
+                eventConsole.copy ();
+            }
+        });
+        MenuItem paste = new MenuItem (popup, DWT.PUSH);
+        paste.setText (ControlExample.getResourceString("MenuItem_Paste"));
+        paste.addListener (DWT.Selection, new class() Listener {
+            public void handleEvent (Event event) {
+                eventConsole.paste ();
+            }
+        });
+        new MenuItem (popup, DWT.SEPARATOR);
+        MenuItem selectAll = new MenuItem (popup, DWT.PUSH);
+        selectAll.setText(ControlExample.getResourceString("MenuItem_SelectAll"));
+        selectAll.addListener (DWT.Selection, new class() Listener {
+            public void handleEvent (Event event) {
+                eventConsole.selectAll ();
+            }
+        });
+    }
+
+    /**
+     * Creates the "Example" group.  The "Example" group
+     * is typically the left hand column in the tab.
+     */
+    void createExampleGroup () {
+        exampleGroup = new Group (tabFolderPage, DWT.NONE);
+        exampleGroup.setLayout (new GridLayout ());
+        exampleGroup.setLayoutData (new GridData (DWT.FILL, DWT.FILL, true, true));
+    }
+
+    /**
+     * Creates the "Example" widget children of the "Example" group.
+     * Subclasses override this method to create the particular
+     * example control.
+     */
+    void createExampleWidgets () {
+        /* Do nothing */
+    }
+
+    /**
+     * Creates and opens the "Listener selection" dialog.
+     */
+    void createListenerSelectionDialog () {
+        final Shell dialog = new Shell (shell, DWT.DIALOG_TRIM | DWT.APPLICATION_MODAL);
+        dialog.setText (ControlExample.getResourceString ("Select_Listeners"));
+        dialog.setLayout (new GridLayout (2, false));
+        final Table table = new Table (dialog, DWT.BORDER | DWT.V_SCROLL | DWT.CHECK);
+        GridData data = new GridData(GridData.FILL_BOTH);
+        data.verticalSpan = 2;
+        table.setLayoutData(data);
+        for (int i = 0; i < EVENT_NAMES.length; i++) {
+            TableItem item = new TableItem (table, DWT.NONE);
+            item.setText (cast(char[])EVENT_NAMES[i][0]);
+            item.setChecked (eventsFilter[i]);
+        }
+        final char[] [] customNames = getCustomEventNames ();
+        for (int i = 0; i < customNames.length; i++) {
+            TableItem item = new TableItem (table, DWT.NONE);
+            item.setText (customNames[i]);
+            item.setChecked (eventsFilter[EVENT_NAMES.length + i]);
+        }
+        Button selectAll = new Button (dialog, DWT.PUSH);
+        selectAll.setText(ControlExample.getResourceString ("Select_All"));
+        selectAll.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
+        selectAll.addSelectionListener (new class() SelectionAdapter {
+            public void widgetSelected(SelectionEvent e) {
+                TableItem [] items = table.getItems();
+                for (int i = 0; i < EVENT_NAMES.length; i++) {
+                    items[i].setChecked(true);
+                }
+                for (int i = 0; i < customNames.length; i++) {
+                    items[EVENT_NAMES.length + i].setChecked(true);
+                }
+            }
+        });
+        Button deselectAll = new Button (dialog, DWT.PUSH);
+        deselectAll.setText(ControlExample.getResourceString ("Deselect_All"));
+        deselectAll.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_BEGINNING));
+        deselectAll.addSelectionListener (new class() SelectionAdapter {
+            public void widgetSelected(SelectionEvent e) {
+                TableItem [] items = table.getItems();
+                for (int i = 0; i < EVENT_NAMES.length; i++) {
+                    items[i].setChecked(false);
+                }
+                for (int i = 0; i < customNames.length; i++) {
+                    items[EVENT_NAMES.length + i].setChecked(false);
+                }
+            }
+        });
+        new Label(dialog, DWT.NONE); /* Filler */
+        Button ok = new Button (dialog, DWT.PUSH);
+        ok.setText(ControlExample.getResourceString ("OK"));
+        dialog.setDefaultButton(ok);
+        ok.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
+        ok.addSelectionListener (new class() SelectionAdapter {
+            public void widgetSelected(SelectionEvent e) {
+                TableItem [] items = table.getItems();
+                for (int i = 0; i < EVENT_NAMES.length; i++) {
+                    eventsFilter[i] = items[i].getChecked();
+                }
+                for (int i = 0; i < customNames.length; i++) {
+                    eventsFilter[EVENT_NAMES.length + i] = items[EVENT_NAMES.length + i].getChecked();
+                }
+                dialog.dispose();
+            }
+        });
+        dialog.pack ();
+        dialog.open ();
+        while (! dialog.isDisposed()) {
+            if (! display.readAndDispatch()) display.sleep();
+        }
+    }
+
+    /**
+     * Creates the "Listeners" group.  The "Listeners" group
+     * goes below the "Example" and "Control" groups.
+     */
+    void createListenersGroup () {
+        listenersGroup = new Group (tabFolderPage, DWT.NONE);
+        listenersGroup.setLayout (new GridLayout (3, false));
+        listenersGroup.setLayoutData (new GridData (DWT.FILL, DWT.FILL, true, true, 2, 1));
+        listenersGroup.setText (ControlExample.getResourceString ("Listeners"));
+
+        /*
+         * Create the button to access the 'Listeners' dialog.
+         */
+        Button listenersButton = new Button (listenersGroup, DWT.PUSH);
+        listenersButton.setText (ControlExample.getResourceString ("Select_Listeners"));
+        listenersButton.addSelectionListener (new class() SelectionAdapter {
+            public void widgetSelected (SelectionEvent e) {
+                createListenerSelectionDialog ();
+                recreateExampleWidgets ();
+            }
+        });
+
+        /*
+         * Create the checkbox to add/remove listeners to/from the example widgets.
+         */
+        final Button listenCheckbox = new Button (listenersGroup, DWT.CHECK);
+        listenCheckbox.setText (ControlExample.getResourceString ("Listen"));
+        listenCheckbox.addSelectionListener (new class() SelectionAdapter {
+            public void widgetSelected(SelectionEvent e) {
+                logging = listenCheckbox.getSelection ();
+                recreateExampleWidgets ();
+            }
+        });
+
+        /*
+         * Create the button to clear the text.
+         */
+        Button clearButton = new Button (listenersGroup, DWT.PUSH);
+        clearButton.setText (ControlExample.getResourceString ("Clear"));
+        clearButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END));
+        clearButton.addSelectionListener (new class() SelectionAdapter {
+            public void widgetSelected (SelectionEvent e) {
+                eventConsole.setText ("");
+            }
+        });
+
+        /* Initialize the eventsFilter to log all events. */
+        int customEventCount = getCustomEventNames ().length;
+        eventsFilter = new bool [EVENT_NAMES.length + customEventCount];
+        for (int i = 0; i < EVENT_NAMES.length + customEventCount; i++) {
+            eventsFilter [i] = true;
+        }
+
+        /* Create the event console Text. */
+        eventConsole = new Text (listenersGroup, DWT.BORDER | DWT.MULTI | DWT.V_SCROLL | DWT.H_SCROLL);
+        GridData data = new GridData (GridData.FILL_BOTH);
+        data.horizontalSpan = 3;
+        data.heightHint = 80;
+        eventConsole.setLayoutData (data);
+        createEventConsolePopup ();
+        eventConsole.addKeyListener (new class() KeyAdapter {
+            public void keyPressed (KeyEvent e) {
+                if ((e.keyCode is 'A' || e.keyCode is 'a') && (e.stateMask & DWT.MOD1) !is 0) {
+                    eventConsole.selectAll ();
+                    e.doit = false;
+                }
+            }
+        });
+    }
+
+    /**
+     * Returns a list of set/get API method names (without the set/get prefix)
+     * that can be used to set/get values in the example control(s).
+     */
+    char[][] getMethodNames() {
+        return null;
+    }
+
+    void createSetGetDialog(int x, int y, char[][] methodNames) {
+        final Shell dialog = new Shell(shell, DWT.DIALOG_TRIM | DWT.RESIZE | DWT.MODELESS);
+        dialog.setLayout(new GridLayout(2, false));
+        dialog.setText(getTabText() + " " + ControlExample.getResourceString ("Set_Get"));
+        nameCombo = new Combo(dialog, DWT.READ_ONLY);
+        nameCombo.setItems(methodNames);
+        nameCombo.setText(methodNames[0]);
+        nameCombo.setVisibleItemCount(methodNames.length);
+        nameCombo.setLayoutData(new GridData(DWT.FILL, DWT.CENTER, false, false));
+        nameCombo.addSelectionListener(new class() SelectionAdapter {
+            public void widgetSelected(SelectionEvent e) {
+                resetLabels();
+            }
+        });
+        returnTypeLabel = new Label(dialog, DWT.NONE);
+        returnTypeLabel.setLayoutData(new GridData(DWT.FILL, DWT.BEGINNING, false, false));
+        setButton = new Button(dialog, DWT.PUSH);
+        setButton.setLayoutData(new GridData(DWT.FILL, DWT.BEGINNING, false, false));
+        setButton.addSelectionListener(new class() SelectionAdapter {
+            public void widgetSelected(SelectionEvent e) {
+                setValue();
+                setText.selectAll();
+                setText.setFocus();
+            }
+        });
+        setText = new Text(dialog, DWT.SINGLE | DWT.BORDER);
+        setText.setLayoutData(new GridData(DWT.FILL, DWT.CENTER, false, false));
+        getButton = new Button(dialog, DWT.PUSH);
+        getButton.setLayoutData(new GridData(DWT.FILL, DWT.BEGINNING, false, false));
+        getButton.addSelectionListener(new class() SelectionAdapter {
+            public void widgetSelected(SelectionEvent e) {
+                getValue();
+            }
+        });
+        getText = new Text(dialog, DWT.MULTI | DWT.BORDER | DWT.READ_ONLY | DWT.H_SCROLL | DWT.V_SCROLL);
+        GridData data = new GridData(DWT.FILL, DWT.FILL, true, true);
+        data.widthHint = 240;
+        data.heightHint = 200;
+        getText.setLayoutData(data);
+        resetLabels();
+        dialog.setDefaultButton(setButton);
+        dialog.pack();
+        dialog.setLocation(x, y);
+        dialog.open();
+    }
+
+    void resetLabels() {
+        char[] methodRoot = nameCombo.getText();
+        returnTypeLabel.setText(parameterInfo(methodRoot));
+        setButton.setText(setMethodName(methodRoot));
+        getButton.setText("get" + methodRoot);
+        setText.setText("");
+        getText.setText("");
+        getValue();
+        setText.setFocus();
+    }
+
+    char[] setMethodName(char[] methodRoot) {
+        return "set" + methodRoot;
+    }
+
+    char[] parameterInfo(char[] methodRoot) {
+        char[] typeName = null;
+        Class returnType = getReturnType(methodRoot);
+        bool isArray = returnType.isArray();
+        if (isArray) {
+            typeName = returnType.getComponentType().getName();
+        } else {
+            typeName = returnType.getName();
+        }
+        char[] typeNameString = typeName;
+        int index = typeName.lastIndexOf('.');
+        if (index !is -1 && index+1 < typeName.length()) typeNameString = typeName.substring(index+1);
+        char[] info = ControlExample.getResourceString("Info_" + typeNameString + (isArray ? "A" : ""));
+        if (isArray) {
+            typeNameString += "[]";
+        }
+        return ControlExample.getResourceString("Parameter_Info", [typeNameString, info]);
+    }
+
+    void getValue() {
+        char[] methodName = "get" + nameCombo.getText();
+        getText.setText("");
+        Widget[] widgets = getExampleWidgets();
+        for (int i = 0; i < widgets.length; i++) {
+            try {
+                java.lang.reflect.Method method = widgets[i].getClass().getMethod(methodName, null);
+                Object result = method.invoke(widgets[i], null);
+                if (result is null) {
+                    getText.append("null");
+                } else if (result.getClass().isArray()) {
+                    int length = java.lang.reflect.Array.getLength(result);
+                    if (length is 0) {
+                        getText.append(result.getClass().getComponentType() + "[0]");
+                    }
+                    for (int j = 0; j < length; j++) {
+                        getText.append(java.lang.reflect.Array.get(result,j).toString() + "\n");
+                    }
+                } else {
+                    getText.append(result.toString());
+                }
+            } catch (Exception e) {
+                getText.append(e.toString());
+            }
+            if (i + 1 < widgets.length) {
+                getText.append("\n\n");
+            }
+        }
+    }
+
+    ClassInfo getReturnType(char[] methodRoot) {
+        ClassInfo returnType = null;
+        char[] methodName = "get" + methodRoot;
+        Widget[] widgets = getExampleWidgets();
+        try {
+            java.lang.reflect.Method method = widgets[0].getClass().getMethod(methodName, null);
+            returnType = method.getReturnType();
+        } catch (Exception e) {
+        }
+        return returnType;
+    }
+
+    void setValue() {
+        /* The parameter type must be the same as the get method's return type */
+        char[] methodRoot = nameCombo.getText();
+        Class returnType = getReturnType(methodRoot);
+        char[] methodName = setMethodName(methodRoot);
+        char[] value = setText.getText();
+        Widget[] widgets = getExampleWidgets();
+        for (int i = 0; i < widgets.length; i++) {
+            try {
+                java.lang.reflect.Method method = widgets[i].getClass().getMethod(methodName, [returnType]);
+                char[] typeName = returnType.getName();
+                Object[] parameter = null;
+                if (typeName.equals("int")) {
+                    parameter = [new Integer(value)];
+                } else if (typeName.equals("long")) {
+                    parameter = [new Long(value)];
+                } else if (typeName.equals("char")) {
+                    parameter = [value.length() is 1 ? new Character(value.charAt(0)) : new Character('\0')];
+                } else if (typeName.equals("bool")) {
+                    parameter = [new bool(value)];
+                } else if (typeName.equals("java.lang.char[]")) {
+                    parameter = [value];
+                } else if (typeName.equals("org.eclipse.swt.graphics.Point")) {
+                    char[] xy[] = split(value, ',');
+                    parameter = [new Point((new Integer(xy[0])).intValue(),(new Integer(xy[1])).intValue())];
+                } else if (typeName.equals("[I")) {
+                    char[] strings[] = split(value, ',');
+                    int[] ints = new int[strings.length];
+                    for (int j = 0; j < strings.length; j++) {
+                        ints[j] = (new Integer(strings[j])).intValue();
+                    }
+                    parameter = [ints];
+                } else if (typeName.equals("[Ljava.lang.char[];")) {
+                    parameter = [split(value, ',')];
+                } else {
+                    parameter = parameterForType(typeName, value, widgets[i]);
+                }
+                method.invoke(widgets[i], parameter);
+            } catch (Exception e) {
+                getText.setText(e.toString());
+            }
+        }
+    }
+
+    Object[] parameterForType(char[] typeName, char[] value, Widget widget) {
+        return [value];
+    }
+
+    void createOrientationGroup () {
+        /* Create Orientation group*/
+        orientationGroup = new Group (controlGroup, DWT.NONE);
+        orientationGroup.setLayout (new GridLayout());
+        orientationGroup.setLayoutData (new GridData (DWT.FILL, DWT.FILL, false, false));
+        orientationGroup.setText (ControlExample.getResourceString("Orientation"));
+        defaultOrietationButton = new Button (orientationGroup, DWT.RADIO);
+        defaultOrietationButton.setText (ControlExample.getResourceString("Default"));
+        defaultOrietationButton.setSelection (true);
+        ltrButton = new Button (orientationGroup, DWT.RADIO);
+        ltrButton.setText ("DWT.LEFT_TO_RIGHT");
+        rtlButton = new Button (orientationGroup, DWT.RADIO);
+        rtlButton.setText ("DWT.RIGHT_TO_LEFT");
+    }
+
+    /**
+     * Creates the "Size" group.  The "Size" group contains
+     * controls that allow the user to change the size of
+     * the example widgets.
+     */
+    void createSizeGroup () {
+        /* Create the group */
+        sizeGroup = new Group (controlGroup, DWT.NONE);
+        sizeGroup.setLayout (new GridLayout());
+        sizeGroup.setLayoutData (new GridData (DWT.FILL, DWT.FILL, false, false));
+        sizeGroup.setText (ControlExample.getResourceString("Size"));
+
+        /* Create the controls */
+
+        /*
+         * The preferred size of a widget is the size returned
+         * by widget.computeSize (DWT.DEFAULT, DWT.DEFAULT).
+         * This size is defined on a widget by widget basis.
+         * Many widgets will attempt to display their contents.
+         */
+        preferredButton = new Button (sizeGroup, DWT.RADIO);
+        preferredButton.setText (ControlExample.getResourceString("Preferred"));
+        tooSmallButton = new Button (sizeGroup, DWT.RADIO);
+        tooSmallButton.setText (TOO_SMALL_SIZE + " X " + TOO_SMALL_SIZE);
+        smallButton = new Button(sizeGroup, DWT.RADIO);
+        smallButton.setText (SMALL_SIZE + " X " + SMALL_SIZE);
+        largeButton = new Button (sizeGroup, DWT.RADIO);
+        largeButton.setText (LARGE_SIZE + " X " + LARGE_SIZE);
+        fillHButton = new Button (sizeGroup, DWT.CHECK);
+        fillHButton.setText (ControlExample.getResourceString("Fill_X"));
+        fillVButton = new Button (sizeGroup, DWT.CHECK);
+        fillVButton.setText (ControlExample.getResourceString("Fill_Y"));
+
+        /* Add the listeners */
+        SelectionAdapter selectionListener = new class() SelectionAdapter {
+            public void widgetSelected (SelectionEvent event) {
+                setExampleWidgetSize ();
+            }
+        };
+        preferredButton.addSelectionListener(selectionListener);
+        tooSmallButton.addSelectionListener(selectionListener);
+        smallButton.addSelectionListener(selectionListener);
+        largeButton.addSelectionListener(selectionListener);
+        fillHButton.addSelectionListener(selectionListener);
+        fillVButton.addSelectionListener(selectionListener);
+
+        /* Set the default state */
+        preferredButton.setSelection (true);
+    }
+
+    /**
+     * Creates the "Style" group.  The "Style" group contains
+     * controls that allow the user to change the style of
+     * the example widgets.  Changing a widget "Style" causes
+     * the widget to be destroyed and recreated.
+     */
+    void createStyleGroup () {
+        styleGroup = new Group (controlGroup, DWT.NONE);
+        styleGroup.setLayout (new GridLayout ());
+        styleGroup.setLayoutData (new GridData (DWT.FILL, DWT.FILL, false, false));
+        styleGroup.setText (ControlExample.getResourceString("Styles"));
+    }
+
+    /**
+     * Creates the tab folder page.
+     *
+     * @param tabFolder org.eclipse.swt.widgets.TabFolder
+     * @return the new page for the tab folder
+     */
+    Composite createTabFolderPage (TabFolder tabFolder) {
+        /* Cache the shell and display. */
+        shell = tabFolder.getShell ();
+        display = shell.getDisplay ();
+
+        /* Create a two column page. */
+        tabFolderPage = new Composite (tabFolder, DWT.NONE);
+        tabFolderPage.setLayout (new GridLayout (2, false));
+
+        /* Create the "Example" and "Control" groups. */
+        createExampleGroup ();
+        createControlGroup ();
+
+        /* Create the "Listeners" group under the "Control" group. */
+        createListenersGroup ();
+
+        /* Create and initialize the example and control widgets. */
+        createExampleWidgets ();
+        hookExampleWidgetListeners ();
+        createControlWidgets ();
+        createBackgroundModeGroup ();
+        setExampleWidgetState ();
+
+        return tabFolderPage;
+    }
+
+    void setExampleWidgetPopupMenu() {
+        Control[] controls = getExampleControls();
+        for (int i = 0; i < controls.length; i++) {
+            final Control control = controls [i];
+            control.addListener(DWT.MenuDetect, new class() Listener {
+                public void handleEvent(Event event) {
+                    Menu menu = control.getMenu();
+                    if (menu !is null && samplePopup) {
+                        menu.dispose();
+                        menu = null;
+                    }
+                    if (menu is null && popupMenuButton.getSelection()) {
+                        menu = new Menu(shell, DWT.POP_UP);
+                        MenuItem item = new MenuItem(menu, DWT.PUSH);
+                        item.setText("Sample popup menu item");
+                        specialPopupMenuItems(menu, event);
+                        control.setMenu(menu);
+                        samplePopup = true;
+                    }
+                }
+            });
+        }
+    }
+
+    protected void specialPopupMenuItems(Menu menu, Event event) {
+    }
+
+    /**
+     * Disposes the "Example" widgets.
+     */
+    void disposeExampleWidgets () {
+        Widget [] widgets = getExampleWidgets ();
+        for (int i=0; i<widgets.length; i++) {
+            widgets [i].dispose ();
+        }
+    }
+
+    Image colorImage (Color color) {
+        Image image = new Image (display, IMAGE_SIZE, IMAGE_SIZE);
+        GC gc = new GC(image);
+        gc.setBackground(color);
+        Rectangle bounds = image.getBounds();
+        gc.fillRectangle(0, 0, bounds.width, bounds.height);
+        gc.setBackground(display.getSystemColor(DWT.COLOR_BLACK));
+        gc.drawRectangle(0, 0, bounds.width - 1, bounds.height - 1);
+        gc.dispose();
+        return image;
+    }
+
+    Image fontImage (Font font) {
+        Image image = new Image (display, IMAGE_SIZE, IMAGE_SIZE);
+        GC gc = new GC(image);
+        Rectangle bounds = image.getBounds();
+        gc.setBackground(display.getSystemColor(DWT.COLOR_WHITE));
+        gc.fillRectangle(0, 0, bounds.width, bounds.height);
+        gc.setBackground(display.getSystemColor(DWT.COLOR_BLACK));
+        gc.drawRectangle(0, 0, bounds.width - 1, bounds.height - 1);
+        FontData data[] = font.getFontData();
+        int style = data[0].getStyle();
+        switch (style) {
+        case DWT.NORMAL:
+            gc.drawLine(3, 3, 3, 8);
+            gc.drawLine(4, 3, 7, 8);
+            gc.drawLine(8, 3, 8, 8);
+            break;
+        case DWT.BOLD:
+            gc.drawLine(3, 2, 3, 9);
+            gc.drawLine(4, 2, 4, 9);
+            gc.drawLine(5, 2, 7, 2);
+            gc.drawLine(5, 3, 8, 3);
+            gc.drawLine(5, 5, 7, 5);
+            gc.drawLine(5, 6, 7, 6);
+            gc.drawLine(5, 8, 8, 8);
+            gc.drawLine(5, 9, 7, 9);
+            gc.drawLine(7, 4, 8, 4);
+            gc.drawLine(7, 7, 8, 7);
+            break;
+        case DWT.ITALIC:
+            gc.drawLine(6, 2, 8, 2);
+            gc.drawLine(7, 3, 4, 8);
+            gc.drawLine(3, 9, 5, 9);
+            break;
+        case DWT.BOLD | DWT.ITALIC:
+            gc.drawLine(5, 2, 8, 2);
+            gc.drawLine(5, 3, 8, 3);
+            gc.drawLine(6, 4, 4, 7);
+            gc.drawLine(7, 4, 5, 7);
+            gc.drawLine(3, 8, 6, 8);
+            gc.drawLine(3, 9, 6, 9);
+            break;
+        }
+        gc.dispose();
+        return image;
+    }
+
+    /**
+     * Gets the list of custom event names.
+     *
+     * @return an array containing custom event names
+     */
+    char[] [] getCustomEventNames () {
+        return new char[] [0];
+    }
+
+    /**
+     * Gets the default style for a widget
+     *
+     * @return the default style bit
+     */
+    int getDefaultStyle () {
+        if (ltrButton !is null && ltrButton.getSelection()) {
+            return DWT.LEFT_TO_RIGHT;
+        }
+        if (rtlButton !is null && rtlButton.getSelection()) {
+            return DWT.RIGHT_TO_LEFT;
+        }
+        return DWT.NONE;
+    }
+
+    /**
+     * Gets the "Example" widgets.
+     *
+     * @return an array containing the example widgets
+     */
+    Widget [] getExampleWidgets () {
+        return new Widget [0];
+    }
+
+    /**
+     * Gets the "Example" controls.
+     * This is the subset of "Example" widgets that are controls.
+     *
+     * @return an array containing the example controls
+     */
+    Control [] getExampleControls () {
+        Widget [] widgets = getExampleWidgets ();
+        Control [] controls = new Control [0];
+        for (int i = 0; i < widgets.length; i++) {
+            if ( auto ctrl = cast(Control)widgets[i]) {
+                Control[] newControls = new Control[controls.length + 1];
+                System.arraycopy(controls, 0, newControls, 0, controls.length);
+                controls = newControls;
+                controls[controls.length - 1] = ctrl;
+            }
+        }
+        return controls;
+    }
+
+    /**
+     * Gets the "Example" widget children's items, if any.
+     *
+     * @return an array containing the example widget children's items
+     */
+    Item [] getExampleWidgetItems () {
+        return new Item [0];
+    }
+
+    /**
+     * Gets the short text for the tab folder item.
+     *
+     * @return the short text for the tab item
+     */
+    char[] getShortTabText() {
+        return getTabText();
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     *
+     * @return the text for the tab item
+     */
+    char[] getTabText () {
+        return "";
+    }
+
+    /**
+     * Hooks all listeners to all example controls
+     * and example control items.
+     */
+    void hookExampleWidgetListeners () {
+        if (logging) {
+            Widget[] widgets = getExampleWidgets ();
+            for (int i = 0; i < widgets.length; i++) {
+                hookListeners (widgets [i]);
+            }
+            Item[] exampleItems = getExampleWidgetItems ();
+            for (int i = 0; i < exampleItems.length; i++) {
+                hookListeners (exampleItems [i]);
+            }
+            char[] [] customNames = getCustomEventNames ();
+            for (int i = 0; i < customNames.length; i++) {
+                if (eventsFilter [EVENT_NAMES.length + i]) hookCustomListener (customNames[i]);
+            }
+        }
+    }
+
+    /**
+     * Hooks the custom listener specified by eventName.
+     */
+    void hookCustomListener (char[] eventName) {
+    }
+
+    /**
+     * Hooks all listeners to the specified widget.
+     */
+    void hookListeners (Widget widget) {
+        if (logging) {
+            Listener listener = new class() Listener {
+                public void handleEvent (Event event) {
+                    log (event);
+                }
+            };
+            for (int i = 0; i < EVENT_NAMES.length; i++) {
+                if (eventsFilter [i]) widget.addListener ((cast(Integer)EVENT_NAMES[i][1]).intValue(), listener);
+            }
+        }
+    }
+
+    /**
+     * Logs an untyped event to the event console.
+     */
+    void log(Event event) {
+        int i = 0;
+        while (i < EVENT_NAMES.length) {
+            if ((cast(Integer)EVENT_NAMES[i][1]).intValue() is event.type) break;
+            i++;
+        }
+        char[] toString = cast(char[])EVENT_NAMES[i][0] + " ["+event.type+"]: ";
+        switch (event.type) {
+            case DWT.KeyDown:
+            case DWT.KeyUp: toString ~= (new KeyEvent (event)).toString (); break;
+            case DWT.MouseDown:
+            case DWT.MouseUp:
+            case DWT.MouseMove:
+            case DWT.MouseEnter:
+            case DWT.MouseExit:
+            case DWT.MouseDoubleClick:
+            case DWT.MouseWheel:
+            case DWT.MouseHover: toString += (new MouseEvent (event)).toString (); break;
+            case DWT.Paint: toString += (new PaintEvent (event)).toString (); break;
+            case DWT.Move:
+            case DWT.Resize: toString += (new ControlEvent (event)).toString (); break;
+            case DWT.Dispose: toString += (new DisposeEvent (event)).toString (); break;
+            case DWT.Selection:
+            case DWT.DefaultSelection: toString += (new SelectionEvent (event)).toString (); break;
+            case DWT.FocusIn:
+            case DWT.FocusOut: toString += (new FocusEvent (event)).toString (); break;
+            case DWT.Expand:
+            case DWT.Collapse: toString += (new TreeEvent (event)).toString (); break;
+            case DWT.Iconify:
+            case DWT.Deiconify:
+            case DWT.Close:
+            case DWT.Activate:
+            case DWT.Deactivate: toString +=( new ShellEvent (event)).toString (); break;
+            case DWT.Show:
+            case DWT.Hide: toString += ( null !is cast(Menu)event.widget) ? (new MenuEvent (event)).toString () : event.toString(); break;
+            case DWT.Modify: toString += (new ModifyEvent (event)).toString (); break;
+            case DWT.Verify: toString += (new VerifyEvent (event)).toString (); break;
+            case DWT.Help: toString += (new HelpEvent (event)).toString (); break;
+            case DWT.Arm: toString += (new ArmEvent (event)).toString (); break;
+            case DWT.Traverse: toString += (new TraverseEvent (event)).toString (); break;
+            case DWT.HardKeyDown:
+            case DWT.HardKeyUp:
+            case DWT.DragDetect:
+            case DWT.MenuDetect:
+            case DWT.SetData:
+            default: toString += event.toString ();
+        }
+        eventConsole.append (toString);
+        eventConsole.append ("\n");
+    }
+
+    /**
+     * Logs a string to the event console.
+     */
+    void log (char[] string) {
+        eventConsole.append (string);
+        eventConsole.append ("\n");
+    }
+
+    /**
+     * Logs a typed event to the event console.
+     */
+    void log (char[] eventName, TypedEvent event) {
+        eventConsole.append (eventName + ": ");
+        eventConsole.append (event.toString ());
+        eventConsole.append ("\n");
+    }
+
+    /**
+     * Recreates the "Example" widgets.
+     */
+    void recreateExampleWidgets () {
+        disposeExampleWidgets ();
+        createExampleWidgets ();
+        hookExampleWidgetListeners ();
+        setExampleWidgetState ();
+    }
+
+    /**
+     * Sets the foreground color, background color, and font
+     * of the "Example" widgets to their default settings.
+     * Subclasses may extend in order to reset other colors
+     * and fonts to default settings as well.
+     */
+    void resetColorsAndFonts () {
+        Color oldColor = foregroundColor;
+        foregroundColor = null;
+        setExampleWidgetForeground ();
+        if (oldColor !is null) oldColor.dispose();
+        oldColor = backgroundColor;
+        backgroundColor = null;
+        setExampleWidgetBackground ();
+        if (oldColor !is null) oldColor.dispose();
+        Font oldFont = font;
+        font = null;
+        setExampleWidgetFont ();
+        setExampleWidgetSize ();
+        if (oldFont !is null) oldFont.dispose();
+    }
+
+    /**
+     * Sets the background color of the "Example" widgets' parent.
+     */
+    void setExampleGroupBackgroundColor () {
+        if (backgroundModeGroup is null) return;
+        exampleGroup.setBackground (backgroundModeColorButton.getSelection () ? display.getSystemColor(DWT.COLOR_BLUE) : null);
+    }
+    /**
+     * Sets the background image of the "Example" widgets' parent.
+     */
+    void setExampleGroupBackgroundImage () {
+        if (backgroundModeGroup is null) return;
+        exampleGroup.setBackgroundImage (backgroundModeImageButton.getSelection () ? instance.images[ControlExample.ciParentBackground] : null);
+    }
+
+    /**
+     * Sets the background mode of the "Example" widgets' parent.
+     */
+    void setExampleGroupBackgroundMode () {
+        if (backgroundModeGroup is null) return;
+        char[] modeString = backgroundModeCombo.getText ();
+        int mode = DWT.INHERIT_NONE;
+        if (modeString.equals("DWT.INHERIT_DEFAULT")) mode = DWT.INHERIT_DEFAULT;
+        if (modeString.equals("DWT.INHERIT_FORCE")) mode = DWT.INHERIT_FORCE;
+        exampleGroup.setBackgroundMode (mode);
+    }
+
+    /**
+     * Sets the background color of the "Example" widgets.
+     */
+    void setExampleWidgetBackground () {
+        if (colorAndFontTable is null) return; // user cannot change color/font on this tab
+        Control [] controls = getExampleControls ();
+        if (!instance.startup) {
+            for (int i = 0; i < controls.length; i++) {
+                controls[i].setBackground (backgroundColor);
+            }
+        }
+        // Set the background color item's image to match the background color of the example widget(s).
+        Color color = backgroundColor;
+        if (controls.length is 0) return;
+        if (color is null) color = controls [0].getBackground ();
+        TableItem item = colorAndFontTable.getItem(BACKGROUND_COLOR);
+        Image oldImage = item.getImage();
+        if (oldImage !is null) oldImage.dispose();
+        item.setImage (colorImage (color));
+    }
+
+    /**
+     * Sets the enabled state of the "Example" widgets.
+     */
+    void setExampleWidgetEnabled () {
+        Control [] controls = getExampleControls ();
+        for (int i=0; i<controls.length; i++) {
+            controls [i].setEnabled (enabledButton.getSelection ());
+        }
+    }
+
+    /**
+     * Sets the font of the "Example" widgets.
+     */
+    void setExampleWidgetFont () {
+        if (colorAndFontTable is null) return; // user cannot change color/font on this tab
+        Control [] controls = getExampleControls ();
+        if (!instance.startup) {
+            for (int i = 0; i < controls.length; i++) {
+                controls[i].setFont(font);
+            }
+        }
+        /* Set the font item's image and font to match the font of the example widget(s). */
+        Font ft = font;
+        if (controls.length is 0) return;
+        if (ft is null) ft = controls [0].getFont ();
+        TableItem item = colorAndFontTable.getItem(FONT);
+        Image oldImage = item.getImage();
+        if (oldImage !is null) oldImage.dispose();
+        item.setImage (fontImage (ft));
+        item.setFont(ft);
+        colorAndFontTable.layout ();
+    }
+
+    /**
+     * Sets the foreground color of the "Example" widgets.
+     */
+    void setExampleWidgetForeground () {
+        if (colorAndFontTable is null) return; // user cannot change color/font on this tab
+        Control [] controls = getExampleControls ();
+        if (!instance.startup) {
+            for (int i = 0; i < controls.length; i++) {
+                controls[i].setForeground (foregroundColor);
+            }
+        }
+        /* Set the foreground color item's image to match the foreground color of the example widget(s). */
+        Color color = foregroundColor;
+        if (controls.length is 0) return;
+        if (color is null) color = controls [0].getForeground ();
+        TableItem item = colorAndFontTable.getItem(FOREGROUND_COLOR);
+        Image oldImage = item.getImage();
+        if (oldImage !is null) oldImage.dispose();
+        item.setImage (colorImage(color));
+    }
+
+    /**
+     * Sets the size of the "Example" widgets.
+     */
+    void setExampleWidgetSize () {
+        int size = DWT.DEFAULT;
+        if (preferredButton is null) return;
+        if (preferredButton.getSelection()) size = DWT.DEFAULT;
+        if (tooSmallButton.getSelection()) size = TOO_SMALL_SIZE;
+        if (smallButton.getSelection()) size = SMALL_SIZE;
+        if (largeButton.getSelection()) size = LARGE_SIZE;
+        Control [] controls = getExampleControls ();
+        for (int i=0; i<controls.length; i++) {
+            GridData gridData = new GridData(size, size);
+            gridData.grabExcessHorizontalSpace = fillHButton.getSelection();
+            gridData.grabExcessVerticalSpace = fillVButton.getSelection();
+            gridData.horizontalAlignment = fillHButton.getSelection() ? DWT.FILL : DWT.LEFT;
+            gridData.verticalAlignment = fillVButton.getSelection() ? DWT.FILL : DWT.TOP;
+            controls [i].setLayoutData (gridData);
+        }
+        tabFolderPage.layout (controls);
+    }
+
+    /**
+     * Sets the state of the "Example" widgets.  Subclasses
+     * reimplement this method to set "Example" widget state
+     * that is specific to the widget.
+     */
+    void setExampleWidgetState () {
+        setExampleWidgetBackground ();
+        setExampleWidgetForeground ();
+        setExampleWidgetFont ();
+        if (!instance.startup) {
+            setExampleWidgetEnabled ();
+            setExampleWidgetVisibility ();
+            setExampleGroupBackgroundMode ();
+            setExampleGroupBackgroundColor ();
+            setExampleGroupBackgroundImage ();
+            setExampleWidgetBackgroundImage ();
+            setExampleWidgetPopupMenu ();
+            setExampleWidgetSize ();
+        }
+        //TEMPORARY CODE
+//      Control [] controls = getExampleControls ();
+//      for (int i=0; i<controls.length; i++) {
+//          log ("Control=" + controls [i] + ", border width=" + controls [i].getBorderWidth ());
+//      }
+    }
+
+    /**
+     * Sets the visibility of the "Example" widgets.
+     */
+    void setExampleWidgetVisibility () {
+        Control [] controls = getExampleControls ();
+        for (int i=0; i<controls.length; i++) {
+            controls [i].setVisible (visibleButton.getSelection ());
+        }
+    }
+
+    /**
+     * Sets the background image of the "Example" widgets.
+     */
+    void setExampleWidgetBackgroundImage () {
+        Control [] controls = getExampleControls ();
+        for (int i=0; i<controls.length; i++) {
+            controls [i].setBackgroundImage (backgroundImageButton.getSelection () ? instance.images[ControlExample.ciBackground] : null);
+        }
+    }
+
+    /**
+     * Splits the given string around matches of the given character.
+     *
+     * This subset of java.lang.String.split(String regex)
+     * uses only code that can be run on CLDC platforms.
+     */
+    char[] [] split (char[] string, char ch) {
+        char[] [] result = new char[][0];
+        int start = 0;
+        int length = string.length();
+        while (start < length) {
+            int end = string.indexOf(ch, start);
+            if (end is -1) end = length;
+            char[] substr = string.substring(start, end);
+            char[] [] newResult = new char[][result.length + 1];
+            System.arraycopy(result, 0, newResult, 0, result.length);
+            newResult [result.length] = substr;
+            result = newResult;
+            start = end + 1;
+        }
+        return result;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/controlexample/TabFolderTab.d	Mon Jan 21 01:40:01 2008 +0100
@@ -0,0 +1,174 @@
+/*******************************************************************************
+ * 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
+ *******************************************************************************/
+module dwtexamples.controlexample.TabFolderTab;
+
+
+
+import dwt.DWT;
+import dwt.layout.GridData;
+import dwt.layout.GridLayout;
+import dwt.widgets.Button;
+import dwt.widgets.Group;
+import dwt.widgets.Item;
+import dwt.widgets.TabFolder;
+import dwt.widgets.TabItem;
+import dwt.widgets.Text;
+import dwt.widgets.Widget;
+
+class TabFolderTab : Tab {
+    /* Example widgets and groups that contain them */
+    TabFolder tabFolder1;
+    Group tabFolderGroup;
+
+    /* Style widgets added to the "Style" group */
+    Button topButton, bottomButton;
+
+    static String [] TabItems1 = {ControlExample.getResourceString("TabItem1_0"),
+                                  ControlExample.getResourceString("TabItem1_1"),
+                                  ControlExample.getResourceString("TabItem1_2")};
+
+    /**
+     * Creates the Tab within a given instance of ControlExample.
+     */
+    this(ControlExample instance) {
+        super(instance);
+    }
+
+    /**
+     * Creates the "Example" group.
+     */
+    void createExampleGroup () {
+        super.createExampleGroup ();
+
+        /* Create a group for the TabFolder */
+        tabFolderGroup = new Group (exampleGroup, DWT.NONE);
+        tabFolderGroup.setLayout (new GridLayout ());
+        tabFolderGroup.setLayoutData (new GridData (DWT.FILL, DWT.FILL, true, true));
+        tabFolderGroup.setText ("TabFolder");
+    }
+
+    /**
+     * Creates the "Example" widgets.
+     */
+    void createExampleWidgets () {
+
+        /* Compute the widget style */
+        int style = getDefaultStyle();
+        if (topButton.getSelection ()) style |= DWT.TOP;
+        if (bottomButton.getSelection ()) style |= DWT.BOTTOM;
+        if (borderButton.getSelection ()) style |= DWT.BORDER;
+
+        /* Create the example widgets */
+        tabFolder1 = new TabFolder (tabFolderGroup, style);
+        for (int i = 0; i < TabItems1.length; i++) {
+            TabItem item = new TabItem(tabFolder1, DWT.NONE);
+            item.setText(TabItems1[i]);
+            item.setToolTipText(ControlExample.getResourceString("Tooltip", new String [] {TabItems1[i]}));
+            Text content = new Text(tabFolder1, DWT.WRAP | DWT.MULTI);
+            content.setText(ControlExample.getResourceString("TabItem_content") + ": " + i);
+            item.setControl(content);
+        }
+    }
+
+    /**
+     * Creates the "Style" group.
+     */
+    void createStyleGroup() {
+        super.createStyleGroup ();
+
+        /* Create the extra widgets */
+        topButton = new Button (styleGroup, DWT.RADIO);
+        topButton.setText ("DWT.TOP");
+        topButton.setSelection(true);
+        bottomButton = new Button (styleGroup, DWT.RADIO);
+        bottomButton.setText ("DWT.BOTTOM");
+        borderButton = new Button (styleGroup, DWT.CHECK);
+        borderButton.setText ("DWT.BORDER");
+    }
+
+    /**
+     * Gets the "Example" widget children's items, if any.
+     *
+     * @return an array containing the example widget children's items
+     */
+    Item [] getExampleWidgetItems () {
+        return tabFolder1.getItems();
+    }
+
+    /**
+     * Gets the "Example" widget children.
+     */
+    Widget [] getExampleWidgets () {
+        return new Widget [] {tabFolder1};
+    }
+
+    /**
+     * Returns a list of set/get API method names (without the set/get prefix)
+     * that can be used to set/get values in the example control(s).
+     */
+    String[] getMethodNames() {
+        return new String[] {"Selection", "SelectionIndex"};
+    }
+
+    String setMethodName(String methodRoot) {
+        /* Override to handle special case of int getSelectionIndex()/setSelection(int) */
+        return (methodRoot.equals("SelectionIndex")) ? "setSelection" : "set" + methodRoot;
+    }
+
+    Object[] parameterForType(String typeName, String value, Widget widget) {
+        if (value.equals("")) return new Object[] {new TabItem[0]};
+        if (typeName.equals("org.eclipse.swt.widgets.TabItem")) {
+            TabItem item = findItem(value, ((TabFolder) widget).getItems());
+            if (item !is null) return new Object[] {item};
+        }
+        if (typeName.equals("[Lorg.eclipse.swt.widgets.TabItem;")) {
+            String[] values = split(value, ',');
+            TabItem[] items = new TabItem[values.length];
+            for (int i = 0; i < values.length; i++) {
+                items[i] = findItem(values[i], ((TabFolder) widget).getItems());
+            }
+            return new Object[] {items};
+        }
+        return super.parameterForType(typeName, value, widget);
+    }
+
+    TabItem findItem(String value, TabItem[] items) {
+        for (int i = 0; i < items.length; i++) {
+            TabItem item = items[i];
+            if (item.getText().equals(value)) return item;
+        }
+        return null;
+    }
+
+    /**
+     * Gets the short text for the tab folder item.
+     */
+    public String getShortTabText() {
+        return "TF";
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    String getTabText () {
+        return "TabFolder";
+    }
+
+    /**
+     * Sets the state of the "Example" widgets.
+     */
+    void setExampleWidgetState () {
+        super.setExampleWidgetState ();
+        topButton.setSelection ((tabFolder1.getStyle () & DWT.TOP) !is 0);
+        bottomButton.setSelection ((tabFolder1.getStyle () & DWT.BOTTOM) !is 0);
+        borderButton.setSelection ((tabFolder1.getStyle () & DWT.BORDER) !is 0);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/controlexample/TableTab.d	Mon Jan 21 01:40:01 2008 +0100
@@ -0,0 +1,701 @@
+/*******************************************************************************
+ * 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
+ *******************************************************************************/
+module dwtexamples.controlexample.TableTab;
+
+
+
+import dwt.DWT;
+import dwt.events.DisposeEvent;
+import dwt.events.DisposeListener;
+import dwt.events.SelectionAdapter;
+import dwt.events.SelectionEvent;
+import dwt.events.SelectionListener;
+import dwt.graphics.Color;
+import dwt.graphics.Font;
+import dwt.graphics.FontData;
+import dwt.graphics.Image;
+import dwt.graphics.Point;
+import dwt.graphics.RGB;
+import dwt.layout.GridData;
+import dwt.layout.GridLayout;
+import dwt.widgets.Button;
+import dwt.widgets.Event;
+import dwt.widgets.Group;
+import dwt.widgets.Item;
+import dwt.widgets.Menu;
+import dwt.widgets.MenuItem;
+import dwt.widgets.Table;
+import dwt.widgets.TableColumn;
+import dwt.widgets.TableItem;
+import dwt.widgets.Widget;
+
+class TableTab : ScrollableTab {
+    /* Example widgets and groups that contain them */
+    Table table1;
+    Group tableGroup;
+
+    /* Size widgets added to the "Size" group */
+    Button packColumnsButton;
+
+    /* Style widgets added to the "Style" group */
+    Button checkButton, fullSelectionButton, hideSelectionButton;
+
+    /* Other widgets added to the "Other" group */
+    Button multipleColumns, moveableColumns, resizableColumns, headerVisibleButton, sortIndicatorButton, headerImagesButton, linesVisibleButton, subImagesButton;
+
+    /* Controls and resources added to the "Colors and Fonts" group */
+    static final int ITEM_FOREGROUND_COLOR = 3;
+    static final int ITEM_BACKGROUND_COLOR = 4;
+    static final int ITEM_FONT = 5;
+    static final int CELL_FOREGROUND_COLOR = 6;
+    static final int CELL_BACKGROUND_COLOR = 7;
+    static final int CELL_FONT = 8;
+    Color itemForegroundColor, itemBackgroundColor, cellForegroundColor, cellBackgroundColor;
+    Font itemFont, cellFont;
+
+    static String [] columnTitles   = {ControlExample.getResourceString("TableTitle_0"),
+                                       ControlExample.getResourceString("TableTitle_1"),
+                                       ControlExample.getResourceString("TableTitle_2"),
+                                       ControlExample.getResourceString("TableTitle_3")};
+
+    static String[][] tableData = {
+        { ControlExample.getResourceString("TableLine0_0"),
+                ControlExample.getResourceString("TableLine0_1"),
+                ControlExample.getResourceString("TableLine0_2"),
+                ControlExample.getResourceString("TableLine0_3") },
+        { ControlExample.getResourceString("TableLine1_0"),
+                ControlExample.getResourceString("TableLine1_1"),
+                ControlExample.getResourceString("TableLine1_2"),
+                ControlExample.getResourceString("TableLine1_3") },
+        { ControlExample.getResourceString("TableLine2_0"),
+                ControlExample.getResourceString("TableLine2_1"),
+                ControlExample.getResourceString("TableLine2_2"),
+                ControlExample.getResourceString("TableLine2_3") } };
+
+    Point menuMouseCoords;
+
+    /**
+     * Creates the Tab within a given instance of ControlExample.
+     */
+    this(ControlExample instance) {
+        super(instance);
+    }
+
+    /**
+     * Creates the "Colors and Fonts" group.
+     */
+    void createColorAndFontGroup () {
+        super.createColorAndFontGroup();
+
+        TableItem item = new TableItem(colorAndFontTable, DWT.None);
+        item.setText(ControlExample.getResourceString ("Item_Foreground_Color"));
+        item = new TableItem(colorAndFontTable, DWT.None);
+        item.setText(ControlExample.getResourceString ("Item_Background_Color"));
+        item = new TableItem(colorAndFontTable, DWT.None);
+        item.setText(ControlExample.getResourceString ("Item_Font"));
+        item = new TableItem(colorAndFontTable, DWT.None);
+        item.setText(ControlExample.getResourceString ("Cell_Foreground_Color"));
+        item = new TableItem(colorAndFontTable, DWT.None);
+        item.setText(ControlExample.getResourceString ("Cell_Background_Color"));
+        item = new TableItem(colorAndFontTable, DWT.None);
+        item.setText(ControlExample.getResourceString ("Cell_Font"));
+
+        shell.addDisposeListener(new DisposeListener() {
+            public void widgetDisposed(DisposeEvent event) {
+                if (itemBackgroundColor !is null) itemBackgroundColor.dispose();
+                if (itemForegroundColor !is null) itemForegroundColor.dispose();
+                if (itemFont !is null) itemFont.dispose();
+                if (cellBackgroundColor !is null) cellBackgroundColor.dispose();
+                if (cellForegroundColor !is null) cellForegroundColor.dispose();
+                if (cellFont !is null) cellFont.dispose();
+                itemBackgroundColor = null;
+                itemForegroundColor = null;
+                itemFont = null;
+                cellBackgroundColor = null;
+                cellForegroundColor = null;
+                cellFont = null;
+            }
+        });
+    }
+
+    void changeFontOrColor(int index) {
+        switch (index) {
+        case ITEM_FOREGROUND_COLOR: {
+            Color oldColor = itemForegroundColor;
+            if (oldColor is null) oldColor = table1.getItem (0).getForeground ();
+            colorDialog.setRGB(oldColor.getRGB());
+            RGB rgb = colorDialog.open();
+            if (rgb is null) return;
+            oldColor = itemForegroundColor;
+            itemForegroundColor = new Color (display, rgb);
+            setItemForeground ();
+            if (oldColor !is null) oldColor.dispose ();
+        }
+        break;
+        case ITEM_BACKGROUND_COLOR: {
+            Color oldColor = itemBackgroundColor;
+            if (oldColor is null) oldColor = table1.getItem (0).getBackground ();
+            colorDialog.setRGB(oldColor.getRGB());
+            RGB rgb = colorDialog.open();
+            if (rgb is null) return;
+            oldColor = itemBackgroundColor;
+            itemBackgroundColor = new Color (display, rgb);
+            setItemBackground ();
+            if (oldColor !is null) oldColor.dispose ();
+        }
+        break;
+        case ITEM_FONT: {
+            Font oldFont = itemFont;
+            if (oldFont is null) oldFont = table1.getItem (0).getFont ();
+            fontDialog.setFontList(oldFont.getFontData());
+            FontData fontData = fontDialog.open ();
+            if (fontData is null) return;
+            oldFont = itemFont;
+            itemFont = new Font (display, fontData);
+            setItemFont ();
+            setExampleWidgetSize ();
+            if (oldFont !is null) oldFont.dispose ();
+        }
+        break;
+        case CELL_FOREGROUND_COLOR: {
+            Color oldColor = cellForegroundColor;
+            if (oldColor is null) oldColor = table1.getItem (0).getForeground (1);
+            colorDialog.setRGB(oldColor.getRGB());
+            RGB rgb = colorDialog.open();
+            if (rgb is null) return;
+            oldColor = cellForegroundColor;
+            cellForegroundColor = new Color (display, rgb);
+            setCellForeground ();
+            if (oldColor !is null) oldColor.dispose ();
+        }
+        break;
+        case CELL_BACKGROUND_COLOR: {
+            Color oldColor = cellBackgroundColor;
+            if (oldColor is null) oldColor = table1.getItem (0).getBackground (1);
+            colorDialog.setRGB(oldColor.getRGB());
+            RGB rgb = colorDialog.open();
+            if (rgb is null) return;
+            oldColor = cellBackgroundColor;
+            cellBackgroundColor = new Color (display, rgb);
+            setCellBackground ();
+            if (oldColor !is null) oldColor.dispose ();
+        }
+        break;
+        case CELL_FONT: {
+            Font oldFont = cellFont;
+            if (oldFont is null) oldFont = table1.getItem (0).getFont (1);
+            fontDialog.setFontList(oldFont.getFontData());
+            FontData fontData = fontDialog.open ();
+            if (fontData is null) return;
+            oldFont = cellFont;
+            cellFont = new Font (display, fontData);
+            setCellFont ();
+            setExampleWidgetSize ();
+            if (oldFont !is null) oldFont.dispose ();
+        }
+        break;
+        default:
+            super.changeFontOrColor(index);
+    }
+    }
+
+    /**
+     * Creates the "Other" group.
+     */
+    void createOtherGroup () {
+        super.createOtherGroup ();
+
+        /* Create display controls specific to this example */
+        linesVisibleButton = new Button (otherGroup, DWT.CHECK);
+        linesVisibleButton.setText (ControlExample.getResourceString("Lines_Visible"));
+        multipleColumns = new Button (otherGroup, DWT.CHECK);
+        multipleColumns.setText (ControlExample.getResourceString("Multiple_Columns"));
+        multipleColumns.setSelection(true);
+        headerVisibleButton = new Button (otherGroup, DWT.CHECK);
+        headerVisibleButton.setText (ControlExample.getResourceString("Header_Visible"));
+        sortIndicatorButton = new Button (otherGroup, DWT.CHECK);
+        sortIndicatorButton.setText (ControlExample.getResourceString("Sort_Indicator"));
+        moveableColumns = new Button (otherGroup, DWT.CHECK);
+        moveableColumns.setText (ControlExample.getResourceString("Moveable_Columns"));
+        resizableColumns = new Button (otherGroup, DWT.CHECK);
+        resizableColumns.setText (ControlExample.getResourceString("Resizable_Columns"));
+        headerImagesButton = new Button (otherGroup, DWT.CHECK);
+        headerImagesButton.setText (ControlExample.getResourceString("Header_Images"));
+        subImagesButton = new Button (otherGroup, DWT.CHECK);
+        subImagesButton.setText (ControlExample.getResourceString("Sub_Images"));
+
+        /* Add the listeners */
+        linesVisibleButton.addSelectionListener (new SelectionAdapter () {
+            public void widgetSelected (SelectionEvent event) {
+                setWidgetLinesVisible ();
+            }
+        });
+        multipleColumns.addSelectionListener (new SelectionAdapter () {
+            public void widgetSelected (SelectionEvent event) {
+                recreateExampleWidgets ();
+            }
+        });
+        headerVisibleButton.addSelectionListener (new SelectionAdapter () {
+            public void widgetSelected (SelectionEvent event) {
+                setWidgetHeaderVisible ();
+            }
+        });
+        sortIndicatorButton.addSelectionListener (new SelectionAdapter () {
+            public void widgetSelected (SelectionEvent event) {
+                setWidgetSortIndicator ();
+            }
+        });
+        moveableColumns.addSelectionListener (new SelectionAdapter () {
+            public void widgetSelected (SelectionEvent event) {
+                setColumnsMoveable ();
+            }
+        });
+        resizableColumns.addSelectionListener (new SelectionAdapter () {
+            public void widgetSelected (SelectionEvent event) {
+                setColumnsResizable ();
+            }
+        });
+        headerImagesButton.addSelectionListener (new SelectionAdapter () {
+            public void widgetSelected (SelectionEvent event) {
+                recreateExampleWidgets ();
+            }
+        });
+        subImagesButton.addSelectionListener (new SelectionAdapter () {
+            public void widgetSelected (SelectionEvent event) {
+                recreateExampleWidgets ();
+            }
+        });
+    }
+
+    /**
+     * Creates the "Example" group.
+     */
+    void createExampleGroup () {
+        super.createExampleGroup ();
+
+        /* Create a group for the table */
+        tableGroup = new Group (exampleGroup, DWT.NONE);
+        tableGroup.setLayout (new GridLayout ());
+        tableGroup.setLayoutData (new GridData (DWT.FILL, DWT.FILL, true, true));
+        tableGroup.setText ("Table");
+    }
+
+    /**
+     * Creates the "Example" widgets.
+     */
+    void createExampleWidgets () {
+        /* Compute the widget style */
+        int style = getDefaultStyle();
+        if (singleButton.getSelection ()) style |= DWT.SINGLE;
+        if (multiButton.getSelection ()) style |= DWT.MULTI;
+        if (verticalButton.getSelection ()) style |= DWT.V_SCROLL;
+        if (horizontalButton.getSelection ()) style |= DWT.H_SCROLL;
+        if (checkButton.getSelection ()) style |= DWT.CHECK;
+        if (fullSelectionButton.getSelection ()) style |= DWT.FULL_SELECTION;
+        if (hideSelectionButton.getSelection ()) style |= DWT.HIDE_SELECTION;
+        if (borderButton.getSelection ()) style |= DWT.BORDER;
+
+        /* Create the table widget */
+        table1 = new Table (tableGroup, style);
+
+        /* Fill the table with data */
+        bool multiColumn = multipleColumns.getSelection();
+        if (multiColumn) {
+            for (int i = 0; i < columnTitles.length; i++) {
+                TableColumn tableColumn = new TableColumn(table1, DWT.NONE);
+                tableColumn.setText(columnTitles[i]);
+                tableColumn.setToolTipText(ControlExample.getResourceString("Tooltip", new String [] {columnTitles[i]}));
+                if (headerImagesButton.getSelection()) tableColumn.setImage(instance.images [i % 3]);
+            }
+            table1.setSortColumn(table1.getColumn(0));
+        }
+        for (int i=0; i<16; i++) {
+            TableItem item = new TableItem (table1, DWT.NONE);
+            if (multiColumn && subImagesButton.getSelection()) {
+                for (int j = 0; j < columnTitles.length; j++) {
+                    item.setImage(j, instance.images [i % 3]);
+                }
+            } else {
+                item.setImage(instance.images [i % 3]);
+            }
+            setItemText (item, i, ControlExample.getResourceString("Index") + i);
+        }
+        packColumns();
+    }
+
+    void setItemText(TableItem item, int i, String node) {
+        int index = i % 3;
+        if (multipleColumns.getSelection()) {
+            tableData [index][0] = node;
+            item.setText (tableData [index]);
+        } else {
+            item.setText (node);
+        }
+    }
+
+    /**
+     * Creates the "Size" group.  The "Size" group contains
+     * controls that allow the user to change the size of
+     * the example widgets.
+     */
+    void createSizeGroup () {
+        super.createSizeGroup();
+
+        packColumnsButton = new Button (sizeGroup, DWT.PUSH);
+        packColumnsButton.setText (ControlExample.getResourceString("Pack_Columns"));
+        packColumnsButton.addSelectionListener(new SelectionAdapter () {
+            public void widgetSelected (SelectionEvent event) {
+                packColumns ();
+                setExampleWidgetSize ();
+            }
+        });
+    }
+
+    /**
+     * Creates the "Style" group.
+     */
+    void createStyleGroup () {
+        super.createStyleGroup ();
+
+        /* Create the extra widgets */
+        checkButton = new Button (styleGroup, DWT.CHECK);
+        checkButton.setText ("DWT.CHECK");
+        fullSelectionButton = new Button (styleGroup, DWT.CHECK);
+        fullSelectionButton.setText ("DWT.FULL_SELECTION");
+        hideSelectionButton = new Button (styleGroup, DWT.CHECK);
+        hideSelectionButton.setText ("DWT.HIDE_SELECTION");
+    }
+
+    /**
+     * Gets the "Example" widget children's items, if any.
+     *
+     * @return an array containing the example widget children's items
+     */
+    Item [] getExampleWidgetItems () {
+        Item [] columns = table1.getColumns();
+        Item [] items = table1.getItems();
+        Item [] allItems = new Item [columns.length + items.length];
+        System.arraycopy(columns, 0, allItems, 0, columns.length);
+        System.arraycopy(items, 0, allItems, columns.length, items.length);
+        return allItems;
+    }
+
+    /**
+     * Gets the "Example" widget children.
+     */
+    Widget [] getExampleWidgets () {
+        return new Widget [] {table1};
+    }
+
+    /**
+     * Returns a list of set/get API method names (without the set/get prefix)
+     * that can be used to set/get values in the example control(s).
+     */
+    String[] getMethodNames() {
+        return new String[] {"ColumnOrder", "ItemCount", "Selection", "SelectionIndex", "ToolTipText", "TopIndex"};
+    }
+
+    String setMethodName(String methodRoot) {
+        /* Override to handle special case of int getSelectionIndex()/setSelection(int) */
+        return (methodRoot.equals("SelectionIndex")) ? "setSelection" : "set" + methodRoot;
+    }
+
+    void packColumns () {
+        int columnCount = table1.getColumnCount();
+        for (int i = 0; i < columnCount; i++) {
+            TableColumn tableColumn = table1.getColumn(i);
+            tableColumn.pack();
+        }
+    }
+
+    Object[] parameterForType(String typeName, String value, Widget widget) {
+        if (value.equals("")) return new Object[] {new TableItem[0]}; // bug in Table?
+        if (typeName.equals("org.eclipse.swt.widgets.TableItem")) {
+            TableItem item = findItem(value, ((Table) widget).getItems());
+            if (item !is null) return new Object[] {item};
+        }
+        if (typeName.equals("[Lorg.eclipse.swt.widgets.TableItem;")) {
+            String[] values = split(value, ',');
+            TableItem[] items = new TableItem[values.length];
+            for (int i = 0; i < values.length; i++) {
+                items[i] = findItem(values[i], ((Table) widget).getItems());
+            }
+            return new Object[] {items};
+        }
+        return super.parameterForType(typeName, value, widget);
+    }
+
+    TableItem findItem(String value, TableItem[] items) {
+        for (int i = 0; i < items.length; i++) {
+            TableItem item = items[i];
+            if (item.getText().equals(value)) return item;
+        }
+        return null;
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    String getTabText () {
+        return "Table";
+    }
+
+    /**
+     * Sets the foreground color, background color, and font
+     * of the "Example" widgets to their default settings.
+     * Also sets foreground and background color of TableItem [0]
+     * to default settings.
+     */
+    void resetColorsAndFonts () {
+        super.resetColorsAndFonts ();
+        Color oldColor = itemForegroundColor;
+        itemForegroundColor = null;
+        setItemForeground ();
+        if (oldColor !is null) oldColor.dispose();
+        oldColor = itemBackgroundColor;
+        itemBackgroundColor = null;
+        setItemBackground ();
+        if (oldColor !is null) oldColor.dispose();
+        Font oldFont = font;
+        itemFont = null;
+        setItemFont ();
+        if (oldFont !is null) oldFont.dispose();
+        oldColor = cellForegroundColor;
+        cellForegroundColor = null;
+        setCellForeground ();
+        if (oldColor !is null) oldColor.dispose();
+        oldColor = cellBackgroundColor;
+        cellBackgroundColor = null;
+        setCellBackground ();
+        if (oldColor !is null) oldColor.dispose();
+        oldFont = font;
+        cellFont = null;
+        setCellFont ();
+        if (oldFont !is null) oldFont.dispose();
+    }
+
+    /**
+     * Sets the background color of the Row 0 TableItem in column 1.
+     */
+    void setCellBackground () {
+        if (!instance.startup) {
+            table1.getItem (0).setBackground (1, cellBackgroundColor);
+        }
+        /* Set the background color item's image to match the background color of the cell. */
+        Color color = cellBackgroundColor;
+        if (color is null) color = table1.getItem (0).getBackground (1);
+        TableItem item = colorAndFontTable.getItem(CELL_BACKGROUND_COLOR);
+        Image oldImage = item.getImage();
+        if (oldImage !is null) oldImage.dispose();
+        item.setImage (colorImage(color));
+    }
+
+    /**
+     * Sets the foreground color of the Row 0 TableItem in column 1.
+     */
+    void setCellForeground () {
+        if (!instance.startup) {
+            table1.getItem (0).setForeground (1, cellForegroundColor);
+        }
+        /* Set the foreground color item's image to match the foreground color of the cell. */
+        Color color = cellForegroundColor;
+        if (color is null) color = table1.getItem (0).getForeground (1);
+        TableItem item = colorAndFontTable.getItem(CELL_FOREGROUND_COLOR);
+        Image oldImage = item.getImage();
+        if (oldImage !is null) oldImage.dispose();
+        item.setImage (colorImage(color));
+    }
+
+    /**
+     * Sets the font of the Row 0 TableItem in column 1.
+     */
+    void setCellFont () {
+        if (!instance.startup) {
+            table1.getItem (0).setFont (1, cellFont);
+        }
+        /* Set the font item's image to match the font of the item. */
+        Font ft = cellFont;
+        if (ft is null) ft = table1.getItem (0).getFont (1);
+        TableItem item = colorAndFontTable.getItem(CELL_FONT);
+        Image oldImage = item.getImage();
+        if (oldImage !is null) oldImage.dispose();
+        item.setImage (fontImage(ft));
+        item.setFont(ft);
+        colorAndFontTable.layout ();
+    }
+
+    /**
+     * Sets the background color of TableItem [0].
+     */
+    void setItemBackground () {
+        if (!instance.startup) {
+            table1.getItem (0).setBackground (itemBackgroundColor);
+        }
+        /* Set the background color item's image to match the background color of the item. */
+        Color color = itemBackgroundColor;
+        if (color is null) color = table1.getItem (0).getBackground ();
+        TableItem item = colorAndFontTable.getItem(ITEM_BACKGROUND_COLOR);
+        Image oldImage = item.getImage();
+        if (oldImage !is null) oldImage.dispose();
+        item.setImage (colorImage(color));
+    }
+
+    /**
+     * Sets the foreground color of TableItem [0].
+     */
+    void setItemForeground () {
+        if (!instance.startup) {
+            table1.getItem (0).setForeground (itemForegroundColor);
+        }
+        /* Set the foreground color item's image to match the foreground color of the item. */
+        Color color = itemForegroundColor;
+        if (color is null) color = table1.getItem (0).getForeground ();
+        TableItem item = colorAndFontTable.getItem(ITEM_FOREGROUND_COLOR);
+        Image oldImage = item.getImage();
+        if (oldImage !is null) oldImage.dispose();
+        item.setImage (colorImage(color));
+    }
+
+    /**
+     * Sets the font of TableItem 0.
+     */
+    void setItemFont () {
+        if (!instance.startup) {
+            table1.getItem (0).setFont (itemFont);
+        }
+        /* Set the font item's image to match the font of the item. */
+        Font ft = itemFont;
+        if (ft is null) ft = table1.getItem (0).getFont ();
+        TableItem item = colorAndFontTable.getItem(ITEM_FONT);
+        Image oldImage = item.getImage();
+        if (oldImage !is null) oldImage.dispose();
+        item.setImage (fontImage(ft));
+        item.setFont(ft);
+        colorAndFontTable.layout ();
+    }
+
+    /**
+     * Sets the moveable columns state of the "Example" widgets.
+     */
+    void setColumnsMoveable () {
+        bool selection = moveableColumns.getSelection();
+        TableColumn[] columns = table1.getColumns();
+        for (int i = 0; i < columns.length; i++) {
+            columns[i].setMoveable(selection);
+        }
+    }
+
+    /**
+     * Sets the resizable columns state of the "Example" widgets.
+     */
+    void setColumnsResizable () {
+        bool selection = resizableColumns.getSelection();
+        TableColumn[] columns = table1.getColumns();
+        for (int i = 0; i < columns.length; i++) {
+            columns[i].setResizable(selection);
+        }
+    }
+
+    /**
+     * Sets the state of the "Example" widgets.
+     */
+    void setExampleWidgetState () {
+        setItemBackground ();
+        setItemForeground ();
+        setItemFont ();
+        setCellBackground ();
+        setCellForeground ();
+        setCellFont ();
+        if (!instance.startup) {
+            setColumnsMoveable ();
+            setColumnsResizable ();
+            setWidgetHeaderVisible ();
+            setWidgetSortIndicator ();
+            setWidgetLinesVisible ();
+        }
+        super.setExampleWidgetState ();
+        checkButton.setSelection ((table1.getStyle () & DWT.CHECK) !is 0);
+        fullSelectionButton.setSelection ((table1.getStyle () & DWT.FULL_SELECTION) !is 0);
+        hideSelectionButton.setSelection ((table1.getStyle () & DWT.HIDE_SELECTION) !is 0);
+        try {
+            TableColumn column = table1.getColumn(0);
+            moveableColumns.setSelection (column.getMoveable());
+            resizableColumns.setSelection (column.getResizable());
+        } catch (IllegalArgumentException ex) {}
+        headerVisibleButton.setSelection (table1.getHeaderVisible());
+        linesVisibleButton.setSelection (table1.getLinesVisible());
+    }
+
+    /**
+     * Sets the header visible state of the "Example" widgets.
+     */
+    void setWidgetHeaderVisible () {
+        table1.setHeaderVisible (headerVisibleButton.getSelection ());
+    }
+
+    /**
+     * Sets the sort indicator state of the "Example" widgets.
+     */
+    void setWidgetSortIndicator () {
+        if (sortIndicatorButton.getSelection ()) {
+            /* Reset to known state: 'down' on column 0. */
+            table1.setSortDirection (DWT.DOWN);
+            TableColumn [] columns = table1.getColumns();
+            for (int i = 0; i < columns.length; i++) {
+                TableColumn column = columns[i];
+                if (i is 0) table1.setSortColumn(column);
+                SelectionListener listener = new SelectionAdapter() {
+                    public void widgetSelected(SelectionEvent e) {
+                        int sortDirection = DWT.DOWN;
+                        if (e.widget is table1.getSortColumn()) {
+                            /* If the sort column hasn't changed, cycle down -> up -> none. */
+                            switch (table1.getSortDirection ()) {
+                            case DWT.DOWN: sortDirection = DWT.UP; break;
+                            case DWT.UP: sortDirection = DWT.NONE; break;
+                            }
+                        } else {
+                            table1.setSortColumn((TableColumn)e.widget);
+                        }
+                        table1.setSortDirection (sortDirection);
+                    }
+                };
+                column.addSelectionListener(listener);
+                column.setData("SortListener", listener);   //$NON-NLS-1$
+            }
+        } else {
+            table1.setSortDirection (DWT.NONE);
+            TableColumn [] columns = table1.getColumns();
+            for (int i = 0; i < columns.length; i++) {
+                SelectionListener listener = (SelectionListener)columns[i].getData("SortListener"); //$NON-NLS-1$
+                if (listener !is null) columns[i].removeSelectionListener(listener);
+            }
+        }
+    }
+
+    /**
+     * Sets the lines visible state of the "Example" widgets.
+     */
+    void setWidgetLinesVisible () {
+        table1.setLinesVisible (linesVisibleButton.getSelection ());
+    }
+
+    protected void specialPopupMenuItems(Menu menu, Event event) {
+        MenuItem item = new MenuItem(menu, DWT.PUSH);
+        item.setText("getItem(Point) on mouse coordinates");
+        menuMouseCoords = table1.toControl(new Point(event.x, event.y));
+        item.addSelectionListener(new SelectionAdapter() {
+            public void widgetSelected(SelectionEvent e) {
+                eventConsole.append ("getItem(Point(" + menuMouseCoords + ")) returned: " + table1.getItem(menuMouseCoords));
+                eventConsole.append ("\n");
+            };
+        });
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/controlexample/TextTab.d	Mon Jan 21 01:40:01 2008 +0100
@@ -0,0 +1,189 @@
+/*******************************************************************************
+ * 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
+ *******************************************************************************/
+module dwtexamples.controlexample.TextTab;
+
+
+
+import dwt.DWT;
+import dwt.events.ControlAdapter;
+import dwt.events.ControlEvent;
+import dwt.layout.GridData;
+import dwt.layout.GridLayout;
+import dwt.widgets.Button;
+import dwt.widgets.Composite;
+import dwt.widgets.Group;
+import dwt.widgets.TabFolder;
+import dwt.widgets.Text;
+import dwt.widgets.Widget;
+
+class TextTab : ScrollableTab {
+    /* Example widgets and groups that contain them */
+    Text text;
+    Group textGroup;
+
+    /* Style widgets added to the "Style" group */
+    Button wrapButton, readOnlyButton, passwordButton, searchButton, cancelButton;
+    Button leftButton, centerButton, rightButton;
+
+    /**
+     * Creates the Tab within a given instance of ControlExample.
+     */
+    this(ControlExample instance) {
+        super(instance);
+    }
+
+    /**
+     * Creates the "Example" group.
+     */
+    void createExampleGroup () {
+        super.createExampleGroup ();
+
+        /* Create a group for the text widget */
+        textGroup = new Group (exampleGroup, DWT.NONE);
+        textGroup.setLayout (new GridLayout ());
+        textGroup.setLayoutData (new GridData (DWT.FILL, DWT.FILL, true, true));
+        textGroup.setText ("Text");
+    }
+
+    /**
+     * Creates the "Example" widgets.
+     */
+    void createExampleWidgets () {
+
+        /* Compute the widget style */
+        int style = getDefaultStyle();
+        if (singleButton.getSelection ()) style |= DWT.SINGLE;
+        if (multiButton.getSelection ()) style |= DWT.MULTI;
+        if (horizontalButton.getSelection ()) style |= DWT.H_SCROLL;
+        if (verticalButton.getSelection ()) style |= DWT.V_SCROLL;
+        if (wrapButton.getSelection ()) style |= DWT.WRAP;
+        if (readOnlyButton.getSelection ()) style |= DWT.READ_ONLY;
+        if (passwordButton.getSelection ()) style |= DWT.PASSWORD;
+        if (searchButton.getSelection ()) style |= DWT.SEARCH;
+        if (cancelButton.getSelection ()) style |= DWT.CANCEL;
+        if (borderButton.getSelection ()) style |= DWT.BORDER;
+        if (leftButton.getSelection ()) style |= DWT.LEFT;
+        if (centerButton.getSelection ()) style |= DWT.CENTER;
+        if (rightButton.getSelection ()) style |= DWT.RIGHT;
+
+        /* Create the example widgets */
+        text = new Text (textGroup, style);
+        text.setText (ControlExample.getResourceString("Example_string") + Text.DELIMITER + ControlExample.getResourceString("One_Two_Three"));
+    }
+
+    /**
+     * Creates the "Style" group.
+     */
+    void createStyleGroup() {
+        super.createStyleGroup();
+
+        /* Create the extra widgets */
+        wrapButton = new Button (styleGroup, DWT.CHECK);
+        wrapButton.setText ("DWT.WRAP");
+        readOnlyButton = new Button (styleGroup, DWT.CHECK);
+        readOnlyButton.setText ("DWT.READ_ONLY");
+        passwordButton = new Button (styleGroup, DWT.CHECK);
+        passwordButton.setText ("DWT.PASSWORD");
+        searchButton = new Button (styleGroup, DWT.CHECK);
+        searchButton.setText ("DWT.SEARCH");
+        cancelButton = new Button (styleGroup, DWT.CHECK);
+        cancelButton.setText ("DWT.CANCEL");
+
+        Composite alignmentGroup = new Composite (styleGroup, DWT.NONE);
+        GridLayout layout = new GridLayout ();
+        layout.marginWidth = layout.marginHeight = 0;
+        alignmentGroup.setLayout (layout);
+        alignmentGroup.setLayoutData (new GridData (GridData.FILL_BOTH));
+        leftButton = new Button (alignmentGroup, DWT.RADIO);
+        leftButton.setText ("DWT.LEFT");
+        centerButton = new Button (alignmentGroup, DWT.RADIO);
+        centerButton.setText ("DWT.CENTER");
+        rightButton = new Button (alignmentGroup, DWT.RADIO);
+        rightButton.setText ("DWT.RIGHT");
+    }
+
+    /**
+     * Creates the tab folder page.
+     *
+     * @param tabFolder org.eclipse.swt.widgets.TabFolder
+     * @return the new page for the tab folder
+     */
+    Composite createTabFolderPage (TabFolder tabFolder) {
+        super.createTabFolderPage (tabFolder);
+
+        /*
+         * Add a resize listener to the tabFolderPage so that
+         * if the user types into the example widget to change
+         * its preferred size, and then resizes the shell, we
+         * recalculate the preferred size correctly.
+         */
+        tabFolderPage.addControlListener(new ControlAdapter() {
+            public void controlResized(ControlEvent e) {
+                setExampleWidgetSize ();
+            }
+        });
+
+        return tabFolderPage;
+    }
+
+    /**
+     * Gets the "Example" widget children.
+     */
+    Widget [] getExampleWidgets () {
+        return new Widget [] {text};
+    }
+
+    /**
+     * Returns a list of set/get API method names (without the set/get prefix)
+     * that can be used to set/get values in the example control(s).
+     */
+    String[] getMethodNames() {
+        return new String[] {"DoubleClickEnabled", "EchoChar", "Editable", "Orientation", "Selection", "Tabs", "Text", "TextLimit", "ToolTipText", "TopIndex"};
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    String getTabText () {
+        return "Text";
+    }
+
+    /**
+     * Sets the state of the "Example" widgets.
+     */
+    void setExampleWidgetState () {
+        super.setExampleWidgetState ();
+        wrapButton.setSelection ((text.getStyle () & DWT.WRAP) !is 0);
+        readOnlyButton.setSelection ((text.getStyle () & DWT.READ_ONLY) !is 0);
+        passwordButton.setSelection ((text.getStyle () & DWT.PASSWORD) !is 0);
+        searchButton.setSelection ((text.getStyle () & DWT.SEARCH) !is 0);
+        leftButton.setSelection ((text.getStyle () & DWT.LEFT) !is 0);
+        centerButton.setSelection ((text.getStyle () & DWT.CENTER) !is 0);
+        rightButton.setSelection ((text.getStyle () & DWT.RIGHT) !is 0);
+
+        /* Special case: CANCEL and H_SCROLL have the same value,
+         * so to avoid confusion, only set CANCEL if SEARCH is set. */
+        if ((text.getStyle () & DWT.SEARCH) !is 0) {
+            cancelButton.setSelection ((text.getStyle () & DWT.CANCEL) !is 0);
+            horizontalButton.setSelection (false);
+        } else {
+            cancelButton.setSelection (false);
+            horizontalButton.setSelection ((text.getStyle () & DWT.H_SCROLL) !is 0);
+        }
+
+        passwordButton.setEnabled ((text.getStyle () & DWT.SINGLE) !is 0);
+        searchButton.setEnabled ((text.getStyle () & DWT.SINGLE) !is 0);
+        cancelButton.setEnabled ((text.getStyle () & DWT.SEARCH) !is 0);
+        wrapButton.setEnabled ((text.getStyle () & DWT.MULTI) !is 0);
+        horizontalButton.setEnabled ((text.getStyle () & DWT.MULTI) !is 0);
+        verticalButton.setEnabled ((text.getStyle () & DWT.MULTI) !is 0);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/controlexample/ToolBarTab.d	Mon Jan 21 01:40:01 2008 +0100
@@ -0,0 +1,391 @@
+/*******************************************************************************
+ * 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
+ *******************************************************************************/
+module dwtexamples.controlexample.ToolBarTab;
+
+
+
+import dwt.DWT;
+import dwt.events.SelectionAdapter;
+import dwt.events.SelectionEvent;
+import dwt.graphics.Point;
+import dwt.graphics.Rectangle;
+import dwt.layout.GridData;
+import dwt.layout.GridLayout;
+import dwt.widgets.Button;
+import dwt.widgets.Combo;
+import dwt.widgets.Group;
+import dwt.widgets.Item;
+import dwt.widgets.Menu;
+import dwt.widgets.MenuItem;
+import dwt.widgets.ToolBar;
+import dwt.widgets.ToolItem;
+import dwt.widgets.Widget;
+
+class ToolBarTab : Tab {
+    /* Example widgets and groups that contain them */
+    ToolBar imageToolBar, textToolBar, imageTextToolBar;
+    Group imageToolBarGroup, textToolBarGroup, imageTextToolBarGroup;
+
+    /* Style widgets added to the "Style" group */
+    Button horizontalButton, verticalButton, flatButton, shadowOutButton, wrapButton, rightButton;
+
+    /* Other widgets added to the "Other" group */
+    Button comboChildButton;
+
+    /**
+     * Creates the Tab within a given instance of ControlExample.
+     */
+    this(ControlExample instance) {
+        super(instance);
+    }
+
+    /**
+     * Creates the "Example" group.
+     */
+    void createExampleGroup () {
+        super.createExampleGroup ();
+
+        /* Create a group for the image tool bar */
+        imageToolBarGroup = new Group (exampleGroup, DWT.NONE);
+        imageToolBarGroup.setLayout (new GridLayout ());
+        imageToolBarGroup.setLayoutData (new GridData (DWT.FILL, DWT.FILL, true, true));
+        imageToolBarGroup.setText (ControlExample.getResourceString("Image_ToolBar"));
+
+        /* Create a group for the text tool bar */
+        textToolBarGroup = new Group (exampleGroup, DWT.NONE);
+        textToolBarGroup.setLayout (new GridLayout ());
+        textToolBarGroup.setLayoutData (new GridData (DWT.FILL, DWT.FILL, true, true));
+        textToolBarGroup.setText (ControlExample.getResourceString("Text_ToolBar"));
+
+        /* Create a group for the image and text tool bar */
+        imageTextToolBarGroup = new Group (exampleGroup, DWT.NONE);
+        imageTextToolBarGroup.setLayout (new GridLayout ());
+        imageTextToolBarGroup.setLayoutData (new GridData (DWT.FILL, DWT.FILL, true, true));
+        imageTextToolBarGroup.setText (ControlExample.getResourceString("ImageText_ToolBar"));
+    }
+
+    /**
+     * Creates the "Example" widgets.
+     */
+    void createExampleWidgets () {
+
+        /* Compute the widget style */
+        int style = getDefaultStyle();
+        if (horizontalButton.getSelection()) style |= DWT.HORIZONTAL;
+        if (verticalButton.getSelection()) style |= DWT.VERTICAL;
+        if (flatButton.getSelection()) style |= DWT.FLAT;
+        if (wrapButton.getSelection()) style |= DWT.WRAP;
+        if (borderButton.getSelection()) style |= DWT.BORDER;
+        if (shadowOutButton.getSelection()) style |= DWT.SHADOW_OUT;
+        if (rightButton.getSelection()) style |= DWT.RIGHT;
+
+        /*
+        * Create the example widgets.
+        *
+        * A tool bar must consist of all image tool
+        * items or all text tool items but not both.
+        */
+
+        /* Create the image tool bar */
+        imageToolBar = new ToolBar (imageToolBarGroup, style);
+        ToolItem item = new ToolItem (imageToolBar, DWT.PUSH);
+        item.setImage (instance.images[ControlExample.ciClosedFolder]);
+        item.setToolTipText("DWT.PUSH");
+        item = new ToolItem (imageToolBar, DWT.PUSH);
+        item.setImage (instance.images[ControlExample.ciClosedFolder]);
+        item.setToolTipText ("DWT.PUSH");
+        item = new ToolItem (imageToolBar, DWT.RADIO);
+        item.setImage (instance.images[ControlExample.ciOpenFolder]);
+        item.setToolTipText ("DWT.RADIO");
+        item = new ToolItem (imageToolBar, DWT.RADIO);
+        item.setImage (instance.images[ControlExample.ciOpenFolder]);
+        item.setToolTipText ("DWT.RADIO");
+        item = new ToolItem (imageToolBar, DWT.CHECK);
+        item.setImage (instance.images[ControlExample.ciTarget]);
+        item.setToolTipText ("DWT.CHECK");
+        item = new ToolItem (imageToolBar, DWT.RADIO);
+        item.setImage (instance.images[ControlExample.ciClosedFolder]);
+        item.setToolTipText ("DWT.RADIO");
+        item = new ToolItem (imageToolBar, DWT.RADIO);
+        item.setImage (instance.images[ControlExample.ciClosedFolder]);
+        item.setToolTipText ("DWT.RADIO");
+        item = new ToolItem (imageToolBar, DWT.SEPARATOR);
+        item.setToolTipText("DWT.SEPARATOR");
+        if (comboChildButton.getSelection ()) {
+            Combo combo = new Combo (imageToolBar, DWT.NONE);
+            combo.setItems (new String [] {"250", "500", "750"});
+            combo.setText (combo.getItem (0));
+            combo.pack ();
+            item.setWidth (combo.getSize ().x);
+            item.setControl (combo);
+        }
+        item = new ToolItem (imageToolBar, DWT.DROP_DOWN);
+        item.setImage (instance.images[ControlExample.ciTarget]);
+        item.setToolTipText ("DWT.DROP_DOWN");
+        item.addSelectionListener(new DropDownSelectionListener());
+
+        /* Create the text tool bar */
+        textToolBar = new ToolBar (textToolBarGroup, style);
+        item = new ToolItem (textToolBar, DWT.PUSH);
+        item.setText (ControlExample.getResourceString("Push"));
+        item.setToolTipText("DWT.PUSH");
+        item = new ToolItem (textToolBar, DWT.PUSH);
+        item.setText (ControlExample.getResourceString("Push"));
+        item.setToolTipText("DWT.PUSH");
+        item = new ToolItem (textToolBar, DWT.RADIO);
+        item.setText (ControlExample.getResourceString("Radio"));
+        item.setToolTipText("DWT.RADIO");
+        item = new ToolItem (textToolBar, DWT.RADIO);
+        item.setText (ControlExample.getResourceString("Radio"));
+        item.setToolTipText("DWT.RADIO");
+        item = new ToolItem (textToolBar, DWT.CHECK);
+        item.setText (ControlExample.getResourceString("Check"));
+        item.setToolTipText("DWT.CHECK");
+        item = new ToolItem (textToolBar, DWT.RADIO);
+        item.setText (ControlExample.getResourceString("Radio"));
+        item.setToolTipText("DWT.RADIO");
+        item = new ToolItem (textToolBar, DWT.RADIO);
+        item.setText (ControlExample.getResourceString("Radio"));
+        item.setToolTipText("DWT.RADIO");
+        item = new ToolItem (textToolBar, DWT.SEPARATOR);
+        item.setToolTipText("DWT.SEPARATOR");
+        if (comboChildButton.getSelection ()) {
+            Combo combo = new Combo (textToolBar, DWT.NONE);
+            combo.setItems (new String [] {"250", "500", "750"});
+            combo.setText (combo.getItem (0));
+            combo.pack ();
+            item.setWidth (combo.getSize ().x);
+            item.setControl (combo);
+        }
+        item = new ToolItem (textToolBar, DWT.DROP_DOWN);
+        item.setText (ControlExample.getResourceString("Drop_Down"));
+        item.setToolTipText("DWT.DROP_DOWN");
+        item.addSelectionListener(new DropDownSelectionListener());
+
+        /* Create the image and text tool bar */
+        imageTextToolBar = new ToolBar (imageTextToolBarGroup, style);
+        item = new ToolItem (imageTextToolBar, DWT.PUSH);
+        item.setImage (instance.images[ControlExample.ciClosedFolder]);
+        item.setText (ControlExample.getResourceString("Push"));
+        item.setToolTipText("DWT.PUSH");
+        item = new ToolItem (imageTextToolBar, DWT.PUSH);
+        item.setImage (instance.images[ControlExample.ciClosedFolder]);
+        item.setText (ControlExample.getResourceString("Push"));
+        item.setToolTipText("DWT.PUSH");
+        item = new ToolItem (imageTextToolBar, DWT.RADIO);
+        item.setImage (instance.images[ControlExample.ciOpenFolder]);
+        item.setText (ControlExample.getResourceString("Radio"));
+        item.setToolTipText("DWT.RADIO");
+        item = new ToolItem (imageTextToolBar, DWT.RADIO);
+        item.setImage (instance.images[ControlExample.ciOpenFolder]);
+        item.setText (ControlExample.getResourceString("Radio"));
+        item.setToolTipText("DWT.RADIO");
+        item = new ToolItem (imageTextToolBar, DWT.CHECK);
+        item.setImage (instance.images[ControlExample.ciTarget]);
+        item.setText (ControlExample.getResourceString("Check"));
+        item.setToolTipText("DWT.CHECK");
+        item = new ToolItem (imageTextToolBar, DWT.RADIO);
+        item.setImage (instance.images[ControlExample.ciClosedFolder]);
+        item.setText (ControlExample.getResourceString("Radio"));
+        item.setToolTipText("DWT.RADIO");
+        item = new ToolItem (imageTextToolBar, DWT.RADIO);
+        item.setImage (instance.images[ControlExample.ciClosedFolder]);
+        item.setText (ControlExample.getResourceString("Radio"));
+        item.setToolTipText("DWT.RADIO");
+        item = new ToolItem (imageTextToolBar, DWT.SEPARATOR);
+        item.setToolTipText("DWT.SEPARATOR");
+        if (comboChildButton.getSelection ()) {
+            Combo combo = new Combo (imageTextToolBar, DWT.NONE);
+            combo.setItems (new String [] {"250", "500", "750"});
+            combo.setText (combo.getItem (0));
+            combo.pack ();
+            item.setWidth (combo.getSize ().x);
+            item.setControl (combo);
+        }
+        item = new ToolItem (imageTextToolBar, DWT.DROP_DOWN);
+        item.setImage (instance.images[ControlExample.ciTarget]);
+        item.setText (ControlExample.getResourceString("Drop_Down"));
+        item.setToolTipText("DWT.DROP_DOWN");
+        item.addSelectionListener(new DropDownSelectionListener());
+
+        /*
+        * Do not add the selection event for this drop down
+        * tool item.  Without hooking the event, the drop down
+        * widget does nothing special when the drop down area
+        * is selected.
+        */
+    }
+
+    /**
+     * Creates the "Other" group.
+     */
+    void createOtherGroup () {
+        super.createOtherGroup ();
+
+        /* Create display controls specific to this example */
+        comboChildButton = new Button (otherGroup, DWT.CHECK);
+        comboChildButton.setText (ControlExample.getResourceString("Combo_child"));
+
+        /* Add the listeners */
+        comboChildButton.addSelectionListener (new SelectionAdapter () {
+            public void widgetSelected (SelectionEvent event) {
+                recreateExampleWidgets ();
+            }
+        });
+    }
+
+    /**
+     * Creates the "Style" group.
+     */
+    void createStyleGroup() {
+        super.createStyleGroup();
+
+        /* Create the extra widgets */
+        horizontalButton = new Button (styleGroup, DWT.RADIO);
+        horizontalButton.setText ("DWT.HORIZONTAL");
+        verticalButton = new Button (styleGroup, DWT.RADIO);
+        verticalButton.setText ("DWT.VERTICAL");
+        flatButton = new Button (styleGroup, DWT.CHECK);
+        flatButton.setText ("DWT.FLAT");
+        shadowOutButton = new Button (styleGroup, DWT.CHECK);
+        shadowOutButton.setText ("DWT.SHADOW_OUT");
+        wrapButton = new Button (styleGroup, DWT.CHECK);
+        wrapButton.setText ("DWT.WRAP");
+        rightButton = new Button (styleGroup, DWT.CHECK);
+        rightButton.setText ("DWT.RIGHT");
+        borderButton = new Button (styleGroup, DWT.CHECK);
+        borderButton.setText ("DWT.BORDER");
+    }
+
+    void disposeExampleWidgets () {
+        super.disposeExampleWidgets ();
+    }
+
+    /**
+     * Gets the "Example" widget children's items, if any.
+     *
+     * @return an array containing the example widget children's items
+     */
+    Item [] getExampleWidgetItems () {
+        Item [] imageToolBarItems = imageToolBar.getItems();
+        Item [] textToolBarItems = textToolBar.getItems();
+        Item [] imageTextToolBarItems = imageTextToolBar.getItems();
+        Item [] allItems = new Item [imageToolBarItems.length + textToolBarItems.length + imageTextToolBarItems.length];
+        System.arraycopy(imageToolBarItems, 0, allItems, 0, imageToolBarItems.length);
+        System.arraycopy(textToolBarItems, 0, allItems, imageToolBarItems.length, textToolBarItems.length);
+        System.arraycopy(imageTextToolBarItems, 0, allItems, imageToolBarItems.length + textToolBarItems.length, imageTextToolBarItems.length);
+        return allItems;
+    }
+
+    /**
+     * Gets the "Example" widget children.
+     */
+    Widget [] getExampleWidgets () {
+        return new Widget [] {imageToolBar, textToolBar, imageTextToolBar};
+    }
+
+    /**
+     * Gets the short text for the tab folder item.
+     */
+    public String getShortTabText() {
+        return "TB";
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    String getTabText () {
+        return "ToolBar";
+    }
+
+    /**
+     * Sets the state of the "Example" widgets.
+     */
+    void setExampleWidgetState () {
+        super.setExampleWidgetState ();
+        horizontalButton.setSelection ((imageToolBar.getStyle () & DWT.HORIZONTAL) !is 0);
+        verticalButton.setSelection ((imageToolBar.getStyle () & DWT.VERTICAL) !is 0);
+        flatButton.setSelection ((imageToolBar.getStyle () & DWT.FLAT) !is 0);
+        wrapButton.setSelection ((imageToolBar.getStyle () & DWT.WRAP) !is 0);
+        shadowOutButton.setSelection ((imageToolBar.getStyle () & DWT.SHADOW_OUT) !is 0);
+        borderButton.setSelection ((imageToolBar.getStyle () & DWT.BORDER) !is 0);
+        rightButton.setSelection ((imageToolBar.getStyle () & DWT.RIGHT) !is 0);
+    }
+
+    /**
+     * Listens to widgetSelected() events on DWT.DROP_DOWN type ToolItems
+     * and opens/closes a menu when appropriate.
+     */
+    class DropDownSelectionListener extends SelectionAdapter {
+        private Menu    menu = null;
+        private bool visible = false;
+
+        public void widgetSelected(SelectionEvent event) {
+            // Create the menu if it has not already been created
+            if (menu is null) {
+                // Lazy create the menu.
+                menu = new Menu(shell);
+                for (int i = 0; i < 9; ++i) {
+                    final String text = ControlExample.getResourceString("DropDownData_" + i);
+                    if (text.length() !is 0) {
+                        MenuItem menuItem = new MenuItem(menu, DWT.NONE);
+                        menuItem.setText(text);
+                        /*
+                         * Add a menu selection listener so that the menu is hidden
+                         * when the user selects an item from the drop down menu.
+                         */
+                        menuItem.addSelectionListener(new SelectionAdapter() {
+                            public void widgetSelected(SelectionEvent e) {
+                                setMenuVisible(false);
+                            }
+                        });
+                    } else {
+                        new MenuItem(menu, DWT.SEPARATOR);
+                    }
+                }
+            }
+
+            /**
+             * A selection event will be fired when a drop down tool
+             * item is selected in the main area and in the drop
+             * down arrow.  Examine the event detail to determine
+             * where the widget was selected.
+             */
+            if (event.detail is DWT.ARROW) {
+                /*
+                 * The drop down arrow was selected.
+                 */
+                if (visible) {
+                    // Hide the menu to give the Arrow the appearance of being a toggle button.
+                    setMenuVisible(false);
+                } else {
+                    // Position the menu below and vertically aligned with the the drop down tool button.
+                    final ToolItem toolItem = (ToolItem) event.widget;
+                    final ToolBar  toolBar = toolItem.getParent();
+
+                    Rectangle toolItemBounds = toolItem.getBounds();
+                    Point point = toolBar.toDisplay(new Point(toolItemBounds.x, toolItemBounds.y));
+                    menu.setLocation(point.x, point.y + toolItemBounds.height);
+                    setMenuVisible(true);
+                }
+            } else {
+                /*
+                 * Main area of drop down tool item selected.
+                 * An application would invoke the code to perform the action for the tool item.
+                 */
+            }
+        }
+        private void setMenuVisible(bool visible) {
+            menu.setVisible(visible);
+            this.visible = visible;
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/controlexample/ToolTipTab.d	Mon Jan 21 01:40:01 2008 +0100
@@ -0,0 +1,263 @@
+/*******************************************************************************
+ * 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
+ *******************************************************************************/
+module dwtexamples.controlexample.ToolTipTab;
+
+
+
+import dwt.DWT;
+import dwt.events.ControlAdapter;
+import dwt.events.ControlEvent;
+import dwt.events.DisposeEvent;
+import dwt.events.DisposeListener;
+import dwt.events.SelectionAdapter;
+import dwt.events.SelectionEvent;
+import dwt.layout.GridData;
+import dwt.layout.GridLayout;
+import dwt.widgets.Button;
+import dwt.widgets.Composite;
+import dwt.widgets.Group;
+import dwt.widgets.TabFolder;
+import dwt.widgets.ToolTip;
+import dwt.widgets.Tray;
+import dwt.widgets.TrayItem;
+import dwt.widgets.Widget;
+
+class ToolTipTab : Tab {
+
+    /* Example widgets and groups that contain them */
+    ToolTip toolTip1;
+    Group toolTipGroup;
+
+    /* Style widgets added to the "Style" group */
+    Button balloonButton, iconErrorButton, iconInformationButton, iconWarningButton, noIconButton;
+
+    /* Other widgets added to the "Other" group */
+    Button autoHideButton, showInTrayButton;
+
+    Tray tray;
+    TrayItem trayItem;
+
+    /**
+     * Creates the Tab within a given instance of ControlExample.
+     */
+    this(ControlExample instance) {
+        super(instance);
+    }
+
+    /**
+     * Creates the "Example" group.
+     */
+    void createExampleGroup () {
+        super.createExampleGroup ();
+
+        /* Create a group for the tooltip visibility check box */
+        toolTipGroup = new Group (exampleGroup, DWT.NONE);
+        toolTipGroup.setLayout (new GridLayout ());
+        toolTipGroup.setLayoutData (new GridData (DWT.FILL, DWT.FILL, true, true));
+        toolTipGroup.setText ("ToolTip");
+        visibleButton = new Button(toolTipGroup, DWT.CHECK);
+        visibleButton.setText(ControlExample.getResourceString("Visible"));
+        visibleButton.addSelectionListener (new SelectionAdapter () {
+            public void widgetSelected (SelectionEvent event) {
+                setExampleWidgetVisibility ();
+            }
+        });
+    }
+
+    /**
+     * Creates the "Example" widgets.
+     */
+    void createExampleWidgets () {
+
+        /* Compute the widget style */
+        int style = getDefaultStyle();
+        if (balloonButton.getSelection ()) style |= DWT.BALLOON;
+        if (iconErrorButton.getSelection ()) style |= DWT.ICON_ERROR;
+        if (iconInformationButton.getSelection ()) style |= DWT.ICON_INFORMATION;
+        if (iconWarningButton.getSelection ()) style |= DWT.ICON_WARNING;
+
+        /* Create the example widgets */
+        toolTip1 = new ToolTip (shell, style);
+        toolTip1.setText(ControlExample.getResourceString("ToolTip_Title"));
+        toolTip1.setMessage(ControlExample.getResourceString("Example_string"));
+    }
+
+    /**
+     * Creates the tab folder page.
+     *
+     * @param tabFolder org.eclipse.swt.widgets.TabFolder
+     * @return the new page for the tab folder
+     */
+    Composite createTabFolderPage (TabFolder tabFolder) {
+        super.createTabFolderPage (tabFolder);
+
+        /*
+         * Add a resize listener to the tabFolderPage so that
+         * if the user types into the example widget to change
+         * its preferred size, and then resizes the shell, we
+         * recalculate the preferred size correctly.
+         */
+        tabFolderPage.addControlListener(new ControlAdapter() {
+            public void controlResized(ControlEvent e) {
+                setExampleWidgetSize ();
+            }
+        });
+
+        return tabFolderPage;
+    }
+
+    /**
+     * Creates the "Style" group.
+     */
+    void createStyleGroup () {
+        super.createStyleGroup ();
+
+        /* Create the extra widgets */
+        balloonButton = new Button (styleGroup, DWT.CHECK);
+        balloonButton.setText ("DWT.BALLOON");
+        iconErrorButton = new Button (styleGroup, DWT.RADIO);
+        iconErrorButton.setText("DWT.ICON_ERROR");
+        iconInformationButton = new Button (styleGroup, DWT.RADIO);
+        iconInformationButton.setText("DWT.ICON_INFORMATION");
+        iconWarningButton = new Button (styleGroup, DWT.RADIO);
+        iconWarningButton.setText("DWT.ICON_WARNING");
+        noIconButton = new Button (styleGroup, DWT.RADIO);
+        noIconButton.setText(ControlExample.getResourceString("No_Icon"));
+    }
+
+    void createColorAndFontGroup () {
+        // ToolTip does not need a color and font group.
+    }
+
+    void createOtherGroup () {
+        /* Create the group */
+        otherGroup = new Group (controlGroup, DWT.NONE);
+        otherGroup.setLayout (new GridLayout ());
+        otherGroup.setLayoutData (new GridData (DWT.FILL, DWT.FILL, false, false));
+        otherGroup.setText (ControlExample.getResourceString("Other"));
+
+        /* Create the controls */
+        autoHideButton = new Button(otherGroup, DWT.CHECK);
+        autoHideButton.setText(ControlExample.getResourceString("AutoHide"));
+        showInTrayButton = new Button(otherGroup, DWT.CHECK);
+        showInTrayButton.setText(ControlExample.getResourceString("Show_In_Tray"));
+        tray = display.getSystemTray();
+        showInTrayButton.setEnabled(tray !is null);
+
+        /* Add the listeners */
+        autoHideButton.addSelectionListener (new SelectionAdapter () {
+            public void widgetSelected (SelectionEvent event) {
+                setExampleWidgetAutoHide ();
+            }
+        });
+        showInTrayButton.addSelectionListener (new SelectionAdapter () {
+            public void widgetSelected (SelectionEvent event) {
+                showExampleWidgetInTray ();
+            }
+        });
+        shell.addDisposeListener(new DisposeListener() {
+            public void widgetDisposed(DisposeEvent event) {
+                disposeTrayItem();
+            }
+        });
+
+        /* Set the default state */
+        autoHideButton.setSelection(true);
+    }
+
+    void createSizeGroup () {
+        // ToolTip does not need a size group.
+    }
+
+    /**
+     * Disposes the "Example" widgets.
+     */
+    void disposeExampleWidgets () {
+        disposeTrayItem();
+        super.disposeExampleWidgets();
+    }
+
+    /**
+     * Gets the "Example" widget children.
+     */
+    // Tab uses this for many things - widgets would only get set/get, listeners, and dispose.
+    Widget[] getExampleWidgets () {
+        return new Widget [] {toolTip1};
+    }
+
+    /**
+     * Returns a list of set/get API method names (without the set/get prefix)
+     * that can be used to set/get values in the example control(s).
+     */
+    String[] getMethodNames() {
+        return new String[] {"Message", "Text"};
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    String getTabText () {
+        return "ToolTip";
+    }
+
+    /**
+     * Sets the state of the "Example" widgets.
+     */
+    void setExampleWidgetState () {
+        showExampleWidgetInTray ();
+        setExampleWidgetAutoHide ();
+        super.setExampleWidgetState ();
+        balloonButton.setSelection ((toolTip1.getStyle () & DWT.BALLOON) !is 0);
+        iconErrorButton.setSelection ((toolTip1.getStyle () & DWT.ICON_ERROR) !is 0);
+        iconInformationButton.setSelection ((toolTip1.getStyle () & DWT.ICON_INFORMATION) !is 0);
+        iconWarningButton.setSelection ((toolTip1.getStyle () & DWT.ICON_WARNING) !is 0);
+        noIconButton.setSelection ((toolTip1.getStyle () & (DWT.ICON_ERROR | DWT.ICON_INFORMATION | DWT.ICON_WARNING)) is 0);
+        autoHideButton.setSelection(toolTip1.getAutoHide());
+    }
+
+    /**
+     * Sets the visibility of the "Example" widgets.
+     */
+    void setExampleWidgetVisibility () {
+        toolTip1.setVisible (visibleButton.getSelection ());
+    }
+
+    /**
+     * Sets the autoHide state of the "Example" widgets.
+     */
+    void setExampleWidgetAutoHide () {
+        toolTip1.setAutoHide(autoHideButton.getSelection ());
+    }
+
+    void showExampleWidgetInTray () {
+        if (showInTrayButton.getSelection ()) {
+            createTrayItem();
+            trayItem.setToolTip(toolTip1);
+        } else {
+            disposeTrayItem();
+        }
+    }
+
+    void createTrayItem() {
+        if (trayItem is null) {
+            trayItem = new TrayItem(tray, DWT.NONE);
+            trayItem.setImage(instance.images[ControlExample.ciTarget]);
+        }
+    }
+
+    void disposeTrayItem() {
+        if (trayItem !is null) {
+            trayItem.setToolTip(null);
+            trayItem.dispose();
+            trayItem = null;
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/controlexample/TreeTab.d	Mon Jan 21 01:40:01 2008 +0100
@@ -0,0 +1,801 @@
+/*******************************************************************************
+ * 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
+ *******************************************************************************/
+module dwtexamples.controlexample.TreeTab;
+
+
+
+import dwt.DWT;
+import dwt.events.DisposeEvent;
+import dwt.events.DisposeListener;
+import dwt.events.SelectionAdapter;
+import dwt.events.SelectionEvent;
+import dwt.events.SelectionListener;
+import dwt.graphics.Color;
+import dwt.graphics.Font;
+import dwt.graphics.FontData;
+import dwt.graphics.Image;
+import dwt.graphics.Point;
+import dwt.graphics.RGB;
+import dwt.layout.GridData;
+import dwt.layout.GridLayout;
+import dwt.widgets.Button;
+import dwt.widgets.Event;
+import dwt.widgets.Group;
+import dwt.widgets.Item;
+import dwt.widgets.Menu;
+import dwt.widgets.MenuItem;
+import dwt.widgets.TableItem;
+import dwt.widgets.Tree;
+import dwt.widgets.TreeColumn;
+import dwt.widgets.TreeItem;
+import dwt.widgets.Widget;
+
+class TreeTab : ScrollableTab {
+    /* Example widgets and groups that contain them */
+    Tree tree1, tree2;
+    TreeItem textNode1, imageNode1;
+    Group treeGroup, imageTreeGroup, itemGroup;
+
+    /* Size widgets added to the "Size" group */
+    Button packColumnsButton;
+
+    /* Style widgets added to the "Style" group */
+    Button checkButton, fullSelectionButton;
+
+    /* Other widgets added to the "Other" group */
+    Button multipleColumns, moveableColumns, resizableColumns, headerVisibleButton, sortIndicatorButton, headerImagesButton, subImagesButton, linesVisibleButton;
+
+    /* Controls and resources added to the "Colors and Fonts" group */
+    static final int ITEM_FOREGROUND_COLOR = 3;
+    static final int ITEM_BACKGROUND_COLOR = 4;
+    static final int ITEM_FONT = 5;
+    static final int CELL_FOREGROUND_COLOR = 6;
+    static final int CELL_BACKGROUND_COLOR = 7;
+    static final int CELL_FONT = 8;
+    Color itemForegroundColor, itemBackgroundColor, cellForegroundColor, cellBackgroundColor;
+    Font itemFont, cellFont;
+
+    static String [] columnTitles   = {ControlExample.getResourceString("TableTitle_0"),
+           ControlExample.getResourceString("TableTitle_1"),
+           ControlExample.getResourceString("TableTitle_2"),
+           ControlExample.getResourceString("TableTitle_3")};
+
+    static String[][] tableData = {
+            { ControlExample.getResourceString("TableLine0_0"),
+                    ControlExample.getResourceString("TableLine0_1"),
+                    ControlExample.getResourceString("TableLine0_2"),
+                    ControlExample.getResourceString("TableLine0_3") },
+            { ControlExample.getResourceString("TableLine1_0"),
+                    ControlExample.getResourceString("TableLine1_1"),
+                    ControlExample.getResourceString("TableLine1_2"),
+                    ControlExample.getResourceString("TableLine1_3") },
+            { ControlExample.getResourceString("TableLine2_0"),
+                    ControlExample.getResourceString("TableLine2_1"),
+                    ControlExample.getResourceString("TableLine2_2"),
+                    ControlExample.getResourceString("TableLine2_3") } };
+
+    Point menuMouseCoords;
+
+    /**
+     * Creates the Tab within a given instance of ControlExample.
+     */
+    this(ControlExample instance) {
+        super(instance);
+    }
+
+    /**
+     * Creates the "Colors and Fonts" group.
+     */
+    void createColorAndFontGroup () {
+        super.createColorAndFontGroup();
+
+        TableItem item = new TableItem(colorAndFontTable, DWT.None);
+        item.setText(ControlExample.getResourceString ("Item_Foreground_Color"));
+        item = new TableItem(colorAndFontTable, DWT.None);
+        item.setText(ControlExample.getResourceString ("Item_Background_Color"));
+        item = new TableItem(colorAndFontTable, DWT.None);
+        item.setText(ControlExample.getResourceString ("Item_Font"));
+        item = new TableItem(colorAndFontTable, DWT.None);
+        item.setText(ControlExample.getResourceString ("Cell_Foreground_Color"));
+        item = new TableItem(colorAndFontTable, DWT.None);
+        item.setText(ControlExample.getResourceString ("Cell_Background_Color"));
+        item = new TableItem(colorAndFontTable, DWT.None);
+        item.setText(ControlExample.getResourceString ("Cell_Font"));
+
+        shell.addDisposeListener(new DisposeListener() {
+            public void widgetDisposed(DisposeEvent event) {
+                if (itemBackgroundColor !is null) itemBackgroundColor.dispose();
+                if (itemForegroundColor !is null) itemForegroundColor.dispose();
+                if (itemFont !is null) itemFont.dispose();
+                if (cellBackgroundColor !is null) cellBackgroundColor.dispose();
+                if (cellForegroundColor !is null) cellForegroundColor.dispose();
+                if (cellFont !is null) cellFont.dispose();
+                itemBackgroundColor = null;
+                itemForegroundColor = null;
+                itemFont = null;
+                cellBackgroundColor = null;
+                cellForegroundColor = null;
+                cellFont = null;
+            }
+        });
+    }
+
+    void changeFontOrColor(int index) {
+        switch (index) {
+        case ITEM_FOREGROUND_COLOR: {
+            Color oldColor = itemForegroundColor;
+            if (oldColor is null) oldColor = textNode1.getForeground ();
+            colorDialog.setRGB(oldColor.getRGB());
+            RGB rgb = colorDialog.open();
+            if (rgb is null) return;
+            oldColor = itemForegroundColor;
+            itemForegroundColor = new Color (display, rgb);
+            setItemForeground ();
+            if (oldColor !is null) oldColor.dispose ();
+        }
+        break;
+        case ITEM_BACKGROUND_COLOR: {
+            Color oldColor = itemBackgroundColor;
+            if (oldColor is null) oldColor = textNode1.getBackground ();
+            colorDialog.setRGB(oldColor.getRGB());
+            RGB rgb = colorDialog.open();
+            if (rgb is null) return;
+            oldColor = itemBackgroundColor;
+            itemBackgroundColor = new Color (display, rgb);
+            setItemBackground ();
+            if (oldColor !is null) oldColor.dispose ();
+        }
+        break;
+        case ITEM_FONT: {
+            Font oldFont = itemFont;
+            if (oldFont is null) oldFont = textNode1.getFont ();
+            fontDialog.setFontList(oldFont.getFontData());
+            FontData fontData = fontDialog.open ();
+            if (fontData is null) return;
+            oldFont = itemFont;
+            itemFont = new Font (display, fontData);
+            setItemFont ();
+            setExampleWidgetSize ();
+            if (oldFont !is null) oldFont.dispose ();
+        }
+        break;
+        case CELL_FOREGROUND_COLOR: {
+            Color oldColor = cellForegroundColor;
+            if (oldColor is null) oldColor = textNode1.getForeground (1);
+            colorDialog.setRGB(oldColor.getRGB());
+            RGB rgb = colorDialog.open();
+            if (rgb is null) return;
+            oldColor = cellForegroundColor;
+            cellForegroundColor = new Color (display, rgb);
+            setCellForeground ();
+            if (oldColor !is null) oldColor.dispose ();
+        }
+        break;
+        case CELL_BACKGROUND_COLOR: {
+            Color oldColor = cellBackgroundColor;
+            if (oldColor is null) oldColor = textNode1.getBackground (1);
+            colorDialog.setRGB(oldColor.getRGB());
+            RGB rgb = colorDialog.open();
+            if (rgb is null) return;
+            oldColor = cellBackgroundColor;
+            cellBackgroundColor = new Color (display, rgb);
+            setCellBackground ();
+            if (oldColor !is null) oldColor.dispose ();
+        }
+        break;
+        case CELL_FONT: {
+            Font oldFont = cellFont;
+            if (oldFont is null) oldFont = textNode1.getFont (1);
+            fontDialog.setFontList(oldFont.getFontData());
+            FontData fontData = fontDialog.open ();
+            if (fontData is null) return;
+            oldFont = cellFont;
+            cellFont = new Font (display, fontData);
+            setCellFont ();
+            setExampleWidgetSize ();
+            if (oldFont !is null) oldFont.dispose ();
+        }
+        break;
+        default:
+            super.changeFontOrColor(index);
+        }
+    }
+
+    /**
+     * Creates the "Other" group.
+     */
+    void createOtherGroup () {
+        super.createOtherGroup ();
+
+        /* Create display controls specific to this example */
+        linesVisibleButton = new Button (otherGroup, DWT.CHECK);
+        linesVisibleButton.setText (ControlExample.getResourceString("Lines_Visible"));
+        multipleColumns = new Button (otherGroup, DWT.CHECK);
+        multipleColumns.setText (ControlExample.getResourceString("Multiple_Columns"));
+        headerVisibleButton = new Button (otherGroup, DWT.CHECK);
+        headerVisibleButton.setText (ControlExample.getResourceString("Header_Visible"));
+        sortIndicatorButton = new Button (otherGroup, DWT.CHECK);
+        sortIndicatorButton.setText (ControlExample.getResourceString("Sort_Indicator"));
+        moveableColumns = new Button (otherGroup, DWT.CHECK);
+        moveableColumns.setText (ControlExample.getResourceString("Moveable_Columns"));
+        resizableColumns = new Button (otherGroup, DWT.CHECK);
+        resizableColumns.setText (ControlExample.getResourceString("Resizable_Columns"));
+        headerImagesButton = new Button (otherGroup, DWT.CHECK);
+        headerImagesButton.setText (ControlExample.getResourceString("Header_Images"));
+        subImagesButton = new Button (otherGroup, DWT.CHECK);
+        subImagesButton.setText (ControlExample.getResourceString("Sub_Images"));
+
+        /* Add the listeners */
+        linesVisibleButton.addSelectionListener (new SelectionAdapter () {
+            public void widgetSelected (SelectionEvent event) {
+                setWidgetLinesVisible ();
+            }
+        });
+        multipleColumns.addSelectionListener (new SelectionAdapter () {
+            public void widgetSelected (SelectionEvent event) {
+                recreateExampleWidgets ();
+            }
+        });
+        headerVisibleButton.addSelectionListener (new SelectionAdapter () {
+            public void widgetSelected (SelectionEvent event) {
+                setWidgetHeaderVisible ();
+            }
+        });
+        sortIndicatorButton.addSelectionListener (new SelectionAdapter () {
+            public void widgetSelected (SelectionEvent event) {
+                setWidgetSortIndicator ();
+            }
+        });
+        moveableColumns.addSelectionListener (new SelectionAdapter () {
+            public void widgetSelected (SelectionEvent event) {
+                setColumnsMoveable ();
+            }
+        });
+        resizableColumns.addSelectionListener (new SelectionAdapter () {
+            public void widgetSelected (SelectionEvent event) {
+                setColumnsResizable ();
+            }
+        });
+        headerImagesButton.addSelectionListener (new SelectionAdapter () {
+            public void widgetSelected (SelectionEvent event) {
+                recreateExampleWidgets ();
+            }
+        });
+        subImagesButton.addSelectionListener (new SelectionAdapter () {
+            public void widgetSelected (SelectionEvent event) {
+                recreateExampleWidgets ();
+            }
+        });
+    }
+
+    /**
+     * Creates the "Example" group.
+     */
+    void createExampleGroup () {
+        super.createExampleGroup ();
+
+        /* Create a group for the text tree */
+        treeGroup = new Group (exampleGroup, DWT.NONE);
+        treeGroup.setLayout (new GridLayout ());
+        treeGroup.setLayoutData (new GridData (DWT.FILL, DWT.FILL, true, true));
+        treeGroup.setText ("Tree");
+
+        /* Create a group for the image tree */
+        imageTreeGroup = new Group (exampleGroup, DWT.NONE);
+        imageTreeGroup.setLayout (new GridLayout ());
+        imageTreeGroup.setLayoutData (new GridData (DWT.FILL, DWT.FILL, true, true));
+        imageTreeGroup.setText (ControlExample.getResourceString("Tree_With_Images"));
+    }
+
+    /**
+     * Creates the "Example" widgets.
+     */
+    void createExampleWidgets () {
+        /* Compute the widget style */
+        int style = getDefaultStyle();
+        if (singleButton.getSelection()) style |= DWT.SINGLE;
+        if (multiButton.getSelection()) style |= DWT.MULTI;
+        if (horizontalButton.getSelection ()) style |= DWT.H_SCROLL;
+        if (verticalButton.getSelection ()) style |= DWT.V_SCROLL;
+        if (checkButton.getSelection()) style |= DWT.CHECK;
+        if (fullSelectionButton.getSelection ()) style |= DWT.FULL_SELECTION;
+        if (borderButton.getSelection()) style |= DWT.BORDER;
+
+        /* Create the text tree */
+        tree1 = new Tree (treeGroup, style);
+        bool multiColumn = multipleColumns.getSelection();
+        if (multiColumn) {
+            for (int i = 0; i < columnTitles.length; i++) {
+                TreeColumn treeColumn = new TreeColumn(tree1, DWT.NONE);
+                treeColumn.setText(columnTitles[i]);
+                treeColumn.setToolTipText(ControlExample.getResourceString("Tooltip", new String [] {columnTitles[i]}));
+            }
+            tree1.setSortColumn(tree1.getColumn(0));
+        }
+        for (int i = 0; i < 4; i++) {
+            TreeItem item = new TreeItem (tree1, DWT.NONE);
+            setItemText(item, i, ControlExample.getResourceString("Node_" + (i + 1)));
+            if (i < 3) {
+                TreeItem subitem = new TreeItem (item, DWT.NONE);
+                setItemText(subitem, i, ControlExample.getResourceString("Node_" + (i + 1) + "_1"));
+            }
+        }
+        TreeItem treeRoots[] = tree1.getItems ();
+        TreeItem item = new TreeItem (treeRoots[1], DWT.NONE);
+        setItemText(item, 1, ControlExample.getResourceString("Node_2_2"));
+        item = new TreeItem (item, DWT.NONE);
+        setItemText(item, 1, ControlExample.getResourceString("Node_2_2_1"));
+        textNode1 = treeRoots[0];
+        packColumns(tree1);
+        try {
+            TreeColumn column = tree1.getColumn(0);
+            resizableColumns.setSelection (column.getResizable());
+        } catch (IllegalArgumentException ex) {}
+
+        /* Create the image tree */
+        tree2 = new Tree (imageTreeGroup, style);
+        Image image = instance.images[ControlExample.ciClosedFolder];
+        if (multiColumn) {
+            for (int i = 0; i < columnTitles.length; i++) {
+                TreeColumn treeColumn = new TreeColumn(tree2, DWT.NONE);
+                treeColumn.setText(columnTitles[i]);
+                treeColumn.setToolTipText(ControlExample.getResourceString("Tooltip", new String [] {columnTitles[i]}));
+                if (headerImagesButton.getSelection()) treeColumn.setImage(image);
+            }
+        }
+        for (int i = 0; i < 4; i++) {
+            item = new TreeItem (tree2, DWT.NONE);
+            setItemText(item, i, ControlExample.getResourceString("Node_" + (i + 1)));
+            if (multiColumn && subImagesButton.getSelection()) {
+                for (int j = 0; j < columnTitles.length; j++) {
+                    item.setImage(j, image);
+                }
+            } else {
+                item.setImage(image);
+            }
+            if (i < 3) {
+                TreeItem subitem = new TreeItem (item, DWT.NONE);
+                setItemText(subitem, i, ControlExample.getResourceString("Node_" + (i + 1) + "_1"));
+                if (multiColumn && subImagesButton.getSelection()) {
+                    for (int j = 0; j < columnTitles.length; j++) {
+                        subitem.setImage(j, image);
+                    }
+                } else {
+                    subitem.setImage(image);
+                }
+            }
+        }
+        treeRoots = tree2.getItems ();
+        item = new TreeItem (treeRoots[1], DWT.NONE);
+        setItemText(item, 1, ControlExample.getResourceString("Node_2_2"));
+        if (multiColumn && subImagesButton.getSelection()) {
+            for (int j = 0; j < columnTitles.length; j++) {
+                item.setImage(j, image);
+            }
+        } else {
+            item.setImage(image);
+        }
+        item = new TreeItem (item, DWT.NONE);
+        setItemText(item, 1, ControlExample.getResourceString("Node_2_2_1"));
+        if (multiColumn && subImagesButton.getSelection()) {
+            for (int j = 0; j < columnTitles.length; j++) {
+                item.setImage(j, image);
+            }
+        } else {
+            item.setImage(image);
+        }
+        imageNode1 = treeRoots[0];
+        packColumns(tree2);
+    }
+
+    void setItemText(TreeItem item, int i, String node) {
+        int index = i % 3;
+        if (multipleColumns.getSelection()) {
+            tableData [index][0] = node;
+            item.setText (tableData [index]);
+        } else {
+            item.setText (node);
+        }
+    }
+
+    /**
+     * Creates the "Size" group.  The "Size" group contains
+     * controls that allow the user to change the size of
+     * the example widgets.
+     */
+    void createSizeGroup () {
+        super.createSizeGroup();
+
+        packColumnsButton = new Button (sizeGroup, DWT.PUSH);
+        packColumnsButton.setText (ControlExample.getResourceString("Pack_Columns"));
+        packColumnsButton.addSelectionListener(new SelectionAdapter () {
+            public void widgetSelected (SelectionEvent event) {
+                packColumns (tree1);
+                packColumns (tree2);
+                setExampleWidgetSize ();
+            }
+        });
+    }
+
+    /**
+     * Creates the "Style" group.
+     */
+    void createStyleGroup() {
+        super.createStyleGroup();
+
+        /* Create the extra widgets */
+        checkButton = new Button (styleGroup, DWT.CHECK);
+        checkButton.setText ("DWT.CHECK");
+        fullSelectionButton = new Button (styleGroup, DWT.CHECK);
+        fullSelectionButton.setText ("DWT.FULL_SELECTION");
+    }
+
+    /**
+     * Gets the "Example" widget children's items, if any.
+     *
+     * @return an array containing the example widget children's items
+     */
+    Item [] getExampleWidgetItems () {
+        /* Note: We do not bother collecting the tree items
+         * because tree items don't have any events. If events
+         * are ever added to TreeItem, then this needs to change.
+         */
+        Item [] columns1 = tree1.getColumns();
+        Item [] columns2 = tree2.getColumns();
+        Item [] allItems = new Item [columns1.length + columns2.length];
+        System.arraycopy(columns1, 0, allItems, 0, columns1.length);
+        System.arraycopy(columns2, 0, allItems, columns1.length, columns2.length);
+        return allItems;
+    }
+
+    /**
+     * Gets the "Example" widget children.
+     */
+    Widget [] getExampleWidgets () {
+        return new Widget [] {tree1, tree2};
+    }
+
+    /**
+     * Returns a list of set/get API method names (without the set/get prefix)
+     * that can be used to set/get values in the example control(s).
+     */
+    String[] getMethodNames() {
+        return new String[] {"ColumnOrder", "Selection", "ToolTipText", "TopItem"};
+    }
+
+    Object[] parameterForType(String typeName, String value, Widget widget) {
+        if (typeName.equals("org.eclipse.swt.widgets.TreeItem")) {
+            TreeItem item = findItem(value, ((Tree) widget).getItems());
+            if (item !is null) return new Object[] {item};
+        }
+        if (typeName.equals("[Lorg.eclipse.swt.widgets.TreeItem;")) {
+            String[] values = split(value, ',');
+            TreeItem[] items = new TreeItem[values.length];
+            for (int i = 0; i < values.length; i++) {
+                TreeItem item = findItem(values[i], ((Tree) widget).getItems());
+                if (item is null) break;
+                items[i] = item;
+            }
+            return new Object[] {items};
+        }
+        return super.parameterForType(typeName, value, widget);
+    }
+
+    TreeItem findItem(String value, TreeItem[] items) {
+        for (int i = 0; i < items.length; i++) {
+            TreeItem item = items[i];
+            if (item.getText().equals(value)) return item;
+            item = findItem(value, item.getItems());
+            if (item !is null) return item;
+        }
+        return null;
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    String getTabText () {
+        return "Tree";
+    }
+
+    void packColumns (Tree tree) {
+        if (multipleColumns.getSelection()) {
+            int columnCount = tree.getColumnCount();
+            for (int i = 0; i < columnCount; i++) {
+                TreeColumn treeColumn = tree.getColumn(i);
+                treeColumn.pack();
+            }
+        }
+    }
+
+    /**
+     * Sets the moveable columns state of the "Example" widgets.
+     */
+    void setColumnsMoveable () {
+        bool selection = moveableColumns.getSelection();
+        TreeColumn[] columns1 = tree1.getColumns();
+        for (int i = 0; i < columns1.length; i++) {
+            columns1[i].setMoveable(selection);
+        }
+        TreeColumn[] columns2 = tree2.getColumns();
+        for (int i = 0; i < columns2.length; i++) {
+            columns2[i].setMoveable(selection);
+        }
+    }
+
+    /**
+     * Sets the resizable columns state of the "Example" widgets.
+     */
+    void setColumnsResizable () {
+        bool selection = resizableColumns.getSelection();
+        TreeColumn[] columns1 = tree1.getColumns();
+        for (int i = 0; i < columns1.length; i++) {
+            columns1[i].setResizable(selection);
+        }
+        TreeColumn[] columns2 = tree2.getColumns();
+        for (int i = 0; i < columns2.length; i++) {
+            columns2[i].setResizable(selection);
+        }
+    }
+
+    /**
+     * Sets the foreground color, background color, and font
+     * of the "Example" widgets to their default settings.
+     * Also sets foreground and background color of the Node 1
+     * TreeItems to default settings.
+     */
+    void resetColorsAndFonts () {
+        super.resetColorsAndFonts ();
+        Color oldColor = itemForegroundColor;
+        itemForegroundColor = null;
+        setItemForeground ();
+        if (oldColor !is null) oldColor.dispose();
+        oldColor = itemBackgroundColor;
+        itemBackgroundColor = null;
+        setItemBackground ();
+        if (oldColor !is null) oldColor.dispose();
+        Font oldFont = font;
+        itemFont = null;
+        setItemFont ();
+        if (oldFont !is null) oldFont.dispose();
+        oldColor = cellForegroundColor;
+        cellForegroundColor = null;
+        setCellForeground ();
+        if (oldColor !is null) oldColor.dispose();
+        oldColor = cellBackgroundColor;
+        cellBackgroundColor = null;
+        setCellBackground ();
+        if (oldColor !is null) oldColor.dispose();
+        oldFont = font;
+        cellFont = null;
+        setCellFont ();
+        if (oldFont !is null) oldFont.dispose();
+    }
+
+    /**
+     * Sets the state of the "Example" widgets.
+     */
+    void setExampleWidgetState () {
+        setItemBackground ();
+        setItemForeground ();
+        setItemFont ();
+        setCellBackground ();
+        setCellForeground ();
+        setCellFont ();
+        if (!instance.startup) {
+            setColumnsMoveable ();
+            setColumnsResizable ();
+            setWidgetHeaderVisible ();
+            setWidgetSortIndicator ();
+            setWidgetLinesVisible ();
+        }
+        super.setExampleWidgetState ();
+        checkButton.setSelection ((tree1.getStyle () & DWT.CHECK) !is 0);
+        checkButton.setSelection ((tree2.getStyle () & DWT.CHECK) !is 0);
+        fullSelectionButton.setSelection ((tree1.getStyle () & DWT.FULL_SELECTION) !is 0);
+        fullSelectionButton.setSelection ((tree2.getStyle () & DWT.FULL_SELECTION) !is 0);
+        try {
+            TreeColumn column = tree1.getColumn(0);
+            moveableColumns.setSelection (column.getMoveable());
+            resizableColumns.setSelection (column.getResizable());
+        } catch (IllegalArgumentException ex) {}
+        headerVisibleButton.setSelection (tree1.getHeaderVisible());
+        linesVisibleButton.setSelection (tree1.getLinesVisible());
+    }
+
+    /**
+     * Sets the background color of the Node 1 TreeItems in column 1.
+     */
+    void setCellBackground () {
+        if (!instance.startup) {
+            textNode1.setBackground (1, cellBackgroundColor);
+            imageNode1.setBackground (1, cellBackgroundColor);
+        }
+        /* Set the background color item's image to match the background color of the cell. */
+        Color color = cellBackgroundColor;
+        if (color is null) color = textNode1.getBackground (1);
+        TableItem item = colorAndFontTable.getItem(CELL_BACKGROUND_COLOR);
+        Image oldImage = item.getImage();
+        if (oldImage !is null) oldImage.dispose();
+        item.setImage (colorImage(color));
+    }
+
+    /**
+     * Sets the foreground color of the Node 1 TreeItems in column 1.
+     */
+    void setCellForeground () {
+        if (!instance.startup) {
+            textNode1.setForeground (1, cellForegroundColor);
+            imageNode1.setForeground (1, cellForegroundColor);
+        }
+        /* Set the foreground color item's image to match the foreground color of the cell. */
+        Color color = cellForegroundColor;
+        if (color is null) color = textNode1.getForeground (1);
+        TableItem item = colorAndFontTable.getItem(CELL_FOREGROUND_COLOR);
+        Image oldImage = item.getImage();
+        if (oldImage !is null) oldImage.dispose();
+        item.setImage (colorImage(color));
+    }
+
+    /**
+     * Sets the font of the Node 1 TreeItems in column 1.
+     */
+    void setCellFont () {
+        if (!instance.startup) {
+            textNode1.setFont (1, cellFont);
+            imageNode1.setFont (1, cellFont);
+        }
+        /* Set the font item's image to match the font of the item. */
+        Font ft = cellFont;
+        if (ft is null) ft = textNode1.getFont (1);
+        TableItem item = colorAndFontTable.getItem(CELL_FONT);
+        Image oldImage = item.getImage();
+        if (oldImage !is null) oldImage.dispose();
+        item.setImage (fontImage(ft));
+        item.setFont(ft);
+        colorAndFontTable.layout ();
+    }
+
+    /**
+     * Sets the background color of the Node 1 TreeItems.
+     */
+    void setItemBackground () {
+        if (!instance.startup) {
+            textNode1.setBackground (itemBackgroundColor);
+            imageNode1.setBackground (itemBackgroundColor);
+        }
+        /* Set the background button's color to match the background color of the item. */
+        Color color = itemBackgroundColor;
+        if (color is null) color = textNode1.getBackground ();
+        TableItem item = colorAndFontTable.getItem(ITEM_BACKGROUND_COLOR);
+        Image oldImage = item.getImage();
+        if (oldImage !is null) oldImage.dispose();
+        item.setImage (colorImage(color));
+    }
+
+    /**
+     * Sets the foreground color of the Node 1 TreeItems.
+     */
+    void setItemForeground () {
+        if (!instance.startup) {
+            textNode1.setForeground (itemForegroundColor);
+            imageNode1.setForeground (itemForegroundColor);
+        }
+        /* Set the foreground button's color to match the foreground color of the item. */
+        Color color = itemForegroundColor;
+        if (color is null) color = textNode1.getForeground ();
+        TableItem item = colorAndFontTable.getItem(ITEM_FOREGROUND_COLOR);
+        Image oldImage = item.getImage();
+        if (oldImage !is null) oldImage.dispose();
+        item.setImage (colorImage(color));
+    }
+
+    /**
+     * Sets the font of the Node 1 TreeItems.
+     */
+    void setItemFont () {
+        if (!instance.startup) {
+            textNode1.setFont (itemFont);
+            imageNode1.setFont (itemFont);
+        }
+        /* Set the font item's image to match the font of the item. */
+        Font ft = itemFont;
+        if (ft is null) ft = textNode1.getFont ();
+        TableItem item = colorAndFontTable.getItem(ITEM_FONT);
+        Image oldImage = item.getImage();
+        if (oldImage !is null) oldImage.dispose();
+        item.setImage (fontImage(ft));
+        item.setFont(ft);
+        colorAndFontTable.layout ();
+    }
+
+    /**
+     * Sets the header visible state of the "Example" widgets.
+     */
+    void setWidgetHeaderVisible () {
+        tree1.setHeaderVisible (headerVisibleButton.getSelection ());
+        tree2.setHeaderVisible (headerVisibleButton.getSelection ());
+    }
+
+    /**
+     * Sets the sort indicator state of the "Example" widgets.
+     */
+    void setWidgetSortIndicator () {
+        if (sortIndicatorButton.getSelection ()) {
+            initializeSortState (tree1);
+            initializeSortState (tree2);
+        } else {
+            resetSortState (tree1);
+            resetSortState (tree2);
+        }
+    }
+
+    /**
+     * Sets the initial sort indicator state and adds a listener
+     * to cycle through sort states and columns.
+     */
+    void initializeSortState (final Tree tree) {
+        /* Reset to known state: 'down' on column 0. */
+        tree.setSortDirection (DWT.DOWN);
+        TreeColumn [] columns = tree.getColumns();
+        for (int i = 0; i < columns.length; i++) {
+            TreeColumn column = columns[i];
+            if (i is 0) tree.setSortColumn(column);
+            SelectionListener listener = new SelectionAdapter() {
+                public void widgetSelected(SelectionEvent e) {
+                    int sortDirection = DWT.DOWN;
+                    if (e.widget is tree.getSortColumn()) {
+                        /* If the sort column hasn't changed, cycle down -> up -> none. */
+                        switch (tree.getSortDirection ()) {
+                        case DWT.DOWN: sortDirection = DWT.UP; break;
+                        case DWT.UP: sortDirection = DWT.NONE; break;
+                        }
+                    } else {
+                        tree.setSortColumn((TreeColumn)e.widget);
+                    }
+                    tree.setSortDirection (sortDirection);
+                }
+            };
+            column.addSelectionListener(listener);
+            column.setData("SortListener", listener);   //$NON-NLS-1$
+        }
+    }
+
+    void resetSortState (final Tree tree) {
+        tree.setSortDirection (DWT.NONE);
+        TreeColumn [] columns = tree.getColumns();
+        for (int i = 0; i < columns.length; i++) {
+            SelectionListener listener = (SelectionListener)columns[i].getData("SortListener"); //$NON-NLS-1$
+            if (listener !is null) columns[i].removeSelectionListener(listener);
+        }
+    }
+
+    /**
+     * Sets the lines visible state of the "Example" widgets.
+     */
+    void setWidgetLinesVisible () {
+        tree1.setLinesVisible (linesVisibleButton.getSelection ());
+        tree2.setLinesVisible (linesVisibleButton.getSelection ());
+    }
+
+    protected void specialPopupMenuItems(Menu menu, Event event) {
+        MenuItem item = new MenuItem(menu, DWT.PUSH);
+        item.setText("getItem(Point) on mouse coordinates");
+        final Tree t = (Tree) event.widget;
+        menuMouseCoords = t.toControl(new Point(event.x, event.y));
+        item.addSelectionListener(new SelectionAdapter() {
+            public void widgetSelected(SelectionEvent e) {
+                eventConsole.append ("getItem(Point(" + menuMouseCoords + ")) returned: " + t.getItem(menuMouseCoords));
+                eventConsole.append ("\n");
+            };
+        });
+    }
+}