From a45f885eb779f918aa9eb3fc77d6e6c3ec79b22b Mon Sep 17 00:00:00 2001 From: Peter Gromov Date: Tue, 8 Sep 2009 16:34:41 +0400 Subject: [PATCH] 'down' overriden/subclasses gutter navigation made progressable and cancellable --- .../codeInsight/daemon/impl/MarkerType.java | 31 ++++++++++++++++--- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/MarkerType.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/MarkerType.java index 57e8282c5ae3..c4587013ba3d 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/MarkerType.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/MarkerType.java @@ -14,10 +14,13 @@ import com.intellij.psi.search.searches.OverridingMethodsSearch; import com.intellij.psi.search.searches.ClassInheritorsSearch; import com.intellij.util.Function; import com.intellij.util.NullableFunction; +import com.intellij.util.CommonProcessors; import com.intellij.ide.util.MethodCellRenderer; import com.intellij.ide.util.PsiClassListCellRenderer; +import com.intellij.openapi.progress.ProgressManager; import org.jetbrains.annotations.NonNls; +import javax.swing.*; import java.util.Comparator; import java.util.Arrays; import java.awt.event.MouseEvent; @@ -89,8 +92,18 @@ public enum MarkerType { public void browse(MouseEvent e, PsiElement element) { PsiElement parent = element.getParent(); if (!(parent instanceof PsiMethod)) return; - PsiMethod method = (PsiMethod)parent; - PsiMethod[] overridings = OverridingMethodsSearch.search(method, method.getUseScope(), true).toArray(PsiMethod.EMPTY_ARRAY); + + final PsiMethod method = (PsiMethod)parent; + final CommonProcessors.CollectProcessor collectProcessor = new CommonProcessors.CollectProcessor(); + if (!ProgressManager.getInstance().runProcessWithProgressSynchronously(new Runnable() { + public void run() { + OverridingMethodsSearch.search(method, method.getUseScope(), true).forEach(collectProcessor); + } + }, "Searching for overridding methods", true, method.getProject(), (JComponent)e.getComponent())) { + return; + } + + PsiMethod[] overridings = collectProcessor.toArray(PsiMethod.EMPTY_ARRAY); if (overridings.length == 0) return; String title = method.hasModifierProperty(PsiModifier.ABSTRACT) ? DaemonBundle .message("navigation.title.implementation.method", method.getName(), overridings.length) : @@ -132,8 +145,18 @@ public enum MarkerType { public void browse(MouseEvent e, PsiElement element) { PsiElement parent = element.getParent(); if (!(parent instanceof PsiClass)) return; - PsiClass aClass = (PsiClass)parent; - PsiClass[] inheritors = ClassInheritorsSearch.search(aClass, aClass.getUseScope(), true).toArray(PsiClass.EMPTY_ARRAY); + + final PsiClass aClass = (PsiClass)parent; + final CommonProcessors.CollectProcessor collectProcessor = new CommonProcessors.CollectProcessor(); + if (!ProgressManager.getInstance().runProcessWithProgressSynchronously(new Runnable() { + public void run() { + ClassInheritorsSearch.search(aClass, aClass.getUseScope(), true).forEach(collectProcessor); + } + }, "Searching for overridden methods", true, aClass.getProject(), (JComponent)e.getComponent())) { + return; + } + + PsiClass[] inheritors = collectProcessor.toArray(PsiClass.EMPTY_ARRAY); if (inheritors.length == 0) return; String title = aClass.isInterface() ? CodeInsightBundle.message("goto.implementation.chooser.title", aClass.getName(), inheritors.length)