From e0487556f08d3b142c12e903dafe59e7b2384000 Mon Sep 17 00:00:00 2001 From: Kirill Kalishev Date: Thu, 25 Jun 2009 09:21:21 +0400 Subject: [PATCH] TreeUi: auto-expand nodes fixed and "loading" node is back again --- .../intellij/ide/util/treeView/AbstractTreeUi.java | 63 ++++++++++++---------- .../src/com/intellij/ui/treeStructure/Tree.java | 9 +++- .../src/com/intellij/util/ui/AnimatedIcon.java | 6 ++- 3 files changed, 48 insertions(+), 30 deletions(-) diff --git a/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java b/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java index 0fd2d92f8a..54ed6acb38 100644 --- a/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java +++ b/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java @@ -619,7 +619,7 @@ class AbstractTreeUi { if (descriptor == null) return; if (myUnbuiltNodes.contains(node)) { - processUnbuilt(node, descriptor); + processUnbuilt(node, descriptor, pass); processNodeActionsIfReady(node); return; } @@ -633,6 +633,10 @@ class AbstractTreeUi { myUpdatingChildren.add(node); processAllChildren(node, elementToIndexMap, pass).doWhenDone(new Runnable() { public void run() { + if (canYield()) { + removeLoadingNode(node); + } + ArrayList nodesToInsert = collectNodesToInsert(descriptor, elementToIndexMap); insertNodesInto(nodesToInsert, node); @@ -716,19 +720,31 @@ class AbstractTreeUi { } } - private void processUnbuilt(final DefaultMutableTreeNode node, final NodeDescriptor descriptor) { + private void processUnbuilt(final DefaultMutableTreeNode node, final NodeDescriptor descriptor, final TreeUpdatePass pass) { if (getBuilder().isAlwaysShowPlus(descriptor)) return; // check for isAlwaysShowPlus is important for e.g. changing Show Members state! - if (getTreeStructure().isToBuildChildrenInBackground(getBuilder().getTreeStructureElement(descriptor))) return; //? + final Object element = getBuilder().getTreeStructureElement(descriptor); - Object[] children = getChildrenFor(getBuilder().getTreeStructureElement(descriptor)); + if (getTreeStructure().isToBuildChildrenInBackground(element)) return; //? + + final Object[] children = getChildrenFor(element); if (children.length == 0) { removeLoadingNode(node); } else if (getBuilder().isAutoExpandNode((NodeDescriptor)node.getUserObject())) { addNodeAction(getElementFor(node), new NodeAction() { public void onReady(final DefaultMutableTreeNode node) { - removeLoadingNode(node); + final TreePath path = new TreePath(node.getPath()); + if (getTree().isExpanded(path) || children.length == 0) { + removeLoadingNode(node); + } else { + maybeYeild(new ActiveRunnable() { + public ActionCallback run() { + expand(element, null); + return new ActionCallback.Done(); + } + }, pass, node); + } } }); } @@ -2147,35 +2163,28 @@ class AbstractTreeUi { final DefaultMutableTreeNode node = (DefaultMutableTreeNode)path.getLastPathComponent(); if (!myUnbuiltNodes.contains(node)) return; myUnbuiltNodes.remove(node); - final Alarm alarm = new Alarm(Alarm.ThreadToUse.SHARED_THREAD); - alarm.addRequest(new Runnable() { - public void run() { - myTree.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - } - }, WAIT_CURSOR_DELAY); getBuilder().expandNodeChildren(node); - final Object element = getElementFor(node); - - for (int i = 0; i < node.getChildCount(); i++) { - removeIfLoading(node.getChildAt(i)); - } + runDone(new Runnable() { + public void run() { + final Object element = getElementFor(node); - if (node.getChildCount() == 0) { - addNodeAction(element, new NodeAction() { - public void onReady(final DefaultMutableTreeNode node) { - expand(element, null); + for (int i = 0; i < node.getChildCount(); i++) { + removeIfLoading(node.getChildAt(i)); } - }); - } - int n = alarm.cancelAllRequests(); - if (n == 0) { - myTree.setCursor(Cursor.getDefaultCursor()); - } + if (node.getChildCount() == 0) { + addNodeAction(element, new NodeAction() { + public void onReady(final DefaultMutableTreeNode node) { + expand(element, null); + } + }); + } - processSmartExpand(node); + processSmartExpand(node); + } + }); } public void treeCollapsed(TreeExpansionEvent e) { diff --git a/platform-api/src/com/intellij/ui/treeStructure/Tree.java b/platform-api/src/com/intellij/ui/treeStructure/Tree.java index 9d154f56a0..0be29e5d18 100644 --- a/platform-api/src/com/intellij/ui/treeStructure/Tree.java +++ b/platform-api/src/com/intellij/ui/treeStructure/Tree.java @@ -478,9 +478,14 @@ public class Tree extends JTree implements Autoscroll, TestableUi { myBusyIcon.resume(); } else { myBusyIcon.suspend(); + SwingUtilities.invokeLater(new Runnable() { + public void run() { + if (myBusyIcon != null) { + repaint(); + } + } + }); } - - updateBusyIconLocation(); } } diff --git a/platform-api/src/com/intellij/util/ui/AnimatedIcon.java b/platform-api/src/com/intellij/util/ui/AnimatedIcon.java index d6bb8742b5..74d1bf283c 100644 --- a/platform-api/src/com/intellij/util/ui/AnimatedIcon.java +++ b/platform-api/src/com/intellij/util/ui/AnimatedIcon.java @@ -39,6 +39,8 @@ public abstract class AnimatedIcon extends JComponent implements Disposable { private final String myName; + private boolean myLastPaintWasRunning; + protected AnimatedIcon(final String name) { myName = name; } @@ -134,7 +136,7 @@ public abstract class AnimatedIcon extends JComponent implements Disposable { } protected void paintComponent(Graphics g) { - if (isOpaque()) { + if (isOpaque() && (myAnimator.isRunning() || myPaintPassive || (myLastPaintWasRunning && !myAnimator.isRunning()))) { g.setColor(UIUtil.getBgFillColor(this)); g.fillRect(0, 0, getWidth(), getHeight()); } @@ -152,6 +154,8 @@ public abstract class AnimatedIcon extends JComponent implements Disposable { int y = (size.height - icon.getIconHeight()) / 2; icon.paintIcon(this, g, x, y); + + myLastPaintWasRunning = myAnimator.isRunning(); } protected Icon getPassiveIcon() { -- 2.11.4.GIT