diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml index 031cb108b..b23931fcf 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml @@ -12,6 +12,8 @@ Assigning the global action keyword could bring up too many results during search. Please choose a specific action keyword The required service for Windows Index Search does not appear to be running To fix this, start the Windows Search service. Select here to remove this warning + The warning message has been switched off. As an alternative for searching files and folders, would you like to install Everything plugin?{0}{0}Select 'Yes' to install Everything plugin, or 'No' to return + Explorer Alternative Delete diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/SearchManager.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/SearchManager.cs index c7b1b6180..d86007e74 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Search/SearchManager.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/SearchManager.cs @@ -14,12 +14,12 @@ namespace Flow.Launcher.Plugin.Explorer.Search { internal static PluginInitContext Context; - private readonly Settings settings; + internal static Settings Settings; public SearchManager(Settings settings, PluginInitContext context) { Context = context; - this.settings = settings; + Settings = settings; } private class PathEqualityComparator : IEqualityComparer @@ -71,14 +71,14 @@ namespace Flow.Launcher.Plugin.Explorer.Search return allowedActionKeyword switch { - Settings.ActionKeyword.SearchActionKeyword => settings.SearchActionKeywordEnabled && - keyword == settings.SearchActionKeyword, - Settings.ActionKeyword.PathSearchActionKeyword => settings.PathSearchKeywordEnabled && - keyword == settings.PathSearchActionKeyword, + Settings.ActionKeyword.SearchActionKeyword => Settings.SearchActionKeywordEnabled && + keyword == Settings.SearchActionKeyword, + Settings.ActionKeyword.PathSearchActionKeyword => Settings.PathSearchKeywordEnabled && + keyword == Settings.PathSearchActionKeyword, Settings.ActionKeyword.FileContentSearchActionKeyword => keyword == - settings.FileContentSearchActionKeyword, - Settings.ActionKeyword.IndexSearchActionKeyword => settings.IndexOnlySearchKeywordEnabled && - keyword == settings.IndexSearchActionKeyword + Settings.FileContentSearchActionKeyword, + Settings.ActionKeyword.IndexSearchActionKeyword => Settings.IndexOnlySearchKeywordEnabled && + keyword == Settings.IndexSearchActionKeyword }; } @@ -88,11 +88,11 @@ namespace Flow.Launcher.Plugin.Explorer.Search // This allows the user to type the assigned action keyword and only see the list of quick folder links if (string.IsNullOrEmpty(query.Search)) - return QuickAccess.AccessLinkListAll(query, settings.QuickAccessLinks); + return QuickAccess.AccessLinkListAll(query, Settings.QuickAccessLinks); var results = new HashSet(PathEqualityComparator.Instance); - var quickaccessLinks = QuickAccess.AccessLinkListMatched(query, settings.QuickAccessLinks); + var quickaccessLinks = QuickAccess.AccessLinkListMatched(query, Settings.QuickAccessLinks); results.UnionWith(quickaccessLinks); @@ -136,7 +136,7 @@ namespace Flow.Launcher.Plugin.Explorer.Search private async Task> WindowsIndexFileContentSearchAsync(Query query, string querySearchString, CancellationToken token) { - var queryConstructor = new QueryConstructor(settings); + var queryConstructor = new QueryConstructor(Settings); if (string.IsNullOrEmpty(querySearchString)) return new List(); @@ -145,14 +145,14 @@ namespace Flow.Launcher.Plugin.Explorer.Search querySearchString, queryConstructor.CreateQueryHelper, queryConstructor.QueryForFileContentSearch, - settings.IndexSearchExcludedSubdirectoryPaths, + Settings.IndexSearchExcludedSubdirectoryPaths, query, token).ConfigureAwait(false); } public bool IsFileContentSearch(string actionKeyword) { - return actionKeyword == settings.FileContentSearchActionKeyword; + return actionKeyword == Settings.FileContentSearchActionKeyword; } private List DirectoryInfoClassSearch(Query query, string querySearch, CancellationToken token) @@ -177,13 +177,13 @@ namespace Flow.Launcher.Plugin.Explorer.Search private async Task> WindowsIndexFilesAndFoldersSearchAsync(Query query, string querySearchString, CancellationToken token) { - var queryConstructor = new QueryConstructor(settings); + var queryConstructor = new QueryConstructor(Settings); return await IndexSearch.WindowsIndexSearchAsync( querySearchString, queryConstructor.CreateQueryHelper, queryConstructor.QueryForAllFilesAndFolders, - settings.IndexSearchExcludedSubdirectoryPaths, + Settings.IndexSearchExcludedSubdirectoryPaths, query, token).ConfigureAwait(false); } @@ -191,12 +191,12 @@ namespace Flow.Launcher.Plugin.Explorer.Search private async Task> WindowsIndexTopLevelFolderSearchAsync(Query query, string path, CancellationToken token) { - var queryConstructor = new QueryConstructor(settings); + var queryConstructor = new QueryConstructor(Settings); return await IndexSearch.WindowsIndexSearchAsync(path, queryConstructor.CreateQueryHelper, queryConstructor.QueryForTopLevelDirectorySearch, - settings.IndexSearchExcludedSubdirectoryPaths, + Settings.IndexSearchExcludedSubdirectoryPaths, query, token).ConfigureAwait(false); } @@ -205,10 +205,10 @@ namespace Flow.Launcher.Plugin.Explorer.Search { var pathToDirectory = FilesFolders.ReturnPreviousDirectoryIfIncompleteString(locationPath); - if (!settings.UseWindowsIndexForDirectorySearch) + if (!Settings.UseWindowsIndexForDirectorySearch) return false; - if (settings.IndexSearchExcludedSubdirectoryPaths + if (Settings.IndexSearchExcludedSubdirectoryPaths .Any(x => FilesFolders.ReturnPreviousDirectoryIfIncompleteString(pathToDirectory) .StartsWith(x.Path, StringComparison.OrdinalIgnoreCase))) return false; diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/WindowsIndex/IndexSearch.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/WindowsIndex/IndexSearch.cs index c22b489e2..7890209db 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Search/WindowsIndex/IndexSearch.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/WindowsIndex/IndexSearch.cs @@ -3,10 +3,12 @@ using Microsoft.Search.Interop; using System; using System.Collections.Generic; using System.Data.OleDb; +using System.Linq; using System.Runtime.InteropServices; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; +using System.Windows; namespace Flow.Launcher.Plugin.Explorer.Search.WindowsIndex { @@ -107,12 +109,43 @@ namespace Flow.Launcher.Plugin.Explorer.Search.WindowsIndex catch (COMException) { // Occurs because the Windows Indexing (WSearch) is turned off in services and unable to be used by Explorer plugin + if (!SearchManager.Settings.WarnWindowsSearchServiceOff) + return new List(); + + var api = SearchManager.Context.API; + return new List { new Result { - Title = SearchManager.Context.API.GetTranslation("plugin_explorer_windowsSearchServiceNotRunning"), - SubTitle = SearchManager.Context.API.GetTranslation("plugin_explorer_windowsSearchServiceFix"), + Title = api.GetTranslation("plugin_explorer_windowsSearchServiceNotRunning"), + SubTitle = api.GetTranslation("plugin_explorer_windowsSearchServiceFix"), + Action = c => + { + SearchManager.Settings.WarnWindowsSearchServiceOff = false; + + if (MessageBox.Show(string.Format(api.GetTranslation("plugin_explorer_alternative"), Environment.NewLine), + api.GetTranslation("plugin_explorer_alternative_title"), + MessageBoxButton.YesNo) == MessageBoxResult.Yes) + { + var pluginsManagerPlugins= api.GetAllPlugins().FirstOrDefault(x => x.Metadata.ID == "9f8f9b14-2518-4907-b211-35ab6290dee7"); + + api.ChangeQuery(string.Format("{0} install everything", pluginsManagerPlugins.Metadata.ActionKeywords[0])); + } + else + { + // Clears the warning message because same query string will not alter the displayed result list + api.ChangeQuery(string.Empty); + + api.ChangeQuery(query.RawQuery); + } + + var mainWindow = Application.Current.MainWindow; + mainWindow.Visibility = Visibility.Visible; + mainWindow.Focus(); + + return false; + }, IcoPath = Constants.ExplorerIconImagePath } }; diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs index 13f938dea..88656a401 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs @@ -1,4 +1,4 @@ -using Flow.Launcher.Plugin.Explorer.Search; +using Flow.Launcher.Plugin.Explorer.Search; using Flow.Launcher.Plugin.Explorer.Search.QuickAccessLinks; using Microsoft.AspNetCore.DataProtection.AuthenticatedEncryption; using System; @@ -33,6 +33,8 @@ namespace Flow.Launcher.Plugin.Explorer public bool IndexOnlySearchKeywordEnabled { get; set; } + public bool WarnWindowsSearchServiceOff { get; set; } = true; + internal enum ActionKeyword { SearchActionKeyword,