diff --git a/Plugins/Wox.Plugin.CMD/CMD.cs b/Plugins/Wox.Plugin.CMD/CMD.cs
index 786ad9ab6..6cd940396 100644
--- a/Plugins/Wox.Plugin.CMD/CMD.cs
+++ b/Plugins/Wox.Plugin.CMD/CMD.cs
@@ -143,8 +143,12 @@ namespace Wox.Plugin.CMD
private void ExecuteCmd(string cmd, bool runAsAdministrator = false)
{
- if (context.API.ShellRun(cmd, runAsAdministrator))
+ var fullCmd = CMDStorage.Instance.LeaveCmdOpen ? $"cmd /k \"{cmd}\" & pause & exit" : cmd;
+ var success = context.API.ShellRun(fullCmd, runAsAdministrator);
+ if (success)
+ {
CMDStorage.Instance.AddCmdHistory(cmd);
+ }
}
public void Init(PluginInitContext context)
@@ -176,8 +180,7 @@ namespace Wox.Plugin.CMD
private void OnWinRPressed()
{
context.API.ShowApp();
- // todo don't hardcode action keywords.
- context.API.ChangeQuery($">{Plugin.Query.TermSeperater}");
+ context.API.ChangeQuery($"{context.CurrentPluginMetadata.ActionKeywords[0]}{Plugin.Query.TermSeperater}");
}
public Control CreateSettingPanel()
diff --git a/Plugins/Wox.Plugin.CMD/Wox.Plugin.CMD.csproj b/Plugins/Wox.Plugin.CMD/Wox.Plugin.CMD.csproj
index b0b1fd0df..1d6384003 100644
--- a/Plugins/Wox.Plugin.CMD/Wox.Plugin.CMD.csproj
+++ b/Plugins/Wox.Plugin.CMD/Wox.Plugin.CMD.csproj
@@ -34,8 +34,8 @@
false
-
- ..\..\packages\Newtonsoft.Json.6.0.8\lib\net35\Newtonsoft.Json.dll
+
+ ..\..\packages\Newtonsoft.Json.7.0.1\lib\net35\Newtonsoft.Json.dll
True
@@ -48,8 +48,9 @@
-
+
..\..\packages\InputSimulator.1.0.4.0\lib\net20\WindowsInput.dll
+ True
diff --git a/Plugins/Wox.Plugin.CMD/packages.config b/Plugins/Wox.Plugin.CMD/packages.config
index 4687456d1..838721e88 100644
--- a/Plugins/Wox.Plugin.CMD/packages.config
+++ b/Plugins/Wox.Plugin.CMD/packages.config
@@ -1,5 +1,5 @@
-
+
\ No newline at end of file
diff --git a/Plugins/Wox.Plugin.Everything/Wox.Plugin.Everything.csproj b/Plugins/Wox.Plugin.Everything/Wox.Plugin.Everything.csproj
index 586aa2233..8a76c3216 100644
--- a/Plugins/Wox.Plugin.Everything/Wox.Plugin.Everything.csproj
+++ b/Plugins/Wox.Plugin.Everything/Wox.Plugin.Everything.csproj
@@ -35,9 +35,9 @@
-
- False
- ..\..\packages\Newtonsoft.Json.6.0.8\lib\net35\Newtonsoft.Json.dll
+
+ ..\..\packages\Newtonsoft.Json.7.0.1\lib\net35\Newtonsoft.Json.dll
+ True
diff --git a/Plugins/Wox.Plugin.Everything/packages.config b/Plugins/Wox.Plugin.Everything/packages.config
index 7a13476a5..9b49c9e22 100644
--- a/Plugins/Wox.Plugin.Everything/packages.config
+++ b/Plugins/Wox.Plugin.Everything/packages.config
@@ -1,4 +1,4 @@
-
+
\ No newline at end of file
diff --git a/Plugins/Wox.Plugin.Folder/Wox.Plugin.Folder.csproj b/Plugins/Wox.Plugin.Folder/Wox.Plugin.Folder.csproj
index 50b66b365..78e2830a2 100644
--- a/Plugins/Wox.Plugin.Folder/Wox.Plugin.Folder.csproj
+++ b/Plugins/Wox.Plugin.Folder/Wox.Plugin.Folder.csproj
@@ -34,8 +34,8 @@
false
-
- ..\..\packages\Newtonsoft.Json.6.0.8\lib\net35\Newtonsoft.Json.dll
+
+ ..\..\packages\Newtonsoft.Json.7.0.1\lib\net35\Newtonsoft.Json.dll
True
diff --git a/Plugins/Wox.Plugin.Folder/packages.config b/Plugins/Wox.Plugin.Folder/packages.config
index 7a13476a5..9b49c9e22 100644
--- a/Plugins/Wox.Plugin.Folder/packages.config
+++ b/Plugins/Wox.Plugin.Folder/packages.config
@@ -1,4 +1,4 @@
-
+
\ No newline at end of file
diff --git a/Plugins/Wox.Plugin.PluginManagement/Main.cs b/Plugins/Wox.Plugin.PluginManagement/Main.cs
index c11fa86da..785d28017 100644
--- a/Plugins/Wox.Plugin.PluginManagement/Main.cs
+++ b/Plugins/Wox.Plugin.PluginManagement/Main.cs
@@ -14,7 +14,7 @@ namespace Wox.Plugin.PluginManagement
{
public class Main : IPlugin, IPluginI18n
{
- private static string APIBASE = "https://api.getwox.com";
+ private static string APIBASE = "http://api.getwox.com";
private static string PluginConfigName = "plugin.json";
private static string pluginSearchUrl = APIBASE + "/plugin/search/";
private const string ListCommand = "list";
diff --git a/Plugins/Wox.Plugin.PluginManagement/Wox.Plugin.PluginManagement.csproj b/Plugins/Wox.Plugin.PluginManagement/Wox.Plugin.PluginManagement.csproj
index 089c4d9ae..3870480f3 100644
--- a/Plugins/Wox.Plugin.PluginManagement/Wox.Plugin.PluginManagement.csproj
+++ b/Plugins/Wox.Plugin.PluginManagement/Wox.Plugin.PluginManagement.csproj
@@ -34,8 +34,8 @@
false
-
- ..\..\packages\Newtonsoft.Json.6.0.8\lib\net35\Newtonsoft.Json.dll
+
+ ..\..\packages\Newtonsoft.Json.7.0.1\lib\net35\Newtonsoft.Json.dll
True
diff --git a/Plugins/Wox.Plugin.PluginManagement/packages.config b/Plugins/Wox.Plugin.PluginManagement/packages.config
index 7a13476a5..9b49c9e22 100644
--- a/Plugins/Wox.Plugin.PluginManagement/packages.config
+++ b/Plugins/Wox.Plugin.PluginManagement/packages.config
@@ -1,4 +1,4 @@
-
+
\ No newline at end of file
diff --git a/Plugins/Wox.Plugin.Program/Wox.Plugin.Program.csproj b/Plugins/Wox.Plugin.Program/Wox.Plugin.Program.csproj
index 1506641de..784a900d9 100644
--- a/Plugins/Wox.Plugin.Program/Wox.Plugin.Program.csproj
+++ b/Plugins/Wox.Plugin.Program/Wox.Plugin.Program.csproj
@@ -34,9 +34,9 @@
false
-
- False
- ..\..\packages\Newtonsoft.Json.6.0.8\lib\net35\Newtonsoft.Json.dll
+
+ ..\..\packages\Newtonsoft.Json.7.0.1\lib\net35\Newtonsoft.Json.dll
+ True
diff --git a/Plugins/Wox.Plugin.Program/packages.config b/Plugins/Wox.Plugin.Program/packages.config
index 7a13476a5..9b49c9e22 100644
--- a/Plugins/Wox.Plugin.Program/packages.config
+++ b/Plugins/Wox.Plugin.Program/packages.config
@@ -1,4 +1,4 @@
-
+
\ No newline at end of file
diff --git a/Plugins/Wox.Plugin.WebSearch/Wox.Plugin.WebSearch.csproj b/Plugins/Wox.Plugin.WebSearch/Wox.Plugin.WebSearch.csproj
index 049780ab0..fec98b0da 100644
--- a/Plugins/Wox.Plugin.WebSearch/Wox.Plugin.WebSearch.csproj
+++ b/Plugins/Wox.Plugin.WebSearch/Wox.Plugin.WebSearch.csproj
@@ -34,9 +34,9 @@
false
-
- False
- ..\..\packages\Newtonsoft.Json.6.0.8\lib\net35\Newtonsoft.Json.dll
+
+ ..\..\packages\Newtonsoft.Json.7.0.1\lib\net35\Newtonsoft.Json.dll
+ True
diff --git a/Plugins/Wox.Plugin.WebSearch/packages.config b/Plugins/Wox.Plugin.WebSearch/packages.config
index 7a13476a5..9b49c9e22 100644
--- a/Plugins/Wox.Plugin.WebSearch/packages.config
+++ b/Plugins/Wox.Plugin.WebSearch/packages.config
@@ -1,4 +1,4 @@
-
+
\ No newline at end of file
diff --git a/README.md b/README.md
index a993a059b..3f68a71a7 100644
--- a/README.md
+++ b/README.md
@@ -1,19 +1,23 @@
-Wox [](https://ci.appveyor.com/project/qianlifeng/wox) [](https://www.bountysource.com/teams/wox?utm_source=Wox&utm_medium=shield&utm_campaign=raised) [](http://issuestats.com/github/Wox-launcher/Wox)
-=========
-[Wox](https://www.getwox.com/) is a launcher for Windows, an alternative to [Alfred](https://www.alfredapp.com/) or [Launchy](http://www.launchy.net/). You can launch everything with just a few keystrokes!
+[](https://ci.appveyor.com/project/qianlifeng/wox)
+[](https://www.bountysource.com/teams/wox?utm_source=Wox&utm_medium=shield&utm_campaign=raised)
+[](http://issuestats.com/github/Wox-launcher/Wox)
-Screenshot
=========
-More screenshots
-
+Wox is a launcher for Windows, an alternative to [Alfred](https://www.alfredapp.com/) and [Launchy](http://www.launchy.net/). You can launch everything with just a few keystrokes!
+
+Demo
+=========
+
+[More demo](https://github.com/Wox-launcher/Wox/wiki/Screenshot)
+
Features
=========
-1. Search all applications, folders, files, [bookmarks](https://www.getwox.com/plugin/16).
+1. Search all applications, folders, files, [bookmarks](http://www.getwox.com/plugin/16).
2. Search Web using keyword (e.g. search google with `g search_term`)
-3. Build custom themes in [https://www.getwox.com/theme/builder](https://www.getwox.com/theme/builder)
-4. Install plugins from [https://www.getwox.com/plugin](https://www.getwox.com/plugin)
+3. Build custom themes in [http://www.getwox.com/theme/builder](http://www.getwox.com/theme/builder)
+4. Install plugins from [http://www.getwox.com/plugin](http://www.getwox.com/plugin)
Installation
=========
@@ -33,7 +37,7 @@ Simple Usage
Contribute
=========
-If you are a developer, please feel free to send a pull request to the **Dev** branch. We still have a lot of features and bugs to resolve. Take a look at [issues page](https://github.com/Wox-launcher/Wox/issues) if you want to contribute :)
+If you are a developer, please feel free to send a pull request to the **Dev** branch. We still have a lot of features and bugs to resolve. Take a look at [issues page](https://github.com/Wox-launcher/Wox/issues), especially for [help_needed](https://github.com/Wox-launcher/Wox/issues?q=is%3Aopen+is%3Aissue+label%3Ahelp_needed) labeled issue. :)
If you are not a developer, please install the [Latest build](https://ci.appveyor.com/project/qianlifeng/wox/history) and report bugs (how to: [English](https://github.com/Wox-launcher/Wox/wiki/FAQ-English) [中文](https://github.com/Wox-launcher/Wox/wiki/FAQ-%E4%B8%AD%E6%96%87)). Feedback is always welcome!
diff --git a/Wox.Core/Theme/Theme.cs b/Wox.Core/Theme/Theme.cs
index e9f55a83a..1317b5f9c 100644
--- a/Wox.Core/Theme/Theme.cs
+++ b/Wox.Core/Theme/Theme.cs
@@ -59,16 +59,11 @@ namespace Wox.Core.Theme
UserSettingStorage.Instance.Save();
ResourceMerger.UpdateResource(this);
- try
- {
- var isBlur = Application.Current.FindResource("ThemeBlurEnabled");
- if (isBlur is bool)
- {
- SetBlurForWindow(Application.Current.MainWindow, (bool)isBlur);
- }
- }
- catch (ResourceReferenceKeyNotFoundException e)
+ // Exception of FindResource can't be cathed if global exception handle is set
+ var isBlur = Application.Current.TryFindResource("ThemeBlurEnabled");
+ if (isBlur is bool)
{
+ SetBlurForWindow(Application.Current.MainWindow, (bool)isBlur);
}
}
@@ -173,10 +168,13 @@ namespace Wox.Core.Theme
/// Sets the blur for a window via SetWindowCompositionAttribute
///
/// window to blur
- /// true/false - on or off correspondingly
- private void SetBlurForWindow(Window wind, bool status)
+ /// true/false - on or off correspondingly
+ private void SetBlurForWindow(Window wind, bool isBlur)
{
- SetWindowAccent(wind, status ? AccentState.ACCENT_ENABLE_BLURBEHIND : AccentState.ACCENT_DISABLED);
+ if (isBlur)
+ {
+ SetWindowAccent(wind, AccentState.ACCENT_ENABLE_BLURBEHIND);
+ }
}
private void SetWindowAccent(Window wind, AccentState themeAccentMode)
diff --git a/Wox.Core/Updater/UpdaterManager.cs b/Wox.Core/Updater/UpdaterManager.cs
index 65778896a..b9284a5ca 100644
--- a/Wox.Core/Updater/UpdaterManager.cs
+++ b/Wox.Core/Updater/UpdaterManager.cs
@@ -18,7 +18,7 @@ namespace Wox.Core.Updater
public class UpdaterManager
{
private static UpdaterManager instance;
- private const string VersionCheckURL = "https://api.getwox.com/release/latest/";
+ private const string VersionCheckURL = "http://api.getwox.com/release/latest/";
private const string UpdateFeedURL = "http://upgrade.getwox.com/update.xml";
//private const string UpdateFeedURL = "http://127.0.0.1:8888/update.xml";
private static SemanticVersion currentVersion;
diff --git a/Wox.Core/Wox.Core.csproj b/Wox.Core/Wox.Core.csproj
index 02376a034..877abfa32 100644
--- a/Wox.Core/Wox.Core.csproj
+++ b/Wox.Core/Wox.Core.csproj
@@ -35,16 +35,16 @@
- False
..\packages\SharpZipLib.0.86.0\lib\20\ICSharpCode.SharpZipLib.dll
+ True
..\packages\NAppUpdate.Framework.0.3.2.0\lib\net20\NAppUpdate.Framework.dll
True
-
- False
- ..\packages\Newtonsoft.Json.6.0.8\lib\net35\Newtonsoft.Json.dll
+
+ ..\packages\Newtonsoft.Json.7.0.1\lib\net35\Newtonsoft.Json.dll
+ True
diff --git a/Wox.Core/i18n/Internationalization.cs b/Wox.Core/i18n/Internationalization.cs
index 5ce242f18..f2ad412da 100644
--- a/Wox.Core/i18n/Internationalization.cs
+++ b/Wox.Core/i18n/Internationalization.cs
@@ -88,20 +88,15 @@ namespace Wox.Core.i18n
public string GetTranslation(string key)
{
- try
+ var translation = Application.Current.TryFindResource(key);
+ if (translation is string)
{
- object translation = Application.Current.FindResource(key);
- if (translation == null)
- {
- return "NoTranslation";
- }
return translation.ToString();
}
- catch
+ else
{
return "NoTranslation";
}
-
}
private string GetLanguagePath(string languageCode)
diff --git a/Wox.Core/packages.config b/Wox.Core/packages.config
index 2825ea4cc..1bef75167 100644
--- a/Wox.Core/packages.config
+++ b/Wox.Core/packages.config
@@ -1,6 +1,6 @@
-
+
\ No newline at end of file
diff --git a/Wox.Infrastructure/Wox.Infrastructure.csproj b/Wox.Infrastructure/Wox.Infrastructure.csproj
index 6e65f0d1e..0c75c7456 100644
--- a/Wox.Infrastructure/Wox.Infrastructure.csproj
+++ b/Wox.Infrastructure/Wox.Infrastructure.csproj
@@ -36,9 +36,9 @@
false
-
- False
- ..\packages\Newtonsoft.Json.6.0.8\lib\net35\Newtonsoft.Json.dll
+
+ ..\packages\Newtonsoft.Json.7.0.1\lib\net35\Newtonsoft.Json.dll
+ True
..\packages\NLog.4.2.0\lib\net35\NLog.dll
@@ -89,6 +89,8 @@
Always
+
+
Designer
diff --git a/Wox.Infrastructure/packages.config b/Wox.Infrastructure/packages.config
index 0c8252da9..ff40a49ba 100644
--- a/Wox.Infrastructure/packages.config
+++ b/Wox.Infrastructure/packages.config
@@ -1,6 +1,6 @@
-
+
\ No newline at end of file
diff --git a/Wox.UpdateFeedGenerator/Wox.UpdateFeedGenerator.csproj b/Wox.UpdateFeedGenerator/Wox.UpdateFeedGenerator.csproj
index 12f4c1d0f..cc61dc165 100644
--- a/Wox.UpdateFeedGenerator/Wox.UpdateFeedGenerator.csproj
+++ b/Wox.UpdateFeedGenerator/Wox.UpdateFeedGenerator.csproj
@@ -37,9 +37,9 @@
..\packages\NAppUpdate.Framework.0.3.2.0\lib\net20\NAppUpdate.Framework.dll
True
-
- False
- ..\packages\Newtonsoft.Json.6.0.8\lib\net35\Newtonsoft.Json.dll
+
+ ..\packages\Newtonsoft.Json.7.0.1\lib\net35\Newtonsoft.Json.dll
+ True
diff --git a/Wox.UpdateFeedGenerator/packages.config b/Wox.UpdateFeedGenerator/packages.config
index 9661aa0af..988cd2fc4 100644
--- a/Wox.UpdateFeedGenerator/packages.config
+++ b/Wox.UpdateFeedGenerator/packages.config
@@ -1,5 +1,5 @@
-
+
\ No newline at end of file
diff --git a/Wox/App.config b/Wox/App.config
deleted file mode 100644
index c718ae367..000000000
--- a/Wox/App.config
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Wox/MainWindow.xaml.cs b/Wox/MainWindow.xaml.cs
index 39cf8b3c7..aef06b9eb 100644
--- a/Wox/MainWindow.xaml.cs
+++ b/Wox/MainWindow.xaml.cs
@@ -80,6 +80,7 @@ namespace Wox
public void CloseApp()
{
+ notifyIcon.Visible = false;
Application.Current.Shutdown();
}
diff --git a/Wox/Wox.csproj b/Wox/Wox.csproj
index 12ffaea6b..998a8f21a 100644
--- a/Wox/Wox.csproj
+++ b/Wox/Wox.csproj
@@ -61,21 +61,30 @@
- False
..\packages\Exceptionless.1.5.2121\lib\net35\Exceptionless.dll
+ True
-
+
+ ..\packages\Exceptionless.1.5.2121\lib\net35\Exceptionless.Models.dll
+ True
+
+
+ ..\packages\SharpZipLib.0.86.0\lib\20\ICSharpCode.SharpZipLib.dll
+ True
+
+
..\packages\MarkdownSharp.1.13.0.0\lib\35\MarkdownSharp.dll
+ True
-
- False
- ..\packages\Newtonsoft.Json.6.0.8\lib\net35\Newtonsoft.Json.dll
+
+ ..\packages\Newtonsoft.Json.7.0.1\lib\net35\Newtonsoft.Json.dll
+ True
- False
..\packages\NHotkey.1.2.1\lib\net20\NHotkey.dll
+ True
-
+
..\packages\NHotkey.Wpf.1.2.1\lib\net35\NHotkey.Wpf.dll
True
@@ -98,6 +107,10 @@
+
+ ..\packages\InputSimulator.1.0.4.0\lib\net20\WindowsInput.dll
+ True
+
@@ -299,9 +312,6 @@
ResXFileCodeGenerator
Resources.Designer.cs
-
- Designer
-
SettingsSingleFileGenerator
Settings.Designer.cs
diff --git a/Wox/ias03vpr.pm0 b/Wox/ias03vpr.pm0
deleted file mode 100644
index 2bf2868f8..000000000
--- a/Wox/ias03vpr.pm0
+++ /dev/null
@@ -1,850 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Diagnostics;
-using System.Drawing;
-using System.IO;
-using System.Linq;
-using System.Net;
-using System.Reflection;
-using System.Threading;
-using System.Windows;
-using System.Windows.Controls;
-using System.Windows.Forms;
-using System.Windows.Input;
-using System.Windows.Media.Animation;
-using NHotkey;
-using NHotkey.Wpf;
-using Wox.Core.i18n;
-using Wox.Core.Plugin;
-using Wox.Core.Theme;
-using Wox.Core.Updater;
-using Wox.Core.UserSettings;
-using Wox.Helper;
-using Wox.Infrastructure;
-using Wox.Infrastructure.Hotkey;
-using Wox.Plugin;
-using Wox.Storage;
-using ContextMenu = System.Windows.Forms.ContextMenu;
-using DataFormats = System.Windows.DataFormats;
-using DragEventArgs = System.Windows.DragEventArgs;
-using IDataObject = System.Windows.IDataObject;
-using KeyEventArgs = System.Windows.Input.KeyEventArgs;
-using MenuItem = System.Windows.Forms.MenuItem;
-using MessageBox = System.Windows.MessageBox;
-using ToolTip = System.Windows.Controls.ToolTip;
-
-namespace Wox
-{
- public partial class MainWindow : IPublicAPI
- {
-
- #region Properties
-
- private readonly Storyboard progressBarStoryboard = new Storyboard();
- private NotifyIcon notifyIcon;
- private bool queryHasReturn;
- private string lastQuery;
- private ToolTip toolTip = new ToolTip();
-
- private bool ignoreTextChange = false;
-
- #endregion
-
- #region Public API
-
- public void ChangeQuery(string query, bool requery = false)
- {
- Dispatcher.Invoke(new Action(() =>
- {
- tbQuery.Text = query;
- tbQuery.CaretIndex = tbQuery.Text.Length;
- if (requery)
- {
- TextBoxBase_OnTextChanged(null, null);
- }
- }));
- }
-
- public void CloseApp()
- {
- Dispatcher.Invoke(new Action(() =>
- {
- notifyIcon.Visible = false;
- Close();
- Environment.Exit(0);
- }));
- }
-
- public void HideApp()
- {
- Dispatcher.Invoke(new Action(HideWox));
- }
-
- public void ShowApp()
- {
- Dispatcher.Invoke(new Action(() => ShowWox()));
- }
-
- public void ShowMsg(string title, string subTitle, string iconPath)
- {
- Dispatcher.Invoke(new Action(() =>
- {
- var m = new Msg { Owner = GetWindow(this) };
- m.Show(title, subTitle, iconPath);
- }));
- }
-
- public void OpenSettingDialog()
- {
- Dispatcher.Invoke(new Action(() => WindowOpener.Open(this)));
- }
-
- public void StartLoadingBar()
- {
- Dispatcher.Invoke(new Action(StartProgress));
- }
-
- public void StopLoadingBar()
- {
- Dispatcher.Invoke(new Action(StopProgress));
- }
-
- public void InstallPlugin(string path)
- {
- Dispatcher.Invoke(new Action(() => PluginManager.InstallPlugin(path)));
- }
-
- public void ReloadPlugins()
- {
- Dispatcher.Invoke(new Action(() => PluginManager.Init(this)));
- }
-
- public string GetTranslation(string key)
- {
- return InternationalizationManager.Instance.GetTranslation(key);
- }
-
- public List GetAllPlugins()
- {
- return PluginManager.AllPlugins;
- }
-
- public event WoxKeyDownEventHandler BackKeyDownEvent;
- public event WoxGlobalKeyboardEventHandler GlobalKeyboardEvent;
- public event AfterWoxQueryEventHandler AfterWoxQueryEvent;
- public event AfterWoxQueryEventHandler BeforeWoxQueryEvent;
- public event ResultItemDropEventHandler ResultItemDropEvent;
-
- public void PushResults(Query query, PluginMetadata plugin, List results)
- {
- results.ForEach(o =>
- {
- o.PluginDirectory = plugin.PluginDirectory;
- o.PluginID = plugin.ID;
- o.OriginQuery = query;
- if (o.ContextMenu != null)
- {
- o.ContextMenu.ForEach(t =>
- {
- t.PluginDirectory = plugin.PluginDirectory;
- t.PluginID = plugin.ID;
- });
- }
- });
- UpdateResultView(results);
- }
-
- public void ShowContextMenu(PluginMetadata plugin, List results)
- {
- if (results != null && results.Count > 0)
- {
- results.ForEach(o =>
- {
- o.PluginDirectory = plugin.PluginDirectory;
- o.PluginID = plugin.ID;
- o.ContextMenu = null;
- });
- pnlContextMenu.Clear();
- pnlContextMenu.AddResults(results);
- pnlContextMenu.Visibility = Visibility.Visible;
- pnlResult.Visibility = Visibility.Collapsed;
- }
- }
-
- #endregion
-
- public MainWindow()
- {
- InitializeComponent();
- ThreadPool.SetMaxThreads(30, 10);
- ThreadPool.SetMinThreads(10, 5);
-
- WebRequest.RegisterPrefix("data", new DataWebRequestFactory());
- GlobalHotkey.Instance.hookedKeyboardCallback += KListener_hookedKeyboardCallback;
- progressBar.ToolTip = toolTip;
- InitialTray();
- pnlResult.LeftMouseClickEvent += SelectResult;
- pnlResult.ItemDropEvent += pnlResult_ItemDropEvent;
- pnlContextMenu.LeftMouseClickEvent += SelectResult;
- pnlResult.RightMouseClickEvent += pnlResult_RightMouseClickEvent;
-
- ThemeManager.Theme.ChangeTheme(UserSettingStorage.Instance.Theme);
- InternationalizationManager.Instance.ChangeLanguage(UserSettingStorage.Instance.Language);
-
- SetHotkey(UserSettingStorage.Instance.Hotkey, OnHotkey);
- SetCustomPluginHotkey();
-
- Closing += MainWindow_Closing;
- //since MainWIndow implement IPublicAPI, so we need to finish ctor MainWindow object before
- //PublicAPI invoke in plugin init methods. E.g FolderPlugin
- ThreadPool.QueueUserWorkItem(o =>
- {
- Thread.Sleep(50);
- PluginManager.Init(this);
- });
- ThreadPool.QueueUserWorkItem(o =>
- {
- Thread.Sleep(50);
- PreLoadImages();
- });
- }
-
- void pnlResult_ItemDropEvent(Result result, IDataObject dropDataObject, DragEventArgs args)
- {
- PluginPair pluginPair = PluginManager.AllPlugins.FirstOrDefault(o => o.Metadata.ID == result.PluginID);
- if (ResultItemDropEvent != null && pluginPair != null)
- {
- foreach (var delegateHandler in ResultItemDropEvent.GetInvocationList())
- {
- if (delegateHandler.Target == pluginPair.Plugin)
- {
- delegateHandler.DynamicInvoke(result, dropDataObject, args);
- }
- }
- }
- }
-
- private bool KListener_hookedKeyboardCallback(KeyEvent keyevent, int vkcode, SpecialKeyState state)
- {
- if (GlobalKeyboardEvent != null)
- {
- return GlobalKeyboardEvent((int)keyevent, vkcode, state);
- }
- return true;
- }
-
- private void PreLoadImages()
- {
- ImageLoader.ImageLoader.PreloadImages();
- }
-
- void pnlResult_RightMouseClickEvent(Result result)
- {
- ShowContextMenuFromResult(result);
- }
-
- void MainWindow_Closing(object sender, CancelEventArgs e)
- {
- UserSettingStorage.Instance.WindowLeft = Left;
- UserSettingStorage.Instance.WindowTop = Top;
- UserSettingStorage.Instance.Save();
- this.HideWox();
- e.Cancel = true;
- }
-
- private void MainWindow_OnLoaded(object sender, RoutedEventArgs e)
- {
- if (UserSettingStorage.Instance.WindowLeft == 0
- && UserSettingStorage.Instance.WindowTop == 0)
- {
- Left = UserSettingStorage.Instance.WindowLeft
- = (SystemParameters.PrimaryScreenWidth - ActualWidth) / 2;
- Top = UserSettingStorage.Instance.WindowTop
- = (SystemParameters.PrimaryScreenHeight - ActualHeight) / 5;
- }
- else
- {
- Left = UserSettingStorage.Instance.WindowLeft;
- Top = UserSettingStorage.Instance.WindowTop;
- }
-
- InitProgressbarAnimation();
- WindowIntelopHelper.DisableControlBox(this);
- CheckUpdate();
- }
-
- private void CheckUpdate()
- {
- UpdaterManager.Instance.PrepareUpdateReady += OnPrepareUpdateReady;
- UpdaterManager.Instance.UpdateError += OnUpdateError;
- UpdaterManager.Instance.CheckUpdate();
- }
-
- void OnUpdateError(object sender, EventArgs e)
- {
- string updateError = InternationalizationManager.Instance.GetTranslation("update_wox_update_error");
- MessageBox.Show(updateError);
- }
-
- private void OnPrepareUpdateReady(object sender, EventArgs e)
- {
- Dispatcher.Invoke(new Action(() =>
- {
- new WoxUpdate().ShowDialog();
- }));
- }
-
- public void SetHotkey(string hotkeyStr, EventHandler action)
- {
- var hotkey = new HotkeyModel(hotkeyStr);
- try
- {
- HotkeyManager.Current.AddOrReplace(hotkeyStr, hotkey.CharKey, hotkey.ModifierKeys, action);
- }
- catch (Exception)
- {
- string errorMsg = string.Format(InternationalizationManager.Instance.GetTranslation("registerHotkeyFailed"), hotkeyStr);
- MessageBox.Show(errorMsg);
- }
- }
-
- public void RemoveHotkey(string hotkeyStr)
- {
- if (!string.IsNullOrEmpty(hotkeyStr))
- {
- HotkeyManager.Current.Remove(hotkeyStr);
- }
- }
-
- private void SetCustomPluginHotkey()
- {
- if (UserSettingStorage.Instance.CustomPluginHotkeys == null) return;
- foreach (CustomPluginHotkey hotkey in UserSettingStorage.Instance.CustomPluginHotkeys)
- {
- CustomPluginHotkey hotkey1 = hotkey;
- SetHotkey(hotkey.Hotkey, delegate
- {
- ShowApp();
- ChangeQuery(hotkey1.ActionKeyword, true);
- });
- }
- }
-
- private void OnHotkey(object sender, HotkeyEventArgs e)
- {
- ToggleWox();
- e.Handled = true;
- }
-
- public void ToggleWox()
- {
- if (!IsVisible)
- {
- ShowWox();
- }
- else
- {
- HideWox();
- }
- }
-
- private void InitProgressbarAnimation()
- {
- var da = new DoubleAnimation(progressBar.X2, ActualWidth + 100, new Duration(new TimeSpan(0, 0, 0, 0, 1600)));
- var da1 = new DoubleAnimation(progressBar.X1, ActualWidth, new Duration(new TimeSpan(0, 0, 0, 0, 1600)));
- Storyboard.SetTargetProperty(da, new PropertyPath("(Line.X2)"));
- Storyboard.SetTargetProperty(da1, new PropertyPath("(Line.X1)"));
- progressBarStoryboard.Children.Add(da);
- progressBarStoryboard.Children.Add(da1);
- progressBarStoryboard.RepeatBehavior = RepeatBehavior.Forever;
- progressBar.Visibility = Visibility.Hidden;
- progressBar.BeginStoryboard(progressBarStoryboard);
- }
-
- private void InitialTray()
- {
- notifyIcon = new NotifyIcon { Text = "Wox", Icon = Properties.Resources.app, Visible = true };
- notifyIcon.Click += (o, e) => ShowWox();
- var open = new MenuItem("Open");
- open.Click += (o, e) => ShowWox();
- var setting = new MenuItem("Settings");
- setting.Click += (o, e) => OpenSettingDialog();
- var exit = new MenuItem("Exit");
- exit.Click += (o, e) => CloseApp();
- MenuItem[] childen = { open, setting, exit };
- notifyIcon.ContextMenu = new ContextMenu(childen);
- }
-
- private void TextBoxBase_OnTextChanged(object sender, TextChangedEventArgs e)
- {
- if (ignoreTextChange) { ignoreTextChange = false; return; }
-
- lastQuery = tbQuery.Text;
- toolTip.IsOpen = false;
- pnlResult.Dirty = true;
- int searchDelay = GetSearchDelay(lastQuery);
-
- Dispatcher.DelayInvoke("UpdateSearch",
- o =>
- {
- Dispatcher.DelayInvoke("ClearResults", i =>
- {
- // first try to use clear method inside pnlResult, which is more closer to the add new results
- // and this will not bring splash issues.After waiting 100ms, if there still no results added, we
- // must clear the result. otherwise, it will be confused why the query changed, but the results
- // didn't.
- if (pnlResult.Dirty) pnlResult.Clear();
- }, TimeSpan.FromMilliseconds(100), null);
- queryHasReturn = false;
- Query query = new Query(lastQuery);
- query.IsIntantQuery = searchDelay == 0;
- FireBeforeWoxQueryEvent(query);
- Query(query);
- Dispatcher.DelayInvoke("ShowProgressbar", originQuery =>
- {
- if (!queryHasReturn && originQuery == tbQuery.Text && !string.IsNullOrEmpty(lastQuery))
- {
- StartProgress();
- }
- }, TimeSpan.FromMilliseconds(150), tbQuery.Text);
- FireAfterWoxQueryEvent(query);
- }, TimeSpan.FromMilliseconds(searchDelay));
- }
-
- private int GetSearchDelay(string query)
- {
- if (!string.IsNullOrEmpty(query) && PluginManager.IsInstantQuery(query))
- {
- DebugHelper.WriteLine("execute query without delay");
- return 0;
- }
-
- DebugHelper.WriteLine("execute query with 200ms delay");
- return 200;
- }
-
- private void FireAfterWoxQueryEvent(Query q)
- {
- if (AfterWoxQueryEvent != null)
- {
- //We shouldn't let those events slow down real query
- //so I put it in the new thread
- ThreadPool.QueueUserWorkItem(o =>
- {
- AfterWoxQueryEvent(new WoxQueryEventArgs()
- {
- Query = q
- });
- });
- }
- }
-
- private void FireBeforeWoxQueryEvent(Query q)
- {
- if (BeforeWoxQueryEvent != null)
- {
- //We shouldn't let those events slow down real query
- //so I put it in the new thread
- ThreadPool.QueueUserWorkItem(o =>
- {
- BeforeWoxQueryEvent(new WoxQueryEventArgs()
- {
- Query = q
- });
- });
- }
- }
-
- private void Query(Query q)
- {
- PluginManager.Query(q);
- StopProgress();
- BackToResultMode();
- }
-
- private void BackToResultMode()
- {
- pnlResult.Visibility = Visibility.Visible;
- pnlContextMenu.Visibility = Visibility.Collapsed;
- }
-
- private void Border_OnMouseDown(object sender, MouseButtonEventArgs e)
- {
- if (e.ChangedButton == MouseButton.Left) DragMove();
- }
-
- private void StartProgress()
- {
- progressBar.Visibility = Visibility.Visible;
- }
-
- private void StopProgress()
- {
- progressBar.Visibility = Visibility.Hidden;
- }
-
- private void HideWox()
- {
- Hide();
- }
-
- private void ShowWox(bool selectAll = true)
- {
- UserSettingStorage.Instance.IncreaseActivateTimes();
- if (!double.IsNaN(Left) && !double.IsNaN(Top))
- {
- var origScreen = Screen.FromRectangle(new Rectangle((int)Left, (int)Top, (int)ActualWidth, (int)ActualHeight));
- var screen = Screen.FromPoint(System.Windows.Forms.Cursor.Position);
- var coordX = (Left - origScreen.WorkingArea.Left) / (origScreen.WorkingArea.Width - ActualWidth);
- var coordY = (Top - origScreen.WorkingArea.Top) / (origScreen.WorkingArea.Height - ActualHeight);
- Left = (screen.WorkingArea.Width - ActualWidth) * coordX + screen.WorkingArea.Left;
- Top = (screen.WorkingArea.Height - ActualHeight) * coordY + screen.WorkingArea.Top;
- }
-
- Show();
- Activate();
- Focus();
- tbQuery.Focus();
- if (selectAll) tbQuery.SelectAll();
- }
-
- private void MainWindow_OnDeactivated(object sender, EventArgs e)
- {
- if (UserSettingStorage.Instance.HideWhenDeactive)
- {
- HideWox();
- }
- }
-
- private void TbQuery_OnPreviewKeyDown(object sender, KeyEventArgs e)
- {
- //when alt is pressed, the real key should be e.SystemKey
- Key key = (e.Key == Key.System ? e.SystemKey : e.Key);
- switch (key)
- {
- case Key.Escape:
- if (IsInContextMenuMode)
- {
- BackToResultMode();
- }
- else
- {
- HideWox();
- }
- e.Handled = true;
- break;
-
- case Key.Tab:
- if (GlobalHotkey.Instance.CheckModifiers().ShiftPressed)
- {
- SelectPrevItem();
- }
- else
- {
- SelectNextItem();
- }
- e.Handled = true;
- break;
-
- case Key.N:
- case Key.J:
- if (GlobalHotkey.Instance.CheckModifiers().CtrlPressed)
- {
- SelectNextItem();
- }
- break;
-
- case Key.P:
- case Key.K:
- if (GlobalHotkey.Instance.CheckModifiers().CtrlPressed)
- {
- SelectPrevItem();
- }
- break;
-
- case Key.O:
- if (GlobalHotkey.Instance.CheckModifiers().CtrlPressed)
- {
- if (IsInContextMenuMode)
- {
- BackToResultMode();
- }
- else
- {
- ShowContextMenuFromResult(GetActiveResult());
- }
- }
- break;
-
- case Key.Down:
- SelectNextItem();
- e.Handled = true;
- break;
-
- case Key.Up:
- SelectPrevItem();
- e.Handled = true;
- break;
-
- case Key.D:
- if (GlobalHotkey.Instance.CheckModifiers().CtrlPressed)
- {
- pnlResult.SelectNextPage();
- }
- break;
-
- case Key.PageDown:
- pnlResult.SelectNextPage();
- e.Handled = true;
- break;
-
- case Key.U:
- if (GlobalHotkey.Instance.CheckModifiers().CtrlPressed)
- {
- pnlResult.SelectPrevPage();
- }
- break;
-
- case Key.PageUp:
- pnlResult.SelectPrevPage();
- e.Handled = true;
- break;
-
- case Key.Back:
- if (BackKeyDownEvent != null)
- {
- BackKeyDownEvent(new WoxKeyDownEventArgs()
- {
- Query = tbQuery.Text,
- keyEventArgs = e
- });
- }
- break;
-
- case Key.F1:
- Process.Start("http://doc.getwox.com");
- break;
-
- case Key.Enter:
- Result activeResult = GetActiveResult();
- if (GlobalHotkey.Instance.CheckModifiers().ShiftPressed)
- {
- ShowContextMenuFromResult(activeResult);
- }
- else
- {
- SelectResult(activeResult);
- }
- e.Handled = true;
- break;
-
- case Key.D1:
- SelectItem(1);
- break;
-
- case Key.D2:
- SelectItem(2);
- break;
-
- case Key.D3:
- SelectItem(3);
- break;
-
- case Key.D4:
- SelectItem(4);
- break;
-
- case Key.D5:
- SelectItem(5);
- break;
- case Key.D6:
- SelectItem(6);
- break;
-
- }
- }
-
- private void SelectItem(int index)
- {
- int zeroBasedIndex = index - 1;
- SpecialKeyState keyState = GlobalHotkey.Instance.CheckModifiers();
- if (keyState.AltPressed || keyState.CtrlPressed)
- {
- List visibleResults = pnlResult.GetVisibleResults();
- if (zeroBasedIndex < visibleResults.Count)
- {
- SelectResult(visibleResults[zeroBasedIndex]);
- }
- }
- }
-
- private bool IsInContextMenuMode
- {
- get { return pnlContextMenu.Visibility == Visibility.Visible; }
- }
-
- private Result GetActiveResult()
- {
- if (IsInContextMenuMode)
- {
- return pnlContextMenu.GetActiveResult();
- }
- else
- {
- return pnlResult.GetActiveResult();
- }
- }
-
- private void SelectPrevItem()
- {
- if (IsInContextMenuMode)
- {
- pnlContextMenu.SelectPrev();
- }
- else
- {
- pnlResult.SelectPrev();
- }
- toolTip.IsOpen = false;
- }
-
- private void SelectNextItem()
- {
- if (IsInContextMenuMode)
- {
- pnlContextMenu.SelectNext();
- }
- else
- {
- pnlResult.SelectNext();
- }
- toolTip.IsOpen = false;
- }
-
- private void SelectResult(Result result)
- {
- if (result != null)
- {
- if (result.Action != null)
- {
- bool hideWindow = result.Action(new ActionContext()
- {
- SpecialKeyState = GlobalHotkey.Instance.CheckModifiers()
- });
- if (hideWindow)
- {
- HideWox();
- }
- UserSelectedRecordStorage.Instance.Add(result);
- }
- }
- }
-
- private void UpdateResultView(List list)
- {
- queryHasReturn = true;
- progressBar.Dispatcher.Invoke(new Action(StopProgress));
- if (list == null || list.Count == 0) return;
-
- if (list.Count > 0)
- {
- list.ForEach(o =>
- {
- o.Score += UserSelectedRecordStorage.Instance.GetSelectedCount(o) * 5;
- if (o.ContextMenu == null)
- {
- o.ContextMenu = new List();
- }
- HanleTopMost(o);
- });
- List l = list.Where(o => o.OriginQuery != null && o.OriginQuery.RawQuery == lastQuery).ToList();
- Dispatcher.Invoke(new Action(() =>
- {
- pnlResult.AddResults(l);
- }));
- }
- }
-
- private void HanleTopMost(Result result)
- {
- if (TopMostRecordStorage.Instance.IsTopMost(result))
- {
- result.ContextMenu.Add(new Result("Remove top most in this query", "Images\\down.png")
- {
- PluginDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),
- Action = _ =>
- {
- TopMostRecordStorage.Instance.Remove(result);
- ShowMsg("Succeed", "", "");
- return false;
- }
- });
- }
- else
- {
- result.ContextMenu.Add(new Result("Set as top most in this query", "Images\\up.png")
- {
- PluginDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),
- Action = _ =>
- {
- TopMostRecordStorage.Instance.Add(result);
- ShowMsg("Succeed", "", "");
- return false;
- }
- });
- }
- }
-
- private void ShowContextMenuFromResult(Result result)
- {
- if (result.ContextMenu != null && result.ContextMenu.Count > 0)
- {
- pnlContextMenu.Clear();
- pnlContextMenu.AddResults(result.ContextMenu);
- pnlContextMenu.Visibility = Visibility.Visible;
- pnlResult.Visibility = Visibility.Collapsed;
- }
- }
-
- public bool ShellRun(string cmd, bool runAsAdministrator = false)
- {
- try
- {
- if (string.IsNullOrEmpty(cmd))
- throw new ArgumentNullException();
-
- WindowsShellRun.Start(cmd, runAsAdministrator);
- return true;
- }
- catch (Exception ex)
- {
- string errorMsg = string.Format(InternationalizationManager.Instance.GetTranslation("couldnotStartCmd"), cmd);
- ShowMsg(errorMsg, ex.Message, null);
- }
- return false;
- }
-
- private void MainWindow_OnDrop(object sender, DragEventArgs e)
- {
- if (e.Data.GetDataPresent(DataFormats.FileDrop))
- {
- // Note that you can have more than one file.
- string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
- if (files[0].ToLower().EndsWith(".wox"))
- {
- PluginManager.InstallPlugin(files[0]);
- }
- else
- {
- MessageBox.Show(InternationalizationManager.Instance.GetTranslation("invalidWoxPluginFileFormat"));
- }
- }
- }
-
- private void TbQuery_OnPreviewDragOver(object sender, DragEventArgs e)
- {
- e.Handled = true;
- }
- }
-}
\ No newline at end of file
diff --git a/Wox/packages.config b/Wox/packages.config
index 054bbd20c..5dbff9249 100644
--- a/Wox/packages.config
+++ b/Wox/packages.config
@@ -3,7 +3,7 @@
-
+
diff --git a/Wox/su54u2mz.xrz b/Wox/su54u2mz.xrz
deleted file mode 100644
index b83197e8f..000000000
--- a/Wox/su54u2mz.xrz
+++ /dev/null
@@ -1,850 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Diagnostics;
-using System.Drawing;
-using System.IO;
-using System.Linq;
-using System.Net;
-using System.Reflection;
-using System.Threading;
-using System.Windows;
-using System.Windows.Controls;
-using System.Windows.Forms;
-using System.Windows.Input;
-using System.Windows.Media.Animation;
-using NHotkey;
-using NHotkey.Wpf;
-using Wox.Core.i18n;
-using Wox.Core.Plugin;
-using Wox.Core.Theme;
-using Wox.Core.Updater;
-using Wox.Core.UserSettings;
-using Wox.Helper;
-using Wox.Infrastructure;
-using Wox.Infrastructure.Hotkey;
-using Wox.Plugin;
-using Wox.Storage;
-using ContextMenu = System.Windows.Forms.ContextMenu;
-using DataFormats = System.Windows.DataFormats;
-using DragEventArgs = System.Windows.DragEventArgs;
-using IDataObject = System.Windows.IDataObject;
-using KeyEventArgs = System.Windows.Input.KeyEventArgs;
-using MenuItem = System.Windows.Forms.MenuItem;
-using MessageBox = System.Windows.MessageBox;
-using ToolTip = System.Windows.Controls.ToolTip;
-
-namespace Wox
-{
- public partial class MainWindow : IPublicAPI
- {
-
- #region Properties
-
- private readonly Storyboard progressBarStoryboard = new Storyboard();
- private NotifyIcon notifyIcon;
- private bool queryHasReturn;
- private string lastQuery;
- private ToolTip toolTip = new ToolTip();
-
- private bool ignoreTextChange = false;
-
- #endregion
-
- #region Public API
-
- public void ChangeQuery(string query, bool requery = false)
- {
- Dispatcher.Invoke(new Action(() =>
- {
- tbQuery.Text = query;
- tbQuery.CaretIndex = tbQuery.Text.Length;
- if (requery)
- {
- TextBoxBase_OnTextChanged(null, null);
- }
- }));
- }
-
- public void CloseApp()
- {
- Dispatcher.Invoke(new Action(() =>
- {
- notifyIcon.Visible = false;
- Close();
- Environment.Exit(0);
- }));
- }
-
- public void HideApp()
- {
- Dispatcher.Invoke(new Action(HideWox));
- }
-
- public void ShowApp()
- {
- Dispatcher.Invoke(new Action(() => ShowWox()));
- }
-
- public void ShowMsg(string title, string subTitle, string iconPath)
- {
- Dispatcher.Invoke(new Action(() =>
- {
- var m = new Msg { Owner = GetWindow(this) };
- m.Show(title, subTitle, iconPath);
- }));
- }
-
- public void OpenSettingDialog()
- {
- Dispatcher.Invoke(new Action(() => WindowOpener.Open(this)));
- }
-
- public void StartLoadingBar()
- {
- Dispatcher.Invoke(new Action(StartProgress));
- }
-
- public void StopLoadingBar()
- {
- Dispatcher.Invoke(new Action(StopProgress));
- }
-
- public void InstallPlugin(string path)
- {
- Dispatcher.Invoke(new Action(() => PluginManager.InstallPlugin(path)));
- }
-
- public void ReloadPlugins()
- {
- Dispatcher.Invoke(new Action(() => PluginManager.Init(this)));
- }
-
- public string GetTranslation(string key)
- {
- return InternationalizationManager.Instance.GetTranslation(key);
- }
-
- public List GetAllPlugins()
- {
- return PluginManager.AllPlugins;
- }
-
- public event WoxKeyDownEventHandler BackKeyDownEvent;
- public event WoxGlobalKeyboardEventHandler GlobalKeyboardEvent;
- public event AfterWoxQueryEventHandler AfterWoxQueryEvent;
- public event AfterWoxQueryEventHandler BeforeWoxQueryEvent;
- public event ResultItemDropEventHandler ResultItemDropEvent;
-
- public void PushResults(Query query, PluginMetadata plugin, List results)
- {
- results.ForEach(o =>
- {
- o.PluginDirectory = plugin.PluginDirectory;
- o.PluginID = plugin.ID;
- o.OriginQuery = query;
- if (o.ContextMenu != null)
- {
- o.ContextMenu.ForEach(t =>
- {
- t.PluginDirectory = plugin.PluginDirectory;
- t.PluginID = plugin.ID;
- });
- }
- });
- UpdateResultView(results);
- }
-
- public void ShowContextMenu(PluginMetadata plugin, List results)
- {
- if (results != null && results.Count > 0)
- {
- results.ForEach(o =>
- {
- o.PluginDirectory = plugin.PluginDirectory;
- o.PluginID = plugin.ID;
- o.ContextMenu = null;
- });
- pnlContextMenu.Clear();
- pnlContextMenu.AddResults(results);
- pnlContextMenu.Visibility = Visibility.Visible;
- pnlResult.Visibility = Visibility.Collapsed;
- }
- }
-
- #endregion
-
- public MainWindow()
- {
- InitializeComponent();
- ThreadPool.SetMaxThreads(30, 10);
- ThreadPool.SetMinThreads(10, 5);
-
- WebRequest.RegisterPrefix("data", new DataWebRequestFactory());
- GlobalHotkey.Instance.hookedKeyboardCallback += KListener_hookedKeyboardCallback;
- progressBar.ToolTip = toolTip;
- InitialTray();
- pnlResult.LeftMouseClickEvent += SelectResult;
- pnlResult.ItemDropEvent += pnlResult_ItemDropEvent;
- pnlContextMenu.LeftMouseClickEvent += SelectResult;
- pnlResult.RightMouseClickEvent += pnlResult_RightMouseClickEvent;
-
- ThemeManager.Theme.ChangeTheme(UserSettingStorage.Instance.Theme);
- InternationalizationManager.Instance.ChangeLanguage(UserSettingStorage.Instance.Language);
-
- SetHotkey(UserSettingStorage.Instance.Hotkey, OnHotkey);
- SetCustomPluginHotkey();
-
- Closing += MainWindow_Closing;
- //since MainWIndow implement IPublicAPI, so we need to finish ctor MainWindow object before
- //PublicAPI invoke in plugin init methods. E.g FolderPlugin
- ThreadPool.QueueUserWorkItem(o =>
- {
- Thread.Sleep(50);
- PluginManager.Init(this);
- });
- ThreadPool.QueueUserWorkItem(o =>
- {
- Thread.Sleep(50);
- PreLoadImages();
- });
- }
-
- void pnlResult_ItemDropEvent(Result result, IDataObject dropDataObject, DragEventArgs args)
- {
- PluginPair pluginPair = PluginManager.AllPlugins.FirstOrDefault(o => o.Metadata.ID == result.PluginID);
- if (ResultItemDropEvent != null && pluginPair != null)
- {
- foreach (var delegateHandler in ResultItemDropEvent.GetInvocationList())
- {
- if (delegateHandler.Target == pluginPair.Plugin)
- {
- delegateHandler.DynamicInvoke(result, dropDataObject, args);
- }
- }
- }
- }
-
- private bool KListener_hookedKeyboardCallback(KeyEvent keyevent, int vkcode, SpecialKeyState state)
- {
- if (GlobalKeyboardEvent != null)
- {
- return GlobalKeyboardEvent((int)keyevent, vkcode, state);
- }
- return true;
- }
-
- private void PreLoadImages()
- {
- ImageLoader.ImageLoader.PreloadImages();
- }
-
- void pnlResult_RightMouseClickEvent(Result result)
- {
- ShowContextMenuFromResult(result);
- }
-
- void MainWindow_Closing(object sender, CancelEventArgs e)
- {
- UserSettingStorage.Instance.WindowLeft = Left;
- UserSettingStorage.Instance.WindowTop = Top;
- UserSettingStorage.Instance.Save();
- this.HideWox();
- e.Cancel = true;
- }
-
- private void MainWindow_OnLoaded(object sender, RoutedEventArgs e)
- {
- if (UserSettingStorage.Instance.WindowLeft == 0
- && UserSettingStorage.Instance.WindowTop == 0)
- {
- Left = UserSettingStorage.Instance.WindowLeft
- = (SystemParameters.PrimaryScreenWidth - ActualWidth) / 2;
- Top = UserSettingStorage.Instance.WindowTop
- = (SystemParameters.PrimaryScreenHeight - ActualHeight) / 5;
- }
- else
- {
- Left = UserSettingStorage.Instance.WindowLeft;
- Top = UserSettingStorage.Instance.WindowTop;
- }
-
- InitProgressbarAnimation();
- WindowIntelopHelper.DisableControlBox(this);
- CheckUpdate();
- }
-
- private void CheckUpdate()
- {
- UpdaterManager.Instance.PrepareUpdateReady += OnPrepareUpdateReady;
- UpdaterManager.Instance.UpdateError += OnUpdateError;
- UpdaterManager.Instance.CheckUpdate();
- }
-
- void OnUpdateError(object sender, EventArgs e)
- {
- string updateError = InternationalizationManager.Instance.GetTranslation("update_wox_update_error");
- MessageBox.Show(updateError);
- }
-
- private void OnPrepareUpdateReady(object sender, EventArgs e)
- {
- Dispatcher.Invoke(new Action(() =>
- {
- new WoxUpdate().ShowDialog();
- }));
- }
-
- public void SetHotkey(string hotkeyStr, EventHandler action)
- {
- var hotkey = new HotkeyModel(hotkeyStr);
- try
- {
- HotkeyManager.Current.AddOrReplace(hotkeyStr, hotkey.CharKey, hotkey.ModifierKeys, action);
- }
- catch (Exception)
- {
- string errorMsg = string.Format(InternationalizationManager.Instance.GetTranslation("registerHotkeyFailed"), hotkeyStr);
- MessageBox.Show(errorMsg);
- }
- }
-
- public void RemoveHotkey(string hotkeyStr)
- {
- if (!string.IsNullOrEmpty(hotkeyStr))
- {
- HotkeyManager.Current.Remove(hotkeyStr);
- }
- }
-
- private void SetCustomPluginHotkey()
- {
- if (UserSettingStorage.Instance.CustomPluginHotkeys == null) return;
- foreach (CustomPluginHotkey hotkey in UserSettingStorage.Instance.CustomPluginHotkeys)
- {
- CustomPluginHotkey hotkey1 = hotkey;
- SetHotkey(hotkey.Hotkey, delegate
- {
- ShowApp();
- ChangeQuery(hotkey1.ActionKeyword, true);
- });
- }
- }
-
- private void OnHotkey(object sender, HotkeyEventArgs e)
- {
- ToggleWox();
- e.Handled = true;
- }
-
- public void ToggleWox()
- {
- if (!IsVisible)
- {
- ShowWox();
- }
- else
- {
- HideWox();
- }
- }
-
- private void InitProgressbarAnimation()
- {
- var da = new DoubleAnimation(progressBar.X2, ActualWidth + 100, new Duration(new TimeSpan(0, 0, 0, 0, 1600)));
- var da1 = new DoubleAnimation(progressBar.X1, ActualWidth, new Duration(new TimeSpan(0, 0, 0, 0, 1600)));
- Storyboard.SetTargetProperty(da, new PropertyPath("(Line.X2)"));
- Storyboard.SetTargetProperty(da1, new PropertyPath("(Line.X1)"));
- progressBarStoryboard.Children.Add(da);
- progressBarStoryboard.Children.Add(da1);
- progressBarStoryboard.RepeatBehavior = RepeatBehavior.Forever;
- progressBar.Visibility = Visibility.Hidden;
- progressBar.BeginStoryboard(progressBarStoryboard);
- }
-
- private void InitialTray()
- {
- notifyIcon = new NotifyIcon { Text = "Wox", Icon = Properties.Resources.app, Visible = true };
- notifyIcon.Click += (o, e) => ShowWox();
- var open = new MenuItem("Open");
- open.Click += (o, e) => ShowWox();
- var setting = new MenuItem("Settings");
- setting.Click += (o, e) => OpenSettingDialog();
- var exit = new MenuItem("Exit");
- exit.Click += (o, e) => CloseApp();
- MenuItem[] childen = { open, setting, exit };
- notifyIcon.ContextMenu = new ContextMenu(childen);
- }
-
- private void TextBoxBase_OnTextChanged(object sender, TextChangedEventArgs e)
- {
- if (ignoreTextChange) { ignoreTextChange = false; return; }
-
- lastQuery = tbQuery.Text;
- toolTip.IsOpen = false;
- pnlResult.Dirty = true;
- int searchDelay = GetSearchDelay(lastQuery);
-
- Dispatcher.DelayInvoke("UpdateSearch",
- o =>
- {
- Dispatcher.DelayInvoke("ClearResults", i =>
- {
- // first try to use clear method inside pnlResult, which is more closer to the add new results
- // and this will not bring splash issues.After waiting 100ms, if there still no results added, we
- // must clear the result. otherwise, it will be confused why the query changed, but the results
- // didn't.
- if (pnlResult.Dirty) pnlResult.Clear();
- }, TimeSpan.FromMilliseconds(100), null);
- queryHasReturn = false;
- Query query = new Query(lastQuery);
- query.IsIntantQuery = searchDelay == 0;
- FireBeforeWoxQueryEvent(query);
- Query(query);
- Dispatcher.DelayInvoke("ShowProgressbar", originQuery =>
- {
- if (!queryHasReturn && originQuery == tbQuery.Text && !string.IsNullOrEmpty(lastQuery))
- {
- StartProgress();
- }
- }, TimeSpan.FromMilliseconds(150), tbQuery.Text);
- FireAfterWoxQueryEvent(query);
- }, TimeSpan.FromMilliseconds(searchDelay));
- }
-
- private int GetSearchDelay(string query)
- {
- if (!string.IsNullOrEmpty(query) && PluginManager.IsInstantQuery(query))
- {
- DebugHelper.WriteLine("execute query without delay");
- return 0;
- }
-
- DebugHelper.WriteLine("execute query with 200ms delay");
- return 200;
- }
-
- private void FireAfterWoxQueryEvent(Query q)
- {
- if (AfterWoxQueryEvent != null)
- {
- //We shouldn't let those events slow down real query
- //so I put it in the new thread
- ThreadPool.QueueUserWorkItem(o =>
- {
- AfterWoxQueryEvent(new WoxQueryEventArgs()
- {
- Query = q
- });
- });
- }
- }
-
- private void FireBeforeWoxQueryEvent(Query q)
- {
- if (BeforeWoxQueryEvent != null)
- {
- //We shouldn't let those events slow down real query
- //so I put it in the new thread
- ThreadPool.QueueUserWorkItem(o =>
- {
- BeforeWoxQueryEvent(new WoxQueryEventArgs()
- {
- Query = q
- });
- });
- }
- }
-
- private void Query(Query q)
- {
- PluginManager.Query(q);
- StopProgress();
- BackToResultMode();
- }
-
- private void BackToResultMode()
- {
- pnlResult.Visibility = Visibility.Visible;
- pnlContextMenu.Visibility = Visibility.Collapsed;
- }
-
- private void Border_OnMouseDown(object sender, MouseButtonEventArgs e)
- {
- if (e.ChangedButton == MouseButton.Left) DragMove();
- }
-
- private void StartProgress()
- {
- progressBar.Visibility = Visibility.Visible;
- }
-
- private void StopProgress()
- {
- progressBar.Visibility = Visibility.Hidden;
- }
-
- private void HideWox()
- {
- Hide();
- }
-
- private void ShowWox(bool selectAll = true)
- {
- UserSettingStorage.Instance.IncreaseActivateTimes();
- if (!double.IsNaN(Left) && !double.IsNaN(Top))
- {
- var origScreen = Screen.FromRectangle(new Rectangle((int)Left, (int)Top, (int)ActualWidth, (int)ActualHeight));
- var screen = Screen.FromPoint(System.Windows.Forms.Cursor.Position);
- var coordX = (Left - origScreen.WorkingArea.Left) / (origScreen.WorkingArea.Width - ActualWidth);
- var coordY = (Top - origScreen.WorkingArea.Top) / (origScreen.WorkingArea.Height - ActualHeight);
- Left = (screen.WorkingArea.Width - ActualWidth) * coordX + screen.WorkingArea.Left;
- Top = (screen.WorkingArea.Height - ActualHeight) * coordY + screen.WorkingArea.Top;
- }
-
- Show();
- Activate();
- Focus();
- tbQuery.Focus();
- if (selectAll) tbQuery.SelectAll();
- }
-
- private void MainWindow_OnDeactivated(object sender, EventArgs e)
- {
- if (UserSettingStorage.Instance.HideWhenDeactive)
- {
- HideWox();
- }
- }
-
- private void TbQuery_OnPreviewKeyDown(object sender, KeyEventArgs e)
- {
- //when alt is pressed, the real key should be e.SystemKey
- Key key = (e.Key == Key.System ? e.SystemKey : e.Key);
- switch (key)
- {
- case Key.Escape:
- if (IsInContextMenuMode)
- {
- BackToResultMode();
- }
- else
- {
- HideWox();
- }
- e.Handled = true;
- break;
-
- case Key.Tab:
- if (GlobalHotkey.Instance.CheckModifiers().ShiftPressed)
- {
- SelectPrevItem();
- }
- else
- {
- SelectNextItem();
- }
- e.Handled = true;
- break;
-
- case Key.N:
- case Key.J:
- if (GlobalHotkey.Instance.CheckModifiers().CtrlPressed)
- {
- SelectNextItem();
- }
- break;
-
- case Key.P:
- case Key.K:
- if (GlobalHotkey.Instance.CheckModifiers().CtrlPressed)
- {
- SelectPrevItem();
- }
- break;
-
- case Key.O:
- if (GlobalHotkey.Instance.CheckModifiers().CtrlPressed)
- {
- if (IsInContextMenuMode)
- {
- BackToResultMode();
- }
- else
- {
- ShowContextMenuFromResult(GetActiveResult());
- }
- }
- break;
-
- case Key.Down:
- SelectNextItem();
- e.Handled = true;
- break;
-
- case Key.Up:
- SelectPrevItem();
- e.Handled = true;
- break;
-
- case Key.D:
- if (GlobalHotkey.Instance.CheckModifiers().AltPressed)
- {
- pnlResult.SelectNextPage();
- }
- break;
-
- case Key.PageDown:
- pnlResult.SelectNextPage();
- e.Handled = true;
- break;
-
- case Key.U:
- if (GlobalHotkey.Instance.CheckModifiers().AltPressed)
- {
- pnlResult.SelectPrevPage();
- }
- break;
-
- case Key.PageUp:
- pnlResult.SelectPrevPage();
- e.Handled = true;
- break;
-
- case Key.Back:
- if (BackKeyDownEvent != null)
- {
- BackKeyDownEvent(new WoxKeyDownEventArgs()
- {
- Query = tbQuery.Text,
- keyEventArgs = e
- });
- }
- break;
-
- case Key.F1:
- Process.Start("http://doc.getwox.com");
- break;
-
- case Key.Enter:
- Result activeResult = GetActiveResult();
- if (GlobalHotkey.Instance.CheckModifiers().ShiftPressed)
- {
- ShowContextMenuFromResult(activeResult);
- }
- else
- {
- SelectResult(activeResult);
- }
- e.Handled = true;
- break;
-
- case Key.D1:
- SelectItem(1);
- break;
-
- case Key.D2:
- SelectItem(2);
- break;
-
- case Key.D3:
- SelectItem(3);
- break;
-
- case Key.D4:
- SelectItem(4);
- break;
-
- case Key.D5:
- SelectItem(5);
- break;
- case Key.D6:
- SelectItem(6);
- break;
-
- }
- }
-
- private void SelectItem(int index)
- {
- int zeroBasedIndex = index - 1;
- SpecialKeyState keyState = GlobalHotkey.Instance.CheckModifiers();
- if (keyState.AltPressed || keyState.CtrlPressed)
- {
- List visibleResults = pnlResult.GetVisibleResults();
- if (zeroBasedIndex < visibleResults.Count)
- {
- SelectResult(visibleResults[zeroBasedIndex]);
- }
- }
- }
-
- private bool IsInContextMenuMode
- {
- get { return pnlContextMenu.Visibility == Visibility.Visible; }
- }
-
- private Result GetActiveResult()
- {
- if (IsInContextMenuMode)
- {
- return pnlContextMenu.GetActiveResult();
- }
- else
- {
- return pnlResult.GetActiveResult();
- }
- }
-
- private void SelectPrevItem()
- {
- if (IsInContextMenuMode)
- {
- pnlContextMenu.SelectPrev();
- }
- else
- {
- pnlResult.SelectPrev();
- }
- toolTip.IsOpen = false;
- }
-
- private void SelectNextItem()
- {
- if (IsInContextMenuMode)
- {
- pnlContextMenu.SelectNext();
- }
- else
- {
- pnlResult.SelectNext();
- }
- toolTip.IsOpen = false;
- }
-
- private void SelectResult(Result result)
- {
- if (result != null)
- {
- if (result.Action != null)
- {
- bool hideWindow = result.Action(new ActionContext()
- {
- SpecialKeyState = GlobalHotkey.Instance.CheckModifiers()
- });
- if (hideWindow)
- {
- HideWox();
- }
- UserSelectedRecordStorage.Instance.Add(result);
- }
- }
- }
-
- private void UpdateResultView(List list)
- {
- queryHasReturn = true;
- progressBar.Dispatcher.Invoke(new Action(StopProgress));
- if (list == null || list.Count == 0) return;
-
- if (list.Count > 0)
- {
- list.ForEach(o =>
- {
- o.Score += UserSelectedRecordStorage.Instance.GetSelectedCount(o) * 5;
- if (o.ContextMenu == null)
- {
- o.ContextMenu = new List();
- }
- HanleTopMost(o);
- });
- List l = list.Where(o => o.OriginQuery != null && o.OriginQuery.RawQuery == lastQuery).ToList();
- Dispatcher.Invoke(new Action(() =>
- {
- pnlResult.AddResults(l);
- }));
- }
- }
-
- private void HanleTopMost(Result result)
- {
- if (TopMostRecordStorage.Instance.IsTopMost(result))
- {
- result.ContextMenu.Add(new Result("Remove top most in this query", "Images\\down.png")
- {
- PluginDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),
- Action = _ =>
- {
- TopMostRecordStorage.Instance.Remove(result);
- ShowMsg("Succeed", "", "");
- return false;
- }
- });
- }
- else
- {
- result.ContextMenu.Add(new Result("Set as top most in this query", "Images\\up.png")
- {
- PluginDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),
- Action = _ =>
- {
- TopMostRecordStorage.Instance.Add(result);
- ShowMsg("Succeed", "", "");
- return false;
- }
- });
- }
- }
-
- private void ShowContextMenuFromResult(Result result)
- {
- if (result.ContextMenu != null && result.ContextMenu.Count > 0)
- {
- pnlContextMenu.Clear();
- pnlContextMenu.AddResults(result.ContextMenu);
- pnlContextMenu.Visibility = Visibility.Visible;
- pnlResult.Visibility = Visibility.Collapsed;
- }
- }
-
- public bool ShellRun(string cmd, bool runAsAdministrator = false)
- {
- try
- {
- if (string.IsNullOrEmpty(cmd))
- throw new ArgumentNullException();
-
- WindowsShellRun.Start(cmd, runAsAdministrator);
- return true;
- }
- catch (Exception ex)
- {
- string errorMsg = string.Format(InternationalizationManager.Instance.GetTranslation("couldnotStartCmd"), cmd);
- ShowMsg(errorMsg, ex.Message, null);
- }
- return false;
- }
-
- private void MainWindow_OnDrop(object sender, DragEventArgs e)
- {
- if (e.Data.GetDataPresent(DataFormats.FileDrop))
- {
- // Note that you can have more than one file.
- string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
- if (files[0].ToLower().EndsWith(".wox"))
- {
- PluginManager.InstallPlugin(files[0]);
- }
- else
- {
- MessageBox.Show(InternationalizationManager.Instance.GetTranslation("invalidWoxPluginFileFormat"));
- }
- }
- }
-
- private void TbQuery_OnPreviewDragOver(object sender, DragEventArgs e)
- {
- e.Handled = true;
- }
- }
-}
\ No newline at end of file