changeset 0:052c3aebd1d3

initial import
author Frank Benoit <benoit@tionex.de>
date Fri, 01 Feb 2008 21:46:26 +0100
parents
children e1f82d47c62c
files .hgignore dsss.conf dwtexamples/addressbook/AddressBook.d dwtexamples/addressbook/DataEntryDialog.d dwtexamples/addressbook/FindListener.d dwtexamples/addressbook/SearchDialog.d dwtexamples/addressbook/addressbook.properties 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 dwtexamples/controlexample/backgroundImage.png dwtexamples/controlexample/bold.bmp dwtexamples/controlexample/bold_mask.bmp dwtexamples/controlexample/closedFolder.gif dwtexamples/controlexample/controlexample.properties dwtexamples/controlexample/italic.bmp dwtexamples/controlexample/italic_mask.bmp dwtexamples/controlexample/openFolder.gif dwtexamples/controlexample/parentBackgroundImage.png dwtexamples/controlexample/red.bmp dwtexamples/controlexample/red_mask.bmp dwtexamples/controlexample/strikeout.bmp dwtexamples/controlexample/strikeout_mask.bmp dwtexamples/controlexample/target.gif dwtexamples/controlexample/underline.bmp dwtexamples/controlexample/underline_mask.bmp dwtexamples/controlexample/yellow.bmp dwtexamples/controlexample/yellow_mask.bmp dwtexamples/helloworld/HelloWorld1.d dwtexamples/helloworld/HelloWorld2.d dwtexamples/helloworld/HelloWorld3.d dwtexamples/helloworld/HelloWorld4.d dwtexamples/helloworld/HelloWorld5.d dwtexamples/helloworld/helloworld.properties dwtexamples/simple.d dwtexamples/test.d
diffstat 68 files changed, 12973 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.hgignore	Fri Feb 01 21:46:26 2008 +0100
@@ -0,0 +1,21 @@
+syntax: glob
+
+*.a
+*.swp
+
+syntax: regexp
+
+^dsss_objs
+^dsss.last
+^dsss_imports
+^dwtexamples/simple$
+^dwtexamples/helloworld/HelloWorld1$
+^dwtexamples/helloworld/HelloWorld2$
+^dwtexamples/helloworld/HelloWorld3$
+^dwtexamples/helloworld/HelloWorld4$
+^dwtexamples/helloworld/HelloWorld5$
+^dwtexamples/addressbook/AddressBook$
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dsss.conf	Fri Feb 01 21:46:26 2008 +0100
@@ -0,0 +1,25 @@
+
+[*]
+buildflags+=-g -gc
+
+[dwtexamples/simple.d]
+[dwtexamples/helloworld/HelloWorld1.d]
+[dwtexamples/helloworld/HelloWorld2.d]
+[dwtexamples/helloworld/HelloWorld3.d]
+[dwtexamples/helloworld/HelloWorld4.d]
+[dwtexamples/helloworld/HelloWorld5.d]
+
+
+[dwtexamples/addressbook/AddressBook.d]
+buildflags+=-g -gc
+buildflags+=-Jdwtexamples/addressbook
+
+[dwtexamples/controlexample/ControlExample.d]
+buildflags+=-g -gc
+buildflags+=-Jdwtexamples/controlexample
+buildflags+=-version=CONTROL_EXAMPLE_MAIN
+
+[dwtexamples/controlexample/CustomControlExample.d]
+buildflags+=-g -gc
+buildflags+=-Jdwtexamples/controlexample
+buildflags+=-version=CUSTOM_CONTROL_EXAMPLE_MAIN
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/addressbook/AddressBook.d	Fri Feb 01 21:46:26 2008 +0100
@@ -0,0 +1,908 @@
+/*******************************************************************************
+ * 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.addressbook.AddressBook;
+
+import dwt.DWT;
+import dwt.events.MenuAdapter;
+import dwt.events.MenuEvent;
+import dwt.events.SelectionAdapter;
+import dwt.events.SelectionEvent;
+import dwt.events.ShellAdapter;
+import dwt.events.ShellEvent;
+import dwt.graphics.Cursor;
+import dwt.layout.FillLayout;
+import dwt.widgets.Display;
+import dwt.widgets.FileDialog;
+import dwt.widgets.Menu;
+import dwt.widgets.MenuItem;
+import dwt.widgets.MessageBox;
+import dwt.widgets.Shell;
+import dwt.widgets.Table;
+import dwt.widgets.TableColumn;
+import dwt.widgets.TableItem;
+
+import dwtexamples.addressbook.SearchDialog;
+import dwtexamples.addressbook.DataEntryDialog;
+import dwtexamples.addressbook.FindListener;
+
+import dwt.dwthelper.ResourceBundle;
+
+import tango.core.Exception;
+import tango.io.FilePath;
+import tango.io.File;
+import tango.io.FileConduit;
+import tango.io.stream.FileStream;
+import TextUtil = tango.text.Util;
+import Unicode = tango.text.Unicode;
+
+/*** Linker workaround start ***/
+import tango.io.Stdout;
+import tango.math.Math;
+import tango.text.convert.Format;
+import tango.util.Convert;
+import tango.util.PathUtil;
+/*** Linker workaround end ***/
+
+void main() {
+    Display display = new Display();
+    auto application = new AddressBook();
+    Shell shell = application.open(display);
+    while(!shell.isDisposed()){
+        if(!display.readAndDispatch()){
+            display.sleep();
+        }
+    }
+    display.dispose();
+}
+
+/**
+ * AddressBookExample is an example that uses <code>org.eclipse.swt</code>
+ * libraries to implement a simple address book.  This application has
+ * save, load, sorting, and searching functions common
+ * to basic address books.
+ */
+public class AddressBook {
+
+    private static ResourceBundle resAddressBook;
+    private static const char[] resAddressBookData = cast(char[]) import( "addressbook.properties" );
+    private Shell shell;
+
+    private Table table;
+    private SearchDialog searchDialog;
+
+    private FilePath file;
+    private bool isModified;
+
+    private char[][] copyBuffer;
+
+    private int lastSortColumn= -1;
+
+    private static const char[] DELIMITER = "\t";
+    private static char[][] columnNames;
+
+public this(){
+    if( resAddressBook is null ){
+        resAddressBook = ResourceBundle.getBundleFromData(resAddressBookData);
+        columnNames = [
+            resAddressBook.getString("Last_name"),
+            resAddressBook.getString("First_name"),
+            resAddressBook.getString("Business_phone"),
+            resAddressBook.getString("Home_phone"),
+            resAddressBook.getString("Email"),
+            resAddressBook.getString("Fax") ];
+    }
+}
+
+
+public Shell open(Display display) {
+    shell = new Shell(display);
+    shell.setLayout(new FillLayout());
+
+    shell.addShellListener( new class() ShellAdapter {
+        public void shellClosed(ShellEvent e) {
+            e.doit = closeAddressBook();
+        }
+    });
+
+    createMenuBar();
+
+    searchDialog = new SearchDialog(shell);
+    searchDialog.setSearchAreaNames(columnNames);
+    searchDialog.setSearchAreaLabel(resAddressBook.getString("Column"));
+    searchDialog.addFindListener(new class() FindListener {
+        public bool find() {
+            return findEntry();
+        }
+    });
+
+    table = new Table(shell, DWT.SINGLE | DWT.BORDER | DWT.FULL_SELECTION);
+    table.setHeaderVisible(true);
+    table.setMenu(createPopUpMenu());
+    table.addSelectionListener(new class() SelectionAdapter {
+        public void widgetDefaultSelected(SelectionEvent e) {
+            TableItem[] items = table.getSelection();
+            if (items.length > 0) editEntry(items[0]);
+        }
+    });
+    for(int i = 0; i < columnNames.length; i++) {
+        TableColumn column = new TableColumn(table, DWT.NONE);
+        column.setText(columnNames[i]);
+        column.setWidth(150);
+        int columnIndex = i;
+        column.addSelectionListener(new class(columnIndex) SelectionAdapter {
+            int c;
+            this( int c ){ this.c = c; }
+            public void widgetSelected(SelectionEvent e) {
+                sort(c);
+            }
+        });
+    }
+
+    newAddressBook();
+
+    shell.setSize(table.computeSize(DWT.DEFAULT, DWT.DEFAULT).x, 300);
+    shell.open();
+    return shell;
+}
+
+private bool closeAddressBook() {
+    if(isModified) {
+        //ask user if they want to save current address book
+        MessageBox box = new MessageBox(shell, DWT.ICON_WARNING | DWT.YES | DWT.NO | DWT.CANCEL);
+        box.setText(shell.getText());
+        box.setMessage(resAddressBook.getString("Close_save"));
+
+        int choice = box.open();
+        if(choice is DWT.CANCEL) {
+            return false;
+        } else if(choice is DWT.YES) {
+            if (!save()) return false;
+        }
+    }
+
+    TableItem[] items = table.getItems();
+    for (int i = 0; i < items.length; i ++) {
+        items[i].dispose();
+    }
+
+    return true;
+}
+/**
+ * Creates the menu at the top of the shell where most
+ * of the programs functionality is accessed.
+ *
+ * @return      The <code>Menu</code> widget that was created
+ */
+private Menu createMenuBar() {
+    Menu menuBar = new Menu(shell, DWT.BAR);
+    shell.setMenuBar(menuBar);
+
+    //create each header and subMenu for the menuBar
+    createFileMenu(menuBar);
+    createEditMenu(menuBar);
+    createSearchMenu(menuBar);
+    createHelpMenu(menuBar);
+
+    return menuBar;
+}
+
+/**
+ * Converts an encoded <code>char[]</code> to a char[] array representing a table entry.
+ */
+private char[][] decodeLine(char[] line) {
+    char[][] toks = TextUtil.split( line, DELIMITER );
+    while( toks.length < table.getColumnCount() ){
+        toks ~= "";
+    }
+    return toks[ 0 .. table.getColumnCount() ];
+}
+private void displayError(char[] msg) {
+    MessageBox box = new MessageBox(shell, DWT.ICON_ERROR);
+    box.setMessage(msg);
+    box.open();
+}
+private void editEntry(TableItem item) {
+    DataEntryDialog dialog = new DataEntryDialog(shell);
+    dialog.setLabels(columnNames);
+    char[][] values = new char[][table.getColumnCount()];
+    for (int i = 0; i < values.length; i++) {
+        values[i] = item.getText(i);
+    }
+    dialog.setValues(values);
+    values = dialog.open();
+    if (values !is null) {
+        item.setText(values);
+        isModified = true;
+    }
+}
+private char[] encodeLine(char[][] tableItems) {
+    char[] line = "";
+    for (int i = 0; i < tableItems.length - 1; i++) {
+        line ~= tableItems[i] ~ DELIMITER;
+    }
+    line ~= tableItems[tableItems.length - 1] ~ "\n";
+
+    return line;
+}
+private bool findEntry() {
+    Cursor waitCursor = new Cursor(shell.getDisplay(), DWT.CURSOR_WAIT);
+    shell.setCursor(waitCursor);
+
+    bool matchCase = searchDialog.getMatchCase();
+    bool matchWord = searchDialog.getMatchWord();
+    char[] searchString = searchDialog.getSearchString();
+    int column = searchDialog.getSelectedSearchArea();
+
+    searchString = matchCase ? searchString : Unicode.toLower( searchString );
+
+    bool found = false;
+    if (searchDialog.getSearchDown()) {
+        for(int i = table.getSelectionIndex() + 1; i < table.getItemCount(); i++) {
+            found = findMatch(searchString, table.getItem(i), column, matchWord, matchCase);
+            if ( found ){
+                table.setSelection(i);
+                break;
+            }
+        }
+    } else {
+        for(int i = table.getSelectionIndex() - 1; i > -1; i--) {
+            found = findMatch(searchString, table.getItem(i), column, matchWord, matchCase);
+            if ( found ){
+                table.setSelection(i);
+                break;
+            }
+        }
+    }
+
+    shell.setCursor(cast(Cursor)null);
+    waitCursor.dispose();
+
+    return found;
+}
+private bool findMatch(char[] searchString, TableItem item, int column, bool matchWord, bool matchCase) {
+
+    char[] tableText = matchCase ? item.getText(column) : Unicode.toLower( item.getText(column));
+    if (matchWord) {
+        if (tableText !is null && tableText==searchString) {
+            return true;
+        }
+
+    } else {
+        if(tableText!is null && TextUtil.containsPattern( tableText, searchString)) {
+            return true;
+        }
+    }
+    return false;
+}
+private void newAddressBook() {
+    shell.setText(resAddressBook.getString("Title_bar") ~ resAddressBook.getString("New_title"));
+    *(cast(Object*)&file) = null;
+    ///cast(Object)file = null;
+    isModified = false;
+}
+private void newEntry() {
+    DataEntryDialog dialog = new DataEntryDialog(shell);
+    dialog.setLabels(columnNames);
+    char[][] data = dialog.open();
+    if (data !is null) {
+        TableItem item = new TableItem(table, DWT.NONE);
+        item.setText(data);
+        isModified = true;
+    }
+}
+
+private void openAddressBook() {
+    FileDialog fileDialog = new FileDialog(shell, DWT.OPEN);
+
+    fileDialog.setFilterExtensions(["*.adr;", "*.*"]);
+    fileDialog.setFilterNames([
+        resAddressBook.getString("Book_filter_name") ~ " (*.adr)",
+        resAddressBook.getString("All_filter_name") ~ " (*.*)"]);
+    char[] name = fileDialog.open();
+
+    if(name is null) return;
+    FilePath file = new FilePath(name);
+    if (!file.exists()) {
+        displayError(resAddressBook.getString("File")~file.toString()~" "~resAddressBook.getString("Does_not_exist"));
+        return;
+    }
+
+    Cursor waitCursor = new Cursor(shell.getDisplay(), DWT.CURSOR_WAIT);
+    shell.setCursor(waitCursor);
+
+    char[][] data;
+    try {
+        scope ioFile = new File (file);
+        data = TextUtil.splitLines (cast(char[]) ioFile.read);
+    } catch (IOException e ) {
+        displayError(resAddressBook.getString("IO_error_read") ~ "\n" ~ file.toString());
+        return;
+    } finally {
+
+        shell.setCursor(cast(Cursor)null);
+        waitCursor.dispose();
+    }
+
+    char[][][] tableInfo = new char[][][](data.length,table.getColumnCount());
+    foreach( idx, line; data ){
+        char[][] linetoks = decodeLine(line);
+        tableInfo[ idx ] = linetoks;
+    }
+    /+
+    int writeIndex = 0;
+    for (int i = 0; i < data.length; i++) {
+        char[][] line = decodeLine(data[i]);
+        if (line !is null) tableInfo[writeIndex++] = line;
+    }
+    if (writeIndex !is data.length) {
+        char[][][] result = new char[][writeIndex][table.getColumnCount()];
+        System.arraycopy(tableInfo, 0, result, 0, writeIndex);
+        tableInfo = result;
+    }
+    +/
+    tango.core.Array.sort( tableInfo, new RowComparator(0));
+
+    for (int i = 0; i < tableInfo.length; i++) {
+        TableItem item = new TableItem(table, DWT.NONE);
+        item.setText(tableInfo[i]);
+    }
+    shell.setText(resAddressBook.getString("Title_bar")~fileDialog.getFileName());
+    isModified = false;
+    this.file = file;
+}
+private bool save() {
+    if(file is null) return saveAs();
+
+    Cursor waitCursor = new Cursor(shell.getDisplay(), DWT.CURSOR_WAIT);
+    shell.setCursor(waitCursor);
+
+    TableItem[] items = table.getItems();
+    char[][] lines = new char[][items.length];
+    for(int i = 0; i < items.length; i++) {
+        char[][] itemText = new char[][table.getColumnCount()];
+        for (int j = 0; j < itemText.length; j++) {
+            itemText[j] = items[i].getText(j);
+        }
+        lines[i] = encodeLine(itemText);
+    }
+
+    FileOutput fileOutput;
+    bool result = true;
+    try {
+        fileOutput = new FileOutput( file.toString );
+        for (int i = 0; i < lines.length; i++) {
+            fileOutput.write(lines[i]);
+        }
+    } catch(IOException e ) {
+        displayError(resAddressBook.getString("IO_error_write") ~ "\n" ~ file.toString());
+        result = false;
+    } catch(TracedException e2 ) {
+        displayError(resAddressBook.getString("error_write") ~ "\n" ~ e2.toString());
+        result = false;
+    } finally {
+        shell.setCursor(null);
+        waitCursor.dispose();
+
+    }
+
+    if(fileOutput !is null) {
+        try {
+            fileOutput.close();
+        } catch(IOException e) {
+            displayError(resAddressBook.getString("IO_error_close") ~ "\n" ~ file.toString());
+            return false;
+        }
+    }
+    if( !result ){
+        return false;
+    }
+
+    shell.setText(resAddressBook.getString("Title_bar")~file.toString());
+    isModified = false;
+    return true;
+}
+private bool saveAs() {
+
+    FileDialog saveDialog = new FileDialog(shell, DWT.SAVE);
+    saveDialog.setFilterExtensions(["*.adr;",  "*.*"]);
+    saveDialog.setFilterNames(["Address Books (*.adr)", "All Files "]);
+
+    saveDialog.open();
+    char[] name = saveDialog.getFileName();
+    if(!name) return false;
+
+    if( TextUtil.locatePatternPrior( name, ".adr" ) !is name.length - 4) {
+        name ~= ".adr";
+    }
+
+    FilePath file = new FilePath(saveDialog.getFilterPath() );
+    file.append( name );
+    if(file.exists()) {
+        MessageBox box = new MessageBox(shell, DWT.ICON_WARNING | DWT.YES | DWT.NO);
+        box.setText(resAddressBook.getString("Save_as_title"));
+        box.setMessage(resAddressBook.getString("File") ~ file.toString()~" "~resAddressBook.getString("Query_overwrite"));
+        if(box.open() !is DWT.YES) {
+            return false;
+        }
+    }
+    this.file = file;
+    return save();
+}
+private void sort(int column) {
+    if(table.getItemCount() <= 1) return;
+
+    TableItem[] items = table.getItems();
+    char[][][] data = new char[][][](items.length, table.getColumnCount());
+    for(int i = 0; i < items.length; i++) {
+        for(int j = 0; j < table.getColumnCount(); j++) {
+            data[i][j] = items[i].getText(j);
+        }
+    }
+
+    tango.core.Array.sort(data, new RowComparator(column));
+
+    if (lastSortColumn !is column) {
+        table.setSortColumn(table.getColumn(column));
+        table.setSortDirection(DWT.DOWN);
+        for (int i = 0; i < data.length; i++) {
+            items[i].setText(data[i]);
+        }
+        lastSortColumn = column;
+    } else {
+        // reverse order if the current column is selected again
+        table.setSortDirection(DWT.UP);
+        int j = data.length -1;
+        for (int i = 0; i < data.length; i++) {
+            items[i].setText(data[j--]);
+        }
+        lastSortColumn = -1;
+    }
+
+}
+/**
+ * Creates all the items located in the File submenu and
+ * associate all the menu items with their appropriate
+ * functions.
+ *
+ * @param   menuBar Menu
+ *              the <code>Menu</code> that file contain
+ *              the File submenu.
+ */
+private void createFileMenu(Menu menuBar) {
+    //File menu.
+    MenuItem item = new MenuItem(menuBar, DWT.CASCADE);
+    item.setText(resAddressBook.getString("File_menu_title"));
+    Menu menu = new Menu(shell, DWT.DROP_DOWN);
+    item.setMenu(menu);
+    /**
+     * Adds a listener to handle enabling and disabling
+     * some items in the Edit submenu.
+     */
+    menu.addMenuListener(new class() MenuAdapter {
+        public void menuShown(MenuEvent e) {
+            Menu menu = cast(Menu)e.widget;
+            MenuItem[] items = menu.getItems();
+            items[1].setEnabled(table.getSelectionCount() !is 0); // edit contact
+            items[5].setEnabled((file !is null) && isModified); // save
+            items[6].setEnabled(table.getItemCount() !is 0); // save as
+        }
+    });
+
+
+    //File -> New Contact
+    MenuItem subItem = new MenuItem(menu, DWT.NONE);
+    subItem.setText(resAddressBook.getString("New_contact"));
+    subItem.setAccelerator(DWT.MOD1 + 'N');
+    subItem.addSelectionListener(new class() SelectionAdapter {
+        public void widgetSelected(SelectionEvent e) {
+            newEntry();
+        }
+    });
+    subItem = new MenuItem(menu, DWT.NONE);
+    subItem.setText(resAddressBook.getString("Edit_contact"));
+    subItem.setAccelerator(DWT.MOD1 + 'E');
+    subItem.addSelectionListener(new class() SelectionAdapter {
+        public void widgetSelected(SelectionEvent e) {
+            TableItem[] items = table.getSelection();
+            if (items.length is 0) return;
+            editEntry(items[0]);
+        }
+    });
+
+
+    new MenuItem(menu, DWT.SEPARATOR);
+
+    //File -> New Address Book
+    subItem = new MenuItem(menu, DWT.NONE);
+    subItem.setText(resAddressBook.getString("New_address_book"));
+    subItem.setAccelerator(DWT.MOD1 + 'B');
+    subItem.addSelectionListener(new class() SelectionAdapter {
+        public void widgetSelected(SelectionEvent e) {
+            if (closeAddressBook()) {
+                newAddressBook();
+            }
+        }
+    });
+
+    //File -> Open
+    subItem = new MenuItem(menu, DWT.NONE);
+    subItem.setText(resAddressBook.getString("Open_address_book"));
+    subItem.setAccelerator(DWT.MOD1 + 'O');
+    subItem.addSelectionListener(new class() SelectionAdapter {
+        public void widgetSelected(SelectionEvent e) {
+            if (closeAddressBook()) {
+                openAddressBook();
+            }
+        }
+    });
+
+    //File -> Save.
+    subItem = new MenuItem(menu, DWT.NONE);
+    subItem.setText(resAddressBook.getString("Save_address_book"));
+    subItem.setAccelerator(DWT.MOD1 + 'S');
+    subItem.addSelectionListener(new class() SelectionAdapter {
+        public void widgetSelected(SelectionEvent e) {
+            save();
+        }
+    });
+
+    //File -> Save As.
+    subItem = new MenuItem(menu, DWT.NONE);
+    subItem.setText(resAddressBook.getString("Save_book_as"));
+    subItem.setAccelerator(DWT.MOD1 + 'A');
+    subItem.addSelectionListener(new class() SelectionAdapter {
+        public void widgetSelected(SelectionEvent e) {
+            saveAs();
+        }
+    });
+
+
+    new MenuItem(menu, DWT.SEPARATOR);
+
+    //File -> Exit.
+    subItem = new MenuItem(menu, DWT.NONE);
+    subItem.setText(resAddressBook.getString("Exit"));
+    subItem.addSelectionListener(new class() SelectionAdapter {
+        public void widgetSelected(SelectionEvent e) {
+            shell.close();
+        }
+    });
+}
+
+/**
+ * Creates all the items located in the Edit submenu and
+ * associate all the menu items with their appropriate
+ * functions.
+ *
+ * @param   menuBar Menu
+ *              the <code>Menu</code> that file contain
+ *              the Edit submenu.
+ *
+ * @see #createSortMenu()
+ */
+private MenuItem createEditMenu(Menu menuBar) {
+    //Edit menu.
+    MenuItem item = new MenuItem(menuBar, DWT.CASCADE);
+    item.setText(resAddressBook.getString("Edit_menu_title"));
+    Menu menu = new Menu(shell, DWT.DROP_DOWN);
+    item.setMenu(menu);
+
+    /**
+     * Add a listener to handle enabling and disabling
+     * some items in the Edit submenu.
+     */
+    menu.addMenuListener(new class() MenuAdapter {
+        public void menuShown(MenuEvent e) {
+            Menu menu = cast(Menu)e.widget;
+            MenuItem[] items = menu.getItems();
+            int count = table.getSelectionCount();
+            items[0].setEnabled(count !is 0); // edit
+            items[1].setEnabled(count !is 0); // copy
+            items[2].setEnabled(copyBuffer !is null); // paste
+            items[3].setEnabled(count !is 0); // delete
+            items[5].setEnabled(table.getItemCount() !is 0); // sort
+        }
+    });
+
+    //Edit -> Edit
+    MenuItem subItem = new MenuItem(menu, DWT.PUSH);
+    subItem.setText(resAddressBook.getString("Edit"));
+    subItem.setAccelerator(DWT.MOD1 + 'E');
+    subItem.addSelectionListener(new class() SelectionAdapter {
+        public void widgetSelected(SelectionEvent e) {
+            TableItem[] items = table.getSelection();
+            if (items.length is 0) return;
+            editEntry(items[0]);
+        }
+    });
+
+    //Edit -> Copy
+    subItem = new MenuItem(menu, DWT.NONE);
+    subItem.setText(resAddressBook.getString("Copy"));
+    subItem.setAccelerator(DWT.MOD1 + 'C');
+    subItem.addSelectionListener(new class() SelectionAdapter {
+        public void widgetSelected(SelectionEvent e) {
+            TableItem[] items = table.getSelection();
+            if (items.length is 0) return;
+            copyBuffer = new char[][table.getColumnCount()];
+            for (int i = 0; i < copyBuffer.length; i++) {
+                copyBuffer[i] = items[0].getText(i);
+            }
+        }
+    });
+
+    //Edit -> Paste
+    subItem = new MenuItem(menu, DWT.NONE);
+    subItem.setText(resAddressBook.getString("Paste"));
+    subItem.setAccelerator(DWT.MOD1 + 'V');
+    subItem.addSelectionListener(new class() SelectionAdapter {
+        public void widgetSelected(SelectionEvent e) {
+            if (copyBuffer is null) return;
+            TableItem item = new TableItem(table, DWT.NONE);
+            item.setText(copyBuffer);
+            isModified = true;
+        }
+    });
+
+    //Edit -> Delete
+    subItem = new MenuItem(menu, DWT.NONE);
+    subItem.setText(resAddressBook.getString("Delete"));
+    subItem.addSelectionListener(new class() SelectionAdapter {
+        public void widgetSelected(SelectionEvent e) {
+            TableItem[] items = table.getSelection();
+            if (items.length is 0) return;
+            items[0].dispose();
+            isModified = true;      }
+    });
+
+    new MenuItem(menu, DWT.SEPARATOR);
+
+    //Edit -> Sort(Cascade)
+    subItem = new MenuItem(menu, DWT.CASCADE);
+    subItem.setText(resAddressBook.getString("Sort"));
+    Menu submenu = createSortMenu();
+    subItem.setMenu(submenu);
+
+    return item;
+
+}
+
+/**
+ * Creates all the items located in the Sort cascading submenu and
+ * associate all the menu items with their appropriate
+ * functions.
+ *
+ * @return  Menu
+ *          The cascading menu with all the sort menu items on it.
+ */
+private Menu createSortMenu() {
+    Menu submenu = new Menu(shell, DWT.DROP_DOWN);
+    MenuItem subitem;
+    for(int i = 0; i < columnNames.length; i++) {
+        subitem = new MenuItem (submenu, DWT.NONE);
+        subitem.setText(columnNames [i]);
+        int column = i;
+        subitem.addSelectionListener(new class(column) SelectionAdapter {
+            int c;
+            this(int c){ this.c = c; }
+            public void widgetSelected(SelectionEvent e) {
+                sort(c);
+            }
+        });
+    }
+
+    return submenu;
+}
+
+/**
+ * Creates all the items located in the Search submenu and
+ * associate all the menu items with their appropriate
+ * functions.
+ *
+ * @param   menuBar Menu
+ *              the <code>Menu</code> that file contain
+ *              the Search submenu.
+ */
+private void createSearchMenu(Menu menuBar) {
+    //Search menu.
+    MenuItem item = new MenuItem(menuBar, DWT.CASCADE);
+    item.setText(resAddressBook.getString("Search_menu_title"));
+    Menu searchMenu = new Menu(shell, DWT.DROP_DOWN);
+    item.setMenu(searchMenu);
+
+    //Search -> Find...
+    item = new MenuItem(searchMenu, DWT.NONE);
+    item.setText(resAddressBook.getString("Find"));
+    item.setAccelerator(DWT.MOD1 + 'F');
+    item.addSelectionListener(new class() SelectionAdapter {
+        public void widgetSelected(SelectionEvent e) {
+            searchDialog.setMatchCase(false);
+            searchDialog.setMatchWord(false);
+            searchDialog.setSearchDown(true);
+            searchDialog.setSearchString("");
+            searchDialog.setSelectedSearchArea(0);
+            searchDialog.open();
+        }
+    });
+
+    //Search -> Find Next
+    item = new MenuItem(searchMenu, DWT.NONE);
+    item.setText(resAddressBook.getString("Find_next"));
+    item.setAccelerator(DWT.F3);
+    item.addSelectionListener(new class() SelectionAdapter {
+        public void widgetSelected(SelectionEvent e) {
+            searchDialog.open();
+        }
+    });
+}
+
+/**
+ * Creates all items located in the popup menu and associates
+ * all the menu items with their appropriate functions.
+ *
+ * @return  Menu
+ *          The created popup menu.
+ */
+private Menu createPopUpMenu() {
+    Menu popUpMenu = new Menu(shell, DWT.POP_UP);
+
+    /**
+     * Adds a listener to handle enabling and disabling
+     * some items in the Edit submenu.
+     */
+    popUpMenu.addMenuListener(new class() MenuAdapter {
+        public void menuShown(MenuEvent e) {
+            Menu menu = cast(Menu)e.widget;
+            MenuItem[] items = menu.getItems();
+            int count = table.getSelectionCount();
+            items[2].setEnabled(count !is 0); // edit
+            items[3].setEnabled(count !is 0); // copy
+            items[4].setEnabled(copyBuffer !is null); // paste
+            items[5].setEnabled(count !is 0); // delete
+            items[7].setEnabled(table.getItemCount() !is 0); // find
+        }
+    });
+
+    //New
+    MenuItem item = new MenuItem(popUpMenu, DWT.PUSH);
+    item.setText(resAddressBook.getString("Pop_up_new"));
+    item.addSelectionListener(new class() SelectionAdapter {
+        public void widgetSelected(SelectionEvent e) {
+            newEntry();
+        }
+    });
+
+    new MenuItem(popUpMenu, DWT.SEPARATOR);
+
+    //Edit
+    item = new MenuItem(popUpMenu, DWT.PUSH);
+    item.setText(resAddressBook.getString("Pop_up_edit"));
+    item.addSelectionListener(new class() SelectionAdapter {
+        public void widgetSelected(SelectionEvent e) {
+            TableItem[] items = table.getSelection();
+            if (items.length is 0) return;
+            editEntry(items[0]);
+        }
+    });
+
+    //Copy
+    item = new MenuItem(popUpMenu, DWT.PUSH);
+    item.setText(resAddressBook.getString("Pop_up_copy"));
+    item.addSelectionListener(new class() SelectionAdapter {
+        public void widgetSelected(SelectionEvent e) {
+            TableItem[] items = table.getSelection();
+            if (items.length is 0) return;
+            copyBuffer = new char[][table.getColumnCount()];
+            for (int i = 0; i < copyBuffer.length; i++) {
+                copyBuffer[i] = items[0].getText(i);
+            }
+        }
+    });
+
+    //Paste
+    item = new MenuItem(popUpMenu, DWT.PUSH);
+    item.setText(resAddressBook.getString("Pop_up_paste"));
+    item.addSelectionListener(new class() SelectionAdapter {
+        public void widgetSelected(SelectionEvent e) {
+            if (copyBuffer is null) return;
+            TableItem item = new TableItem(table, DWT.NONE);
+            item.setText(copyBuffer);
+            isModified = true;
+        }
+    });
+
+    //Delete
+    item = new MenuItem(popUpMenu, DWT.PUSH);
+    item.setText(resAddressBook.getString("Pop_up_delete"));
+    item.addSelectionListener(new class() SelectionAdapter {
+        public void widgetSelected(SelectionEvent e) {
+            TableItem[] items = table.getSelection();
+            if (items.length is 0) return;
+            items[0].dispose();
+            isModified = true;
+        }
+    });
+
+    new MenuItem(popUpMenu, DWT.SEPARATOR);
+
+    //Find...
+    item = new MenuItem(popUpMenu, DWT.PUSH);
+    item.setText(resAddressBook.getString("Pop_up_find"));
+    item.addSelectionListener(new class() SelectionAdapter {
+        public void widgetSelected(SelectionEvent e) {
+            searchDialog.open();
+        }
+    });
+
+    return popUpMenu;
+}
+
+/**
+ * Creates all the items located in the Help submenu and
+ * associate all the menu items with their appropriate
+ * functions.
+ *
+ * @param   menuBar Menu
+ *              the <code>Menu</code> that file contain
+ *              the Help submenu.
+ */
+private void createHelpMenu(Menu menuBar) {
+
+    //Help Menu
+    MenuItem item = new MenuItem(menuBar, DWT.CASCADE);
+    item.setText(resAddressBook.getString("Help_menu_title"));
+    Menu menu = new Menu(shell, DWT.DROP_DOWN);
+    item.setMenu(menu);
+
+    //Help -> About Text Editor
+    MenuItem subItem = new MenuItem(menu, DWT.NONE);
+    subItem.setText(resAddressBook.getString("About"));
+    subItem.addSelectionListener(new class() SelectionAdapter {
+        public void widgetSelected(SelectionEvent e) {
+            MessageBox box = new MessageBox(shell, DWT.NONE);
+            box.setText(resAddressBook.getString("About_1") ~ shell.getText());
+            box.setMessage(shell.getText() ~ resAddressBook.getString("About_2"));
+            box.open();
+        }
+    });
+}
+
+
+/**
+ * To compare entries (rows) by the given column
+ */
+private class RowComparator /*: Comparator*/ {
+    private int column;
+
+    /**
+     * Constructs a RowComparator given the column index
+     * @param col The index (starting at zero) of the column
+     */
+    public this(int col) {
+        column = col;
+    }
+
+    /**
+     * Compares two rows (type char[][]) using the specified
+     * column entry.
+     * @param obj1 First row to compare
+     * @param obj2 Second row to compare
+     * @return negative if obj1 less than obj2, positive if
+     *          obj1 greater than obj2, and zero if equal.
+     */
+    public bool compare(char[][] row1, char[][] row2) {
+        return row1[column] < row2[column];
+    }
+
+    alias compare opCall;
+}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/addressbook/DataEntryDialog.d	Fri Feb 01 21:46:26 2008 +0100
@@ -0,0 +1,177 @@
+/*******************************************************************************
+ * 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.addressbook.DataEntryDialog;
+
+import dwt.DWT;
+import dwt.events.ModifyEvent;
+import dwt.events.ModifyListener;
+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.Display;
+import dwt.widgets.Label;
+import dwt.widgets.Shell;
+import dwt.widgets.Text;
+
+import dwt.dwthelper.ResourceBundle;
+import dwt.dwthelper.Integer;
+
+/**
+ * DataEntryDialog class uses <code>org.eclipse.swt</code>
+ * libraries to implement a dialog that accepts basic personal information that
+ * is added to a <code>Table</code> widget or edits a <code>TableItem</code> entry
+ * to represent the entered data.
+ */
+public class DataEntryDialog {
+
+    private static ResourceBundle resAddressBook;
+
+    Shell shell;
+    char[][] values;
+    char[][] labels;
+
+public this(Shell parent) {
+    if( resAddressBook is null ){
+        resAddressBook = ResourceBundle.getBundle("examples_addressbook");
+    }
+    shell = new Shell(parent, DWT.DIALOG_TRIM | DWT.PRIMARY_MODAL);
+    shell.setLayout(new GridLayout());
+}
+
+private void addTextListener(Text text) {
+    text.addModifyListener(new class(text) ModifyListener {
+        Text text;
+        this( Text text ){ this.text = text; }
+        public void modifyText(ModifyEvent e){
+            Integer index = cast(Integer)(this.text.getData("index"));
+            values[index.intValue()] = this.text.getText();
+        }
+    });
+}
+private void createControlButtons() {
+    Composite composite = new Composite(shell, DWT.NONE);
+    composite.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_CENTER));
+    GridLayout layout = new GridLayout();
+    layout.numColumns = 2;
+    composite.setLayout(layout);
+
+    Button okButton = new Button(composite, DWT.PUSH);
+    okButton.setText(resAddressBook.getString("OK"));
+    okButton.addSelectionListener(new class() SelectionAdapter {
+        public void widgetSelected(SelectionEvent e) {
+            shell.close();
+        }
+    });
+
+    Button cancelButton = new Button(composite, DWT.PUSH);
+    cancelButton.setText(resAddressBook.getString("Cancel"));
+    cancelButton.addSelectionListener(new class() SelectionAdapter {
+        public void widgetSelected(SelectionEvent e) {
+            values = null;
+            shell.close();
+        }
+    });
+
+    shell.setDefaultButton(okButton);
+}
+
+private void createTextWidgets() {
+    if (labels is null) return;
+
+    Composite composite = new Composite(shell, DWT.NONE);
+    composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+    GridLayout layout= new GridLayout();
+    layout.numColumns = 2;
+    composite.setLayout(layout);
+
+    if (values is null)
+        values = new char[][labels.length];
+
+    for (int i = 0; i < labels.length; i++) {
+        Label label = new Label(composite, DWT.RIGHT);
+        label.setText(labels[i]);
+        Text text = new Text(composite, DWT.BORDER);
+        GridData gridData = new GridData();
+        gridData.widthHint = 400;
+        text.setLayoutData(gridData);
+        if (values[i] !is null) {
+            text.setText(values[i]);
+        }
+        text.setData("index", new Integer(i));
+        addTextListener(text);
+    }
+}
+
+public char[][] getLabels() {
+    return labels;
+}
+public char[] getTitle() {
+    return shell.getText();
+}
+/**
+ * Returns the contents of the <code>Text</code> widgets in the dialog in a
+ * <code>char[]</code> array.
+ *
+ * @return  char[][]
+ *          The contents of the text widgets of the dialog.
+ *          May return null if all text widgets are empty.
+ */
+public char[][] getValues() {
+    return values;
+}
+/**
+ * Opens the dialog in the given state.  Sets <code>Text</code> widget contents
+ * and dialog behaviour accordingly.
+ *
+ * @param   dialogState int
+ *                  The state the dialog should be opened in.
+ */
+public char[][] open() {
+    createTextWidgets();
+    createControlButtons();
+    shell.pack();
+    shell.open();
+    Display display = shell.getDisplay();
+    while(!shell.isDisposed()){
+        if(!display.readAndDispatch())
+            display.sleep();
+    }
+
+    return getValues();
+}
+public void setLabels(char[][] labels) {
+    this.labels = labels;
+}
+public void setTitle(char[] title) {
+    shell.setText(title);
+}
+/**
+ * Sets the values of the <code>Text</code> widgets of the dialog to
+ * the values supplied in the parameter array.
+ *
+ * @param   itemInfo    char[][]
+ *                      The values to which the dialog contents will be set.
+ */
+public void setValues(char[][] itemInfo) {
+    if (labels is null) return;
+
+    if (values is null)
+        values = new char[][labels.length];
+
+    int numItems = Math.min(values.length, itemInfo.length);
+    for(int i = 0; i < numItems; i++) {
+        values[i] = itemInfo[i];
+    }
+}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/addressbook/FindListener.d	Fri Feb 01 21:46:26 2008 +0100
@@ -0,0 +1,18 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2003 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+module dwtexamples.addressbook.FindListener;
+
+
+public interface FindListener {
+
+public bool find();
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/addressbook/SearchDialog.d	Fri Feb 01 21:46:26 2008 +0100
@@ -0,0 +1,221 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2003 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+module dwtexamples.addressbook.SearchDialog;
+
+
+import dwt.DWT;
+import dwt.events.ModifyEvent;
+import dwt.events.ModifyListener;
+import dwt.events.SelectionAdapter;
+import dwt.events.SelectionEvent;
+import dwt.events.ShellAdapter;
+import dwt.events.ShellEvent;
+import dwt.layout.FillLayout;
+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.Label;
+import dwt.widgets.MessageBox;
+import dwt.widgets.Shell;
+import dwt.widgets.Text;
+
+import dwtexamples.addressbook.FindListener;
+
+import dwt.dwthelper.ResourceBundle;
+
+/**
+ * SearchDialog is a simple class that uses <code>org.eclipse.swt</code>
+ * libraries to implement a basic search dialog.
+ */
+public class SearchDialog {
+
+    private static ResourceBundle resAddressBook;
+
+    Shell shell;
+    Text searchText;
+    Combo searchArea;
+    Label searchAreaLabel;
+    Button matchCase;
+    Button matchWord;
+    Button findButton;
+    Button down;
+    FindListener findHandler;
+
+/**
+ * Class constructor that sets the parent shell and the table widget that
+ * the dialog will search.
+ *
+ * @param parent    Shell
+ *          The shell that is the parent of the dialog.
+ */
+public this(Shell parent) {
+    if( resAddressBook is null ){
+        resAddressBook = ResourceBundle.getBundle("examples_addressbook");
+    }
+    shell = new Shell(parent, DWT.CLOSE | DWT.BORDER | DWT.TITLE);
+    GridLayout layout = new GridLayout();
+    layout.numColumns = 2;
+    shell.setLayout(layout);
+    shell.setText(resAddressBook.getString("Search_dialog_title"));
+    shell.addShellListener(new class() ShellAdapter{
+        public void shellClosed(ShellEvent e) {
+            // don't dispose of the shell, just hide it for later use
+            e.doit = false;
+            shell.setVisible(false);
+        }
+    });
+
+    Label label = new Label(shell, DWT.LEFT);
+    label.setText(resAddressBook.getString("Dialog_find_what"));
+    searchText = new Text(shell, DWT.BORDER);
+    GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
+    gridData.widthHint = 200;
+    searchText.setLayoutData(gridData);
+    searchText.addModifyListener(new class() ModifyListener {
+        public void modifyText(ModifyEvent e) {
+            bool enableFind = (searchText.getCharCount() !is 0);
+            findButton.setEnabled(enableFind);
+        }
+    });
+
+    searchAreaLabel = new Label(shell, DWT.LEFT);
+    searchArea = new Combo(shell, DWT.DROP_DOWN | DWT.READ_ONLY);
+    gridData = new GridData(GridData.FILL_HORIZONTAL);
+    gridData.widthHint = 200;
+    searchArea.setLayoutData(gridData);
+
+    matchCase = new Button(shell, DWT.CHECK);
+    matchCase.setText(resAddressBook.getString("Dialog_match_case"));
+    gridData = new GridData();
+    gridData.horizontalSpan = 2;
+    matchCase.setLayoutData(gridData);
+
+    matchWord = new Button(shell, DWT.CHECK);
+    matchWord.setText(resAddressBook.getString("Dialog_match_word"));
+    gridData = new GridData();
+    gridData.horizontalSpan = 2;
+    matchWord.setLayoutData(gridData);
+
+    Group direction = new Group(shell, DWT.NONE);
+    gridData = new GridData();
+    gridData.horizontalSpan = 2;
+    direction.setLayoutData(gridData);
+    direction.setLayout (new FillLayout ());
+    direction.setText(resAddressBook.getString("Dialog_direction"));
+
+    Button up = new Button(direction, DWT.RADIO);
+    up.setText(resAddressBook.getString("Dialog_dir_up"));
+    up.setSelection(false);
+
+    down = new Button(direction, DWT.RADIO);
+    down.setText(resAddressBook.getString("Dialog_dir_down"));
+    down.setSelection(true);
+
+    Composite composite = new Composite(shell, DWT.NONE);
+    gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+    gridData.horizontalSpan = 2;
+    composite.setLayoutData(gridData);
+    layout = new GridLayout();
+    layout.numColumns = 2;
+    layout.makeColumnsEqualWidth = true;
+    composite.setLayout(layout);
+
+    findButton = new Button(composite, DWT.PUSH);
+    findButton.setText(resAddressBook.getString("Dialog_find"));
+    findButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END));
+    findButton.setEnabled(false);
+    findButton.addSelectionListener(new class() SelectionAdapter {
+        public void widgetSelected(SelectionEvent e) {
+            if (!findHandler.find()){
+                MessageBox box = new MessageBox(shell, DWT.ICON_INFORMATION | DWT.OK | DWT.PRIMARY_MODAL);
+                box.setText(shell.getText());
+                box.setMessage(resAddressBook.getString("Cannot_find") ~ "\"" ~ searchText.getText() ~ "\"");
+                box.open();
+            }
+        }
+    });
+
+    Button cancelButton = new Button(composite, DWT.PUSH);
+    cancelButton.setText(resAddressBook.getString("Cancel"));
+    cancelButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
+    cancelButton.addSelectionListener(new class() SelectionAdapter {
+        public void widgetSelected(SelectionEvent e) {
+            shell.setVisible(false);
+        }
+    });
+
+    shell.pack();
+}
+public char[] getSearchAreaLabel(char[] label) {
+    return searchAreaLabel.getText();
+}
+
+public char[][] getsearchAreaNames() {
+    return searchArea.getItems();
+}
+public bool getMatchCase() {
+    return matchCase.getSelection();
+}
+public bool getMatchWord() {
+    return matchWord.getSelection();
+}
+public char[] getSearchString() {
+    return searchText.getText();
+}
+public bool getSearchDown(){
+    return down.getSelection();
+}
+public int getSelectedSearchArea() {
+    return searchArea.getSelectionIndex();
+}
+public void open() {
+    if (shell.isVisible()) {
+        shell.setFocus();
+    } else {
+        shell.open();
+    }
+    searchText.setFocus();
+}
+public void setSearchAreaNames(char[][] names) {
+    for (int i = 0; i < names.length; i++) {
+        searchArea.add(names[i]);
+    }
+    searchArea.select(0);
+}
+public void setSearchAreaLabel(char[] label) {
+    searchAreaLabel.setText(label);
+}
+public void setMatchCase(bool match) {
+    matchCase.setSelection(match);
+}
+public void setMatchWord(bool match) {
+    matchWord.setSelection(match);
+}
+public void setSearchDown(bool searchDown){
+    down.setSelection(searchDown);
+}
+public void setSearchString(char[] searchString) {
+    searchText.setText(searchString);
+}
+
+public void setSelectedSearchArea(int index) {
+    searchArea.select(index);
+}
+public void addFindListener(FindListener listener) {
+    this.findHandler = listener;
+}
+public void removeFindListener(FindListener listener) {
+    this.findHandler = null;
+}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/addressbook/addressbook.properties	Fri Feb 01 21:46:26 2008 +0100
@@ -0,0 +1,69 @@
+###############################################################################
+# Copyright (c) 2000, 2003 IBM Corporation and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#     IBM Corporation - initial API and implementation
+###############################################################################
+Last_name = Last Name
+First_name = First Name
+Business_phone = Business Phone
+Home_phone = Home Phone
+Email = Email
+Fax = Fax
+Close_save = The address book contents have changed.\nDo you want to save the changes?
+New_title = Untitled
+Column = Column:
+Book_extension = .adr
+Book_filter_name = Address Books
+All_filter_name = All Files
+File = File 
+Does_not_exist = does not exist.
+File_not_found = File not found:
+IO_error_read = IO error reading text file:
+IO_error_write = IO error writing text file:
+IO_error_close = IO error closing text file:
+Title_bar = Address Book - 
+Save_as_title = Save As
+Query_overwrite = already exists.\nDo you want to replace it?
+File_menu_title = &File
+New_contact = &New Contact...\tCtrl+N
+Edit_contact = &Edit Contact...\tCtrl+E
+New_address_book = New Address &Book\tCtrl+B
+Open_address_book = &Open Address Book...\tCtrl+O
+Save_address_book = &Save Address Book\tCtrl+S
+Save_book_as = Save &Address Book As...\tCtrl+A
+Exit = E&xit
+Edit_menu_title = &Edit
+Edit = &Edit...\tCtrl+E
+Copy = &Copy\tCtrl+C
+Paste = &Paste\tCtrl+V
+Delete = De&lete\tDel
+Sort = &Sort
+Search_menu_title = &Search
+Find = &Find...\tCtrl+F
+Find_next = Find &Next...\tF3
+Pop_up_new = &New...
+Pop_up_edit = &Edit...
+Pop_up_copy = &Copy
+Pop_up_paste = &Paste
+Pop_up_delete = &Delete
+Pop_up_find = &Find...
+Help_menu_title = &Help
+About = &About Address Book...
+About_1 = About 
+About_2 = \nversion 1.0
+OK = OK
+Cancel = Cancel
+Search_dialog_title = Find
+Dialog_find_what = Fi&nd what:
+Dialog_match_case = Match &case
+Dialog_match_word = Match &whole word
+Dialog_direction = Direction
+Dialog_dir_up = &Up
+Dialog_dir_down = &Down
+Dialog_find = &Find
+Cannot_find = Cannot find 
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/controlexample/AlignableTab.d	Fri Feb 01 21:46:26 2008 +0100
@@ -0,0 +1,100 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module 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	Fri Feb 01 21:46:26 2008 +0100
@@ -0,0 +1,244 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module 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	Fri Feb 01 21:46:26 2008 +0100
@@ -0,0 +1,136 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module 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;
+
+import dwtexamples.controlexample.Tab;
+import dwtexamples.controlexample.ControlExample;
+
+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 char[] [] ListData;
+
+    /**
+     * Creates the Tab within a given instance of ControlExample.
+     */
+    this(ControlExample instance) {
+        super(instance);
+        if( ListData is null ){
+            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 "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 [cast(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).
+     */
+    char[][] getMethodNames() {
+        return ["Editable", "Items", "Selection", "Text", "TextLimit", "ToolTipText", "VisibleItemCount"];
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    char[] 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	Fri Feb 01 21:46:26 2008 +0100
@@ -0,0 +1,147 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module 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;
+
+
+import dwtexamples.controlexample.AlignableTab;
+import dwtexamples.controlexample.ControlExample;
+
+import tango.text.convert.Format;
+
+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.
+     */
+    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("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(Format( "{}\n{}", ControlExample.getResourceString("Example_string"), 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 [ cast(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).
+     */
+    char[][] getMethodNames() {
+        return ["Text", "ToolTipText"];
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    char[] 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	Fri Feb 01 21:46:26 2008 +0100
@@ -0,0 +1,478 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module 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;
+
+import dwtexamples.controlexample.Tab;
+import dwtexamples.controlexample.ControlExample;
+
+import tango.text.convert.Format;
+
+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 char[] [] CTabItems1;
+
+    /* Controls and resources added to the "Fonts" group */
+    static const int SELECTION_FOREGROUND_COLOR = 3;
+    static const int SELECTION_BACKGROUND_COLOR = 4;
+    static const 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);
+        if( CTabItems1 is null ){
+            CTabItems1 = [
+                ControlExample.getResourceString("CTabItem1_0"),
+                ControlExample.getResourceString("CTabItem1_1"),
+                ControlExample.getResourceString("CTabItem1_2")];
+        }
+    }
+
+    /**
+     * 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 class() 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 class() 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 class() 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 class() 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 class() SelectionAdapter {
+            public void widgetSelected (SelectionEvent event) {
+                setMaximizeVisible();
+            }
+        });
+
+        imageButton = new Button (otherGroup, DWT.CHECK);
+        imageButton.setText (ControlExample.getResourceString("Set_Image"));
+        imageButton.addSelectionListener (new class() 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 class() 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 class() 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(Format( "{}: {}", ControlExample.getResourceString("CTabItem_content"), i));
+            item.setControl(text);
+        }
+        tabFolder1.addListener(DWT.Selection, new class() 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
+     */
+    char[] [] getCustomEventNames () {
+        return ["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 [ cast(Widget) tabFolder1];
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    char[] getTabText () {
+        return "CTabFolder";
+    }
+
+    /**
+     * Hooks the custom listener specified by eventName.
+     */
+    void hookCustomListener (char[] eventName) {
+        if (eventName is "CTabFolderEvent") {
+            tabFolder1.addCTabFolder2Listener (new class(eventName) CTabFolder2Adapter {
+                char[] name;
+                this( char[] name ){ this.name = name; }
+                public void close (CTabFolderEvent event) {
+                    log (name, 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	Fri Feb 01 21:46:26 2008 +0100
@@ -0,0 +1,335 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module 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;
+
+import dwtexamples.controlexample.Tab;
+import dwtexamples.controlexample.ControlExample;
+
+class CanvasTab : Tab {
+    static const 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 char[] 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.
+     */
+    this(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 class() 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 class() 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 class() 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 class() SelectionAdapter {
+                public void widgetSelected(SelectionEvent event) {
+                    scrollHorizontal (cast(ScrollBar)event.widget);
+                }
+            });
+        }
+        bar = canvas.getVerticalBar();
+        if (bar !is null) {
+            hookListeners (bar);
+            bar.addSelectionListener(new class() SelectionAdapter {
+                public void widgetSelected(SelectionEvent event) {
+                    scrollVertical (cast(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 class() ControlAdapter {
+            public void controlResized(ControlEvent e) {
+                setExampleWidgetSize ();
+            }
+        });
+
+        return tabFolderPage;
+    }
+
+    /**
+     * Gets the "Example" widget children.
+     */
+    Widget [] getExampleWidgets () {
+        return [ cast(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).
+     */
+    char[][] getMethodNames() {
+        return ["ToolTipText"];
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    char[] 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	Fri Feb 01 21:46:26 2008 +0100
@@ -0,0 +1,164 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwtexamples.controlexample.ComboTab;
+
+
+
+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;
+
+import dwtexamples.controlexample.Tab;
+import dwtexamples.controlexample.ControlExample;
+
+class ComboTab : Tab {
+
+    /* Example widgets and groups that contain them */
+    Combo combo1;
+    Group comboGroup;
+
+    /* Style widgets added to the "Style" group */
+    Button dropDownButton, readOnlyButton, simpleButton;
+
+    static char[] [] ListData;
+
+    /**
+     * Creates the Tab within a given instance of ControlExample.
+     */
+    this(ControlExample instance) {
+        super(instance);
+        if( ListData.length is 0 ){
+            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 "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 class() 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 [ cast(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).
+     */
+    char[][] getMethodNames() {
+        return ["Items", "Orientation", "Selection", "Text", "TextLimit", "ToolTipText", "VisibleItemCount"];
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    char[] 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	Fri Feb 01 21:46:26 2008 +0100
@@ -0,0 +1,322 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+  * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+*******************************************************************************/
+module dwtexamples.controlexample.ControlExample;
+
+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 dwt.dwthelper.ByteArrayInputStream;
+
+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;
+import tango.text.convert.Format;
+import tango.io.Stdout;
+import Math = tango.math.Math;
+
+
+/*** Linker workaround start ***/
+import tango.io.Stdout;
+import tango.math.Math;
+import tango.text.convert.Format;
+import tango.util.Convert;
+import tango.util.PathUtil;
+/*** Linker workaround end ***/
+
+version(JIVE){
+    import jive.stacktrace;
+}
+
+version( CONTROL_EXAMPLE_MAIN ){
+    void main(){
+        Stdout.formatln( "The ControlExample: still work left" );
+        Stdout.formatln( "todo: search for //PORTING_LEFT" );
+        Stdout.formatln( "todo: Implement Get/Set API reflection" );
+        Stdout.formatln( "todo: DateTimeTab not implemented" );
+        Stdout.formatln( "todo: ExpandBarTab looks strange" );
+        Stdout.formatln( "todo: ProgressBarTab crash on vertical" );
+        Stdout.formatln( "todo: SliderTab horizontal arrow buttons are too high" );
+        Stdout.formatln( "please report problems" );
+        ControlExample.main( null );
+    }
+}
+
+public class ControlExample {
+    private static ResourceBundle resourceBundle;
+    private static const char[] resourceData = import( "controlexample.properties" );
+
+    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 byte[][] imageData = [
+        cast(byte[]) import( "closedFolder.gif" ),
+        cast(byte[]) import( "openFolder.gif" ),
+        cast(byte[]) import( "target.gif" ),
+        cast(byte[]) import( "backgroundImage.png" ),
+        cast(byte[]) import( "parentBackgroundImage.png" )
+    ];
+    static const int[] imageTypes = [
+        DWT.ICON,
+        DWT.ICON,
+        DWT.ICON,
+        DWT.BITMAP,
+        DWT.BITMAP];
+
+    bool startup = true;
+
+    static this(){
+        resourceBundle = ResourceBundle.getBundleFromData( resourceData ); //$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 = 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[imageData.length];
+
+                    for (int i = 0; i < imageData.length; ++i) {
+                        InputStream sourceStream = new ByteArrayInputStream( imageData[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) {
+                            Stderr.formatln( "Stacktrace: {}", e.toString );
+                        }
+                    }
+                }
+                return;
+            } catch (TracedException t) {
+                Stdout.formatln( "ups {}", t );
+            }
+        }
+        char[] error = (resourceBundle !is null) ?
+            getResourceString("error.CouldNotLoadResources") :
+            "Unable to load resources"; //$NON-NLS-1$
+        freeResources();
+        throw new TracedException(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()=="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	Fri Feb 01 21:46:26 2008 +0100
@@ -0,0 +1,515 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module 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;
+
+import dwtexamples.controlexample.Tab;
+import dwtexamples.controlexample.ControlExample;
+import tango.util.Convert;
+
+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 class() 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 ( auto bar = cast(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([1, 3]);
+        }
+
+        /* Add a listener to resize the group box to match the coolbar */
+        coolBar.addListener(DWT.Resize, new class() 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 [ cast(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).
+     */
+    char[][] getMethodNames() {
+        return ["ToolTipText"];
+    }
+
+    /**
+     * Gets the short text for the tab folder item.
+     */
+    public char[] getShortTabText() {
+        return "CB";
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    char[] 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 : 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 class() MenuAdapter {
+                    public void menuHidden(MenuEvent e) {
+                        visible = false;
+                    }
+                });
+                for (int i = 0; i < 9; ++i) {
+                    final char[] text = ControlExample.getResourceString("DropDownData_" ~ to!(char[])(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 class() 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.
+                    ToolItem toolItem = cast(ToolItem) event.widget;
+                    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 : 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 = cast(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 = cast(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!=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);
+                            char[] 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_" ~ to!(char[])(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);
+                            char[] 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	Fri Feb 01 21:46:26 2008 +0100
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwtexamples.controlexample.CustomControlExample;
+
+
+import dwt.layout.FillLayout;
+import dwt.widgets.Composite;
+import dwt.widgets.Display;
+import dwt.widgets.Shell;
+
+import dwtexamples.controlexample.ControlExample;
+import dwtexamples.controlexample.CComboTab;
+import dwtexamples.controlexample.CLabelTab;
+import dwtexamples.controlexample.CTabFolderTab;
+import dwtexamples.controlexample.SashFormTab;
+import dwtexamples.controlexample.StyledTextTab;
+
+import dwtexamples.controlexample.Tab;
+import tango.io.Stdout;
+
+version( CUSTOM_CONTROL_EXAMPLE_MAIN ){
+    void main(){
+        Stdout.formatln( "The CustomControlExample: still work left" );
+        Stdout.formatln( "warning in Control:setBounds() line=695 gtk_widget_size_allocate()" );
+        Stdout.formatln( "Gtk-WARNING **: gtk_widget_size_allocate(): attempt to allocate widget with width -5 and height 15" );
+        Stdout.formatln( "for the CTabFolder widget. Params are OK. Further bugtracking needed." );
+        Stdout.formatln( "please report problems" );
+        CustomControlExample.main( null );
+    }
+}
+
+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 [ cast(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(char[][] 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	Fri Feb 01 21:46:26 2008 +0100
@@ -0,0 +1,132 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module 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	Fri Feb 01 21:46:26 2008 +0100
@@ -0,0 +1,512 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module 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;
+
+import dwtexamples.controlexample.Tab;
+import dwtexamples.controlexample.ControlExample;
+import tango.text.convert.Format;
+
+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 const char[] [] FilterExtensions   = ["*.txt", "*.bat", "*.doc", "*"];
+    static char[] [] FilterNames;
+
+    /**
+     * Creates the Tab within a given instance of ControlExample.
+     */
+    this(ControlExample instance) {
+        super(instance);
+        if( FilterNames.length is 0 ){
+            FilterNames = [ ControlExample.getResourceString("FilterName_0"),
+                            ControlExample.getResourceString("FilterName_1"),
+                            ControlExample.getResourceString("FilterName_2"),
+                            ControlExample.getResourceString("FilterName_3")];
+        }
+    }
+
+    /**
+     * 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 */
+        char[] name = dialogCombo.getText ();
+
+        if (name == 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 (Format( ControlExample.getResourceString("ColorDialog")~"{}", Text.DELIMITER));
+            textWidget.append (Format( ControlExample.getResourceString("Result")~"{}{}", result, Text.DELIMITER, Text.DELIMITER));
+            return;
+        }
+
+        if (name == ControlExample.getResourceString("DirectoryDialog")) {
+            DirectoryDialog dialog = new DirectoryDialog (shell, style);
+            dialog.setMessage (ControlExample.getResourceString("Example_string"));
+            dialog.setText (ControlExample.getResourceString("Title"));
+            char[] result = dialog.open ();
+            textWidget.append (ControlExample.getResourceString("DirectoryDialog") ~ Text.DELIMITER);
+            textWidget.append (Format( ControlExample.getResourceString("Result"), result ) ~ Text.DELIMITER ~ Text.DELIMITER);
+            return;
+        }
+
+        if (name== 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"));
+            char[] result = dialog.open();
+            textWidget.append (ControlExample.getResourceString("FileDialog") ~ Text.DELIMITER);
+            textWidget.append (Format( ControlExample.getResourceString("Result"), result ) ~ Text.DELIMITER);
+            if ((dialog.getStyle () & DWT.MULTI) !is 0) {
+                char[] [] 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 == 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 (Format( ControlExample.getResourceString("Result"), result ) ~ Text.DELIMITER ~ Text.DELIMITER);
+            return;
+        }
+
+        if (name == 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 (Format( ControlExample.getResourceString("Result"), result ) ~ Text.DELIMITER ~ Text.DELIMITER);
+            return;
+        }
+
+        if (name == 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 (Format( ControlExample.getResourceString("Result"), "DWT.OK"));
+                    break;
+                case DWT.YES:
+                    textWidget.append (Format( ControlExample.getResourceString("Result"), "DWT.YES"));
+                    break;
+                case DWT.NO:
+                    textWidget.append (Format( ControlExample.getResourceString("Result"), "DWT.NO"));
+                    break;
+                case DWT.CANCEL:
+                    textWidget.append (Format( ControlExample.getResourceString("Result"), "DWT.CANCEL"));
+                    break;
+                case DWT.ABORT:
+                    textWidget.append (Format( ControlExample.getResourceString("Result"), "DWT.ABORT"));
+                    break;
+                case DWT.RETRY:
+                    textWidget.append (Format( ControlExample.getResourceString("Result"), "DWT.RETRY"));
+                    break;
+                case DWT.IGNORE:
+                    textWidget.append (Format( ControlExample.getResourceString("Result"), "DWT.IGNORE"));
+                    break;
+                default:
+                    textWidget.append(Format( ControlExample.getResourceString("Result"), 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 */
+        char[] [] 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 class() SelectionAdapter {
+            public void widgetSelected (SelectionEvent event) {
+                dialogSelected (event);
+            }
+        });
+        createButton.addSelectionListener (new class() SelectionAdapter {
+            public void widgetSelected (SelectionEvent event) {
+                createButtonSelected (event);
+            }
+        });
+        SelectionListener buttonStyleListener = new class() 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 */
+        char[] name = dialogCombo.getText ();
+        bool isMessageBox = ( name == ControlExample.getResourceString("MessageBox"));
+        bool isFileDialog = ( name == 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 null;
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    char[] 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	Fri Feb 01 21:46:26 2008 +0100
@@ -0,0 +1,158 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module 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;
+
+import dwtexamples.controlexample.Tab;
+import dwtexamples.controlexample.ControlExample;
+
+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 [ cast(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).
+     */
+    char[][] getMethodNames() {
+        return ["Spacing"];
+    }
+
+    /**
+     * Gets the short text for the tab folder item.
+     */
+    public char[] getShortTabText() {
+        return "EB";
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    char[] 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	Fri Feb 01 21:46:26 2008 +0100
@@ -0,0 +1,164 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module 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;
+
+import dwtexamples.controlexample.Tab;
+import dwtexamples.controlexample.ControlExample;
+
+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 class() 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 [ cast(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).
+     */
+    char[][] getMethodNames() {
+        return ["ToolTipText"];
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    char[] 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	Fri Feb 01 21:46:26 2008 +0100
@@ -0,0 +1,195 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module 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;
+
+import dwtexamples.controlexample.Tab;
+import dwtexamples.controlexample.ControlExample;
+import dwtexamples.controlexample.AlignableTab;
+
+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 [ cast(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).
+     */
+    char[][] getMethodNames() {
+        return ["Text", "ToolTipText"];
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    char[] 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	Fri Feb 01 21:46:26 2008 +0100
@@ -0,0 +1,110 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module 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;
+
+import dwtexamples.controlexample.Tab;
+import dwtexamples.controlexample.ControlExample;
+
+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.
+     */
+    override 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.
+     */
+    override 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 [ cast(Widget) link1 ];
+        return null;
+    }
+
+    /**
+     * 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 ["Text", "ToolTipText"];
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    char[] getTabText () {
+        return "Link";
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/controlexample/ListTab.d	Fri Feb 01 21:46:26 2008 +0100
@@ -0,0 +1,107 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module 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;
+
+import dwtexamples.controlexample.Tab;
+import dwtexamples.controlexample.ControlExample;
+import dwtexamples.controlexample.ScrollableTab;
+
+class ListTab : ScrollableTab {
+
+    /* Example widgets and groups that contain them */
+    List list1;
+    Group listGroup;
+
+    static char[] [] ListData1;
+
+    /**
+     * Creates the Tab within a given instance of ControlExample.
+     */
+    this(ControlExample instance) {
+        super(instance);
+        if( ListData1.length is 0 ){
+            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 "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 [cast(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).
+     */
+    char[][] getMethodNames() {
+        return ["Items", "Selection", "ToolTipText", "TopIndex" ];
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    char[] getTabText () {
+        return "List";
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/controlexample/MenuTab.d	Fri Feb 01 21:46:26 2008 +0100
@@ -0,0 +1,326 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module 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;
+
+import dwtexamples.controlexample.Tab;
+import dwtexamples.controlexample.ControlExample;
+import tango.util.Convert;
+
+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;
+
+    /**
+     * Creates the Tab within a given instance of ControlExample.
+     */
+    this(ControlExample instance) {
+        super(instance);
+        shells = new Shell [4];
+    }
+
+    /**
+     * 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") ~ to!(char[])(shellCount));
+        shell.addPaintListener(new class() 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 class() SelectionAdapter {
+            public void widgetSelected(SelectionEvent e) {
+                createButtonSelected(e);
+            }
+        });
+        closeAllButton.addSelectionListener(new class() SelectionAdapter {
+            public void widgetSelected(SelectionEvent e) {
+                closeAllShells ();
+            }
+        });
+        subMenuButton.addSelectionListener(new class() 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);
+        }
+    }
+
+    char[] getMenuItemText(char[] item) {
+        bool cascade = ( item == "Cascade");
+        bool mnemonic = mnemonicsButton.getSelection();
+        bool accelerator = acceleratorsButton.getSelection();
+        char acceleratorKey = item[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.
+     */
+    char[] getTabText () {
+        return "Menu";
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/controlexample/ProgressBarTab.d	Fri Feb 01 21:46:26 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+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;
+
+import dwtexamples.controlexample.Tab;
+import dwtexamples.controlexample.ControlExample;
+import dwtexamples.controlexample.RangeTab;
+
+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 [ cast(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).
+     */
+    char[][] getMethodNames() {
+        return ["Selection", "ToolTipText"];
+    }
+
+    /**
+     * Gets the short text for the tab folder item.
+     */
+    public char[] getShortTabText() {
+        return "PB";
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    char[] 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	Fri Feb 01 21:46:26 2008 +0100
@@ -0,0 +1,208 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module 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;
+
+import dwtexamples.controlexample.Tab;
+import dwtexamples.controlexample.ControlExample;
+
+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 class() 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 class() 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 class() 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	Fri Feb 01 21:46:26 2008 +0100
@@ -0,0 +1,142 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module 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;
+
+import dwtexamples.controlexample.Tab;
+import dwtexamples.controlexample.ControlExample;
+
+
+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 char[] [] ListData0;
+    static char[] [] ListData1;
+
+
+    /**
+     * Creates the Tab within a given instance of ControlExample.
+     */
+    this(ControlExample instance) {
+        super(instance);
+        if( ListData0 is null ){
+            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$
+
+        }
+        if( ListData1 is null ){
+            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$
+        }
+    }
+    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([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 [ cast(Widget) form];
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    char[] 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	Fri Feb 01 21:46:26 2008 +0100
@@ -0,0 +1,264 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module 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;
+
+import dwtexamples.controlexample.Tab;
+import dwtexamples.controlexample.ControlExample;
+
+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 char[] [] ListData0;
+    static char[] [] ListData1;
+
+    /* Constants */
+    static final int SASH_WIDTH = 3;
+    static final int SASH_LIMIT = 20;
+
+    /**
+     * Creates the Tab within a given instance of ControlExample.
+     */
+    this(ControlExample instance) {
+        super(instance);
+        if( ListData0.length is 0 ){
+            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")];
+        }
+        if( ListData1.length is 0 ){
+            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 "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 class() 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 class() 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 class() 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 [ cast(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).
+     */
+    char[][] getMethodNames() {
+        return ["ToolTipText"];
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    char[] 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	Fri Feb 01 21:46:26 2008 +0100
@@ -0,0 +1,243 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module 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;
+
+import dwtexamples.controlexample.Tab;
+import dwtexamples.controlexample.ControlExample;
+import dwtexamples.controlexample.RangeTab;
+
+
+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 class() 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 class() SelectionAdapter {
+            public void widgetSelected (SelectionEvent event) {
+                setWidgetPageIncrement ();
+            }
+        });
+    }
+
+    /**
+     * Gets the "Example" widget children.
+     */
+    Widget [] getExampleWidgets () {
+        return [ cast(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).
+     */
+    char[][] getMethodNames() {
+        return ["Selection", "ToolTipText"];
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    char[] 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	Fri Feb 01 21:46:26 2008 +0100
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwtexamples.controlexample.ScrollableTab;
+
+
+
+import dwt.DWT;
+import dwt.widgets.Button;
+import dwt.widgets.Widget;
+
+import dwtexamples.controlexample.Tab;
+import dwtexamples.controlexample.ControlExample;
+
+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	Fri Feb 01 21:46:26 2008 +0100
@@ -0,0 +1,310 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+  * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+*******************************************************************************/
+module 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;
+import tango.util.Convert;
+
+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;
+
+    /**
+     * 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);
+        }
+        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(currentShell) Listener {
+            Shell s;
+            this( Shell s ){ this.s = s; }
+            public void handleEvent(Event event) {
+                s.dispose();
+            }
+        });
+
+        /* Set the size, title, and image, and open the shell */
+        currentShell.setSize (300, 100);
+        currentShell.setText (ControlExample.getResourceString("Title") ~ to!(char[])(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	Fri Feb 01 21:46:26 2008 +0100
@@ -0,0 +1,285 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module 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;
+
+import dwtexamples.controlexample.Tab;
+import dwtexamples.controlexample.ControlExample;
+import dwtexamples.controlexample.RangeTab;
+
+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 class() 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 class() 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 class() SelectionAdapter {
+            public void widgetSelected (SelectionEvent event) {
+                setWidgetThumb ();
+            }
+        });
+    }
+
+    /**
+     * Gets the "Example" widget children.
+     */
+    Widget [] getExampleWidgets () {
+        return [ cast(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).
+     */
+    char[][] getMethodNames() {
+        return ["Selection", "ToolTipText"];
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    char[] 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	Fri Feb 01 21:46:26 2008 +0100
@@ -0,0 +1,333 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module 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;
+
+import dwtexamples.controlexample.Tab;
+import dwtexamples.controlexample.ControlExample;
+import dwtexamples.controlexample.RangeTab;
+
+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 class() 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 class() 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 class() 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 class() 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 [ cast(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).
+     */
+    char[][] getMethodNames() {
+        return ["Selection", "ToolTipText"];
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    char[] 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	Fri Feb 01 21:46:26 2008 +0100
@@ -0,0 +1,356 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwtexamples.controlexample.StyledTextTab;
+
+
+import dwt.dwthelper.ByteArrayInputStream;
+
+
+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;
+
+import dwtexamples.controlexample.ScrollableTab;
+import dwtexamples.controlexample.ControlExample;
+import tango.core.Exception;
+import tango.io.Stdout;
+
+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. */
+    char[] 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, void[] sourceData, void[] maskData ) {
+        InputStream sourceStream = new ByteArrayInputStream ( cast(byte[])sourceData );
+        InputStream maskStream = new ByteArrayInputStream ( cast(byte[])maskData );
+        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) {
+            Stderr.formatln( "Stacktrace: {}", e );
+        }
+        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, import("bold.bmp"), import("bold_mask.bmp"));
+        italicImage = createBitmapImage (display, import("italic.bmp"), import("italic_mask.bmp"));
+        redImage = createBitmapImage (display, import("red.bmp"), import("red_mask.bmp"));
+        yellowImage = createBitmapImage (display, import("yellow.bmp"), import("yellow_mask.bmp"));
+        underlineImage = createBitmapImage (display, import("underline.bmp"), import("underline_mask.bmp"));
+        strikeoutImage = createBitmapImage (display, import("strikeout.bmp"), import("strikeout_mask.bmp"));
+
+        /* 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 class() 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 = cast(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 class() 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 = cast(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 class() 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 class() 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 [ cast(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).
+     */
+    char[][] getMethodNames() {
+        return ["CaretOffset", "DoubleClickEnabled", "Editable", "HorizontalIndex", "HorizontalPixel", "Orientation", "Selection", "Tabs", "Text", "TextLimit", "ToolTipText", "TopIndex", "TopPixel", "WordWrap"];
+    }
+
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    char[] 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	Fri Feb 01 21:46:26 2008 +0100
@@ -0,0 +1,1732 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module 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.Link;
+import dwt.widgets.List;
+import dwt.widgets.Listener;
+import dwt.widgets.Menu;
+import dwt.widgets.MenuItem;
+import dwt.widgets.ProgressBar;
+import dwt.widgets.Sash;
+import dwt.widgets.Scale;
+import dwt.widgets.Shell;
+import dwt.widgets.Slider;
+import dwt.widgets.Spinner;
+import dwt.widgets.TabFolder;
+import dwt.widgets.Table;
+import dwt.widgets.TableItem;
+import dwt.widgets.Text;
+import dwt.widgets.Tree;
+import dwt.widgets.TreeItem;
+import dwt.widgets.ToolTip;
+import dwt.widgets.Widget;
+import dwt.widgets.Canvas;
+import dwt.widgets.CoolBar;
+import dwt.widgets.ExpandBar;
+
+import dwtexamples.controlexample.ControlExample;
+import tango.text.convert.Format;
+
+import tango.io.Stdout;
+
+/**
+ * <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 */
+    const ControlExample instance;
+
+    /* Sizing constants for the "Size" group */
+    static const int TOO_SMALL_SIZE = 10;
+    static const int SMALL_SIZE     = 50;
+    static const int LARGE_SIZE     = 100;
+
+    /* Right-to-left support */
+    static const bool RTL_SUPPORT_ENABLE = false;
+    Group orientationGroup;
+    Button rtlButton, ltrButton, defaultOrietationButton;
+
+    /* Controls and resources for the "Colors & Fonts" group */
+    static const int IMAGE_SIZE = 12;
+    static const int FOREGROUND_COLOR = 0;
+    static const int BACKGROUND_COLOR = 1;
+    static const 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;
+
+
+    struct ReflectTypeInfo{
+        ReflectMethodInfo[ char[] ] methods;
+    }
+    struct ReflectMethodInfo{
+        TypeInfo returnType;
+        TypeInfo[] argumentTypes;
+    }
+    static ReflectTypeInfo[ ClassInfo ] reflectTypeInfos;
+
+    static ReflectMethodInfo createMethodInfo( TypeInfo ret, TypeInfo[] args ... ){
+        ReflectMethodInfo res;
+        res.returnType = ret;
+        foreach( arg; args ){
+            res.argumentTypes ~= arg;
+        }
+        return res;
+    }
+    static void createSetterGetter( ref ReflectTypeInfo ti, char[] name,  TypeInfo type ){
+        ti.methods[ "get" ~ name ] = createMethodInfo( type );
+        ti.methods[ "set" ~ name ] = createMethodInfo( typeid(void), type );
+    }
+
+    static void registerTypes(){
+        if( reflectTypeInfos.length > 0 ){
+            return;
+        }
+
+        {
+            ReflectTypeInfo ti;
+            createSetterGetter( ti, "Selection",   typeid(bool) );
+            createSetterGetter( ti, "Text",        typeid(char[]) );
+            createSetterGetter( ti, "ToolTipText", typeid(char[]) );
+            reflectTypeInfos[ Button.classinfo ] = ti;
+        }
+        {
+            ReflectTypeInfo ti;
+            createSetterGetter( ti, "ToolTipText", typeid(char[]) );
+            reflectTypeInfos[ Canvas.classinfo ] = ti;
+        }
+        {
+            ReflectTypeInfo ti;
+            createSetterGetter( ti, "Orientation", typeid(int) );
+            createSetterGetter( ti, "Items", typeid(char[]) );
+            createSetterGetter( ti, "Selection", typeid(Point) );
+            createSetterGetter( ti, "Text", typeid(char[]) );
+            createSetterGetter( ti, "TextLimit", typeid(int) );
+            createSetterGetter( ti, "ToolTipText", typeid(char[]) );
+            createSetterGetter( ti, "VisibleItemCount", typeid(int) );
+            reflectTypeInfos[ Combo.classinfo ] = ti;
+        }
+        {
+            ReflectTypeInfo ti;
+            createSetterGetter( ti, "ToolTipText", typeid(char[]) );
+            reflectTypeInfos[ CoolBar.classinfo ] = ti;
+        }
+        {
+            ReflectTypeInfo ti;
+            createSetterGetter( ti, "Spacing", typeid(int) );
+            reflectTypeInfos[ ExpandBar.classinfo ] = ti;
+        }
+        {
+            ReflectTypeInfo ti;
+            createSetterGetter( ti, "ToolTipText", typeid(char[]) );
+            reflectTypeInfos[ Group.classinfo ] = ti;
+        }
+        {
+            ReflectTypeInfo ti;
+            createSetterGetter( ti, "Text", typeid(char[]) );
+            createSetterGetter( ti, "ToolTipText", typeid(char[]) );
+            reflectTypeInfos[ Label.classinfo ] = ti;
+        }
+        {
+            ReflectTypeInfo ti;
+            createSetterGetter( ti, "Text", typeid(char[]) );
+            createSetterGetter( ti, "ToolTipText", typeid(char[]) );
+            reflectTypeInfos[ Link.classinfo ] = ti;
+        }
+        {
+            ReflectTypeInfo ti;
+            createSetterGetter( ti, "Items", typeid(char[][]) );
+            createSetterGetter( ti, "Selection", typeid(char[]) );
+            createSetterGetter( ti, "TopIndex", typeid(int) );
+            createSetterGetter( ti, "ToolTipText", typeid(char[]) );
+            reflectTypeInfos[ List.classinfo ] = ti;
+        }
+        {
+            ReflectTypeInfo ti;
+            createSetterGetter( ti, "Selection", typeid(char[]) );
+            createSetterGetter( ti, "ToolTipText", typeid(char[]) );
+            reflectTypeInfos[ ProgressBar.classinfo ] = ti;
+        }
+        {
+            ReflectTypeInfo ti;
+            createSetterGetter( ti, "ToolTipText", typeid(char[]) );
+            reflectTypeInfos[ Sash.classinfo ] = ti;
+        }
+        {
+            ReflectTypeInfo ti;
+            createSetterGetter( ti, "Selection", typeid(int) );
+            createSetterGetter( ti, "ToolTipText", typeid(char[]) );
+            reflectTypeInfos[ Scale.classinfo ] = ti;
+        }
+        {
+            ReflectTypeInfo ti;
+            createSetterGetter( ti, "Selection", typeid(int) );
+            createSetterGetter( ti, "ToolTipText", typeid(char[]) );
+            reflectTypeInfos[ Slider.classinfo ] = ti;
+        }
+        {
+            ReflectTypeInfo ti;
+            createSetterGetter( ti, "Selection", typeid(int) );
+            createSetterGetter( ti, "ToolTipText", typeid(char[]) );
+            reflectTypeInfos[ Spinner.classinfo ] = ti;
+        }
+        {
+            ReflectTypeInfo ti;
+            createSetterGetter( ti, "DoubleClickEnabled", typeid(bool) );
+            createSetterGetter( ti, "EchoChar", typeid(wchar) );
+            createSetterGetter( ti, "Editable", typeid(bool) );
+            createSetterGetter( ti, "Orientation", typeid(int) );
+            createSetterGetter( ti, "Selection", typeid(Point) );
+            createSetterGetter( ti, "Tabs", typeid(int) );
+            createSetterGetter( ti, "Text", typeid(char[]) );
+            createSetterGetter( ti, "TextLimit", typeid(int) );
+            createSetterGetter( ti, "ToolTipText", typeid(char[]) );
+            createSetterGetter( ti, "TopIndex", typeid(int) );
+            reflectTypeInfos[ Text.classinfo ] = ti;
+        }
+        {
+            ReflectTypeInfo ti;
+            createSetterGetter( ti, "Message", typeid(int) );
+            createSetterGetter( ti, "Text", typeid(char[]) );
+            reflectTypeInfos[ ToolTip.classinfo ] = ti;
+        }
+        {
+            ReflectTypeInfo ti;
+            createSetterGetter( ti, "ColumnOrder", typeid(int[]) );
+            createSetterGetter( ti, "Selection", typeid(TreeItem[]) );
+            createSetterGetter( ti, "ToolTipText", typeid(char[]) );
+            createSetterGetter( ti, "TopItem", typeid(int) );
+            reflectTypeInfos[ Tree.classinfo ] = ti;
+        }
+
+        /+{
+            ReflectTypeInfo ti;
+            createSetterGetter( ti, "Editable", typeid(bool) );
+            createSetterGetter( ti, "Items", typeid(char[]) );
+            createSetterGetter( ti, "Selection", typeid(Point) );
+            createSetterGetter( ti, "Text", typeid(char[]) );
+            createSetterGetter( ti, "TextLimit", typeid(int) );
+            createSetterGetter( ti, "ToolTipText", typeid(char[]) );
+            createSetterGetter( ti, "VisibleItemCount", typeid(int) );
+            reflectTypeInfos[ CCombo.classinfo ] = ti;
+        }+/
+    }
+    /**
+     * Creates the Tab within a given instance of ControlExample.
+     */
+    this(ControlExample instance) {
+        this.instance = instance;
+        registerTypes();
+    }
+
+    /**
+     * 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.
+         */
+        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(methodNames) SelectionAdapter {
+                char[][] mths;
+                this( char[][] mths ){ this.mths = mths; }
+                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, mths);
+                }
+            });
+        }
+    }
+
+    /**
+     * 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 () {
+        Shell dialog = new Shell (shell, DWT.DIALOG_TRIM | DWT.APPLICATION_MODAL);
+        dialog.setText (ControlExample.getResourceString ("Select_Listeners"));
+        dialog.setLayout (new GridLayout (2, false));
+        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( EVENT_NAMES[i].name );
+            item.setChecked (eventsFilter[i]);
+        }
+        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(table, customNames) SelectionAdapter {
+            Table tbl;
+            char[][] cn;
+            this( Table tbl, char[][] cn ){ this.tbl = tbl; this.cn = cn; }
+            public void widgetSelected(SelectionEvent e) {
+                TableItem [] items = tbl.getItems();
+                for (int i = 0; i < EVENT_NAMES.length; i++) {
+                    items[i].setChecked(true);
+                }
+                for (int i = 0; i < cn.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(table, customNames) SelectionAdapter {
+            Table tbl;
+            char[][] cn;
+            this( Table tbl, char[][] cn ){ this.tbl = tbl; this.cn = cn; }
+            public void widgetSelected(SelectionEvent e) {
+                TableItem [] items = tbl.getItems();
+                for (int i = 0; i < EVENT_NAMES.length; i++) {
+                    items[i].setChecked(false);
+                }
+                for (int i = 0; i < cn.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(dialog, table, customNames ) SelectionAdapter {
+            Shell dlg;
+            Table tbl;
+            char[][] cn;
+            this( Shell dlg, Table tbl, char[][] cn ){ this.tbl = tbl; this.dlg = dlg; this.cn = cn; }
+            public void widgetSelected(SelectionEvent e) {
+                TableItem [] items = tbl.getItems();
+                for (int i = 0; i < EVENT_NAMES.length; i++) {
+                    eventsFilter[i] = items[i].getChecked();
+                }
+                for (int i = 0; i < cn.length; i++) {
+                    eventsFilter[EVENT_NAMES.length + i] = items[EVENT_NAMES.length + i].getChecked();
+                }
+                dlg.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.
+         */
+        Button listenCheckbox = new Button (listenersGroup, DWT.CHECK);
+        listenCheckbox.setText (ControlExample.getResourceString ("Listen"));
+        listenCheckbox.addSelectionListener (new class(listenCheckbox) SelectionAdapter {
+            Button lcb;
+            this( Button lcb ){ this.lcb = lcb; }
+            public void widgetSelected(SelectionEvent e) {
+                logging = lcb.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) {
+        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[] methodName = "get" ~ methodRoot;
+        auto mthi = getMethodInfo( methodName );
+        char[] typeNameString = mthi.returnType.toString;
+//PORTING_LEFT
+
+//        char[] typeName = null;
+//         ClassInfo returnType = getReturnType(methodRoot);
+         bool isArray = false;
+         TypeInfo ti = mthi.returnType;
+
+         if ( auto tia = cast(TypeInfo_Array) mthi.returnType ) {
+             ti = tia.value;
+             isArray = true;
+         }
+         if ( auto tia = cast(TypeInfo_Class ) ti ) {
+         } else if ( auto tia = cast(TypeInfo_Interface ) ti ) {
+         } else {
+         }
+         //char[] typeNameString = typeName;
+         char[] info;
+//         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]);
+
+        return Format( ControlExample.getResourceString("Parameter_Info"), typeNameString, info );
+    }
+
+    void getValue() {
+//PORTING_LEFT
+/+
+        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");
+            }
+        }
++/
+    }
+
+    private ReflectMethodInfo getMethodInfo( char[] methodName ){
+        Widget[] widgets = getExampleWidgets();
+        if( widgets.length is 0 ){
+            Stdout.formatln( "getWidgets returns null in {}", this.classinfo.name );
+        }
+        if( auto rti = widgets[0].classinfo in reflectTypeInfos ){
+            if( auto mthi = methodName in rti.methods ){
+                return *mthi;
+            }
+            else{
+                Stdout.formatln( "method unknown {} in type {} in {}", methodName, widgets[0].classinfo.name, this.classinfo.name );
+            }
+        }
+        else{
+            Stdout.formatln( "type unknown {} in {}", widgets[0].classinfo.name, this.classinfo.name );
+        }
+    }
+
+    TypeInfo getReturnType(char[] methodRoot) {
+        char[] methodName = "get" ~ methodRoot;
+        auto mthi = getMethodInfo( methodName );
+        return mthi.returnType;
+    }
+
+    void setValue() {
+//PORTING_LEFT
+/+
+        /* 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());
+            }
+        }
++/
+return null;
+    }
+
+    Object[] parameterForType(char[] typeName, char[] value, Widget widget) {
+//PORTING_LEFT
+return null;
+        //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 ( Format( "{} X {}", TOO_SMALL_SIZE, TOO_SMALL_SIZE));
+        smallButton = new Button(sizeGroup, DWT.RADIO);
+        smallButton.setText (Format( "{} X {}", SMALL_SIZE, SMALL_SIZE));
+        largeButton = new Button (sizeGroup, DWT.RADIO);
+        largeButton.setText (Format( "{} X {}", LARGE_SIZE, 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++) {
+            Control control = controls [i];
+            control.addListener(DWT.MenuDetect, new class(control) Listener {
+                Control ctrl;
+                this( Control ctrl ){ this.ctrl = ctrl; }
+                public void handleEvent(Event event) {
+                    Menu menu = ctrl.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);
+                        ctrl.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 null;
+    }
+
+    /**
+     * 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 null;
+    }
+
+    /**
+     * 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 ( EVENT_NAMES[i].id, listener);
+            }
+        }
+    }
+
+    /**
+     * Logs an untyped event to the event console.
+     */
+    void log(Event event) {
+        int i = 0;
+        while (i < EVENT_NAMES.length) {
+            if (EVENT_NAMES[i].id is event.type) break;
+            i++;
+        }
+        char[] str = Format( "{} [{}]: ", EVENT_NAMES[i].name, event.type );
+        switch (event.type) {
+            case DWT.KeyDown:
+            case DWT.KeyUp: str ~= (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: str ~= (new MouseEvent (event)).toString (); break;
+            case DWT.Paint: str ~= (new PaintEvent (event)).toString (); break;
+            case DWT.Move:
+            case DWT.Resize: str ~= (new ControlEvent (event)).toString (); break;
+            case DWT.Dispose: str ~= (new DisposeEvent (event)).toString (); break;
+            case DWT.Selection:
+            case DWT.DefaultSelection: str ~= (new SelectionEvent (event)).toString (); break;
+            case DWT.FocusIn:
+            case DWT.FocusOut: str ~= (new FocusEvent (event)).toString (); break;
+            case DWT.Expand:
+            case DWT.Collapse: str ~= (new TreeEvent (event)).toString (); break;
+            case DWT.Iconify:
+            case DWT.Deiconify:
+            case DWT.Close:
+            case DWT.Activate:
+            case DWT.Deactivate: str ~=( new ShellEvent (event)).toString (); break;
+            case DWT.Show:
+            case DWT.Hide: str ~= ( null !is cast(Menu)event.widget) ? (new MenuEvent (event)).toString () : event.toString(); break;
+            case DWT.Modify: str ~= (new ModifyEvent (event)).toString (); break;
+            case DWT.Verify: str ~= (new VerifyEvent (event)).toString (); break;
+            case DWT.Help: str ~= (new HelpEvent (event)).toString (); break;
+            case DWT.Arm: str ~= (new ArmEvent (event)).toString (); break;
+            case DWT.Traverse: str ~= (new TraverseEvent (event)).toString (); break;
+            case DWT.HardKeyDown:
+            case DWT.HardKeyUp:
+            case DWT.DragDetect:
+            case DWT.MenuDetect:
+            case DWT.SetData:
+            default: str ~= event.toString ();
+        }
+        eventConsole.append (str);
+        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=="DWT.INHERIT_DEFAULT") mode = DWT.INHERIT_DEFAULT;
+        if (modeString=="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 = tango.text.Util.locate( string, ch, start);
+            if (end is string.length ) end = length;
+            char[] substr = string[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	Fri Feb 01 21:46:26 2008 +0100
@@ -0,0 +1,186 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module 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;
+
+import dwtexamples.controlexample.Tab;
+import dwtexamples.controlexample.ControlExample;
+import tango.text.convert.Format;
+
+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 char[] [] TabItems1;
+
+    /**
+     * Creates the Tab within a given instance of ControlExample.
+     */
+    this(ControlExample instance) {
+        super(instance);
+        if( TabItems1.length is 0 ){
+            TabItems1 = [
+                ControlExample.getResourceString("TabItem1_0"),
+                ControlExample.getResourceString("TabItem1_1"),
+                ControlExample.getResourceString("TabItem1_2")];
+        }
+    }
+
+    /**
+     * 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(Format( ControlExample.getResourceString("Tooltip"), TabItems1[i] ));
+            Text content = new Text(tabFolder1, DWT.WRAP | DWT.MULTI);
+            content.setText(Format( "{}: {}", 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 [cast(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).
+     */
+    char[][] getMethodNames() {
+        return ["Selection", "SelectionIndex"];
+    }
+
+    char[] setMethodName(char[] methodRoot) {
+        /* Override to handle special case of int getSelectionIndex()/setSelection(int) */
+        return (methodRoot == "SelectionIndex") ? "setSelection" : "set" ~ methodRoot;
+    }
+
+//PROTING_LEFT
+/+
+    Object[] parameterForType(char[] typeName, char[] value, Widget widget) {
+        if (value.length is 0 ) 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;")) {
+            char[][] 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(char[] value, TabItem[] items) {
+        for (int i = 0; i < items.length; i++) {
+            TabItem item = items[i];
+            if (item.getText() ==/*eq*/ value) return item;
+        }
+        return null;
+    }
+
+    /**
+     * Gets the short text for the tab folder item.
+     */
+    public char[] getShortTabText() {
+        return "TF";
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    char[] 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	Fri Feb 01 21:46:26 2008 +0100
@@ -0,0 +1,718 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module 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;
+
+import dwtexamples.controlexample.Tab;
+import dwtexamples.controlexample.ControlExample;
+import dwtexamples.controlexample.ScrollableTab;
+import tango.text.convert.Format;
+import tango.util.Convert;
+import tango.core.Exception;
+
+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 const int ITEM_FOREGROUND_COLOR = 3;
+    static const int ITEM_BACKGROUND_COLOR = 4;
+    static const int ITEM_FONT = 5;
+    static const int CELL_FOREGROUND_COLOR = 6;
+    static const int CELL_BACKGROUND_COLOR = 7;
+    static const int CELL_FONT = 8;
+    Color itemForegroundColor, itemBackgroundColor, cellForegroundColor, cellBackgroundColor;
+    Font itemFont, cellFont;
+
+    static char[] [] columnTitles;
+    static char[][][] tableData;
+
+    Point menuMouseCoords;
+
+    /**
+     * Creates the Tab within a given instance of ControlExample.
+     */
+    this(ControlExample instance) {
+        super(instance);
+        if( columnTitles.length is 0 ){
+            columnTitles   = [
+                ControlExample.getResourceString("TableTitle_0"),
+                ControlExample.getResourceString("TableTitle_1"),
+                ControlExample.getResourceString("TableTitle_2"),
+                ControlExample.getResourceString("TableTitle_3")];
+        }
+        if( tableData.length is 0 ){
+            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") ]];
+        }
+    }
+
+    /**
+     * 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 class() 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 class() SelectionAdapter {
+            public void widgetSelected (SelectionEvent event) {
+                setWidgetLinesVisible ();
+            }
+        });
+        multipleColumns.addSelectionListener (new class() SelectionAdapter {
+            public void widgetSelected (SelectionEvent event) {
+                recreateExampleWidgets ();
+            }
+        });
+        headerVisibleButton.addSelectionListener (new class() SelectionAdapter {
+            public void widgetSelected (SelectionEvent event) {
+                setWidgetHeaderVisible ();
+            }
+        });
+        sortIndicatorButton.addSelectionListener (new class() SelectionAdapter {
+            public void widgetSelected (SelectionEvent event) {
+                setWidgetSortIndicator ();
+            }
+        });
+        moveableColumns.addSelectionListener (new class() SelectionAdapter {
+            public void widgetSelected (SelectionEvent event) {
+                setColumnsMoveable ();
+            }
+        });
+        resizableColumns.addSelectionListener (new class() SelectionAdapter {
+            public void widgetSelected (SelectionEvent event) {
+                setColumnsResizable ();
+            }
+        });
+        headerImagesButton.addSelectionListener (new class() SelectionAdapter {
+            public void widgetSelected (SelectionEvent event) {
+                recreateExampleWidgets ();
+            }
+        });
+        subImagesButton.addSelectionListener (new class() 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( Format( ControlExample.getResourceString("Tooltip"), 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") ~ to!(char[])(i));
+        }
+        packColumns();
+    }
+
+    void setItemText(TableItem item, int i, char[] 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 class() 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 [ cast(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).
+     */
+    char[][] getMethodNames() {
+        return ["ColumnOrder", "ItemCount", "Selection", "SelectionIndex", "ToolTipText", "TopIndex"];
+    }
+
+    char[] setMethodName(char[] methodRoot) {
+        /* Override to handle special case of int getSelectionIndex()/setSelection(int) */
+        return (methodRoot == "SelectionIndex" ) ? "setSelection" : "set" ~ methodRoot;
+    }
+
+    void packColumns () {
+        int columnCount = table1.getColumnCount();
+        for (int i = 0; i < columnCount; i++) {
+            TableColumn tableColumn = table1.getColumn(i);
+            tableColumn.pack();
+        }
+    }
+
+//PORTING_LEFT
+/+
+    Object[] parameterForType(char[] typeName, char[] value, Widget widget) {
+        if (value.length is 0 ) return [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;")) {
+            char[][] 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(char[] value, TableItem[] items) {
+        for (int i = 0; i < items.length; i++) {
+            TableItem item = items[i];
+            if (item.getText() == value ) return item;
+        }
+        return null;
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    char[] 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 class() 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(cast(TableColumn)e.widget);
+                        }
+                        table1.setSortDirection (sortDirection);
+                    }
+                };
+                column.addSelectionListener(listener);
+                column.setData("SortListener", cast(Object)listener);   //$NON-NLS-1$
+            }
+        } else {
+            table1.setSortDirection (DWT.NONE);
+            TableColumn [] columns = table1.getColumns();
+            for (int i = 0; i < columns.length; i++) {
+                SelectionListener listener = cast(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 class() SelectionAdapter {
+            public void widgetSelected(SelectionEvent e) {
+                eventConsole.append ("getItem(Point(" ~ menuMouseCoords.toString() ~ ")) returned: " ~ ((table1.getItem(menuMouseCoords))).toString);
+                eventConsole.append ("\n");
+            };
+        });
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/controlexample/TextTab.d	Fri Feb 01 21:46:26 2008 +0100
@@ -0,0 +1,195 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module 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;
+
+import dwtexamples.controlexample.Tab;
+import dwtexamples.controlexample.ControlExample;
+import dwtexamples.controlexample.ScrollableTab;
+
+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 class() ControlAdapter {
+            public void controlResized(ControlEvent e) {
+                setExampleWidgetSize ();
+            }
+        });
+
+        return tabFolderPage;
+    }
+
+    /**
+     * Gets the "Example" widget children.
+     */
+    Widget [] getExampleWidgets () {
+        return [ cast(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).
+     */
+    char[][] getMethodNames() {
+        return ["DoubleClickEnabled", "EchoChar", "Editable", "Orientation", "Selection", "Tabs", "Text", "TextLimit", "ToolTipText", "TopIndex"];
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    char[] 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	Fri Feb 01 21:46:26 2008 +0100
@@ -0,0 +1,397 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module 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;
+
+import dwtexamples.controlexample.Tab;
+import dwtexamples.controlexample.ControlExample;
+import tango.util.Convert;
+
+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 (["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 (["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 (["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 class() 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 [ cast(Widget) imageToolBar, textToolBar, imageTextToolBar ];
+    }
+
+    /**
+     * Gets the short text for the tab folder item.
+     */
+    public char[] getShortTabText() {
+        return "TB";
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    char[] 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 : 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 char[] text = ControlExample.getResourceString("DropDownData_" ~ to!(char[])(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 class() 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 = cast(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	Fri Feb 01 21:46:26 2008 +0100
@@ -0,0 +1,268 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module 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;
+
+import dwtexamples.controlexample.Tab;
+import dwtexamples.controlexample.ControlExample;
+
+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 class() 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 class() 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 class() SelectionAdapter {
+            public void widgetSelected (SelectionEvent event) {
+                setExampleWidgetAutoHide ();
+            }
+        });
+        showInTrayButton.addSelectionListener (new class() SelectionAdapter {
+            public void widgetSelected (SelectionEvent event) {
+                showExampleWidgetInTray ();
+            }
+        });
+        shell.addDisposeListener(new class() 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 [ cast(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).
+     */
+    char[][] getMethodNames() {
+        return ["Message", "Text"];
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    char[] 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	Fri Feb 01 21:46:26 2008 +0100
@@ -0,0 +1,823 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module 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;
+
+import dwtexamples.controlexample.Tab;
+import dwtexamples.controlexample.ControlExample;
+import dwtexamples.controlexample.ScrollableTab;
+import tango.text.convert.Format;
+import tango.util.Convert;
+import tango.core.Exception;
+
+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 const int ITEM_FOREGROUND_COLOR = 3;
+    static const int ITEM_BACKGROUND_COLOR = 4;
+    static const int ITEM_FONT = 5;
+    static const int CELL_FOREGROUND_COLOR = 6;
+    static const int CELL_BACKGROUND_COLOR = 7;
+    static const int CELL_FONT = 8;
+    Color itemForegroundColor, itemBackgroundColor, cellForegroundColor, cellBackgroundColor;
+    Font itemFont, cellFont;
+
+    static char[] [] columnTitles;
+
+    static char[][][] tableData;
+
+    Point menuMouseCoords;
+
+    /**
+     * Creates the Tab within a given instance of ControlExample.
+     */
+    this(ControlExample instance) {
+        super(instance);
+        if( columnTitles.length is 0 ){
+            columnTitles   = [
+                ControlExample.getResourceString("TableTitle_0"),
+                ControlExample.getResourceString("TableTitle_1"),
+                ControlExample.getResourceString("TableTitle_2"),
+                ControlExample.getResourceString("TableTitle_3")];
+        }
+        if( tableData.length is 0 ){
+            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") ] ];
+        }
+    }
+
+    /**
+     * 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 class() 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 class() SelectionAdapter {
+            public void widgetSelected (SelectionEvent event) {
+                setWidgetLinesVisible ();
+            }
+        });
+        multipleColumns.addSelectionListener (new class() SelectionAdapter {
+            public void widgetSelected (SelectionEvent event) {
+                recreateExampleWidgets ();
+            }
+        });
+        headerVisibleButton.addSelectionListener (new class() SelectionAdapter {
+            public void widgetSelected (SelectionEvent event) {
+                setWidgetHeaderVisible ();
+            }
+        });
+        sortIndicatorButton.addSelectionListener (new class() SelectionAdapter {
+            public void widgetSelected (SelectionEvent event) {
+                setWidgetSortIndicator ();
+            }
+        });
+        moveableColumns.addSelectionListener (new class() SelectionAdapter {
+            public void widgetSelected (SelectionEvent event) {
+                setColumnsMoveable ();
+            }
+        });
+        resizableColumns.addSelectionListener (new class() SelectionAdapter {
+            public void widgetSelected (SelectionEvent event) {
+                setColumnsResizable ();
+            }
+        });
+        headerImagesButton.addSelectionListener (new class() SelectionAdapter {
+            public void widgetSelected (SelectionEvent event) {
+                recreateExampleWidgets ();
+            }
+        });
+        subImagesButton.addSelectionListener (new class() 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(Format( ControlExample.getResourceString("Tooltip") , 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_" ~ to!(char[])(i + 1)));
+            if (i < 3) {
+                TreeItem subitem = new TreeItem (item, DWT.NONE);
+                setItemText(subitem, i, ControlExample.getResourceString("Node_" ~ to!(char[])(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(Format( ControlExample.getResourceString("Tooltip"), 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_" ~ to!(char[])(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_" ~ to!(char[])(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, char[] 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 class() 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 [ cast(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).
+     */
+    char[][] getMethodNames() {
+        return ["ColumnOrder", "Selection", "ToolTipText", "TopItem"];
+    }
+
+//PORTING_LEFT
+/+
+    Object[] parameterForType(char[] typeName, char[] 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;")) {
+            char[][] 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(char[] value, TreeItem[] items) {
+        for (int i = 0; i < items.length; i++) {
+            TreeItem item = items[i];
+            if (item.getText() == value ) return item;
+            item = findItem(value, item.getItems());
+            if (item !is null) return item;
+        }
+        return null;
+    }
+
+    /**
+     * Gets the text for the tab folder item.
+     */
+    char[] 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 (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 class(tree) SelectionAdapter {
+                Tree t;
+                this( Tree t ){ this.t = t; }
+                public void widgetSelected(SelectionEvent e) {
+                    int sortDirection = DWT.DOWN;
+                    if (e.widget is t.getSortColumn()) {
+                        /* If the sort column hasn't changed, cycle down -> up -> none. */
+                        switch (t.getSortDirection ()) {
+                        case DWT.DOWN: sortDirection = DWT.UP; break;
+                        case DWT.UP: sortDirection = DWT.NONE; break;
+                        }
+                    } else {
+                        t.setSortColumn(cast(TreeColumn)e.widget);
+                    }
+                    t.setSortDirection (sortDirection);
+                }
+            };
+            column.addSelectionListener(listener);
+            column.setData("SortListener", cast(Object)listener);   //$NON-NLS-1$
+        }
+    }
+
+    void resetSortState (Tree tree) {
+        tree.setSortDirection (DWT.NONE);
+        TreeColumn [] columns = tree.getColumns();
+        for (int i = 0; i < columns.length; i++) {
+            SelectionListener listener = cast(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");
+        Tree t = cast(Tree) event.widget;
+        menuMouseCoords = t.toControl(new Point(event.x, event.y));
+        item.addSelectionListener(new class(t) SelectionAdapter {
+            Tree t;
+            this( Tree t ){ this.t = t; }
+            public void widgetSelected(SelectionEvent e) {
+                eventConsole.append ("getItem(Point(" ~ menuMouseCoords.toString ~ ")) returned: " ~ (this.t.getItem(menuMouseCoords)).toString);
+                eventConsole.append ("\n");
+            };
+        });
+    }
+}
Binary file dwtexamples/controlexample/backgroundImage.png has changed
Binary file dwtexamples/controlexample/bold.bmp has changed
Binary file dwtexamples/controlexample/bold_mask.bmp has changed
Binary file dwtexamples/controlexample/closedFolder.gif has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/controlexample/controlexample.properties	Fri Feb 01 21:46:26 2008 +0100
@@ -0,0 +1,247 @@
+###############################################################################
+# 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
+###############################################################################
+error.CouldNotLoadResources = Unable to load resources
+window.title = SWT Controls
+custom.window.title = SWT Custom Controls
+
+Text_Buttons		= Text Buttons
+Size 				= Size
+Alignment			= Alignment
+Left				= Left
+Right				= Right
+Up					= Up
+Down				= Down
+Center				= Center
+One					= One
+Two					= Two
+Three				= Three
+Image_Buttons		= Image Buttons
+Image_Text_Buttons	= Image and Text Buttons
+Control_Example		= Control Example
+Parameters			= Parameters
+Other				= Other
+Enabled				= Enabled
+Visible				= Visible
+BackgroundImage		= Background Image
+Preferred 			= Preferred
+Styles	 			= Styles
+Menu_Styles	 		= Menu Styles
+MenuItem_Styles	 	= MenuItem Styles
+Background_Mode		= Background Mode on Parent
+Listeners			= Listeners
+Select_Listeners	= Select Listeners
+Listen				= Listen
+Clear				= Clear
+Set_Get				= Set/Get API
+Parameter_Info		= {0}   e.g. {1} 
+Info_int			= 4
+Info_intA			= 0,1,2
+Info_long			= 4
+Info_longA			= 0,1,2
+Info_char			= c
+Info_charA			= a,b,c
+Info_boolean		= true
+Info_booleanA		= true,true,false
+Info_String			= hello
+Info_StringA		= hello,there
+Info_Point			= 0,0
+Info_TabItem		= Tab 0
+Info_TabItemA		= Tab 0,Tab 2
+Info_TableItem		= Index:2
+Info_TableItemA		= Index:2,Index:4
+Info_TreeItem		= Node 1
+Info_TreeItemA		= Node 1,Node 3
+Select_All			= Select All
+Deselect_All		= Deselect All
+OK					= OK
+FillDamage			= Fill Damaged Area With Color
+Title_Text			= Title Text
+Text_Labels			= Text Labels
+Image_Labels		= Image Labels
+Custom_Labels		= Custom Labels
+Custom_Combo		= Custom Combo
+One_Two_Three		= One Two Three
+Text_ToolBar 		= Text ToolBar
+Image_ToolBar 		= Image ToolBar
+ImageText_ToolBar	= Image and Text ToolBar
+Maximum				= Maximum
+Minimum				= Minimum
+Selection			= Selection
+Increment			= Increment
+Page_Increment		= Page Increment
+Thumb				= Thumb
+Digits				= Digits
+Tree_With_Images	= Tree With Images
+Dialog_Type			= Dialog Type
+Create_Dialog		= Create Dialog
+Button_Styles		= Button Styles
+Icon_Styles			= Icon Styles
+Modal_Styles		= Modal Styles
+File_Dialog_Styles	= File Dialog Styles
+Item_Styles			= Item Styles
+Dialog_Result		= Dialog Result
+ColorDialog			= ColorDialog
+DirectoryDialog		= DirectoryDialog
+FileDialog			= FileDialog
+FontDialog			= FontDialog
+PrintDialog			= PrintDialog
+MessageBox			= MessageBox
+Multi_line			= A multi line text widget.
+Example_string		= The quick brown fox jumps over the lazy dog.
+Header_Visible		= Header Visible
+Sort_Indicator		= Sort Indicator
+Header_Images		= Header Images
+Sub_Images			= Sub Images
+Lines_Visible		= Lines Visible
+Moveable_Columns	= Moveable Columns
+Multiple_Columns	= Multiple Columns
+Locked				= Locked
+Combo_child			= Combo Child
+Node_1				= Node 1
+Node_2				= Node 2
+Node_3				= Node 3
+Node_4				= Node 4
+Node_1_1			= Node 1.1
+Node_2_1			= Node 2.1
+Node_3_1			= Node 3.1
+Node_2_2			= Node 2.2
+Node_2_2_1			= Node 2.2.1
+Parent				= Parent
+No_Parent			= No Parent
+Decoration_Styles	= Decoration Styles
+Create_Shell		= Create Shell
+Close_All_Shells	= Close All Shells
+Push				= Push
+Radio				= Radio
+Check				= Check
+Cascade				= Cascade
+Drop_Down			= Drop Down
+Images_failed		= Warning: Failed to load images
+readme_txt			= readme.txt
+Index				= Index:
+Title				= Title:
+Close				= Close
+Result				= Result: {0}
+FilterName_0		= Text Files
+FilterName_1		= Batch Files
+FilterName_2		= Doc Files
+FilterName_3		= All Files
+TableTitle_0		= Name
+TableTitle_1		= Type
+TableTitle_2		= Size
+TableTitle_3		= Modified
+TableLine0_0		= <empty>
+TableLine0_1		= classes
+TableLine0_2		= 0
+TableLine0_3		= today
+TableLine1_0		= <empty>
+TableLine1_1		= databases
+TableLine1_2		= 2556
+TableLine1_3		= tomorrow
+TableLine2_0		= <empty>
+TableLine2_1		= images
+TableLine2_2		= 91571
+TableLine2_3		= yesterday
+ListData0_0			= Line 1
+ListData0_1			= Line 2
+ListData0_2			= Line 3
+ListData0_3			= Line 4
+ListData0_4			= Line 5
+ListData0_5			= Line 6
+ListData0_6			= Line 7
+ListData0_7			= Line 8
+ListData0_8			= Longest Line In List
+ListData1_0			= Apples
+ListData1_1			= Oranges
+ListData1_2			= Bananas
+ListData1_3			= Grapefruit
+ListData1_4			= Peaches
+ListData1_5			= Kiwi
+ListData1_6			= Apricots
+ListData1_7			= Strawberries
+ListData1_8			= The Longest String
+DropDownData_0		= Apples
+DropDownData_1		= Oranges
+DropDownData_2		=
+DropDownData_3		= Grapefruit
+DropDownData_4		= Peaches
+DropDownData_5		= Kiwi
+DropDownData_6		=
+DropDownData_7		= Strawberries
+DropDownData_8		= The Longest String
+Colors 				= Colors and Font
+Change				= &Change...
+Defaults			= &Defaults
+Foreground_Color	= Foreground Color
+Background_Color	= Background Color
+Font				= Font
+Item_Foreground_Color	= Item 0 Foreground Color
+Item_Background_Color	= Item 0 Background Color
+Item_Font				= Item 0 Font
+Cell_Foreground_Color	= Item 0 Col 1 Foreground Color
+Cell_Background_Color	= Item 0 Col 1 Background Color
+Cell_Font				= Item 0 Col 1 Font
+Wrap_Text			= Jack and Jill went up the hill to fetch a pail of water, \
+					  Jack fell down and broke his crown and Jill came tumbling after!
+Foreground_Style	= Foreground
+Background_Style 	= Background
+StyledText_Styles	= Text Styles
+StyledText_Style_Instructions	= Select text, then style.
+Bold				= Bold
+Italic				= Italic
+Underline			= Underline
+Strikeout			= Strikeout
+Fill_X				= Horizontal Fill
+Fill_Y				= Vertical Fill
+Pack_Columns		= Pack Columns
+TabItem1_0			= Tab 0
+TabItem1_1			= Tab 1
+TabItem1_2			= Tab 2
+TabItem_content		= TabItem Content
+CTabItem1_0			= CTabItem 0
+CTabItem1_1			= CTabItem 1
+CTabItem1_2			= CTabItem 2 has a long name
+CItem_Colors		= CTabItem Colors
+CTabItem_content	= CTabItem Content
+Set_Simple_Tabs		= Simple Tabs
+Set_Single_Tabs		= Single Tab
+Set_Min_Visible     = Minimize
+Set_Max_Visible     = Maximize
+Set_Unselected_Close_Visible = Close on Unselected Tabs
+Set_Unselected_Image_Visible = Image on Unselected Tabs
+Selection_Foreground_Color = Selection Foreground Color
+Selection_Background_Color = Selection Background Color
+Set_Image			= Set Image
+TableTree_column	= Column
+MenuItem_Cut		= Cu&t	Ctrl+X
+MenuItem_Copy		= &Copy	Ctrl+C
+MenuItem_Paste		= &Paste	Ctrl+V
+MenuItem_SelectAll	= Select &All	Ctrl+A
+Orientation 		= Orientation
+Default 			= Default (Inherit)
+Images				= Images
+Accelerators		= Accelerators
+Mnemonics			= Mnemonics
+SubMenu				= Sub-Menu
+SubSubMenu			= Sub-Sub-Menu
+1Radio				= Radio1
+2Radio				= Radio2
+1RadioWithMnemonic	= Radio&1
+2RadioWithMnemonic	= Radio&2
+PushWithMnemonic	= &Push
+RadioWithMnemonic	= &Radio
+CheckWithMnemonic	= &Check
+CascadeWithMnemonic	= C&ascade
+PopupMenuHere		= Popup Menu Here
+LinkText=Visit the <A HREF=\"www.eclipse.org\">Eclipse.org</A> project and the <A HREF=\"www.eclipse.org\\swt">SWT</A> homepage.
+Tooltip				= Tooltip:  {0}
+Item1_Text			= "What is your favorite button?"
+Item2_Text			= "What is your favorite icon?"
\ No newline at end of file
Binary file dwtexamples/controlexample/italic.bmp has changed
Binary file dwtexamples/controlexample/italic_mask.bmp has changed
Binary file dwtexamples/controlexample/openFolder.gif has changed
Binary file dwtexamples/controlexample/parentBackgroundImage.png has changed
Binary file dwtexamples/controlexample/red.bmp has changed
Binary file dwtexamples/controlexample/red_mask.bmp has changed
Binary file dwtexamples/controlexample/strikeout.bmp has changed
Binary file dwtexamples/controlexample/strikeout_mask.bmp has changed
Binary file dwtexamples/controlexample/target.gif has changed
Binary file dwtexamples/controlexample/underline.bmp has changed
Binary file dwtexamples/controlexample/underline_mask.bmp has changed
Binary file dwtexamples/controlexample/yellow.bmp has changed
Binary file dwtexamples/controlexample/yellow_mask.bmp has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/helloworld/HelloWorld1.d	Fri Feb 01 21:46:26 2008 +0100
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2003 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+module dwtexamples.helloworld.HelloWorld1;
+
+
+import dwt.widgets.Display;
+import dwt.widgets.Shell;
+
+/*
+ * This example demonstrates the minimum amount of code required
+ * to open an DWT Shell and process the events.
+ */
+void main(){
+    Display display = new Display ();
+    Shell shell = new Shell (display);
+    shell.open ();
+    while (!shell.isDisposed ()) {
+        if (!display.readAndDispatch ()) display.sleep ();
+    }
+    display.dispose ();
+}
+
+// for unknown reason, there are linker errors. These imports are the workaround
+import tango.io.Stdout;
+import tango.math.Math;
+import tango.text.convert.Format;
+import tango.util.Convert;
+import tango.util.PathUtil;
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/helloworld/HelloWorld2.d	Fri Feb 01 21:46:26 2008 +0100
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2003 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+module dwtexamples.helloworld.HelloWorld2;
+
+import dwt.DWT;
+import dwt.widgets.Display;
+import dwt.widgets.Label;
+import dwt.widgets.Shell;
+
+/*
+ * This example builds on HelloWorld1 and demonstrates the minimum amount
+ * of code required to open an DWT Shell with a Label and process the events.
+ */
+
+void main(){
+    Display display = new Display ();
+    Shell shell = new Shell (display);
+    Label label = new Label (shell, DWT.CENTER);
+    label.setText ("Hello_world");
+    label.setBounds (shell.getClientArea ());
+    shell.open ();
+    while (!shell.isDisposed ()) {
+        if (!display.readAndDispatch ()) display.sleep ();
+    }
+    display.dispose ();
+}
+
+// for unknown reason, there are linker errors. These imports are the workaround
+import tango.io.Stdout;
+import tango.math.Math;
+import tango.text.convert.Format;
+import tango.util.Convert;
+import tango.util.PathUtil;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/helloworld/HelloWorld3.d	Fri Feb 01 21:46:26 2008 +0100
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2003 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+module dwtexamples.helloworld.HelloWorld3;
+
+import dwt.DWT;
+import dwt.events.ControlAdapter;
+import dwt.events.ControlEvent;
+import dwt.widgets.Display;
+import dwt.widgets.Label;
+import dwt.widgets.Shell;
+
+/*
+ * This example builds on HelloWorld2 and demonstrates how to resize the
+ * Label when the Shell resizes using a Listener mechanism.
+ */
+
+void main () {
+    Display display = new Display ();
+    final Shell shell = new Shell (display);
+    final Label label = new Label (shell, DWT.CENTER);
+    label.setText ("Hello_world");
+    label.pack();
+    shell.addControlListener(new class() ControlAdapter {
+        public void controlResized(ControlEvent e) {
+            label.setBounds (shell.getClientArea ());
+        }
+    });
+    shell.pack();
+    shell.open ();
+    while (!shell.isDisposed ()) {
+        if (!display.readAndDispatch ()) display.sleep ();
+    }
+    display.dispose ();
+}
+
+// for unknown reason, there are linker errors. These imports are the workaround
+import tango.io.Stdout;
+import tango.math.Math;
+import tango.text.convert.Format;
+import tango.util.Convert;
+import tango.util.PathUtil;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/helloworld/HelloWorld4.d	Fri Feb 01 21:46:26 2008 +0100
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2003 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+module dwtexamples.helloworld.HelloWorld4;
+
+import dwt.DWT;
+import dwt.layout.FillLayout;
+import dwt.widgets.Display;
+import dwt.widgets.Label;
+import dwt.widgets.Shell;
+
+/*
+ * This example builds on HelloWorld2 and demonstrates how to resize the
+ * Label when the Shell resizes using a Layout.
+ */
+void main () {
+    Display display = new Display ();
+    Shell shell = new Shell (display);
+    shell.setLayout(new FillLayout());
+    Label label = new Label (shell, DWT.CENTER);
+    label.setText ("Hello_world");
+    shell.pack ();
+    shell.open ();
+    while (!shell.isDisposed ()) {
+        if (!display.readAndDispatch ()) display.sleep ();
+    }
+    display.dispose ();
+}
+
+
+// for unknown reason, there are linker errors. These imports are the workaround
+import tango.io.Stdout;
+import tango.math.Math;
+import tango.text.convert.Format;
+import tango.util.Convert;
+import tango.util.PathUtil;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/helloworld/HelloWorld5.d	Fri Feb 01 21:46:26 2008 +0100
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2003 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+module dwtexamples.helloworld.HelloWorld5;
+
+
+import dwt.events.DisposeEvent;
+import dwt.events.DisposeListener;
+import dwt.events.PaintEvent;
+import dwt.events.PaintListener;
+import dwt.graphics.Color;
+import dwt.graphics.GC;
+import dwt.graphics.Rectangle;
+import dwt.widgets.Display;
+import dwt.widgets.Shell;
+
+/*
+ * This example builds on HelloWorld1 and demonstrates how to draw directly
+ * on an DWT Control.
+ */
+
+void main () {
+    Display display = new Display ();
+    final Color red = new Color(display, 0xFF, 0, 0);
+    final Shell shell = new Shell (display);
+    shell.addPaintListener(new class() PaintListener {
+        public void paintControl(PaintEvent event){
+            GC gc = event.gc;
+            gc.setForeground(red);
+            Rectangle rect = shell.getClientArea();
+            gc.drawRectangle(rect.x + 10, rect.y + 10, rect.width - 20, rect.height - 20);
+            gc.drawString("Hello_world", rect.x + 20, rect.y + 20);
+        }
+    });
+    shell.addDisposeListener (new class() DisposeListener {
+        public void widgetDisposed (DisposeEvent e) {
+            red.dispose();
+        }
+    });
+    shell.open ();
+    while (!shell.isDisposed ()) {
+        if (!display.readAndDispatch ()) display.sleep ();
+    }
+    display.dispose ();
+}
+
+// for unknown reason, there are linker errors. These imports are the workaround
+import tango.io.Stdout;
+import tango.math.Math;
+import tango.text.convert.Format;
+import tango.util.Convert;
+import tango.util.PathUtil;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/helloworld/helloworld.properties	Fri Feb 01 21:46:26 2008 +0100
@@ -0,0 +1,11 @@
+###############################################################################
+# Copyright (c) 2000, 2003 IBM Corporation and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#     IBM Corporation - initial API and implementation
+###############################################################################
+Hello_world = Hello World
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/simple.d	Fri Feb 01 21:46:26 2008 +0100
@@ -0,0 +1,56 @@
+module dwtexample.simple;
+
+import dwt.DWT;
+import dwt.widgets.Display;
+import dwt.widgets.Shell;
+import dwt.widgets.Button;
+import dwt.widgets.Text;
+
+import tango.io.Stdout;
+import tango.math.Math;
+import tango.text.convert.Format;
+import tango.util.Convert;
+import tango.util.PathUtil;
+import dwt.events.SelectionListener;
+import dwt.events.SelectionEvent;
+
+
+import dwt.DWT;
+import dwt.widgets.Display;
+
+void main(){
+
+    try{
+
+        Display display = new Display();
+        Shell shell = new Shell(display);
+        shell.setSize(300, 200);
+        shell.setText("Simple DWT Sample");
+        auto btn = new Button( shell, DWT.PUSH );
+        btn.setBounds(40, 50, 100, 50);
+        btn.setText( "hey" );
+
+        auto txt = new Text(shell, DWT.BORDER);
+        txt.setBounds(170, 50, 100, 40);
+
+        btn.addSelectionListener(new class () SelectionListener {
+            public void widgetSelected(SelectionEvent event) {
+                txt.setText("No problem");
+            }
+            public void widgetDefaultSelected(SelectionEvent event) {
+                txt.setText("No worries!");
+            }
+        });
+
+        shell.open();
+        while (!shell.isDisposed()) {
+            if (!display.readAndDispatch()) {
+                display.sleep();
+            }
+        }
+    }
+    catch (Exception e) {
+        Stdout.formatln (e.toString);
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtexamples/test.d	Fri Feb 01 21:46:26 2008 +0100
@@ -0,0 +1,44 @@
+module test;
+
+private import dwt.internal.gtk.c.cairo;
+private import tango.core.Traits;
+private import tango.io.Stdout;
+private import tango.stdc.stdio;
+
+struct lock {
+static void lock() { printf("lock\n");}
+static void unlock() { printf("unlock\n");}
+}
+
+const static char[] mm = "Inside outer cairo_version";
+
+template NameOfFunc(alias f) {
+    // Note: highly dependent on the .stringof formatting
+    // the value begins with "& " which is why the first two chars are cut off
+    const char[] NameOfFunc = (&f).stringof[2 .. $];
+}
+
+template ForwardGtkOsCFunc( alias cFunc ) {
+    alias ParameterTupleOf!(cFunc) P;
+    alias ReturnTypeOf!(cFunc) R;
+    mixin("public static R " ~ NameOfFunc!(cFunc) ~ "( P p ){
+        lock.lock();
+        scope(exit) lock.unlock();
+        Stdout (mm).newline; 
+        return cFunc(p);
+    }");
+}
+
+public class OS  {
+    mixin ForwardGtkOsCFunc!(cairo_version);
+    mixin ForwardGtkOsCFunc!(cairo_version_string);
+}
+
+void main()
+{
+    Stdout ("calling cairo_version...").newline;
+    int p = OS.cairo_version();
+    int i = cairo_version();
+    Stdout.formatln("OS.cairo_version() returns: {}    cairo_version() returns: {}", p, i ).newline;
+    printf("OS.cairo_version_string returns: %s\n",  cairo_version_string() );
+}
\ No newline at end of file