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">
-
-
-
-
-
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()