mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
UX-1 new SearchEverywhere popup
* deadlock fix
This commit is contained in:
+6
-3
@@ -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();
|
||||
}
|
||||
|
||||
+17
-9
@@ -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)
|
||||
|
||||
+28
-31
@@ -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);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user