Refactoring GetExclusivePlugin and GetActionKeywordPlugin

System plugin = plugin with action keyword *
Non system plugin = exclusive plugin + action keyword plugin
This commit is contained in:
bao-qian
2015-11-01 19:47:20 +00:00
parent bb3b982dea
commit 8c7bac7dbb
5 changed files with 41 additions and 79 deletions

View File

@@ -7,6 +7,7 @@ using System.Windows.Forms;
using WindowsInput; using WindowsInput;
using WindowsInput.Native; using WindowsInput.Native;
using Wox.Infrastructure.Hotkey; using Wox.Infrastructure.Hotkey;
using Wox.Infrastructure.Logger;
using Wox.Plugin.Features; using Wox.Plugin.Features;
using Control = System.Windows.Controls.Control; using Control = System.Windows.Controls.Control;
@@ -22,14 +23,13 @@ namespace Wox.Plugin.CMD
{ {
List<Result> results = new List<Result>(); List<Result> results = new List<Result>();
List<Result> pushedResults = new List<Result>(); List<Result> pushedResults = new List<Result>();
if (query.Search == ">") string cmd = query.Search;
if (string.IsNullOrEmpty(cmd))
{ {
return GetAllHistoryCmds(); return GetAllHistoryCmds();
} }
else
if (query.Search.StartsWith(">") && query.Search.Length > 1)
{ {
string cmd = query.Search.Substring(1);
var queryCmd = GetCurrentCmd(cmd); var queryCmd = GetCurrentCmd(cmd);
context.API.PushResults(query, context.CurrentPluginMetadata, new List<Result>() { queryCmd }); context.API.PushResults(query, context.CurrentPluginMetadata, new List<Result>() { queryCmd });
pushedResults.Add(queryCmd); pushedResults.Add(queryCmd);
@@ -49,7 +49,7 @@ namespace Wox.Plugin.CMD
basedir = excmd; basedir = excmd;
dir = cmd; dir = cmd;
} }
else if (Directory.Exists(Path.GetDirectoryName(excmd))) else if (Directory.Exists(Path.GetDirectoryName(excmd) ?? string.Empty))
{ {
basedir = Path.GetDirectoryName(excmd); basedir = Path.GetDirectoryName(excmd);
var dirn = Path.GetDirectoryName(cmd); var dirn = Path.GetDirectoryName(cmd);
@@ -72,10 +72,12 @@ namespace Wox.Plugin.CMD
})); }));
} }
} }
catch (Exception) { } catch (Exception e)
{
Log.Error(e);
}
return results;
} }
return results;
} }
private List<Result> GetHistoryCmds(string cmd, Result result) private List<Result> GetHistoryCmds(string cmd, Result result)

View File

@@ -17,7 +17,7 @@ namespace Wox.Plugin.PluginIndicator
List<Result> results = new List<Result>(); List<Result> results = new List<Result>();
if (allPlugins.Count == 0) if (allPlugins.Count == 0)
{ {
allPlugins = context.API.GetAllPlugins().Where(o => !PluginManager.IsGenericPlugin(o.Metadata)).ToList(); allPlugins = context.API.GetAllPlugins().Where(o => !PluginManager.IsSystemPlugin(o.Metadata)).ToList();
} }
foreach (PluginMetadata metadata in allPlugins.Select(o => o.Metadata)) foreach (PluginMetadata metadata in allPlugins.Select(o => o.Metadata))

View File

