From cc0594510853e64f00c4bee29f9b790995a5a74b Mon Sep 17 00:00:00 2001 From: Ben Date: Thu, 25 Jun 2015 23:05:24 +0100 Subject: [PATCH] Implemented ThemeComponent reading/saving in translation layer --- .../BlockItemBaseTypes/ColorBlockItem.cs | 6 +- .../Filtration.ObjectModel.csproj | 2 + Filtration.ObjectModel/ItemFilterScript.cs | 8 ++- Filtration.ObjectModel/ThemeEditor/Theme.cs | 33 ++++++++++ .../ThemeEditor/ThemeComponent.cs | 24 +++++++ Filtration.Tests/Filtration.Tests.csproj | 1 + .../TestItemFilterBlockTranslator.cs | 48 +++++++++++++- .../TestItemFilterScriptTranslator.cs | 66 +++++++++++++++---- .../TestThemeComponentListBuilder.cs | 30 +++++++++ .../Properties/AssemblyInfo.cs | 36 ++++++++++ .../Filtration.ThemeEditor.csproj | 59 +++++++++++++++++ .../Properties/AssemblyInfo.cs | 36 ++++++++++ Filtration.sln | 12 ++++ Filtration/Filtration.csproj | 5 +- .../Translators/ItemFilterBlockTranslator.cs | 13 +++- .../Translators/ItemFilterScriptTranslator.cs | 10 ++- .../Translators/ThemeComponentListBuilder.cs | 53 +++++++++++++++ .../ViewModels/ItemFilterScriptViewModel.cs | 35 +++++++--- .../ViewModels/SettingsWindowViewModel.cs | 2 +- .../WindsorInstallers/TranslatorsInstaller.cs | 5 ++ 20 files changed, 450 insertions(+), 34 deletions(-) create mode 100644 Filtration.ObjectModel/ThemeEditor/Theme.cs create mode 100644 Filtration.ObjectModel/ThemeEditor/ThemeComponent.cs create mode 100644 Filtration.Tests/Translators/TestThemeComponentListBuilder.cs create mode 100644 Filtration.ThemeEditor.Tests/Properties/AssemblyInfo.cs create mode 100644 Filtration.ThemeEditor/Filtration.ThemeEditor.csproj create mode 100644 Filtration.ThemeEditor/Properties/AssemblyInfo.cs create mode 100644 Filtration/Translators/ThemeComponentListBuilder.cs diff --git a/Filtration.ObjectModel/BlockItemBaseTypes/ColorBlockItem.cs b/Filtration.ObjectModel/BlockItemBaseTypes/ColorBlockItem.cs index 48ed9a1..9fd71a8 100644 --- a/Filtration.ObjectModel/BlockItemBaseTypes/ColorBlockItem.cs +++ b/Filtration.ObjectModel/BlockItemBaseTypes/ColorBlockItem.cs @@ -1,4 +1,5 @@ using System.Windows.Media; +using Filtration.ThemeEditor.Models; namespace Filtration.ObjectModel.BlockItemBaseTypes { @@ -20,7 +21,8 @@ namespace Filtration.ObjectModel.BlockItemBaseTypes get { return PrefixText + " " + +Color.R + " " + Color.G + " " - + Color.B + (Color.A < 255 ? " " + Color.A : string.Empty); + + Color.B + (Color.A < 255 ? " " + Color.A : string.Empty) + + (ThemeComponent != null ? " # " + ThemeComponent.ComponentName : string.Empty); } } @@ -29,6 +31,8 @@ namespace Filtration.ObjectModel.BlockItemBaseTypes get { return string.Empty; } } + public ThemeComponent ThemeComponent { get; set; } + public override Color SummaryBackgroundColor { get { return Colors.Transparent; } } public override Color SummaryTextColor { get { return Colors.Transparent; } } diff --git a/Filtration.ObjectModel/Filtration.ObjectModel.csproj b/Filtration.ObjectModel/Filtration.ObjectModel.csproj index 2548419..34ccdc5 100644 --- a/Filtration.ObjectModel/Filtration.ObjectModel.csproj +++ b/Filtration.ObjectModel/Filtration.ObjectModel.csproj @@ -80,6 +80,8 @@ + + + \ No newline at end of file diff --git a/Filtration.ThemeEditor/Properties/AssemblyInfo.cs b/Filtration.ThemeEditor/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..677e08e --- /dev/null +++ b/Filtration.ThemeEditor/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Filtration.ThemeEditor")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("Filtration.ThemeEditor")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2015")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("7e4e2310-7f12-497e-a3ff-7ec7282ff8e9")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Filtration.sln b/Filtration.sln index 1622944..7f0dec1 100644 --- a/Filtration.sln +++ b/Filtration.sln @@ -11,6 +11,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Filtration.ObjectModel", "F EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Filtration.ObjectModel.Tests", "Filtration.ObjectModel.Tests\Filtration.ObjectModel.Tests.csproj", "{537BE676-2FF6-4995-B05B-9CFACE852EC9}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Filtration.ThemeEditor", "Filtration.ThemeEditor\Filtration.ThemeEditor.csproj", "{41B8F5C2-65AA-42F0-A20B-6F95B13A9F48}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Filtration.ThemeEditor.Tests", "Filtration.ThemeEditor.Tests\Filtration.ThemeEditor.Tests.csproj", "{450AC313-BF25-4BFD-A066-9F39F026FDCF}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -33,6 +37,14 @@ Global {537BE676-2FF6-4995-B05B-9CFACE852EC9}.Debug|Any CPU.Build.0 = Debug|Any CPU {537BE676-2FF6-4995-B05B-9CFACE852EC9}.Release|Any CPU.ActiveCfg = Release|Any CPU {537BE676-2FF6-4995-B05B-9CFACE852EC9}.Release|Any CPU.Build.0 = Release|Any CPU + {41B8F5C2-65AA-42F0-A20B-6F95B13A9F48}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {41B8F5C2-65AA-42F0-A20B-6F95B13A9F48}.Debug|Any CPU.Build.0 = Debug|Any CPU + {41B8F5C2-65AA-42F0-A20B-6F95B13A9F48}.Release|Any CPU.ActiveCfg = Release|Any CPU + {41B8F5C2-65AA-42F0-A20B-6F95B13A9F48}.Release|Any CPU.Build.0 = Release|Any CPU + {450AC313-BF25-4BFD-A066-9F39F026FDCF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {450AC313-BF25-4BFD-A066-9F39F026FDCF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {450AC313-BF25-4BFD-A066-9F39F026FDCF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {450AC313-BF25-4BFD-A066-9F39F026FDCF}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Filtration/Filtration.csproj b/Filtration/Filtration.csproj index 60483fc..869a946 100644 --- a/Filtration/Filtration.csproj +++ b/Filtration/Filtration.csproj @@ -140,6 +140,7 @@ + @@ -425,9 +426,7 @@ Filtration.ObjectModel - - - + diff --git a/Filtration/Translators/ItemFilterBlockTranslator.cs b/Filtration/Translators/ItemFilterBlockTranslator.cs index b806286..7051405 100644 --- a/Filtration/Translators/ItemFilterBlockTranslator.cs +++ b/Filtration/Translators/ItemFilterBlockTranslator.cs @@ -22,12 +22,14 @@ namespace Filtration.Translators internal class ItemFilterBlockTranslator : IItemFilterBlockTranslator { private readonly IBlockGroupHierarchyBuilder _blockGroupHierarchyBuilder; + private readonly IThemeComponentListBuilder _themeComponentListBuilder; private const string Indent = " "; private readonly string _newLine = Environment.NewLine + Indent; - public ItemFilterBlockTranslator(IBlockGroupHierarchyBuilder blockGroupHierarchyBuilder) + public ItemFilterBlockTranslator(IBlockGroupHierarchyBuilder blockGroupHierarchyBuilder, IThemeComponentListBuilder themeComponentListBuilder) { _blockGroupHierarchyBuilder = blockGroupHierarchyBuilder; + _themeComponentListBuilder = themeComponentListBuilder; } // This method converts a string into a ItemFilterBlock. This is used for pasting ItemFilterBlocks @@ -257,13 +259,20 @@ namespace Filtration.Translators } } - private static void AddColorItemToBlockItems(ItemFilterBlock block, string inputString) where T : ColorBlockItem + private void AddColorItemToBlockItems(ItemFilterBlock block, string inputString) where T : ColorBlockItem { var blockItem = Activator.CreateInstance(); var result = Regex.Matches(inputString, @"([\w\s]*)[#]?(.*)"); // When Theme support is added result[0].Groups[2].Value will contain the ColorGroup in the comment if it exists. blockItem.Color = GetColorFromString(result[0].Groups[1].Value); + + var componentName = result[0].Groups[2].Value.Trim(); + if (!string.IsNullOrEmpty(componentName)) + { + blockItem.ThemeComponent = _themeComponentListBuilder.AddComponent(typeof(T), componentName, blockItem.Color); + } + block.BlockItems.Add(blockItem); } diff --git a/Filtration/Translators/ItemFilterScriptTranslator.cs b/Filtration/Translators/ItemFilterScriptTranslator.cs index db70070..80bfe9b 100644 --- a/Filtration/Translators/ItemFilterScriptTranslator.cs +++ b/Filtration/Translators/ItemFilterScriptTranslator.cs @@ -20,11 +20,15 @@ namespace Filtration.Translators { private readonly IItemFilterBlockTranslator _blockTranslator; private readonly IBlockGroupHierarchyBuilder _blockGroupHierarchyBuilder; + private readonly IThemeComponentListBuilder _themeComponentListBuilder; - public ItemFilterScriptTranslator(IItemFilterBlockTranslator blockTranslator, IBlockGroupHierarchyBuilder blockGroupHierarchyBuilder) + public ItemFilterScriptTranslator(IItemFilterBlockTranslator blockTranslator, + IBlockGroupHierarchyBuilder blockGroupHierarchyBuilder, + IThemeComponentListBuilder themeComponentListBuilder) { _blockTranslator = blockTranslator; _blockGroupHierarchyBuilder = blockGroupHierarchyBuilder; + _themeComponentListBuilder = themeComponentListBuilder; } public ItemFilterScript TranslateStringToItemFilterScript(string inputString) @@ -51,6 +55,8 @@ namespace Filtration.Translators script.Description = script.Description.TrimEnd('\n').TrimEnd('\r'); } + _themeComponentListBuilder.Initialise(); + // Extract each block from between boundaries and translate it into a ItemFilterBlock object // and add that object to the ItemFilterBlocks list for (var boundary = conditionBoundaries.First; boundary != null; boundary = boundary.Next) @@ -63,6 +69,8 @@ namespace Filtration.Translators script.ItemFilterBlocks.Add(_blockTranslator.TranslateStringToItemFilterBlock(blockString)); } + script.ThemeComponents = _themeComponentListBuilder.GetComponents(); + return script; } diff --git a/Filtration/Translators/ThemeComponentListBuilder.cs b/Filtration/Translators/ThemeComponentListBuilder.cs new file mode 100644 index 0000000..13c884e --- /dev/null +++ b/Filtration/Translators/ThemeComponentListBuilder.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Windows.Media; +using Filtration.ThemeEditor.Models; + +namespace Filtration.Translators +{ + internal interface IThemeComponentListBuilder + { + void Initialise(); + ThemeComponent AddComponent(Type targetType, string componentName, Color componentColor); + List GetComponents(); + } + + internal class ThemeComponentListBuilder : IThemeComponentListBuilder + { + private List _themeComponents; + + public ThemeComponentListBuilder() + { + _themeComponents = new List(); + } + + public void Initialise() + { + _themeComponents = new List(); + } + + public ThemeComponent AddComponent(Type targetType, string componentName, Color componentColor) + { + if (ComponentExists(targetType, componentName)) + { + return _themeComponents.FirstOrDefault(t => t.ComponentName == componentName && t.TargetType == targetType); + } + + var component = new ThemeComponent(targetType, componentName, componentColor); + _themeComponents.Add(component); + + return component; + } + + public List GetComponents() + { + return _themeComponents; + } + + private bool ComponentExists(Type targetType, string componentName) + { + return _themeComponents.Exists(c => c.ComponentName == componentName && c.TargetType == targetType); + } + } +} diff --git a/Filtration/ViewModels/ItemFilterScriptViewModel.cs b/Filtration/ViewModels/ItemFilterScriptViewModel.cs index 655bfd7..bc4fcc9 100644 --- a/Filtration/ViewModels/ItemFilterScriptViewModel.cs +++ b/Filtration/ViewModels/ItemFilterScriptViewModel.cs @@ -101,14 +101,8 @@ namespace Filtration.ViewModels { _itemFilterBlockViewModelsCollectionView = CollectionViewSource.GetDefaultView(_itemFilterBlockViewModels); - if (BlockFilterPredicate != null) - { - _itemFilterBlockViewModelsCollectionView.Filter = BlockFilter; - } - else - { - _itemFilterBlockViewModelsCollectionView.Filter = null; - } + _itemFilterBlockViewModelsCollectionView.Filter = BlockFilter; + return _itemFilterBlockViewModels; } } @@ -116,7 +110,29 @@ namespace Filtration.ViewModels private bool BlockFilter(object item) { var blockViewModel = item as IItemFilterBlockViewModel; - return BlockFilterPredicate(blockViewModel); + + if (BlockFilterPredicate != null) + { + return BlockFilterPredicate(blockViewModel) && ShowBlockBasedOnAdvanced(blockViewModel); + } + + return ShowBlockBasedOnAdvanced(blockViewModel); + } + + private bool ShowBlockBasedOnAdvanced(IItemFilterBlockViewModel blockViewModel) + { + if (ShowAdvanced) + { + return true; + } + + if (blockViewModel.Block.BlockGroup == null) + { + return true; + } + + return !blockViewModel.Block.BlockGroup.Advanced; + } public Predicate BlockFilterPredicate @@ -157,6 +173,7 @@ namespace Filtration.ViewModels { _showAdvanced = value; RaisePropertyChanged(); + RaisePropertyChanged("ItemFilterBlockViewModels"); } } diff --git a/Filtration/ViewModels/SettingsWindowViewModel.cs b/Filtration/ViewModels/SettingsWindowViewModel.cs index 0e4eb26..82f85fd 100644 --- a/Filtration/ViewModels/SettingsWindowViewModel.cs +++ b/Filtration/ViewModels/SettingsWindowViewModel.cs @@ -54,7 +54,7 @@ namespace Filtration.ViewModels OnRequestClose(this, new EventArgs()); } } - catch (DirectoryNotFoundException e) + catch (DirectoryNotFoundException) { MessageBox.Show("The entered Default Filter Directory is invalid or does not exist.", "Error", MessageBoxButton.OK, MessageBoxImage.Exclamation); diff --git a/Filtration/WindsorInstallers/TranslatorsInstaller.cs b/Filtration/WindsorInstallers/TranslatorsInstaller.cs index 549b9b5..2736bec 100644 --- a/Filtration/WindsorInstallers/TranslatorsInstaller.cs +++ b/Filtration/WindsorInstallers/TranslatorsInstaller.cs @@ -23,6 +23,11 @@ namespace Filtration.WindsorInstallers Component.For() .ImplementedBy() .LifeStyle.Singleton); + + container.Register( + Component.For() + .ImplementedBy() + .LifeStyle.Singleton); } } }