UX-1 new SearchEverywhere popup

* dumb mode listening
This commit is contained in:
Mikhail Sokolov
2018-05-25 17:24:35 +03:00
parent d5e6650e61
commit 9c736f8c29
4 changed files with 48 additions and 25 deletions
@@ -11,6 +11,10 @@ public class ContributorSearchResult<T> {
return new Builder<>();
}
public static <E> ContributorSearchResult<E> empty() {
return new ContributorSearchResult<>(Collections.emptyList(), false);
}
public ContributorSearchResult(List<T> items, boolean hasMoreItems) {
this.items = items;
this.hasMoreItems = hasMoreItems;
@@ -8,6 +8,7 @@ import com.intellij.openapi.actionSystem.CommonDataKeys;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.progress.ProgressIndicator;
import com.intellij.openapi.project.DumbService;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
@@ -27,6 +28,10 @@ public abstract class AbstractGotoSEContributor implements SearchEverywhereContr
@Override
public ContributorSearchResult<Object> search(Project project, String pattern, boolean everywhere, ProgressIndicator progressIndicator, int elementsLimit) {
if (!isDumbModeSupported() && DumbService.getInstance(project).isDumb()) {
return ContributorSearchResult.empty();
}
ChooseByNameModel model = createModel(project);
ChooseByNamePopup popup = ChooseByNamePopup.createPopup(project, model, (PsiElement)null);
ContributorSearchResult.Builder<Object> builder = ContributorSearchResult.builder();
@@ -84,4 +89,8 @@ public abstract class AbstractGotoSEContributor implements SearchEverywhereContr
return null;
}
protected boolean isDumbModeSupported() {
return false;
}
}
@@ -68,4 +68,9 @@ public class FileSearchEverywhereContributor extends AbstractGotoSEContributor {
return super.getItemData(dataId, element);
}
@Override
protected boolean isDumbModeSupported() {
return true;
}
}
@@ -488,6 +488,13 @@ public class SearchEverywhereUI extends BorderLayoutPanel implements Disposable,
updateHint(selectedValue);
}
});
myProject.getMessageBus().connect(this).subscribe(DumbService.DUMB_MODE, new DumbService.DumbModeListener() {
@Override
public void exitDumbMode() {
ApplicationManager.getApplication().invokeLater(() -> rebuildList());
}
});
}
private void elementSelected(int i, int modifiers) {
@@ -603,34 +610,32 @@ public class SearchEverywhereUI extends BorderLayoutPanel implements Disposable,
}
private void addContributorItems(SearchEverywhereContributor contributor, int count, boolean clearBefore) {
if (!DumbService.getInstance(project).isDumb()) {
ApplicationManager.getApplication().runReadAction(() -> {
ContributorSearchResult<Object> results = contributor.search(project, pattern, isUseNonProjectItems(), myProgressIndicator, count);
ApplicationManager.getApplication().runReadAction(() -> {
ContributorSearchResult<Object> results = contributor.search(project, pattern, isUseNonProjectItems(), myProgressIndicator, count);
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);
});
}
protected void check() {