diff --git a/Plugins/Wox.Plugin.Program/Main.cs b/Plugins/Wox.Plugin.Program/Main.cs index 9d0bbd3cfa..824682b59f 100644 --- a/Plugins/Wox.Plugin.Program/Main.cs +++ b/Plugins/Wox.Plugin.Program/Main.cs @@ -17,7 +17,7 @@ namespace Wox.Plugin.Program private static Win32[] _win32s = { }; private static UWP.Application[] _uwps = { }; - private PluginInitContext _context; + private static PluginInitContext _context; private static ProgramIndexCache _cache; private static BinaryStorage _cacheStorage; @@ -49,105 +49,15 @@ namespace Wox.Plugin.Program public List Query(Query query) { var results1 = _win32s.AsParallel() - .Where(p => Score(p, query.Search) > 0) - .Select(ResultFromWin32); + .Select(p => p.Result(query.Search, _context.API)) + .Where(r => r.Score > 0); var results2 = _uwps.AsParallel() - .Where(app => Score(app, query.Search) > 0) - .Select(ResultFromUWP); + .Select(p => p.Result(query.Search, _context.API)) + .Where(r => r.Score > 0); var result = results1.Concat(results2).ToList(); return result; } - public Result ResultFromWin32(Win32 program) - { - var result = new Result - { - SubTitle = program.FullPath, - IcoPath = program.IcoPath, - Score = program.Score, - ContextData = program, - Action = e => - { - var info = new ProcessStartInfo - { - FileName = program.FullPath, - WorkingDirectory = program.ParentDirectory - }; - var hide = StartProcess(info); - return hide; - } - }; - - if (program.Description.Length >= program.Name.Length && - program.Description.Substring(0, program.Name.Length) == program.Name) - { - result.Title = program.Description; - } - else if (!string.IsNullOrEmpty(program.Description)) - { - result.Title = $"{program.Name}: {program.Description}"; - } - else - { - result.Title = program.Name; - } - - return result; - } - public Result ResultFromUWP(UWP.Application app) - { - var result = new Result - { - SubTitle = $"{app.Location}", - Icon = app.Logo, - Score = app.Score, - ContextData = app, - Action = e => - { - app.Launch(); - return true; - } - }; - - if (app.Description.Length >= app.DisplayName.Length && - app.Description.Substring(0, app.DisplayName.Length) == app.DisplayName) - { - result.Title = app.Description; - } - else if (!string.IsNullOrEmpty(app.Description)) - { - result.Title = $"{app.DisplayName}: {app.Description}"; - } - else - { - result.Title = app.DisplayName; - } - return result; - } - - - private int Score(Win32 program, string query) - { - var score1 = StringMatcher.Score(program.Name, query); - var score2 = StringMatcher.ScoreForPinyin(program.Name, query); - var score3 = StringMatcher.Score(program.Description, query); - var score4 = StringMatcher.ScoreForPinyin(program.Description, query); - var score5 = StringMatcher.Score(program.ExecutableName, query); - var score = new[] { score1, score2, score3, score4, score5 }.Max(); - program.Score = score; - return score; - } - - private int Score(UWP.Application app, string query) - { - var score1 = StringMatcher.Score(app.DisplayName, query); - var score2 = StringMatcher.ScoreForPinyin(app.DisplayName, query); - var score3 = StringMatcher.Score(app.Description, query); - var score = new[] { score1, score2, score3 }.Max(); - app.Score = score; - return score; - } - public void Init(PluginInitContext context) { _context = context; @@ -176,39 +86,11 @@ namespace Wox.Plugin.Program public List LoadContextMenus(Result selectedResult) { - Win32 p = selectedResult.ContextData as Win32; - if (p != null) + var program = selectedResult.ContextData as IProgram; + if (program != null) { - List contextMenus = new List - { - new Result - { - Title = _context.API.GetTranslation("wox_plugin_program_run_as_administrator"), - Action = _ => - { - var info = new ProcessStartInfo - { - FileName = p.FullPath, - WorkingDirectory = p.ParentDirectory, - Verb = "runas" - }; - var hide = StartProcess(info); - return hide; - }, - IcoPath = "Images/cmd.png" - }, - new Result - { - Title = _context.API.GetTranslation("wox_plugin_program_open_containing_folder"), - Action = _ => - { - var hide = StartProcess(new ProcessStartInfo(p.ParentDirectory)); - return hide; - }, - IcoPath = "Images/folder.png" - } - }; - return contextMenus; + var menus = program.ContextMenus(_context.API); + return menus; } else { @@ -216,7 +98,7 @@ namespace Wox.Plugin.Program } } - private bool StartProcess(ProcessStartInfo info) + public static bool StartProcess(ProcessStartInfo info) { bool hide; try @@ -224,10 +106,10 @@ namespace Wox.Plugin.Program Process.Start(info); hide = true; } - catch (Win32Exception) + catch (Exception) { - var name = $"Plugin: {_context.CurrentPluginMetadata.Name}"; - var message = "Can't open this file"; + var name = "Plugin: Program"; + var message = $"Can't start: {info.FileName}"; _context.API.ShowMsg(name, message, string.Empty); hide = false; } diff --git a/Plugins/Wox.Plugin.Program/Programs/IProgram.cs b/Plugins/Wox.Plugin.Program/Programs/IProgram.cs new file mode 100644 index 0000000000..88d4eaaf0f --- /dev/null +++ b/Plugins/Wox.Plugin.Program/Programs/IProgram.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Wox.Plugin.Program.Programs +{ + public interface IProgram + { + List ContextMenus(IPublicAPI api); + Result Result(string query, IPublicAPI api); + } +} diff --git a/Plugins/Wox.Plugin.Program/Programs/UWP.cs b/Plugins/Wox.Plugin.Program/Programs/UWP.cs index 4278256c04..4c9a8c0d57 100644 --- a/Plugins/Wox.Plugin.Program/Programs/UWP.cs +++ b/Plugins/Wox.Plugin.Program/Programs/UWP.cs @@ -1,10 +1,10 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.IO; using System.Linq; using System.Runtime.InteropServices; using System.Security.Principal; -using System.Threading.Tasks; using System.Windows.Media; using System.Windows.Media.Imaging; using Windows.ApplicationModel; @@ -190,7 +190,7 @@ namespace Wox.Plugin.Program.Programs } - public class Application + public class Application : IProgram { public string DisplayName { get; set; } public string Description { get; set; } @@ -201,18 +201,82 @@ namespace Wox.Plugin.Program.Programs public string BackgroundColor { get; set; } public string LogoPath { get; set; } - public int Score { get; set; } public string Location { get; set; } - - // todo: wrap with try exception - public void Launch() + private int Score(string query) { - var appManager = new ApplicationActivationManager(); - uint unusedPid; - const string noArgs = ""; - const ACTIVATEOPTIONS noFlags = ACTIVATEOPTIONS.AO_NONE; - appManager.ActivateApplication(UserModelId, noArgs, noFlags, out unusedPid); + var score1 = StringMatcher.Score(DisplayName, query); + var score2 = StringMatcher.ScoreForPinyin(DisplayName, query); + var score3 = StringMatcher.Score(Description, query); + var score = new[] { score1, score2, score3 }.Max(); + return score; + } + + public Result Result(string query, IPublicAPI api) + { + var result = new Result + { + SubTitle = Location, + Icon = Logo, + Score = Score(query), + ContextData = this, + Action = e => + { + Launch(api); + return true; + } + }; + + if (Description.Length >= DisplayName.Length && + Description.Substring(0, DisplayName.Length) == DisplayName) + { + result.Title = Description; + } + else if (!string.IsNullOrEmpty(Description)) + { + result.Title = $"{DisplayName}: {Description}"; + } + else + { + result.Title = DisplayName; + } + return result; + } + + public List ContextMenus(IPublicAPI api) + { + var contextMenus = new List + { + new Result + { + Title = api.GetTranslation("wox_plugin_program_open_containing_folder"), + Action = _ => + { + var hide = Main.StartProcess(new ProcessStartInfo(Location)); + return hide; + }, + IcoPath = "Images/folder.png" + } + }; + return contextMenus; + } + + private void Launch(IPublicAPI api) + { + try + { + var appManager = new ApplicationActivationManager(); + uint unusedPid; + const string noArgs = ""; + const ACTIVATEOPTIONS noFlags = ACTIVATEOPTIONS.AO_NONE; + appManager.ActivateApplication(UserModelId, noArgs, noFlags, out unusedPid); + } + catch (Exception) + { + var name = "Plugin: Program"; + var message = $"Can't start UWP: {DisplayName}"; + api.ShowMsg(name, message, string.Empty); + } } diff --git a/Plugins/Wox.Plugin.Program/Programs/Win32.cs b/Plugins/Wox.Plugin.Program/Programs/Win32.cs index d113da63cf..e1d78694a0 100644 --- a/Plugins/Wox.Plugin.Program/Programs/Win32.cs +++ b/Plugins/Wox.Plugin.Program/Programs/Win32.cs @@ -1,17 +1,19 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Diagnostics; using System.IO; using System.Linq; using System.Text; using Microsoft.Win32; using Shell; +using Wox.Infrastructure; using Wox.Infrastructure.Logger; namespace Wox.Plugin.Program.Programs { [Serializable] - public class Win32 + public class Win32 : IProgram { public string Name { get; set; } public string IcoPath { get; set; } @@ -19,12 +21,97 @@ namespace Wox.Plugin.Program.Programs public string ParentDirectory { get; set; } public string ExecutableName { get; set; } public string Description { get; set; } - public int Score { get; set; } private const string ShortcutExtension = "lnk"; private const string ApplicationReferenceExtension = "appref-ms"; private const string ExeExtension = "exe"; + private int Score(string query) + { + var score1 = StringMatcher.Score(Name, query); + var score2 = StringMatcher.ScoreForPinyin(Name, query); + var score3 = StringMatcher.Score(Description, query); + var score4 = StringMatcher.ScoreForPinyin(Description, query); + var score5 = StringMatcher.Score(ExecutableName, query); + var score = new[] { score1, score2, score3, score4, score5 }.Max(); + return score; + } + + + public Result Result(string query, IPublicAPI api) + { + var result = new Result + { + SubTitle = FullPath, + IcoPath = IcoPath, + Score = Score(query), + ContextData = this, + Action = e => + { + var info = new ProcessStartInfo + { + FileName = FullPath, + WorkingDirectory = ParentDirectory + }; + var hide = Main.StartProcess(info); + return hide; + } + }; + + if (Description.Length >= Name.Length && + Description.Substring(0, Name.Length) == Name) + { + result.Title = Description; + } + else if (!string.IsNullOrEmpty(Description)) + { + result.Title = $"{Name}: {Description}"; + } + else + { + result.Title = Name; + } + + return result; + } + + + public List ContextMenus(IPublicAPI api) + { + var contextMenus = new List + { + new Result + { + Title = api.GetTranslation("wox_plugin_program_run_as_administrator"), + Action = _ => + { + var info = new ProcessStartInfo + { + FileName = FullPath, + WorkingDirectory = ParentDirectory, + Verb = "runas" + }; + var hide = Main.StartProcess(info); + return hide; + }, + IcoPath = "Images/cmd.png" + }, + new Result + { + Title = api.GetTranslation("wox_plugin_program_open_containing_folder"), + Action = _ => + { + var hide = Main.StartProcess(new ProcessStartInfo(ParentDirectory)); + return hide; + }, + IcoPath = "Images/folder.png" + } + }; + return contextMenus; + } + + + public override string ToString() { return ExecutableName; @@ -211,30 +298,30 @@ namespace Wox.Plugin.Program.Programs return new Win32(); } - private static Win32 ScoreFilter(Win32 p) - { - var start = new[] { "启动", "start" }; - var doc = new[] { "帮助", "help", "文档", "documentation" }; - var uninstall = new[] { "卸载", "uninstall" }; + //private static Win32 ScoreFilter(Win32 p) + //{ + // var start = new[] { "启动", "start" }; + // var doc = new[] { "帮助", "help", "文档", "documentation" }; + // var uninstall = new[] { "卸载", "uninstall" }; - var contained = start.Any(s => p.Name.ToLower().Contains(s)); - if (contained) - { - p.Score += 10; - } - contained = doc.Any(d => p.Name.ToLower().Contains(d)); - if (contained) - { - p.Score -= 10; - } - contained = uninstall.Any(u => p.Name.ToLower().Contains(u)); - if (contained) - { - p.Score -= 20; - } + // var contained = start.Any(s => p.Name.ToLower().Contains(s)); + // if (contained) + // { + // p.Score += 10; + // } + // contained = doc.Any(d => p.Name.ToLower().Contains(d)); + // if (contained) + // { + // p.Score -= 10; + // } + // contained = uninstall.Any(u => p.Name.ToLower().Contains(u)); + // if (contained) + // { + // p.Score -= 20; + // } - return p; - } + // return p; + //} public static Win32[] All(Settings settings) { @@ -250,7 +337,8 @@ namespace Wox.Plugin.Program.Programs programs = programs.Concat(startMenu); } var unregistered = UnregisteredPrograms(settings.ProgramSources, settings.ProgramSuffixes); - programs = programs.Concat(unregistered).Select(ScoreFilter); + programs = programs.Concat(unregistered); + //.Select(ScoreFilter); return programs.ToArray(); } } diff --git a/Plugins/Wox.Plugin.Program/Wox.Plugin.Program.csproj b/Plugins/Wox.Plugin.Program/Wox.Plugin.Program.csproj index ee33cc013d..cc0a4054f0 100644 --- a/Plugins/Wox.Plugin.Program/Wox.Plugin.Program.csproj +++ b/Plugins/Wox.Plugin.Program/Wox.Plugin.Program.csproj @@ -71,6 +71,7 @@ AddProgramSource.xaml +