diff --git a/platform/lang-api/src/com/intellij/ide/actions/searcheverywhere/ContributorSearchResult.java b/platform/lang-api/src/com/intellij/ide/actions/searcheverywhere/ContributorSearchResult.java index 3355b2d118c6..16e89c0ac9b5 100644 --- a/platform/lang-api/src/com/intellij/ide/actions/searcheverywhere/ContributorSearchResult.java +++ b/platform/lang-api/src/com/intellij/ide/actions/searcheverywhere/ContributorSearchResult.java @@ -20,6 +20,10 @@ public class ContributorSearchResult { this.hasMoreItems = hasMoreItems; } + public ContributorSearchResult(List items) { + this(items, false); + } + public List getItems() { return items; } diff --git a/platform/lang-impl/src/com/intellij/ide/actions/searcheverywhere/RecentFilesSEContributor.java b/platform/lang-impl/src/com/intellij/ide/actions/searcheverywhere/RecentFilesSEContributor.java new file mode 100644 index 000000000000..f73a228c8978 --- /dev/null +++ b/platform/lang-impl/src/com/intellij/ide/actions/searcheverywhere/RecentFilesSEContributor.java @@ -0,0 +1,65 @@ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package com.intellij.ide.actions.searcheverywhere; + +import com.google.common.collect.Lists; +import com.intellij.openapi.fileEditor.FileEditorManager; +import com.intellij.openapi.fileEditor.impl.EditorHistoryManager; +import com.intellij.openapi.progress.ProgressIndicator; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiManager; +import com.intellij.psi.codeStyle.MinusculeMatcher; +import com.intellij.psi.codeStyle.NameUtil; +import org.jetbrains.annotations.NotNull; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class RecentFilesSEContributor extends FileSearchEverywhereContributor { + + @NotNull + @Override + public String getSearchProviderId() { + return RecentFilesSEContributor.class.getSimpleName(); + } + + @NotNull + @Override + public String getGroupName() { + return "Recent Files"; + } + + @Override + public String includeNonProjectItemsText() { + return null; + } + + @Override + public int getSortWeight() { + return 70; + } + + @Override + public ContributorSearchResult search(Project project, String pattern, boolean everywhere, ProgressIndicator progressIndicator, int elementsLimit) { + MinusculeMatcher matcher = NameUtil.buildMatcher("*" + pattern).build(); + List opened = Arrays.asList(FileEditorManager.getInstance(project).getSelectedFiles()); + List history = Lists.reverse(EditorHistoryManager.getInstance(project).getFileList()); + + PsiManager psiManager = PsiManager.getInstance(project); + Stream stream = history.stream(); + if (!StringUtil.isEmptyOrSpaces(pattern)) { + stream = stream.filter(file -> matcher.matches(file.getName())); + } + List res = 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) + : new ContributorSearchResult<>(res); + } +} diff --git a/platform/lang-impl/src/com/intellij/ide/actions/searcheverywhere/SearchEverywhereManagerImpl.java b/platform/lang-impl/src/com/intellij/ide/actions/searcheverywhere/SearchEverywhereManagerImpl.java index 60bc21967669..58b59d77880a 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/searcheverywhere/SearchEverywhereManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/searcheverywhere/SearchEverywhereManagerImpl.java @@ -49,6 +49,8 @@ public class SearchEverywhereManagerImpl implements SearchEverywhereManager { // fill service contributors TopHitSEContributor topHitContributor = new TopHitSEContributor(s -> mySearchEverywhereUI.getSearchField().setText(s)); myServiceContributors.add(topHitContributor); + RecentFilesSEContributor recentContributor = new RecentFilesSEContributor(); + myServiceContributors.add(recentContributor); } @Override diff --git a/platform/lang-impl/src/com/intellij/ide/actions/searcheverywhere/SearchEverywhereUI.java b/platform/lang-impl/src/com/intellij/ide/actions/searcheverywhere/SearchEverywhereUI.java index 2d690679023b..716eb7cd1ea6 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/searcheverywhere/SearchEverywhereUI.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/searcheverywhere/SearchEverywhereUI.java @@ -619,7 +619,7 @@ public class SearchEverywhereUI extends BorderLayoutPanel implements Disposable, } else { boolean clearBefore = true; for (SearchEverywhereContributor contributor : allContributors) { - anyFound = anyFound || addContributorItems(contributor, MULTIPLE_CONTRIBUTORS_ELEMENTS_LIMIT, clearBefore); + anyFound |= addContributorItems(contributor, MULTIPLE_CONTRIBUTORS_ELEMENTS_LIMIT, clearBefore); clearBefore = false; } }