From fcea6612996b66a4232305bdf5e2722f53d1918c Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Mon, 6 Sep 2010 19:10:33 +0200 Subject: [PATCH] do snippet insertion in one UndoGroup --- ...rideEqualsGetHashCodeMethodsRefactoring.cs | 56 ++++++++++--------- .../Src/OverrideToStringMethodRefactoring.cs | 56 ++++++++++--------- 2 files changed, 58 insertions(+), 54 deletions(-) diff --git a/src/AddIns/Misc/SharpRefactoring/Project/Src/OverrideEqualsGetHashCodeMethodsRefactoring.cs b/src/AddIns/Misc/SharpRefactoring/Project/Src/OverrideEqualsGetHashCodeMethodsRefactoring.cs index c2ccf6d5ea..3b77ad2b81 100644 --- a/src/AddIns/Misc/SharpRefactoring/Project/Src/OverrideEqualsGetHashCodeMethodsRefactoring.cs +++ b/src/AddIns/Misc/SharpRefactoring/Project/Src/OverrideEqualsGetHashCodeMethodsRefactoring.cs @@ -46,33 +46,35 @@ namespace SharpRefactoring if (current == null) return; - ITextAnchor startAnchor = textEditor.Document.CreateAnchor(textEditor.Caret.Offset); - startAnchor.MovementType = AnchorMovementType.BeforeInsertion; - - ITextAnchor endAnchor = textEditor.Document.CreateAnchor(textEditor.Caret.Offset); - endAnchor.MovementType = AnchorMovementType.AfterInsertion; - - MethodDeclaration member = (MethodDeclaration)generator.GetOverridingMethod(completionItem.Member, finder); - - string indent = DocumentUtilitites.GetWhitespaceBefore(textEditor.Document, textEditor.Caret.Offset); - string codeForBaseCall = generator.GenerateCode(member.Body.Children.OfType().First(), ""); - string code = generator.GenerateCode(member, indent); - int marker = code.IndexOf(codeForBaseCall); - - textEditor.Document.Insert(startAnchor.Offset, code.Substring(0, marker).TrimStart()); - - ITextAnchor insertionPos = textEditor.Document.CreateAnchor(endAnchor.Offset); - insertionPos.MovementType = AnchorMovementType.BeforeInsertion; - - InsertionContext insertionContext = new InsertionContext(textEditor.GetService(typeof(TextArea)) as TextArea, startAnchor.Offset); - - AbstractInlineRefactorDialog dialog = new OverrideEqualsGetHashCodeMethodsDialog(insertionContext, textEditor, startAnchor, endAnchor, insertionPos, current, completionItem.Member as IMethod, codeForBaseCall.Trim()); - dialog.Element = uiService.CreateInlineUIElement(insertionPos, dialog); - - textEditor.Document.InsertNormalized(endAnchor.Offset, Environment.NewLine + code.Substring(marker + codeForBaseCall.Length)); - - insertionContext.RegisterActiveElement(new InlineRefactorSnippetElement(cxt => null, ""), dialog); - insertionContext.RaiseInsertionCompleted(EventArgs.Empty); + using (textEditor.Document.OpenUndoGroup()) { + ITextAnchor startAnchor = textEditor.Document.CreateAnchor(textEditor.Caret.Offset); + startAnchor.MovementType = AnchorMovementType.BeforeInsertion; + + ITextAnchor endAnchor = textEditor.Document.CreateAnchor(textEditor.Caret.Offset); + endAnchor.MovementType = AnchorMovementType.AfterInsertion; + + MethodDeclaration member = (MethodDeclaration)generator.GetOverridingMethod(completionItem.Member, finder); + + string indent = DocumentUtilitites.GetWhitespaceBefore(textEditor.Document, textEditor.Caret.Offset); + string codeForBaseCall = generator.GenerateCode(member.Body.Children.OfType().First(), ""); + string code = generator.GenerateCode(member, indent); + int marker = code.IndexOf(codeForBaseCall); + + textEditor.Document.Insert(startAnchor.Offset, code.Substring(0, marker).TrimStart()); + + ITextAnchor insertionPos = textEditor.Document.CreateAnchor(endAnchor.Offset); + insertionPos.MovementType = AnchorMovementType.BeforeInsertion; + + InsertionContext insertionContext = new InsertionContext(textEditor.GetService(typeof(TextArea)) as TextArea, startAnchor.Offset); + + AbstractInlineRefactorDialog dialog = new OverrideEqualsGetHashCodeMethodsDialog(insertionContext, textEditor, startAnchor, endAnchor, insertionPos, current, completionItem.Member as IMethod, codeForBaseCall.Trim()); + dialog.Element = uiService.CreateInlineUIElement(insertionPos, dialog); + + textEditor.Document.InsertNormalized(endAnchor.Offset, Environment.NewLine + code.Substring(marker + codeForBaseCall.Length)); + + insertionContext.RegisterActiveElement(new InlineRefactorSnippetElement(cxt => null, ""), dialog); + insertionContext.RaiseInsertionCompleted(EventArgs.Empty); + } } public bool Handles(ICompletionItem item) diff --git a/src/AddIns/Misc/SharpRefactoring/Project/Src/OverrideToStringMethodRefactoring.cs b/src/AddIns/Misc/SharpRefactoring/Project/Src/OverrideToStringMethodRefactoring.cs index c8dc2718c2..31fda5f0a9 100644 --- a/src/AddIns/Misc/SharpRefactoring/Project/Src/OverrideToStringMethodRefactoring.cs +++ b/src/AddIns/Misc/SharpRefactoring/Project/Src/OverrideToStringMethodRefactoring.cs @@ -46,33 +46,35 @@ namespace SharpRefactoring if (current == null) return; - ITextAnchor endAnchor = textEditor.Document.CreateAnchor(textEditor.Caret.Offset); - endAnchor.MovementType = AnchorMovementType.AfterInsertion; - - ITextAnchor startAnchor = textEditor.Document.CreateAnchor(textEditor.Caret.Offset); - startAnchor.MovementType = AnchorMovementType.BeforeInsertion; - - MethodDeclaration member = (MethodDeclaration)generator.GetOverridingMethod(completionItem.Member, finder); - - string indent = DocumentUtilitites.GetWhitespaceBefore(textEditor.Document, textEditor.Caret.Offset); - string codeForBaseCall = generator.GenerateCode(member.Body.Children.OfType().First(), ""); - string code = generator.GenerateCode(member, indent); - int marker = code.IndexOf(codeForBaseCall); - - textEditor.Document.Insert(startAnchor.Offset, code.Substring(0, marker).TrimStart()); - - ITextAnchor insertionPos = textEditor.Document.CreateAnchor(endAnchor.Offset); - insertionPos.MovementType = AnchorMovementType.BeforeInsertion; - - InsertionContext insertionContext = new InsertionContext(textEditor.GetService(typeof(TextArea)) as TextArea, startAnchor.Offset); - - AbstractInlineRefactorDialog dialog = new OverrideToStringMethodDialog(insertionContext, textEditor, startAnchor, insertionPos, current.Fields); - dialog.Element = uiService.CreateInlineUIElement(insertionPos, dialog); - - textEditor.Document.InsertNormalized(endAnchor.Offset, Environment.NewLine + code.Substring(marker + codeForBaseCall.Length)); - - insertionContext.RegisterActiveElement(new InlineRefactorSnippetElement(cxt => null, ""), dialog); - insertionContext.RaiseInsertionCompleted(EventArgs.Empty); + using (textEditor.Document.OpenUndoGroup()) { + ITextAnchor endAnchor = textEditor.Document.CreateAnchor(textEditor.Caret.Offset); + endAnchor.MovementType = AnchorMovementType.AfterInsertion; + + ITextAnchor startAnchor = textEditor.Document.CreateAnchor(textEditor.Caret.Offset); + startAnchor.MovementType = AnchorMovementType.BeforeInsertion; + + MethodDeclaration member = (MethodDeclaration)generator.GetOverridingMethod(completionItem.Member, finder); + + string indent = DocumentUtilitites.GetWhitespaceBefore(textEditor.Document, textEditor.Caret.Offset); + string codeForBaseCall = generator.GenerateCode(member.Body.Children.OfType().First(), ""); + string code = generator.GenerateCode(member, indent); + int marker = code.IndexOf(codeForBaseCall); + + textEditor.Document.Insert(startAnchor.Offset, code.Substring(0, marker).TrimStart()); + + ITextAnchor insertionPos = textEditor.Document.CreateAnchor(endAnchor.Offset); + insertionPos.MovementType = AnchorMovementType.BeforeInsertion; + + InsertionContext insertionContext = new InsertionContext(textEditor.GetService(typeof(TextArea)) as TextArea, startAnchor.Offset); + + AbstractInlineRefactorDialog dialog = new OverrideToStringMethodDialog(insertionContext, textEditor, startAnchor, insertionPos, current.Fields, codeForBaseCall.Trim()); + dialog.Element = uiService.CreateInlineUIElement(insertionPos, dialog); + + textEditor.Document.InsertNormalized(endAnchor.Offset, Environment.NewLine + code.Substring(marker + codeForBaseCall.Length)); + + insertionContext.RegisterActiveElement(new InlineRefactorSnippetElement(cxt => null, ""), dialog); + insertionContext.RaiseInsertionCompleted(EventArgs.Empty); + } } public bool Handles(ICompletionItem item)