diff --git a/Wox.Core/AssemblyHelper.cs b/Wox.Core/AssemblyHelper.cs index ec1e27218b..a07e108f17 100644 --- a/Wox.Core/AssemblyHelper.cs +++ b/Wox.Core/AssemblyHelper.cs @@ -8,20 +8,5 @@ namespace Wox.Core { internal class AssemblyHelper { - public static List> LoadPluginInterfaces() where T : class - { - List> results = new List>(); - foreach (PluginPair pluginPair in PluginManager.AllPlugins) - { - //need to load types from AllPlugins - //PluginInitContext is only available in this instance - T type = pluginPair.Plugin as T; - if (type != null) - { - results.Add(new KeyValuePair(pluginPair,type)); - } - } - return results; - } } } diff --git a/Wox.Core/Plugin/PluginManager.cs b/Wox.Core/Plugin/PluginManager.cs index f04bf72804..aa26b9f78c 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; @@ -22,9 +23,9 @@ namespace Wox.Core.Plugin { public const string DirectoryName = "Plugins"; private static List pluginMetadatas; - private static List> instantSearches; + private static List instantSearches; private static IEnumerable exclusiveSearchPlugins; - private static List> contextMenuPlugins; + private static List contextMenuPlugins; private static List plugins; /// @@ -109,7 +110,7 @@ namespace Wox.Core.Plugin ThreadPool.QueueUserWorkItem(o => { - LoadInstantSearches(); + GetInstantSearchesPlugins(); }); } @@ -120,16 +121,16 @@ namespace Wox.Core.Plugin public static void QueryForAllPlugins(Query query) { - query.ActionKeyword = string.Empty; + query.ActionKeyword = String.Empty; query.Search = query.RawQuery; if (query.Terms.Length == 0) return; if (IsVailldActionKeyword(query.Terms[0])) { query.ActionKeyword = query.Terms[0]; } - if (!string.IsNullOrEmpty(query.ActionKeyword)) + if (!String.IsNullOrEmpty(query.ActionKeyword)) { - query.Search = string.Join(Query.Seperater, query.Terms.Skip(1).ToArray()); + query.Search = String.Join(Query.Seperater, query.Terms.Skip(1).ToArray()); } QueryDispatch(query); } @@ -187,7 +188,7 @@ namespace Wox.Core.Plugin /// private static bool IsVailldActionKeyword(string actionKeyword) { - if (string.IsNullOrEmpty(actionKeyword) || actionKeyword == Query.WildcardSign) return false; + if (String.IsNullOrEmpty(actionKeyword) || actionKeyword == Query.WildcardSign) return false; PluginPair pair = AllPlugins.FirstOrDefault(o => o.Metadata.ActionKeyword == actionKeyword); if (pair == null) return false; var customizedPluginConfig = UserSettingStorage.Instance. @@ -202,22 +203,19 @@ namespace Wox.Core.Plugin public static bool IsInstantQuery(string query) { - return LoadInstantSearches().Any(o => o.Value.IsInstantQuery(query)); + return GetInstantSearchesPlugins().Any(o => ((IInstantQuery)o).IsInstantQuery(query)); } 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); + GetInstantSearchesPlugins().Any(o => o.Metadata.ID == pluginMetadata.ID); } - private static List> LoadInstantSearches() + private static List GetInstantSearchesPlugins() { - if (instantSearches != null) return instantSearches; - - instantSearches = AssemblyHelper.LoadPluginInterfaces(); - + instantSearches = instantSearches ?? GetPlugin(); return instantSearches; } @@ -231,6 +229,22 @@ namespace Wox.Core.Plugin return AllPlugins.FirstOrDefault(o => o.Metadata.ID == id); } + public static List GetPlugin() where T : class + { + var results = new List(); + foreach (var pluginPair in AllPlugins) + { + //need to load types from AllPlugins + //PluginInitContext is only available in this instance + T type = pluginPair.Plugin as T; + if (type != null) + { + results.Add(pluginPair); + } + } + return results; + } + private static PluginPair GetExclusivePlugin(Query query) { exclusiveSearchPlugins = exclusiveSearchPlugins ?? @@ -242,7 +256,7 @@ namespace Wox.Core.Plugin 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; + if (String.IsNullOrEmpty(query.ActionKeyword)) return null; return AllPlugins.FirstOrDefault(o => o.Metadata.ActionKeyword == query.ActionKeyword); } @@ -258,22 +272,19 @@ namespace Wox.Core.Plugin public static List GetPluginContextMenus(Result result) { - List contextContextMenus = new List(); - if (contextMenuPlugins == null) - { - contextMenuPlugins = AssemblyHelper.LoadPluginInterfaces(); - } + contextMenuPlugins = contextMenuPlugins ?? GetPlugin(); - var contextMenuPlugin = contextMenuPlugins.FirstOrDefault(o => o.Key.Metadata.ID == result.PluginID); - if (contextMenuPlugin.Value != null) + var pluginPair = contextMenuPlugins.FirstOrDefault(o => o.Metadata.ID == result.PluginID); + var plugin = (IContextMenu)pluginPair?.Plugin; + if (plugin != null) { try { - return contextMenuPlugin.Value.LoadContextMenus(result); + return plugin.LoadContextMenus(result); } catch (System.Exception e) { - Log.Error(string.Format("Couldn't load plugin context menus {0}: {1}", contextMenuPlugin.Key.Metadata.Name, e.Message)); + Log.Error($"Couldn't load plugin context menus {pluginPair.Metadata.Name}: {e.Message}"); #if (DEBUG) { throw; @@ -282,8 +293,7 @@ namespace Wox.Core.Plugin } } - return contextContextMenus; + return new List(); } - } }