From b03fe447ab76c372aa91c2c364e6d75e51456010 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Fri, 13 Nov 2009 21:24:59 +0000 Subject: [PATCH] - added InlineUIElementGenerator and AvalonEditEditorUIService - finished OverrideToStringMethodCommand and OverrideToStringMethodDialog git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@5255 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../AvalonEdit.AddIn/AvalonEdit.AddIn.csproj | 3 +- .../Src/AvalonEditEditorUIService.cs | 32 +++++ ...nerator.cs => InlineUIElementGenerator.cs} | 17 --- .../SharpRefactoring/SharpRefactoring.csproj | 2 + .../Src/Gui/InlineRefactorDialog.cs | 67 +--------- .../Src/Gui/OverrideToStringMethodDialog.cs | 119 ++++++++++++++++++ .../Misc/SharpRefactoring/Src/Gui/Wrapper.cs | 50 ++++++++ .../Src/OverrideToStringMethodCommand.cs | 14 +-- 8 files changed, 213 insertions(+), 91 deletions(-) create mode 100644 src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/AvalonEditEditorUIService.cs rename src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/{DialogElementGenerator.cs => InlineUIElementGenerator.cs} (72%) create mode 100644 src/AddIns/Misc/SharpRefactoring/Src/Gui/OverrideToStringMethodDialog.cs create mode 100644 src/AddIns/Misc/SharpRefactoring/Src/Gui/Wrapper.cs diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.csproj b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.csproj index 8b7f2b9e9c..d78b2bc383 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.csproj +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.csproj @@ -71,6 +71,7 @@ + @@ -86,7 +87,7 @@ - + diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/AvalonEditEditorUIService.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/AvalonEditEditorUIService.cs new file mode 100644 index 0000000000..2493f23a95 --- /dev/null +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/AvalonEditEditorUIService.cs @@ -0,0 +1,32 @@ +// +// +// +// +// $Revision$ +// + +using System; +using System.Windows; +using ICSharpCode.AvalonEdit.Document; +using ICSharpCode.AvalonEdit.Rendering; +using ICSharpCode.SharpDevelop.Editor; + +namespace ICSharpCode.AvalonEdit.AddIn +{ + public class AvalonEditEditorUIService : IEditorUIService + { + TextView textView; + + public AvalonEditEditorUIService(TextView textView) + { + this.textView = textView; + } + + public IInlineUIElement CreateInlineUIElement(ITextAnchor position, UIElement element) + { + InlineUIElementGenerator inline = new InlineUIElementGenerator(textView, element, position); + this.textView.ElementGenerators.Add(inline); + return inline; + } + } +} diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/DialogElementGenerator.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/InlineUIElementGenerator.cs similarity index 72% rename from src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/DialogElementGenerator.cs rename to src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/InlineUIElementGenerator.cs index b143fcda48..505fe7813f 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/DialogElementGenerator.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/InlineUIElementGenerator.cs @@ -47,21 +47,4 @@ namespace ICSharpCode.AvalonEdit.AddIn this.textView.ElementGenerators.Remove(this); } } - - public class AvalonEditEditorUIService : IEditorUIService - { - TextView textView; - - public AvalonEditEditorUIService(TextView textView) - { - this.textView = textView; - } - - public IInlineUIElement CreateInlineUIElement(ITextAnchor position, UIElement element) - { - InlineUIElementGenerator inline = new InlineUIElementGenerator(textView, element, position); - this.textView.ElementGenerators.Add(inline); - return inline; - } - } } diff --git a/src/AddIns/Misc/SharpRefactoring/SharpRefactoring.csproj b/src/AddIns/Misc/SharpRefactoring/SharpRefactoring.csproj index d435b69c9e..4cbae80422 100644 --- a/src/AddIns/Misc/SharpRefactoring/SharpRefactoring.csproj +++ b/src/AddIns/Misc/SharpRefactoring/SharpRefactoring.csproj @@ -79,6 +79,8 @@ ExtractMethodForm.cs + + diff --git a/src/AddIns/Misc/SharpRefactoring/Src/Gui/InlineRefactorDialog.cs b/src/AddIns/Misc/SharpRefactoring/Src/Gui/InlineRefactorDialog.cs index 45615fd65f..cab89d21b2 100644 --- a/src/AddIns/Misc/SharpRefactoring/Src/Gui/InlineRefactorDialog.cs +++ b/src/AddIns/Misc/SharpRefactoring/Src/Gui/InlineRefactorDialog.cs @@ -8,6 +8,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Media; @@ -73,7 +74,7 @@ namespace SharpRefactoring.Gui } protected abstract UIElement CreateContentElement(); - protected abstract void GenerateCode(CodeGenerator generator, IClass currentClass); + protected abstract string GenerateCode(CodeGenerator generator, IClass currentClass); void OKButtonClick(object sender, RoutedEventArgs e) { @@ -86,7 +87,7 @@ namespace SharpRefactoring.Gui CodeGenerator generator = parseInfo.CompilationUnit.Language.CodeGenerator; IClass current = parseInfo.CompilationUnit.GetInnermostClass(editor.Caret.Line, editor.Caret.Column); - GenerateCode(generator, current); + editor.Document.Insert(anchor.Offset, GenerateCode(generator, current) ?? ""); } Element.Remove(); @@ -100,66 +101,4 @@ namespace SharpRefactoring.Gui Element.Remove(); } } - - public class OverrideToStringMethodDialog : InlineRefactorDialog - { - ListBox listBox; - List fields; - ITextAnchor parameterListAnchor; - - public OverrideToStringMethodDialog(ITextEditor editor, ITextAnchor anchor, ITextAnchor parameterListAnchor, IList fields) - : base(editor, anchor) - { - this.parameterListAnchor = parameterListAnchor; - this.fields = fields.Select(f => new EntityWrapper() { Entity = f }).ToList(); - this.listBox.ItemsSource = this.fields.Select(i => i.Create()); - } - - protected override UIElement CreateContentElement() - { - listBox = new ListBox() { - Margin = new Thickness(3) - }; - - return listBox; - } - - protected override void GenerateCode(CodeGenerator generator, IClass currentClass) - { - var fields = this.fields - .Where(f => f.IsChecked) - .Select(f2 => CreateAssignment(f2.Entity.Name, f2.Entity.Name)) - .ToArray(); - generator.InsertCodeInClass(currentClass, new RefactoringDocumentAdapter(editor.Document), anchor.Line, fields); - } - - Statement CreateAssignment(string memberName, string parameter) - { - return new ExpressionStatement( - new AssignmentExpression( - new MemberReferenceExpression(new ThisReferenceExpression(), memberName), - AssignmentOperatorType.Assign, - new IdentifierExpression(parameter) - ) - ); - } - } - - class EntityWrapper - { - public IEntity Entity { get; set; } - public bool IsChecked { get; set; } - - public object Create() - { - CheckBox box = new CheckBox() { - Content = Entity.Name - }; - - box.Checked += delegate { this.IsChecked = true; }; - box.Unchecked += delegate { this.IsChecked = false; }; - - return box; - } - } } diff --git a/src/AddIns/Misc/SharpRefactoring/Src/Gui/OverrideToStringMethodDialog.cs b/src/AddIns/Misc/SharpRefactoring/Src/Gui/OverrideToStringMethodDialog.cs new file mode 100644 index 0000000000..8d79b23fdd --- /dev/null +++ b/src/AddIns/Misc/SharpRefactoring/Src/Gui/OverrideToStringMethodDialog.cs @@ -0,0 +1,119 @@ +// +// +// +// +// $Revision$ +// + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Media; + +using ICSharpCode.Core; +using ICSharpCode.NRefactory.Ast; +using ICSharpCode.SharpDevelop; +using ICSharpCode.SharpDevelop.Dom; +using ICSharpCode.SharpDevelop.Dom.Refactoring; +using ICSharpCode.SharpDevelop.Editor; + +namespace SharpRefactoring.Gui +{ + public class OverrideToStringMethodDialog : InlineRefactorDialog + { + ListBox listBox; + List> fields; + + public OverrideToStringMethodDialog(ITextEditor editor, ITextAnchor anchor, IList fields) + : base(editor, anchor) + { + this.fields = fields.Select(f => new Wrapper() { Entity = f }).ToList(); + this.listBox.ItemsSource = this.fields.Select(i => i.Create(null)); + } + + protected override UIElement CreateContentElement() + { + TextBlock block = new TextBlock() { + Text = StringParser.Parse("${res:AddIns.SharpRefactoring.OverrideToStringMethod.Description}"), + Margin = new Thickness(3), + TextWrapping = TextWrapping.Wrap + }; + + listBox = new ListBox() { + Margin = new Thickness(3) + }; + + block.SetValue(DockPanel.DockProperty, Dock.Top); + + return new DockPanel() { + Children = { + block, + listBox + } + }; + } + + protected override string GenerateCode(CodeGenerator generator, IClass currentClass) + { + var fields = this.fields + .Where(f => f.IsChecked) + .Select(f2 => f2.Entity.Name) + .ToArray(); + + if (fields.Any()) { + StringBuilder formatString = new StringBuilder("[" + currentClass.Name + " "); + + for (int i = 0; i < fields.Length; i++) { + if (i != 0) + formatString.Append(", "); + formatString.AppendFormat("{0}={{{1}}}", generator.GetPropertyName(fields[i]), i); + } + + formatString.Append("]"); + + return "return string.Format(\"" + formatString.ToString() + "\", " + string.Join(", ", fields) + ");"; + } + + return "return string.Format(\"[" + currentClass.Name + "]\");"; + } + } + + /* List> checkedItems = new List>(); + + void CheckChange(Wrapper field) + { + if (field.IsChecked) + checkedItems.Add(field); + else + checkedItems.Remove(field); + + string text = string.Join(", ", this.checkedItems.Select(f2 => PrintVariableDeclaration(f2.Entity))); + + editor.Document.Replace(parameterListAnchorStart.Offset, parameterListAnchorEnd.Offset - parameterListAnchorStart.Offset, text); + } + + string PrintVariableDeclaration(IField field) + { + if (field.ReturnType == null) + return "? " + field.Name; + else { + TypeReference type = CodeGenerator.ConvertType(field.ReturnType, new ClassFinder(field)); + return ((type.IsKeyword) ? TypeReference.PrimitiveTypesCSharpReverse[type.Type] : type.Type) + " " + field.Name; + } + } + + Statement CreateAssignment(string memberName, string parameter) + { + return new ExpressionStatement( + new AssignmentExpression( + new MemberReferenceExpression(new ThisReferenceExpression(), memberName), + AssignmentOperatorType.Assign, + new IdentifierExpression(parameter) + ) + ); + } + */ +} diff --git a/src/AddIns/Misc/SharpRefactoring/Src/Gui/Wrapper.cs b/src/AddIns/Misc/SharpRefactoring/Src/Gui/Wrapper.cs new file mode 100644 index 0000000000..7f5869fb3d --- /dev/null +++ b/src/AddIns/Misc/SharpRefactoring/Src/Gui/Wrapper.cs @@ -0,0 +1,50 @@ +// +// +// +// +// $Revision$ +// + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Media; + +using ICSharpCode.Core; +using ICSharpCode.NRefactory.Ast; +using ICSharpCode.SharpDevelop; +using ICSharpCode.SharpDevelop.Dom; +using ICSharpCode.SharpDevelop.Dom.Refactoring; +using ICSharpCode.SharpDevelop.Editor; + +namespace SharpRefactoring.Gui +{ + class Wrapper where T : IEntity + { + public T Entity { get; set; } + public bool IsChecked { get; set; } + + public object Create(Action> checkChange) + { + CheckBox box = new CheckBox() { + Content = Entity.Name + }; + + box.Checked += delegate { + this.IsChecked = true; + if (checkChange != null) + checkChange(this); + }; + box.Unchecked += delegate { + this.IsChecked = false; + if (checkChange != null) + checkChange(this); + }; + + return box; + } + } +} diff --git a/src/AddIns/Misc/SharpRefactoring/Src/OverrideToStringMethodCommand.cs b/src/AddIns/Misc/SharpRefactoring/Src/OverrideToStringMethodCommand.cs index 8c347000a8..8a3bde9526 100644 --- a/src/AddIns/Misc/SharpRefactoring/Src/OverrideToStringMethodCommand.cs +++ b/src/AddIns/Misc/SharpRefactoring/Src/OverrideToStringMethodCommand.cs @@ -6,9 +6,6 @@ // using System; -using System.Linq; -using System.Windows.Forms; -using ICSharpCode.Core; using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Dom.Refactoring; @@ -44,15 +41,14 @@ namespace SharpRefactoring ITextAnchor anchor = textEditor.Document.CreateAnchor(textEditor.Caret.Offset); anchor.MovementType = AnchorMovementType.AfterInsertion; - textEditor.Document.Insert(anchor.Offset, "public override ToString()\n{\n\t"); + var line = textEditor.Document.GetLineForOffset(textEditor.Caret.Offset); - ITextAnchor parameterListAnchor = textEditor.Document.CreateAnchor(anchor.Offset - ")\n{\n\t".Length); - parameterListAnchor.SurviveDeletion = true; - parameterListAnchor.MovementType = AnchorMovementType.AfterInsertion; + string indent = DocumentUtilitites.GetWhitespaceAfter(textEditor.Document, line.Offset); - textEditor.Document.Insert(anchor.Offset + 1, "\n\t\n}\n"); + textEditor.Document.Insert(anchor.Offset, "public override string ToString()\n" + indent + "{\n" + indent + "\t"); + textEditor.Document.Insert(anchor.Offset + 1, indent + "}\n"); - InlineRefactorDialog dialog = new OverrideToStringMethodDialog(textEditor, anchor, parameterListAnchor, current.Fields); + InlineRefactorDialog dialog = new OverrideToStringMethodDialog(textEditor, anchor, current.Fields); dialog.Element = uiService.CreateInlineUIElement(anchor, dialog); }