# HG changeset patch # User yidabu # Date 1217988186 -28800 # Node ID 96a2d0b3536080490d41d2ff4937f3ab9883eaab # Parent 7931ee9b41e6ebcbfff69c6817b0015c37bd70da jface snippets 014, 026, 043, 047 diff -r 7931ee9b41e6 -r 96a2d0b35360 jface/snippets/Snippet014TreeViewerNoMandatoryLabelProvider.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jface/snippets/Snippet014TreeViewerNoMandatoryLabelProvider.d Wed Aug 06 10:03:06 2008 +0800 @@ -0,0 +1,227 @@ +/******************************************************************************* + * 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; + + + +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 + * + */ +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; + } + + +} diff -r 7931ee9b41e6 -r 96a2d0b35360 jface/snippets/Snippet026TreeViewerTabEditing.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jface/snippets/Snippet026TreeViewerTabEditing.d Wed Aug 06 10:03:06 2008 +0800 @@ -0,0 +1,294 @@ +/******************************************************************************* + * 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 tango.util.Convert; +import tango.util.container.LinkedList; + + +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 + * + */ +public class Snippet026TreeViewerTabEditing { + alias LinkedList!(MyModel) ArrayList; + 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; + } + } + +} diff -r 7931ee9b41e6 -r 96a2d0b35360 jface/snippets/Snippet043NoColumnTreeViewerKeyboardEditing.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jface/snippets/Snippet043NoColumnTreeViewerKeyboardEditing.d Wed Aug 06 10:03:06 2008 +0800 @@ -0,0 +1,220 @@ +/******************************************************************************* + * 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; + + +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 + * + */ +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; + } + } + +} diff -r 7931ee9b41e6 -r 96a2d0b35360 jface/snippets/Snippet047VirtualLazyTreeViewer.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jface/snippets/Snippet047VirtualLazyTreeViewer.d Wed Aug 06 10:03:06 2008 +0800 @@ -0,0 +1,184 @@ +/******************************************************************************* + * 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; + + +/** + * @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; + } + +} \ No newline at end of file