From fc66fba57721575c0b393dc96ef2d2832520a79a Mon Sep 17 00:00:00 2001 From: qianlifeng Date: Sat, 19 Jul 2014 10:12:11 +0800 Subject: [PATCH] Refactoring FolderLink and URL plugin. --- .../Folder/FolderPlugin.cs | 303 ++++++++++-------- Wox.Plugin.SystemPlugins/UrlPlugin.cs | 32 +- Wox.Plugin/EventHandler.cs | 16 + Wox.Plugin/IPublicAPI.cs | 2 + Wox.Plugin/Wox.Plugin.csproj | 1 + Wox/Images/file.png | Bin 0 -> 1145 bytes Wox/Images/{url1.png => url.png} | Bin Wox/Images/url2.png | Bin 24384 -> 0 bytes Wox/MainWindow.xaml.cs | 43 +-- Wox/Wox.csproj | 3 +- 10 files changed, 231 insertions(+), 169 deletions(-) create mode 100644 Wox.Plugin/EventHandler.cs create mode 100644 Wox/Images/file.png rename Wox/Images/{url1.png => url.png} (100%) delete mode 100644 Wox/Images/url2.png diff --git a/Wox.Plugin.SystemPlugins/Folder/FolderPlugin.cs b/Wox.Plugin.SystemPlugins/Folder/FolderPlugin.cs index edb8dd7a0c..00f94f06a6 100644 --- a/Wox.Plugin.SystemPlugins/Folder/FolderPlugin.cs +++ b/Wox.Plugin.SystemPlugins/Folder/FolderPlugin.cs @@ -4,165 +4,208 @@ using System.Diagnostics; using System.IO; using System.Linq; using System.Windows.Forms; -using Wox.Infrastructure; using Wox.Infrastructure.Storage.UserSettings; +using Control = System.Windows.Controls.Control; -namespace Wox.Plugin.SystemPlugins.Folder { +namespace Wox.Plugin.SystemPlugins.Folder +{ + public class FolderPlugin : BaseSystemPlugin, ISettingProvider + { + #region Properties - public class FolderPlugin : BaseSystemPlugin, ISettingProvider { + private static List driverNames; + private PluginInitContext context; - #region Properties - - private PluginInitContext context; - private static List driverNames = null; - private static Dictionary parentDirectories = new Dictionary(); - public override string Description { - get - { - return "Provide opening folder from wox directorily. You can add your favorite folders."; - } + public override string Description + { + get { return "Provide opening folder from wox directorily. You can add your favorite folders."; } } - public override string ID - { + public override string ID + { get { return "B4D3B69656E14D44865C8D818EAE47C4"; } - } + } - public override string Name { get { return "Folder"; } } - public override string IcoPath { get { return @"Images\folder.png"; } } + public override string Name + { + get { return "Folder"; } + } - #endregion Properties + public override string IcoPath + { + get { return @"Images\folder.png"; } + } - #region Misc + #endregion Properties - protected override void InitInternal(PluginInitContext context) { - this.context = context; + public Control CreateSettingPanel() + { + return new FileSystemSettings(); + } - if (UserSettingStorage.Instance.FolderLinks == null) { - UserSettingStorage.Instance.FolderLinks = new List(); - UserSettingStorage.Instance.Save(); - } - } + protected override void InitInternal(PluginInitContext context) + { + this.context = context; + this.context.API.BackKeyDownEvent += ApiBackKeyDownEvent; + InitialDriverList(); + if (UserSettingStorage.Instance.FolderLinks == null) + { + UserSettingStorage.Instance.FolderLinks = new List(); + UserSettingStorage.Instance.Save(); + } + } - public System.Windows.Controls.Control CreateSettingPanel() { - return new FileSystemSettings(); - } + private void ApiBackKeyDownEvent(object sender, WoxKeyDownEventArgs e) + { + string query = e.Query; + if (Directory.Exists(query)) + { + if (query.EndsWith("\\")) + { + query = query.Remove(query.Length - 1); + } - #endregion Misc + if (query.Contains("\\")) + { + int index = query.LastIndexOf("\\"); + query = query.Remove(index) + "\\"; + } - protected override List QueryInternal(Query query) { - var results = new List(); - var input = query.RawQuery.ToLower(); - var inputName = input.Split(new string[] { @"\" }, StringSplitOptions.None).First().ToLower(); - var link = UserSettingStorage.Instance.FolderLinks.FirstOrDefault(x => x.Nickname.Equals(inputName, StringComparison.OrdinalIgnoreCase)); - var currentPath = link == null ? input : link.Path + input.Remove(0, inputName.Length); - InitialDriverList(); + context.API.ChangeQuery(query); + } + } - foreach (var item in UserSettingStorage.Instance.FolderLinks.Where(x => x.Nickname.StartsWith(input, StringComparison.OrdinalIgnoreCase))) { - results.Add(new Result(item.Nickname, "Images/folder.png") { - Action = (c) => { - context.ChangeQuery(item.Nickname); - return false; - } - }); - } + protected override List QueryInternal(Query query) + { + string input = query.RawQuery.ToLower(); - if (link == null && !driverNames.Any(input.StartsWith)) - return results; + List userFolderLinks = UserSettingStorage.Instance.FolderLinks.Where( + x => x.Nickname.StartsWith(input, StringComparison.OrdinalIgnoreCase)).ToList(); + List results = + userFolderLinks.Select( + item => new Result(item.Nickname, "Images/folder.png", "Ctrl + Enter to open the directory") + { + Action = c => + { + if (c.SpecialKeyState.CtrlPressed) + { + try + { + Process.Start(item.Path); + return true; + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Could not start " + item.Path); + return false; + } + } + context.API.ChangeQuery(item.Path); + return false; + } + }).ToList(); - QueryInternal_Directory_Exists(currentPath, input, results); + if (!driverNames.Any(input.StartsWith)) + return results; - return results; - } + if (!input.EndsWith("\\")) + { + //"c:" means "the current directory on the C drive" whereas @"c:\" means "root of the C drive" + input = input + "\\"; + } + results.AddRange(QueryInternal_Directory_Exists(input)); - private void InitialDriverList() { - if (driverNames == null) { - driverNames = new List(); - var allDrives = DriveInfo.GetDrives(); - foreach (var driver in allDrives) { - driverNames.Add(driver.Name.ToLower().TrimEnd('\\')); - } - } - } + return results; + } - private void QueryInternal_Directory_Exists(string currentPath, string input, List results) { - string path = Directory.Exists(currentPath) ? new DirectoryInfo(currentPath).FullName : Path.GetDirectoryName(input); - if (!System.IO.Directory.Exists(path)) return; + private void InitialDriverList() + { + if (driverNames == null) + { + driverNames = new List(); + DriveInfo[] allDrives = DriveInfo.GetDrives(); + foreach (DriveInfo driver in allDrives) + { + driverNames.Add(driver.Name.ToLower().TrimEnd('\\')); + } + } + } - results.Add(new Result("Open this directory", "Images/folder.png") { - Score = 100000, - Action = (c) => { - if (Directory.Exists(currentPath)) { - Process.Start(currentPath); - } - else if (currentPath.Contains("\\")) { - var index = currentPath.LastIndexOf("\\"); - Process.Start(currentPath.Remove(index) + "\\"); - } + private List QueryInternal_Directory_Exists(string rawQuery) + { + var results = new List(); + if (!Directory.Exists(rawQuery)) return results; - return true; - } - }); + results.Add(new Result("Open current directory", "Images/folder.png") + { + Score = 10000, + Action = c => + { + Process.Start(rawQuery); + return true; + } + }); + //Add children directories + DirectoryInfo[] dirs = new DirectoryInfo(rawQuery).GetDirectories(); + foreach (DirectoryInfo dir in dirs) + { + if ((dir.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden) continue; - //if (System.IO.Directory.Exists(input)) { - var dirs = new DirectoryInfo(path).GetDirectories(); + DirectoryInfo dirCopy = dir; + var result = new Result(dir.Name, "Images/folder.png", "Ctrl + Enter to open the directory") + { + Action = c => + { + if (c.SpecialKeyState.CtrlPressed) + { + try + { + Process.Start(dirCopy.FullName); + return true; + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Could not start " + dirCopy.FullName); + return false; + } + } + context.API.ChangeQuery(dirCopy.FullName + "\\"); + return false; + } + }; - var parentDirKey = input.TrimEnd('\\', '/'); - if (!parentDirectories.ContainsKey(parentDirKey)) parentDirectories.Add(parentDirKey, dirs); + results.Add(result); + } - var fuzzy = FuzzyMatcher.Create(Path.GetFileName(currentPath).ToLower()); - foreach (var dir in dirs) { //.Where(x => (x.Attributes & FileAttributes.Hidden) != 0)) { - if ((dir.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden) continue; + //Add children files + FileInfo[] files = new DirectoryInfo(rawQuery).GetFiles(); + foreach (FileInfo file in files) + { + if ((file.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden) continue; - var result = new Result(dir.Name, "Images/folder.png") { - Action = (c) => { - //context.ChangeQuery(dir.FullName); - context.ChangeQuery(input + dir.Name + "\\"); - return false; - } - }; + string filePath = file.FullName; + var result = new Result(Path.GetFileName(filePath), "Images/file.png") + { + Action = c => + { + try + { + Process.Start(filePath); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Could not start " + filePath); + } - if (Path.GetFileName(currentPath).ToLower() != "") { - var matchResult = fuzzy.Evaluate(dir.Name); - result.Score = matchResult.Score; - if (!matchResult.Success) continue; - } + return true; + } + }; - results.Add(result); - } - //} + results.Add(result); + } - var Folder = Path.GetDirectoryName(currentPath); - if (Folder != null) { - - //var fuzzy = FuzzyMatcher.Create(Path.GetFileName(currentPath).ToLower()); - foreach (var dir in new DirectoryInfo(Folder).GetFiles()) { //.Where(x => (x.Attributes & FileAttributes.Hidden) != 0)) { - if ((dir.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden) continue; - - var dirPath = dir.FullName; - Result result = new Result(Path.GetFileNameWithoutExtension(dirPath), dirPath) { - Action = (c) => { - try { - Process.Start(dirPath); - } - catch (Exception ex) { - MessageBox.Show(ex.Message, "Could not start " + dir.Name); - } - - return true; - } - }; - - if (Path.GetFileName(currentPath) != "") { - var matchResult = fuzzy.Evaluate(dir.Name); - result.Score = matchResult.Score; - if (!matchResult.Success) continue; - } - - results.Add(result); - } - } - } - } + return results; + } + } } \ No newline at end of file diff --git a/Wox.Plugin.SystemPlugins/UrlPlugin.cs b/Wox.Plugin.SystemPlugins/UrlPlugin.cs index 313db7112c..455c49f182 100644 --- a/Wox.Plugin.SystemPlugins/UrlPlugin.cs +++ b/Wox.Plugin.SystemPlugins/UrlPlugin.cs @@ -1,29 +1,47 @@ using System; using System.Collections.Generic; using System.Diagnostics; +using System.IO; +using System.Security.Policy; +using System.Text.RegularExpressions; +using System.Windows; namespace Wox.Plugin.SystemPlugins { public class UrlPlugin : BaseSystemPlugin { + const string pattern = @"^(http|https|)\://|[a-zA-Z0-9\-\.]+\.[a-zA-Z](:[a-zA-Z0-9]*)?/?([a-zA-Z0-9\-\._\?\,\'/\\\+&%\$#\=~])*[^\.\,\)\(\s]$"; + Regex reg = new Regex(pattern, RegexOptions.Compiled | RegexOptions.IgnoreCase); + protected override List QueryInternal(Query query) { var raw = query.RawQuery; - Uri uri; - if (Uri.TryCreate(raw, UriKind.Absolute, out uri)) + if (reg.IsMatch(raw)) { return new List { new Result { Title = raw, - SubTitle = "Open the typed URL...", - IcoPath = "Images/url1.png", + SubTitle = "Open " + raw, + IcoPath = "Images/url.png", Score = 8, Action = _ => { - Process.Start(uri.AbsoluteUri); - return true; + if (!raw.ToLower().StartsWith("http")) + { + raw = "http://" + raw; + } + try + { + Process.Start(raw); + return true; + } + catch(Exception ex) + { + MessageBox.Show(ex.Message, "Could not open " + raw); + return false; + } } } }; @@ -38,7 +56,7 @@ namespace Wox.Plugin.SystemPlugins public override string Name { get { return "URL handler"; } } public override string Description { get { return "Provide Opening the typed URL from Wox."; } } - public override string IcoPath { get { return "Images/url2.png"; } } + public override string IcoPath { get { return "Images/url.png"; } } protected override void InitInternal(PluginInitContext context) { diff --git a/Wox.Plugin/EventHandler.cs b/Wox.Plugin/EventHandler.cs new file mode 100644 index 0000000000..0fd8461deb --- /dev/null +++ b/Wox.Plugin/EventHandler.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows.Input; + +namespace Wox.Plugin +{ + public delegate void WoxKeyDownEventHandler(object sender, WoxKeyDownEventArgs e); + + public class WoxKeyDownEventArgs + { + public string Query { get; set; } + public KeyEventArgs keyEventArgs { get; set; } + } +} diff --git a/Wox.Plugin/IPublicAPI.cs b/Wox.Plugin/IPublicAPI.cs index 3ec1558f37..85e501b651 100644 --- a/Wox.Plugin/IPublicAPI.cs +++ b/Wox.Plugin/IPublicAPI.cs @@ -32,5 +32,7 @@ namespace Wox.Plugin void ReloadPlugins(); List GetAllPlugins(); + + event WoxKeyDownEventHandler BackKeyDownEvent; } } diff --git a/Wox.Plugin/Wox.Plugin.csproj b/Wox.Plugin/Wox.Plugin.csproj index dc69528ecb..59bd3041bb 100644 --- a/Wox.Plugin/Wox.Plugin.csproj +++ b/Wox.Plugin/Wox.Plugin.csproj @@ -45,6 +45,7 @@ + diff --git a/Wox/Images/file.png b/Wox/Images/file.png new file mode 100644 index 0000000000000000000000000000000000000000..2913d69623b922f210b3910313ceb2fe97a706f0 GIT binary patch literal 1145 zcmV-<1cv*GP)3RSTBK}CXsAACVIT15yxDA*P&J}Q1FRg_9=vq+`JR z{Leji80M6B+kO**Gk89S5CUKf3gnIM49J=sDs@cTCNkL^Vo4pHdtYE!ps;fRYwx-> zsE0x-3WkfERY2bIVAw7u4FglU57TlG9XpGmvl-YXTM$wmmKuyR>AXbU3O6K2QIbyQ)zUZ=);{iUXRY9IDUQWS$19k-*sWaBY;XXc40YrSY$

CwA)bHW_E`%!FAmEP^-B;buym0@ zT6CNo3dVI^ATOMt{^zMtoJo#j@RL_60b84Y7MmZrV^#xBV$M9oN)Wk5a<+iyI>kV+ zIBDc!ENh^qM#G8d2=@KZjp634m4GcDelK2KdrtuH2;dN)sx&4_4-3*{nxe^ZTyU4P zkr76qbk@RUmsX?eR06vX{f?2(UaJIb+S@7`H#}Ul0MZp4(uNRSv^mdtz5<)uFgzP} zp1~Cs0Zgp8B8+2$aq>hvMh|YQ1gvXn5xbvj2ml7nPLKt3MKvXi5c$ZbI;T`oCF>rE z?vVvH^?EKQas{kfaV7rfi{qJnhmmUCUI}Q3d@4TJ{CEJ!7#376f|qLK7L_T*a3Y^6 zDp^E=_;i}wg-60q=mu`Sb{UTSJ%Y!Y4r1cV9hHF9JDNqymPZ4?WWEqMK8X52Y=#gy zs+wSq6ea{*B!M0yYe|Egi5spC<79Lc^^N5i zx#VIB(*)Ku9>C<+ivdu(s!D@PGgcLiT&ICkI#F0Loh%90pnE8Rhav|swHN>b3sj0C z0?-j6F{GEI106~yOKUFx;NKj>N-Ge-rety-SJhsE;{;f9ApmmLGK5(mzDy%NuDQH+ zVZcowYcoJ92{f58-kfQNMjZvfoB30ZX5FL-c&~((IPGm?HOvx=rsPeRyXj zptj+4(ciLd(J!AVtJdv;^~*c+1LWNm(kbG+UMfFx80D{-G6VPrGrycSN)dQN00000 LNkvXXu0mjfx$gec literal 0 HcmV?d00001 diff --git a/Wox/Images/url1.png b/Wox/Images/url.png similarity index 100% rename from Wox/Images/url1.png rename to Wox/Images/url.png diff --git a/Wox/Images/url2.png b/Wox/Images/url2.png deleted file mode 100644 index 44883fd1c2bcbf8c891a4a0794c149b5a1a63beb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24384 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 LNkvXXu0mjf&`n%Q diff --git a/Wox/MainWindow.xaml.cs b/Wox/MainWindow.xaml.cs index d7838c267f..077dd6bc11 100644 --- a/Wox/MainWindow.xaml.cs +++ b/Wox/MainWindow.xaml.cs @@ -133,6 +133,8 @@ namespace Wox return Plugins.AllPlugins; } + public event WoxKeyDownEventHandler BackKeyDownEvent; + public void PushResults(Query query, PluginMetadata plugin, List results) { results.ForEach(o => @@ -456,31 +458,6 @@ namespace Wox private void TbQuery_OnPreviewKeyDown(object sender, KeyEventArgs e) { //when alt is pressed, the real key should be e.SystemKey - - Action Shift_GoBack = () => - { - if (e.KeyboardDevice.IsKeyDown(Key.LeftShift) || e.KeyboardDevice.IsKeyDown(Key.RightShift)) - { - if (tbQuery.Text.EndsWith("\\")) - { - tbQuery.Text = tbQuery.Text.Remove(tbQuery.Text.Length - 1); - } - - if (tbQuery.Text.Contains("\\")) - { - var index = tbQuery.Text.LastIndexOf("\\"); - tbQuery.Text = tbQuery.Text.Remove(index) + "\\"; - } - else - { - tbQuery.Text = ""; - return; - } - } - - tbQuery.CaretIndex = int.MaxValue; - }; - Key key = (e.Key == Key.System ? e.SystemKey : e.Key); switch (key) { @@ -518,17 +495,23 @@ namespace Wox break; case Key.Enter: - Shift_GoBack(); AcceptSelect(resultCtrl.AcceptSelect()); e.Handled = true; break; + case Key.Back: + if (BackKeyDownEvent != null) + { + BackKeyDownEvent(tbQuery,new WoxKeyDownEventArgs() + { + Query = tbQuery.Text, + keyEventArgs = e + }); + } + break; + case Key.Tab: - Shift_GoBack(); AcceptSelect(resultCtrl.AcceptSelect()); - if (!tbQuery.Text.EndsWith("\\")) tbQuery.Text += "\\"; - AcceptSelect(resultCtrl.AcceptSelect()); - tbQuery.CaretIndex = int.MaxValue; e.Handled = true; break; } diff --git a/Wox/Wox.csproj b/Wox/Wox.csproj index 8f2dbdeb5f..ca4ac05fa9 100644 --- a/Wox/Wox.csproj +++ b/Wox/Wox.csproj @@ -377,8 +377,7 @@ - - +