diff --git a/Wox.Core/Plugin/PluginManager.cs b/Wox.Core/Plugin/PluginManager.cs index 9fcd7a36b1..7aaa7cb724 100644 --- a/Wox.Core/Plugin/PluginManager.cs +++ b/Wox.Core/Plugin/PluginManager.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; @@ -90,7 +91,7 @@ namespace Wox.Core.Plugin { Stopwatch sw = new Stopwatch(); sw.Start(); - pair.Plugin.Init(new PluginInitContext() + pair.Plugin.Init(new PluginInitContext { CurrentPluginMetadata = pair.Metadata, Proxy = HttpProxy.Instance, @@ -114,7 +115,7 @@ namespace Wox.Core.Plugin PluginInstaller.Install(path); } - public static void Query(Query query) + public static void QueryForAllPlugins(Query query) { query.ActionKeyword = string.Empty; query.Search = query.RawQuery; @@ -125,9 +126,38 @@ namespace Wox.Core.Plugin } if (!string.IsNullOrEmpty(query.ActionKeyword)) { - query.Search = string.Join(Wox.Plugin.Query.Seperater, query.Terms.Skip(1).ToArray()); + query.Search = string.Join(Query.Seperater, query.Terms.Skip(1).ToArray()); + } + QueryDispatch(query); + } + + private static void QueryDispatch(Query query) + { + var pluginPairs = IsExclusivePluginQuery(query) ? GetExclusivePlugins(query) : GetGenericPlugins(); + foreach (var plugin in pluginPairs) + { + var customizedPluginConfig = UserSettingStorage.Instance. + CustomizedPluginConfigs.FirstOrDefault(o => o.ID == plugin.Metadata.ID); + if (customizedPluginConfig != null && customizedPluginConfig.Disabled) + { + return; + } + if (query.IsIntantQuery && IsInstantSearchPlugin(plugin.Metadata)) + { + Debug.WriteLine(string.Format("Plugin {0} is executing instant search.", plugin.Metadata.Name)); + using (new Timeit(" => instant search took: ")) + { + QueryForPlugin(plugin, query); + } + } + else + { + ThreadPool.QueueUserWorkItem(state => + { + QueryForPlugin(plugin, query); + }); + } } - QueryDispatcher.QueryDispatcher.Dispatch(query); } public static List AllPlugins @@ -170,14 +200,14 @@ namespace Wox.Core.Plugin return LoadInstantSearches().Any(o => o.Value.IsInstantQuery(query)); } - public static bool IsInstantSearchPlugin(PluginMetadata pluginMetadata) + private static bool IsInstantSearchPlugin(PluginMetadata pluginMetadata) { //todo:to improve performance, any instant search plugin that takes long than 200ms will not consider a instant plugin anymore return pluginMetadata.Language.ToUpper() == AllowedLanguage.CSharp && LoadInstantSearches().Any(o => o.Key.Metadata.ID == pluginMetadata.ID); } - internal static void ExecutePluginQuery(PluginPair pair, Query query) + private static void QueryForPlugin(PluginPair pair, Query query) { try { @@ -223,23 +253,23 @@ namespace Wox.Core.Plugin /// public static PluginPair GetPlugin(string id) { - return AllPlugins.FirstOrDefault(o => o.Metadata.ID == id); + return plugins.FirstOrDefault(o => o.Metadata.ID == id); } - internal static List> LoadExclusiveSearchPlugins() + private static List> LoadExclusiveSearchPlugins() { if (exclusiveSearchPlugins != null) return exclusiveSearchPlugins; exclusiveSearchPlugins = AssemblyHelper.LoadPluginInterfaces(); return exclusiveSearchPlugins; } - internal static PluginPair GetExclusivePlugin(Query query) + private static PluginPair GetExclusivePlugin(Query query) { KeyValuePair plugin = LoadExclusiveSearchPlugins().FirstOrDefault(o => o.Value.IsExclusiveQuery((query))); return plugin.Key; } - internal static PluginPair GetActionKeywordPlugin(Query query) + private static PluginPair GetActionKeywordPlugin(Query query) { //if a query doesn't contain a vaild action keyword, it should not be a action keword plugin query if (string.IsNullOrEmpty(query.ActionKeyword)) return null; @@ -260,7 +290,26 @@ namespace Wox.Core.Plugin return null; } - internal static bool IsExclusivePluginQuery(Query query) + private static List GetExclusivePlugins(Query query) + { + List pluginPairs = new List(); + var exclusivePluginPair = GetExclusivePlugin(query) ?? + GetActionKeywordPlugin(query); + if (exclusivePluginPair != null) + { + pluginPairs.Add(exclusivePluginPair); + } + + return pluginPairs; + } + + private static List GetGenericPlugins() + { + return plugins.Where(o => IsGenericPlugin(o.Metadata)).ToList(); + } + + + private static bool IsExclusivePluginQuery(Query query) { return GetExclusivePlugin(query) != null || GetActionKeywordPlugin(query) != null; } @@ -293,5 +342,6 @@ namespace Wox.Core.Plugin return contextContextMenus; } + } } diff --git a/Wox.Core/Plugin/QueryDispatcher/BaseQueryDispatcher.cs b/Wox.Core/Plugin/QueryDispatcher/BaseQueryDispatcher.cs deleted file mode 100644 index aeb886536a..0000000000 --- a/Wox.Core/Plugin/QueryDispatcher/BaseQueryDispatcher.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Threading; -using Wox.Core.UserSettings; -using Wox.Infrastructure; -using Wox.Plugin; - -namespace Wox.Core.Plugin.QueryDispatcher -{ - public abstract class BaseQueryDispatcher : IQueryDispatcher - { - protected abstract List GetPlugins(Query query); - - public void Dispatch(Query query) - { - foreach (PluginPair pair in GetPlugins(query)) - { - var customizedPluginConfig = UserSettingStorage.Instance. - CustomizedPluginConfigs.FirstOrDefault(o => o.ID == pair.Metadata.ID); - if (customizedPluginConfig != null && customizedPluginConfig.Disabled) - { - return; - } - PluginPair localPair = pair; - if (query.IsIntantQuery && PluginManager.IsInstantSearchPlugin(pair.Metadata)) - { - Debug.WriteLine(string.Format("Plugin {0} is executing instant search.", pair.Metadata.Name)); - using (new Timeit(" => instant search took: ")) - { - PluginManager.ExecutePluginQuery(localPair, query); - } - } - else - { - ThreadPool.QueueUserWorkItem(state => - { - PluginManager.ExecutePluginQuery(localPair, query); - }); - } - } - } - } -} diff --git a/Wox.Core/Plugin/QueryDispatcher/ExclusiveQueryDispatcher.cs b/Wox.Core/Plugin/QueryDispatcher/ExclusiveQueryDispatcher.cs deleted file mode 100644 index f31ae2ac92..0000000000 --- a/Wox.Core/Plugin/QueryDispatcher/ExclusiveQueryDispatcher.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System.Collections.Generic; -using Wox.Plugin; - -namespace Wox.Core.Plugin.QueryDispatcher -{ - public class ExclusiveQueryDispatcher : BaseQueryDispatcher - { - protected override List GetPlugins(Query query) - { - List pluginPairs = new List(); - var exclusivePluginPair = PluginManager.GetExclusivePlugin(query) ?? - PluginManager.GetActionKeywordPlugin(query); - if (exclusivePluginPair != null) - { - pluginPairs.Add(exclusivePluginPair); - } - - return pluginPairs; - } - - - - } -} diff --git a/Wox.Core/Plugin/QueryDispatcher/GenericQueryDispatcher.cs b/Wox.Core/Plugin/QueryDispatcher/GenericQueryDispatcher.cs deleted file mode 100644 index 9787930982..0000000000 --- a/Wox.Core/Plugin/QueryDispatcher/GenericQueryDispatcher.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using Wox.Plugin; - -namespace Wox.Core.Plugin.QueryDispatcher -{ - public class GenericQueryDispatcher : BaseQueryDispatcher - { - protected override List GetPlugins(Query query) - { - return PluginManager.AllPlugins.Where(o => PluginManager.IsGenericPlugin(o.Metadata)).ToList(); - } - } -} \ No newline at end of file diff --git a/Wox.Core/Plugin/QueryDispatcher/IQueryDispatcher.cs b/Wox.Core/Plugin/QueryDispatcher/IQueryDispatcher.cs deleted file mode 100644 index c5312a0332..0000000000 --- a/Wox.Core/Plugin/QueryDispatcher/IQueryDispatcher.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Wox.Core.Plugin.QueryDispatcher -{ - internal interface IQueryDispatcher - { - void Dispatch(Wox.Plugin.Query query); - } -} diff --git a/Wox.Core/Plugin/QueryDispatcher/QueryDispatcher.cs b/Wox.Core/Plugin/QueryDispatcher/QueryDispatcher.cs deleted file mode 100644 index 5d2cc0e413..0000000000 --- a/Wox.Core/Plugin/QueryDispatcher/QueryDispatcher.cs +++ /dev/null @@ -1,23 +0,0 @@ - -using Wox.Plugin; - -namespace Wox.Core.Plugin.QueryDispatcher -{ - internal static class QueryDispatcher - { - private static readonly IQueryDispatcher exclusivePluginDispatcher = new ExclusiveQueryDispatcher(); - private static readonly IQueryDispatcher genericQueryDispatcher = new GenericQueryDispatcher(); - - public static void Dispatch(Query query) - { - if (PluginManager.IsExclusivePluginQuery(query)) - { - exclusivePluginDispatcher.Dispatch(query); - } - else - { - genericQueryDispatcher.Dispatch(query); - } - } - } -} diff --git a/Wox.Core/Wox.Core.csproj b/Wox.Core/Wox.Core.csproj index f348e9cdee..2c2b888578 100644 --- a/Wox.Core/Wox.Core.csproj +++ b/Wox.Core/Wox.Core.csproj @@ -65,7 +65,6 @@ - @@ -80,10 +79,6 @@ - - - - @@ -123,5 +118,4 @@ --> - - + \ No newline at end of file diff --git a/Wox.Plugin/PluginPair.cs b/Wox.Plugin/PluginPair.cs index 1b5da1b174..85d228c9c7 100644 --- a/Wox.Plugin/PluginPair.cs +++ b/Wox.Plugin/PluginPair.cs @@ -2,8 +2,8 @@ { public class PluginPair { - public IPlugin Plugin { get; set; } - public PluginMetadata Metadata { get; set; } + public IPlugin Plugin { get; internal set; } + public PluginMetadata Metadata { get; internal set; } internal long InitTime { get; set; } diff --git a/Wox/MainWindow.xaml.cs b/Wox/MainWindow.xaml.cs index c3b9cd0301..11d74834bb 100644 --- a/Wox/MainWindow.xaml.cs +++ b/Wox/MainWindow.xaml.cs @@ -501,7 +501,7 @@ namespace Wox private void Query(Query q) { - PluginManager.Query(q); + PluginManager.QueryForAllPlugins(q); StopProgress(); }