UX-1 new SearchEverywhere popup

* deadlock fix
This commit is contained in:
Mikhail Sokolov
2018-06-05 17:41:54 +03:00
parent 26dfbe8efc
commit cf181fb76a
3 changed files with 51 additions and 43 deletions
@@ -6,6 +6,7 @@ import com.intellij.ide.util.gotoByName.ChooseByNameModel;
import com.intellij.ide.util.gotoByName.ChooseByNamePopup;
import com.intellij.ide.util.gotoByName.FilteringGotoByModel;
import com.intellij.openapi.actionSystem.CommonDataKeys;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.progress.ProgressIndicator;
import com.intellij.openapi.project.DumbService;
@@ -41,9 +42,11 @@ public abstract class AbstractGotoSEContributor<F> implements SearchEverywhereCo
model.setFilterItems(filter.getSelectedElements());
ChooseByNamePopup popup = ChooseByNamePopup.createPopup(myProject, model, (PsiElement)null);
ContributorSearchResult.Builder<Object> builder = ContributorSearchResult.builder();
popup.getProvider().filterElements(popup, pattern, everywhere, progressIndicator,
o -> addFoundElement(o, model, builder, progressIndicator, elementsLimit)
);
ApplicationManager.getApplication().runReadAction(() -> {
popup.getProvider().filterElements(popup, pattern, everywhere, progressIndicator,
o -> addFoundElement(o, model, builder, progressIndicator, elementsLimit)
);
});
return builder.build();
}
@@ -2,6 +2,7 @@
package com.intellij.ide.actions.searcheverywhere;
import com.google.common.collect.Lists;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.fileEditor.FileEditorManager;
import com.intellij.openapi.fileEditor.impl.EditorHistoryManager;
import com.intellij.openapi.fileTypes.FileType;
@@ -14,6 +15,7 @@ import com.intellij.psi.codeStyle.MinusculeMatcher;
import com.intellij.psi.codeStyle.NameUtil;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
@@ -53,15 +55,21 @@ public class RecentFilesSEContributor extends FileSearchEverywhereContributor {
List<VirtualFile> opened = Arrays.asList(FileEditorManager.getInstance(myProject).getSelectedFiles());
List<VirtualFile> history = Lists.reverse(EditorHistoryManager.getInstance(myProject).getFileList());
PsiManager psiManager = PsiManager.getInstance(myProject);
Stream<VirtualFile> stream = history.stream();
if (!StringUtil.isEmptyOrSpaces(pattern)) {
stream = stream.filter(file -> matcher.matches(file.getName()));
}
List<Object> res = stream.filter(vf -> !opened.contains(vf) && vf.isValid())
.distinct()
.map(vf -> psiManager.findFile(vf))
.collect(Collectors.toList());
List<Object> res = new ArrayList<>();
ApplicationManager.getApplication().runReadAction(
() -> {
PsiManager psiManager = PsiManager.getInstance(myProject);
Stream<VirtualFile> stream = history.stream();
if (!StringUtil.isEmptyOrSpaces(pattern)) {
stream = stream.filter(file -> matcher.matches(file.getName()));
}
res.addAll(stream.filter(vf -> !opened.contains(vf) && vf.isValid())
.distinct()
.map(vf -> psiManager.findFile(vf))
.collect(Collectors.toList())
);
}
);
return res.size() > elementsLimit
? new ContributorSearchResult<>(res.subList(0, elementsLimit), true)
@@ -638,36 +638,34 @@ public class SearchEverywhereUI extends BorderLayoutPanel implements Disposable,
}
private boolean addContributorItems(SearchEverywhereContributor contributor, int count, boolean clearBefore) {
boolean[] found = {false};
ApplicationManager.getApplication().runReadAction(() -> {
ContributorSearchResult<Object> results = contributor.search(pattern, isUseNonProjectItems(), myContributorFilters.get(contributor.getSearchProviderId()), myProgressIndicator, count);
found[0] = !results.isEmpty();
ContributorSearchResult<Object> results =
contributor.search(pattern, isUseNonProjectItems(), myContributorFilters.get(contributor.getSearchProviderId()), myProgressIndicator, count);
boolean found = !results.isEmpty();
if (clearBefore) {
listOperationsAlarm.cancelAllRequests();
if (clearBefore) {
listOperationsAlarm.cancelAllRequests();
}
listOperationsAlarm.addRequest(() -> {
if (isCanceled()) {
return;
}
listOperationsAlarm.addRequest(() -> {
if (isCanceled()) {
return;
}
Dimension oldSize = getPreferredSize();
if (clearBefore) {
myListModel.clear();
}
List<Object> itemsToAdd = results.getItems().stream()
.filter(o -> !myListModel.contains(o))
.collect(Collectors.toList());
if (!itemsToAdd.isEmpty()) {
myListModel.addElements(itemsToAdd, contributor, results.hasMoreItems());
ScrollingUtil.ensureSelectionExists(myResultsList);
}
firePropertyChange("preferredSize", oldSize, getPreferredSize());
}, 0);
Dimension oldSize = getPreferredSize();
if (clearBefore) {
myListModel.clear();
}
List<Object> itemsToAdd = results.getItems().stream()
.filter(o -> !myListModel.contains(o))
.collect(Collectors.toList());
if (!itemsToAdd.isEmpty()) {
myListModel.addElements(itemsToAdd, contributor, results.hasMoreItems());
ScrollingUtil.ensureSelectionExists(myResultsList);
}
firePropertyChange("preferredSize", oldSize, getPreferredSize());
}, 0);
});
return found[0];
return found;
}
protected void check() {
@@ -944,11 +942,10 @@ public class SearchEverywhereUI extends BorderLayoutPanel implements Disposable,
public void run(@NotNull ProgressIndicator indicator) {
contributorsForAdditionalSearch.forEach(contributor -> {
if (!progressIndicator.isCanceled()) {
ApplicationManager.getApplication().runReadAction(() -> {
//todo overflow #UX-1
List<Object> foundElements = contributor.search(searchText, everywhere, myContributorFilters.get(contributor.getSearchProviderId()), progressIndicator);
fillUsages(foundElements, usages, targets);
});
//todo overflow #UX-1
List<Object> foundElements =
contributor.search(searchText, everywhere, myContributorFilters.get(contributor.getSearchProviderId()), progressIndicator);
fillUsages(foundElements, usages, targets);
}
});
}