Merge branch 'master' of git@git.labs.intellij.net:idea/community
authorKirill Kalishev <kirill.kalishev@jetbrains.com>
Wed, 2 Dec 2009 18:56:36 +0000 (21:56 +0300)
committerKirill Kalishev <kirill.kalishev@jetbrains.com>
Wed, 2 Dec 2009 18:56:36 +0000 (21:56 +0300)
platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java

index 6bc5bd49eef94704a4f8e1a06b7e6bf7a1d6f72d..e63ec8a1c7e54ddd9c7ea67a26b1064958a1ff8b 100644 (file)
@@ -155,6 +155,8 @@ public class AbstractTreeUi {
   private Set<Object> myAutoExpandRoots = new HashSet<Object>();
   private final RegistryValue myAutoExpandDepth = Registry.get("ide.tree.autoExpandMaxDepth");
 
+  private Set<DefaultMutableTreeNode> myWillBeExpaned = new HashSet<DefaultMutableTreeNode>();
+
   protected void init(AbstractTreeBuilder builder,
                       JTree tree,
                       DefaultTreeModel treeModel,
@@ -590,6 +592,10 @@ public class AbstractTreeUi {
   }
 
   private boolean isAutoExpand(NodeDescriptor descriptor) {
+    return isAutoExpand(descriptor, true);
+  }
+
+  private boolean isAutoExpand(NodeDescriptor descriptor, boolean validate) {
     boolean autoExpand = false;
 
     if (descriptor != null) {
@@ -597,7 +603,9 @@ public class AbstractTreeUi {
     }
 
     Object element = getElementFromDescriptor(descriptor);
-    autoExpand = validateAutoExpand(autoExpand, element);
+    if (validate) {
+      autoExpand = validateAutoExpand(autoExpand, element);
+    }
 
     if (!autoExpand && !myTree.isRootVisible()) {
       if (element != null && element.equals(getTreeStructure().getRootElement())) return true;
@@ -616,10 +624,40 @@ public class AbstractTreeUi {
           autoExpand = false;
         }
       }
+
+      if (autoExpand) {
+        DefaultMutableTreeNode node = getNodeForElement(element, false);
+        if (isInVisibleAutoExpandChain(node)) {
+          autoExpand = true;
+        } else {
+          autoExpand = false;
+        }
+      }
     }
     return autoExpand;
   }
 
+  private boolean isInVisibleAutoExpandChain(DefaultMutableTreeNode child) {
+    TreeNode eachParent = child;
+    while (eachParent != null) {
+
+      if (myRootNode == eachParent) return true;
+
+      NodeDescriptor eachDescriptor = getDescriptorFrom((DefaultMutableTreeNode)eachParent);
+      if (!isAutoExpand(eachDescriptor, false)) {
+        TreePath path = getPathFor(eachParent);
+        if (myWillBeExpaned.contains(path.getLastPathComponent()) || (myTree.isExpanded(path) && myTree.isVisible(path))) {
+          return true;
+        } else {
+          return false;
+        }
+      }
+      eachParent = eachParent.getParent();
+    }
+
+    return false;
+  }
+
   private int getDistanceToAutoExpandRoot(Object element) {
     int distance = 0;
 
@@ -1036,6 +1074,12 @@ public class AbstractTreeUi {
 
           final boolean expanded = isExpanded(node, wasExpanded);
 
+          if (expanded) {
+            myWillBeExpaned.add(node);
+          } else {
+            myWillBeExpaned.remove(node);
+          }
+
           collectNodesToInsert(descriptor, elementToIndexMap, node, expanded, loadedChildren)
             .doWhenDone(new AsyncResult.Handler<ArrayList<TreeNode>>() {
               public void run(ArrayList<TreeNode> nodesToInsert) {
@@ -1045,7 +1089,7 @@ public class AbstractTreeUi {
                 removeFromUpdating(node);
 
                 if (node.getChildCount() > 0) {
-                  if (expanded) {
+                  if (expanded ) {
                     expand(node, canSmartExpand);
                   }
                 }
@@ -1059,7 +1103,11 @@ public class AbstractTreeUi {
 
                 processNodeActionsIfReady(node);
               }
-            });
+            }).doWhenProcessed(new Runnable() {
+            public void run() {
+              myWillBeExpaned.remove(node);
+            }
+          });
         }
       });
   }