From 80229423ffef0a4d881c78486ddaeb8f7693b2fd Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Wed, 1 Sep 2010 20:51:10 +0200 Subject: [PATCH] enter and escape now work properly in inline refactoring dialogs --- .../Src/Gui/AbstractInlineRefactorDialog.cs | 18 +++++++++++++++--- .../Project/Src/Gui/InsertCtorDialog.xaml.cs | 14 +++++++------- .../Snippets/IActiveElement.cs | 2 +- .../Snippets/InsertionContext.cs | 2 +- .../Snippets/SnippetAnchorElement.cs | 12 +++++------- .../Snippets/SnippetBoundElement.cs | 2 +- .../Snippets/SnippetReplaceableTextElement.cs | 2 +- 7 files changed, 31 insertions(+), 21 deletions(-) diff --git a/src/AddIns/Misc/SharpRefactoring/Project/Src/Gui/AbstractInlineRefactorDialog.cs b/src/AddIns/Misc/SharpRefactoring/Project/Src/Gui/AbstractInlineRefactorDialog.cs index 3aef2455b6..8093139d80 100644 --- a/src/AddIns/Misc/SharpRefactoring/Project/Src/Gui/AbstractInlineRefactorDialog.cs +++ b/src/AddIns/Misc/SharpRefactoring/Project/Src/Gui/AbstractInlineRefactorDialog.cs @@ -57,7 +57,10 @@ namespace SharpRefactoring.Gui LanguageProperties language = parseInfo.CompilationUnit.Language; IClass current = parseInfo.CompilationUnit.GetInnermostClass(editor.Caret.Line, editor.Caret.Column); - editor.Document.Insert(anchor.Offset, GenerateCode(language, current) ?? ""); + // Generate code could modify the document. + // So read anchor.Offset after code generation. + string code = GenerateCode(language, current) ?? ""; + editor.Document.Insert(anchor.Offset, code); } Deactivate(); @@ -95,17 +98,26 @@ namespace SharpRefactoring.Gui { } - void IActiveElement.Deactivate() + void IActiveElement.Deactivate(SnippetEventArgs e) { + if (e.Reason == DeactivateReason.ReturnPressed) + OKButtonClick(null, null); + Deactivate(); } + + bool deactivated; void Deactivate() { if (Element == null) throw new InvalidOperationException("no IInlineUIElement set!"); - + if (deactivated) + return; + + deactivated = true; Element.Remove(); + context.Deactivate(null); } } } diff --git a/src/AddIns/Misc/SharpRefactoring/Project/Src/Gui/InsertCtorDialog.xaml.cs b/src/AddIns/Misc/SharpRefactoring/Project/Src/Gui/InsertCtorDialog.xaml.cs index 6572b95cfb..6aaca1da63 100644 --- a/src/AddIns/Misc/SharpRefactoring/Project/Src/Gui/InsertCtorDialog.xaml.cs +++ b/src/AddIns/Misc/SharpRefactoring/Project/Src/Gui/InsertCtorDialog.xaml.cs @@ -58,7 +58,7 @@ namespace SharpRefactoring.Gui { var line = editor.Document.GetLineForOffset(editor.Caret.Offset); - string indent = DocumentUtilitites.GetWhitespaceAfter(editor.Document, line.Offset); + string indent = DocumentUtilitites.GetWhitespaceAfter(editor.Document, line.Offset) + "\t"; var filtered = paramList.Where(p => p.IsSelected).OrderBy(p => p.Index).ToList(); @@ -103,11 +103,11 @@ namespace SharpRefactoring.Gui foreach (CtorParamWrapper w in filtered) block.AddChild(new ExpressionStatement(new AssignmentExpression(new MemberReferenceExpression(new ThisReferenceExpression(), w.MemberName), AssignmentOperatorType.Assign, new IdentifierExpression(w.ParameterName)))); - AnchorSnippetElement parameterList = context.ActiveElements + AnchorElement parameterList = context.ActiveElements .FirstOrDefault( - item => item is AnchorSnippetElement && - (item as AnchorSnippetElement).Name.Equals("parameterList", StringComparison.OrdinalIgnoreCase) - ) as AnchorSnippetElement; + item => item is AnchorElement && + (item as AnchorElement).Name.Equals("parameterList", StringComparison.OrdinalIgnoreCase) + ) as AnchorElement; if (parameterList != null) { StringBuilder pList = new StringBuilder(); @@ -122,13 +122,13 @@ namespace SharpRefactoring.Gui pList.Append(language.CodeGenerator.GenerateCode(parameters[i], "")); } -// parameterList.Text = pList.ToString(); + parameterList.Text = pList.ToString(); } StringBuilder builder = new StringBuilder(); foreach (var element in block.Children.OfType()) { - builder.Append(language.CodeGenerator.GenerateCode(element, "")); + builder.Append(language.CodeGenerator.GenerateCode(element, indent)); } return builder.ToString().Trim(); diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Snippets/IActiveElement.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Snippets/IActiveElement.cs index a7c388f876..9c88dcb170 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Snippets/IActiveElement.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Snippets/IActiveElement.cs @@ -24,7 +24,7 @@ namespace ICSharpCode.AvalonEdit.Snippets /// /// Called when the interactive mode is deactivated. /// - void Deactivate(); + void Deactivate(SnippetEventArgs e); /// /// Gets whether this element is editable (the user will be able to select it with Tab). diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Snippets/InsertionContext.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Snippets/InsertionContext.cs index 5db7e9d3c9..984f03a4dc 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Snippets/InsertionContext.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Snippets/InsertionContext.cs @@ -237,7 +237,7 @@ namespace ICSharpCode.AvalonEdit.Snippets currentStatus = Status.RaisingDeactivated; TextArea.PopStackedInputHandler(myInputHandler); foreach (IActiveElement element in registeredElements) { - element.Deactivate(); + element.Deactivate(e); } if (Deactivated != null) Deactivated(this, e); diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Snippets/SnippetAnchorElement.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Snippets/SnippetAnchorElement.cs index df54f4db77..111e0bfcab 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Snippets/SnippetAnchorElement.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Snippets/SnippetAnchorElement.cs @@ -24,14 +24,12 @@ namespace ICSharpCode.AvalonEdit.Snippets public override void Insert(InsertionContext context) { int start = context.InsertionPosition; - context.InsertText(""); - int end = context.InsertionPosition; - AnchorSegment segment = new AnchorSegment(context.Document, start, end - start); - context.RegisterActiveElement(this, new AnchorSnippetElement(segment, "", Name, context)); + AnchorSegment segment = new AnchorSegment(context.Document, start, 0); + context.RegisterActiveElement(this, new AnchorElement(segment, "", Name, context)); } } - public sealed class AnchorSnippetElement : IActiveElement + public sealed class AnchorElement : IActiveElement { public bool IsEditable { get { return false; } @@ -44,7 +42,7 @@ namespace ICSharpCode.AvalonEdit.Snippets get { return segment; } } - public AnchorSnippetElement(AnchorSegment segment, string text, string name, InsertionContext context) + public AnchorElement(AnchorSegment segment, string text, string name, InsertionContext context) { this.segment = segment; this.context = context; @@ -71,7 +69,7 @@ namespace ICSharpCode.AvalonEdit.Snippets { } - public void Deactivate() + public void Deactivate(SnippetEventArgs e) { } } diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Snippets/SnippetBoundElement.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Snippets/SnippetBoundElement.cs index 11b1802e1a..2178cf5b76 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Snippets/SnippetBoundElement.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Snippets/SnippetBoundElement.cs @@ -103,7 +103,7 @@ namespace ICSharpCode.AvalonEdit.Snippets } } - public void Deactivate() + public void Deactivate(SnippetEventArgs e) { } diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Snippets/SnippetReplaceableTextElement.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Snippets/SnippetReplaceableTextElement.cs index eaa8abb0cb..d1c7d7c19c 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Snippets/SnippetReplaceableTextElement.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Snippets/SnippetReplaceableTextElement.cs @@ -100,7 +100,7 @@ namespace ICSharpCode.AvalonEdit.Snippets this.Text = GetText(); } - public void Deactivate() + public void Deactivate(SnippetEventArgs e) { TextDocumentWeakEventManager.TextChanged.RemoveListener(context.Document, this); context.TextArea.TextView.BackgroundRenderers.Remove(background);