Skip to content

Commit 726b26b

Browse files
committed
[performance] faster Tree expand - eclipse.platform.swt#901
* move setExpanded() after expanding the children * insert every item at index 0 (in reverse order) eclipse-platform/eclipse.platform.swt#901
1 parent 918fd74 commit 726b26b

File tree

2 files changed

+23
-18
lines changed

2 files changed

+23
-18
lines changed

bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/AbstractTreeViewer.java

+20-16
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import org.eclipse.swt.graphics.Point;
4747
import org.eclipse.swt.widgets.Control;
4848
import org.eclipse.swt.widgets.Item;
49+
import org.eclipse.swt.widgets.Tree;
4950
import org.eclipse.swt.widgets.TreeItem;
5051
import org.eclipse.swt.widgets.Widget;
5152

@@ -362,8 +363,9 @@ private void createAddedElements(Widget widget, Object[] elements) {
362363

363364
// Optimize for the empty case
364365
if (items.length == 0) {
365-
for (Object element : elements) {
366-
createTreeItem(widget, element, -1);
366+
// For performance insert every item at index 0 (in reverse order):
367+
for (int i = elements.length - 1; i >= 0; i--) {
368+
createTreeItem(widget, elements[i], 0);
367369
}
368370
return;
369371
}
@@ -846,8 +848,9 @@ void createChildren(final Widget widget, boolean materialize) {
846848
} else {
847849
children = getSortedChildren(parentElement);
848850
}
849-
for (Object element : children) {
850-
createTreeItem(widget, element, -1);
851+
// For performance insert every item at index 0 (in reverse order):
852+
for (int i = children.length - 1; i >= 0; i--) {
853+
createTreeItem(widget, children[i], 0);
851854
}
852855
}
853856
} finally {
@@ -856,16 +859,16 @@ void createChildren(final Widget widget, boolean materialize) {
856859
}
857860

858861
/**
859-
* Creates a single item for the given parent and synchronizes it with the
860-
* given element.
862+
* Creates a single item for the given parent and synchronizes it with the given
863+
* element. The fastest way to insert many items is documented in
864+
* {@link TreeItem#TreeItem(Tree,int,int)}
861865
*
862-
* @param parent
863-
* the parent widget
864-
* @param element
865-
* the element
866-
* @param index
867-
* if non-negative, indicates the position to insert the item
868-
* into its parent
866+
* @param parent the parent widget
867+
* @param element the element
868+
* @param index if non-negative, indicates the position to insert the item
869+
* into its parent
870+
* @see org.eclipse.swt.widgets.TreeItem#TreeItem(org.eclipse.swt.widgets.Tree,
871+
* int, int)
869872
*/
870873
protected void createTreeItem(Widget parent, Object element, int index) {
871874
Item item = newItem(parent, SWT.NULL, index);
@@ -1831,9 +1834,6 @@ protected void internalExpandToLevel(Widget widget, int level) {
18311834
return;
18321835
}
18331836
createChildren(widget, false);
1834-
if (widget instanceof Item) {
1835-
setExpanded((Item) widget, true);
1836-
}
18371837
if (level == ALL_LEVELS || level > 1) {
18381838
Item[] children = getChildren(widget);
18391839
if (children != null) {
@@ -1844,6 +1844,10 @@ protected void internalExpandToLevel(Widget widget, int level) {
18441844
}
18451845
}
18461846
}
1847+
// for performance expand after creating children:
1848+
if (widget instanceof Item) {
1849+
setExpanded((Item) widget, true);
1850+
}
18471851
}
18481852
}
18491853

bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TreeViewer.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -1152,8 +1152,9 @@ void handleExpandableNodeClicked(Widget w) {
11521152
item.dispose();
11531153

11541154
// create children on parent
1155-
for (Object element : children) {
1156-
createTreeItem(parent, element, -1);
1155+
// For performance insert every item at index 0 (in reverse order):
1156+
for (int i = children.length - 1; i >= 0; i--) {
1157+
createTreeItem(parent, children[i], 0);
11571158
}
11581159

11591160
// If we've expanded but still have not reached the limit

0 commit comments

Comments
 (0)