changeset 145:161f7698cfb8

Moved jface snippets to viewers subpackage, there are more with conflicting numbers for other packages
author Frank Benoit <benoit@tionex.de>
date Fri, 08 Aug 2008 14:40:21 +0200
parents 7248e4c09c4f
children 7c4b76583cb8
files jface/snippets/Snippet001TableViewer.d jface/snippets/Snippet002TreeViewer.d jface/snippets/Snippet004HideSelection.d jface/snippets/Snippet005TreeCustomMenu.d jface/snippets/Snippet006TableMultiLineCells.d jface/snippets/Snippet007FullSelection.d jface/snippets/Snippet010OwnerDraw.d jface/snippets/Snippet014TreeViewerNoMandatoryLabelProvider.d jface/snippets/Snippet016TableLayout.d jface/snippets/Snippet026TreeViewerTabEditing.d jface/snippets/Snippet031TableViewerCustomTooltipsMultiSelection.d jface/snippets/Snippet040TableViewerSorting.d jface/snippets/Snippet043NoColumnTreeViewerKeyboardEditing.d jface/snippets/Snippet047VirtualLazyTreeViewer.d jface/snippets/viewers/Snippet001TableViewer.d jface/snippets/viewers/Snippet002TreeViewer.d jface/snippets/viewers/Snippet004HideSelection.d jface/snippets/viewers/Snippet005TreeCustomMenu.d jface/snippets/viewers/Snippet006TableMultiLineCells.d jface/snippets/viewers/Snippet007FullSelection.d jface/snippets/viewers/Snippet010OwnerDraw.d jface/snippets/viewers/Snippet014TreeViewerNoMandatoryLabelProvider.d jface/snippets/viewers/Snippet016TableLayout.d jface/snippets/viewers/Snippet026TreeViewerTabEditing.d jface/snippets/viewers/Snippet031TableViewerCustomTooltipsMultiSelection.d jface/snippets/viewers/Snippet040TableViewerSorting.d jface/snippets/viewers/Snippet043NoColumnTreeViewerKeyboardEditing.d jface/snippets/viewers/Snippet047VirtualLazyTreeViewer.d
diffstat 28 files changed, 3125 insertions(+), 3125 deletions(-) [+]
line wrap: on
line diff
--- a/jface/snippets/Snippet001TableViewer.d	Thu Aug 07 23:04:04 2008 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,110 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl 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:
- *     Tom Schindl - initial API and implementation
- * Port to the D programming language:
- *     wbaxter at gmail dot com
- *******************************************************************************/
-
-module jface.snippets.Snippet001TableViewer;
-
-import dwtx.jface.viewers.IStructuredContentProvider;
-import dwtx.jface.viewers.LabelProvider;
-import dwtx.jface.viewers.TableViewer;
-import dwtx.jface.viewers.Viewer;
-import dwt.layout.FillLayout;
-import dwt.widgets.Display;
-import dwt.widgets.Shell;
-import dwt.DWT;
-
-import dwt.dwthelper.utils;
-
-import tango.util.Convert;
-import dwtx.dwtxhelper.Collection;
-
-/**
- * A simple TableViewer to demonstrate usage
- *
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- *
- */
-public class Snippet001TableViewer {
-	private class MyContentProvider : IStructuredContentProvider {
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			return (cast(ArrayList)inputElement).toArray;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-
-		}
-
-	}
-
-	public class MyModel {
-		public int counter;
-
-		public this(int counter) {
-			this.counter = counter;
-		}
-
-		public String toString() {
-			return "Item " ~ to!(char[])(this.counter);
-		}
-	}
-
-	public this(Shell shell) {
-		final TableViewer v = new TableViewer(shell);
-		v.setLabelProvider(new LabelProvider());
-		v.setContentProvider(new MyContentProvider());
-		ArrayList model = createModel();
-		v.setInput(model);
-		v.getTable().setLinesVisible(true);
-	}
-
-	private ArrayList createModel() {
-		ArrayList elements = new ArrayList(10);
-
-		for( int i = 0; i < 10; i++ ) {
-			elements.add( new MyModel(i));
-		}
-
-		return elements;
-	}
-
-}
-
-void main()
-{
-    Display display = new Display ();
-    Shell shell = new Shell(display);
-    shell.setLayout(new FillLayout());
-    new Snippet001TableViewer(shell);
-    shell.open ();
-
-    while (!shell.isDisposed ()) {
-        if (!display.readAndDispatch ()) display.sleep ();
-    }
-
-    display.dispose ();
-
-}
-
--- a/jface/snippets/Snippet002TreeViewer.d	Thu Aug 07 23:04:04 2008 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,146 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl 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:
- *     Tom Schindl - initial API and implementation
- * Port to the D programming language:
- *     wbaxter at gmail dot com
- *******************************************************************************/
-
-module jface.snippets.Snippet002TreeViewer;
-
-import dwt.DWT;
-import dwtx.jface.viewers.ITreeContentProvider;
-import dwtx.jface.viewers.LabelProvider;
-import dwtx.jface.viewers.TreeViewer;
-import dwtx.jface.viewers.Viewer;
-import dwt.layout.FillLayout;
-import dwt.widgets.Display;
-import dwt.widgets.Shell;
-
-import dwt.dwthelper.utils;
-
-import tango.util.Convert;
-
-/**
- * A simple TreeViewer to demonstrate usage
- * 
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- *
- */
-class Snippet002TreeViewer {
-	private class MyContentProvider : ITreeContentProvider {
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			return (cast(MyModel)inputElement).child/*.dup*/;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-			
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
-		 */
-		public Object[] getChildren(Object parentElement) {
-			return getElements(parentElement);
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
-		 */
-		public Object getParent(Object element) {
-			if( element is null) {
-				return null;
-			}
-			
-			return (cast(MyModel)element).parent;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
-		 */
-		public bool hasChildren(Object element) {
-			return (cast(MyModel)element).child.length > 0;
-		}
-		
-	}
-	
-	public class MyModel {
-		public MyModel parent;
-		public MyModel[] child;
-		public int counter;
-		
-		public this(int counter, MyModel parent) {
-			this.parent = parent;
-			this.counter = counter;
-		}
-		
-		public String toString() {
-			String rv = "Item ";
-			if( parent !is null ) {
-				rv = parent.toString() ~ ".";
-			}
-			
-			rv ~= to!(char[])(counter);
-			
-			return rv;
-		}
-	}
-	
-	public this(Shell shell) {
-		TreeViewer v = new TreeViewer(shell);
-		v.setLabelProvider(new LabelProvider());
-		v.setContentProvider(new MyContentProvider());
-		v.setInput(createModel());
-	}
-	
-	private MyModel createModel() {
-		MyModel root = new MyModel(0,null);
-		root.counter = 0;
-		
-		MyModel tmp;
-		for( int i = 1; i < 10; i++ ) {
-			tmp = new MyModel(i, root);
-			root.child ~= tmp;
-			for( int j = 1; j < i; j++ ) {
-				tmp.child ~= new MyModel(j,tmp);
-			}
-		}
-		
-		return root;
-	}
-	
-}
-
-
-void main() {
-    Display display = new Display ();
-    Shell shell = new Shell(display);
-    shell.setLayout(new FillLayout());
-    new Snippet002TreeViewer(shell);
-    shell.open ();
-		
-    while (!shell.isDisposed ()) {
-        if (!display.readAndDispatch ()) display.sleep ();
-    }
-		
-    display.dispose ();
-}
--- a/jface/snippets/Snippet004HideSelection.d	Thu Aug 07 23:04:04 2008 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,127 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl 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:
- *     Tom Schindl - initial API and implementation
- * Port to the D programming language:
- *     wbaxter at gmail dot com
- *******************************************************************************/
-
-module jface.snippets.Snippet004HideSelection;
-
-import dwtx.jface.viewers.IStructuredContentProvider;
-import dwtx.jface.viewers.LabelProvider;
-import dwtx.jface.viewers.StructuredSelection;
-import dwtx.jface.viewers.TableViewer;
-import dwtx.jface.viewers.Viewer;
-import dwt.DWT;
-import dwt.events.MouseAdapter;
-import dwt.events.MouseEvent;
-import dwt.graphics.Point;
-import dwt.layout.FillLayout;
-import dwt.widgets.Display;
-import dwt.widgets.Shell;
-
-import dwt.dwthelper.utils;
-import dwtx.dwtxhelper.Collection;
-
-import tango.util.Convert;
-
-/**
- * Snippet that hides the selection when nothing is selected.
- *
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- *
- */
-public class Snippet004HideSelection {
-	private class MyContentProvider : IStructuredContentProvider {
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			return (cast(ArrayList)inputElement).toArray;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-
-		}
-	}
-
-	public class MyModel {
-		public int counter;
-
-		public this(int counter) {
-			this.counter = counter;
-		}
-
-		public String toString() {
-			return "Item " ~ to!(char[])(this.counter);
-		}
-	}
-
-	public this(Shell shell) {
-		final TableViewer v = new TableViewer(shell,DWT.BORDER|DWT.FULL_SELECTION);
-		v.setLabelProvider(new LabelProvider());
-		v.setContentProvider(new MyContentProvider());
-		ArrayList model = createModel();
-		v.setInput(model);
-		v.getTable().setLinesVisible(true);
-		v.getTable().addMouseListener(new class(v) MouseAdapter {
-            private TableViewer v;
-            this(TableViewer v_) {
-                this.v = v_;
-            }
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.swt.events.MouseAdapter#mouseDown(org.eclipse.swt.events.MouseEvent)
-			 */
-			public void mouseDown(MouseEvent e) {
-				if( v.getTable().getItem(new Point(e.x,e.y)) is null ) {
-					v.setSelection(new StructuredSelection());
-				}
-			}
-
-		});
-	}
-
-	private ArrayList createModel() {
-		ArrayList elements = new ArrayList(10);
-		for( int i = 0; i < 10; i++ ) {
-			elements.add( new MyModel(i));
-		}
-
-		return elements;
-	}
-
-}
-
-static void main() {
-    Display display = new Display ();
-    Shell shell = new Shell(display);
-    shell.setLayout(new FillLayout());
-    new Snippet004HideSelection(shell);
-    shell.open ();
-
-    while (!shell.isDisposed ()) {
-        if (!display.readAndDispatch ()) display.sleep ();
-    }
-
-    display.dispose ();
-
-}
-
--- a/jface/snippets/Snippet005TreeCustomMenu.d	Thu Aug 07 23:04:04 2008 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,183 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl 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:
- *     Tom Schindl - initial API and implementation
- * Port to the D programming language:
- *     wbaxter at gmail dot com
- *******************************************************************************/
-
-module jface.snippets.Snippet005TreeCustomMenu;
-
-import dwtx.jface.action.Action;
-import dwtx.jface.action.IMenuListener;
-import dwtx.jface.action.IMenuManager;
-import dwtx.jface.action.MenuManager;
-import dwtx.jface.viewers.IStructuredSelection;
-import dwtx.jface.viewers.ITreeContentProvider;
-import dwtx.jface.viewers.LabelProvider;
-import dwtx.jface.viewers.TreeViewer;
-import dwtx.jface.viewers.Viewer;
-import dwt.layout.FillLayout;
-import dwt.widgets.Display;
-import dwt.widgets.Shell;
-import dwt.DWT;
-
-import dwt.dwthelper.utils;
-
-import tango.util.Convert;
-import tango.io.Stdout;
-
-/**
- * Customized context menu based on TreeItem-Selection
- * 
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- *
- */
-public class Snippet005TreeCustomMenu {
-	private class MyContentProvider : ITreeContentProvider {
-
-		public Object[] getElements(Object inputElement) {
-			return (cast(MyModel) inputElement).child;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
-		 */
-		public Object[] getChildren(Object parentElement) {
-			return getElements(parentElement);
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
-		 */
-		public Object getParent(Object element) {
-			if (element is null) {
-				return null;
-			}
-
-			return (cast(MyModel) element).parent;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
-		 */
-		public bool hasChildren(Object element) {
-			return (cast(MyModel) element).child.length > 0;
-		}
-
-	}
-
-	public class MyModel {
-		public MyModel parent;
-
-		public MyModel[] child;
-
-		public int counter;
-
-		public this(int counter, MyModel parent) {
-			this.parent = parent;
-			this.counter = counter;
-		}
-
-		public String toString() {
-			String rv = "Item ";
-			if (parent !is null) {
-				rv = parent.toString() ~  ".";
-			}
-
-			rv ~= to!(char[])(counter);
-
-			return rv;
-		}
-	}
-
-	public this(Shell shell) {
-		final TreeViewer v = new TreeViewer(shell);
-		v.setLabelProvider(new LabelProvider());
-		v.setContentProvider(new MyContentProvider());
-		v.setInput(createModel());
-
-		final Action a = new class Action {};
-		final MenuManager mgr = new MenuManager();
-		mgr.setRemoveAllWhenShown(true);
-
-        class MyMenuListener :  IMenuListener {
-            TreeViewer v;
-            Action a;
-            MenuManager mgr;
-
-            this(TreeViewer v_, Action a_, MenuManager mgr_) {
-                this.v = v_; this.a = a_; this.mgr = mgr_;
-            }
-
-            /* (non-Javadoc)
-             * @see org.eclipse.jface.action.IMenuListener#menuAboutToShow(org.eclipse.jface.action.IMenuManager)
-             */
-            public void menuAboutToShow(IMenuManager manager) {
-                IStructuredSelection selection = cast(IStructuredSelection) v
-                    .getSelection();
-                if (!selection.isEmpty()) {
-                    a.setText("Action for "
-                              ~ (cast(MyModel) selection.getFirstElement())
-                              .toString());
-                    mgr.add(a);
-                }
-            }
-        }
-
-		mgr.addMenuListener(new MyMenuListener(v,a,mgr));
-		v.getControl().setMenu(mgr.createContextMenu(v.getControl()));
-	}
-
-	private MyModel createModel() {
-
-		MyModel root = new MyModel(0, null);
-		root.counter = 0;
-
-		MyModel tmp;
-		for (int i = 1; i < 10; i++) {
-			tmp = new MyModel(i, root);
-			root.child ~= tmp;
-			for (int j = 1; j < i; j++) {
-				tmp.child ~= new MyModel(j, tmp);
-			}
-		}
-
-		return root;
-	}
-
-}
-
-void main() {
-    Display display = new Display();
-    Shell shell = new Shell(display);
-    shell.setLayout(new FillLayout());
-    new Snippet005TreeCustomMenu(shell);
-    shell.open();
-
-    while (!shell.isDisposed()) {
-        if (!display.readAndDispatch())
-            display.sleep();
-    }
-
-    display.dispose();
-}
--- a/jface/snippets/Snippet006TableMultiLineCells.d	Thu Aug 07 23:04:04 2008 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,255 +0,0 @@
-/*******************************************************************************
-* Copyright (c) 2005, 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:
-*     yidabu at gmail dot com  ( D China http://www.d-programming-language-china.org/ )
-*******************************************************************************/
-module jface.snippets.Snippet006TableMultiLineCells;
-
-
-// http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.jface.snippets/Eclipse%20JFace%20Snippets/org/eclipse/jface/snippets/viewers/Snippet006TableMultiLineCells.java?view=markup
-
-import dwtx.jface.resource.JFaceResources;
-import dwtx.jface.viewers.ColumnPixelData;
-import dwtx.jface.viewers.IStructuredContentProvider;
-import dwtx.jface.viewers.OwnerDrawLabelProvider;
-import dwtx.jface.viewers.StructuredSelection;
-import dwtx.jface.viewers.TableLayout;
-import dwtx.jface.viewers.Viewer;
-import dwtx.jface.viewers.TableViewer;
-import dwt.DWT;
-import dwt.graphics.Font;
-import dwt.graphics.Point;
-import dwt.layout.GridData;
-import dwt.layout.GridLayout;
-import dwt.widgets.Composite;
-import dwt.widgets.Display;
-import dwt.widgets.Event;
-import dwt.widgets.Shell;
-import dwt.widgets.TableColumn;
-
-import dwt.dwthelper.utils;
-version(JIVE){
-    import jive.stacktrace;
-}
-
-void main(String[] args) {
-    (new Snippet006TableMultiLineCells()).main(args);
-}
-
-public class Snippet006TableMultiLineCells {
-
-    public static void main(String[] args) {
-
-        Display display = new Display();
-        Shell shell = new Shell(display, DWT.CLOSE|DWT.RESIZE);
-        shell.setSize(400, 400);
-        shell.setLayout(new GridLayout());
-
-        Snippet006TableMultiLineCells example = new Snippet006TableMultiLineCells();
-        example.createPartControl(shell);
-
-        shell.open();
-
-        while (!shell.isDisposed()) {
-            if (!display.readAndDispatch())
-                display.sleep();
-        }
-        display.dispose();
-    }
-
-    class LineEntry {
-
-        String line;
-        int columnWidth;
-
-        /**
-         * Create a new instance of the receiver with name text constrained to a
-         * column of width.
-         *
-         * @param text
-         * @param width
-         */
-        this(String text, int width) {
-            line = text;
-            columnWidth = width;
-        }
-
-        /**
-         * Get the height of the event.
-         *
-         * @param index
-         * @return int
-         */
-        public int getHeight(Event event) {
-            event.gc.setLineWidth(columnWidth);
-            return event.gc.textExtent(line).y;
-        }
-
-        /**
-         * Get the width of the event.
-         *
-         * @param index
-         * @return
-         */
-        public int getWidth(Event event) {
-
-            return columnWidth;
-        }
-
-        /**
-         * Get the font we are using.
-         *
-         * @return Font
-         */
-        protected Font getFont() {
-            return JFaceResources.getFont(JFaceResources.HEADER_FONT);
-        }
-
-        /**
-         * @param event
-         */
-        public void draw(Event event) {
-            event.gc.drawText(line, event.x, event.y);
-
-        }
-    }
-
-    private TableViewer viewer;
-
-    private LineEntry[] entries;
-
-    public this() {
-        String[] lines = [
-            "This day is called the feast of Crispian:",
-            "He that outlives this day, \n and comes safe home,",
-            "Will stand a tip-toe when the day is named,",
-            "And rouse him at the name of Crispian.",
-            "He that shall live this day,\n and see old age,",
-            "Will yearly on the vigil feast his neighbours,",
-            "And say 'To-morrow is Saint Crispian:'",
-            "Then will he strip his sleeve and show his scars.",
-            "And say 'These wounds I had on Crispin's day.'",
-            "Old men forget:\n yet all shall be forgot,",
-            "But he'll remember with advantages",
-            "What feats he did that day:\n then shall our names.",
-            "Familiar in his mouth as household words",
-            "Harry the king, Bedford and Exeter,",
-            "Warwick and Talbot,\n Salisbury and Gloucester,",
-            "Be in their flowing cups freshly remember'd.",
-            "This story shall the good man teach his son;",
-            "And Crispin Crispian shall ne'er go by,",
-            "From this day to the ending of the world,",
-            "But we in it shall be remember'd;",
-            "We few,\n we happy few,\n we band of brothers;",
-            "For he to-day that sheds his blood with me",
-            "Shall be my brother;\n be he ne'er so vile,",
-            "This day shall gentle his condition:",
-            "And gentlemen in England now a-bed",
-            "Shall think themselves accursed they were not here,",
-            "And hold their manhoods cheap whiles any speaks",
-            "That fought with us upon Saint Crispin's day." ];
-
-        entries = new LineEntry[lines.length];
-        for (int i = 0; i < lines.length; i++) {
-            entries[i] = new LineEntry(lines[i], 35);
-        }
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(dwt.widgets.Composite)
-     */
-    public void createPartControl(Composite parent) {
-        viewer = new TableViewer(parent, DWT.FULL_SELECTION);
-
-        viewer.setContentProvider(new class() IStructuredContentProvider {
-            /*
-             * (non-Javadoc)
-             *
-             * @see dwtx.jface.viewers.IContentProvider#dispose()
-             */
-            public void dispose() {
-            }
-
-            /*
-             * (non-Javadoc)
-             *
-             * @see dwtx.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-             */
-            public Object[] getElements(Object inputElement) {
-                return entries;
-            }
-
-            /*
-             * (non-Javadoc)
-             *
-             * @see dwtx.jface.viewers.IContentProvider#inputChanged(dwtx.jface.viewers.Viewer,
-             *      java.lang.Object, java.lang.Object)
-             */
-            public void inputChanged(dwtx.jface.viewers.Viewer.Viewer viewer, Object oldInput, Object newInput) {
-            }
-        });
-        createColumns();
-
-        viewer.setLabelProvider(new class OwnerDrawLabelProvider {
-            /* (non-Javadoc)
-             * @see dwtx.jface.viewers.OwnerDrawLabelProvider#measure(dwt.widgets.Event, java.lang.Object)
-             */
-            protected void measure(Event event, Object element) {
-                LineEntry line = cast(LineEntry) element;
-                Point size = event.gc.textExtent(line.line);
-                event.width = viewer.getTable().getColumn(event.index).getWidth();
-                int lines = (event.width > 0 ? (size.x / event.width + 1) : 1);
-                event.height = size.y * lines;
-            }
-
-            /*
-             * (non-Javadoc)
-             *
-             * @see dwtx.jface.viewers.OwnerDrawLabelProvider#paint(dwt.widgets.Event,
-             *      java.lang.Object)
-             */
-            protected void paint(Event event, Object element) {
-
-                LineEntry entry = cast(LineEntry) element;
-                event.gc.drawText(entry.line, event.x, event.y, true);
-            }
-        });
-        viewer.setInput(this);
-
-        GridData data = new GridData(GridData.GRAB_HORIZONTAL
-                | GridData.GRAB_VERTICAL | GridData.FILL_BOTH);
-
-        viewer.getControl().setLayoutData(data);
-        OwnerDrawLabelProvider.setUpOwnerDraw(viewer);
-
-        viewer.setSelection(new StructuredSelection(entries[1]));
-    }
-
-    /**
-     * Create the columns to be used in the tree.
-     */
-    private void createColumns() {
-        TableLayout layout = new TableLayout();
-        viewer.getTable().setLayout(layout);
-        viewer.getTable().setHeaderVisible(true);
-        viewer.getTable().setLinesVisible(true);
-
-        TableColumn tc = new TableColumn(viewer.getTable(), DWT.NONE, 0);
-        layout.addColumnData(new ColumnPixelData(350));
-        tc.setText("Lines");
-
-    }
-
-    public void setFocus() {
-    }
-}
-
--- a/jface/snippets/Snippet007FullSelection.d	Thu Aug 07 23:04:04 2008 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,163 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl 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:
- *     Tom Schindl - initial API and implementation
- *******************************************************************************/
-
-module jface.snippets.Snippet007FullSelection;
-
-import dwtx.jface.viewers.CellEditor;
-import dwtx.jface.viewers.ICellModifier;
-import dwtx.jface.viewers.IStructuredContentProvider;
-import dwtx.jface.viewers.LabelProvider;
-import dwtx.jface.viewers.TableViewer;
-import dwtx.jface.viewers.TextCellEditor;
-import dwtx.jface.viewers.Viewer;
-import dwt.DWT;
-import dwt.graphics.Color;
-import dwt.graphics.GC;
-import dwt.graphics.Point;
-import dwt.graphics.Rectangle;
-import dwt.layout.FillLayout;
-import dwt.widgets.Display;
-import dwt.widgets.Event;
-import dwt.widgets.Listener;
-import dwt.widgets.Shell;
-import dwt.widgets.TableColumn;
-import dwt.widgets.TableItem;
-
-import dwt.dwthelper.utils;
-
-import tango.util.Convert;
-import dwtx.dwtxhelper.Collection;
-
-/**
- * TableViewer: Hide full selection
- *
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- *
- */
-public class Snippet007FullSelection {
-
-	private class MyContentProvider : IStructuredContentProvider {
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			return (cast(ArrayList)inputElement).toArray;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-
-		}
-
-	}
-
-	public class MyModel {
-		public int counter;
-
-		public this(int counter) {
-			this.counter = counter;
-		}
-
-		public String toString() {
-			return "Item " ~ to!(char[])(this.counter);
-		}
-	}
-
-	public this(Shell shell) {
-		final TableViewer v = new TableViewer(shell,DWT.BORDER|DWT.FULL_SELECTION);
-		v.setLabelProvider(new LabelProvider());
-		v.setContentProvider(new MyContentProvider());
-		v.setCellModifier(new class(v) ICellModifier {
-            TableViewer v;
-            this(TableViewer v_) { this.v=v_; }
-
-			public bool canModify(Object element, String property) {
-				return true;
-			}
-
-			public Object getValue(Object element, String property) {
-				return new ArrayWrapperString( to!(char[])((cast(MyModel)element).counter) );
-			}
-
-			public void modify(Object element, String property, Object value) {
-				auto item = cast(TableItem)element;
-                auto valuestr = cast(ArrayWrapperString)value;
-				(cast(MyModel)item.getData()).counter = to!(int)(valuestr.array);
-				v.update(item.getData(), null);
-			}
-
-		});
-		v.setColumnProperties(["column1", "column2" ]);
-		v.setCellEditors([ new TextCellEditor(v.getTable()),new TextCellEditor(v.getTable()) ]);
-
-		TableColumn column = new TableColumn(v.getTable(),DWT.NONE);
-		column.setWidth(100);
-		column.setText("Column 1");
-
-		column = new TableColumn(v.getTable(),DWT.NONE);
-		column.setWidth(100);
-		column.setText("Column 2");
-
-		ArrayList model = createModel();
-		v.setInput(model);
-		v.getTable().setLinesVisible(true);
-		v.getTable().setHeaderVisible(true);
-
-		v.getTable().addListener(DWT.EraseItem, new class Listener {
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
-			 */
-			public void handleEvent(Event event) {
-				event.detail &= ~DWT.SELECTED;
-			}
-		});
-
-	}
-
-	private ArrayList createModel() {
-		auto elements = new ArrayList(10);
-
-		for( int i = 0; i < 10; i++ ) {
-			elements.add( new MyModel(i));
-		}
-
-		return elements;
-	}
-
-}
-
-
-void main() {
-    Display display = new Display ();
-    Shell shell = new Shell(display);
-    shell.setLayout(new FillLayout());
-    new Snippet007FullSelection(shell);
-    shell.open ();
-
-    while (!shell.isDisposed ()) {
-        if (!display.readAndDispatch ()) display.sleep ();
-    }
-
-    display.dispose ();
-
-}
-
--- a/jface/snippets/Snippet010OwnerDraw.d	Thu Aug 07 23:04:04 2008 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,434 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 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
- *     oliver.schaefer@mbtech-services.com - Fix for Bug 225051 [Snippets] Snippet010OwnerDraw - Wrong german flag
- * Port to the D programming language:
- *     yidabu at gmail dot com  ( D China http://www.d-programming-language-china.org/ )
- *******************************************************************************/
-module jface.snippets.Snippet010OwnerDraw.d;
-
-import dwtx.jface.resource.JFaceResources;
-import dwtx.jface.viewers.Viewer;
-import dwtx.jface.viewers.ColumnPixelData;
-import dwtx.jface.viewers.IStructuredContentProvider;
-import dwtx.jface.viewers.OwnerDrawLabelProvider;
-import dwtx.jface.viewers.StructuredSelection;
-import dwtx.jface.viewers.TableLayout;
-import dwtx.jface.viewers.TableViewer;
-import dwt.DWT;
-import dwt.graphics.Rectangle;
-import dwt.graphics.TextLayout;
-import dwt.graphics.TextStyle;
-import dwt.layout.GridData;
-import dwt.layout.GridLayout;
-import dwt.widgets.Composite;
-import dwt.widgets.Display;
-import dwt.widgets.Event;
-import dwt.widgets.Shell;
-import dwt.widgets.TableColumn;
-
-import dwt.dwthelper.utils;
-
-void main(String[] args) {
-    Snippet010OwnerDraw.main(args);
-}
-
-public class Snippet010OwnerDraw {
-
-    public static void main(String[] args) {
-
-        Display display = new Display();
-        Shell shell = new Shell(display, DWT.CLOSE);
-        shell.setSize(400, 400);
-        shell.setLayout(new GridLayout());
-
-        Snippet010OwnerDraw example = new Snippet010OwnerDraw();
-        example.createPartControl(shell);
-
-        shell.open();
-
-        while (!shell.isDisposed ()) {
-            if (!display.readAndDispatch ()) display.sleep ();
-        }
-        display.dispose();
-    }
-
-    private static int COLUMN_COUNT = 3;
-
-    class CountryEntry {
-
-        String name;
-
-        String cupYear;
-
-        private String baseName;
-
-        /**
-         * Create a new instance of the receiver.
-         *
-         * @param countryName
-         * @param worldCupYear
-         */
-        this(String countryName, String englishName, String worldCupYear) {
-            name = countryName;
-            cupYear = worldCupYear;
-            baseName = englishName;
-        }
-
-        /**
-         * @param index
-         * @return
-         */
-        public int getHeight(Event event) {
-            switch (event.index) {
-            case 0:
-                return event.gc.textExtent(name).y;
-            case 1:
-                return 50;
-            case 2:
-                return event.gc.textExtent(cupYear).y;
-            default:
-                return 10;
-            }
-        }
-
-        /**
-         * @param index
-         * @return
-         */
-        public int getWidth(Event event) {
-
-            switch (event.index) {
-            case 0:
-                return event.gc.textExtent(getDisplayString().toString()).x + 4;
-
-            case 1:
-                return 200;
-
-            case 2:
-                return event.gc.textExtent(cupYear).x + 5;
-
-            default:
-                return 10;
-            }
-        }
-
-        /**
-         * Draw the flag in bounds.
-         *
-         * @param event
-         */
-        protected void drawFlag(Event event) {
-            event.gc.setBackground(viewer.getControl().getDisplay()
-                    .getSystemColor(DWT.COLOR_BLUE));
-
-            Rectangle bounds = event.getBounds();
-            bounds.width += 100;
-            event.gc.fillRectangle(bounds);
-        }
-
-        /**
-         * Draw the cup year
-         *
-         * @param event
-         */
-        private void drawCupYear(Event event) {
-            event.gc.drawText(cupYear, event.x, event.y);
-
-        }
-
-        /**
-         * Draw the name of the receiver.
-         *
-         * @param event
-         */
-        protected void drawName(Event event) {
-
-            StringBuffer buffer = getDisplayString();
-
-            Display display = viewer.getControl().getDisplay();
-            TextLayout layout = new TextLayout(display);
-            layout.setText(buffer.toString());
-
-            TextStyle plain = new TextStyle(JFaceResources
-                    .getFont(JFaceResources.DEFAULT_FONT), display
-                    .getSystemColor(DWT.COLOR_LIST_FOREGROUND), display
-                    .getSystemColor(DWT.COLOR_LIST_BACKGROUND));
-
-            TextStyle italic = new TextStyle(JFaceResources.getFontRegistry()
-                    .getItalic(JFaceResources.DEFAULT_FONT), display
-                    .getSystemColor(DWT.COLOR_BLUE), display
-                    .getSystemColor(DWT.COLOR_LIST_BACKGROUND));
-
-            layout.setStyle(plain, 0, name.length - 1);
-            layout.setStyle(italic, name.length, buffer.length - 1);
-
-            layout.draw(event.gc, event.x, event.y);
-
-        }
-
-        /**
-         * @return
-         */
-        private StringBuffer getDisplayString() {
-            StringBuffer buffer = new StringBuffer();
-            buffer.append(name);
-            buffer.append(" (");
-            buffer.append(baseName);
-            buffer.append(")");
-            return buffer;
-        }
-
-        /**
-         * @param event
-         */
-        public void draw(Event event) {
-
-            switch (event.index) {
-            case 0:
-                drawName(event);
-                break;
-            case 1:
-                drawFlag(event);
-                break;
-            case 2:
-                drawCupYear(event);
-                break;
-
-            default:
-                break;
-            }
-
-        }
-    }
-
-    private class GermanyEntry : CountryEntry {
-
-        this() {
-            super("Deutschland", "Germany", "1954 1974 1990");
-        }
-
-        /*
-         * (non-Javadoc)
-         *
-         * @see dwtx.jface.tests.viewers.OwnerDrawExample.CountryEntry#drawFlag(dwt.widgets.Event)
-         */
-        protected void drawFlag(Event event) {
-
-            Rectangle bounds = event.getBounds();
-            bounds.width += 100;
-            int stripeHeight = bounds.height / 3;
-            Rectangle stripe = new Rectangle(bounds.x, bounds.y, bounds.width,
-                    stripeHeight);
-
-            event.gc.setBackground(viewer.getControl().getDisplay()
-                    .getSystemColor(DWT.COLOR_BLACK));
-            event.gc.fillRectangle(stripe);
-
-            stripe.y += stripeHeight;
-
-            event.gc.setBackground(viewer.getControl().getDisplay()
-                    .getSystemColor(DWT.COLOR_RED));
-            event.gc.fillRectangle(stripe);
-
-            stripe.y += stripeHeight;
-
-            event.gc.setBackground(viewer.getControl().getDisplay()
-                    .getSystemColor(DWT.COLOR_YELLOW));
-            event.gc.fillRectangle(stripe);
-
-        }
-
-    }
-
-    private class AustriaEntry : CountryEntry {
-
-        this() {
-            super("\u00D6sterreich", "Austria", "TBD");
-        }
-
-        /*
-         * (non-Javadoc)
-         *
-         * @see dwtx.jface.tests.viewers.OwnerDrawExample.CountryEntry#drawFlag(dwt.widgets.Event)
-         */
-        protected void drawFlag(Event event) {
-
-            Rectangle bounds = event.getBounds();
-            bounds.width += 100;
-            int stripeHeight = bounds.height / 3;
-            Rectangle stripe = new Rectangle(bounds.x, bounds.y, bounds.width,
-                    stripeHeight);
-
-            event.gc.setBackground(viewer.getControl().getDisplay()
-                    .getSystemColor(DWT.COLOR_RED));
-            event.gc.fillRectangle(stripe);
-
-            stripe.y += stripeHeight;
-
-            event.gc.setBackground(viewer.getControl().getDisplay()
-                    .getSystemColor(DWT.COLOR_WHITE));
-            event.gc.fillRectangle(stripe);
-
-            stripe.y += stripeHeight;
-
-            event.gc.setBackground(viewer.getControl().getDisplay()
-                    .getSystemColor(DWT.COLOR_RED));
-            event.gc.fillRectangle(stripe);
-
-        }
-    }
-
-    private class EnglandEntry : CountryEntry {
-        this() {
-            super("Blighty", "England", "1966");
-        }
-
-        /*
-         * (non-Javadoc)
-         *
-         * @see dwtx.jface.tests.viewers.OwnerDrawExample.CountryEntry#drawFlag(dwt.widgets.Event)
-         */
-        protected void drawFlag(Event event) {
-
-            Rectangle bounds = event.getBounds();
-            bounds.width += 100;
-
-            event.gc.setBackground(viewer.getControl().getDisplay()
-                    .getSystemColor(DWT.COLOR_RED));
-            event.gc.fillRectangle(new Rectangle(bounds.width / 2 + bounds.x
-                    - 5, bounds.y, 10, bounds.height));
-            event.gc.fillRectangle(new Rectangle(bounds.x, bounds.height / 2
-                    + bounds.y - 5, bounds.width, 10));
-
-        }
-    }
-
-    private TableViewer viewer;
-
-    private CountryEntry[] entries;
-
-    public this() {
-        entries = new CountryEntry[3];
-        entries[0] = new AustriaEntry();
-        entries[1] = new GermanyEntry();
-        entries[2] = new EnglandEntry();
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(dwt.widgets.Composite)
-     */
-    public void createPartControl(Composite parent) {
-        viewer = new TableViewer(parent, DWT.FULL_SELECTION);
-
-        viewer.setContentProvider(new class() IStructuredContentProvider {
-            /*
-             * (non-Javadoc)
-             *
-             * @see dwtx.jface.viewers.IContentProvider#dispose()
-             */
-            public void dispose() {
-            };
-
-            /*
-             * (non-Javadoc)
-             *
-             * @see dwtx.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-             */
-            public Object[] getElements(Object inputElement) {
-                return (cast(Snippet010OwnerDraw) inputElement).entries;
-            };
-
-            /*
-             * (non-Javadoc)
-             *
-             * @see dwtx.jface.viewers.IContentProvider#inputChanged(dwtx.jface.viewers.Viewer,
-             *      java.lang.Object, java.lang.Object)
-             */
-            public void inputChanged(Viewer viewer,
-                    Object oldInput, Object newInput) {
-            }
-
-        });
-        createColumns();
-
-        viewer.setLabelProvider(new class() OwnerDrawLabelProvider {
-
-
-            protected void measure(Event event, Object element) {
-                CountryEntry country = cast(CountryEntry) element;
-
-                event.setBounds(new Rectangle(event.x, event.y, country.getWidth(event),
-                        country.getHeight(event)));
-
-            }
-
-            /*
-             * (non-Javadoc)
-             *
-             * @see dwtx.jface.viewers.OwnerDrawLabelProvider#paint(dwt.widgets.Event,
-             *      java.lang.Object)
-             */
-            protected void paint(Event event, Object element) {
-                CountryEntry entry = cast(CountryEntry) element;
-                entry.draw(event);
-
-            }
-        });
-
-        OwnerDrawLabelProvider.setUpOwnerDraw(viewer);
-        viewer.setInput(this);
-        GridData data = new GridData(GridData.GRAB_HORIZONTAL
-                | GridData.GRAB_VERTICAL | GridData.FILL_BOTH);
-
-        viewer.getControl().setLayoutData(data);
-
-        viewer.setSelection(new StructuredSelection(entries[1]));
-    }
-
-    /**
-     * Create the columns to be used in the tree.
-     */
-    private void createColumns() {
-        TableLayout layout = new TableLayout();
-        viewer.getTable().setLayout(layout);
-        viewer.getTable().setHeaderVisible(true);
-        viewer.getTable().setLinesVisible(true);
-
-        for (int i = 0; i < COLUMN_COUNT; i++) {
-            TableColumn tc = new TableColumn(viewer.getTable(), DWT.NONE, i);
-            layout.addColumnData(new ColumnPixelData(100));
-            tc.setText(getTitleFor(i));
-        }
-        ;
-    }
-
-    /**
-     * @param i
-     * @return
-     */
-    private String getTitleFor(int i) {
-        switch (i) {
-        case 0:
-            return "Name";
-        case 1:
-            return "Flag";
-        case 2:
-            return "World Cup Year";
-        }
-        return "Unknown";
-    }
-
-    public void setFocus() {
-
-    }
-
-}
--- a/jface/snippets/Snippet014TreeViewerNoMandatoryLabelProvider.d	Thu Aug 07 23:04:04 2008 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,228 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl 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:
- *     Tom Schindl - initial API and implementation
- * Port to the D programming language:
- *     yidabu at gmail dot com  ( D China http://www.d-programming-language-china.org/ )
- *******************************************************************************/
-
-module jface.snippets.Snippet014TreeViewerNoMandatoryLabelProvider;
-
-
-import dwtx.jface.resource.FontRegistry;
-import dwtx.jface.viewers.ITableColorProvider;
-import dwtx.jface.viewers.ITableFontProvider;
-import dwtx.jface.viewers.ITableLabelProvider;
-import dwtx.jface.viewers.ITreeContentProvider;
-import dwtx.jface.viewers.LabelProvider;
-import dwtx.jface.viewers.TreeViewer;
-import dwtx.jface.viewers.Viewer;
-import dwt.DWT;
-import dwt.graphics.Color;
-import dwt.graphics.Font;
-import dwt.graphics.Image;
-import dwt.layout.FillLayout;
-import dwt.widgets.Display;
-import dwt.widgets.Shell;
-import dwt.widgets.TreeColumn;
-
-import dwt.dwthelper.utils;
-
-import tango.util.Convert;
-import tango.util.container.LinkedList;
-
-version(JIVE) import jive.stacktrace;
-
-
-void main(String[] args) {
-    Display display = new Display();
-    Shell shell = new Shell(display);
-    shell.setLayout(new FillLayout());
-    new Snippet014TreeViewerNoMandatoryLabelProvider(shell);
-    shell.open();
-
-    while (!shell.isDisposed()) {
-        if (!display.readAndDispatch())
-            display.sleep();
-    }
-
-    display.dispose();
-}
-
-/**
- * A simple TreeViewer to demonstrate usage
- *
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- *
- */
-public class Snippet014TreeViewerNoMandatoryLabelProvider {
-    alias  LinkedList!(MyModel) ArrayList;
-
-    private class MyContentProvider : ITreeContentProvider {
-
-        /*
-         * (non-Javadoc)
-         *
-         * @see dwtx.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-         */
-        public Object[] getElements(Object inputElement) {
-            return (cast(MyModel) inputElement).child.toArray();
-        }
-
-        /*
-         * (non-Javadoc)
-         *
-         * @see dwtx.jface.viewers.IContentProvider#dispose()
-         */
-        public void dispose() {
-
-        }
-
-        /*
-         * (non-Javadoc)
-         *
-         * @see dwtx.jface.viewers.IContentProvider#inputChanged(dwtx.jface.viewers.Viewer,
-         *      java.lang.Object, java.lang.Object)
-         */
-        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-
-        }
-
-        /*
-         * (non-Javadoc)
-         *
-         * @see dwtx.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
-         */
-        public Object[] getChildren(Object parentElement) {
-            return getElements(parentElement);
-        }
-
-        /*
-         * (non-Javadoc)
-         *
-         * @see dwtx.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
-         */
-        public Object getParent(Object element) {
-            if (element is null) {
-                return null;
-            }
-
-            return (cast(MyModel) element).parent;
-        }
-
-        /*
-         * (non-Javadoc)
-         *
-         * @see dwtx.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
-         */
-        public bool hasChildren(Object element) {
-            return (cast(MyModel) element).child.size() > 0;
-        }
-
-    }
-
-    public class MyModel {
-        public MyModel parent;
-
-        public ArrayList child;
-
-        public int counter;
-
-        public this(int counter, MyModel parent) {
-            this.parent = parent;
-            this.counter = counter;
-            child = new ArrayList();
-        }
-
-        public String toString() {
-            String rv = "Item ";
-            if (parent !is null) {
-                rv = parent.toString() ~ ".";
-            }
-
-            rv ~= to!(String)(counter);
-
-            return rv;
-        }
-    }
-
-    public class MyLabelProvider : LabelProvider,
-            ITableLabelProvider, ITableFontProvider, ITableColorProvider {
-        FontRegistry registry;
-        this()
-        {
-            registry = new FontRegistry();
-        }
-
-        public Image getColumnImage(Object element, int columnIndex) {
-            return null;
-        }
-
-        public String getColumnText(Object element, int columnIndex) {
-            return "Column " ~ to!(String)(columnIndex) ~ " => " ~ element.toString();
-        }
-
-        public Font getFont(Object element, int columnIndex) {
-            if ((cast(MyModel) element).counter % 2 == 0) {
-                return registry.getBold(Display.getCurrent().getSystemFont()
-                        .getFontData()[0].getName());
-            }
-            return null;
-        }
-
-        public Color getBackground(Object element, int columnIndex) {
-            if ((cast(MyModel) element).counter % 2 == 0) {
-                return Display.getCurrent().getSystemColor(DWT.COLOR_RED);
-            }
-            return null;
-        }
-
-        public Color getForeground(Object element, int columnIndex) {
-            if ((cast(MyModel) element).counter % 2 == 1) {
-                return Display.getCurrent().getSystemColor(DWT.COLOR_RED);
-            }
-            return null;
-        }
-
-    }
-
-    public this(Shell shell) {
-        final TreeViewer v = new TreeViewer(shell);
-
-        TreeColumn column = new TreeColumn(v.getTree(),DWT.NONE);
-        column.setWidth(200);
-        column.setText("Column 1");
-
-        column = new TreeColumn(v.getTree(),DWT.NONE);
-        column.setWidth(200);
-        column.setText("Column 2");
-
-        v.setLabelProvider(new MyLabelProvider());
-        v.setContentProvider(new MyContentProvider());
-        v.setInput(createModel());
-    }
-
-    private MyModel createModel() {
-
-        MyModel root = new MyModel(0, null);
-        root.counter = 0;
-
-        MyModel tmp;
-        for (int i = 1; i < 10; i++) {
-            tmp = new MyModel(i, root);
-            root.child.add(tmp);
-            for (int j = 1; j < i; j++) {
-                tmp.child.add(new MyModel(j, tmp));
-            }
-        }
-
-        return root;
-    }
-
-
-}
--- a/jface/snippets/Snippet016TableLayout.d	Thu Aug 07 23:04:04 2008 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,156 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl 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:
- *     Tom Schindl - initial API and implementation
- * Port to the D programming language:
- *     yidabu at gmail dot com  ( D China http://www.d-programming-language-china.org/ )
- *******************************************************************************/
-
-module jface.snippets.Snippet016TableLayout;
-
-
-import dwtx.jface.layout.TableColumnLayout;
-import dwtx.jface.viewers.ColumnWeightData;
-import dwtx.jface.viewers.IStructuredContentProvider;
-import dwtx.jface.viewers.ITableLabelProvider;
-import dwtx.jface.viewers.LabelProvider;
-import dwtx.jface.viewers.TableViewer;
-import dwtx.jface.viewers.Viewer;
-import dwt.DWT;
-import dwt.graphics.Image;
-import dwt.layout.FillLayout;
-import dwt.widgets.Composite;
-import dwt.widgets.Display;
-import dwt.widgets.Shell;
-import dwt.widgets.Table;
-import dwt.widgets.TableColumn;
-
-import dwt.dwthelper.utils;
-
-import tango.util.Convert;
-/**
- * @param args
- */
-void main(String[] args) {
-    Display display = new Display();
-    Shell shell = new Shell(display);
-    //shell.setSize(400, 150);
-    shell.setLayout(new FillLayout());
-
-    new Snippet016TableLayout(shell);
-    shell.open();
-
-    while (!shell.isDisposed()) {
-        if (!display.readAndDispatch())
-            display.sleep();
-    }
-
-    display.dispose();
-
-}
-
-/**
- * A simple TableViewer to demonstrate usage
- *
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- * @since 3.3M3
- */
-public class Snippet016TableLayout {
-    private class MyContentProvider : IStructuredContentProvider {
-
-        /*
-         * (non-Javadoc)
-         *
-         * @see dwtx.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-         */
-        public Object[] getElements(Object inputElement) {
-            return (cast(ArrayWrapperObject) inputElement).array;
-        }
-
-        /*
-         * (non-Javadoc)
-         *
-         * @see dwtx.jface.viewers.IContentProvider#dispose()
-         */
-        public void dispose() {
-
-        }
-
-        /*
-         * (non-Javadoc)
-         *
-         * @see dwtx.jface.viewers.IContentProvider#inputChanged(dwtx.jface.viewers.Viewer,
-         *      java.lang.Object, java.lang.Object)
-         */
-        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-
-        }
-
-    }
-
-    private class MyLabelProvider : LabelProvider, ITableLabelProvider {
-
-        public Image getColumnImage(Object element, int columnIndex) {
-            return null;
-        }
-
-        public String getColumnText(Object element, int columnIndex) {
-            return to!(char[])(columnIndex) ~ " - " ~ element.toString();
-        }
-
-    }
-
-    public class MyModel {
-        public int counter;
-
-        public this(int counter) {
-            this.counter = counter;
-        }
-
-        public String toString() {
-            return "Item " ~ to!(char[])(this.counter);
-        }
-    }
-
-    public this(Composite comp) {
-        final TableViewer v = new TableViewer(new Table(comp, DWT.BORDER));
-        v.setLabelProvider(new MyLabelProvider());
-        v.setContentProvider(new MyContentProvider());
-        v.getTable().setHeaderVisible(true);
-
-        TableColumnLayout ad = new TableColumnLayout();
-        comp.setLayout(ad);
-
-        TableColumn column = new TableColumn(v.getTable(), DWT.NONE);
-        column.setText("Column 1");
-        column.setMoveable(true);
-        ad.setColumnData(column, new ColumnWeightData(90, 290));
-
-        column = new TableColumn(v.getTable(), DWT.NONE);
-        column.setText("Column 2");
-        column.setMoveable(true);
-        ad.setColumnData(column, new ColumnWeightData(10, 200));
-
-        MyModel[] model = createModel();
-        v.setInput(new ArrayWrapperObject(model));
-        v.getTable().setLinesVisible(true);
-    }
-
-    private MyModel[] createModel() {
-        MyModel[] elements = new MyModel[10];
-
-        for (int i = 0; i < 10; i++) {
-            elements[i] = new MyModel(i);
-        }
-
-        return elements;
-    }
-
-
-
-}
--- a/jface/snippets/Snippet026TreeViewerTabEditing.d	Thu Aug 07 23:04:04 2008 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,295 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl 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:
- *     Tom Schindl - initial API and implementation
- * Port to the D programming language:
- *     yidabu at gmail dot com  ( D China http://www.d-programming-language-china.org/ )
- *******************************************************************************/
-
-module jface.snippets.Snippet026TreeViewerTabEditing;
-
-
-import dwtx.jface.viewers.CellEditor;
-import dwtx.jface.viewers.ColumnLabelProvider;
-import dwtx.jface.viewers.ColumnViewerEditor;
-import dwtx.jface.viewers.ColumnViewer;
-import dwtx.jface.viewers.ColumnViewerEditorActivationStrategy;
-import dwtx.jface.viewers.EditingSupport;
-import dwtx.jface.viewers.ColumnViewerEditorActivationEvent;
-import dwtx.jface.viewers.FocusCellOwnerDrawHighlighter;
-import dwtx.jface.viewers.ITreeContentProvider;
-import dwtx.jface.viewers.TextCellEditor;
-import dwtx.jface.viewers.TreePath;
-import dwtx.jface.viewers.TreeViewerFocusCellManager;
-import dwtx.jface.viewers.TreeViewerEditor;
-import dwtx.jface.viewers.TreeViewer;
-import dwtx.jface.viewers.TreeViewerColumn;
-import dwtx.jface.viewers.Viewer;
-import dwt.DWT;
-import dwt.events.SelectionEvent;
-import dwt.events.SelectionListener;
-import dwt.layout.FillLayout;
-import dwt.widgets.Button;
-import dwt.widgets.Display;
-import dwt.widgets.Shell;
-
-import dwt.dwthelper.utils;
-import dwtx.dwtxhelper.Collection;
-
-import tango.util.Convert;
-
-version(JIVE) import jive.stacktrace;
-
-
-void main(String[] args) {
-    Display display = new Display();
-    Shell shell = new Shell(display);
-    shell.setLayout(new FillLayout());
-    new Snippet026TreeViewerTabEditing(shell);
-    shell.open();
-
-    while (!shell.isDisposed()) {
-        if (!display.readAndDispatch())
-            display.sleep();
-    }
-
-    display.dispose();
-}
-
-/**
- * A simple TreeViewer to demonstrate usage
- *
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- *
- */
-public class Snippet026TreeViewerTabEditing {
-    public this(Shell shell) {
-        Button b = new Button(shell,DWT.PUSH);
-        b.setText("Remove column");
-        final TreeViewer v = new TreeViewer(shell, DWT.BORDER
-                | DWT.FULL_SELECTION);
-        v.getTree().setLinesVisible(true);
-        v.getTree().setHeaderVisible(true);
-        b.addSelectionListener(new class(v) SelectionListener {
-            TreeViewer v;
-            this(TreeViewer v_)
-            {
-                this.v = v_;
-            }
-            public void widgetDefaultSelected(SelectionEvent e) {
-
-            }
-
-            public void widgetSelected(SelectionEvent e) {
-                v.getTree().getColumn(1).dispose();
-            }
-
-        });
-
-        TreeViewerFocusCellManager focusCellManager = new TreeViewerFocusCellManager(v,new FocusCellOwnerDrawHighlighter(v));
-        ColumnViewerEditorActivationStrategy actSupport = new class(v) ColumnViewerEditorActivationStrategy {
-            this(ColumnViewer v_)
-            {
-                super(v_);
-            }
-            protected bool isEditorActivationEvent(
-                    ColumnViewerEditorActivationEvent event) {
-                return event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL
-                        || event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION
-                        || (event.eventType == ColumnViewerEditorActivationEvent.KEY_PRESSED && event.keyCode == DWT.CR)
-                        || event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC;
-            }
-        };
-
-        TreeViewerEditor.create(v, focusCellManager, actSupport, ColumnViewerEditor.TABBING_HORIZONTAL
-                | ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR
-                | ColumnViewerEditor.TABBING_VERTICAL | ColumnViewerEditor.KEYBOARD_ACTIVATION);
-
-        final TextCellEditor textCellEditor = new TextCellEditor(v.getTree());
-
-        TreeViewerColumn column = new TreeViewerColumn(v, DWT.NONE);
-        column.getColumn().setWidth(200);
-        column.getColumn().setMoveable(true);
-        column.getColumn().setText("Column 1");
-        column.setLabelProvider(new class() ColumnLabelProvider {
-
-            public String getText(Object element) {
-                return "Column 1 => " ~ element.toString();
-            }
-
-        });
-        column.setEditingSupport(new class(v) EditingSupport {
-            this(ColumnViewer v_)
-            {
-                super(v_);
-            }
-            protected bool canEdit(Object element) {
-                return false;
-            }
-
-            protected CellEditor getCellEditor(Object element) {
-                return textCellEditor;
-            }
-
-            protected Object getValue(Object element) {
-                return stringcast( (to!(String)((cast(MyModel) element).counter)) );
-            }
-
-            protected void setValue(Object element, Object value) {
-                (cast(MyModel) element).counter = Integer.parseInt(value.toString());
-                v.update(element, null);
-            }
-        });
-
-        column = new TreeViewerColumn(v, DWT.NONE);
-        column.getColumn().setWidth(200);
-        column.getColumn().setMoveable(true);
-        column.getColumn().setText("Column 2");
-        column.setLabelProvider(new class() ColumnLabelProvider {
-
-            public String getText(Object element) {
-                return "Column 2 => " ~ element.toString();
-            }
-
-        });
-        column.setEditingSupport(new class(v) EditingSupport {
-            this(ColumnViewer v_)
-            {
-                super(v_);
-            }
-            protected bool canEdit(Object element) {
-                return true;
-            }
-
-            protected CellEditor getCellEditor(Object element) {
-                return textCellEditor;
-            }
-
-            protected Object getValue(Object element) {
-                return stringcast( to!(String)((cast(MyModel) element).counter) );
-            }
-
-            protected void setValue(Object element, Object value) {
-                (cast(MyModel) element).counter = Integer.parseInt(value.toString());
-                v.update(element, null);
-            }
-        });
-
-        column = new TreeViewerColumn(v, DWT.NONE);
-        column.getColumn().setWidth(200);
-        column.getColumn().setMoveable(true);
-        column.getColumn().setText("Column 3");
-        column.setLabelProvider(new class() ColumnLabelProvider {
-            public String getText(Object element) {
-                return "Column 3 => " ~ element.toString();
-            }
-
-        });
-        column.setEditingSupport(new class(v) EditingSupport {
-            this(ColumnViewer v_)
-            {
-                super(v_);
-            }
-            protected bool canEdit(Object element) {
-                return true;
-            }
-
-            protected CellEditor getCellEditor(Object element) {
-                return textCellEditor;
-            }
-
-            protected Object getValue(Object element) {
-                return stringcast( to!(String)((cast(MyModel) element).counter) );
-            }
-
-            protected void setValue(Object element, Object value) {
-                (cast(MyModel) element).counter = Integer.parseInt(value.toString());
-                v.update(element, null);
-            }
-        });
-
-        v.setContentProvider(new MyContentProvider());
-
-        v.setInput(createModel());
-    }
-
-    private MyModel createModel() {
-
-        MyModel root = new MyModel(0, null);
-        root.counter = 0;
-
-        MyModel tmp;
-        MyModel subItem;
-        for (int i = 1; i < 10; i++) {
-            tmp = new MyModel(i, root);
-            root.child.add(tmp);
-            for (int j = 1; j < i; j++) {
-                subItem = new MyModel(j, tmp);
-                subItem.child.add(new MyModel(j * 100, subItem));
-                tmp.child.add(subItem);
-            }
-        }
-
-        return root;
-    }
-
-    private class MyContentProvider : ITreeContentProvider {
-
-        public Object[] getElements(Object inputElement) {
-            return (cast(MyModel) inputElement).child.toArray();
-        }
-
-        public void dispose() {
-        }
-
-        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-        }
-
-        public Object[] getChildren(Object parentElement) {
-            return getElements(parentElement);
-        }
-
-        public Object getParent(Object element) {
-            if (element is null) {
-                return null;
-            }
-            return (cast(MyModel) element).parent;
-        }
-
-        public bool hasChildren(Object element) {
-            return (cast(MyModel) element).child.size() > 0;
-        }
-
-    }
-
-    public class MyModel {
-        public MyModel parent;
-
-        public ArrayList child;
-
-        public int counter;
-
-        public this(int counter, MyModel parent) {
-            this.parent = parent;
-            this.counter = counter;
-            child = new ArrayList();
-        }
-
-        public String toString() {
-            String rv = "Item ";
-            if (parent !is null) {
-                rv = parent.toString() ~ ".";
-            }
-
-            rv ~= to!(String)(counter);
-
-            return rv;
-        }
-    }
-
-}
--- a/jface/snippets/Snippet031TableViewerCustomTooltipsMultiSelection.d	Thu Aug 07 23:04:04 2008 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,310 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Adam Neal 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:
- *     Adam Neal - initial API and implementation
- * Port to the D programming language:
- *     yidabu at gmail dot com  ( D China http://www.d-programming-language-china.org/ )
- *******************************************************************************/
-
-module jface.snippets.Snippet031TableViewerCustomTooltipsMultiSelection;
-
-// http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.jface.snippets/Eclipse%20JFace%20Snippets/org/eclipse/jface/snippets/viewers/Snippet031TableViewerCustomTooltipsMultiSelection.java?view=markup
-
-import dwtx.dwtxhelper.Collection;
-import tango.util.Convert;
-
-import dwtx.jface.viewers.ArrayContentProvider;
-import dwtx.jface.viewers.ILabelProviderListener;
-import dwtx.jface.viewers.ITableLabelProvider;
-import dwtx.jface.viewers.TableViewer;
-import dwt.DWT;
-import dwt.graphics.Image;
-import dwt.graphics.Point;
-import dwt.graphics.Rectangle;
-import dwt.layout.FillLayout;
-import dwt.widgets.Display;
-import dwt.widgets.Event;
-import dwt.widgets.Label;
-import dwt.widgets.Listener;
-import dwt.widgets.Shell;
-import dwt.widgets.Table;
-import dwt.widgets.TableColumn;
-import dwt.widgets.TableItem;
-import dwt.dwthelper.System;
-import dwt.widgets.Listener;
-
-alias char[] String;
-void main(String[] args)
-{
-    Snippet031TableViewerCustomTooltipsMultiSelection.main(args);
-}
-
-/**
- * A simple TableViewer to demonstrate how custom tooltips could be created easily while preserving
- * the multiple selection.
- *
- * This is a modified example taken from Tom Schindl's Snippet023TreeViewerCustomTooltips.java
- *
- * This code is for users pre 3.3 others could use newly added tooltip support in {@link CellLabelProvider}
- * @author Adam Neal <Adam_Neal@ca.ibm.com>
- *
- */
-public class Snippet031TableViewerCustomTooltipsMultiSelection {
-    public class MyLableProvider : ITableLabelProvider {
-
-        public Image getColumnImage(Object element, int columnIndex) {
-            return null;
-        }
-
-        public String getColumnText(Object element, int columnIndex) {
-            //if (element instanceof MyModel) {
-                switch (columnIndex) {
-                    case 0: return (cast(MyModel)element).col1;
-                    case 1: return (cast(MyModel)element).col2;
-                }
-            //}
-
-            return "";
-        }
-
-        public void addListener(ILabelProviderListener listener) {
-            /* Ignore */
-        }
-
-        public void dispose() {
-            /* Ignore */
-        }
-
-        public bool isLabelProperty(Object element, String property) {
-            return false;
-        }
-
-        public void removeListener(ILabelProviderListener listener) {
-            /* Ignore */
-        }
-
-    }
-
-
-
-    public this(Shell shell) {
-
-
-        final Table table = new Table(shell, DWT.H_SCROLL | DWT.V_SCROLL | DWT.MULTI | DWT.FULL_SELECTION);
-        table.setHeaderVisible(true);
-        table.setLinesVisible(true);
-
-        final TableViewer v = new TableViewer(table);
-        TableColumn tableColumn1 = new TableColumn(table, DWT.NONE);
-        TableColumn tableColumn2 = new TableColumn(table, DWT.NONE);
-
-        String column1 = "Column 1", column2 = "Column 2";
-        /* Setup the table  columns */
-        tableColumn1.setText(column1);
-        tableColumn2.setText(column2);
-        tableColumn1.pack();
-        tableColumn2.pack();
-
-        v.setColumnProperties([ column1, column2 ]);
-        v.setLabelProvider(new MyLableProvider());
-        v.setContentProvider(new ArrayContentProvider!(MyModel));
-        v.setInput(createModel());
-
-        tooltipLabelListener = new TooltipLabelListener();
-
-        /**
-         * The listener that gets added to the table.  This listener is responsible for creating the tooltips
-         * when hovering over a cell item. This listener will listen for the following events:
-         *  <li>DWT.KeyDown     - to remove the tooltip</li>
-         *  <li>DWT.Dispose     - to remove the tooltip</li>
-         *  <li>DWT.MouseMove   - to remove the tooltip</li>
-         *  <li>DWT.MouseHover  - to set the tooltip</li>
-         */
-
-        Listener tableListener = dgListener(&handleTableListener, table);
-
-        table.addListener (DWT.Dispose, tableListener);
-        table.addListener (DWT.KeyDown, tableListener);
-        table.addListener (DWT.MouseMove, tableListener);
-        table.addListener (DWT.MouseHover, tableListener);
-    }
-
-    void handleTableListener(Event event, Table table)
-    {
-        Shell tooltip = null;
-        Label label = null;
-
-        /*
-         * (non-Javadoc)
-         * @see dwt.widgets.Listener#handleEvent(dwt.widgets.Event)
-         */
-       switch (event.type) {
-            case DWT.KeyDown:
-            case DWT.Dispose:
-            case DWT.MouseMove: {
-                if (tooltip is null) break;
-                tooltip.dispose ();
-                tooltip = null;
-                label = null;
-                break;
-            }
-            case DWT.MouseHover: {
-                Point coords = new Point(event.x, event.y);
-                TableItem item = table.getItem(coords);
-                if (item !is null) {
-                    int columnCount = table.getColumnCount();
-                    for (int columnIndex = 0; columnIndex < columnCount; columnIndex++) {
-                        if (item.getBounds(columnIndex).contains(coords)) {
-                            /* Dispose of the old tooltip (if one exists */
-                            if (tooltip !is null  && !tooltip.isDisposed ()) tooltip.dispose ();
-
-                            /* Create a new Tooltip */
-                            tooltip = new Shell (table.getShell(), DWT.ON_TOP | DWT.NO_FOCUS | DWT.TOOL);
-                            tooltip.setBackground (table.getDisplay().getSystemColor (DWT.COLOR_INFO_BACKGROUND));
-                            FillLayout layout = new FillLayout ();
-                            layout.marginWidth = 2;
-                            tooltip.setLayout (layout);
-                            label = new Label (tooltip, DWT.NONE);
-                            label.setForeground (table.getDisplay().getSystemColor (DWT.COLOR_INFO_FOREGROUND));
-                            label.setBackground (table.getDisplay().getSystemColor (DWT.COLOR_INFO_BACKGROUND));
-
-                            /* Store the TableItem with the label so we can pass the mouse event later */
-                            label.setData ("_TableItem_", item);
-
-                            /* Set the tooltip text */
-                            label.setText("Tooltip: " ~ to!(char[])(item.getData()) ~ " : " ~ to!(char[])(columnIndex));
-
-                            /* Setup Listeners to remove the tooltip and transfer the received mouse events */
-                            label.addListener (DWT.MouseExit, tooltipLabelListener);
-                            label.addListener (DWT.MouseDown, tooltipLabelListener);
-
-                            /* Set the size and position of the tooltip */
-                            Point size = tooltip.computeSize (DWT.DEFAULT, DWT.DEFAULT);
-                            Rectangle rect = item.getBounds (columnIndex);
-                            Point pt = table.toDisplay (rect.x, rect.y);
-                            tooltip.setBounds (pt.x, pt.y, size.x, size.y);
-
-                            /* Show it */
-                            tooltip.setVisible (true);
-                            break;
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * This listener is added to the tooltip so that it can either dispose itself if the mouse
-     * exits the tooltip or so it can pass the selection event through to the table.
-     */
-    final TooltipLabelListener tooltipLabelListener;
-    final class TooltipLabelListener : Listener {
-        private bool isCTRLDown(Event e) {
-            return (e.stateMask & DWT.CTRL) != 0;
-        }
-       /*
-        * (non-Javadoc)
-        * @see dwt.widgets.Listener#handleEvent(dwt.widgets.Event)
-        */
-       public void handleEvent (Event event) {
-           Label label = cast(Label)event.widget;
-           Shell shell = label.getShell ();
-           switch (event.type) {
-                case DWT.MouseDown: /* Handle a user Click */
-                    /* Extract our Data */
-                    Event e = new Event ();
-                    e.item = cast(TableItem) label.getData ("_TableItem_");
-                    Table table = (cast(TableItem) e.item).getParent();
-
-                    /* Construct the new Selection[] to show */
-                    TableItem [] newSelection = null;
-                    if (isCTRLDown(event)) {
-                        /* We have 2 scenario's.
-                         *  1) We are selecting an already selected element - so remove it from the selected indices
-                         *  2) We are selecting a non-selected element - so add it to the selected indices
-                         */
-                        TableItem[] sel = table.getSelection();
-                        for (int i = 0; i < sel.length; ++i) {
-                            //if (e.item.equals(sel[i])) {
-                            if (e.item is sel[i]) {
-                                // We are de-selecting this element
-                                newSelection = new TableItem[sel.length - 1];
-                                System.arraycopy(sel, 0, newSelection, 0, i);
-                                System.arraycopy(sel, i+1, newSelection, i, sel.length - i - 1);
-                                break;
-                            }
-                        }
-
-                        /*
-                         * If we haven't created the newSelection[] yet, than we are adding the newly selected element
-                         * into the list of selected indicies
-                         */
-                        if (newSelection is null) {
-                            newSelection = new TableItem[sel.length + 1];
-                            System.arraycopy(sel, 0, newSelection, 0, sel.length);
-                            newSelection[sel.length] = cast(TableItem) e.item;
-                        }
-
-                    } else {
-                        /* CTRL is not down, so we simply select the single element */
-                        newSelection = [ cast(TableItem) e.item ];
-                    }
-                    /* Set the new selection of the table and notify the listeners */
-                    table.setSelection (newSelection);
-                    table.notifyListeners (DWT.Selection, e);
-
-                    /* Remove the Tooltip */
-                    shell.dispose ();
-                    table.setFocus();
-                    break;
-                case DWT.MouseExit:
-                    shell.dispose ();
-                    break;
-            }
-        }
-    }
-
-
-    private ArrayList createModel() {
-        ArrayList list = new ArrayList;
-        list.add(new MyModel("A", "B"));
-        list.add(new MyModel("C", "D"));
-        list.add(new MyModel("E", "F"));
-        return list;
-    }
-
-    public static void main(String[] args) {
-        Display display = new Display();
-        Shell shell = new Shell(display);
-        shell.setLayout(new FillLayout());
-        new Snippet031TableViewerCustomTooltipsMultiSelection(shell);
-        shell.open();
-
-        while (!shell.isDisposed()) {
-            if (!display.readAndDispatch())
-                display.sleep();
-        }
-
-        display.dispose();
-    }
-}
-
-public class MyModel {
-    public String col1, col2;
-
-    public this(String c1, String c2) {
-        col1 = c1;
-        col2 = c2;
-    }
-
-    public String toString() {
-        return col1 ~ col2;
-    }
-}
-
--- a/jface/snippets/Snippet040TableViewerSorting.d	Thu Aug 07 23:04:04 2008 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,310 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl 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:
- *     Tom Schindl - initial API and implementation
- * Port to the D programming language:
- *     yidabu at gmail dot com  ( D China http://www.d-programming-language-china.org/ )
- *******************************************************************************/
-module jface.snippets.Snippet040TableViewerSorting;
-
-// http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.jface.snippets/Eclipse%20JFace%20Snippets/org/eclipse/jface/snippets/viewers/Snippet040TableViewerSorting.java?view=markup
-
-import dwtx.jface.viewers.CellEditor;
-import dwtx.jface.viewers.ColumnLabelProvider;
-import dwtx.jface.viewers.ColumnViewer;
-import dwtx.jface.viewers.EditingSupport;
-import dwtx.jface.viewers.IStructuredContentProvider;
-import dwtx.jface.viewers.TableViewer;
-import dwtx.jface.viewers.TableViewerColumn;
-import dwtx.jface.viewers.TextCellEditor;
-import dwtx.jface.viewers.Viewer;
-import dwtx.jface.viewers.ViewerComparator;
-import dwt.DWT;
-import dwt.events.SelectionAdapter;
-import dwt.events.SelectionEvent;
-import dwt.layout.FillLayout;
-import dwt.widgets.Display;
-import dwt.widgets.Shell;
-import dwt.dwthelper.utils;
-
-/**
- * Example usage of ViewerComparator in tables to allow sorting
- *
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- *
- */
-
-void main(String[] args) {
-    Snippet040TableViewerSorting.main(args);
-}
-
-    private class MyContentProvider : IStructuredContentProvider {
-
-        public Object[] getElements(Object inputElement) {
-            return (cast(ArrayWrapperT!(Person)) inputElement).array;
-        }
-
-        public void dispose() {
-        }
-
-        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-        }
-
-    }
-
-    public class Person {
-        public String givenname;
-        public String surname;
-        public String email;
-
-        public this(String givenname, String surname, String email) {
-            this.givenname = givenname;
-            this.surname = surname;
-            this.email = email;
-        }
-
-    }
-
-    protected abstract class AbstractEditingSupport : EditingSupport {
-        private TextCellEditor editor;
-
-        public this(TableViewer viewer) {
-            super(viewer);
-            this.editor = new TextCellEditor(viewer.getTable());
-        }
-
-        protected bool canEdit(Object element) {
-            return true;
-        }
-
-        protected CellEditor getCellEditor(Object element) {
-            return editor;
-        }
-
-        protected void setValue(Object element, Object value) {
-            doSetValue(element, value);
-            getViewer().update(element, null);
-        }
-
-        protected abstract void doSetValue(Object element, Object value);
-    }
-
-    private abstract class ColumnViewerSorter : ViewerComparator {
-        public static final int ASC = 1;
-
-        public static final int NONE = 0;
-
-        public static final int DESC = -1;
-
-        private int direction = 0;
-
-        private TableViewerColumn column;
-
-        private ColumnViewer viewer;
-
-        public this(ColumnViewer viewer_, TableViewerColumn column_) {
-            this.column = column_;
-            this.viewer = viewer_;
-            this.column.getColumn().addSelectionListener(new class() SelectionAdapter {
-                public void widgetSelected(SelectionEvent e) {
-                    this.outer.widgetSelected(e);
-                }
-            });
-        }
-
-        private void widgetSelected(SelectionEvent e){
-            if( viewer.getComparator() !is null ) {
-                if( viewer.getComparator() is this ) {
-                    int tdirection = direction;
-
-                    if( tdirection is ASC ) {
-                        setSorter(this, DESC);
-                    } else if( tdirection is DESC ) {
-                        setSorter(this, NONE);
-                    }
-                } else {
-                    setSorter(this, ASC);
-                }
-            } else {
-                setSorter(this, ASC);
-            }
-        }
-        public void setSorter(ColumnViewerSorter sorter, int direction) {
-            if( direction is NONE ) {
-                column.getColumn().getParent().setSortColumn(null);
-                column.getColumn().getParent().setSortDirection(DWT.NONE);
-                viewer.setComparator(null);
-            } else {
-                column.getColumn().getParent().setSortColumn(column.getColumn());
-                sorter.direction = direction;
-
-                if( direction is ASC ) {
-                    column.getColumn().getParent().setSortDirection(DWT.DOWN);
-                } else {
-                    column.getColumn().getParent().setSortDirection(DWT.UP);
-                }
-
-                if( viewer.getComparator() is sorter ) {
-                    viewer.refresh();
-                } else {
-                    viewer.setComparator(sorter);
-                }
-
-            }
-        }
-
-        public int compare(Viewer viewer, Object e1, Object e2) {
-            return direction * doCompare(viewer, e1, e2);
-        }
-
-        protected abstract int doCompare(Viewer viewer, Object e1, Object e2);
-    }
-
-public class Snippet040TableViewerSorting {
-
-
-    public this(Shell shell) {
-        TableViewer v = new TableViewer(shell, DWT.BORDER | DWT.FULL_SELECTION);
-        v.setContentProvider(new MyContentProvider());
-
-        TableViewerColumn column = new TableViewerColumn(v, DWT.NONE);
-        column.getColumn().setWidth(200);
-        column.getColumn().setText("Givenname");
-        column.getColumn().setMoveable(true);
-        column.setLabelProvider(new class() ColumnLabelProvider {
-            public String getText(Object element) {
-                return (cast(Person) element).givenname;
-            }
-        });
-
-        column.setEditingSupport(new class(v) AbstractEditingSupport {
-            public this(TableViewer t ){
-                super(t);
-            }
-            protected Object getValue(Object element) {
-                return new ArrayWrapperString((cast(Person) element).givenname);
-            }
-            protected void doSetValue(Object element, Object value) {
-                (cast(Person) element).givenname = stringcast(value);
-            }
-        });
-
-        ColumnViewerSorter cSorter = new class(v,column) ColumnViewerSorter {
-            this(TableViewer t, TableViewerColumn c ){
-                super(t,c);
-            }
-            protected int doCompare(Viewer viewer, Object e1, Object e2) {
-                Person p1 = cast(Person) e1;
-                Person p2 = cast(Person) e2;
-                return p1.givenname.compareToIgnoreCase(p2.givenname);
-            }
-        };
-
-        column = new TableViewerColumn(v, DWT.NONE);
-        column.getColumn().setWidth(200);
-        column.getColumn().setText("Surname");
-        column.getColumn().setMoveable(true);
-        column.setLabelProvider(new class() ColumnLabelProvider {
-            public String getText(Object element) {
-                return (cast(Person) element).surname;
-            }
-        });
-
-        column.setEditingSupport(new class(v) AbstractEditingSupport {
-            this(TableViewer t ){
-                super(t);
-            }
-            protected Object getValue(Object element) {
-                return stringcast((cast(Person) element).surname);
-            }
-            protected void doSetValue(Object element, Object value) {
-                (cast(Person) element).surname = stringcast(value);
-            }
-        });
-
-        new class(v,column) ColumnViewerSorter {
-            this(TableViewer t, TableViewerColumn c ){
-                super(t,c);
-            }
-            protected int doCompare(Viewer viewer, Object e1, Object e2) {
-                Person p1 = cast(Person) e1;
-                Person p2 = cast(Person) e2;
-                return p1.surname.compareToIgnoreCase(p2.surname);
-            }
-        };
-
-        column = new TableViewerColumn(v, DWT.NONE);
-        column.getColumn().setWidth(200);
-        column.getColumn().setText("E-Mail");
-        column.getColumn().setMoveable(true);
-        column.setLabelProvider(new class() ColumnLabelProvider {
-            public String getText(Object element) {
-                return (cast(Person) element).email;
-            }
-        });
-
-        column.setEditingSupport(new class(v) AbstractEditingSupport {
-            this(TableViewer t ){
-                super(t);
-            }
-            protected Object getValue(Object element) {
-                return stringcast((cast(Person) element).email);
-            }
-            protected void doSetValue(Object element, Object value) {
-                (cast(Person) element).email = stringcast(value);
-            }
-        });
-        new class(v,column) ColumnViewerSorter {
-            this(TableViewer t, TableViewerColumn c ){
-                super(t,c);
-            }
-            protected int doCompare(Viewer viewer, Object e1, Object e2) {
-                Person p1 = cast(Person) e1;
-                Person p2 = cast(Person) e2;
-                return p1.email.compareToIgnoreCase(p2.email);
-            }
-        };
-
-        Person[] model = createModel();
-        v.setInput( new ArrayWrapperT!(Person)(model));
-        v.getTable().setLinesVisible(true);
-        v.getTable().setHeaderVisible(true);
-        cSorter.setSorter(cSorter, ColumnViewerSorter.ASC);
-    }
-
-    private Person[] createModel() {
-        Person[] elements = new Person[4];
-        elements[0] = new Person("Tom", "Schindl",
-                "tom.schindl@bestsolution.at");
-        elements[1] = new Person("Boris", "Bokowski",
-                "Boris_Bokowski@ca.ibm.com");
-        elements[2] = new Person("Tod", "Creasey", "Tod_Creasey@ca.ibm.com");
-        elements[3] = new Person("Wayne", "Beaton", "wayne@eclipse.org");
-
-        return elements;
-    }
-
-    /**
-     * @param args
-     */
-    public static void main(String[] args) {
-        Display display = new Display();
-
-        Shell shell = new Shell(display);
-        shell.setLayout(new FillLayout());
-        new Snippet040TableViewerSorting(shell);
-        shell.open();
-
-        while (!shell.isDisposed()) {
-            if (!display.readAndDispatch())
-                display.sleep();
-        }
-        display.dispose();
-    }
-
-}
--- a/jface/snippets/Snippet043NoColumnTreeViewerKeyboardEditing.d	Thu Aug 07 23:04:04 2008 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,222 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl 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:
- *     Tom Schindl - initial API and implementation
- * Port to the D programming language:
- *     yidabu at gmail dot com  ( D China http://www.d-programming-language-china.org/ )
- *******************************************************************************/
-
-module dwtx.jface.snippets.Snippet043NoColumnTreeViewerKeyboardEditing;
-
-import dwtx.jface.viewers.CellEditor;
-import dwtx.jface.viewers.ColumnViewerEditor;
-import dwtx.jface.viewers.ColumnViewer;
-import dwtx.jface.viewers.ColumnViewerEditorActivationStrategy;
-import dwtx.jface.viewers.ColumnViewerEditorActivationEvent;
-import dwtx.jface.viewers.FocusCellOwnerDrawHighlighter;
-import dwtx.jface.viewers.ICellModifier;
-import dwtx.jface.viewers.ITreeContentProvider;
-import dwtx.jface.viewers.TextCellEditor;
-import dwtx.jface.viewers.TreePath;
-import dwtx.jface.viewers.TreeViewerFocusCellManager;
-import dwtx.jface.viewers.TreeViewerEditor;
-import dwtx.jface.viewers.TreeViewer;
-import dwtx.jface.viewers.Viewer;
-import dwt.DWT;
-import dwt.events.SelectionEvent;
-import dwt.events.SelectionListener;
-import dwt.layout.FillLayout;
-import dwt.widgets.Button;
-import dwt.widgets.Display;
-import dwt.widgets.Item;
-import dwt.widgets.Shell;
-
-import dwt.dwthelper.utils;
-
-import tango.util.Convert;
-import tango.util.container.LinkedList;
-
-version(JIVE) import jive.stacktrace;
-
-
-void main(String[] args) {
-    Display display = new Display();
-    Shell shell = new Shell(display);
-    shell.setLayout(new FillLayout());
-    new Snippet043NoColumnTreeViewerKeyboardEditing(shell);
-    shell.open();
-
-    while (!shell.isDisposed()) {
-        if (!display.readAndDispatch())
-            display.sleep();
-    }
-
-    display.dispose();
-}
-
-/**
- * Demonstrates how to use keyboard-editing support in a TreeViewer with no column
- *
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- *
- */
-public class Snippet043NoColumnTreeViewerKeyboardEditing {
-    alias LinkedList!(MyModel) ArrayList;
-    public this(Shell shell) {
-        Button b = new Button(shell, DWT.PUSH);
-        b.setText("BBB");
-        final TreeViewer v = new TreeViewer(shell, DWT.BORDER
-                | DWT.FULL_SELECTION);
-        b.addSelectionListener(new class(v) SelectionListener {
-            TreeViewer v;
-            this(TreeViewer v_)
-            {
-                this.v = v_;
-            }
-
-            public void widgetDefaultSelected(SelectionEvent e) {
-
-            }
-
-            public void widgetSelected(SelectionEvent e) {
-                MyModel root = cast(MyModel) v.getInput();
-                TreePath path = new TreePath([ root, root.child.get(1),
-                        (cast(MyModel) root.child.get(1)).child.get(0)] );
-                v.editElement(path, 0);
-            }
-
-        });
-
-        v.setCellEditors([ new TextCellEditor(v.getTree()) ]);
-        v.setColumnProperties(["col1"]);
-        v.setCellModifier(new class(v) ICellModifier {
-            TreeViewer v;
-            this(TreeViewer v_)
-            {
-                this.v = v_;
-            }
-            public bool canModify(Object element, String property) {
-                return true;
-            }
-
-            public Object getValue(Object element, String property) {
-                return stringcast( to!(String)((cast(MyModel) element).counter) ~ "" );
-            }
-
-            public void modify(Object element, String property, Object value) {
-                element = (cast(Item) element).getData();
-                (cast(MyModel) element).counter = Integer.parseInt(value.toString());
-                v.update(element, null);
-            }
-
-        });
-
-        TreeViewerFocusCellManager focusCellManager = new TreeViewerFocusCellManager(
-                v, new FocusCellOwnerDrawHighlighter(v));
-        ColumnViewerEditorActivationStrategy actSupport = new class(v) ColumnViewerEditorActivationStrategy {
-            this(ColumnViewer v)
-            {
-                super(v);
-            }
-            protected bool isEditorActivationEvent(
-                    ColumnViewerEditorActivationEvent event) {
-                return event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL
-                        || event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION
-                        || (event.eventType == ColumnViewerEditorActivationEvent.KEY_PRESSED && event.keyCode == DWT.CR)
-                        || event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC;
-            }
-        };
-
-        TreeViewerEditor.create(v, focusCellManager, actSupport,
-                ColumnViewerEditor.TABBING_HORIZONTAL
-                        | ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR
-                        | ColumnViewerEditor.TABBING_VERTICAL
-                        | ColumnViewerEditor.KEYBOARD_ACTIVATION);
-
-        v.setContentProvider(new MyContentProvider());
-
-        v.setInput(createModel());
-    }
-
-    private MyModel createModel() {
-
-        MyModel root = new MyModel(0, null);
-        root.counter = 0;
-
-        MyModel tmp;
-        MyModel subItem;
-        for (int i = 1; i < 10; i++) {
-            tmp = new MyModel(i, root);
-            root.child.add(tmp);
-            for (int j = 1; j < i; j++) {
-                subItem = new MyModel(j, tmp);
-                subItem.child.add(new MyModel(j * 100, subItem));
-                tmp.child.add(subItem);
-            }
-        }
-
-        return root;
-    }
-
-
-
-    private class MyContentProvider : ITreeContentProvider {
-
-        public Object[] getElements(Object inputElement) {
-            return (cast(MyModel) inputElement).child.toArray();
-        }
-
-        public void dispose() {
-        }
-
-        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-        }
-
-        public Object[] getChildren(Object parentElement) {
-            return getElements(parentElement);
-        }
-
-        public Object getParent(Object element) {
-            if (element is null) {
-                return null;
-            }
-            return (cast(MyModel) element).parent;
-        }
-
-        public bool hasChildren(Object element) {
-            return (cast(MyModel) element).child.size() > 0;
-        }
-
-    }
-
-    public class MyModel {
-        public MyModel parent;
-
-        public ArrayList child;
-
-        public int counter;
-
-        public this(int counter_, MyModel parent_) {
-            this.parent = parent_;
-            this.counter = counter_;
-            child = new ArrayList();
-        }
-
-        public String toString() {
-            String rv = "Item ";
-            if (parent !is null) {
-                rv = parent.toString() ~ ".";
-            }
-
-            rv ~= to!(String)(counter);
-
-            return rv;
-        }
-    }
-
-}
--- a/jface/snippets/Snippet047VirtualLazyTreeViewer.d	Thu Aug 07 23:04:04 2008 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,186 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl 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:
- *     Tom Schindl - initial API and implementation
- * Port to the D programming language:
- *     yidabu at gmail dot com  ( D China http://www.d-programming-language-china.org/ )
- *******************************************************************************/
-
-module jface.snippets.Snippet047VirtualLazyTreeViewer;
-
-import dwtx.jface.viewers.ILazyTreeContentProvider;
-import dwtx.jface.viewers.LabelProvider;
-import dwtx.jface.viewers.TreeViewer;
-import dwtx.jface.viewers.Viewer;
-import dwt.DWT;
-import dwt.layout.FillLayout;
-import dwt.widgets.Display;
-import dwt.widgets.Shell;
-
-import dwt.dwthelper.utils;
-
-import tango.util.Convert;
-import tango.util.container.LinkedList;
-
-version(JIVE) import jive.stacktrace;
-
-
-/**
- * @param args
- */
-void main(String[] args) {
-    Display display = new Display();
-    Shell shell = new Shell(display);
-    shell.setLayout(new FillLayout());
-    new Snippet047VirtualLazyTreeViewer(shell);
-    shell.open();
-
-    while (!shell.isDisposed()) {
-        if (!display.readAndDispatch())
-            display.sleep();
-    }
-
-    display.dispose();
-
-}
-
-/**
- * A simple TreeViewer to demonstrate usage of an ILazyContentProvider.
- *
- */
-public class Snippet047VirtualLazyTreeViewer {
-    alias ArrayWrapperT!(IntermediateNode)  ArrayWrapperIntermediateNode;
-    alias ArrayWrapperT!(LeafNode)  ArrayWrapperLeafNode;
-
-    private class MyContentProvider : ILazyTreeContentProvider {
-        private TreeViewer viewer;
-        private IntermediateNode[] elements;
-
-        public this(TreeViewer viewer) {
-            this.viewer = viewer;
-        }
-
-        public void dispose() {
-
-        }
-
-        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-            if(cast(ArrayWrapperIntermediateNode) newInput)
-                this.elements = (cast(ArrayWrapperIntermediateNode) newInput).array;
-        }
-
-        /*
-         * (non-Javadoc)
-         *
-         * @see dwtx.jface.viewers.ILazyTreeContentProvider#getParent(java.lang.Object)
-         */
-        public Object getParent(Object element) {
-            if (cast(LeafNode)element)
-                return (cast(LeafNode) element).parent;
-            return new ArrayWrapperIntermediateNode(elements);
-        }
-
-        /*
-         * (non-Javadoc)
-         *
-         * @see dwtx.jface.viewers.ILazyTreeContentProvider#updateChildCount(java.lang.Object,
-         *      int)
-         */
-        public void updateChildCount(Object element, int currentChildCount) {
-
-            int length = 0;
-            if (cast(IntermediateNode)element) {
-                IntermediateNode node = cast(IntermediateNode) element;
-                length =  node.children.length;
-            }
-            /// TODO: fix me  access violation here
-            if(element !is null && elements !is null && (cast(ArrayWrapperIntermediateNode)element) && (cast(ArrayWrapperIntermediateNode)element).array is elements)
-                length = elements.length;
-            viewer.setChildCount(element, length);
-        }
-
-        /*
-         * (non-Javadoc)
-         *
-         * @see dwtx.jface.viewers.ILazyTreeContentProvider#updateElement(java.lang.Object,
-         *      int)
-         */
-        public void updateElement(Object parent, int index) {
-
-            Object element;
-            if (cast(IntermediateNode)parent)
-                element = (cast(IntermediateNode) parent).children[index];
-
-            else
-                element =  elements[index];
-            viewer.replace(parent, index, element);
-            updateChildCount(element, -1);
-
-        }
-
-    }
-
-    public class LeafNode {
-        public int counter;
-        public IntermediateNode parent;
-
-        public this(int counter, IntermediateNode parent) {
-            this.counter = counter;
-            this.parent = parent;
-        }
-
-        public String toString() {
-            return "Leaf " ~ to!(String)(this.counter);
-        }
-    }
-
-    public class IntermediateNode {
-        public int counter;
-        public LeafNode[] children;
-
-        public this(int counter) {
-            this.counter = counter;
-            children = new LeafNode[0];
-        }
-
-        public String toString() {
-            return "Node " ~ to!(String)(this.counter);
-        }
-
-        public void generateChildren(int i) {
-            children = new LeafNode[i];
-            for (int j = 0; j < i; j++) {
-                children[j] = new LeafNode(j, this);
-            }
-
-        }
-    }
-
-    public this(Shell shell) {
-        final TreeViewer v = new TreeViewer(shell, DWT.VIRTUAL | DWT.BORDER);
-        v.setLabelProvider(new LabelProvider());
-        v.setContentProvider(new MyContentProvider(v));
-        v.setUseHashlookup(true);
-        IntermediateNode[] model = createModel();
-        v.setInput(new ArrayWrapperIntermediateNode(model));
-        v.getTree().setItemCount(model.length);
-
-    }
-
-    private IntermediateNode[] createModel() {
-        IntermediateNode[] elements = new IntermediateNode[10];
-
-        for (int i = 0; i < 10; i++) {
-            elements[i] = new IntermediateNode(i);
-            elements[i].generateChildren(1000);
-        }
-
-        return elements;
-    }
-
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jface/snippets/viewers/Snippet001TableViewer.d	Fri Aug 08 14:40:21 2008 +0200
@@ -0,0 +1,110 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Tom Schindl 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:
+ *     Tom Schindl - initial API and implementation
+ * Port to the D programming language:
+ *     wbaxter at gmail dot com
+ *******************************************************************************/
+
+module snippets.viewers.Snippet001TableViewer;
+
+import dwtx.jface.viewers.IStructuredContentProvider;
+import dwtx.jface.viewers.LabelProvider;
+import dwtx.jface.viewers.TableViewer;
+import dwtx.jface.viewers.Viewer;
+import dwt.layout.FillLayout;
+import dwt.widgets.Display;
+import dwt.widgets.Shell;
+import dwt.DWT;
+
+import dwt.dwthelper.utils;
+
+import tango.util.Convert;
+import dwtx.dwtxhelper.Collection;
+
+/**
+ * A simple TableViewer to demonstrate usage
+ *
+ * @author Tom Schindl <tom.schindl@bestsolution.at>
+ *
+ */
+public class Snippet001TableViewer {
+	private class MyContentProvider : IStructuredContentProvider {
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
+		 */
+		public Object[] getElements(Object inputElement) {
+			return (cast(ArrayList)inputElement).toArray;
+		}
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
+		 */
+		public void dispose() {
+
+		}
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
+		 */
+		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+
+		}
+
+	}
+
+	public class MyModel {
+		public int counter;
+
+		public this(int counter) {
+			this.counter = counter;
+		}
+
+		public String toString() {
+			return "Item " ~ to!(char[])(this.counter);
+		}
+	}
+
+	public this(Shell shell) {
+		final TableViewer v = new TableViewer(shell);
+		v.setLabelProvider(new LabelProvider());
+		v.setContentProvider(new MyContentProvider());
+		ArrayList model = createModel();
+		v.setInput(model);
+		v.getTable().setLinesVisible(true);
+	}
+
+	private ArrayList createModel() {
+		ArrayList elements = new ArrayList(10);
+
+		for( int i = 0; i < 10; i++ ) {
+			elements.add( new MyModel(i));
+		}
+
+		return elements;
+	}
+
+}
+
+void main()
+{
+    Display display = new Display ();
+    Shell shell = new Shell(display);
+    shell.setLayout(new FillLayout());
+    new Snippet001TableViewer(shell);
+    shell.open ();
+
+    while (!shell.isDisposed ()) {
+        if (!display.readAndDispatch ()) display.sleep ();
+    }
+
+    display.dispose ();
+
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jface/snippets/viewers/Snippet002TreeViewer.d	Fri Aug 08 14:40:21 2008 +0200
@@ -0,0 +1,146 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Tom Schindl 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:
+ *     Tom Schindl - initial API and implementation
+ * Port to the D programming language:
+ *     wbaxter at gmail dot com
+ *******************************************************************************/
+
+module snippets.viewers.Snippet002TreeViewer;
+
+import dwt.DWT;
+import dwtx.jface.viewers.ITreeContentProvider;
+import dwtx.jface.viewers.LabelProvider;
+import dwtx.jface.viewers.TreeViewer;
+import dwtx.jface.viewers.Viewer;
+import dwt.layout.FillLayout;
+import dwt.widgets.Display;
+import dwt.widgets.Shell;
+
+import dwt.dwthelper.utils;
+
+import tango.util.Convert;
+
+/**
+ * A simple TreeViewer to demonstrate usage
+ *
+ * @author Tom Schindl <tom.schindl@bestsolution.at>
+ *
+ */
+class Snippet002TreeViewer {
+	private class MyContentProvider : ITreeContentProvider {
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
+		 */
+		public Object[] getElements(Object inputElement) {
+			return (cast(MyModel)inputElement).child/*.dup*/;
+		}
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
+		 */
+		public void dispose() {
+
+		}
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
+		 */
+		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+
+		}
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
+		 */
+		public Object[] getChildren(Object parentElement) {
+			return getElements(parentElement);
+		}
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
+		 */
+		public Object getParent(Object element) {
+			if( element is null) {
+				return null;
+			}
+
+			return (cast(MyModel)element).parent;
+		}
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
+		 */
+		public bool hasChildren(Object element) {
+			return (cast(MyModel)element).child.length > 0;
+		}
+
+	}
+
+	public class MyModel {
+		public MyModel parent;
+		public MyModel[] child;
+		public int counter;
+
+		public this(int counter, MyModel parent) {
+			this.parent = parent;
+			this.counter = counter;
+		}
+
+		public String toString() {
+			String rv = "Item ";
+			if( parent !is null ) {
+				rv = parent.toString() ~ ".";
+			}
+
+			rv ~= to!(char[])(counter);
+
+			return rv;
+		}
+	}
+
+	public this(Shell shell) {
+		TreeViewer v = new TreeViewer(shell);
+		v.setLabelProvider(new LabelProvider());
+		v.setContentProvider(new MyContentProvider());
+		v.setInput(createModel());
+	}
+
+	private MyModel createModel() {
+		MyModel root = new MyModel(0,null);
+		root.counter = 0;
+
+		MyModel tmp;
+		for( int i = 1; i < 10; i++ ) {
+			tmp = new MyModel(i, root);
+			root.child ~= tmp;
+			for( int j = 1; j < i; j++ ) {
+				tmp.child ~= new MyModel(j,tmp);
+			}
+		}
+
+		return root;
+	}
+
+}
+
+
+void main() {
+    Display display = new Display ();
+    Shell shell = new Shell(display);
+    shell.setLayout(new FillLayout());
+    new Snippet002TreeViewer(shell);
+    shell.open ();
+
+    while (!shell.isDisposed ()) {
+        if (!display.readAndDispatch ()) display.sleep ();
+    }
+
+    display.dispose ();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jface/snippets/viewers/Snippet004HideSelection.d	Fri Aug 08 14:40:21 2008 +0200
@@ -0,0 +1,127 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Tom Schindl 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:
+ *     Tom Schindl - initial API and implementation
+ * Port to the D programming language:
+ *     wbaxter at gmail dot com
+ *******************************************************************************/
+
+module snippets.viewers.Snippet004HideSelection;
+
+import dwtx.jface.viewers.IStructuredContentProvider;
+import dwtx.jface.viewers.LabelProvider;
+import dwtx.jface.viewers.StructuredSelection;
+import dwtx.jface.viewers.TableViewer;
+import dwtx.jface.viewers.Viewer;
+import dwt.DWT;
+import dwt.events.MouseAdapter;
+import dwt.events.MouseEvent;
+import dwt.graphics.Point;
+import dwt.layout.FillLayout;
+import dwt.widgets.Display;
+import dwt.widgets.Shell;
+
+import dwt.dwthelper.utils;
+import dwtx.dwtxhelper.Collection;
+
+import tango.util.Convert;
+
+/**
+ * Snippet that hides the selection when nothing is selected.
+ *
+ * @author Tom Schindl <tom.schindl@bestsolution.at>
+ *
+ */
+public class Snippet004HideSelection {
+	private class MyContentProvider : IStructuredContentProvider {
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
+		 */
+		public Object[] getElements(Object inputElement) {
+			return (cast(ArrayList)inputElement).toArray;
+		}
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
+		 */
+		public void dispose() {
+
+		}
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
+		 */
+		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+
+		}
+	}
+
+	public class MyModel {
+		public int counter;
+
+		public this(int counter) {
+			this.counter = counter;
+		}
+
+		public String toString() {
+			return "Item " ~ to!(char[])(this.counter);
+		}
+	}
+
+	public this(Shell shell) {
+		final TableViewer v = new TableViewer(shell,DWT.BORDER|DWT.FULL_SELECTION);
+		v.setLabelProvider(new LabelProvider());
+		v.setContentProvider(new MyContentProvider());
+		ArrayList model = createModel();
+		v.setInput(model);
+		v.getTable().setLinesVisible(true);
+		v.getTable().addMouseListener(new class(v) MouseAdapter {
+            private TableViewer v;
+            this(TableViewer v_) {
+                this.v = v_;
+            }
+
+			/* (non-Javadoc)
+			 * @see org.eclipse.swt.events.MouseAdapter#mouseDown(org.eclipse.swt.events.MouseEvent)
+			 */
+			public void mouseDown(MouseEvent e) {
+				if( v.getTable().getItem(new Point(e.x,e.y)) is null ) {
+					v.setSelection(new StructuredSelection());
+				}
+			}
+
+		});
+	}
+
+	private ArrayList createModel() {
+		ArrayList elements = new ArrayList(10);
+		for( int i = 0; i < 10; i++ ) {
+			elements.add( new MyModel(i));
+		}
+
+		return elements;
+	}
+
+}
+
+static void main() {
+    Display display = new Display ();
+    Shell shell = new Shell(display);
+    shell.setLayout(new FillLayout());
+    new Snippet004HideSelection(shell);
+    shell.open ();
+
+    while (!shell.isDisposed ()) {
+        if (!display.readAndDispatch ()) display.sleep ();
+    }
+
+    display.dispose ();
+
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jface/snippets/viewers/Snippet005TreeCustomMenu.d	Fri Aug 08 14:40:21 2008 +0200
@@ -0,0 +1,183 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Tom Schindl 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:
+ *     Tom Schindl - initial API and implementation
+ * Port to the D programming language:
+ *     wbaxter at gmail dot com
+ *******************************************************************************/
+
+module snippets.viewers.Snippet005TreeCustomMenu;
+
+import dwtx.jface.action.Action;
+import dwtx.jface.action.IMenuListener;
+import dwtx.jface.action.IMenuManager;
+import dwtx.jface.action.MenuManager;
+import dwtx.jface.viewers.IStructuredSelection;
+import dwtx.jface.viewers.ITreeContentProvider;
+import dwtx.jface.viewers.LabelProvider;
+import dwtx.jface.viewers.TreeViewer;
+import dwtx.jface.viewers.Viewer;
+import dwt.layout.FillLayout;
+import dwt.widgets.Display;
+import dwt.widgets.Shell;
+import dwt.DWT;
+
+import dwt.dwthelper.utils;
+
+import tango.util.Convert;
+import tango.io.Stdout;
+
+/**
+ * Customized context menu based on TreeItem-Selection
+ *
+ * @author Tom Schindl <tom.schindl@bestsolution.at>
+ *
+ */
+public class Snippet005TreeCustomMenu {
+	private class MyContentProvider : ITreeContentProvider {
+
+		public Object[] getElements(Object inputElement) {
+			return (cast(MyModel) inputElement).child;
+		}
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
+		 */
+		public void dispose() {
+
+		}
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
+		 */
+		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+
+		}
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
+		 */
+		public Object[] getChildren(Object parentElement) {
+			return getElements(parentElement);
+		}
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
+		 */
+		public Object getParent(Object element) {
+			if (element is null) {
+				return null;
+			}
+
+			return (cast(MyModel) element).parent;
+		}
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
+		 */
+		public bool hasChildren(Object element) {
+			return (cast(MyModel) element).child.length > 0;
+		}
+
+	}
+
+	public class MyModel {
+		public MyModel parent;
+
+		public MyModel[] child;
+
+		public int counter;
+
+		public this(int counter, MyModel parent) {
+			this.parent = parent;
+			this.counter = counter;
+		}
+
+		public String toString() {
+			String rv = "Item ";
+			if (parent !is null) {
+				rv = parent.toString() ~  ".";
+			}
+
+			rv ~= to!(char[])(counter);
+
+			return rv;
+		}
+	}
+
+	public this(Shell shell) {
+		final TreeViewer v = new TreeViewer(shell);
+		v.setLabelProvider(new LabelProvider());
+		v.setContentProvider(new MyContentProvider());
+		v.setInput(createModel());
+
+		final Action a = new class Action {};
+		final MenuManager mgr = new MenuManager();
+		mgr.setRemoveAllWhenShown(true);
+
+        class MyMenuListener :  IMenuListener {
+            TreeViewer v;
+            Action a;
+            MenuManager mgr;
+
+            this(TreeViewer v_, Action a_, MenuManager mgr_) {
+                this.v = v_; this.a = a_; this.mgr = mgr_;
+            }
+
+            /* (non-Javadoc)
+             * @see org.eclipse.jface.action.IMenuListener#menuAboutToShow(org.eclipse.jface.action.IMenuManager)
+             */
+            public void menuAboutToShow(IMenuManager manager) {
+                IStructuredSelection selection = cast(IStructuredSelection) v
+                    .getSelection();
+                if (!selection.isEmpty()) {
+                    a.setText("Action for "
+                              ~ (cast(MyModel) selection.getFirstElement())
+                              .toString());
+                    mgr.add(a);
+                }
+            }
+        }
+
+		mgr.addMenuListener(new MyMenuListener(v,a,mgr));
+		v.getControl().setMenu(mgr.createContextMenu(v.getControl()));
+	}
+
+	private MyModel createModel() {
+
+		MyModel root = new MyModel(0, null);
+		root.counter = 0;
+
+		MyModel tmp;
+		for (int i = 1; i < 10; i++) {
+			tmp = new MyModel(i, root);
+			root.child ~= tmp;
+			for (int j = 1; j < i; j++) {
+				tmp.child ~= new MyModel(j, tmp);
+			}
+		}
+
+		return root;
+	}
+
+}
+
+void main() {
+    Display display = new Display();
+    Shell shell = new Shell(display);
+    shell.setLayout(new FillLayout());
+    new Snippet005TreeCustomMenu(shell);
+    shell.open();
+
+    while (!shell.isDisposed()) {
+        if (!display.readAndDispatch())
+            display.sleep();
+    }
+
+    display.dispose();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jface/snippets/viewers/Snippet006TableMultiLineCells.d	Fri Aug 08 14:40:21 2008 +0200
@@ -0,0 +1,255 @@
+/*******************************************************************************
+* Copyright (c) 2005, 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:
+*     yidabu at gmail dot com  ( D China http://www.d-programming-language-china.org/ )
+*******************************************************************************/
+module snippets.viewers.Snippet006TableMultiLineCells;
+
+
+// http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.jface.snippets/Eclipse%20JFace%20Snippets/org/eclipse/jface/snippets/viewers/Snippet006TableMultiLineCells.java?view=markup
+
+import dwtx.jface.resource.JFaceResources;
+import dwtx.jface.viewers.ColumnPixelData;
+import dwtx.jface.viewers.IStructuredContentProvider;
+import dwtx.jface.viewers.OwnerDrawLabelProvider;
+import dwtx.jface.viewers.StructuredSelection;
+import dwtx.jface.viewers.TableLayout;
+import dwtx.jface.viewers.Viewer;
+import dwtx.jface.viewers.TableViewer;
+import dwt.DWT;
+import dwt.graphics.Font;
+import dwt.graphics.Point;
+import dwt.layout.GridData;
+import dwt.layout.GridLayout;
+import dwt.widgets.Composite;
+import dwt.widgets.Display;
+import dwt.widgets.Event;
+import dwt.widgets.Shell;
+import dwt.widgets.TableColumn;
+
+import dwt.dwthelper.utils;
+version(JIVE){
+    import jive.stacktrace;
+}
+
+void main(String[] args) {
+    (new Snippet006TableMultiLineCells()).main(args);
+}
+
+public class Snippet006TableMultiLineCells {
+
+    public static void main(String[] args) {
+
+        Display display = new Display();
+        Shell shell = new Shell(display, DWT.CLOSE|DWT.RESIZE);
+        shell.setSize(400, 400);
+        shell.setLayout(new GridLayout());
+
+        Snippet006TableMultiLineCells example = new Snippet006TableMultiLineCells();
+        example.createPartControl(shell);
+
+        shell.open();
+
+        while (!shell.isDisposed()) {
+            if (!display.readAndDispatch())
+                display.sleep();
+        }
+        display.dispose();
+    }
+
+    class LineEntry {
+
+        String line;
+        int columnWidth;
+
+        /**
+         * Create a new instance of the receiver with name text constrained to a
+         * column of width.
+         *
+         * @param text
+         * @param width
+         */
+        this(String text, int width) {
+            line = text;
+            columnWidth = width;
+        }
+
+        /**
+         * Get the height of the event.
+         *
+         * @param index
+         * @return int
+         */
+        public int getHeight(Event event) {
+            event.gc.setLineWidth(columnWidth);
+            return event.gc.textExtent(line).y;
+        }
+
+        /**
+         * Get the width of the event.
+         *
+         * @param index
+         * @return
+         */
+        public int getWidth(Event event) {
+
+            return columnWidth;
+        }
+
+        /**
+         * Get the font we are using.
+         *
+         * @return Font
+         */
+        protected Font getFont() {
+            return JFaceResources.getFont(JFaceResources.HEADER_FONT);
+        }
+
+        /**
+         * @param event
+         */
+        public void draw(Event event) {
+            event.gc.drawText(line, event.x, event.y);
+
+        }
+    }
+
+    private TableViewer viewer;
+
+    private LineEntry[] entries;
+
+    public this() {
+        String[] lines = [
+            "This day is called the feast of Crispian:",
+            "He that outlives this day, \n and comes safe home,",
+            "Will stand a tip-toe when the day is named,",
+            "And rouse him at the name of Crispian.",
+            "He that shall live this day,\n and see old age,",
+            "Will yearly on the vigil feast his neighbours,",
+            "And say 'To-morrow is Saint Crispian:'",
+            "Then will he strip his sleeve and show his scars.",
+            "And say 'These wounds I had on Crispin's day.'",
+            "Old men forget:\n yet all shall be forgot,",
+            "But he'll remember with advantages",
+            "What feats he did that day:\n then shall our names.",
+            "Familiar in his mouth as household words",
+            "Harry the king, Bedford and Exeter,",
+            "Warwick and Talbot,\n Salisbury and Gloucester,",
+            "Be in their flowing cups freshly remember'd.",
+            "This story shall the good man teach his son;",
+            "And Crispin Crispian shall ne'er go by,",
+            "From this day to the ending of the world,",
+            "But we in it shall be remember'd;",
+            "We few,\n we happy few,\n we band of brothers;",
+            "For he to-day that sheds his blood with me",
+            "Shall be my brother;\n be he ne'er so vile,",
+            "This day shall gentle his condition:",
+            "And gentlemen in England now a-bed",
+            "Shall think themselves accursed they were not here,",
+            "And hold their manhoods cheap whiles any speaks",
+            "That fought with us upon Saint Crispin's day." ];
+
+        entries = new LineEntry[lines.length];
+        for (int i = 0; i < lines.length; i++) {
+            entries[i] = new LineEntry(lines[i], 35);
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(dwt.widgets.Composite)
+     */
+    public void createPartControl(Composite parent) {
+        viewer = new TableViewer(parent, DWT.FULL_SELECTION);
+
+        viewer.setContentProvider(new class() IStructuredContentProvider {
+            /*
+             * (non-Javadoc)
+             *
+             * @see dwtx.jface.viewers.IContentProvider#dispose()
+             */
+            public void dispose() {
+            }
+
+            /*
+             * (non-Javadoc)
+             *
+             * @see dwtx.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
+             */
+            public Object[] getElements(Object inputElement) {
+                return entries;
+            }
+
+            /*
+             * (non-Javadoc)
+             *
+             * @see dwtx.jface.viewers.IContentProvider#inputChanged(dwtx.jface.viewers.Viewer,
+             *      java.lang.Object, java.lang.Object)
+             */
+            public void inputChanged(dwtx.jface.viewers.Viewer.Viewer viewer, Object oldInput, Object newInput) {
+            }
+        });
+        createColumns();
+
+        viewer.setLabelProvider(new class OwnerDrawLabelProvider {
+            /* (non-Javadoc)
+             * @see dwtx.jface.viewers.OwnerDrawLabelProvider#measure(dwt.widgets.Event, java.lang.Object)
+             */
+            protected void measure(Event event, Object element) {
+                LineEntry line = cast(LineEntry) element;
+                Point size = event.gc.textExtent(line.line);
+                event.width = viewer.getTable().getColumn(event.index).getWidth();
+                int lines = (event.width > 0 ? (size.x / event.width + 1) : 1);
+                event.height = size.y * lines;
+            }
+
+            /*
+             * (non-Javadoc)
+             *
+             * @see dwtx.jface.viewers.OwnerDrawLabelProvider#paint(dwt.widgets.Event,
+             *      java.lang.Object)
+             */
+            protected void paint(Event event, Object element) {
+
+                LineEntry entry = cast(LineEntry) element;
+                event.gc.drawText(entry.line, event.x, event.y, true);
+            }
+        });
+        viewer.setInput(this);
+
+        GridData data = new GridData(GridData.GRAB_HORIZONTAL
+                | GridData.GRAB_VERTICAL | GridData.FILL_BOTH);
+
+        viewer.getControl().setLayoutData(data);
+        OwnerDrawLabelProvider.setUpOwnerDraw(viewer);
+
+        viewer.setSelection(new StructuredSelection(entries[1]));
+    }
+
+    /**
+     * Create the columns to be used in the tree.
+     */
+    private void createColumns() {
+        TableLayout layout = new TableLayout();
+        viewer.getTable().setLayout(layout);
+        viewer.getTable().setHeaderVisible(true);
+        viewer.getTable().setLinesVisible(true);
+
+        TableColumn tc = new TableColumn(viewer.getTable(), DWT.NONE, 0);
+        layout.addColumnData(new ColumnPixelData(350));
+        tc.setText("Lines");
+
+    }
+
+    public void setFocus() {
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jface/snippets/viewers/Snippet007FullSelection.d	Fri Aug 08 14:40:21 2008 +0200
@@ -0,0 +1,163 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Tom Schindl 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:
+ *     Tom Schindl - initial API and implementation
+ *******************************************************************************/
+
+module snippets.viewers.Snippet007FullSelection;
+
+import dwtx.jface.viewers.CellEditor;
+import dwtx.jface.viewers.ICellModifier;
+import dwtx.jface.viewers.IStructuredContentProvider;
+import dwtx.jface.viewers.LabelProvider;
+import dwtx.jface.viewers.TableViewer;
+import dwtx.jface.viewers.TextCellEditor;
+import dwtx.jface.viewers.Viewer;
+import dwt.DWT;
+import dwt.graphics.Color;
+import dwt.graphics.GC;
+import dwt.graphics.Point;
+import dwt.graphics.Rectangle;
+import dwt.layout.FillLayout;
+import dwt.widgets.Display;
+import dwt.widgets.Event;
+import dwt.widgets.Listener;
+import dwt.widgets.Shell;
+import dwt.widgets.TableColumn;
+import dwt.widgets.TableItem;
+
+import dwt.dwthelper.utils;
+
+import tango.util.Convert;
+import dwtx.dwtxhelper.Collection;
+
+/**
+ * TableViewer: Hide full selection
+ *
+ * @author Tom Schindl <tom.schindl@bestsolution.at>
+ *
+ */
+public class Snippet007FullSelection {
+
+	private class MyContentProvider : IStructuredContentProvider {
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
+		 */
+		public Object[] getElements(Object inputElement) {
+			return (cast(ArrayList)inputElement).toArray;
+		}
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
+		 */
+		public void dispose() {
+
+		}
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
+		 */
+		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+
+		}
+
+	}
+
+	public class MyModel {
+		public int counter;
+
+		public this(int counter) {
+			this.counter = counter;
+		}
+
+		public String toString() {
+			return "Item " ~ to!(char[])(this.counter);
+		}
+	}
+
+	public this(Shell shell) {
+		final TableViewer v = new TableViewer(shell,DWT.BORDER|DWT.FULL_SELECTION);
+		v.setLabelProvider(new LabelProvider());
+		v.setContentProvider(new MyContentProvider());
+		v.setCellModifier(new class(v) ICellModifier {
+            TableViewer v;
+            this(TableViewer v_) { this.v=v_; }
+
+			public bool canModify(Object element, String property) {
+				return true;
+			}
+
+			public Object getValue(Object element, String property) {
+				return new ArrayWrapperString( to!(char[])((cast(MyModel)element).counter) );
+			}
+
+			public void modify(Object element, String property, Object value) {
+				auto item = cast(TableItem)element;
+                auto valuestr = cast(ArrayWrapperString)value;
+				(cast(MyModel)item.getData()).counter = to!(int)(valuestr.array);
+				v.update(item.getData(), null);
+			}
+
+		});
+		v.setColumnProperties(["column1", "column2" ]);
+		v.setCellEditors([ new TextCellEditor(v.getTable()),new TextCellEditor(v.getTable()) ]);
+
+		TableColumn column = new TableColumn(v.getTable(),DWT.NONE);
+		column.setWidth(100);
+		column.setText("Column 1");
+
+		column = new TableColumn(v.getTable(),DWT.NONE);
+		column.setWidth(100);
+		column.setText("Column 2");
+
+		ArrayList model = createModel();
+		v.setInput(model);
+		v.getTable().setLinesVisible(true);
+		v.getTable().setHeaderVisible(true);
+
+		v.getTable().addListener(DWT.EraseItem, new class Listener {
+
+			/* (non-Javadoc)
+			 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
+			 */
+			public void handleEvent(Event event) {
+				event.detail &= ~DWT.SELECTED;
+			}
+		});
+
+	}
+
+	private ArrayList createModel() {
+		auto elements = new ArrayList(10);
+
+		for( int i = 0; i < 10; i++ ) {
+			elements.add( new MyModel(i));
+		}
+
+		return elements;
+	}
+
+}
+
+
+void main() {
+    Display display = new Display ();
+    Shell shell = new Shell(display);
+    shell.setLayout(new FillLayout());
+    new Snippet007FullSelection(shell);
+    shell.open ();
+
+    while (!shell.isDisposed ()) {
+        if (!display.readAndDispatch ()) display.sleep ();
+    }
+
+    display.dispose ();
+
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jface/snippets/viewers/Snippet010OwnerDraw.d	Fri Aug 08 14:40:21 2008 +0200
@@ -0,0 +1,434 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 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
+ *     oliver.schaefer@mbtech-services.com - Fix for Bug 225051 [Snippets] Snippet010OwnerDraw - Wrong german flag
+ * Port to the D programming language:
+ *     yidabu at gmail dot com  ( D China http://www.d-programming-language-china.org/ )
+ *******************************************************************************/
+module snippets.viewers.Snippet010OwnerDraw.d;
+
+import dwtx.jface.resource.JFaceResources;
+import dwtx.jface.viewers.Viewer;
+import dwtx.jface.viewers.ColumnPixelData;
+import dwtx.jface.viewers.IStructuredContentProvider;
+import dwtx.jface.viewers.OwnerDrawLabelProvider;
+import dwtx.jface.viewers.StructuredSelection;
+import dwtx.jface.viewers.TableLayout;
+import dwtx.jface.viewers.TableViewer;
+import dwt.DWT;
+import dwt.graphics.Rectangle;
+import dwt.graphics.TextLayout;
+import dwt.graphics.TextStyle;
+import dwt.layout.GridData;
+import dwt.layout.GridLayout;
+import dwt.widgets.Composite;
+import dwt.widgets.Display;
+import dwt.widgets.Event;
+import dwt.widgets.Shell;
+import dwt.widgets.TableColumn;
+
+import dwt.dwthelper.utils;
+
+void main(String[] args) {
+    Snippet010OwnerDraw.main(args);
+}
+
+public class Snippet010OwnerDraw {
+
+    public static void main(String[] args) {
+
+        Display display = new Display();
+        Shell shell = new Shell(display, DWT.CLOSE);
+        shell.setSize(400, 400);
+        shell.setLayout(new GridLayout());
+
+        Snippet010OwnerDraw example = new Snippet010OwnerDraw();
+        example.createPartControl(shell);
+
+        shell.open();
+
+        while (!shell.isDisposed ()) {
+            if (!display.readAndDispatch ()) display.sleep ();
+        }
+        display.dispose();
+    }
+
+    private static int COLUMN_COUNT = 3;
+
+    class CountryEntry {
+
+        String name;
+
+        String cupYear;
+
+        private String baseName;
+
+        /**
+         * Create a new instance of the receiver.
+         *
+         * @param countryName
+         * @param worldCupYear
+         */
+        this(String countryName, String englishName, String worldCupYear) {
+            name = countryName;
+            cupYear = worldCupYear;
+            baseName = englishName;
+        }
+
+        /**
+         * @param index
+         * @return
+         */
+        public int getHeight(Event event) {
+            switch (event.index) {
+            case 0:
+                return event.gc.textExtent(name).y;
+            case 1:
+                return 50;
+            case 2:
+                return event.gc.textExtent(cupYear).y;
+            default:
+                return 10;
+            }
+        }
+
+        /**
+         * @param index
+         * @return
+         */
+        public int getWidth(Event event) {
+
+            switch (event.index) {
+            case 0:
+                return event.gc.textExtent(getDisplayString().toString()).x + 4;
+
+            case 1:
+                return 200;
+
+            case 2:
+                return event.gc.textExtent(cupYear).x + 5;
+
+            default:
+                return 10;
+            }
+        }
+
+        /**
+         * Draw the flag in bounds.
+         *
+         * @param event
+         */
+        protected void drawFlag(Event event) {
+            event.gc.setBackground(viewer.getControl().getDisplay()
+                    .getSystemColor(DWT.COLOR_BLUE));
+
+            Rectangle bounds = event.getBounds();
+            bounds.width += 100;
+            event.gc.fillRectangle(bounds);
+        }
+
+        /**
+         * Draw the cup year
+         *
+         * @param event
+         */
+        private void drawCupYear(Event event) {
+            event.gc.drawText(cupYear, event.x, event.y);
+
+        }
+
+        /**
+         * Draw the name of the receiver.
+         *
+         * @param event
+         */
+        protected void drawName(Event event) {
+
+            StringBuffer buffer = getDisplayString();
+
+            Display display = viewer.getControl().getDisplay();
+            TextLayout layout = new TextLayout(display);
+            layout.setText(buffer.toString());
+
+            TextStyle plain = new TextStyle(JFaceResources
+                    .getFont(JFaceResources.DEFAULT_FONT), display
+                    .getSystemColor(DWT.COLOR_LIST_FOREGROUND), display
+                    .getSystemColor(DWT.COLOR_LIST_BACKGROUND));
+
+            TextStyle italic = new TextStyle(JFaceResources.getFontRegistry()
+                    .getItalic(JFaceResources.DEFAULT_FONT), display
+                    .getSystemColor(DWT.COLOR_BLUE), display
+                    .getSystemColor(DWT.COLOR_LIST_BACKGROUND));
+
+            layout.setStyle(plain, 0, name.length - 1);
+            layout.setStyle(italic, name.length, buffer.length - 1);
+
+            layout.draw(event.gc, event.x, event.y);
+
+        }
+
+        /**
+         * @return
+         */
+        private StringBuffer getDisplayString() {
+            StringBuffer buffer = new StringBuffer();
+            buffer.append(name);
+            buffer.append(" (");
+            buffer.append(baseName);
+            buffer.append(")");
+            return buffer;
+        }
+
+        /**
+         * @param event
+         */
+        public void draw(Event event) {
+
+            switch (event.index) {
+            case 0:
+                drawName(event);
+                break;
+            case 1:
+                drawFlag(event);
+                break;
+            case 2:
+                drawCupYear(event);
+                break;
+
+            default:
+                break;
+            }
+
+        }
+    }
+
+    private class GermanyEntry : CountryEntry {
+
+        this() {
+            super("Deutschland", "Germany", "1954 1974 1990");
+        }
+
+        /*
+         * (non-Javadoc)
+         *
+         * @see dwtx.jface.tests.viewers.OwnerDrawExample.CountryEntry#drawFlag(dwt.widgets.Event)
+         */
+        protected void drawFlag(Event event) {
+
+            Rectangle bounds = event.getBounds();
+            bounds.width += 100;
+            int stripeHeight = bounds.height / 3;
+            Rectangle stripe = new Rectangle(bounds.x, bounds.y, bounds.width,
+                    stripeHeight);
+
+            event.gc.setBackground(viewer.getControl().getDisplay()
+                    .getSystemColor(DWT.COLOR_BLACK));
+            event.gc.fillRectangle(stripe);
+
+            stripe.y += stripeHeight;
+
+            event.gc.setBackground(viewer.getControl().getDisplay()
+                    .getSystemColor(DWT.COLOR_RED));
+            event.gc.fillRectangle(stripe);
+
+            stripe.y += stripeHeight;
+
+            event.gc.setBackground(viewer.getControl().getDisplay()
+                    .getSystemColor(DWT.COLOR_YELLOW));
+            event.gc.fillRectangle(stripe);
+
+        }
+
+    }
+
+    private class AustriaEntry : CountryEntry {
+
+        this() {
+            super("\u00D6sterreich", "Austria", "TBD");
+        }
+
+        /*
+         * (non-Javadoc)
+         *
+         * @see dwtx.jface.tests.viewers.OwnerDrawExample.CountryEntry#drawFlag(dwt.widgets.Event)
+         */
+        protected void drawFlag(Event event) {
+
+            Rectangle bounds = event.getBounds();
+            bounds.width += 100;
+            int stripeHeight = bounds.height / 3;
+            Rectangle stripe = new Rectangle(bounds.x, bounds.y, bounds.width,
+                    stripeHeight);
+
+            event.gc.setBackground(viewer.getControl().getDisplay()
+                    .getSystemColor(DWT.COLOR_RED));
+            event.gc.fillRectangle(stripe);
+
+            stripe.y += stripeHeight;
+
+            event.gc.setBackground(viewer.getControl().getDisplay()
+                    .getSystemColor(DWT.COLOR_WHITE));
+            event.gc.fillRectangle(stripe);
+
+            stripe.y += stripeHeight;
+
+            event.gc.setBackground(viewer.getControl().getDisplay()
+                    .getSystemColor(DWT.COLOR_RED));
+            event.gc.fillRectangle(stripe);
+
+        }
+    }
+
+    private class EnglandEntry : CountryEntry {
+        this() {
+            super("Blighty", "England", "1966");
+        }
+
+        /*
+         * (non-Javadoc)
+         *
+         * @see dwtx.jface.tests.viewers.OwnerDrawExample.CountryEntry#drawFlag(dwt.widgets.Event)
+         */
+        protected void drawFlag(Event event) {
+
+            Rectangle bounds = event.getBounds();
+            bounds.width += 100;
+
+            event.gc.setBackground(viewer.getControl().getDisplay()
+                    .getSystemColor(DWT.COLOR_RED));
+            event.gc.fillRectangle(new Rectangle(bounds.width / 2 + bounds.x
+                    - 5, bounds.y, 10, bounds.height));
+            event.gc.fillRectangle(new Rectangle(bounds.x, bounds.height / 2
+                    + bounds.y - 5, bounds.width, 10));
+
+        }
+    }
+
+    private TableViewer viewer;
+
+    private CountryEntry[] entries;
+
+    public this() {
+        entries = new CountryEntry[3];
+        entries[0] = new AustriaEntry();
+        entries[1] = new GermanyEntry();
+        entries[2] = new EnglandEntry();
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(dwt.widgets.Composite)
+     */
+    public void createPartControl(Composite parent) {
+        viewer = new TableViewer(parent, DWT.FULL_SELECTION);
+
+        viewer.setContentProvider(new class() IStructuredContentProvider {
+            /*
+             * (non-Javadoc)
+             *
+             * @see dwtx.jface.viewers.IContentProvider#dispose()
+             */
+            public void dispose() {
+            };
+
+            /*
+             * (non-Javadoc)
+             *
+             * @see dwtx.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
+             */
+            public Object[] getElements(Object inputElement) {
+                return (cast(Snippet010OwnerDraw) inputElement).entries;
+            };
+
+            /*
+             * (non-Javadoc)
+             *
+             * @see dwtx.jface.viewers.IContentProvider#inputChanged(dwtx.jface.viewers.Viewer,
+             *      java.lang.Object, java.lang.Object)
+             */
+            public void inputChanged(Viewer viewer,
+                    Object oldInput, Object newInput) {
+            }
+
+        });
+        createColumns();
+
+        viewer.setLabelProvider(new class() OwnerDrawLabelProvider {
+
+
+            protected void measure(Event event, Object element) {
+                CountryEntry country = cast(CountryEntry) element;
+
+                event.setBounds(new Rectangle(event.x, event.y, country.getWidth(event),
+                        country.getHeight(event)));
+
+            }
+
+            /*
+             * (non-Javadoc)
+             *
+             * @see dwtx.jface.viewers.OwnerDrawLabelProvider#paint(dwt.widgets.Event,
+             *      java.lang.Object)
+             */
+            protected void paint(Event event, Object element) {
+                CountryEntry entry = cast(CountryEntry) element;
+                entry.draw(event);
+
+            }
+        });
+
+        OwnerDrawLabelProvider.setUpOwnerDraw(viewer);
+        viewer.setInput(this);
+        GridData data = new GridData(GridData.GRAB_HORIZONTAL
+                | GridData.GRAB_VERTICAL | GridData.FILL_BOTH);
+
+        viewer.getControl().setLayoutData(data);
+
+        viewer.setSelection(new StructuredSelection(entries[1]));
+    }
+
+    /**
+     * Create the columns to be used in the tree.
+     */
+    private void createColumns() {
+        TableLayout layout = new TableLayout();
+        viewer.getTable().setLayout(layout);
+        viewer.getTable().setHeaderVisible(true);
+        viewer.getTable().setLinesVisible(true);
+
+        for (int i = 0; i < COLUMN_COUNT; i++) {
+            TableColumn tc = new TableColumn(viewer.getTable(), DWT.NONE, i);
+            layout.addColumnData(new ColumnPixelData(100));
+            tc.setText(getTitleFor(i));
+        }
+        ;
+    }
+
+    /**
+     * @param i
+     * @return
+     */
+    private String getTitleFor(int i) {
+        switch (i) {
+        case 0:
+            return "Name";
+        case 1:
+            return "Flag";
+        case 2:
+            return "World Cup Year";
+        }
+        return "Unknown";
+    }
+
+    public void setFocus() {
+
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jface/snippets/viewers/Snippet014TreeViewerNoMandatoryLabelProvider.d	Fri Aug 08 14:40:21 2008 +0200
@@ -0,0 +1,228 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Tom Schindl 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:
+ *     Tom Schindl - initial API and implementation
+ * Port to the D programming language:
+ *     yidabu at gmail dot com  ( D China http://www.d-programming-language-china.org/ )
+ *******************************************************************************/
+
+module snippets.viewers.Snippet014TreeViewerNoMandatoryLabelProvider;
+
+
+import dwtx.jface.resource.FontRegistry;
+import dwtx.jface.viewers.ITableColorProvider;
+import dwtx.jface.viewers.ITableFontProvider;
+import dwtx.jface.viewers.ITableLabelProvider;
+import dwtx.jface.viewers.ITreeContentProvider;
+import dwtx.jface.viewers.LabelProvider;
+import dwtx.jface.viewers.TreeViewer;
+import dwtx.jface.viewers.Viewer;
+import dwt.DWT;
+import dwt.graphics.Color;
+import dwt.graphics.Font;
+import dwt.graphics.Image;
+import dwt.layout.FillLayout;
+import dwt.widgets.Display;
+import dwt.widgets.Shell;
+import dwt.widgets.TreeColumn;
+
+import dwt.dwthelper.utils;
+
+import tango.util.Convert;
+import tango.util.container.LinkedList;
+
+version(JIVE) import jive.stacktrace;
+
+
+void main(String[] args) {
+    Display display = new Display();
+    Shell shell = new Shell(display);
+    shell.setLayout(new FillLayout());
+    new Snippet014TreeViewerNoMandatoryLabelProvider(shell);
+    shell.open();
+
+    while (!shell.isDisposed()) {
+        if (!display.readAndDispatch())
+            display.sleep();
+    }
+
+    display.dispose();
+}
+
+/**
+ * A simple TreeViewer to demonstrate usage
+ *
+ * @author Tom Schindl <tom.schindl@bestsolution.at>
+ *
+ */
+public class Snippet014TreeViewerNoMandatoryLabelProvider {
+    alias  LinkedList!(MyModel) ArrayList;
+
+    private class MyContentProvider : ITreeContentProvider {
+
+        /*
+         * (non-Javadoc)
+         *
+         * @see dwtx.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
+         */
+        public Object[] getElements(Object inputElement) {
+            return (cast(MyModel) inputElement).child.toArray();
+        }
+
+        /*
+         * (non-Javadoc)
+         *
+         * @see dwtx.jface.viewers.IContentProvider#dispose()
+         */
+        public void dispose() {
+
+        }
+
+        /*
+         * (non-Javadoc)
+         *
+         * @see dwtx.jface.viewers.IContentProvider#inputChanged(dwtx.jface.viewers.Viewer,
+         *      java.lang.Object, java.lang.Object)
+         */
+        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+
+        }
+
+        /*
+         * (non-Javadoc)
+         *
+         * @see dwtx.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
+         */
+        public Object[] getChildren(Object parentElement) {
+            return getElements(parentElement);
+        }
+
+        /*
+         * (non-Javadoc)
+         *
+         * @see dwtx.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
+         */
+        public Object getParent(Object element) {
+            if (element is null) {
+                return null;
+            }
+
+            return (cast(MyModel) element).parent;
+        }
+
+        /*
+         * (non-Javadoc)
+         *
+         * @see dwtx.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
+         */
+        public bool hasChildren(Object element) {
+            return (cast(MyModel) element).child.size() > 0;
+        }
+
+    }
+
+    public class MyModel {
+        public MyModel parent;
+
+        public ArrayList child;
+
+        public int counter;
+
+        public this(int counter, MyModel parent) {
+            this.parent = parent;
+            this.counter = counter;
+            child = new ArrayList();
+        }
+
+        public String toString() {
+            String rv = "Item ";
+            if (parent !is null) {
+                rv = parent.toString() ~ ".";
+            }
+
+            rv ~= to!(String)(counter);
+
+            return rv;
+        }
+    }
+
+    public class MyLabelProvider : LabelProvider,
+            ITableLabelProvider, ITableFontProvider, ITableColorProvider {
+        FontRegistry registry;
+        this()
+        {
+            registry = new FontRegistry();
+        }
+
+        public Image getColumnImage(Object element, int columnIndex) {
+            return null;
+        }
+
+        public String getColumnText(Object element, int columnIndex) {
+            return "Column " ~ to!(String)(columnIndex) ~ " => " ~ element.toString();
+        }
+
+        public Font getFont(Object element, int columnIndex) {
+            if ((cast(MyModel) element).counter % 2 == 0) {
+                return registry.getBold(Display.getCurrent().getSystemFont()
+                        .getFontData()[0].getName());
+            }
+            return null;
+        }
+
+        public Color getBackground(Object element, int columnIndex) {
+            if ((cast(MyModel) element).counter % 2 == 0) {
+                return Display.getCurrent().getSystemColor(DWT.COLOR_RED);
+            }
+            return null;
+        }
+
+        public Color getForeground(Object element, int columnIndex) {
+            if ((cast(MyModel) element).counter % 2 == 1) {
+                return Display.getCurrent().getSystemColor(DWT.COLOR_RED);
+            }
+            return null;
+        }
+
+    }
+
+    public this(Shell shell) {
+        final TreeViewer v = new TreeViewer(shell);
+
+        TreeColumn column = new TreeColumn(v.getTree(),DWT.NONE);
+        column.setWidth(200);
+        column.setText("Column 1");
+
+        column = new TreeColumn(v.getTree(),DWT.NONE);
+        column.setWidth(200);
+        column.setText("Column 2");
+
+        v.setLabelProvider(new MyLabelProvider());
+        v.setContentProvider(new MyContentProvider());
+        v.setInput(createModel());
+    }
+
+    private MyModel createModel() {
+
+        MyModel root = new MyModel(0, null);
+        root.counter = 0;
+
+        MyModel tmp;
+        for (int i = 1; i < 10; i++) {
+            tmp = new MyModel(i, root);
+            root.child.add(tmp);
+            for (int j = 1; j < i; j++) {
+                tmp.child.add(new MyModel(j, tmp));
+            }
+        }
+
+        return root;
+    }
+
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jface/snippets/viewers/Snippet016TableLayout.d	Fri Aug 08 14:40:21 2008 +0200
@@ -0,0 +1,156 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Tom Schindl 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:
+ *     Tom Schindl - initial API and implementation
+ * Port to the D programming language:
+ *     yidabu at gmail dot com  ( D China http://www.d-programming-language-china.org/ )
+ *******************************************************************************/
+
+module snippets.viewers.Snippet016TableLayout;
+
+
+import dwtx.jface.layout.TableColumnLayout;
+import dwtx.jface.viewers.ColumnWeightData;
+import dwtx.jface.viewers.IStructuredContentProvider;
+import dwtx.jface.viewers.ITableLabelProvider;
+import dwtx.jface.viewers.LabelProvider;
+import dwtx.jface.viewers.TableViewer;
+import dwtx.jface.viewers.Viewer;
+import dwt.DWT;
+import dwt.graphics.Image;
+import dwt.layout.FillLayout;
+import dwt.widgets.Composite;
+import dwt.widgets.Display;
+import dwt.widgets.Shell;
+import dwt.widgets.Table;
+import dwt.widgets.TableColumn;
+
+import dwt.dwthelper.utils;
+
+import tango.util.Convert;
+/**
+ * @param args
+ */
+void main(String[] args) {
+    Display display = new Display();
+    Shell shell = new Shell(display);
+    //shell.setSize(400, 150);
+    shell.setLayout(new FillLayout());
+
+    new Snippet016TableLayout(shell);
+    shell.open();
+
+    while (!shell.isDisposed()) {
+        if (!display.readAndDispatch())
+            display.sleep();
+    }
+
+    display.dispose();
+
+}
+
+/**
+ * A simple TableViewer to demonstrate usage
+ *
+ * @author Tom Schindl <tom.schindl@bestsolution.at>
+ * @since 3.3M3
+ */
+public class Snippet016TableLayout {
+    private class MyContentProvider : IStructuredContentProvider {
+
+        /*
+         * (non-Javadoc)
+         *
+         * @see dwtx.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
+         */
+        public Object[] getElements(Object inputElement) {
+            return (cast(ArrayWrapperObject) inputElement).array;
+        }
+
+        /*
+         * (non-Javadoc)
+         *
+         * @see dwtx.jface.viewers.IContentProvider#dispose()
+         */
+        public void dispose() {
+
+        }
+
+        /*
+         * (non-Javadoc)
+         *
+         * @see dwtx.jface.viewers.IContentProvider#inputChanged(dwtx.jface.viewers.Viewer,
+         *      java.lang.Object, java.lang.Object)
+         */
+        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+
+        }
+
+    }
+
+    private class MyLabelProvider : LabelProvider, ITableLabelProvider {
+
+        public Image getColumnImage(Object element, int columnIndex) {
+            return null;
+        }
+
+        public String getColumnText(Object element, int columnIndex) {
+            return to!(char[])(columnIndex) ~ " - " ~ element.toString();
+        }
+
+    }
+
+    public class MyModel {
+        public int counter;
+
+        public this(int counter) {
+            this.counter = counter;
+        }
+
+        public String toString() {
+            return "Item " ~ to!(char[])(this.counter);
+        }
+    }
+
+    public this(Composite comp) {
+        final TableViewer v = new TableViewer(new Table(comp, DWT.BORDER));
+        v.setLabelProvider(new MyLabelProvider());
+        v.setContentProvider(new MyContentProvider());
+        v.getTable().setHeaderVisible(true);
+
+        TableColumnLayout ad = new TableColumnLayout();
+        comp.setLayout(ad);
+
+        TableColumn column = new TableColumn(v.getTable(), DWT.NONE);
+        column.setText("Column 1");
+        column.setMoveable(true);
+        ad.setColumnData(column, new ColumnWeightData(90, 290));
+
+        column = new TableColumn(v.getTable(), DWT.NONE);
+        column.setText("Column 2");
+        column.setMoveable(true);
+        ad.setColumnData(column, new ColumnWeightData(10, 200));
+
+        MyModel[] model = createModel();
+        v.setInput(new ArrayWrapperObject(model));
+        v.getTable().setLinesVisible(true);
+    }
+
+    private MyModel[] createModel() {
+        MyModel[] elements = new MyModel[10];
+
+        for (int i = 0; i < 10; i++) {
+            elements[i] = new MyModel(i);
+        }
+
+        return elements;
+    }
+
+
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jface/snippets/viewers/Snippet026TreeViewerTabEditing.d	Fri Aug 08 14:40:21 2008 +0200
@@ -0,0 +1,295 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Tom Schindl 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:
+ *     Tom Schindl - initial API and implementation
+ * Port to the D programming language:
+ *     yidabu at gmail dot com  ( D China http://www.d-programming-language-china.org/ )
+ *******************************************************************************/
+
+module snippets.viewers.Snippet026TreeViewerTabEditing;
+
+
+import dwtx.jface.viewers.CellEditor;
+import dwtx.jface.viewers.ColumnLabelProvider;
+import dwtx.jface.viewers.ColumnViewerEditor;
+import dwtx.jface.viewers.ColumnViewer;
+import dwtx.jface.viewers.ColumnViewerEditorActivationStrategy;
+import dwtx.jface.viewers.EditingSupport;
+import dwtx.jface.viewers.ColumnViewerEditorActivationEvent;
+import dwtx.jface.viewers.FocusCellOwnerDrawHighlighter;
+import dwtx.jface.viewers.ITreeContentProvider;
+import dwtx.jface.viewers.TextCellEditor;
+import dwtx.jface.viewers.TreePath;
+import dwtx.jface.viewers.TreeViewerFocusCellManager;
+import dwtx.jface.viewers.TreeViewerEditor;
+import dwtx.jface.viewers.TreeViewer;
+import dwtx.jface.viewers.TreeViewerColumn;
+import dwtx.jface.viewers.Viewer;
+import dwt.DWT;
+import dwt.events.SelectionEvent;
+import dwt.events.SelectionListener;
+import dwt.layout.FillLayout;
+import dwt.widgets.Button;
+import dwt.widgets.Display;
+import dwt.widgets.Shell;
+
+import dwt.dwthelper.utils;
+import dwtx.dwtxhelper.Collection;
+
+import tango.util.Convert;
+
+version(JIVE) import jive.stacktrace;
+
+
+void main(String[] args) {
+    Display display = new Display();
+    Shell shell = new Shell(display);
+    shell.setLayout(new FillLayout());
+    new Snippet026TreeViewerTabEditing(shell);
+    shell.open();
+
+    while (!shell.isDisposed()) {
+        if (!display.readAndDispatch())
+            display.sleep();
+    }
+
+    display.dispose();
+}
+
+/**
+ * A simple TreeViewer to demonstrate usage
+ *
+ * @author Tom Schindl <tom.schindl@bestsolution.at>
+ *
+ */
+public class Snippet026TreeViewerTabEditing {
+    public this(Shell shell) {
+        Button b = new Button(shell,DWT.PUSH);
+        b.setText("Remove column");
+        final TreeViewer v = new TreeViewer(shell, DWT.BORDER
+                | DWT.FULL_SELECTION);
+        v.getTree().setLinesVisible(true);
+        v.getTree().setHeaderVisible(true);
+        b.addSelectionListener(new class(v) SelectionListener {
+            TreeViewer v;
+            this(TreeViewer v_)
+            {
+                this.v = v_;
+            }
+            public void widgetDefaultSelected(SelectionEvent e) {
+
+            }
+
+            public void widgetSelected(SelectionEvent e) {
+                v.getTree().getColumn(1).dispose();
+            }
+
+        });
+
+        TreeViewerFocusCellManager focusCellManager = new TreeViewerFocusCellManager(v,new FocusCellOwnerDrawHighlighter(v));
+        ColumnViewerEditorActivationStrategy actSupport = new class(v) ColumnViewerEditorActivationStrategy {
+            this(ColumnViewer v_)
+            {
+                super(v_);
+            }
+            protected bool isEditorActivationEvent(
+                    ColumnViewerEditorActivationEvent event) {
+                return event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL
+                        || event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION
+                        || (event.eventType == ColumnViewerEditorActivationEvent.KEY_PRESSED && event.keyCode == DWT.CR)
+                        || event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC;
+            }
+        };
+
+        TreeViewerEditor.create(v, focusCellManager, actSupport, ColumnViewerEditor.TABBING_HORIZONTAL
+                | ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR
+                | ColumnViewerEditor.TABBING_VERTICAL | ColumnViewerEditor.KEYBOARD_ACTIVATION);
+
+        final TextCellEditor textCellEditor = new TextCellEditor(v.getTree());
+
+        TreeViewerColumn column = new TreeViewerColumn(v, DWT.NONE);
+        column.getColumn().setWidth(200);
+        column.getColumn().setMoveable(true);
+        column.getColumn().setText("Column 1");
+        column.setLabelProvider(new class() ColumnLabelProvider {
+
+            public String getText(Object element) {
+                return "Column 1 => " ~ element.toString();
+            }
+
+        });
+        column.setEditingSupport(new class(v) EditingSupport {
+            this(ColumnViewer v_)
+            {
+                super(v_);
+            }
+            protected bool canEdit(Object element) {
+                return false;
+            }
+
+            protected CellEditor getCellEditor(Object element) {
+                return textCellEditor;
+            }
+
+            protected Object getValue(Object element) {
+                return stringcast( (to!(String)((cast(MyModel) element).counter)) );
+            }
+
+            protected void setValue(Object element, Object value) {
+                (cast(MyModel) element).counter = Integer.parseInt(value.toString());
+                v.update(element, null);
+            }
+        });
+
+        column = new TreeViewerColumn(v, DWT.NONE);
+        column.getColumn().setWidth(200);
+        column.getColumn().setMoveable(true);
+        column.getColumn().setText("Column 2");
+        column.setLabelProvider(new class() ColumnLabelProvider {
+
+            public String getText(Object element) {
+                return "Column 2 => " ~ element.toString();
+            }
+
+        });
+        column.setEditingSupport(new class(v) EditingSupport {
+            this(ColumnViewer v_)
+            {
+                super(v_);
+            }
+            protected bool canEdit(Object element) {
+                return true;
+            }
+
+            protected CellEditor getCellEditor(Object element) {
+                return textCellEditor;
+            }
+
+            protected Object getValue(Object element) {
+                return stringcast( to!(String)((cast(MyModel) element).counter) );
+            }
+
+            protected void setValue(Object element, Object value) {
+                (cast(MyModel) element).counter = Integer.parseInt(value.toString());
+                v.update(element, null);
+            }
+        });
+
+        column = new TreeViewerColumn(v, DWT.NONE);
+        column.getColumn().setWidth(200);
+        column.getColumn().setMoveable(true);
+        column.getColumn().setText("Column 3");
+        column.setLabelProvider(new class() ColumnLabelProvider {
+            public String getText(Object element) {
+                return "Column 3 => " ~ element.toString();
+            }
+
+        });
+        column.setEditingSupport(new class(v) EditingSupport {
+            this(ColumnViewer v_)
+            {
+                super(v_);
+            }
+            protected bool canEdit(Object element) {
+                return true;
+            }
+
+            protected CellEditor getCellEditor(Object element) {
+                return textCellEditor;
+            }
+
+            protected Object getValue(Object element) {
+                return stringcast( to!(String)((cast(MyModel) element).counter) );
+            }
+
+            protected void setValue(Object element, Object value) {
+                (cast(MyModel) element).counter = Integer.parseInt(value.toString());
+                v.update(element, null);
+            }
+        });
+
+        v.setContentProvider(new MyContentProvider());
+
+        v.setInput(createModel());
+    }
+
+    private MyModel createModel() {
+
+        MyModel root = new MyModel(0, null);
+        root.counter = 0;
+
+        MyModel tmp;
+        MyModel subItem;
+        for (int i = 1; i < 10; i++) {
+            tmp = new MyModel(i, root);
+            root.child.add(tmp);
+            for (int j = 1; j < i; j++) {
+                subItem = new MyModel(j, tmp);
+                subItem.child.add(new MyModel(j * 100, subItem));
+                tmp.child.add(subItem);
+            }
+        }
+
+        return root;
+    }
+
+    private class MyContentProvider : ITreeContentProvider {
+
+        public Object[] getElements(Object inputElement) {
+            return (cast(MyModel) inputElement).child.toArray();
+        }
+
+        public void dispose() {
+        }
+
+        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+        }
+
+        public Object[] getChildren(Object parentElement) {
+            return getElements(parentElement);
+        }
+
+        public Object getParent(Object element) {
+            if (element is null) {
+                return null;
+            }
+            return (cast(MyModel) element).parent;
+        }
+
+        public bool hasChildren(Object element) {
+            return (cast(MyModel) element).child.size() > 0;
+        }
+
+    }
+
+    public class MyModel {
+        public MyModel parent;
+
+        public ArrayList child;
+
+        public int counter;
+
+        public this(int counter, MyModel parent) {
+            this.parent = parent;
+            this.counter = counter;
+            child = new ArrayList();
+        }
+
+        public String toString() {
+            String rv = "Item ";
+            if (parent !is null) {
+                rv = parent.toString() ~ ".";
+            }
+
+            rv ~= to!(String)(counter);
+
+            return rv;
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jface/snippets/viewers/Snippet031TableViewerCustomTooltipsMultiSelection.d	Fri Aug 08 14:40:21 2008 +0200
@@ -0,0 +1,310 @@
+/*******************************************************************************
+ * Copyright (c) 2007 Adam Neal 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:
+ *     Adam Neal - initial API and implementation
+ * Port to the D programming language:
+ *     yidabu at gmail dot com  ( D China http://www.d-programming-language-china.org/ )
+ *******************************************************************************/
+
+module snippets.viewers.Snippet031TableViewerCustomTooltipsMultiSelection;
+
+// http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.jface.snippets/Eclipse%20JFace%20Snippets/org/eclipse/jface/snippets/viewers/Snippet031TableViewerCustomTooltipsMultiSelection.java?view=markup
+
+import dwtx.dwtxhelper.Collection;
+import tango.util.Convert;
+
+import dwtx.jface.viewers.ArrayContentProvider;
+import dwtx.jface.viewers.ILabelProviderListener;
+import dwtx.jface.viewers.ITableLabelProvider;
+import dwtx.jface.viewers.TableViewer;
+import dwt.DWT;
+import dwt.graphics.Image;
+import dwt.graphics.Point;
+import dwt.graphics.Rectangle;
+import dwt.layout.FillLayout;
+import dwt.widgets.Display;
+import dwt.widgets.Event;
+import dwt.widgets.Label;
+import dwt.widgets.Listener;
+import dwt.widgets.Shell;
+import dwt.widgets.Table;
+import dwt.widgets.TableColumn;
+import dwt.widgets.TableItem;
+import dwt.dwthelper.System;
+import dwt.widgets.Listener;
+
+alias char[] String;
+void main(String[] args)
+{
+    Snippet031TableViewerCustomTooltipsMultiSelection.main(args);
+}
+
+/**
+ * A simple TableViewer to demonstrate how custom tooltips could be created easily while preserving
+ * the multiple selection.
+ *
+ * This is a modified example taken from Tom Schindl's Snippet023TreeViewerCustomTooltips.java
+ *
+ * This code is for users pre 3.3 others could use newly added tooltip support in {@link CellLabelProvider}
+ * @author Adam Neal <Adam_Neal@ca.ibm.com>
+ *
+ */
+public class Snippet031TableViewerCustomTooltipsMultiSelection {
+    public class MyLableProvider : ITableLabelProvider {
+
+        public Image getColumnImage(Object element, int columnIndex) {
+            return null;
+        }
+
+        public String getColumnText(Object element, int columnIndex) {
+            //if (element instanceof MyModel) {
+                switch (columnIndex) {
+                    case 0: return (cast(MyModel)element).col1;
+                    case 1: return (cast(MyModel)element).col2;
+                }
+            //}
+
+            return "";
+        }
+
+        public void addListener(ILabelProviderListener listener) {
+            /* Ignore */
+        }
+
+        public void dispose() {
+            /* Ignore */
+        }
+
+        public bool isLabelProperty(Object element, String property) {
+            return false;
+        }
+
+        public void removeListener(ILabelProviderListener listener) {
+            /* Ignore */
+        }
+
+    }
+
+
+
+    public this(Shell shell) {
+
+
+        final Table table = new Table(shell, DWT.H_SCROLL | DWT.V_SCROLL | DWT.MULTI | DWT.FULL_SELECTION);
+        table.setHeaderVisible(true);
+        table.setLinesVisible(true);
+
+        final TableViewer v = new TableViewer(table);
+        TableColumn tableColumn1 = new TableColumn(table, DWT.NONE);
+        TableColumn tableColumn2 = new TableColumn(table, DWT.NONE);
+
+        String column1 = "Column 1", column2 = "Column 2";
+        /* Setup the table  columns */
+        tableColumn1.setText(column1);
+        tableColumn2.setText(column2);
+        tableColumn1.pack();
+        tableColumn2.pack();
+
+        v.setColumnProperties([ column1, column2 ]);
+        v.setLabelProvider(new MyLableProvider());
+        v.setContentProvider(new ArrayContentProvider!(MyModel));
+        v.setInput(createModel());
+
+        tooltipLabelListener = new TooltipLabelListener();
+
+        /**
+         * The listener that gets added to the table.  This listener is responsible for creating the tooltips
+         * when hovering over a cell item. This listener will listen for the following events:
+         *  <li>DWT.KeyDown     - to remove the tooltip</li>
+         *  <li>DWT.Dispose     - to remove the tooltip</li>
+         *  <li>DWT.MouseMove   - to remove the tooltip</li>
+         *  <li>DWT.MouseHover  - to set the tooltip</li>
+         */
+
+        Listener tableListener = dgListener(&handleTableListener, table);
+
+        table.addListener (DWT.Dispose, tableListener);
+        table.addListener (DWT.KeyDown, tableListener);
+        table.addListener (DWT.MouseMove, tableListener);
+        table.addListener (DWT.MouseHover, tableListener);
+    }
+
+    void handleTableListener(Event event, Table table)
+    {
+        Shell tooltip = null;
+        Label label = null;
+
+        /*
+         * (non-Javadoc)
+         * @see dwt.widgets.Listener#handleEvent(dwt.widgets.Event)
+         */
+       switch (event.type) {
+            case DWT.KeyDown:
+            case DWT.Dispose:
+            case DWT.MouseMove: {
+                if (tooltip is null) break;
+                tooltip.dispose ();
+                tooltip = null;
+                label = null;
+                break;
+            }
+            case DWT.MouseHover: {
+                Point coords = new Point(event.x, event.y);
+                TableItem item = table.getItem(coords);
+                if (item !is null) {
+                    int columnCount = table.getColumnCount();
+                    for (int columnIndex = 0; columnIndex < columnCount; columnIndex++) {
+                        if (item.getBounds(columnIndex).contains(coords)) {
+                            /* Dispose of the old tooltip (if one exists */
+                            if (tooltip !is null  && !tooltip.isDisposed ()) tooltip.dispose ();
+
+                            /* Create a new Tooltip */
+                            tooltip = new Shell (table.getShell(), DWT.ON_TOP | DWT.NO_FOCUS | DWT.TOOL);
+                            tooltip.setBackground (table.getDisplay().getSystemColor (DWT.COLOR_INFO_BACKGROUND));
+                            FillLayout layout = new FillLayout ();
+                            layout.marginWidth = 2;
+                            tooltip.setLayout (layout);
+                            label = new Label (tooltip, DWT.NONE);
+                            label.setForeground (table.getDisplay().getSystemColor (DWT.COLOR_INFO_FOREGROUND));
+                            label.setBackground (table.getDisplay().getSystemColor (DWT.COLOR_INFO_BACKGROUND));
+
+                            /* Store the TableItem with the label so we can pass the mouse event later */
+                            label.setData ("_TableItem_", item);
+
+                            /* Set the tooltip text */
+                            label.setText("Tooltip: " ~ to!(char[])(item.getData()) ~ " : " ~ to!(char[])(columnIndex));
+
+                            /* Setup Listeners to remove the tooltip and transfer the received mouse events */
+                            label.addListener (DWT.MouseExit, tooltipLabelListener);
+                            label.addListener (DWT.MouseDown, tooltipLabelListener);
+
+                            /* Set the size and position of the tooltip */
+                            Point size = tooltip.computeSize (DWT.DEFAULT, DWT.DEFAULT);
+                            Rectangle rect = item.getBounds (columnIndex);
+                            Point pt = table.toDisplay (rect.x, rect.y);
+                            tooltip.setBounds (pt.x, pt.y, size.x, size.y);
+
+                            /* Show it */
+                            tooltip.setVisible (true);
+                            break;
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * This listener is added to the tooltip so that it can either dispose itself if the mouse
+     * exits the tooltip or so it can pass the selection event through to the table.
+     */
+    final TooltipLabelListener tooltipLabelListener;
+    final class TooltipLabelListener : Listener {
+        private bool isCTRLDown(Event e) {
+            return (e.stateMask & DWT.CTRL) != 0;
+        }
+       /*
+        * (non-Javadoc)
+        * @see dwt.widgets.Listener#handleEvent(dwt.widgets.Event)
+        */
+       public void handleEvent (Event event) {
+           Label label = cast(Label)event.widget;
+           Shell shell = label.getShell ();
+           switch (event.type) {
+                case DWT.MouseDown: /* Handle a user Click */
+                    /* Extract our Data */
+                    Event e = new Event ();
+                    e.item = cast(TableItem) label.getData ("_TableItem_");
+                    Table table = (cast(TableItem) e.item).getParent();
+
+                    /* Construct the new Selection[] to show */
+                    TableItem [] newSelection = null;
+                    if (isCTRLDown(event)) {
+                        /* We have 2 scenario's.
+                         *  1) We are selecting an already selected element - so remove it from the selected indices
+                         *  2) We are selecting a non-selected element - so add it to the selected indices
+                         */
+                        TableItem[] sel = table.getSelection();
+                        for (int i = 0; i < sel.length; ++i) {
+                            //if (e.item.equals(sel[i])) {
+                            if (e.item is sel[i]) {
+                                // We are de-selecting this element
+                                newSelection = new TableItem[sel.length - 1];
+                                System.arraycopy(sel, 0, newSelection, 0, i);
+                                System.arraycopy(sel, i+1, newSelection, i, sel.length - i - 1);
+                                break;
+                            }
+                        }
+
+                        /*
+                         * If we haven't created the newSelection[] yet, than we are adding the newly selected element
+                         * into the list of selected indicies
+                         */
+                        if (newSelection is null) {
+                            newSelection = new TableItem[sel.length + 1];
+                            System.arraycopy(sel, 0, newSelection, 0, sel.length);
+                            newSelection[sel.length] = cast(TableItem) e.item;
+                        }
+
+                    } else {
+                        /* CTRL is not down, so we simply select the single element */
+                        newSelection = [ cast(TableItem) e.item ];
+                    }
+                    /* Set the new selection of the table and notify the listeners */
+                    table.setSelection (newSelection);
+                    table.notifyListeners (DWT.Selection, e);
+
+                    /* Remove the Tooltip */
+                    shell.dispose ();
+                    table.setFocus();
+                    break;
+                case DWT.MouseExit:
+                    shell.dispose ();
+                    break;
+            }
+        }
+    }
+
+
+    private ArrayList createModel() {
+        ArrayList list = new ArrayList;
+        list.add(new MyModel("A", "B"));
+        list.add(new MyModel("C", "D"));
+        list.add(new MyModel("E", "F"));
+        return list;
+    }
+
+    public static void main(String[] args) {
+        Display display = new Display();
+        Shell shell = new Shell(display);
+        shell.setLayout(new FillLayout());
+        new Snippet031TableViewerCustomTooltipsMultiSelection(shell);
+        shell.open();
+
+        while (!shell.isDisposed()) {
+            if (!display.readAndDispatch())
+                display.sleep();
+        }
+
+        display.dispose();
+    }
+}
+
+public class MyModel {
+    public String col1, col2;
+
+    public this(String c1, String c2) {
+        col1 = c1;
+        col2 = c2;
+    }
+
+    public String toString() {
+        return col1 ~ col2;
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jface/snippets/viewers/Snippet040TableViewerSorting.d	Fri Aug 08 14:40:21 2008 +0200
@@ -0,0 +1,310 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Tom Schindl 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:
+ *     Tom Schindl - initial API and implementation
+ * Port to the D programming language:
+ *     yidabu at gmail dot com  ( D China http://www.d-programming-language-china.org/ )
+ *******************************************************************************/
+module snippets.viewers.Snippet040TableViewerSorting;
+
+// http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.jface.snippets/Eclipse%20JFace%20Snippets/org/eclipse/jface/snippets/viewers/Snippet040TableViewerSorting.java?view=markup
+
+import dwtx.jface.viewers.CellEditor;
+import dwtx.jface.viewers.ColumnLabelProvider;
+import dwtx.jface.viewers.ColumnViewer;
+import dwtx.jface.viewers.EditingSupport;
+import dwtx.jface.viewers.IStructuredContentProvider;
+import dwtx.jface.viewers.TableViewer;
+import dwtx.jface.viewers.TableViewerColumn;
+import dwtx.jface.viewers.TextCellEditor;
+import dwtx.jface.viewers.Viewer;
+import dwtx.jface.viewers.ViewerComparator;
+import dwt.DWT;
+import dwt.events.SelectionAdapter;
+import dwt.events.SelectionEvent;
+import dwt.layout.FillLayout;
+import dwt.widgets.Display;
+import dwt.widgets.Shell;
+import dwt.dwthelper.utils;
+
+/**
+ * Example usage of ViewerComparator in tables to allow sorting
+ *
+ * @author Tom Schindl <tom.schindl@bestsolution.at>
+ *
+ */
+
+void main(String[] args) {
+    Snippet040TableViewerSorting.main(args);
+}
+
+    private class MyContentProvider : IStructuredContentProvider {
+
+        public Object[] getElements(Object inputElement) {
+            return (cast(ArrayWrapperT!(Person)) inputElement).array;
+        }
+
+        public void dispose() {
+        }
+
+        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+        }
+
+    }
+
+    public class Person {
+        public String givenname;
+        public String surname;
+        public String email;
+
+        public this(String givenname, String surname, String email) {
+            this.givenname = givenname;
+            this.surname = surname;
+            this.email = email;
+        }
+
+    }
+
+    protected abstract class AbstractEditingSupport : EditingSupport {
+        private TextCellEditor editor;
+
+        public this(TableViewer viewer) {
+            super(viewer);
+            this.editor = new TextCellEditor(viewer.getTable());
+        }
+
+        protected bool canEdit(Object element) {
+            return true;
+        }
+
+        protected CellEditor getCellEditor(Object element) {
+            return editor;
+        }
+
+        protected void setValue(Object element, Object value) {
+            doSetValue(element, value);
+            getViewer().update(element, null);
+        }
+
+        protected abstract void doSetValue(Object element, Object value);
+    }
+
+    private abstract class ColumnViewerSorter : ViewerComparator {
+        public static final int ASC = 1;
+
+        public static final int NONE = 0;
+
+        public static final int DESC = -1;
+
+        private int direction = 0;
+
+        private TableViewerColumn column;
+
+        private ColumnViewer viewer;
+
+        public this(ColumnViewer viewer_, TableViewerColumn column_) {
+            this.column = column_;
+            this.viewer = viewer_;
+            this.column.getColumn().addSelectionListener(new class() SelectionAdapter {
+                public void widgetSelected(SelectionEvent e) {
+                    this.outer.widgetSelected(e);
+                }
+            });
+        }
+
+        private void widgetSelected(SelectionEvent e){
+            if( viewer.getComparator() !is null ) {
+                if( viewer.getComparator() is this ) {
+                    int tdirection = direction;
+
+                    if( tdirection is ASC ) {
+                        setSorter(this, DESC);
+                    } else if( tdirection is DESC ) {
+                        setSorter(this, NONE);
+                    }
+                } else {
+                    setSorter(this, ASC);
+                }
+            } else {
+                setSorter(this, ASC);
+            }
+        }
+        public void setSorter(ColumnViewerSorter sorter, int direction) {
+            if( direction is NONE ) {
+                column.getColumn().getParent().setSortColumn(null);
+                column.getColumn().getParent().setSortDirection(DWT.NONE);
+                viewer.setComparator(null);
+            } else {
+                column.getColumn().getParent().setSortColumn(column.getColumn());
+                sorter.direction = direction;
+
+                if( direction is ASC ) {
+                    column.getColumn().getParent().setSortDirection(DWT.DOWN);
+                } else {
+                    column.getColumn().getParent().setSortDirection(DWT.UP);
+                }
+
+                if( viewer.getComparator() is sorter ) {
+                    viewer.refresh();
+                } else {
+                    viewer.setComparator(sorter);
+                }
+
+            }
+        }
+
+        public int compare(Viewer viewer, Object e1, Object e2) {
+            return direction * doCompare(viewer, e1, e2);
+        }
+
+        protected abstract int doCompare(Viewer viewer, Object e1, Object e2);
+    }
+
+public class Snippet040TableViewerSorting {
+
+
+    public this(Shell shell) {
+        TableViewer v = new TableViewer(shell, DWT.BORDER | DWT.FULL_SELECTION);
+        v.setContentProvider(new MyContentProvider());
+
+        TableViewerColumn column = new TableViewerColumn(v, DWT.NONE);
+        column.getColumn().setWidth(200);
+        column.getColumn().setText("Givenname");
+        column.getColumn().setMoveable(true);
+        column.setLabelProvider(new class() ColumnLabelProvider {
+            public String getText(Object element) {
+                return (cast(Person) element).givenname;
+            }
+        });
+
+        column.setEditingSupport(new class(v) AbstractEditingSupport {
+            public this(TableViewer t ){
+                super(t);
+            }
+            protected Object getValue(Object element) {
+                return new ArrayWrapperString((cast(Person) element).givenname);
+            }
+            protected void doSetValue(Object element, Object value) {
+                (cast(Person) element).givenname = stringcast(value);
+            }
+        });
+
+        ColumnViewerSorter cSorter = new class(v,column) ColumnViewerSorter {
+            this(TableViewer t, TableViewerColumn c ){
+                super(t,c);
+            }
+            protected int doCompare(Viewer viewer, Object e1, Object e2) {
+                Person p1 = cast(Person) e1;
+                Person p2 = cast(Person) e2;
+                return p1.givenname.compareToIgnoreCase(p2.givenname);
+            }
+        };
+
+        column = new TableViewerColumn(v, DWT.NONE);
+        column.getColumn().setWidth(200);
+        column.getColumn().setText("Surname");
+        column.getColumn().setMoveable(true);
+        column.setLabelProvider(new class() ColumnLabelProvider {
+            public String getText(Object element) {
+                return (cast(Person) element).surname;
+            }
+        });
+
+        column.setEditingSupport(new class(v) AbstractEditingSupport {
+            this(TableViewer t ){
+                super(t);
+            }
+            protected Object getValue(Object element) {
+                return stringcast((cast(Person) element).surname);
+            }
+            protected void doSetValue(Object element, Object value) {
+                (cast(Person) element).surname = stringcast(value);
+            }
+        });
+
+        new class(v,column) ColumnViewerSorter {
+            this(TableViewer t, TableViewerColumn c ){
+                super(t,c);
+            }
+            protected int doCompare(Viewer viewer, Object e1, Object e2) {
+                Person p1 = cast(Person) e1;
+                Person p2 = cast(Person) e2;
+                return p1.surname.compareToIgnoreCase(p2.surname);
+            }
+        };
+
+        column = new TableViewerColumn(v, DWT.NONE);
+        column.getColumn().setWidth(200);
+        column.getColumn().setText("E-Mail");
+        column.getColumn().setMoveable(true);
+        column.setLabelProvider(new class() ColumnLabelProvider {
+            public String getText(Object element) {
+                return (cast(Person) element).email;
+            }
+        });
+
+        column.setEditingSupport(new class(v) AbstractEditingSupport {
+            this(TableViewer t ){
+                super(t);
+            }
+            protected Object getValue(Object element) {
+                return stringcast((cast(Person) element).email);
+            }
+            protected void doSetValue(Object element, Object value) {
+                (cast(Person) element).email = stringcast(value);
+            }
+        });
+        new class(v,column) ColumnViewerSorter {
+            this(TableViewer t, TableViewerColumn c ){
+                super(t,c);
+            }
+            protected int doCompare(Viewer viewer, Object e1, Object e2) {
+                Person p1 = cast(Person) e1;
+                Person p2 = cast(Person) e2;
+                return p1.email.compareToIgnoreCase(p2.email);
+            }
+        };
+
+        Person[] model = createModel();
+        v.setInput( new ArrayWrapperT!(Person)(model));
+        v.getTable().setLinesVisible(true);
+        v.getTable().setHeaderVisible(true);
+        cSorter.setSorter(cSorter, ColumnViewerSorter.ASC);
+    }
+
+    private Person[] createModel() {
+        Person[] elements = new Person[4];
+        elements[0] = new Person("Tom", "Schindl",
+                "tom.schindl@bestsolution.at");
+        elements[1] = new Person("Boris", "Bokowski",
+                "Boris_Bokowski@ca.ibm.com");
+        elements[2] = new Person("Tod", "Creasey", "Tod_Creasey@ca.ibm.com");
+        elements[3] = new Person("Wayne", "Beaton", "wayne@eclipse.org");
+
+        return elements;
+    }
+
+    /**
+     * @param args
+     */
+    public static void main(String[] args) {
+        Display display = new Display();
+
+        Shell shell = new Shell(display);
+        shell.setLayout(new FillLayout());
+        new Snippet040TableViewerSorting(shell);
+        shell.open();
+
+        while (!shell.isDisposed()) {
+            if (!display.readAndDispatch())
+                display.sleep();
+        }
+        display.dispose();
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jface/snippets/viewers/Snippet043NoColumnTreeViewerKeyboardEditing.d	Fri Aug 08 14:40:21 2008 +0200
@@ -0,0 +1,222 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Tom Schindl 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:
+ *     Tom Schindl - initial API and implementation
+ * Port to the D programming language:
+ *     yidabu at gmail dot com  ( D China http://www.d-programming-language-china.org/ )
+ *******************************************************************************/
+
+module snippets.viewers.Snippet043NoColumnTreeViewerKeyboardEditing;
+
+import dwtx.jface.viewers.CellEditor;
+import dwtx.jface.viewers.ColumnViewerEditor;
+import dwtx.jface.viewers.ColumnViewer;
+import dwtx.jface.viewers.ColumnViewerEditorActivationStrategy;
+import dwtx.jface.viewers.ColumnViewerEditorActivationEvent;
+import dwtx.jface.viewers.FocusCellOwnerDrawHighlighter;
+import dwtx.jface.viewers.ICellModifier;
+import dwtx.jface.viewers.ITreeContentProvider;
+import dwtx.jface.viewers.TextCellEditor;
+import dwtx.jface.viewers.TreePath;
+import dwtx.jface.viewers.TreeViewerFocusCellManager;
+import dwtx.jface.viewers.TreeViewerEditor;
+import dwtx.jface.viewers.TreeViewer;
+import dwtx.jface.viewers.Viewer;
+import dwt.DWT;
+import dwt.events.SelectionEvent;
+import dwt.events.SelectionListener;
+import dwt.layout.FillLayout;
+import dwt.widgets.Button;
+import dwt.widgets.Display;
+import dwt.widgets.Item;
+import dwt.widgets.Shell;
+
+import dwt.dwthelper.utils;
+
+import tango.util.Convert;
+import tango.util.container.LinkedList;
+
+version(JIVE) import jive.stacktrace;
+
+
+void main(String[] args) {
+    Display display = new Display();
+    Shell shell = new Shell(display);
+    shell.setLayout(new FillLayout());
+    new Snippet043NoColumnTreeViewerKeyboardEditing(shell);
+    shell.open();
+
+    while (!shell.isDisposed()) {
+        if (!display.readAndDispatch())
+            display.sleep();
+    }
+
+    display.dispose();
+}
+
+/**
+ * Demonstrates how to use keyboard-editing support in a TreeViewer with no column
+ *
+ * @author Tom Schindl <tom.schindl@bestsolution.at>
+ *
+ */
+public class Snippet043NoColumnTreeViewerKeyboardEditing {
+    alias LinkedList!(MyModel) ArrayList;
+    public this(Shell shell) {
+        Button b = new Button(shell, DWT.PUSH);
+        b.setText("BBB");
+        final TreeViewer v = new TreeViewer(shell, DWT.BORDER
+                | DWT.FULL_SELECTION);
+        b.addSelectionListener(new class(v) SelectionListener {
+            TreeViewer v;
+            this(TreeViewer v_)
+            {
+                this.v = v_;
+            }
+
+            public void widgetDefaultSelected(SelectionEvent e) {
+
+            }
+
+            public void widgetSelected(SelectionEvent e) {
+                MyModel root = cast(MyModel) v.getInput();
+                TreePath path = new TreePath([ root, root.child.get(1),
+                        (cast(MyModel) root.child.get(1)).child.get(0)] );
+                v.editElement(path, 0);
+            }
+
+        });
+
+        v.setCellEditors([ new TextCellEditor(v.getTree()) ]);
+        v.setColumnProperties(["col1"]);
+        v.setCellModifier(new class(v) ICellModifier {
+            TreeViewer v;
+            this(TreeViewer v_)
+            {
+                this.v = v_;
+            }
+            public bool canModify(Object element, String property) {
+                return true;
+            }
+
+            public Object getValue(Object element, String property) {
+                return stringcast( to!(String)((cast(MyModel) element).counter) ~ "" );
+            }
+
+            public void modify(Object element, String property, Object value) {
+                element = (cast(Item) element).getData();
+                (cast(MyModel) element).counter = Integer.parseInt(value.toString());
+                v.update(element, null);
+            }
+
+        });
+
+        TreeViewerFocusCellManager focusCellManager = new TreeViewerFocusCellManager(
+                v, new FocusCellOwnerDrawHighlighter(v));
+        ColumnViewerEditorActivationStrategy actSupport = new class(v) ColumnViewerEditorActivationStrategy {
+            this(ColumnViewer v)
+            {
+                super(v);
+            }
+            protected bool isEditorActivationEvent(
+                    ColumnViewerEditorActivationEvent event) {
+                return event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL
+                        || event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION
+                        || (event.eventType == ColumnViewerEditorActivationEvent.KEY_PRESSED && event.keyCode == DWT.CR)
+                        || event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC;
+            }
+        };
+
+        TreeViewerEditor.create(v, focusCellManager, actSupport,
+                ColumnViewerEditor.TABBING_HORIZONTAL
+                        | ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR
+                        | ColumnViewerEditor.TABBING_VERTICAL
+                        | ColumnViewerEditor.KEYBOARD_ACTIVATION);
+
+        v.setContentProvider(new MyContentProvider());
+
+        v.setInput(createModel());
+    }
+
+    private MyModel createModel() {
+
+        MyModel root = new MyModel(0, null);
+        root.counter = 0;
+
+        MyModel tmp;
+        MyModel subItem;
+        for (int i = 1; i < 10; i++) {
+            tmp = new MyModel(i, root);
+            root.child.add(tmp);
+            for (int j = 1; j < i; j++) {
+                subItem = new MyModel(j, tmp);
+                subItem.child.add(new MyModel(j * 100, subItem));
+                tmp.child.add(subItem);
+            }
+        }
+
+        return root;
+    }
+
+
+
+    private class MyContentProvider : ITreeContentProvider {
+
+        public Object[] getElements(Object inputElement) {
+            return (cast(MyModel) inputElement).child.toArray();
+        }
+
+        public void dispose() {
+        }
+
+        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+        }
+
+        public Object[] getChildren(Object parentElement) {
+            return getElements(parentElement);
+        }
+
+        public Object getParent(Object element) {
+            if (element is null) {
+                return null;
+            }
+            return (cast(MyModel) element).parent;
+        }
+
+        public bool hasChildren(Object element) {
+            return (cast(MyModel) element).child.size() > 0;
+        }
+
+    }
+
+    public class MyModel {
+        public MyModel parent;
+
+        public ArrayList child;
+
+        public int counter;
+
+        public this(int counter_, MyModel parent_) {
+            this.parent = parent_;
+            this.counter = counter_;
+            child = new ArrayList();
+        }
+
+        public String toString() {
+            String rv = "Item ";
+            if (parent !is null) {
+                rv = parent.toString() ~ ".";
+            }
+
+            rv ~= to!(String)(counter);
+
+            return rv;
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jface/snippets/viewers/Snippet047VirtualLazyTreeViewer.d	Fri Aug 08 14:40:21 2008 +0200
@@ -0,0 +1,186 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Tom Schindl 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:
+ *     Tom Schindl - initial API and implementation
+ * Port to the D programming language:
+ *     yidabu at gmail dot com  ( D China http://www.d-programming-language-china.org/ )
+ *******************************************************************************/
+
+module snippets.viewers.Snippet047VirtualLazyTreeViewer;
+
+import dwtx.jface.viewers.ILazyTreeContentProvider;
+import dwtx.jface.viewers.LabelProvider;
+import dwtx.jface.viewers.TreeViewer;
+import dwtx.jface.viewers.Viewer;
+import dwt.DWT;
+import dwt.layout.FillLayout;
+import dwt.widgets.Display;
+import dwt.widgets.Shell;
+
+import dwt.dwthelper.utils;
+
+import tango.util.Convert;
+import tango.util.container.LinkedList;
+
+version(JIVE) import jive.stacktrace;
+
+
+/**
+ * @param args
+ */
+void main(String[] args) {
+    Display display = new Display();
+    Shell shell = new Shell(display);
+    shell.setLayout(new FillLayout());
+    new Snippet047VirtualLazyTreeViewer(shell);
+    shell.open();
+
+    while (!shell.isDisposed()) {
+        if (!display.readAndDispatch())
+            display.sleep();
+    }
+
+    display.dispose();
+
+}
+
+/**
+ * A simple TreeViewer to demonstrate usage of an ILazyContentProvider.
+ *
+ */
+public class Snippet047VirtualLazyTreeViewer {
+    alias ArrayWrapperT!(IntermediateNode)  ArrayWrapperIntermediateNode;
+    alias ArrayWrapperT!(LeafNode)  ArrayWrapperLeafNode;
+
+    private class MyContentProvider : ILazyTreeContentProvider {
+        private TreeViewer viewer;
+        private IntermediateNode[] elements;
+
+        public this(TreeViewer viewer) {
+            this.viewer = viewer;
+        }
+
+        public void dispose() {
+
+        }
+
+        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+            if(cast(ArrayWrapperIntermediateNode) newInput)
+                this.elements = (cast(ArrayWrapperIntermediateNode) newInput).array;
+        }
+
+        /*
+         * (non-Javadoc)
+         *
+         * @see dwtx.jface.viewers.ILazyTreeContentProvider#getParent(java.lang.Object)
+         */
+        public Object getParent(Object element) {
+            if (cast(LeafNode)element)
+                return (cast(LeafNode) element).parent;
+            return new ArrayWrapperIntermediateNode(elements);
+        }
+
+        /*
+         * (non-Javadoc)
+         *
+         * @see dwtx.jface.viewers.ILazyTreeContentProvider#updateChildCount(java.lang.Object,
+         *      int)
+         */
+        public void updateChildCount(Object element, int currentChildCount) {
+
+            int length = 0;
+            if (cast(IntermediateNode)element) {
+                IntermediateNode node = cast(IntermediateNode) element;
+                length =  node.children.length;
+            }
+            /// TODO: fix me  access violation here
+            if(element !is null && elements !is null && (cast(ArrayWrapperIntermediateNode)element) && (cast(ArrayWrapperIntermediateNode)element).array is elements)
+                length = elements.length;
+            viewer.setChildCount(element, length);
+        }
+
+        /*
+         * (non-Javadoc)
+         *
+         * @see dwtx.jface.viewers.ILazyTreeContentProvider#updateElement(java.lang.Object,
+         *      int)
+         */
+        public void updateElement(Object parent, int index) {
+
+            Object element;
+            if (cast(IntermediateNode)parent)
+                element = (cast(IntermediateNode) parent).children[index];
+
+            else
+                element =  elements[index];
+            viewer.replace(parent, index, element);
+            updateChildCount(element, -1);
+
+        }
+
+    }
+
+    public class LeafNode {
+        public int counter;
+        public IntermediateNode parent;
+
+        public this(int counter, IntermediateNode parent) {
+            this.counter = counter;
+            this.parent = parent;
+        }
+
+        public String toString() {
+            return "Leaf " ~ to!(String)(this.counter);
+        }
+    }
+
+    public class IntermediateNode {
+        public int counter;
+        public LeafNode[] children;
+
+        public this(int counter) {
+            this.counter = counter;
+            children = new LeafNode[0];
+        }
+
+        public String toString() {
+            return "Node " ~ to!(String)(this.counter);
+        }
+
+        public void generateChildren(int i) {
+            children = new LeafNode[i];
+            for (int j = 0; j < i; j++) {
+                children[j] = new LeafNode(j, this);
+            }
+
+        }
+    }
+
+    public this(Shell shell) {
+        final TreeViewer v = new TreeViewer(shell, DWT.VIRTUAL | DWT.BORDER);
+        v.setLabelProvider(new LabelProvider());
+        v.setContentProvider(new MyContentProvider(v));
+        v.setUseHashlookup(true);
+        IntermediateNode[] model = createModel();
+        v.setInput(new ArrayWrapperIntermediateNode(model));
+        v.getTree().setItemCount(model.length);
+
+    }
+
+    private IntermediateNode[] createModel() {
+        IntermediateNode[] elements = new IntermediateNode[10];
+
+        for (int i = 0; i < 10; i++) {
+            elements[i] = new IntermediateNode(i);
+            elements[i].generateChildren(1000);
+        }
+
+        return elements;
+    }
+
+}