diff --git a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
index 8c746ab3de..8bdfb532a7 100644
--- a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
+++ b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
@@ -202,6 +202,10 @@
+
+ RenameSymbolDialog.xaml
+ Code
+
@@ -806,11 +810,13 @@
+
+
diff --git a/src/Main/Base/Project/Src/Editor/Commands/FindReferencesCommand.cs b/src/Main/Base/Project/Src/Editor/Commands/FindReferencesCommand.cs
index 81c0df9fc0..28d838bc6f 100644
--- a/src/Main/Base/Project/Src/Editor/Commands/FindReferencesCommand.cs
+++ b/src/Main/Base/Project/Src/Editor/Commands/FindReferencesCommand.cs
@@ -4,6 +4,7 @@
using System;
using ICSharpCode.Core;
using ICSharpCode.NRefactory.Semantics;
+using ICSharpCode.SharpDevelop.Editor.Dialogs;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Refactoring;
@@ -35,38 +36,44 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands
public override void Run(ResolveResult symbol)
{
var entity = GetEntity(symbol);
-
- string title = "${res:SharpDevelop.Refactoring.Rename}";
- string text = title; // TODO add proper text
- if (entity != null) {
- switch (entity.SymbolKind) {
- case ICSharpCode.NRefactory.TypeSystem.SymbolKind.TypeDefinition:
- text = "${res:SharpDevelop.Refactoring.RenameClassText}";
- break;
- default:
- text = "${res:SharpDevelop.Refactoring.RenameMemberText}";
- break;
- }
-
- string newName = SD.MessageService.ShowInputBox(title, text, entity.Name);
- if (newName != entity.Name) {
- if (!CheckName(newName)) {
- SD.MessageService.ShowError("The symbol cannot be renamed because its new name is invalid!");
- return;
- }
+ if (entity != null) {
+ RenameSymbolDialog renameDialog = new RenameSymbolDialog(CheckName)
+ {
+ Owner = SD.Workbench.MainWindow,
+ OldSymbolName = entity.Name,
+ NewSymbolName = entity.Name
+ };
+ if ((bool) renameDialog.ShowDialog()) {
using (IProgressMonitor progressMonitor = AsynchronousWaitDialog.ShowWaitDialog("${res:SharpDevelop.Refactoring.Rename}"))
- FindReferenceService.RenameSymbol(entity, newName, progressMonitor)
+ FindReferenceService.RenameSymbol(entity, renameDialog.NewSymbolName, progressMonitor)
.ObserveOnUIThread()
.Subscribe(error => SD.MessageService.ShowError(error.Message), ex => SD.MessageService.ShowException(ex), () => {});
}
}
-
}
bool CheckName(string name)
{
// TODO implement for current language!
- return !string.IsNullOrWhiteSpace(name);
+ if (string.IsNullOrEmpty(name))
+ return false;
+
+ for (int i = 0; i < name.Length; i++) {
+ char thisChar = name[i];
+ if (!Char.IsLetter(thisChar)
+ && !Char.IsDigit(thisChar)
+ && (thisChar != '_'))
+ return false;
+ }
+
+ return true;
+ }
+
+ public override bool CanExecute(ResolveResult symbol)
+ {
+ if (symbol == null)
+ return false;
+ return !symbol.GetDefinitionRegion().IsEmpty;
}
}
}
diff --git a/src/Main/Base/Project/Src/Editor/Commands/SymbolUnderCaretMenuCommand.cs b/src/Main/Base/Project/Src/Editor/Commands/SymbolUnderCaretMenuCommand.cs
index 9a8517d1dd..a1761cacf9 100644
--- a/src/Main/Base/Project/Src/Editor/Commands/SymbolUnderCaretMenuCommand.cs
+++ b/src/Main/Base/Project/Src/Editor/Commands/SymbolUnderCaretMenuCommand.cs
@@ -2,6 +2,7 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
+using System.Windows.Input;
using ICSharpCode.Core;
using ICSharpCode.NRefactory;
using ICSharpCode.NRefactory.Semantics;
@@ -21,17 +22,31 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands
///
/// If the owner isn't one of the types above, the command operates on the caret position in the current editor.
///
- public abstract class ResolveResultMenuCommand : AbstractMenuCommand
+ public abstract class ResolveResultMenuCommand : ICommand
{
- public abstract void Run(ResolveResult symbol);
-
- public override void Run()
+ public virtual event EventHandler CanExecuteChanged { add {} remove {} }
+
+ public bool CanExecute(object parameter)
+ {
+ ITextEditor editor = SD.GetActiveViewContentService();
+ ResolveResult resolveResult = GetResolveResult(editor, parameter);
+ return CanExecute(resolveResult);
+ }
+
+ public void Execute(object parameter)
{
ITextEditor editor = SD.GetActiveViewContentService();
- ResolveResult resolveResult = GetResolveResult(editor, Owner);
+ ResolveResult resolveResult = GetResolveResult(editor, parameter);
Run(resolveResult);
}
+ public abstract void Run(ResolveResult symbol);
+
+ public virtual bool CanExecute(ResolveResult symbol)
+ {
+ return true;
+ }
+
public static ResolveResult GetResolveResult(object owner)
{
return GetResolveResult(null, owner);
diff --git a/src/Main/Base/Project/Src/Editor/Dialogs/RenameSymbolDialog.xaml b/src/Main/Base/Project/Src/Editor/Dialogs/RenameSymbolDialog.xaml
new file mode 100644
index 0000000000..df581d434d
--- /dev/null
+++ b/src/Main/Base/Project/Src/Editor/Dialogs/RenameSymbolDialog.xaml
@@ -0,0 +1,83 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Main/Base/Project/Src/Editor/Dialogs/RenameSymbolDialog.xaml.cs b/src/Main/Base/Project/Src/Editor/Dialogs/RenameSymbolDialog.xaml.cs
new file mode 100644
index 0000000000..16a71c429e
--- /dev/null
+++ b/src/Main/Base/Project/Src/Editor/Dialogs/RenameSymbolDialog.xaml.cs
@@ -0,0 +1,94 @@
+// 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.Text;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+
+namespace ICSharpCode.SharpDevelop.Editor.Dialogs
+{
+ ///
+ /// Interaction logic for RenameSymbolDialog.xaml
+ ///
+ public partial class RenameSymbolDialog : Window
+ {
+ public static readonly DependencyProperty NewSymbolNameProperty =
+ DependencyProperty.Register("NewSymbolName", typeof(string), typeof(RenameSymbolDialog),
+ new FrameworkPropertyMetadata());
+ public static readonly DependencyProperty IsValidSymbolNameProperty =
+ DependencyProperty.Register("IsValidSymbolName", typeof(bool), typeof(RenameSymbolDialog),
+ new FrameworkPropertyMetadata());
+ public static readonly DependencyProperty IsErrorProperty =
+ DependencyProperty.Register("IsError", typeof(bool), typeof(RenameSymbolDialog),
+ new FrameworkPropertyMetadata());
+
+ Predicate symbolNameValidationPredicate = n => true; // Just to always have one
+
+ public RenameSymbolDialog(Predicate symbolNameValidator)
+ {
+ InitializeComponent();
+
+ this.DataContext = this;
+
+ if (symbolNameValidator != null) {
+ symbolNameValidationPredicate = symbolNameValidator;
+ }
+
+ // Set focus into TextBox
+ this.symbolNameTextBox.Focus();
+ }
+
+ public string OldSymbolName
+ {
+ get;
+ set;
+ }
+
+ public string NewSymbolName
+ {
+ get { return (string)GetValue(NewSymbolNameProperty); }
+ set { SetValue(NewSymbolNameProperty, value); }
+ }
+
+ public bool IsValidSymbolName
+ {
+ get { return (bool)GetValue(IsValidSymbolNameProperty); }
+ set { SetValue(IsValidSymbolNameProperty, value); }
+ }
+
+ public bool IsError
+ {
+ get { return (bool)GetValue(IsErrorProperty); }
+ set { SetValue(IsErrorProperty, value); }
+ }
+
+ protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e)
+ {
+ base.OnPropertyChanged(e);
+
+ if (e.Property.Name == "NewSymbolName")
+ ValidateSymbolName();
+ }
+
+ void okButton_Click(object sender, RoutedEventArgs e)
+ {
+ this.DialogResult = true;
+ }
+
+ void ValidateSymbolName()
+ {
+ // Execute defined validator on input
+ bool isValidSymbolName = symbolNameValidationPredicate(NewSymbolName);
+
+ // Update error states
+ IsValidSymbolName = isValidSymbolName && (OldSymbolName != NewSymbolName);
+ IsError = !isValidSymbolName;
+ }
+ }
+}