diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/AbstractTreeViewer.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/AbstractTreeViewer.java index ef0f1415fbc..394b6e597f0 100644 --- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/AbstractTreeViewer.java +++ b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/AbstractTreeViewer.java @@ -46,6 +46,7 @@ import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Item; +import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeItem; import org.eclipse.swt.widgets.Widget; @@ -362,8 +363,9 @@ private void createAddedElements(Widget widget, Object[] elements) { // Optimize for the empty case if (items.length == 0) { - for (Object element : elements) { - createTreeItem(widget, element, -1); + // For performance insert every item at index 0 (in reverse order): + for (int i = elements.length - 1; i >= 0; i--) { + createTreeItem(widget, elements[i], 0); } return; } @@ -846,8 +848,9 @@ void createChildren(final Widget widget, boolean materialize) { } else { children = getSortedChildren(parentElement); } - for (Object element : children) { - createTreeItem(widget, element, -1); + // For performance insert every item at index 0 (in reverse order): + for (int i = children.length - 1; i >= 0; i--) { + createTreeItem(widget, children[i], 0); } } } finally { @@ -856,16 +859,16 @@ void createChildren(final Widget widget, boolean materialize) { } /** - * Creates a single item for the given parent and synchronizes it with the - * given element. + * Creates a single item for the given parent and synchronizes it with the given + * element. The fastest way to insert many items is documented in + * {@link TreeItem#TreeItem(Tree,int,int)} * - * @param parent - * the parent widget - * @param element - * the element - * @param index - * if non-negative, indicates the position to insert the item - * into its parent + * @param parent the parent widget + * @param element the element + * @param index if non-negative, indicates the position to insert the item + * into its parent + * @see org.eclipse.swt.widgets.TreeItem#TreeItem(org.eclipse.swt.widgets.Tree, + * int, int) */ protected void createTreeItem(Widget parent, Object element, int index) { Item item = newItem(parent, SWT.NULL, index); @@ -1831,6 +1834,7 @@ protected void internalExpandToLevel(Widget widget, int level) { return; } createChildren(widget, false); + // XXX for performance widget should be expanded after expanding children: if (widget instanceof Item) { setExpanded((Item) widget, true); } @@ -1844,6 +1848,7 @@ protected void internalExpandToLevel(Widget widget, int level) { } } } + // XXX expanding here fails on linux } } diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TreeViewer.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TreeViewer.java index 7a576ff582d..c64a055c260 100644 --- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TreeViewer.java +++ b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TreeViewer.java @@ -1150,8 +1150,9 @@ void handleExpandableNodeClicked(Widget w) { item.dispose(); // create children on parent - for (Object element : children) { - createTreeItem(parent, element, -1); + // For performance insert every item at index 0 (in reverse order): + for (int i = children.length - 1; i >= 0; i--) { + createTreeItem(parent, children[i], 0); } // reset the selection. client's selection listener should not be triggered.