Refactoring FolderLink and URL plugin.

This commit is contained in:
qianlifeng 2014-07-19 10:12:11 +08:00
parent f1697313c0
commit fc66fba577
10 changed files with 231 additions and 169 deletions

View File

@ -4,165 +4,208 @@ using System.Diagnostics;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Windows.Forms; using System.Windows.Forms;
using Wox.Infrastructure;
using Wox.Infrastructure.Storage.UserSettings; 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<string> driverNames;
private PluginInitContext context;
#region Properties public override string Description
{
private PluginInitContext context; get { return "Provide opening folder from wox directorily. You can add your favorite folders."; }
private static List<string> driverNames = null;
private static Dictionary<string, DirectoryInfo[]> parentDirectories = new Dictionary<string, DirectoryInfo[]>();
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"; } get { return "B4D3B69656E14D44865C8D818EAE47C4"; }
} }
public override string Name { get { return "Folder"; } } public override string Name
public override string IcoPath { get { return @"Images\folder.png"; } } {
get { return "Folder"; }
}
#endregion Properties public override string IcoPath
{
get { return @"Images\folder.png"; }
}
#region Misc #endregion Properties
protected override void InitInternal(PluginInitContext context) { public Control CreateSettingPanel()
this.context = context; {
return new FileSystemSettings();
}
if (UserSettingStorage.Instance.FolderLinks == null) { protected override void InitInternal(PluginInitContext context)
UserSettingStorage.Instance.FolderLinks = new List<FolderLink>(); {
UserSettingStorage.Instance.Save(); this.context = context;
} this.context.API.BackKeyDownEvent += ApiBackKeyDownEvent;
} InitialDriverList();
if (UserSettingStorage.Instance.FolderLinks == null)
{
UserSettingStorage.Instance.FolderLinks = new List<FolderLink>();
UserSettingStorage.Instance.Save();
}
}
public System.Windows.Controls.Control CreateSettingPanel() { private void ApiBackKeyDownEvent(object sender, WoxKeyDownEventArgs e)
return new FileSystemSettings(); {
} 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<Result> QueryInternal(Query query) { context.API.ChangeQuery(query);
var results = new List<Result>(); }
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();
foreach (var item in UserSettingStorage.Instance.FolderLinks.Where(x => x.Nickname.StartsWith(input, StringComparison.OrdinalIgnoreCase))) { protected override List<Result> QueryInternal(Query query)
results.Add(new Result(item.Nickname, "Images/folder.png") { {
Action = (c) => { string input = query.RawQuery.ToLower();
context.ChangeQuery(item.Nickname);
return false;
}
});
}
if (link == null && !driverNames.Any(input.StartsWith)) List<FolderLink> userFolderLinks = UserSettingStorage.Instance.FolderLinks.Where(
return results; x => x.Nickname.StartsWith(input, StringComparison.OrdinalIgnoreCase)).ToList();
List<Result> 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() { return results;
if (driverNames == null) { }
driverNames = new List<string>();
var allDrives = DriveInfo.GetDrives();
foreach (var driver in allDrives) {
driverNames.Add(driver.Name.ToLower().TrimEnd('\\'));
}
}
}
private void QueryInternal_Directory_Exists(string currentPath, string input, List<Result> results) { private void InitialDriverList()
string path = Directory.Exists(currentPath) ? new DirectoryInfo(currentPath).FullName : Path.GetDirectoryName(input); {
if (!System.IO.Directory.Exists(path)) return; if (driverNames == null)
{
driverNames = new List<string>();
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") { private List<Result> QueryInternal_Directory_Exists(string rawQuery)
Score = 100000, {
Action = (c) => { var results = new List<Result>();
if (Directory.Exists(currentPath)) { if (!Directory.Exists(rawQuery)) return results;
Process.Start(currentPath);
}
else if (currentPath.Contains("\\")) {
var index = currentPath.LastIndexOf("\\");
Process.Start(currentPath.Remove(index) + "\\");
}
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)) { DirectoryInfo dirCopy = dir;
var dirs = new DirectoryInfo(path).GetDirectories(); 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('\\', '/'); results.Add(result);
if (!parentDirectories.ContainsKey(parentDirKey)) parentDirectories.Add(parentDirKey, dirs); }
var fuzzy = FuzzyMatcher.Create(Path.GetFileName(currentPath).ToLower()); //Add children files
foreach (var dir in dirs) { //.Where(x => (x.Attributes & FileAttributes.Hidden) != 0)) { FileInfo[] files = new DirectoryInfo(rawQuery).GetFiles();
if ((dir.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden) continue; foreach (FileInfo file in files)
{
if ((file.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden) continue;
var result = new Result(dir.Name, "Images/folder.png") { string filePath = file.FullName;
Action = (c) => { var result = new Result(Path.GetFileName(filePath), "Images/file.png")
//context.ChangeQuery(dir.FullName); {
context.ChangeQuery(input + dir.Name + "\\"); Action = c =>
return false; {
} try
}; {
Process.Start(filePath);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Could not start " + filePath);
}
if (Path.GetFileName(currentPath).ToLower() != "") { return true;
var matchResult = fuzzy.Evaluate(dir.Name); }
result.Score = matchResult.Score; };
if (!matchResult.Success) continue;
}
results.Add(result); results.Add(result);
} }
//}
var Folder = Path.GetDirectoryName(currentPath); return results;
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);
}
}
}
}
} }

