diff --git a/Filtration/Filtration.csproj b/Filtration/Filtration.csproj index 6383915..27dc850 100644 --- a/Filtration/Filtration.csproj +++ b/Filtration/Filtration.csproj @@ -145,6 +145,7 @@ + diff --git a/Filtration/Services/ClipboardService.cs b/Filtration/Services/ClipboardService.cs new file mode 100644 index 0000000..73b3435 --- /dev/null +++ b/Filtration/Services/ClipboardService.cs @@ -0,0 +1,43 @@ +using System; +using System.Threading; +using System.Windows; +using NLog; + +namespace Filtration.Services +{ + internal interface IClipboardService + { + void SetClipboardText(string inputText); + string GetClipboardText(); + } + + internal class ClipboardService : IClipboardService + { + private static readonly Logger _logger = LogManager.GetCurrentClassLogger(); + + public void SetClipboardText(string inputText) + { + for (var i = 0; i < 10; i++) + { + try + { + Clipboard.SetText(inputText); + return; + } + catch (Exception e) + { + _logger.Error(e); + } + + Thread.Sleep(10); + } + + throw new Exception("Failed to copy to clipboard"); + } + + public string GetClipboardText() + { + return Clipboard.GetText(); + } + } +} diff --git a/Filtration/ViewModels/ItemFilterScriptViewModel.cs b/Filtration/ViewModels/ItemFilterScriptViewModel.cs index b6b49cc..707b065 100644 --- a/Filtration/ViewModels/ItemFilterScriptViewModel.cs +++ b/Filtration/ViewModels/ItemFilterScriptViewModel.cs @@ -8,7 +8,6 @@ using System.Windows; 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; @@ -19,7 +18,6 @@ using Filtration.Translators; using GalaSoft.MvvmLight.CommandWpf; using GalaSoft.MvvmLight.Messaging; using NLog; -using Clipboard = System.Windows.Clipboard; namespace Filtration.ViewModels { @@ -76,6 +74,7 @@ namespace Filtration.ViewModels private readonly IAvalonDockWorkspaceViewModel _avalonDockWorkspaceViewModel; private readonly IItemFilterPersistenceService _persistenceService; private readonly IMessageBoxService _messageBoxService; + private readonly IClipboardService _clipboardService; private bool _isDirty; private IItemFilterBlockViewModel _selectedBlockViewModel; @@ -88,7 +87,8 @@ namespace Filtration.ViewModels IItemFilterBlockTranslator blockTranslator, IAvalonDockWorkspaceViewModel avalonDockWorkspaceViewModel, IItemFilterPersistenceService persistenceService, - IMessageBoxService messageBoxService) + IMessageBoxService messageBoxService, + IClipboardService clipboardService) { _itemFilterBlockViewModelFactory = itemFilterBlockViewModelFactory; _blockTranslator = blockTranslator; @@ -96,6 +96,7 @@ namespace Filtration.ViewModels _avalonDockWorkspaceViewModel.ActiveDocumentChanged += OnActiveDocumentChanged; _persistenceService = persistenceService; _messageBoxService = messageBoxService; + _clipboardService = clipboardService; _itemFilterBlockViewModels = new ObservableCollection(); ToggleShowAdvancedCommand = new RelayCommand(OnToggleShowAdvancedCommand); @@ -544,7 +545,16 @@ namespace Filtration.ViewModels public void CopyBlock(IItemFilterBlockViewModel targetBlockViewModel) { - Clipboard.SetText(_blockTranslator.TranslateItemFilterBlockToString(SelectedBlockViewModel.Block)); + try + { + _clipboardService.SetClipboardText( + _blockTranslator.TranslateItemFilterBlockToString(SelectedBlockViewModel.Block)); + } + catch + { + _messageBoxService.Show("Clipboard Error", "Failed to access the clipboard, copy command not completed.", + MessageBoxButton.OK, MessageBoxImage.Error); + } } private void OnCopyBlockStyleCommand() @@ -564,8 +574,15 @@ namespace Filtration.ViewModels } outputText += blockItem.OutputText; } - - Clipboard.SetText(outputText); + try + { + _clipboardService.SetClipboardText(outputText); + } + catch + { + _messageBoxService.Show("Clipboard Error", "Failed to access the clipboard, copy command not completed.", + MessageBoxButton.OK, MessageBoxImage.Error); + } } private void OnPasteBlockStyleCommand() @@ -575,7 +592,7 @@ namespace Filtration.ViewModels public void PasteBlockStyle(IItemFilterBlockViewModel targetBlockViewModel) { - var clipboardText = Clipboard.GetText(); + var clipboardText = _clipboardService.GetClipboardText(); if (string.IsNullOrEmpty(clipboardText)) { return; @@ -594,8 +611,8 @@ namespace Filtration.ViewModels { try { - var clipboardText = Clipboard.GetText(); - if (clipboardText.IsNullOrEmpty()) return; + var clipboardText = _clipboardService.GetClipboardText(); + if (string.IsNullOrEmpty(clipboardText)) return; var translatedBlock = _blockTranslator.TranslateStringToItemFilterBlock(clipboardText, Script.ThemeComponents); if (translatedBlock == null) return; diff --git a/Filtration/WindsorInstallers/ServicesInstaller.cs b/Filtration/WindsorInstallers/ServicesInstaller.cs index 107ffd4..ec3b2e4 100644 --- a/Filtration/WindsorInstallers/ServicesInstaller.cs +++ b/Filtration/WindsorInstallers/ServicesInstaller.cs @@ -34,6 +34,11 @@ namespace Filtration.WindsorInstallers Component.For() .ImplementedBy() .LifeStyle.Singleton); + + container.Register( + Component.For() + .ImplementedBy() + .LifeStyle.Singleton); } } }