From 69ce542c1a5aecfd8ff395a3438ae3d287455dd2 Mon Sep 17 00:00:00 2001 From: azakhi Date: Tue, 4 Sep 2018 14:18:11 +0300 Subject: [PATCH] Improve pasting to support different copy sources --- .../PasteMultipleBlocksCommand.cs | 49 +++++++++++++++ .../Filtration.ObjectModel.csproj | 2 +- .../ThemeEditor/ThemeComponentCollection.cs | 5 ++ .../Services/IItemFilterScriptTranslator.cs | 1 + .../Services/ItemFilterScriptTranslator.cs | 13 +++- .../ViewModels/ItemFilterScriptViewModel.cs | 61 +++++++------------ .../ToolPanes/BlockGroupBrowserViewModel.cs | 5 ++ 7 files changed, 95 insertions(+), 41 deletions(-) create mode 100644 Filtration.ObjectModel/Commands/ItemFilterScript/PasteMultipleBlocksCommand.cs diff --git a/Filtration.ObjectModel/Commands/ItemFilterScript/PasteMultipleBlocksCommand.cs b/Filtration.ObjectModel/Commands/ItemFilterScript/PasteMultipleBlocksCommand.cs new file mode 100644 index 0000000..d563e02 --- /dev/null +++ b/Filtration.ObjectModel/Commands/ItemFilterScript/PasteMultipleBlocksCommand.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; + +namespace Filtration.ObjectModel.Commands.ItemFilterScript +{ + public class PasteMultipleBlocksCommand : IUndoableCommand + { + private readonly IItemFilterScript _itemFilterScript; + private readonly List _pastedItemFilterBlocks; + private readonly IItemFilterBlockBase _addAfterItemFilterBlock; + + public PasteMultipleBlocksCommand(IItemFilterScript itemFilterScript, List pastedItemFilterBlocks, IItemFilterBlockBase addAfterItemFilterBlock) + { + _itemFilterScript = itemFilterScript; + _pastedItemFilterBlocks = pastedItemFilterBlocks; + _addAfterItemFilterBlock = addAfterItemFilterBlock; + } + + public void Execute() + { + if (_addAfterItemFilterBlock != null) + { + var lastAddedBlock = _addAfterItemFilterBlock; + foreach(var block in _pastedItemFilterBlocks) + { + _itemFilterScript.ItemFilterBlocks.Insert(_itemFilterScript.ItemFilterBlocks.IndexOf(lastAddedBlock) + 1, block); + lastAddedBlock = block; + } + } + else + { + foreach (var block in _pastedItemFilterBlocks) + { + _itemFilterScript.ItemFilterBlocks.Add(block); + } + } + } + + public void Undo() + { + foreach (var block in _pastedItemFilterBlocks) + { + _itemFilterScript.ItemFilterBlocks.Remove(block); + } + } + + public void Redo() => Execute(); + } +} \ No newline at end of file diff --git a/Filtration.ObjectModel/Filtration.ObjectModel.csproj b/Filtration.ObjectModel/Filtration.ObjectModel.csproj index 22514bc..9600d14 100644 --- a/Filtration.ObjectModel/Filtration.ObjectModel.csproj +++ b/Filtration.ObjectModel/Filtration.ObjectModel.csproj @@ -117,7 +117,7 @@ - + diff --git a/Filtration.ObjectModel/ThemeEditor/ThemeComponentCollection.cs b/Filtration.ObjectModel/ThemeEditor/ThemeComponentCollection.cs index ef41379..0069eaa 100644 --- a/Filtration.ObjectModel/ThemeEditor/ThemeComponentCollection.cs +++ b/Filtration.ObjectModel/ThemeEditor/ThemeComponentCollection.cs @@ -93,5 +93,10 @@ namespace Filtration.ObjectModel.ThemeEditor Items.Count(c => c.ComponentName == componentName && c.ComponentType == componentType); return componentCount > 0; } + + public bool ComponentExists(ThemeComponent themeComponent) + { + return ComponentExists(themeComponent.ComponentType, themeComponent.ComponentName); + } } } diff --git a/Filtration.Parser.Interface/Services/IItemFilterScriptTranslator.cs b/Filtration.Parser.Interface/Services/IItemFilterScriptTranslator.cs index 06c9a93..0bb7e1e 100644 --- a/Filtration.Parser.Interface/Services/IItemFilterScriptTranslator.cs +++ b/Filtration.Parser.Interface/Services/IItemFilterScriptTranslator.cs @@ -5,6 +5,7 @@ namespace Filtration.Parser.Interface.Services public interface IItemFilterScriptTranslator { IItemFilterScript TranslateStringToItemFilterScript(string inputString); + IItemFilterScript TranslatePastedStringToItemFilterScript(string inputString, bool blockGroupsEnabled); string TranslateItemFilterScriptToString(IItemFilterScript script); } } \ No newline at end of file diff --git a/Filtration.Parser/Services/ItemFilterScriptTranslator.cs b/Filtration.Parser/Services/ItemFilterScriptTranslator.cs index e386963..c125432 100644 --- a/Filtration.Parser/Services/ItemFilterScriptTranslator.cs +++ b/Filtration.Parser/Services/ItemFilterScriptTranslator.cs @@ -210,7 +210,18 @@ namespace Filtration.Parser.Services _blockGroupHierarchyBuilder.Cleanup(); return script; } - + + public IItemFilterScript TranslatePastedStringToItemFilterScript(string inputString, bool blockGroupsEnabled) + { + //Remove old disabled tags to prevent messagebox on paste + inputString = Regex.Replace(inputString, @"#Disabled\sBlock\s(Start|End).*?\n", ""); + inputString = (inputString.EndsWith("\n#Disabled Block End")) ? inputString.Substring(0, inputString.Length - 19) : inputString; + + inputString = (blockGroupsEnabled ? "# EnableBlockGroups" : "#") + Environment.NewLine + Environment.NewLine + inputString; + + return TranslateStringToItemFilterScript(inputString); + } + private static LinkedList IdentifyBlockBoundaries(string inputString, List inBlock) { var blockBoundaries = new LinkedList(); diff --git a/Filtration/ViewModels/ItemFilterScriptViewModel.cs b/Filtration/ViewModels/ItemFilterScriptViewModel.cs index 67db330..6fae822 100644 --- a/Filtration/ViewModels/ItemFilterScriptViewModel.cs +++ b/Filtration/ViewModels/ItemFilterScriptViewModel.cs @@ -93,6 +93,7 @@ namespace Filtration.ViewModels private readonly IItemFilterBlockBaseViewModelFactory _itemFilterBlockBaseViewModelFactory; private readonly IItemFilterBlockTranslator _blockTranslator; + private readonly IItemFilterScriptTranslator _scriptTranslator; private readonly IAvalonDockWorkspaceViewModel _avalonDockWorkspaceViewModel; private readonly IItemFilterPersistenceService _persistenceService; private readonly IMessageBoxService _messageBoxService; @@ -110,6 +111,7 @@ namespace Filtration.ViewModels public ItemFilterScriptViewModel(IItemFilterBlockBaseViewModelFactory itemFilterBlockBaseViewModelFactory, IItemFilterBlockTranslator blockTranslator, + IItemFilterScriptTranslator scriptTranslator, IAvalonDockWorkspaceViewModel avalonDockWorkspaceViewModel, IItemFilterPersistenceService persistenceService, IMessageBoxService messageBoxService, @@ -118,6 +120,7 @@ namespace Filtration.ViewModels { _itemFilterBlockBaseViewModelFactory = itemFilterBlockBaseViewModelFactory; _blockTranslator = blockTranslator; + _scriptTranslator = scriptTranslator; _avalonDockWorkspaceViewModel = avalonDockWorkspaceViewModel; _avalonDockWorkspaceViewModel.ActiveDocumentChanged += OnActiveDocumentChanged; _persistenceService = persistenceService; @@ -786,7 +789,7 @@ namespace Filtration.ViewModels var copyText = _blockTranslator.TranslateItemFilterBlockBaseToString(targetCommentBlockViewModel.BaseBlock); while (sectionStart < ItemFilterBlockViewModels.Count && ItemFilterBlockViewModels[sectionStart] as IItemFilterCommentBlockViewModel == null) { - copyText += Environment.NewLine + "##CopySection##" + Environment.NewLine + _blockTranslator.TranslateItemFilterBlockBaseToString(ItemFilterBlockViewModels[sectionStart].BaseBlock); + copyText += Environment.NewLine + Environment.NewLine + _blockTranslator.TranslateItemFilterBlockBaseToString(ItemFilterBlockViewModels[sectionStart].BaseBlock); sectionStart++; } @@ -875,50 +878,30 @@ namespace Filtration.ViewModels var clipboardText = _clipboardService.GetClipboardText(); if (string.IsNullOrEmpty(clipboardText)) return; - string[] blockTexts = clipboardText.Split(new string[] { Environment.NewLine + "##CopySection##" + Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); + IItemFilterScript pastedScript = _scriptTranslator.TranslatePastedStringToItemFilterScript(clipboardText, + Script.ItemFilterScriptSettings.BlockGroupsEnabled); - List blocksToPaste = new List(); - foreach (var curBlock in blockTexts) + foreach (var themeComponent in pastedScript.ThemeComponents.Where(item => !Script.ThemeComponents.ComponentExists(item))) { - IItemFilterBlockBase translatedBlock; - var preparedString = PrepareBlockForParsing(curBlock); - var isCommentBlock = true; - string[] textLines = preparedString.Split(new[] { Environment.NewLine }, StringSplitOptions.None); - foreach(var line in textLines) - { - if(!line.StartsWith(@"#")) - { - isCommentBlock = false; - break; - } - } - - if (isCommentBlock) - { - translatedBlock = _blockTranslator.TranslateStringToItemFilterCommentBlock(preparedString, Script, curBlock); - } - else - { - translatedBlock = _blockTranslator.TranslateStringToItemFilterBlock(preparedString, Script, curBlock, true); - } - - if (translatedBlock == null) continue; - - blocksToPaste.Add(translatedBlock); + Script.ThemeComponents.Add(themeComponent); } - if (blocksToPaste.Count < 1) - return; - - var blockIndex = ItemFilterBlockViewModels.IndexOf(targetBlockViewModelBase) + 1; - _scriptCommandManager.ExecuteCommand(new PasteSectionCommand(Script, blocksToPaste, targetBlockViewModelBase.BaseBlock)); - SelectedBlockViewModel = ItemFilterBlockViewModels[blockIndex]; - RaisePropertyChanged("SelectedBlockViewModel"); - var firstBlockAsComment = blocksToPaste[0] as IItemFilterCommentBlock; - if (firstBlockAsComment != null) + foreach (var blockGroup in pastedScript.ItemFilterBlockGroups.First().ChildGroups) { - OnCollapseSectionCommand(); + Script.ItemFilterBlockGroups.First().ChildGroups.Add(blockGroup); } + + _scriptCommandManager.ExecuteCommand(new PasteMultipleBlocksCommand(Script, pastedScript.ItemFilterBlocks.ToList(), + targetBlockViewModelBase.BaseBlock)); + + Messenger.Default.Send(new NotificationMessage(ShowAdvanced, "BlockGroupsChanged")); + var lastBlockIndex = ItemFilterBlockViewModels.IndexOf(targetBlockViewModelBase) + pastedScript.ItemFilterBlocks.Count; + var lastBlock = ItemFilterBlockViewModels[lastBlockIndex]; + if(ViewItemFilterBlockViewModels.Contains(lastBlock)) + { + SelectedBlockViewModel = lastBlock; + } + RaisePropertyChanged(nameof(SelectedBlockViewModel)); } catch (Exception e) { diff --git a/Filtration/ViewModels/ToolPanes/BlockGroupBrowserViewModel.cs b/Filtration/ViewModels/ToolPanes/BlockGroupBrowserViewModel.cs index f205a39..bec4cf8 100644 --- a/Filtration/ViewModels/ToolPanes/BlockGroupBrowserViewModel.cs +++ b/Filtration/ViewModels/ToolPanes/BlockGroupBrowserViewModel.cs @@ -40,6 +40,11 @@ namespace Filtration.ViewModels.ToolPanes OnShowAdvancedToggled(message.Content); break; } + case "BlockGroupsChanged": + { + BlockGroupViewModels = RebuildBlockGroupViewModels(message.Content); + break; + } } });