TreeUi: lost nodes fixed when tree gets collapsed on expansion callback
[idea/community.git] / platform / platform-api / src / com / intellij / ide / util / treeView / AbstractTreeBuilder.java
index b0ab02fd1bfba796bf539b2ad3aa6d77f859f37c..8bc11f45c984d66d99610368c543be7cdc95add2 100644 (file)
@@ -82,31 +82,31 @@ public class AbstractTreeBuilder implements Disposable {
   }
 
   public final void select(final Object element, @Nullable final Runnable onDone) {
-    getUi().userSelect(new Object[] {element}, onDone, false, true);
+    getUi().userSelect(new Object[] {element}, new UserRunnable(onDone), false, true);
   }
 
   public final void select(final Object element, @Nullable final Runnable onDone, boolean addToSelection) {
-    getUi().userSelect(new Object[] {element}, onDone, addToSelection, true);
+    getUi().userSelect(new Object[] {element}, new UserRunnable(onDone), addToSelection, true);
   }
 
   public final void select(final Object[] elements, @Nullable final Runnable onDone) {
-    getUi().userSelect(elements, onDone, false, true);
+    getUi().userSelect(elements, new UserRunnable(onDone), false, true);
   }
 
   public final void select(final Object[] elements, @Nullable final Runnable onDone, boolean addToSelection) {
-    getUi().userSelect(elements, onDone, addToSelection, true);
+    getUi().userSelect(elements, new UserRunnable(onDone), addToSelection, true);
   }
 
   public final void expand(Object element, @Nullable Runnable onDone) {
-    getUi().expand(element, onDone);
+    getUi().expand(element, new UserRunnable(onDone));
   }
 
   public final void expand(Object[] element, @Nullable Runnable onDone) {
-    getUi().expand(element, onDone);
+    getUi().expand(element, new UserRunnable(onDone));
   }
 
   public final void collapseChildren(Object element, @Nullable Runnable onDone) {
-    getUi().collapseChildren(element, onDone);
+    getUi().collapseChildren(element, new UserRunnable(onDone));
   }
 
 
@@ -501,4 +501,25 @@ public class AbstractTreeBuilder implements Disposable {
     return builder != null && builder.getUi() != null ? builder.getUi().isToPaintSelection() : true;
   }
 
+  class UserRunnable implements Runnable {
+
+    private Runnable myRunnable;
+
+    public UserRunnable(Runnable runnable) {
+      myRunnable = runnable;
+    }
+
+    @Override
+    public void run() {
+      if (myRunnable != null) {
+        AbstractTreeUi ui = getUi();
+        if (ui != null) {
+          ui.executeUserRunnable(myRunnable);
+        } else {
+          myRunnable.run();
+        }
+      }
+    }
+  }
+
 }