diff --git a/platform/lang-impl/src/com/intellij/ide/util/gotoByName/ChooseByNameBase.java b/platform/lang-impl/src/com/intellij/ide/util/gotoByName/ChooseByNameBase.java index fd1337549522..c77c1b71fe59 100644 --- a/platform/lang-impl/src/com/intellij/ide/util/gotoByName/ChooseByNameBase.java +++ b/platform/lang-impl/src/com/intellij/ide/util/gotoByName/ChooseByNameBase.java @@ -33,6 +33,9 @@ import com.intellij.openapi.editor.colors.EditorColorsScheme; import com.intellij.openapi.keymap.Keymap; import com.intellij.openapi.keymap.KeymapManager; import com.intellij.openapi.progress.ProcessCanceledException; +import com.intellij.openapi.progress.ProgressIndicator; +import com.intellij.openapi.progress.ProgressManager; +import com.intellij.openapi.progress.Task; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.popup.*; import com.intellij.openapi.util.*; @@ -55,11 +58,10 @@ import com.intellij.ui.popup.PopupOwner; import com.intellij.ui.popup.PopupPositionManager; import com.intellij.ui.popup.PopupUpdateProcessor; import com.intellij.usageView.UsageInfo; -import com.intellij.usages.UsageInfoToUsageConverter; -import com.intellij.usages.UsageTarget; -import com.intellij.usages.UsageViewManager; -import com.intellij.usages.UsageViewPresentation; +import com.intellij.usages.*; +import com.intellij.usages.impl.UsageViewImpl; import com.intellij.util.Alarm; +import com.intellij.util.ArrayUtil; import com.intellij.util.Function; import com.intellij.util.SmartList; import com.intellij.util.containers.ContainerUtil; @@ -1379,7 +1381,7 @@ public abstract class ChooseByNameBase { }, delay, myModalityState); } - private void addElementsByPattern(Set elementsArray, String pattern) { + protected void addElementsByPattern(Set elementsArray, String pattern) { String namePattern = getNamePattern(pattern); String qualifierPattern = getQualifierPattern(pattern); @@ -1416,7 +1418,7 @@ public abstract class ChooseByNameBase { sortByProximity(sameNameElements); for (Object element : sameNameElements) { elementsArray.add(element); - if (elementsArray.size() >= myMaximumListSizeLimit) { + if (isOverflow(elementsArray)) { overflow = true; break All; } @@ -1424,7 +1426,7 @@ public abstract class ChooseByNameBase { } else if (elements.length == 1 && matchesQualifier(elements[0], qualifierPattern)) { elementsArray.add(elements[0]); - if (elementsArray.size() >= myMaximumListSizeLimit) { + if (isOverflow(elementsArray)) { overflow = true; break; } @@ -1436,6 +1438,10 @@ public abstract class ChooseByNameBase { } } + protected boolean isOverflow(Set elementsArray) { + return elementsArray.size() >= myMaximumListSizeLimit; + } + private void cancel() { if (myCanCancel) { myCancelled = true; @@ -1597,19 +1603,71 @@ public abstract class ChooseByNameBase { @Override public void actionPerformed(final AnActionEvent e) { + cancelCalcElementsThread(); + cancelListUpdater(); + final UsageViewPresentation presentation = new UsageViewPresentation(); final String pattern = myFindUsagesTitle + " \'" + myTextField.getText().trim() + "\'"; presentation.setCodeUsagesString(pattern); presentation.setTabName(pattern); presentation.setTabText(pattern); - PsiElement[] elements = getElements(); + final PsiElement[] elements = getElements(); final UsageInfo[] usages = new UsageInfo[elements.length]; for (int i = 0; i < elements.length; i++) { usages[i] = new UsageInfo(elements[i]); } - UsageViewManager.getInstance(myProject).showUsages(UsageTarget.EMPTY_ARRAY, UsageInfoToUsageConverter.convert( - new UsageInfoToUsageConverter.TargetElementsDescriptor(elements), usages), presentation); - hideHint(); + final UsageInfoToUsageConverter.TargetElementsDescriptor descriptor = + new UsageInfoToUsageConverter.TargetElementsDescriptor(elements); + final UsageViewImpl usageView = + (UsageViewImpl)UsageViewManager.getInstance(myProject).showUsages(UsageTarget.EMPTY_ARRAY, UsageInfoToUsageConverter.convert( + descriptor, usages), presentation); + if (myListModel.contains(EXTRA_ELEM)) { //start searching for the rest + final String text = myTextField.getText(); + final boolean checkboxState = myCheckBox.isSelected(); + final HashSet elementsArray = new HashSet(); + hideHint(); + ProgressManager.getInstance().run(new Task.Modal(myProject, pattern, true){ + @Override + public void run(@NotNull ProgressIndicator indicator) { + ensureNamesLoaded(checkboxState); + ApplicationManager.getApplication().runReadAction(new Runnable() { + private ChooseByNameBase.CalcElementsThread myCalcElementsThread; + + public void run() { + myCalcElementsThread = new CalcElementsThread(text, checkboxState, null, ModalityState.NON_MODAL, true) { + @Override + protected boolean isOverflow(Set elementsArray) { + return false; + } + }; + myCalcElementsThread.addElementsByPattern(elementsArray, text); + } + }); + } + + @Override + public void onSuccess() { + for (Object o : elementsArray) { + if (o instanceof PsiElement) { + if (ArrayUtil.find(elements, (PsiElement)o) > -1) { + continue; + } + usageView.appendUsage(UsageInfoToUsageConverter.convert(descriptor, new UsageInfo((PsiElement)o))); + } + } + } + + @Override + public void onCancel() { + if (myCalcElementsThread != null) { + myCalcElementsThread.cancel(); + } + usageView.close(); + } + }); + } else { + hideHint(); + } } @Override