From 77562789342440232332b1667ff201c909bb5d57 Mon Sep 17 00:00:00 2001 From: Andreas Weizel Date: Sat, 15 Jun 2013 20:19:16 +0200 Subject: [PATCH] Added first version of symbol rename dialog. --- .../Project/ICSharpCode.SharpDevelop.csproj | 6 ++ .../Editor/Commands/FindReferencesCommand.cs | 51 +++++----- .../Commands/SymbolUnderCaretMenuCommand.cs | 25 ++++- .../Editor/Dialogs/RenameSymbolDialog.xaml | 83 ++++++++++++++++ .../Editor/Dialogs/RenameSymbolDialog.xaml.cs | 94 +++++++++++++++++++ 5 files changed, 232 insertions(+), 27 deletions(-) create mode 100644 src/Main/Base/Project/Src/Editor/Dialogs/RenameSymbolDialog.xaml create mode 100644 src/Main/Base/Project/Src/Editor/Dialogs/RenameSymbolDialog.xaml.cs 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +