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);
}
}
}