diff --git a/Filtration.Common/Filtration.Common.csproj b/Filtration.Common/Filtration.Common.csproj
index 1e02c80..5b368c2 100644
--- a/Filtration.Common/Filtration.Common.csproj
+++ b/Filtration.Common/Filtration.Common.csproj
@@ -49,11 +49,13 @@
..\packages\CommonServiceLocator.1.3\lib\portable-net4+sl5+netcore45+wpa81+wp8\Microsoft.Practices.ServiceLocation.dll
+
..\packages\MvvmLightLibs.5.1.1.0\lib\net45\System.Windows.Interactivity.dll
+
@@ -64,6 +66,7 @@
+
diff --git a/Filtration.Common/Services/MessageBoxService.cs b/Filtration.Common/Services/MessageBoxService.cs
new file mode 100644
index 0000000..a9ab4b0
--- /dev/null
+++ b/Filtration.Common/Services/MessageBoxService.cs
@@ -0,0 +1,17 @@
+using System.Windows;
+
+namespace Filtration.Common.Services
+{
+ public interface IMessageBoxService
+ {
+ MessageBoxResult Show(string caption, string message, MessageBoxButton buttons, MessageBoxImage image);
+ }
+
+ public class MessageBoxService : IMessageBoxService
+ {
+ public MessageBoxResult Show(string caption, string message, MessageBoxButton buttons, MessageBoxImage image)
+ {
+ return MessageBox.Show(message, caption, buttons, image);
+ }
+ }
+}
diff --git a/Filtration.Common/WindsorInstallers/ServicesInstaller.cs b/Filtration.Common/WindsorInstallers/ServicesInstaller.cs
index fffac19..5bcbaa3 100644
--- a/Filtration.Common/WindsorInstallers/ServicesInstaller.cs
+++ b/Filtration.Common/WindsorInstallers/ServicesInstaller.cs
@@ -13,6 +13,11 @@ namespace Filtration.Common.WindsorInstallers
Component.For()
.ImplementedBy()
.LifeStyle.Singleton);
+
+ container.Register(
+ Component.For()
+ .ImplementedBy()
+ .LifeStyle.Singleton);
}
}
}
diff --git a/Filtration.ThemeEditor.Tests/Filtration.ThemeEditor.Tests.csproj b/Filtration.ThemeEditor.Tests/Filtration.ThemeEditor.Tests.csproj
index 8c3cd58..cf13d8c 100644
--- a/Filtration.ThemeEditor.Tests/Filtration.ThemeEditor.Tests.csproj
+++ b/Filtration.ThemeEditor.Tests/Filtration.ThemeEditor.Tests.csproj
@@ -55,6 +55,10 @@
+
+ {8cb44f28-2956-4c2a-9314-72727262edd4}
+ Filtration.Common
+
{4aac3beb-1dc1-483e-9d11-0e9334e80227}
Filtration.ObjectModel
diff --git a/Filtration.ThemeEditor.Tests/Services/TestThemeService.cs b/Filtration.ThemeEditor.Tests/Services/TestThemeService.cs
index 68c3938..086f4f1 100644
--- a/Filtration.ThemeEditor.Tests/Services/TestThemeService.cs
+++ b/Filtration.ThemeEditor.Tests/Services/TestThemeService.cs
@@ -1,9 +1,11 @@
using System.Windows.Media;
+using Filtration.Common.Services;
using Filtration.ObjectModel;
using Filtration.ObjectModel.BlockItemTypes;
using Filtration.ObjectModel.Enums;
using Filtration.ObjectModel.ThemeEditor;
using Filtration.ThemeEditor.Services;
+using Moq;
using NUnit.Framework;
namespace Filtration.ThemeEditor.Tests.Services
@@ -27,8 +29,9 @@ namespace Filtration.ThemeEditor.Tests.Services
var testInputThemeComponent = new ThemeComponent(ThemeComponentType.TextColor, "Test Component 1", testInputThemeComponentColor);
testInputTheme.Components.Add(testInputThemeComponent);
testInputBlockItem.ThemeComponent = testInputThemeComponent;
+ var mockMessageBoxService = new Mock();
- var service = new ThemeService();
+ var service = new ThemeService(mockMessageBoxService.Object);
// Act
service.ApplyThemeToScript(testInputTheme, testInputScript);
@@ -54,8 +57,10 @@ namespace Filtration.ThemeEditor.Tests.Services
var testInputBlockItemThemeComponent = new ThemeComponent(ThemeComponentType.TextColor, "Different Component", testInputThemeComponentColor);
testInputTheme.Components.Add(testInputThemeComponent);
testInputBlockItem.ThemeComponent = testInputBlockItemThemeComponent;
+
+ var mockMessageBoxService = new Mock();
- var service = new ThemeService();
+ var service = new ThemeService(mockMessageBoxService.Object);
// Act
service.ApplyThemeToScript(testInputTheme, testInputScript);
diff --git a/Filtration.ThemeEditor/Services/ThemeService.cs b/Filtration.ThemeEditor/Services/ThemeService.cs
index 8b82018..95c22b9 100644
--- a/Filtration.ThemeEditor/Services/ThemeService.cs
+++ b/Filtration.ThemeEditor/Services/ThemeService.cs
@@ -1,6 +1,7 @@
using System;
using System.Linq;
using System.Windows;
+using Filtration.Common.Services;
using Filtration.ObjectModel;
using Filtration.ObjectModel.BlockItemBaseTypes;
using Filtration.ObjectModel.BlockItemTypes;
@@ -16,6 +17,13 @@ namespace Filtration.ThemeEditor.Services
public class ThemeService : IThemeService
{
+ private readonly IMessageBoxService _messageBoxService;
+
+ public ThemeService(IMessageBoxService messageBoxService)
+ {
+ _messageBoxService = messageBoxService;
+ }
+
public void ApplyThemeToScript(Theme theme, ItemFilterScript script)
{
var mismatchedComponents = false;
@@ -58,9 +66,9 @@ namespace Filtration.ThemeEditor.Services
if (mismatchedComponents)
{
- MessageBox.Show(
+ _messageBoxService.Show("Possible Theme Mismatch",
"Not all theme components had matches - are you sure this theme is designed for this script?",
- "Possible Theme Mismatch", MessageBoxButton.OK, MessageBoxImage.Exclamation);
+ MessageBoxButton.OK, MessageBoxImage.Exclamation);
}
}
}
diff --git a/Filtration.ThemeEditor/ViewModels/ThemeViewModel.cs b/Filtration.ThemeEditor/ViewModels/ThemeViewModel.cs
index ce06888..e2ba179 100644
--- a/Filtration.ThemeEditor/ViewModels/ThemeViewModel.cs
+++ b/Filtration.ThemeEditor/ViewModels/ThemeViewModel.cs
@@ -4,6 +4,7 @@ using System.IO;
using System.Windows;
using System.Windows.Forms;
using System.Windows.Media.Imaging;
+using Filtration.Common.Services;
using Filtration.Common.ViewModels;
using Filtration.Interface;
using Filtration.ThemeEditor.Providers;
@@ -27,12 +28,15 @@ namespace Filtration.ThemeEditor.ViewModels
private static readonly Logger _logger = LogManager.GetCurrentClassLogger();
private readonly IThemeProvider _themeProvider;
+ private readonly IMessageBoxService _messageBoxService;
private bool _filenameIsFake;
private string _filePath;
- public ThemeViewModel(IThemeProvider themeProvider)
+ public ThemeViewModel(IThemeProvider themeProvider,
+ IMessageBoxService messageBoxService)
{
_themeProvider = themeProvider;
+ _messageBoxService = messageBoxService;
Components = new ObservableCollection();
@@ -93,8 +97,7 @@ namespace Filtration.ThemeEditor.ViewModels
_logger.Error(e);
}
- MessageBox.Show(@"Error saving filter theme - " + e.Message, @"Save Error", MessageBoxButton.OK,
- MessageBoxImage.Error);
+ _messageBoxService.Show("Save Error", "Error saving filter theme - " + e.Message, MessageBoxButton.OK, MessageBoxImage.Error);
}
}
@@ -125,7 +128,7 @@ namespace Filtration.ThemeEditor.ViewModels
_logger.Error(e);
}
- MessageBox.Show(@"Error saving theme file - " + e.Message, @"Save Error", MessageBoxButton.OK,
+ _messageBoxService.Show("Save Error", "Error saving theme file - " + e.Message, MessageBoxButton.OK,
MessageBoxImage.Error);
FilePath = previousFilePath;
}
diff --git a/Filtration/Converters/BooleanVisibilityConverterCopy.cs b/Filtration/Converters/BooleanVisibilityConverterCopy.cs
index 2681bc2..3be867a 100644
--- a/Filtration/Converters/BooleanVisibilityConverterCopy.cs
+++ b/Filtration/Converters/BooleanVisibilityConverterCopy.cs
@@ -9,7 +9,6 @@ namespace Filtration.Converters
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
- return (bool) value ? Visibility.Visible : Visibility.Hidden;
if (value is bool && targetType == typeof (Visibility))
{
var val = (bool) value;
diff --git a/Filtration/Translators/ItemFilterBlockTranslator.cs b/Filtration/Translators/ItemFilterBlockTranslator.cs
index 15e699b..4d32fea 100644
--- a/Filtration/Translators/ItemFilterBlockTranslator.cs
+++ b/Filtration/Translators/ItemFilterBlockTranslator.cs
@@ -16,6 +16,7 @@ namespace Filtration.Translators
{
internal interface IItemFilterBlockTranslator
{
+ void InitialiseForExistingScript(ItemFilterScript script);
ItemFilterBlock TranslateStringToItemFilterBlock(string inputString);
string TranslateItemFilterBlockToString(ItemFilterBlock block);
void ReplaceColorBlockItemsFromString(ObservableCollection blockItems, string inputString);
@@ -34,6 +35,12 @@ namespace Filtration.Translators
_themeComponentListBuilder = themeComponentListBuilder;
}
+ public void InitialiseForExistingScript(ItemFilterScript script)
+ {
+ _themeComponentListBuilder.Initialise(script.ThemeComponents);
+ _blockGroupHierarchyBuilder.Initialise(script.ItemFilterBlockGroups.First());
+ }
+
// This method converts a string into a ItemFilterBlock. This is used for pasting ItemFilterBlocks
// and reading ItemFilterScripts from a file.
public ItemFilterBlock TranslateStringToItemFilterBlock(string inputString)
diff --git a/Filtration/ViewModels/ItemFilterScriptViewModel.cs b/Filtration/ViewModels/ItemFilterScriptViewModel.cs
index 85325f3..7571058 100644
--- a/Filtration/ViewModels/ItemFilterScriptViewModel.cs
+++ b/Filtration/ViewModels/ItemFilterScriptViewModel.cs
@@ -9,6 +9,7 @@ using System.Windows.Data;
using System.Windows.Forms;
using System.Windows.Media.Imaging;
using Castle.Core.Internal;
+using Filtration.Common.Services;
using Filtration.Common.ViewModels;
using Filtration.Interface;
using Filtration.ObjectModel;
@@ -18,7 +19,6 @@ using GalaSoft.MvvmLight.CommandWpf;
using GalaSoft.MvvmLight.Messaging;
using NLog;
using Clipboard = System.Windows.Clipboard;
-using MessageBox = System.Windows.MessageBox;
namespace Filtration.ViewModels
{
@@ -70,6 +70,7 @@ namespace Filtration.ViewModels
private readonly IItemFilterBlockTranslator _blockTranslator;
private readonly IAvalonDockWorkspaceViewModel _avalonDockWorkspaceViewModel;
private readonly IItemFilterPersistenceService _persistenceService;
+ private readonly IMessageBoxService _messageBoxService;
private bool _isDirty;
private IItemFilterBlockViewModel _selectedBlockViewModel;
@@ -81,13 +82,15 @@ namespace Filtration.ViewModels
public ItemFilterScriptViewModel(IItemFilterBlockViewModelFactory itemFilterBlockViewModelFactory,
IItemFilterBlockTranslator blockTranslator,
IAvalonDockWorkspaceViewModel avalonDockWorkspaceViewModel,
- IItemFilterPersistenceService persistenceService)
+ IItemFilterPersistenceService persistenceService,
+ IMessageBoxService messageBoxService)
{
_itemFilterBlockViewModelFactory = itemFilterBlockViewModelFactory;
_blockTranslator = blockTranslator;
_avalonDockWorkspaceViewModel = avalonDockWorkspaceViewModel;
_avalonDockWorkspaceViewModel.ActiveDocumentChanged += OnActiveDocumentChanged;
_persistenceService = persistenceService;
+ _messageBoxService = messageBoxService;
_itemFilterBlockViewModels = new ObservableCollection();
ToggleShowAdvancedCommand = new RelayCommand(OnToggleShowAdvancedCommand);
@@ -342,8 +345,8 @@ namespace Filtration.ViewModels
_logger.Error(e);
}
- MessageBox.Show(@"Error saving filter file - " + e.Message, @"Save Error", MessageBoxButton.OK,
- MessageBoxImage.Error);
+ _messageBoxService.Show("Save Error", "Error saving filter file - " + e.Message, MessageBoxButton.OK,
+ MessageBoxImage.Error);
}
}
@@ -378,7 +381,7 @@ namespace Filtration.ViewModels
_logger.Error(e);
}
- MessageBox.Show(@"Error saving filter file - " + e.Message, @"Save Error", MessageBoxButton.OK,
+ _messageBoxService.Show("Save Error", "Error saving filter file - " + e.Message, MessageBoxButton.OK,
MessageBoxImage.Error);
Script.FilePath = previousFilePath;
}
@@ -421,7 +424,8 @@ namespace Filtration.ViewModels
var messageText = "The following script validation errors occurred:" + Environment.NewLine + failures;
- MessageBox.Show(messageText, "Script Validation Failure", MessageBoxButton.OK, MessageBoxImage.Exclamation);
+ _messageBoxService.Show("Script Validation Failure", messageText, MessageBoxButton.OK,
+ MessageBoxImage.Exclamation);
return false;
}
@@ -438,8 +442,9 @@ namespace Filtration.ViewModels
}
else
{
- var result = MessageBox.Show(@"Want to save your changes to this script?",
- @"Filtration", MessageBoxButton.YesNoCancel, MessageBoxImage.Question);
+ var result = _messageBoxService.Show("Filtration",
+ "Want to save your changes to this script?", MessageBoxButton.YesNoCancel, MessageBoxImage.Question);
+
switch (result)
{
case MessageBoxResult.Yes:
@@ -538,6 +543,7 @@ namespace Filtration.ViewModels
var clipboardText = Clipboard.GetText();
if (clipboardText.IsNullOrEmpty()) return;
+ _blockTranslator.InitialiseForExistingScript(Script);
var translatedBlock = _blockTranslator.TranslateStringToItemFilterBlock(clipboardText);
if (translatedBlock == null) return;
@@ -562,8 +568,10 @@ namespace Filtration.ViewModels
catch (Exception e)
{
_logger.Error(e);
- MessageBox.Show(e.Message + Environment.NewLine + e.StackTrace + Environment.NewLine +
- e.InnerException.Message + Environment.NewLine + e.InnerException.StackTrace, "Paste Error", MessageBoxButton.OK);
+ _messageBoxService.Show("Paste Error",
+ e.Message + Environment.NewLine + e.StackTrace + Environment.NewLine +
+ e.InnerException.Message + Environment.NewLine + e.InnerException.StackTrace, MessageBoxButton.OK,
+ MessageBoxImage.Error);
}
}
@@ -717,9 +725,10 @@ namespace Filtration.ViewModels
public void DeleteBlock(IItemFilterBlockViewModel targetBlockViewModel)
{
- var result = MessageBox.Show("Are you sure you wish to delete this block?", "Delete Confirmation",
- MessageBoxButton.YesNo, MessageBoxImage.Question);
-
+ var result = _messageBoxService.Show("Delete Confirmation", "Are you sure you wish to delete this block?",
+ MessageBoxButton.YesNo,
+ MessageBoxImage.Question);
+
if (result == MessageBoxResult.Yes)
{
Script.ItemFilterBlocks.Remove(targetBlockViewModel.Block);
diff --git a/Filtration/ViewModels/MainWindowViewModel.cs b/Filtration/ViewModels/MainWindowViewModel.cs
index c278d34..63f1667 100644
--- a/Filtration/ViewModels/MainWindowViewModel.cs
+++ b/Filtration/ViewModels/MainWindowViewModel.cs
@@ -1,11 +1,12 @@
using System;
using System.Diagnostics;
-using System.Globalization;
using System.IO;
using System.Reflection;
+using System.Windows;
using System.Windows.Forms;
using System.Windows.Media;
using System.Windows.Media.Imaging;
+using Filtration.Common.Services;
using Filtration.Common.ViewModels;
using Filtration.Interface;
using Filtration.Models;
@@ -45,6 +46,7 @@ namespace Filtration.ViewModels
private readonly IThemeService _themeService;
private readonly IUpdateCheckService _updateCheckService;
private readonly IUpdateAvailableViewModel _updateAvailableViewModel;
+ private readonly IMessageBoxService _messageBoxService;
public MainWindowViewModel(IItemFilterScriptRepository itemFilterScriptRepository,
IItemFilterScriptTranslator itemFilterScriptTranslator,
@@ -54,7 +56,8 @@ namespace Filtration.ViewModels
IThemeProvider themeProvider,
IThemeService themeService,
IUpdateCheckService updateCheckService,
- IUpdateAvailableViewModel updateAvailableViewModel)
+ IUpdateAvailableViewModel updateAvailableViewModel,
+ IMessageBoxService messageBoxService)
{
_itemFilterScriptRepository = itemFilterScriptRepository;
_itemFilterScriptTranslator = itemFilterScriptTranslator;
@@ -65,6 +68,7 @@ namespace Filtration.ViewModels
_themeService = themeService;
_updateCheckService = updateCheckService;
_updateAvailableViewModel = updateAvailableViewModel;
+ _messageBoxService = messageBoxService;
NewScriptCommand = new RelayCommand(OnNewScriptCommand);
CopyScriptCommand = new RelayCommand(OnCopyScriptCommand, () => ActiveDocumentIsScript);
@@ -319,9 +323,9 @@ namespace Filtration.ViewModels
{
_logger.Error(e);
}
- MessageBox.Show(@"Error loading filter script - " + e.Message, @"Script Load Error",
- MessageBoxButtons.OK,
- MessageBoxIcon.Error);
+ _messageBoxService.Show("Script Load Error", "Error loading filter script - " + e.Message,
+ MessageBoxButton.OK,
+ MessageBoxImage.Error);
return;
}
@@ -349,9 +353,9 @@ namespace Filtration.ViewModels
{
_logger.Error(e);
}
- MessageBox.Show(@"Error loading filter theme - " + e.Message, @"Theme Load Error",
- MessageBoxButtons.OK,
- MessageBoxIcon.Error);
+ _messageBoxService.Show("Theme Load Error", "Error loading filter theme - " + e.Message,
+ MessageBoxButton.OK,
+ MessageBoxImage.Error);
return;
}
@@ -378,15 +382,16 @@ namespace Filtration.ViewModels
{
_logger.Error(e);
}
- MessageBox.Show(@"Error loading filter theme - " + e.Message, @"Theme Load Error",
- MessageBoxButtons.OK,
- MessageBoxIcon.Error);
+ _messageBoxService.Show("Theme Load Error", "Error loading filter theme - " + e.Message,
+ MessageBoxButton.OK,
+ MessageBoxImage.Error);
return;
}
- var result = MessageBox.Show(@"Are you sure you wish to apply this theme to the current filter script?",
- @"Confirm", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
- if (result == DialogResult.No)
+ var result = _messageBoxService.Show("Confirm",
+ "Are you sure you wish to apply this theme to the current filter script?", MessageBoxButton.YesNo,
+ MessageBoxImage.Question);
+ if (result == MessageBoxResult.No)
{
return;
}
diff --git a/Filtration/ViewModels/SettingsPageViewModel.cs b/Filtration/ViewModels/SettingsPageViewModel.cs
index ac99b2a..0247d52 100644
--- a/Filtration/ViewModels/SettingsPageViewModel.cs
+++ b/Filtration/ViewModels/SettingsPageViewModel.cs
@@ -1,5 +1,6 @@
using System.IO;
using System.Windows;
+using Filtration.Common.Services;
using Filtration.Common.ViewModels;
using Filtration.Properties;
using Filtration.Services;
@@ -14,10 +15,12 @@ namespace Filtration.ViewModels
internal class SettingsPageViewModel : FiltrationViewModelBase, ISettingsPageViewModel
{
private readonly IItemFilterPersistenceService _itemFilterPersistenceService;
+ private readonly IMessageBoxService _messageBoxService;
- public SettingsPageViewModel(IItemFilterPersistenceService itemFilterPersistenceService)
+ public SettingsPageViewModel(IItemFilterPersistenceService itemFilterPersistenceService, IMessageBoxService messageBoxService)
{
_itemFilterPersistenceService = itemFilterPersistenceService;
+ _messageBoxService = messageBoxService;
SaveCommand = new RelayCommand(OnSaveCommand);
DefaultFilterDirectory = Settings.Default.DefaultFilterDirectory;
@@ -41,7 +44,7 @@ namespace Filtration.ViewModels
}
catch (DirectoryNotFoundException)
{
- MessageBox.Show("The entered Default Filter Directory is invalid or does not exist.", "Error",
+ _messageBoxService.Show("Error", "The entered Default Filter Directory is invalid or does not exist.",
MessageBoxButton.OK, MessageBoxImage.Exclamation);
}
}
diff --git a/Filtration/Views/ItemFilterBlockDisplaySettingsView.xaml b/Filtration/Views/ItemFilterBlockDisplaySettingsView.xaml
index 49b5f7c..46c991f 100644
--- a/Filtration/Views/ItemFilterBlockDisplaySettingsView.xaml
+++ b/Filtration/Views/ItemFilterBlockDisplaySettingsView.xaml
@@ -91,7 +91,7 @@
-