// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Input;
using ICSharpCode.AvalonEdit.Snippets;
using ICSharpCode.NRefactory.CSharp;
using ICSharpCode.NRefactory.CSharp.Refactoring;
using ICSharpCode.NRefactory.Editor;
using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.SharpDevelop.Editor;
using ICSharpCode.SharpDevelop.Refactoring;
namespace CSharpBinding.Refactoring
{
///
/// Interaction logic for OverrideToStringMethodDialog.xaml
///
public partial class OverrideToStringMethodDialog : AbstractInlineRefactorDialog
{
AstNode baseCallNode;
IList parameterList;
public OverrideToStringMethodDialog(InsertionContext context, ITextEditor editor, ITextAnchor anchor, IList fields, AstNode baseCallNode)
: base(context, editor, anchor)
{
InitializeComponent();
this.baseCallNode = baseCallNode;
parameterList = fields;
this.listBox.ItemsSource = fields;
SelectAllChecked();
}
protected override string GenerateCode(ITypeDefinition currentClass)
{
// string[] fields = listBox.SelectedItems.OfType().Select(f2 => f2.MemberName).ToArray();
string[] fields = parameterList.Where(f => f.IsIncluded).Select(f2 => f2.MemberName).ToArray();
PrimitiveExpression formatString = new PrimitiveExpression(GenerateFormatString(currentClass, editor.Language.CodeGenerator, fields));
List param = new List() { formatString };
ReturnStatement ret = new ReturnStatement(new InvocationExpression(
new MemberReferenceExpression(new TypeReferenceExpression(ConvertType(KnownTypeCode.String)), "Format"),
param.Concat(fields.Select(f => new IdentifierExpression(f))).ToList()
));
if (baseCallNode != null) {
MethodDeclaration insertedOverrideMethod = refactoringContext.GetNode().PrevSibling as MethodDeclaration;
if (insertedOverrideMethod == null) {
// We are not inside of a method declaration
return null;
}
using (Script script = refactoringContext.StartScript()) {
NewLineNode nextNewLineNode = insertedOverrideMethod.NextSibling as NewLineNode;
// Find base method call and replace it by return statement
script.AddTo(insertedOverrideMethod.Body, ret);
AppendNewLine(script, insertedOverrideMethod, nextNewLineNode);
}
}
return null;
}
string GenerateFormatString(ITypeDefinition currentClass, CodeGenerator generator, string[] fields)
{
string fieldsString = "";
if (fields.Any()) {
StringBuilder formatString = new StringBuilder();
for (int i = 0; i < fields.Length; i++) {
if (i != 0)
formatString.Append(", ");
formatString.AppendFormat("{0}={{{1}}}", generator.GetPropertyName(fields[i]), i);
}
fieldsString = " " + formatString.ToString();
}
return "[" + currentClass.Name + fieldsString + "]";
}
void SelectAllChecked()
{
foreach (var param in parameterList) {
param.IsIncluded = true;
}
}
void SelectAllChecked(object sender, System.Windows.RoutedEventArgs e)
{
SelectAllChecked();
}
void SelectAllUnchecked()
{
foreach (var param in parameterList) {
param.IsIncluded = false;
}
}
void SelectAllUnchecked(object sender, System.Windows.RoutedEventArgs e)
{
SelectAllUnchecked();
}
bool AllSelected {
get { return parameterList.Count(p => p.IsIncluded) == parameterList.Count; }
}
protected override void OnKeyDown(KeyEventArgs e)
{
Key? allAccessKey = GetAccessKeyFromButton(selectAll);
if ((e.KeyboardDevice.Modifiers & ModifierKeys.Alt) == ModifierKeys.Alt && allAccessKey == e.SystemKey) {
if (AllSelected)
SelectAllUnchecked();
else
SelectAllChecked();
e.Handled = true;
}
base.OnKeyDown(e);
}
protected override void CancelButtonClick(object sender, System.Windows.RoutedEventArgs e)
{
base.CancelButtonClick(sender, e);
if (baseCallNode != null) {
// Insert at least the base call
MethodDeclaration insertedOverrideMethod = refactoringContext.GetNode().PrevSibling as MethodDeclaration;
if (insertedOverrideMethod == null)
{
// We are not inside of a method declaration
return;
}
using (Script script = refactoringContext.StartScript()) {
script.AddTo(insertedOverrideMethod.Body, baseCallNode);
}
}
}
protected override void OKButtonClick(object sender, System.Windows.RoutedEventArgs e)
{
base.OKButtonClick(sender, e);
}
}
}