2525import java .util .ArrayList ;
2626import java .util .Arrays ;
2727import java .util .Collection ;
28+ import java .util .HashSet ;
2829import java .util .Iterator ;
2930import java .util .LinkedList ;
3031import java .util .List ;
32+ import java .util .Set ;
3133import java .util .function .Function ;
3234
3335import 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