diff examples/controlexample/TreeTab.d @ 78:4a04b6759f98

Clean up directory names
author John Reimer <terminal.node@gmail.com>
date Sat, 10 May 2008 13:32:45 -0700
parents
children 3fbc483a4599
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/controlexample/TreeTab.d	Sat May 10 13:32:45 2008 -0700
@@ -0,0 +1,826 @@
+/*******************************************************************************
+ * 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 examples.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 examples.controlexample.Tab;
+import examples.controlexample.ControlExample;
+import examples.controlexample.ScrollableTab;
+
+import dwt.dwthelper.utils;
+
+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");
+            };
+        });
+    }
+}