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 @@ - diff --git a/Filtration/Views/ItemFilterBlockView.xaml b/Filtration/Views/ItemFilterBlockView.xaml index 3906c19..a2bdac5 100644 --- a/Filtration/Views/ItemFilterBlockView.xaml +++ b/Filtration/Views/ItemFilterBlockView.xaml @@ -111,12 +111,18 @@ - +