@@ -21,11 +21,9 @@ namespace Wox.Core.Plugin
/// </summary> /// </summary>
public static class PluginManager public static class PluginManager
{ {
public const string ActionKeywordWildcardSign = "*";
private static List<PluginMetadata> pluginMetadatas; private static List<PluginMetadata> pluginMetadatas;
private static List<KeyValuePair<PluginPair, IInstantQuery>> instantSearches; private static List<KeyValuePair<PluginPair, IInstantQuery>> instantSearches;
private static List<KeyValuePair<PluginPair, IExclusiveQuery>> exclusiveSearchPlugins; private static IEnumerable<PluginPair> exclusiveSearchPlugins;
private static List<KeyValuePair<PluginPair, IContextMenu>> contextMenuPlugins; private static List<KeyValuePair<PluginPair, IContextMenu>> contextMenuPlugins;
public static IPublicAPI API { get; private set; } public static IPublicAPI API { get; private set; }
@@ -133,7 +131,8 @@ namespace Wox.Core.Plugin
private static void QueryDispatch(Query query) private static void QueryDispatch(Query query)
{ {
var pluginPairs = IsExclusivePluginQuery(query) ? GetExclusivePlugins(query) : GetGenericPlugins(); var nonSystemPlugin = GetNonSystemPlugin(query);
var pluginPairs = nonSystemPlugin != null ? new List<PluginPair> { nonSystemPlugin } : GetSystemPlugins();
foreach (var plugin in pluginPairs) foreach (var plugin in pluginPairs)
{ {
var customizedPluginConfig = UserSettingStorage.Instance. var customizedPluginConfig = UserSettingStorage.Instance.
@@ -175,24 +174,16 @@ namespace Wox.Core.Plugin
/// <returns></returns> /// <returns></returns>
private static bool IsVailldActionKeyword(string actionKeyword) private static bool IsVailldActionKeyword(string actionKeyword)
{ {
if (string.IsNullOrEmpty(actionKeyword) || actionKeyword == Query.ActionKeywordWildcardSign) return false;
PluginPair pair = plugins.FirstOrDefault(o => o.Metadata.ActionKeyword == actionKeyword); PluginPair pair = plugins.FirstOrDefault(o => o.Metadata.ActionKeyword == actionKeyword);
if (pair != null) if (pair == null) return false;
{ var customizedPluginConfig = UserSettingStorage.Instance.CustomizedPluginConfigs.FirstOrDefault(o => o.ID == pair.Metadata.ID);
var customizedPluginConfig = UserSettingStorage.Instance.CustomizedPluginConfigs.FirstOrDefault(o => o.ID == pair.Metadata.ID); return customizedPluginConfig == null || !customizedPluginConfig.Disabled;
if (customizedPluginConfig != null && customizedPluginConfig.Disabled)
{
return false;
}
return true;
}
return false;
} }
public static bool IsGenericPlugin(PluginMetadata metadata) public static bool IsSystemPlugin(PluginMetadata metadata)
{ {
return metadata.ActionKeyword == ActionKeywordWildcardSign; return metadata.ActionKeyword == Query.ActionKeywordWildcardSign;
} }
public static bool IsInstantQuery(string query) public static bool IsInstantQuery(string query)
@@ -256,62 +247,29 @@ namespace Wox.Core.Plugin
return plugins.FirstOrDefault(o => o.Metadata.ID == id); return plugins.FirstOrDefault(o => o.Metadata.ID == id);
} }
private static List<KeyValuePair<PluginPair, IExclusiveQuery>> LoadExclusiveSearchPlugins()
{
if (exclusiveSearchPlugins != null) return exclusiveSearchPlugins;
exclusiveSearchPlugins = AssemblyHelper.LoadPluginInterfaces<IExclusiveQuery>();
return exclusiveSearchPlugins;
}
private static PluginPair GetExclusivePlugin(Query query) private static PluginPair GetExclusivePlugin(Query query)
{ {
KeyValuePair<PluginPair, IExclusiveQuery> plugin = LoadExclusiveSearchPlugins().FirstOrDefault(o => o.Value.IsExclusiveQuery((query))); exclusiveSearchPlugins = exclusiveSearchPlugins ??
return plugin.Key; plugins.Where(p => p.Plugin.GetType().GetInterfaces().Contains(typeof(IExclusiveQuery)));
var plugin = exclusiveSearchPlugins.FirstOrDefault(p => ((IExclusiveQuery)p.Plugin).IsExclusiveQuery(query));
return plugin;
} }
private 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 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 plugins.FirstOrDefault(o => o.Metadata.ActionKeyword == query.ActionKeyword);
PluginPair actionKeywordPluginPair = AllPlugins.FirstOrDefault(o => o.Metadata.ActionKeyword == query.ActionKeyword);
if (actionKeywordPluginPair != null)
{
var customizedPluginConfig = UserSettingStorage.Instance.
CustomizedPluginConfigs.FirstOrDefault(o => o.ID == actionKeywordPluginPair.Metadata.ID);
if (customizedPluginConfig != null && customizedPluginConfig.Disabled)
{
return null;
}
return actionKeywordPluginPair;
}
return null;
} }
private static List<PluginPair> GetExclusivePlugins(Query query) private static PluginPair GetNonSystemPlugin(Query query)
{ {
List<PluginPair> pluginPairs = new List<PluginPair>(); return GetExclusivePlugin(query) ?? GetActionKeywordPlugin(query);
var exclusivePluginPair = GetExclusivePlugin(query) ??
GetActionKeywordPlugin(query);
if (exclusivePluginPair != null)
{
pluginPairs.Add(exclusivePluginPair);
}
return pluginPairs;
} }
private static List<PluginPair> GetGenericPlugins() private static List<PluginPair> GetSystemPlugins()
{ {
return plugins.Where(o => IsGenericPlugin(o.Metadata)).ToList(); return plugins.Where(o => IsSystemPlugin(o.Metadata)).ToList();
}
private static bool IsExclusivePluginQuery(Query query)
{
return GetExclusivePlugin(query) != null || GetActionKeywordPlugin(query) != null;
} }
public static List<Result> GetPluginContextMenus(Result result) public static List<Result> GetPluginContextMenus(Result result)

View File

@@ -43,8 +43,8 @@ namespace Wox.Plugin
{ {
get get
{ {
var index = string.IsNullOrEmpty(ActionKeyword) ? 1 : 2; var index = String.IsNullOrEmpty(ActionKeyword) ? 1 : 2;
return string.Join(Seperater, Terms.Skip(index).ToArray()); return String.Join(Seperater, Terms.Skip(index).ToArray());
} }
} }
@@ -62,11 +62,11 @@ namespace Wox.Plugin
{ {
try try
{ {
return string.IsNullOrEmpty(ActionKeyword) ? Terms[index] : Terms[index + 1]; return String.IsNullOrEmpty(ActionKeyword) ? Terms[index] : Terms[index + 1];
} }
catch (IndexOutOfRangeException) catch (IndexOutOfRangeException)
{ {
return string.Empty; return String.Empty;
} }
} }
@@ -83,7 +83,7 @@ namespace Wox.Plugin
{ {
// replace multiple white spaces with one white space // replace multiple white spaces with one white space
Terms = rawQuery.Split(new[] { Seperater }, StringSplitOptions.RemoveEmptyEntries); Terms = rawQuery.Split(new[] { Seperater }, StringSplitOptions.RemoveEmptyEntries);
RawQuery = string.Join(Seperater, Terms.ToArray()); RawQuery = String.Join(Seperater, Terms.ToArray());
ActionParameters = new List<string>(); ActionParameters = new List<string>();
ParseQuery(); ParseQuery();
@@ -91,7 +91,7 @@ namespace Wox.Plugin
private void ParseQuery() private void ParseQuery()
{ {
if (string.IsNullOrEmpty(RawQuery)) return; if (String.IsNullOrEmpty(RawQuery)) return;
string[] strings = RawQuery.Split(' '); string[] strings = RawQuery.Split(' ');
//todo:not exactly correct. query that didn't containing a space should be a valid query //todo:not exactly correct. query that didn't containing a space should be a valid query
@@ -100,7 +100,7 @@ namespace Wox.Plugin
ActionName = strings[0]; ActionName = strings[0];
for (int i = 1; i < strings.Length; i++) for (int i = 1; i < strings.Length; i++)
{ {
if (!string.IsNullOrEmpty(strings[i])) if (!String.IsNullOrEmpty(strings[i]))
{ {
ActionParameters.Add(strings[i]); ActionParameters.Add(strings[i]);
} }
@@ -111,13 +111,15 @@ namespace Wox.Plugin
public string GetAllRemainingParameter() public string GetAllRemainingParameter()
{ {
string[] strings = RawQuery.Split(new char[] { ' ' }, 2, System.StringSplitOptions.None); string[] strings = RawQuery.Split(new char[] { ' ' }, 2, StringSplitOptions.None);
if (strings.Length > 1) if (strings.Length > 1)
{ {
return strings[1]; return strings[1];
} }
return string.Empty; return String.Empty;
} }
public const string ActionKeywordWildcardSign = "*";
} }
} }

View File

@@ -45,7 +45,7 @@ namespace Wox
} }
//check new action keyword didn't used by other plugin //check new action keyword didn't used by other plugin
if (tbAction.Text.Trim() != PluginManager.ActionKeywordWildcardSign && PluginManager.AllPlugins.Exists(o => o.Metadata.ActionKeyword == tbAction.Text.Trim())) if (tbAction.Text.Trim() != Query.ActionKeywordWildcardSign && PluginManager.AllPlugins.Exists(o => o.Metadata.ActionKeyword == tbAction.Text.Trim()))
{ {
MessageBox.Show(InternationalizationManager.Instance.GetTranslation("newActionKeywordHasBeenAssigned")); MessageBox.Show(InternationalizationManager.Instance.GetTranslation("newActionKeywordHasBeenAssigned"));
return; return;