From 881e414043dd546617b0b0d39db0d87768f47fd2 Mon Sep 17 00:00:00 2001 From: bao-qian Date: Mon, 2 Nov 2015 02:49:38 +0000 Subject: [PATCH] Fix ResourceMerger 1. Fix duplication for loading resource. 2. Fix null reference when plugin is not loaded. 3. speedup. --- Wox.Core/Plugin/PluginManager.cs | 3 ++- Wox.Core/Theme/Theme.cs | 5 ++-- Wox.Core/UI/ResourceMerger.cs | 35 ++++++++++++++++++++++----- Wox.Core/i18n/Internationalization.cs | 23 ++++++------------ Wox/App.xaml | 4 +-- 5 files changed, 43 insertions(+), 27 deletions(-) diff --git a/Wox.Core/Plugin/PluginManager.cs b/Wox.Core/Plugin/PluginManager.cs index d6b36bbb26..f04bf72804 100644 --- a/Wox.Core/Plugin/PluginManager.cs +++ b/Wox.Core/Plugin/PluginManager.cs @@ -20,6 +20,7 @@ namespace Wox.Core.Plugin /// public static class PluginManager { + public const string DirectoryName = "Plugins"; private static List pluginMetadatas; private static List> instantSearches; private static IEnumerable exclusiveSearchPlugins; @@ -41,7 +42,7 @@ namespace Wox.Core.Plugin public static string PluginDirectory { - get { return Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Plugins"); } + get { return Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), DirectoryName); } } private static void SetupPluginDirectories() diff --git a/Wox.Core/Theme/Theme.cs b/Wox.Core/Theme/Theme.cs index b20e95cdd0..4fba143bcd 100644 --- a/Wox.Core/Theme/Theme.cs +++ b/Wox.Core/Theme/Theme.cs @@ -14,11 +14,12 @@ namespace Wox.Core.Theme { public class Theme : IUIResource,ITheme { + public const string DirectoryName = "Themes"; private static List themeDirectories = new List(); static Theme() { - themeDirectories.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Themes")); + themeDirectories.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), DirectoryName)); MakesureThemeDirectoriesExist(); } @@ -55,7 +56,7 @@ namespace Wox.Core.Theme UserSettingStorage.Instance.Theme = themeName; UserSettingStorage.Instance.Save(); - ResourceMerger.ApplyResources(); + ResourceMerger.ApplyThemeResource(); } public ResourceDictionary GetResourceDictionary() diff --git a/Wox.Core/UI/ResourceMerger.cs b/Wox.Core/UI/ResourceMerger.cs index 6ad940c3f5..0d1539d896 100644 --- a/Wox.Core/UI/ResourceMerger.cs +++ b/Wox.Core/UI/ResourceMerger.cs @@ -1,20 +1,42 @@ using System; +using System.Linq; using System.Windows; using Wox.Core.i18n; +using Wox.Core.Plugin; using Wox.Plugin; namespace Wox.Core.UI { - public class ResourceMerger + public static class ResourceMerger { - internal static void ApplyResources() + private static void RemoveResource(string resourceDirectoryName) { - Application.Current.Resources.MergedDictionaries.Clear(); - ApplyPluginLanguages(); - ApplyThemeAndLanguageResources(); + var mergedDictionaries = Application.Current.Resources.MergedDictionaries; + foreach (var resource in mergedDictionaries) + { + int directoryPosition = resource.Source.Segments.Length - 2; + string currentDirectoryName = resource.Source.Segments[directoryPosition]; + if (currentDirectoryName == resourceDirectoryName) + { + mergedDictionaries.Remove(resource); + break; + } + } } - internal static void ApplyThemeAndLanguageResources() + public static void ApplyThemeResource() + { + RemoveResource(Theme.Theme.DirectoryName); + ApplyUIResources(); + } + + public static void ApplyLanguageResources() + { + RemoveResource(Internationalization.DirectoryName); + ApplyUIResources(); + } + + private static void ApplyUIResources() { var UIResources = AssemblyHelper.LoadInterfacesFromAppDomain(); foreach (var uiResource in UIResources) @@ -25,6 +47,7 @@ namespace Wox.Core.UI internal static void ApplyPluginLanguages() { + RemoveResource(PluginManager.DirectoryName); var pluginI18ns = AssemblyHelper.LoadInterfacesFromAppDomain(); foreach (var pluginI18n in pluginI18ns) { diff --git a/Wox.Core/i18n/Internationalization.cs b/Wox.Core/i18n/Internationalization.cs index cf9878fd7d..3f8e4ecbea 100644 --- a/Wox.Core/i18n/Internationalization.cs +++ b/Wox.Core/i18n/Internationalization.cs @@ -14,7 +14,8 @@ namespace Wox.Core.i18n { public class Internationalization : IInternationalization, IUIResource { - private static string DefaultLanguageDirectory = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Languages"); + public const string DirectoryName = "Languages"; + private static readonly string DefaultDirectory = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), DirectoryName); static Internationalization() { @@ -23,11 +24,11 @@ namespace Wox.Core.i18n private static void MakesureThemeDirectoriesExist() { - if (!Directory.Exists(DefaultLanguageDirectory)) + if (!Directory.Exists(DefaultDirectory)) { try { - Directory.CreateDirectory(DefaultLanguageDirectory); + Directory.CreateDirectory(DefaultDirectory); } catch (System.Exception e) { @@ -69,15 +70,14 @@ namespace Wox.Core.i18n UserSettingStorage.Instance.Language = language.LanguageCode; UserSettingStorage.Instance.Save(); - ResourceMerger.ApplyResources(); - UpdateAllPluginMetadataTranslations(); + ResourceMerger.ApplyLanguageResources(); } public ResourceDictionary GetResourceDictionary() { return new ResourceDictionary { - Source = new Uri(GetLanguageFile(DefaultLanguageDirectory), UriKind.Absolute) + Source = new Uri(GetLanguageFile(DefaultDirectory), UriKind.Absolute) }; } @@ -111,15 +111,6 @@ namespace Wox.Core.i18n } - internal void UpdateAllPluginMetadataTranslations() - { - List> plugins = AssemblyHelper.LoadPluginInterfaces(); - foreach (var plugin in plugins) - { - UpdatePluginMetadataTranslations(plugin.Key); - } - } - internal void UpdatePluginMetadataTranslations(PluginPair pluginPair) { var pluginI18n = pluginPair.Plugin as IPluginI18n; @@ -142,7 +133,7 @@ namespace Wox.Core.i18n private string GetLanguagePath(Language language) { - string path = Path.Combine(DefaultLanguageDirectory, language.LanguageCode + ".xaml"); + string path = Path.Combine(DefaultDirectory, language.LanguageCode + ".xaml"); if (File.Exists(path)) { return path; diff --git a/Wox/App.xaml b/Wox/App.xaml index 449be94262..2f32256d20 100644 --- a/Wox/App.xaml +++ b/Wox/App.xaml @@ -5,8 +5,8 @@ - - + +