Flow.Launcher/Plugins/Flow.Launcher.Plugin.Explorer/Search/SearchManager.cs

174 lines
7.3 KiB
C#
Raw Normal View History

using Flow.Launcher.Plugin.Explorer.Search.DirectoryInfo;
2020-06-06 12:13:22 +00:00
using Flow.Launcher.Plugin.Explorer.Search.FolderLinks;
2020-05-24 09:09:44 +00:00
using Flow.Launcher.Plugin.Explorer.Search.WindowsIndex;
using Flow.Launcher.Plugin.SharedCommands;
using System;
using System.Collections.Generic;
using System.Linq;
2021-01-02 14:01:15 +00:00
using System.Threading;
using System.Threading.Tasks;
namespace Flow.Launcher.Plugin.Explorer.Search
{
public class SearchManager
{
private readonly PluginInitContext context;
private readonly IndexSearch indexSearch;
2021-01-25 03:06:03 +00:00
private readonly QuickFolderAccess quickFolderAccess;
private readonly ResultManager resultManager;
private readonly Settings settings;
2020-05-24 22:14:21 +00:00
public SearchManager(Settings settings, PluginInitContext context)
{
this.context = context;
indexSearch = new IndexSearch(context);
resultManager = new ResultManager(context);
this.settings = settings;
2021-01-25 03:06:03 +00:00
quickFolderAccess = new QuickFolderAccess(context);
}
2021-01-02 14:01:15 +00:00
internal async Task<List<Result>> SearchAsync(Query query, CancellationToken token)
{
var results = new List<Result>();
2020-05-24 09:09:44 +00:00
var querySearch = query.Search;
2020-08-25 11:38:39 +00:00
if (IsFileContentSearch(query.ActionKeyword))
2021-01-02 14:01:15 +00:00
return await WindowsIndexFileContentSearchAsync(query, querySearch, token).ConfigureAwait(false);
2020-05-24 22:14:21 +00:00
// This allows the user to type the assigned action keyword and only see the list of quick folder links
if (string.IsNullOrEmpty(query.Search))
2021-01-25 03:06:03 +00:00
return quickFolderAccess.FolderListAll(query, settings.QuickFolderAccessLinks);
2021-01-25 03:06:03 +00:00
var quickFolderLinks = quickFolderAccess.FolderListMatched(query, settings.QuickFolderAccessLinks);
if (quickFolderLinks.Count > 0)
results.AddRange(quickFolderLinks);
var isEnvironmentVariable = EnvironmentVariables.IsEnvironmentVariableSearch(querySearch);
if (isEnvironmentVariable)
return EnvironmentVariables.GetEnvironmentStringPathSuggestions(querySearch, query, context);
2020-05-24 09:09:44 +00:00
2020-05-26 11:49:59 +00:00
// Query is a location path with a full environment variable, eg. %appdata%\somefolder\
2021-01-02 14:01:15 +00:00
var isEnvironmentVariablePath = querySearch[1..].Contains("%\\");
2021-01-22 08:22:52 +00:00
if (!querySearch.IsLocationPathString() && !isEnvironmentVariablePath)
{
2021-01-02 14:01:15 +00:00
results.AddRange(await WindowsIndexFilesAndFoldersSearchAsync(query, querySearch, token).ConfigureAwait(false));
return results;
}
var locationPath = querySearch;
if (isEnvironmentVariablePath)
locationPath = EnvironmentVariables.TranslateEnvironmentVariablePath(locationPath);
// Check that actual location exists, otherwise directory search will throw directory not found exception
2020-06-02 10:21:28 +00:00
if (!FilesFolders.LocationExists(FilesFolders.ReturnPreviousDirectoryIfIncompleteString(locationPath)))
return results;
var useIndexSearch = UseWindowsIndexForDirectorySearch(locationPath);
2021-01-02 14:01:15 +00:00
results.Add(resultManager.CreateOpenCurrentFolderResult(locationPath, useIndexSearch));
2021-01-21 11:39:18 +00:00
token.ThrowIfCancellationRequested();
2021-01-02 14:01:15 +00:00
2021-01-20 05:47:25 +00:00
var directoryResult = await TopLevelDirectorySearchBehaviourAsync(WindowsIndexTopLevelFolderSearchAsync,
DirectoryInfoClassSearch,
useIndexSearch,
query,
locationPath,
2021-01-20 05:47:25 +00:00
token).ConfigureAwait(false);
2021-01-21 11:39:18 +00:00
token.ThrowIfCancellationRequested();
2021-01-20 05:47:25 +00:00
results.AddRange(directoryResult);
2021-01-21 11:39:18 +00:00
return results;
}
2021-01-02 14:01:15 +00:00
private async Task<List<Result>> WindowsIndexFileContentSearchAsync(Query query, string querySearchString, CancellationToken token)
{
var queryConstructor = new QueryConstructor(settings);
if (string.IsNullOrEmpty(querySearchString))
return new List<Result>();
2021-01-02 14:01:15 +00:00
return await indexSearch.WindowsIndexSearchAsync(querySearchString,
queryConstructor.CreateQueryHelper().ConnectionString,
queryConstructor.QueryForFileContentSearch,
2021-01-02 14:01:15 +00:00
query,
token).ConfigureAwait(false);
}
public bool IsFileContentSearch(string actionKeyword)
{
return actionKeyword == settings.FileContentSearchActionKeyword;
}
private List<Result> DirectoryInfoClassSearch(Query query, string querySearch, CancellationToken token)
{
var directoryInfoSearch = new DirectoryInfoSearch(context);
return directoryInfoSearch.TopLevelDirectorySearch(query, querySearch, token);
}
2021-01-02 14:01:15 +00:00
public async Task<List<Result>> TopLevelDirectorySearchBehaviourAsync(
Func<Query, string, CancellationToken, Task<List<Result>>> windowsIndexSearch,
Func<Query, string, CancellationToken, List<Result>> directoryInfoClassSearch,
bool useIndexSearch,
Query query,
2021-01-02 14:01:15 +00:00
string querySearchString,
CancellationToken token)
{
if (!useIndexSearch)
return directoryInfoClassSearch(query, querySearchString, token);
2021-01-02 14:01:15 +00:00
return await windowsIndexSearch(query, querySearchString, token);
}
2020-05-19 12:38:42 +00:00
2021-01-02 14:01:15 +00:00
private async Task<List<Result>> WindowsIndexFilesAndFoldersSearchAsync(Query query, string querySearchString, CancellationToken token)
2020-05-19 12:38:42 +00:00
{
var queryConstructor = new QueryConstructor(settings);
2020-05-19 12:38:42 +00:00
2021-01-02 14:01:15 +00:00
return await indexSearch.WindowsIndexSearchAsync(querySearchString,
queryConstructor.CreateQueryHelper().ConnectionString,
queryConstructor.QueryForAllFilesAndFolders,
2021-01-02 14:01:15 +00:00
query,
token).ConfigureAwait(false);
2020-05-19 12:38:42 +00:00
}
2021-01-02 14:01:15 +00:00
private async Task<List<Result>> WindowsIndexTopLevelFolderSearchAsync(Query query, string path, CancellationToken token)
{
var queryConstructor = new QueryConstructor(settings);
2021-01-02 14:01:15 +00:00
return await indexSearch.WindowsIndexSearchAsync(path,
queryConstructor.CreateQueryHelper().ConnectionString,
queryConstructor.QueryForTopLevelDirectorySearch,
2021-01-02 14:01:15 +00:00
query,
token).ConfigureAwait(false);
}
private bool UseWindowsIndexForDirectorySearch(string locationPath)
{
var pathToDirectory = FilesFolders.ReturnPreviousDirectoryIfIncompleteString(locationPath);
if (!settings.UseWindowsIndexForDirectorySearch)
return false;
if (settings.IndexSearchExcludedSubdirectoryPaths
.Any(x => FilesFolders.ReturnPreviousDirectoryIfIncompleteString(pathToDirectory)
.StartsWith(x.Path, StringComparison.OrdinalIgnoreCase)))
return false;
return indexSearch.PathIsIndexed(pathToDirectory);
}
}
}