Skip to content

Commit 727c6be

Browse files
committed
[performance] Tree expand in reverse order - eclipse.platform.swt#901
eclipse-platform/eclipse.platform.swt#901
1 parent c41b487 commit 727c6be

File tree

2 files changed

+21
-15
lines changed

2 files changed

+21
-15
lines changed

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

+18-13
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,6 +1834,7 @@ protected void internalExpandToLevel(Widget widget, int level) {
18311834
return;
18321835
}
18331836
createChildren(widget, false);
1837+
// XXX for performance widget should be expanded after expanding children:
18341838
if (widget instanceof Item) {
18351839
setExpanded((Item) widget, true);
18361840
}
@@ -1844,6 +1848,7 @@ protected void internalExpandToLevel(Widget widget, int level) {
18441848
}
18451849
}
18461850
}
1851+
// XXX expanding here fails on linux
18471852
}
18481853
}
18491854

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

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

11521152
// create children on parent
1153-
for (Object element : children) {
1154-
createTreeItem(parent, element, -1);
1153+
// For performance insert every item at index 0 (in reverse order):
1154+
for (int i = children.length - 1; i >= 0; i--) {
1155+
createTreeItem(parent, children[i], 0);
11551156
}
11561157

11571158
// reset the selection. client's selection listener should not be triggered.

0 commit comments

Comments
 (0)