From 8560cca84633a7611df0b32599db3862f52d54f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Kubitz?= Date: Fri, 10 Jan 2025 16:07:06 +0100 Subject: [PATCH] AbstractTreeViewer do not auto-expand same nodes multiple times fixes slow (Quick-)Type hierarchy for redundant superinterfaces https://github.com/eclipse-jdt/eclipse.jdt.ui/issues/1830 --- .../eclipse/jface/viewers/AbstractTreeViewer.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) 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 0bdc435dea4..58f764897b7 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 @@ -25,9 +25,11 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; import java.util.List; +import java.util.Set; import java.util.function.Function; import org.eclipse.core.runtime.Assert; @@ -1850,6 +1852,11 @@ protected Widget internalGetWidgetToSelect(Object elementOrTreePath) { */ private void internalConditionalExpandToLevel(Widget widget, int level, Function shouldChildrenExpand) { + internalConditionalExpandToLevel(widget, level, shouldChildrenExpand, new HashSet<>()); + } + + private void internalConditionalExpandToLevel(Widget widget, int level, + Function shouldChildrenExpand, Set expanded) { if (level == ALL_LEVELS || level > 0) { Object data = widget.getData(); if (widget instanceof Item it && data != null && !isExpandable(it, null, data)) { @@ -1858,6 +1865,9 @@ private void internalConditionalExpandToLevel(Widget widget, int level, createChildren(widget, false); // XXX for performance widget should be expanded after expanding children: if (widget instanceof Item it) { + if (data != null && !expanded.add(data)) { + return; + } setExpanded(it, true); } if (level == ALL_LEVELS || level > 1) { @@ -1867,7 +1877,7 @@ private void internalConditionalExpandToLevel(Widget widget, int level, : level - 1); for (Item element : children) { if (shouldChildrenExpand.apply(widget).booleanValue()) { - internalConditionalExpandToLevel(element, newLevel, shouldChildrenExpand); + internalConditionalExpandToLevel(element, newLevel, shouldChildrenExpand, expanded); } } }