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