Skip to content

Commit 8560cca

Browse files
author
Jörg Kubitz
committed
AbstractTreeViewer do not auto-expand same nodes multiple times
fixes slow (Quick-)Type hierarchy for redundant superinterfaces eclipse-jdt/eclipse.jdt.ui#1830
1 parent f878f80 commit 8560cca

File tree

1 file changed

+11
-1
lines changed

1 file changed

+11
-1
lines changed

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

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,11 @@
2525
import java.util.ArrayList;
2626
import java.util.Arrays;
2727
import java.util.Collection;
28+
import java.util.HashSet;
2829
import java.util.Iterator;
2930
import java.util.LinkedList;
3031
import java.util.List;
32+
import java.util.Set;
3133
import java.util.function.Function;
3234

3335
import org.eclipse.core.runtime.Assert;
@@ -1850,6 +1852,11 @@ protected Widget internalGetWidgetToSelect(Object elementOrTreePath) {
18501852
*/
18511853
private void internalConditionalExpandToLevel(Widget widget, int level,
18521854
Function<Widget, Boolean> shouldChildrenExpand) {
1855+
internalConditionalExpandToLevel(widget, level, shouldChildrenExpand, new HashSet<>());
1856+
}
1857+
1858+
private void internalConditionalExpandToLevel(Widget widget, int level,
1859+
Function<Widget, Boolean> shouldChildrenExpand, Set<Object> expanded) {
18531860
if (level == ALL_LEVELS || level > 0) {
18541861
Object data = widget.getData();
18551862
if (widget instanceof Item it && data != null && !isExpandable(it, null, data)) {
@@ -1858,6 +1865,9 @@ private void internalConditionalExpandToLevel(Widget widget, int level,
18581865
createChildren(widget, false);
18591866
// XXX for performance widget should be expanded after expanding children:
18601867
if (widget instanceof Item it) {
1868+
if (data != null && !expanded.add(data)) {
1869+
return;
1870+
}
18611871
setExpanded(it, true);
18621872
}
18631873
if (level == ALL_LEVELS || level > 1) {
@@ -1867,7 +1877,7 @@ private void internalConditionalExpandToLevel(Widget widget, int level,
18671877
: level - 1);
18681878
for (Item element : children) {
18691879
if (shouldChildrenExpand.apply(widget).booleanValue()) {
1870-
internalConditionalExpandToLevel(element, newLevel, shouldChildrenExpand);
1880+
internalConditionalExpandToLevel(element, newLevel, shouldChildrenExpand, expanded);
18711881
}
18721882
}
18731883
}

0 commit comments

Comments
 (0)