From 7977df564199e415df1c4f014a5a89b012be217a Mon Sep 17 00:00:00 2001 From: Kirill Kalishev Date: Tue, 23 Jun 2009 14:47:26 +0400 Subject: [PATCH] ProjectView tests up again --- .../ide/projectView/BaseProjectTreeBuilder.java | 21 +++++++++++++++---- .../ide/projectView/impl/ProjectTreeBuilder.java | 4 +++- .../ide/util/treeView/AbstractTreeBuilder.java | 23 +++++++++++++++++++-- .../intellij/ide/util/treeView/AbstractTreeUi.java | 24 ++++++++++------------ 4 files changed, 52 insertions(+), 20 deletions(-) diff --git a/lang-impl/src/com/intellij/ide/projectView/BaseProjectTreeBuilder.java b/lang-impl/src/com/intellij/ide/projectView/BaseProjectTreeBuilder.java index 2cce725f8d..e2a6761644 100644 --- a/lang-impl/src/com/intellij/ide/projectView/BaseProjectTreeBuilder.java +++ b/lang-impl/src/com/intellij/ide/projectView/BaseProjectTreeBuilder.java @@ -174,12 +174,22 @@ public abstract class BaseProjectTreeBuilder extends AbstractTreeBuilder { final AbstractTreeNode root, final Object element, final Condition nonStopCondition) { - if (root.canRepresent(element)) return new AsyncResult.Done(root); + final AsyncResult async = new AsyncResult(); + + if (root.canRepresent(element)) { + expand(root, new Runnable() { + public void run() { + async.setDone(root); + } + }); + return async; + } + if (root instanceof ProjectViewNode && file != null && !((ProjectViewNode)root).contains(file)) { - return new AsyncResult.Rejected(); + async.setRejected(); + return async; } - final AsyncResult async = new AsyncResult(); expand(root, new Runnable() { public void run() { @@ -201,7 +211,10 @@ public abstract class BaseProjectTreeBuilder extends AbstractTreeBuilder { final Object element, final AsyncResult async) { - if (i >= kids.size()) return; + if (i >= kids.size()) { + async.setRejected(); + return; + } final AbstractTreeNode eachKid = kids.get(i); final boolean[] nodeWasCollapsed = new boolean[] {true}; diff --git a/lang-impl/src/com/intellij/ide/projectView/impl/ProjectTreeBuilder.java b/lang-impl/src/com/intellij/ide/projectView/impl/ProjectTreeBuilder.java index bbd80ff9c0..481322f853 100644 --- a/lang-impl/src/com/intellij/ide/projectView/impl/ProjectTreeBuilder.java +++ b/lang-impl/src/com/intellij/ide/projectView/impl/ProjectTreeBuilder.java @@ -8,6 +8,7 @@ import com.intellij.ide.projectView.ProjectViewPsiTreeChangeListener; import com.intellij.ide.util.treeView.AbstractTreeUpdater; import com.intellij.ide.util.treeView.NodeDescriptor; import com.intellij.openapi.application.ModalityState; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.ide.CopyPasteManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ModuleRootEvent; @@ -68,7 +69,8 @@ public class ProjectTreeBuilder extends BaseProjectTreeBuilder { myProblemListener = new MyProblemListener(); WolfTheProblemSolver.getInstance(project).addProblemListener(myProblemListener); - setCanYieldUpdate(true); + //todo: kirillk turn into a real test + setCanYieldUpdate(!ApplicationManager.getApplication().isUnitTestMode()); initRootNode(); } diff --git a/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeBuilder.java b/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeBuilder.java index 50685bfbc1..7cc82dcc5a 100644 --- a/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeBuilder.java +++ b/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeBuilder.java @@ -18,9 +18,12 @@ package com.intellij.ide.util.treeView; import com.intellij.ide.projectView.PresentationData; import com.intellij.openapi.Disposable; -import com.intellij.openapi.util.ActionCallback; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.progress.ProgressIndicator; +import com.intellij.openapi.util.ActionCallback; import com.intellij.util.containers.HashSet; +import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -28,11 +31,11 @@ import javax.swing.*; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreePath; +import java.lang.ref.WeakReference; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.Set; -import java.lang.ref.WeakReference; public class AbstractTreeBuilder implements Disposable { private AbstractTreeUi myUi; @@ -278,6 +281,22 @@ public class AbstractTreeBuilder implements Disposable { return true; } + protected void runOnYeildingDone(Runnable onDone) { + if (getTree().isShowing()) { + ApplicationManager.getApplication().invokeLater(onDone, ModalityState.stateForComponent(getTree())); + } else { + UIUtil.invokeLaterIfNeeded(onDone); + } + } + + protected void yield(Runnable runnable) { + SwingUtilities.invokeLater(runnable); + } + + public boolean isToYieldUpdateFor(DefaultMutableTreeNode node) { + return true; + } + public static class AbstractTreeNodeWrapper extends AbstractTreeNode { public AbstractTreeNodeWrapper() { super(null, null); 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 56f941603f..32e0b06945 100644 --- a/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java +++ b/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java @@ -828,9 +828,15 @@ class AbstractTreeUi { myYeildingNow = true; yield(new Runnable() { public void run() { + if (isReleased()) { + return; + } + runOnYeildingDone(new Runnable() { public void run() { - if (isReleased()) return; + if (isReleased()) { + return; + } executeYeildingRequest(runnable, pass); } }); @@ -893,11 +899,11 @@ class AbstractTreeUi { } protected void runOnYeildingDone(Runnable onDone) { - ApplicationManager.getApplication().invokeLater(onDone, ModalityState.stateForComponent(myTree)); + getBuilder().runOnYeildingDone(onDone); } protected void yield(Runnable runnable) { - SwingUtilities.invokeLater(runnable); + getBuilder().yield(runnable); } private ActionCallback processAllChildren(final DefaultMutableTreeNode node, @@ -932,16 +938,8 @@ class AbstractTreeUi { } private boolean isToYieldUpdateFor(final DefaultMutableTreeNode node) { - return canYield(); - //if (!canYield()) return false; - // - //final Rectangle rect = myTree.getVisibleRect(); - //final TreePath path = getPathFor(node); - //final Rectangle pathBounds = myTree.getPathBounds(path); - // - //if (pathBounds == null) return false; - // - //return rect.intersects(pathBounds) || rect.contains(pathBounds); + if (!canYield()) return false; + return getBuilder().isToYieldUpdateFor(node); } private Map collectElementToIndexMap(final NodeDescriptor descriptor) { -- 2.11.4.GIT