View File

@ -1,29 +1,47 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.IO;
using System.Security.Policy;
using System.Text.RegularExpressions;
using System.Windows;
namespace Wox.Plugin.SystemPlugins namespace Wox.Plugin.SystemPlugins
{ {
public class UrlPlugin : BaseSystemPlugin public class UrlPlugin : BaseSystemPlugin
{ {
const string pattern = @"^(http|https|)\://|[a-zA-Z0-9\-\.]+\.[a-zA-Z](:[a-zA-Z0-9]*)?/?([a-zA-Z0-9\-\._\?\,\'/\\\+&amp;%\$#\=~])*[^\.\,\)\(\s]$";
Regex reg = new Regex(pattern, RegexOptions.Compiled | RegexOptions.IgnoreCase);
protected override List<Result> QueryInternal(Query query) protected override List<Result> QueryInternal(Query query)
{ {
var raw = query.RawQuery; var raw = query.RawQuery;
Uri uri; if (reg.IsMatch(raw))
if (Uri.TryCreate(raw, UriKind.Absolute, out uri))
{ {
return new List<Result> return new List<Result>
{ {
new Result new Result
{ {
Title = raw, Title = raw,
SubTitle = "Open the typed URL...", SubTitle = "Open " + raw,
IcoPath = "Images/url1.png", IcoPath = "Images/url.png",
Score = 8, Score = 8,
Action = _ => Action = _ =>
{ {
Process.Start(uri.AbsoluteUri); if (!raw.ToLower().StartsWith("http"))
return true; {
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 Name { get { return "URL handler"; } }
public override string Description { get { return "Provide Opening the typed URL from Wox."; } } 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) protected override void InitInternal(PluginInitContext context)
{ {

View File

@ -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; }
}
}

View File

@ -32,5 +32,7 @@ namespace Wox.Plugin
void ReloadPlugins(); void ReloadPlugins();
List<PluginPair> GetAllPlugins(); List<PluginPair> GetAllPlugins();
event WoxKeyDownEventHandler BackKeyDownEvent;
} }
} }

View File

@ -45,6 +45,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="AllowedLanguage.cs" /> <Compile Include="AllowedLanguage.cs" />
<Compile Include="EventHandler.cs" />
<Compile Include="IHttpProxy.cs" /> <Compile Include="IHttpProxy.cs" />
<Compile Include="IPlugin.cs" /> <Compile Include="IPlugin.cs" />
<Compile Include="IPublicAPI.cs" /> <Compile Include="IPublicAPI.cs" />

BIN
Wox/Images/file.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

View File

@ -133,6 +133,8 @@ namespace Wox
return Plugins.AllPlugins; return Plugins.AllPlugins;
} }
public event WoxKeyDownEventHandler BackKeyDownEvent;
public void PushResults(Query query, PluginMetadata plugin, List<Result> results) public void PushResults(Query query, PluginMetadata plugin, List<Result> results)
{ {
results.ForEach(o => results.ForEach(o =>
@ -456,31 +458,6 @@ namespace Wox
private void TbQuery_OnPreviewKeyDown(object sender, KeyEventArgs e) private void TbQuery_OnPreviewKeyDown(object sender, KeyEventArgs e)
{ {
//when alt is pressed, the real key should be e.SystemKey //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); Key key = (e.Key == Key.System ? e.SystemKey : e.Key);
switch (key) switch (key)
{ {
@ -518,17 +495,23 @@ namespace Wox
break; break;
case Key.Enter: case Key.Enter:
Shift_GoBack();
AcceptSelect(resultCtrl.AcceptSelect()); AcceptSelect(resultCtrl.AcceptSelect());
e.Handled = true; e.Handled = true;
break; break;
case Key.Back:
if (BackKeyDownEvent != null)
{
BackKeyDownEvent(tbQuery,new WoxKeyDownEventArgs()
{
Query = tbQuery.Text,
keyEventArgs = e
});
}
break;
case Key.Tab: case Key.Tab:
Shift_GoBack();
AcceptSelect(resultCtrl.AcceptSelect()); AcceptSelect(resultCtrl.AcceptSelect());
if (!tbQuery.Text.EndsWith("\\")) tbQuery.Text += "\\";
AcceptSelect(resultCtrl.AcceptSelect());
tbQuery.CaretIndex = int.MaxValue;
e.Handled = true; e.Handled = true;
break; break;
} }

View File

@ -377,8 +377,7 @@
<Resource Include="Images\color2.png" /> <Resource Include="Images\color2.png" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Resource Include="Images\url1.png" /> <Resource Include="Images\url.png" />
<Resource Include="Images\url2.png" />
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" /> <Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />