From 6d9edbda98c22f4fc4c8184128f6d2d925866a8c Mon Sep 17 00:00:00 2001 From: Ben Date: Thu, 11 Jun 2015 20:33:45 +0100 Subject: [PATCH] Refactored AvalonDock workspace into separate ViewModel --- Filtration/Extensions/HyperlinkExtensions.cs | 7 +- Filtration/Filtration.csproj | 17 +- .../AvalonDockWorkspaceViewModel.cs | 130 +++++++++ Filtration/ViewModels/IDocument.cs | 8 +- .../ViewModels/ItemFilterBlockViewModel.cs | 1 - .../ViewModels/ItemFilterScriptViewModel.cs | 153 ++++++++-- Filtration/ViewModels/MainWindowViewModel.cs | 269 ++++-------------- .../ViewModels/SectionBrowserViewModel.cs | 17 +- Filtration/ViewModels/StartPageViewModel.cs | 14 +- Filtration/ViewModels/ToolViewModel.cs | 17 +- .../SelectingItemAttachedProperty.cs | 6 +- .../AvalonDock/AvalonDockWorkspaceView.xaml | 87 ++++++ .../Views/AvalonDock/LayoutInitializer.cs | 3 +- .../Views/BlockGroupBrowserView.xaml.cs | 28 -- Filtration/Views/MainWindow.xaml | 76 +---- Filtration/Views/SectionBrowserView.xaml.cs | 28 -- Filtration/Views/StartPageView.xaml.cs | 22 +- .../BlockGroupBrowserView.xaml | 2 +- .../{ => ToolPanes}/SectionBrowserView.xaml | 2 +- .../WindsorInstallers/ViewModelsInstaller.cs | 5 + 20 files changed, 456 insertions(+), 436 deletions(-) create mode 100644 Filtration/ViewModels/AvalonDockWorkspaceViewModel.cs create mode 100644 Filtration/Views/AvalonDock/AvalonDockWorkspaceView.xaml delete mode 100644 Filtration/Views/BlockGroupBrowserView.xaml.cs delete mode 100644 Filtration/Views/SectionBrowserView.xaml.cs rename Filtration/Views/{ => ToolPanes}/BlockGroupBrowserView.xaml (94%) rename Filtration/Views/{ => ToolPanes}/SectionBrowserView.xaml (94%) diff --git a/Filtration/Extensions/HyperlinkExtensions.cs b/Filtration/Extensions/HyperlinkExtensions.cs index b7b9a38..fd46841 100644 --- a/Filtration/Extensions/HyperlinkExtensions.cs +++ b/Filtration/Extensions/HyperlinkExtensions.cs @@ -25,9 +25,10 @@ namespace Filtration.Extensions var hyperlink = sender as Hyperlink; if ((bool)args.NewValue) - hyperlink.RequestNavigate += Hyperlink_RequestNavigate; - else - hyperlink.RequestNavigate -= Hyperlink_RequestNavigate; + { + if (hyperlink != null) hyperlink.RequestNavigate += Hyperlink_RequestNavigate; + } + else if (hyperlink != null) hyperlink.RequestNavigate -= Hyperlink_RequestNavigate; } private static void Hyperlink_RequestNavigate(object sender, RequestNavigateEventArgs e) diff --git a/Filtration/Filtration.csproj b/Filtration/Filtration.csproj index 6578693..173b505 100644 --- a/Filtration/Filtration.csproj +++ b/Filtration/Filtration.csproj @@ -60,6 +60,7 @@ + ..\packages\WPFToolkit.3.5.50211.1\lib\System.Windows.Controls.Input.Toolkit.dll @@ -170,6 +171,7 @@ ItemPreviewControl.xaml + @@ -183,8 +185,11 @@ + + AvalonDockWorkspaceView.xaml + - + BlockGroupBrowserView.xaml @@ -212,7 +217,7 @@ ReplaceColorsWindow.xaml - + SectionBrowserView.xaml @@ -227,7 +232,11 @@ Designer MSBuild:Compile - + + Designer + MSBuild:Compile + + Designer MSBuild:Compile @@ -251,7 +260,7 @@ Designer MSBuild:Compile - + Designer MSBuild:Compile diff --git a/Filtration/ViewModels/AvalonDockWorkspaceViewModel.cs b/Filtration/ViewModels/AvalonDockWorkspaceViewModel.cs new file mode 100644 index 0000000..e84d040 --- /dev/null +++ b/Filtration/ViewModels/AvalonDockWorkspaceViewModel.cs @@ -0,0 +1,130 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using GalaSoft.MvvmLight.Messaging; + +namespace Filtration.ViewModels +{ + internal interface IAvalonDockWorkspaceViewModel + { + event EventHandler ActiveDocumentChanged; + IDocument ActiveDocument { get; set; } + IItemFilterScriptViewModel ActiveScriptViewModel { get; } + void AddDocument(IDocument document); + void CloseDocument(IDocument document); + void SwitchActiveDocument(IDocument document); + } + + internal class AvalonDockWorkspaceViewModel : FiltrationViewModelBase, IAvalonDockWorkspaceViewModel + { + private readonly ISectionBrowserViewModel _sectionBrowserViewModel; + private readonly IBlockGroupBrowserViewModel _blockGroupBrowserViewModel; + + private IDocument _activeDocument; + private IItemFilterScriptViewModel _activeScriptViewModel; + private readonly ObservableCollection _openDocuments; + + public AvalonDockWorkspaceViewModel(ISectionBrowserViewModel sectionBrowserViewModel, + IBlockGroupBrowserViewModel blockGroupBrowserViewModel, + IStartPageViewModel startPageViewModel) + { + _sectionBrowserViewModel = sectionBrowserViewModel; + _blockGroupBrowserViewModel = blockGroupBrowserViewModel; + + _sectionBrowserViewModel.Initialise(this); + _blockGroupBrowserViewModel.Initialise(this); + + _openDocuments = new ObservableCollection {startPageViewModel}; + ActiveDocument = startPageViewModel; + } + + public event EventHandler ActiveDocumentChanged; + + public ObservableCollection OpenDocuments + { + get { return _openDocuments; } + } + + public IDocument ActiveDocument + { + get { return _activeDocument; } + set + { + _activeDocument = value; + RaisePropertyChanged(); + + if (value.IsScript) + { + _activeScriptViewModel = (IItemFilterScriptViewModel) value; + } + else + { + _activeScriptViewModel = null; + } + + if (ActiveDocumentChanged != null) + { + ActiveDocumentChanged(this, EventArgs.Empty); + } + + Messenger.Default.Send(new NotificationMessage("ActiveDocumentChanged")); + } + } + + public IItemFilterScriptViewModel ActiveScriptViewModel + { + get { return _activeScriptViewModel; } + } + + private List _tools; + + public IEnumerable Tools + { + get + { + if (_tools == null) + { + _tools = new List { _sectionBrowserViewModel, _blockGroupBrowserViewModel }; + } + + return _tools; + } + } + + public void AddDocument(IDocument document) + { + if (document.IsScript) + { + _activeScriptViewModel = (IItemFilterScriptViewModel)document; + } + + OpenDocuments.Add(document); + ActiveDocument = document; + } + + public void CloseDocument(IDocument document) + { + if (!OpenDocuments.Contains(document)) + { + throw new ArgumentException("CloseDocument called with non-existant document"); + } + + if (document.IsScript) + { + _sectionBrowserViewModel.ClearDown(); + } + + OpenDocuments.Remove(document); + } + + public void SwitchActiveDocument(IDocument document) + { + if (!OpenDocuments.Contains(document)) + { + throw new ArgumentException("SwitchActiveDocument called with non-existant document"); + } + + ActiveDocument = document; + } + } +} diff --git a/Filtration/ViewModels/IDocument.cs b/Filtration/ViewModels/IDocument.cs index 0b7051d..7294e58 100644 --- a/Filtration/ViewModels/IDocument.cs +++ b/Filtration/ViewModels/IDocument.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Filtration.ViewModels +namespace Filtration.ViewModels { interface IDocument { diff --git a/Filtration/ViewModels/ItemFilterBlockViewModel.cs b/Filtration/ViewModels/ItemFilterBlockViewModel.cs index a84a58a..a16be84 100644 --- a/Filtration/ViewModels/ItemFilterBlockViewModel.cs +++ b/Filtration/ViewModels/ItemFilterBlockViewModel.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using System.Collections.Specialized; using System.Linq; -using System.Windows; using System.Windows.Media; using Filtration.Models; using Filtration.Models.BlockItemBaseTypes; diff --git a/Filtration/ViewModels/ItemFilterScriptViewModel.cs b/Filtration/ViewModels/ItemFilterScriptViewModel.cs index 8e0cec7..fb05cb8 100644 --- a/Filtration/ViewModels/ItemFilterScriptViewModel.cs +++ b/Filtration/ViewModels/ItemFilterScriptViewModel.cs @@ -1,43 +1,57 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Collections.ObjectModel; using System.IO; using System.Linq; using System.Windows; +using System.Windows.Forms; using Castle.Core.Internal; using Filtration.Models; +using Filtration.Services; using Filtration.Translators; using GalaSoft.MvvmLight.CommandWpf; +using Clipboard = System.Windows.Clipboard; +using MessageBox = System.Windows.MessageBox; namespace Filtration.ViewModels { - internal interface IItemFilterScriptViewModel + internal interface IItemFilterScriptViewModel : IDocument { ItemFilterScript Script { get; } + IItemFilterBlockViewModel SelectedBlockViewModel { get; set; } + IItemFilterBlockViewModel SectionBrowserSelectedBlockViewModel { get; set; } + IEnumerable BlockGroups { get; } + IEnumerable ItemFilterSectionViewModels { get; } bool IsDirty { get; } string Description { get; set; } string DisplayName { get; } + void Initialise(ItemFilterScript itemFilterScript); - IItemFilterBlockViewModel SelectedBlockViewModel { get; set; } - IItemFilterBlockViewModel SectionBrowserSelectedBlockViewModel { get; set; } void RemoveDirtyFlag(); - IEnumerable BlockGroups { get; } - IEnumerable ItemFilterSectionViewModels { get; } + void SaveScript(); + void SaveScriptAs(); + void Close(); void AddSection(IItemFilterBlockViewModel targetBlockViewModel); void AddBlock(IItemFilterBlockViewModel targetBlockViewModel); void CopyBlock(IItemFilterBlockViewModel targetBlockViewModel); void PasteBlock(IItemFilterBlockViewModel targetBlockViewModel); } - internal class ItemFilterScriptViewModel : PaneViewModel, IItemFilterScriptViewModel, IDocument + internal class ItemFilterScriptViewModel : PaneViewModel, IItemFilterScriptViewModel { private readonly IItemFilterBlockViewModelFactory _itemFilterBlockViewModelFactory; private readonly IItemFilterBlockTranslator _blockTranslator; - private readonly IMainWindowViewModel _mainWindowViewModel; + private readonly IAvalonDockWorkspaceViewModel _avalonDockWorkspaceViewModel; + private readonly IItemFilterPersistenceService _persistenceService; + private bool _isDirty; private IItemFilterBlockViewModel _selectedBlockViewModel; private IItemFilterBlockViewModel _sectionBrowserSelectedBlockViewModel; - public ItemFilterScriptViewModel(IItemFilterBlockViewModelFactory itemFilterBlockViewModelFactory, IItemFilterBlockTranslator blockTranslator, IMainWindowViewModel mainWindowViewModel) + public ItemFilterScriptViewModel(IItemFilterBlockViewModelFactory itemFilterBlockViewModelFactory, + IItemFilterBlockTranslator blockTranslator, + IAvalonDockWorkspaceViewModel avalonDockWorkspaceViewModel, + IItemFilterPersistenceService persistenceService) { CloseCommand = new RelayCommand(OnCloseCommand); DeleteBlockCommand = new RelayCommand(OnDeleteBlockCommand, () => SelectedBlockViewModel != null); @@ -51,15 +65,11 @@ namespace Filtration.ViewModels PasteBlockCommand = new RelayCommand(OnPasteBlockCommand, () => SelectedBlockViewModel != null); _itemFilterBlockViewModelFactory = itemFilterBlockViewModelFactory; _blockTranslator = blockTranslator; - _mainWindowViewModel = mainWindowViewModel; + _avalonDockWorkspaceViewModel = avalonDockWorkspaceViewModel; + _persistenceService = persistenceService; ItemFilterBlockViewModels = new ObservableCollection(); } - public bool IsScript - { - get { return true; } - } - public RelayCommand CloseCommand { get; private set; } public RelayCommand DeleteBlockCommand { get; private set; } public RelayCommand MoveBlockToTopCommand { get; private set; } @@ -77,7 +87,12 @@ namespace Filtration.ViewModels { get { return ItemFilterBlockViewModels.Where(b => b.Block.GetType() == typeof (ItemFilterSection)); } } - + + public bool IsScript + { + get { return true; } + } + public string Description { get { return Script.Description; } @@ -178,10 +193,114 @@ namespace Filtration.ViewModels ContentId = "testcontentid"; } + public void SaveScript() + { + if (!ValidateScript()) return; + + if (string.IsNullOrEmpty(Script.FilePath)) + { + SaveScriptAs(); + return; + } + + try + { + _persistenceService.SaveItemFilterScript(Script); + RemoveDirtyFlag(); + } + catch (Exception e) + { + MessageBox.Show(@"Error saving filter file - " + e.Message, @"Save Error", MessageBoxButton.OK, + MessageBoxImage.Error); + } + } + + public void SaveScriptAs() + { + if (!ValidateScript()) return; + + var saveDialog = new SaveFileDialog + { + DefaultExt = ".filter", + Filter = @"Filter Files (*.filter)|*.filter|All Files (*.*)|*.*", + InitialDirectory = _persistenceService.ItemFilterScriptDirectory + }; + + var result = saveDialog.ShowDialog(); + + if (result != DialogResult.OK) return; + + var previousFilePath = Script.FilePath; + try + { + Script.FilePath = saveDialog.FileName; + _persistenceService.SaveItemFilterScript(Script); + RemoveDirtyFlag(); + } + catch (Exception e) + { + MessageBox.Show(@"Error saving filter file - " + e.Message, @"Save Error", MessageBoxButton.OK, + MessageBoxImage.Error); + Script.FilePath = previousFilePath; + } + } + + private bool ValidateScript() + { + var result = Script.Validate(); + + if (result.Count == 0) return true; + + var failures = string.Empty; + + // ReSharper disable once LoopCanBeConvertedToQuery + foreach (string failure in result) + { + failures += failure + Environment.NewLine; + } + + var messageText = "The following script validation errors occurred:" + Environment.NewLine + failures; + + MessageBox.Show(messageText, "Script Validation Failure", MessageBoxButton.OK, MessageBoxImage.Exclamation); + return false; + } + + public void Close() + { + if (!IsDirty) + { + _avalonDockWorkspaceViewModel.CloseDocument(this); + } + else + { + var result = MessageBox.Show(@"Want to save your changes to this script?", + @"Filtration", MessageBoxButton.YesNoCancel, MessageBoxImage.Question); + switch (result) + { + case MessageBoxResult.Yes: + { + SaveScript(); + _avalonDockWorkspaceViewModel.CloseDocument(this); + break; + } + case MessageBoxResult.No: + { + _avalonDockWorkspaceViewModel.CloseDocument(this); + break; + } + case MessageBoxResult.Cancel: + { + return; + } + } + } + } + private void OnCloseCommand() { - _mainWindowViewModel.Close(this); + Close(); } + private void OnCopyBlockCommand() { CopyBlock(SelectedBlockViewModel); diff --git a/Filtration/ViewModels/MainWindowViewModel.cs b/Filtration/ViewModels/MainWindowViewModel.cs index 40b36d0..0a0804e 100644 --- a/Filtration/ViewModels/MainWindowViewModel.cs +++ b/Filtration/ViewModels/MainWindowViewModel.cs @@ -1,86 +1,83 @@ using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; using System.Diagnostics; using System.Reflection; using System.Windows.Forms; -using Castle.Core; using Filtration.Models; using Filtration.Services; using Filtration.Translators; using Filtration.Views; using GalaSoft.MvvmLight.CommandWpf; +using GalaSoft.MvvmLight.Messaging; using Clipboard = System.Windows.Clipboard; +using MessageBox = System.Windows.Forms.MessageBox; using OpenFileDialog = Microsoft.Win32.OpenFileDialog; namespace Filtration.ViewModels { internal interface IMainWindowViewModel { - IDocument ActiveDocument { get; set; } - IItemFilterScriptViewModel ActiveScriptViewModel { get; } - event EventHandler ActiveDocumentChanged; void LoadScriptFromFile(string path); RelayCommand OpenScriptCommand { get; } RelayCommand NewScriptCommand { get; } - void Close(IDocument scriptToClose); } internal class MainWindowViewModel : FiltrationViewModelBase, IMainWindowViewModel { - - private ItemFilterScript _loadedScript; - private readonly IItemFilterScriptViewModelFactory _itemFilterScriptViewModelFactory; private readonly IItemFilterPersistenceService _persistenceService; private readonly IItemFilterScriptTranslator _itemFilterScriptTranslator; private readonly IReplaceColorsViewModel _replaceColorsViewModel; + private readonly IAvalonDockWorkspaceViewModel _avalonDockWorkspaceViewModel; + private IDocument _activeDocument; - private IItemFilterScriptViewModel _activeScriptViewModel; - private readonly ObservableCollection _openDocuments; - private readonly ISectionBrowserViewModel _sectionBrowserViewModel; - private readonly IBlockGroupBrowserViewModel _blockGroupBrowserViewModel; - private readonly IStartPageViewModel _startPageViewModel; public MainWindowViewModel(IItemFilterScriptViewModelFactory itemFilterScriptViewModelFactory, IItemFilterPersistenceService persistenceService, IItemFilterScriptTranslator itemFilterScriptTranslator, IReplaceColorsViewModel replaceColorsViewModel, - ISectionBrowserViewModel sectionBrowserViewModel, - IBlockGroupBrowserViewModel blockGroupBrowserViewModel, - IStartPageViewModel startPageViewModel) + IAvalonDockWorkspaceViewModel avalonDockWorkspaceViewModel) { _itemFilterScriptViewModelFactory = itemFilterScriptViewModelFactory; _persistenceService = persistenceService; _itemFilterScriptTranslator = itemFilterScriptTranslator; _replaceColorsViewModel = replaceColorsViewModel; - _sectionBrowserViewModel = sectionBrowserViewModel; - _blockGroupBrowserViewModel = blockGroupBrowserViewModel; - _startPageViewModel = startPageViewModel; + _avalonDockWorkspaceViewModel = avalonDockWorkspaceViewModel; - _sectionBrowserViewModel.Initialise(this); - _blockGroupBrowserViewModel.Initialise(this); - _startPageViewModel.Initialise(this); - - _openDocuments = new ObservableCollection(); OpenAboutWindowCommand = new RelayCommand(OnOpenAboutWindowCommand); OpenScriptCommand = new RelayCommand(OnOpenScriptCommand); - SaveScriptCommand = new RelayCommand(OnSaveScriptCommand, () => ActiveDocument != null && ActiveDocument.IsScript); - SaveScriptAsCommand = new RelayCommand(OnSaveScriptAsCommand, () => ActiveDocument != null && ActiveDocument.IsScript); - CopyScriptCommand = new RelayCommand(OnCopyScriptCommand, () => ActiveDocument != null && ActiveDocument.IsScript); - CopyBlockCommand = new RelayCommand(OnCopyBlockCommand, () => ActiveDocument != null && ActiveDocument.IsScript && ((IItemFilterScriptViewModel)ActiveDocument).SelectedBlockViewModel != null); - PasteCommand = new RelayCommand(OnPasteCommand, () => ActiveDocument != null && ActiveDocument.IsScript && ((IItemFilterScriptViewModel)ActiveDocument).SelectedBlockViewModel != null); + SaveScriptCommand = new RelayCommand(OnSaveScriptCommand, ActiveDocumentIsScript); + SaveScriptAsCommand = new RelayCommand(OnSaveScriptAsCommand, ActiveDocumentIsScript); + CopyScriptCommand = new RelayCommand(OnCopyScriptCommand, ActiveDocumentIsScript); + CopyBlockCommand = new RelayCommand(OnCopyBlockCommand, () => ActiveDocumentIsScript() && (_avalonDockWorkspaceViewModel.ActiveScriptViewModel.SelectedBlockViewModel != null)); + PasteCommand = new RelayCommand(OnPasteCommand, () => ActiveDocumentIsScript() && (_avalonDockWorkspaceViewModel.ActiveScriptViewModel.SelectedBlockViewModel != null)); NewScriptCommand = new RelayCommand(OnNewScriptCommand); - CloseScriptCommand = new RelayCommand(OnCloseScriptCommand, v => ActiveDocument != null && ActiveDocument.IsScript); - ReplaceColorsCommand = new RelayCommand(OnReplaceColorsCommand, () => ActiveDocument != null && ActiveDocument.IsScript); + CloseScriptCommand = new RelayCommand(OnCloseScriptCommand, ActiveDocumentIsScript); + ReplaceColorsCommand = new RelayCommand(OnReplaceColorsCommand, ActiveDocumentIsScript); //LoadScriptFromFile("C:\\ThioleLootFilter.txt"); SetItemFilterScriptDirectory(); - - _openDocuments.Add(_startPageViewModel); - ActiveDocument = startPageViewModel; + + Messenger.Default.Register(this, message => + { + switch (message.Notification) + { + case "ActiveDocumentChanged": + { + _activeDocument = _avalonDockWorkspaceViewModel.ActiveDocument; + SaveScriptCommand.RaiseCanExecuteChanged(); + SaveScriptAsCommand.RaiseCanExecuteChanged(); + CopyScriptCommand.RaiseCanExecuteChanged(); + CopyBlockCommand.RaiseCanExecuteChanged(); + PasteCommand.RaiseCanExecuteChanged(); + NewScriptCommand.RaiseCanExecuteChanged(); + CloseScriptCommand.RaiseCanExecuteChanged(); + ReplaceColorsCommand.RaiseCanExecuteChanged(); + break; + } + } + }); } public RelayCommand OpenScriptCommand { get; private set; } @@ -90,28 +87,13 @@ namespace Filtration.ViewModels public RelayCommand PasteCommand { get; private set; } public RelayCommand CopyScriptCommand { get; private set; } public RelayCommand NewScriptCommand { get; private set; } - public RelayCommand CloseScriptCommand { get; private set; } + public RelayCommand CloseScriptCommand { get; private set; } public RelayCommand OpenAboutWindowCommand { get; private set; } public RelayCommand ReplaceColorsCommand { get; private set; } - public ObservableCollection OpenDocuments + public IAvalonDockWorkspaceViewModel AvalonDockWorkspaceViewModel { - get { return _openDocuments; } - } - - private List _tools; - - public IEnumerable Tools - { - get - { - if (_tools == null) - { - _tools = new List {_sectionBrowserViewModel, _blockGroupBrowserViewModel}; - } - - return _tools; - } + get { return _avalonDockWorkspaceViewModel; } } public string WindowTitle @@ -124,43 +106,11 @@ namespace Filtration.ViewModels } } - public IDocument ActiveDocument + private bool ActiveDocumentIsScript() { - get { return _activeDocument; } - set - { - _activeDocument = value; - RaisePropertyChanged(); - - if (value.IsScript) - { - _activeScriptViewModel = (IItemFilterScriptViewModel)value; - } - - if (ActiveDocumentChanged != null) - { - ActiveDocumentChanged(this, EventArgs.Empty); - } - - RaisePropertyChanged("NoScriptsOpen"); - SaveScriptCommand.RaiseCanExecuteChanged(); - SaveScriptAsCommand.RaiseCanExecuteChanged(); - } - } - - public IItemFilterScriptViewModel ActiveScriptViewModel - { - get { return _activeScriptViewModel; } + return _activeDocument != null && _activeDocument.IsScript; } - - public event EventHandler ActiveDocumentChanged; - - public bool NoScriptsOpen - { - get { return _activeDocument == null; } - } - private void OnOpenAboutWindowCommand() { var aboutWindow = new AboutWindow(); @@ -182,9 +132,10 @@ namespace Filtration.ViewModels public void LoadScriptFromFile(string path) { + var loadedScript = _persistenceService.LoadItemFilterScript(path); try { - _loadedScript = _persistenceService.LoadItemFilterScript(path); + } catch (Exception e) { @@ -194,10 +145,8 @@ namespace Filtration.ViewModels } var newViewModel = _itemFilterScriptViewModelFactory.Create(); - newViewModel.Initialise(_loadedScript); - _activeScriptViewModel = newViewModel; - OpenDocuments.Add((IDocument)newViewModel); - ActiveDocument = (IDocument)newViewModel; + newViewModel.Initialise(loadedScript); + _avalonDockWorkspaceViewModel.AddDocument(newViewModel); } private void SetItemFilterScriptDirectory() @@ -225,96 +174,34 @@ namespace Filtration.ViewModels private void OnSaveScriptCommand() { - if (!ValidateScript()) return; - - if (string.IsNullOrEmpty(_activeScriptViewModel.Script.FilePath)) - { - OnSaveScriptAsCommand(); - return; - } - - try - { - _persistenceService.SaveItemFilterScript(_activeScriptViewModel.Script); - _activeScriptViewModel.RemoveDirtyFlag(); - } - catch (Exception e) - { - MessageBox.Show(@"Error saving filter file - " + e.Message, @"Save Error", MessageBoxButtons.OK, - MessageBoxIcon.Error); - } - + _avalonDockWorkspaceViewModel.ActiveScriptViewModel.SaveScript(); } private void OnSaveScriptAsCommand() { - if (!ValidateScript()) return; - - var saveDialog = new SaveFileDialog - { - DefaultExt = ".filter", - Filter = @"Filter Files (*.filter)|*.filter|All Files (*.*)|*.*", - InitialDirectory = _persistenceService.ItemFilterScriptDirectory - }; - - var result = saveDialog.ShowDialog(); - - if (result != DialogResult.OK) return; - - var previousFilePath = _activeScriptViewModel.Script.FilePath; - try - { - _activeScriptViewModel.Script.FilePath = saveDialog.FileName; - _persistenceService.SaveItemFilterScript(_activeScriptViewModel.Script); - _activeScriptViewModel.RemoveDirtyFlag(); - } - catch (Exception e) - { - MessageBox.Show(@"Error saving filter file - " + e.Message, @"Save Error", MessageBoxButtons.OK, - MessageBoxIcon.Error); - _activeScriptViewModel.Script.FilePath = previousFilePath; - } + _avalonDockWorkspaceViewModel.ActiveScriptViewModel.SaveScriptAs(); } private void OnReplaceColorsCommand() { - _replaceColorsViewModel.Initialise(_activeScriptViewModel.Script); + _replaceColorsViewModel.Initialise(_avalonDockWorkspaceViewModel.ActiveScriptViewModel.Script); var replaceColorsWindow = new ReplaceColorsWindow {DataContext = _replaceColorsViewModel}; replaceColorsWindow.ShowDialog(); } - private bool ValidateScript() - { - var result = _activeScriptViewModel.Script.Validate(); - - if (result.Count == 0) return true; - - var failures = string.Empty; - - // ReSharper disable once LoopCanBeConvertedToQuery - foreach (string failure in result) - { - failures += failure + Environment.NewLine; - } - - MessageBox.Show(@"The following script validation errors occurred:" + Environment.NewLine + failures, - @"Script Validation Failure", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); - return false; - } - private void OnCopyScriptCommand() { - Clipboard.SetText(_itemFilterScriptTranslator.TranslateItemFilterScriptToString(_activeScriptViewModel.Script)); + Clipboard.SetText(_itemFilterScriptTranslator.TranslateItemFilterScriptToString(_avalonDockWorkspaceViewModel.ActiveScriptViewModel.Script)); } private void OnCopyBlockCommand() { - _activeScriptViewModel.CopyBlock(_activeScriptViewModel.SelectedBlockViewModel); + _avalonDockWorkspaceViewModel.ActiveScriptViewModel.CopyBlock(_avalonDockWorkspaceViewModel.ActiveScriptViewModel.SelectedBlockViewModel); } private void OnPasteCommand() { - _activeScriptViewModel.PasteBlock(_activeScriptViewModel.SelectedBlockViewModel); + _avalonDockWorkspaceViewModel.ActiveScriptViewModel.PasteBlock(_avalonDockWorkspaceViewModel.ActiveScriptViewModel.SelectedBlockViewModel); } private void OnNewScriptCommand() @@ -323,66 +210,12 @@ namespace Filtration.ViewModels var newViewModel = _itemFilterScriptViewModelFactory.Create(); newViewModel.Initialise(newScript); newViewModel.Description = "New Script"; - _activeScriptViewModel = newViewModel; - OpenDocuments.Add((IDocument)newViewModel); - ActiveDocument = (IDocument)newViewModel; + _avalonDockWorkspaceViewModel.AddDocument(newViewModel); } - private void OnCloseScriptCommand(IDocument documentToClose) + private void OnCloseScriptCommand() { - Close(documentToClose); + _avalonDockWorkspaceViewModel.ActiveScriptViewModel.Close(); } - - public void Close(IDocument documentToClose) - { - ActiveDocument = documentToClose; - if (ActiveDocument.IsScript) - { - if (!_activeScriptViewModel.IsDirty) - { - RemoveDocument(ActiveDocument); - } - else - { - var result = MessageBox.Show(@"Want to save your changes to this script?", - @"Filtration", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); - switch (result) - { - case DialogResult.Yes: - { - OnSaveScriptCommand(); - RemoveDocument(ActiveDocument); - break; - } - case DialogResult.No: - { - RemoveDocument(ActiveDocument); - break; - } - case DialogResult.Cancel: - { - return; - } - } - } - } - else - { - RemoveDocument(documentToClose); - } - - } - - private void RemoveDocument(IDocument documentToRemove) - { - if (documentToRemove.IsScript) - { - _sectionBrowserViewModel.ClearDown(); - } - - OpenDocuments.Remove(documentToRemove); - } - - } } diff --git a/Filtration/ViewModels/SectionBrowserViewModel.cs b/Filtration/ViewModels/SectionBrowserViewModel.cs index f564205..754e207 100644 --- a/Filtration/ViewModels/SectionBrowserViewModel.cs +++ b/Filtration/ViewModels/SectionBrowserViewModel.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Windows.Media; using System.Windows.Media.Imaging; namespace Filtration.ViewModels @@ -27,12 +26,6 @@ namespace Filtration.ViewModels public const string ToolContentId = "SectionBrowserTool"; - public override void Initialise(IMainWindowViewModel mainWindowViewModel) - { - base.Initialise(mainWindowViewModel); - MainWindowViewModel.ActiveDocumentChanged += OnActiveDocumentChanged; - } - public IEnumerable SectionBlockViewModels { get { return _sectionBlockViewModels; } @@ -49,19 +42,19 @@ namespace Filtration.ViewModels set { _selectedSectionBlockViewModel = value; - if (MainWindowViewModel.ActiveDocument.IsScript) + if (AvalonDockWorkspaceViewModel.ActiveDocument.IsScript) { - MainWindowViewModel.ActiveScriptViewModel.SectionBrowserSelectedBlockViewModel = value; + AvalonDockWorkspaceViewModel.ActiveScriptViewModel.SectionBrowserSelectedBlockViewModel = value; } RaisePropertyChanged(); } } - private void OnActiveDocumentChanged(object sender, EventArgs e) + protected override void OnActiveDocumentChanged(object sender, EventArgs e) { - if (MainWindowViewModel.ActiveScriptViewModel != null && MainWindowViewModel.ActiveDocument.IsScript) + if (AvalonDockWorkspaceViewModel.ActiveScriptViewModel != null && AvalonDockWorkspaceViewModel.ActiveDocument.IsScript) { - SectionBlockViewModels = MainWindowViewModel.ActiveScriptViewModel.ItemFilterSectionViewModels; + SectionBlockViewModels = AvalonDockWorkspaceViewModel.ActiveScriptViewModel.ItemFilterSectionViewModels; } else { diff --git a/Filtration/ViewModels/StartPageViewModel.cs b/Filtration/ViewModels/StartPageViewModel.cs index 2b6ab9b..fd810da 100644 --- a/Filtration/ViewModels/StartPageViewModel.cs +++ b/Filtration/ViewModels/StartPageViewModel.cs @@ -4,25 +4,19 @@ namespace Filtration.ViewModels { internal interface IStartPageViewModel : IDocument { - void Initialise(IMainWindowViewModel mainWindowViewModel); } internal class StartPageViewModel : PaneViewModel, IStartPageViewModel { - private IMainWindowViewModel _mainWindowViewModel; public StartPageViewModel() { Title = "Start Page"; } - - public void Initialise(IMainWindowViewModel mainWindowViewModel) - { - _mainWindowViewModel = mainWindowViewModel; - } - - public RelayCommand OpenScriptCommand { get { return _mainWindowViewModel.OpenScriptCommand; } } - public RelayCommand NewScriptCommand { get { return _mainWindowViewModel.NewScriptCommand; } } + + // TODO: Replace with MVVMLight ViewModel Messages + public RelayCommand OpenScriptCommand { get { return null; } } + public RelayCommand NewScriptCommand { get { return null; } } public bool IsScript { get { return false; } } } diff --git a/Filtration/ViewModels/ToolViewModel.cs b/Filtration/ViewModels/ToolViewModel.cs index bba616c..b102e1d 100644 --- a/Filtration/ViewModels/ToolViewModel.cs +++ b/Filtration/ViewModels/ToolViewModel.cs @@ -1,8 +1,10 @@ -namespace Filtration.ViewModels +using System; + +namespace Filtration.ViewModels { internal interface IToolViewModel { - void Initialise(IMainWindowViewModel mainWindowViewModel); + void Initialise(IAvalonDockWorkspaceViewModel avalonDockWorkspaceViewModel); } class ToolViewModel : PaneViewModel, IToolViewModel @@ -29,11 +31,16 @@ } } - protected IMainWindowViewModel MainWindowViewModel { get; private set; } + protected IAvalonDockWorkspaceViewModel AvalonDockWorkspaceViewModel{ get; private set; } - public virtual void Initialise(IMainWindowViewModel mainWindowViewModel) + protected virtual void OnActiveDocumentChanged(object sender, EventArgs e) { - MainWindowViewModel = mainWindowViewModel; + } + + public virtual void Initialise(IAvalonDockWorkspaceViewModel avalonDockWorkSpaceViewModel) + { + AvalonDockWorkspaceViewModel = avalonDockWorkSpaceViewModel; + avalonDockWorkSpaceViewModel.ActiveDocumentChanged += OnActiveDocumentChanged; } } } diff --git a/Filtration/Views/AttachedProperties/SelectingItemAttachedProperty.cs b/Filtration/Views/AttachedProperties/SelectingItemAttachedProperty.cs index 4d5e8f6..998a26c 100644 --- a/Filtration/Views/AttachedProperties/SelectingItemAttachedProperty.cs +++ b/Filtration/Views/AttachedProperties/SelectingItemAttachedProperty.cs @@ -1,8 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Windows; +using System.Windows; using System.Windows.Controls; using Filtration.ViewModels; diff --git a/Filtration/Views/AvalonDock/AvalonDockWorkspaceView.xaml b/Filtration/Views/AvalonDock/AvalonDockWorkspaceView.xaml new file mode 100644 index 0000000..bc00bb8 --- /dev/null +++ b/Filtration/Views/AvalonDock/AvalonDockWorkspaceView.xaml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Filtration/Views/AvalonDock/LayoutInitializer.cs b/Filtration/Views/AvalonDock/LayoutInitializer.cs index 9452a37..bb6780c 100644 --- a/Filtration/Views/AvalonDock/LayoutInitializer.cs +++ b/Filtration/Views/AvalonDock/LayoutInitializer.cs @@ -1,5 +1,4 @@ -using System.Linq; -using Xceed.Wpf.AvalonDock.Layout; +using Xceed.Wpf.AvalonDock.Layout; namespace Filtration.Views.AvalonDock { diff --git a/Filtration/Views/BlockGroupBrowserView.xaml.cs b/Filtration/Views/BlockGroupBrowserView.xaml.cs deleted file mode 100644 index cceb3f2..0000000 --- a/Filtration/Views/BlockGroupBrowserView.xaml.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; -using System.Windows.Input; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using System.Windows.Navigation; -using System.Windows.Shapes; - -namespace Filtration.Views -{ - /// - /// Interaction logic for BlockGroupBrowserView.xaml - /// - public partial class BlockGroupBrowserView : UserControl - { - public BlockGroupBrowserView() - { - InitializeComponent(); - } - } -} diff --git a/Filtration/Views/MainWindow.xaml b/Filtration/Views/MainWindow.xaml index 9345e3d..32da4f7 100644 --- a/Filtration/Views/MainWindow.xaml +++ b/Filtration/Views/MainWindow.xaml @@ -6,18 +6,10 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:controls="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro" xmlns:viewModels="clr-namespace:Filtration.ViewModels" - xmlns:avalonDock="http://schemas.xceed.com/wpf/xaml/avalondock" - xmlns:converters="clr-namespace:Filtration.Converters" - xmlns:views="clr-namespace:Filtration.Views" xmlns:viewsAvalonDock="clr-namespace:Filtration.Views.AvalonDock" mc:Ignorable="d" d:DataContext="{d:DesignInstance Type=viewModels:MainWindowViewModel}" Title="{Binding WindowTitle}" Height="707" Width="930" BorderThickness="1" BorderBrush="Black"> - - - - - @@ -25,7 +17,7 @@ - + @@ -49,71 +41,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/Filtration/Views/SectionBrowserView.xaml.cs b/Filtration/Views/SectionBrowserView.xaml.cs deleted file mode 100644 index 092469e..0000000 --- a/Filtration/Views/SectionBrowserView.xaml.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; -using System.Windows.Input; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using System.Windows.Navigation; -using System.Windows.Shapes; - -namespace Filtration.Views -{ - /// - /// Interaction logic for SectionBrowserView.xaml - /// - public partial class SectionBrowserView : UserControl - { - public SectionBrowserView() - { - InitializeComponent(); - } - } -} diff --git a/Filtration/Views/StartPageView.xaml.cs b/Filtration/Views/StartPageView.xaml.cs index b5b2ba0..1dee172 100644 --- a/Filtration/Views/StartPageView.xaml.cs +++ b/Filtration/Views/StartPageView.xaml.cs @@ -1,24 +1,6 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; -using System.Windows.Input; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using System.Windows.Navigation; -using System.Windows.Shapes; - -namespace Filtration.Views +namespace Filtration.Views { - /// - /// Interaction logic for StartPageView.xaml - /// - public partial class StartPageView : UserControl + public partial class StartPageView { public StartPageView() { diff --git a/Filtration/Views/BlockGroupBrowserView.xaml b/Filtration/Views/ToolPanes/BlockGroupBrowserView.xaml similarity index 94% rename from Filtration/Views/BlockGroupBrowserView.xaml rename to Filtration/Views/ToolPanes/BlockGroupBrowserView.xaml index 6d33536..1085365 100644 --- a/Filtration/Views/BlockGroupBrowserView.xaml +++ b/Filtration/Views/ToolPanes/BlockGroupBrowserView.xaml @@ -1,4 +1,4 @@ -() .LifeStyle.Singleton); + container.Register( + Component.For() + .ImplementedBy() + .LifeStyle.Singleton); + container.Register( Component.For() .ImplementedBy()