diff --git a/AddIns/ICSharpCode.SharpDevelop.addin b/AddIns/ICSharpCode.SharpDevelop.addin index f7ae27492e..ee9633c212 100755 --- a/AddIns/ICSharpCode.SharpDevelop.addin +++ b/AddIns/ICSharpCode.SharpDevelop.addin @@ -1340,7 +1340,8 @@ + class = "ICSharpCode.SharpDevelop.Refactoring.RenameCommand" + shortcut = "Control|R" /> + + + + + + + + + diff --git a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj index 43d7234152..e73869ce9b 100644 --- a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj +++ b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj @@ -99,7 +99,11 @@ + + + + diff --git a/src/Main/Base/Project/Src/Editor/Commands/ClassBookmarkMenuBuilder.cs b/src/Main/Base/Project/Src/Editor/Commands/ClassBookmarkMenuBuilder.cs index 85c2db6905..9eeac1a653 100644 --- a/src/Main/Base/Project/Src/Editor/Commands/ClassBookmarkMenuBuilder.cs +++ b/src/Main/Base/Project/Src/Editor/Commands/ClassBookmarkMenuBuilder.cs @@ -149,6 +149,7 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands } cmd = new MenuCommand("${res:SharpDevelop.Refactoring.RenameCommand}", Rename); + cmd.ShortcutKeys = MenuCommand.ParseShortcut("Control|R"); cmd.Tag = c; list.Add(cmd); @@ -179,7 +180,7 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands list.Add(cmd); } - cmd = new MenuCommand("${res:SharpDevelop.Refactoring.FindReferencesCommand}", FindReferences); + cmd = FindReferencesAndRenameHelper.MakeFindReferencesMenuCommand(FindReferences); cmd.Tag = c; list.Add(cmd); @@ -309,14 +310,7 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands { MenuCommand item = (MenuCommand)sender; IClass c = (IClass)item.Tag; - using (AsynchronousWaitDialog monitor = AsynchronousWaitDialog.ShowWaitDialog("${res:SharpDevelop.Refactoring.FindReferences}")) - { - FindReferencesAndRenameHelper.ShowAsSearchResults( - StringParser.Parse("${res:SharpDevelop.Refactoring.ReferencesTo}", - new string[,] {{ "Name", c.Name }}), - RefactoringService.FindReferences(c, monitor) - ); - } + FindReferencesAndRenameHelper.RunFindReferences(c); } } } diff --git a/src/Main/Base/Project/Src/Editor/Commands/ClassMemberMenuBuilder.cs b/src/Main/Base/Project/Src/Editor/Commands/ClassMemberMenuBuilder.cs index d556f45316..0596c6d657 100644 --- a/src/Main/Base/Project/Src/Editor/Commands/ClassMemberMenuBuilder.cs +++ b/src/Main/Base/Project/Src/Editor/Commands/ClassMemberMenuBuilder.cs @@ -63,14 +63,12 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands list.Add(cmd); } } - if (member.IsOverride) { + if (member != null && member.IsOverride) { cmd = new MenuCommand("${res:SharpDevelop.Refactoring.GoToBaseClassCommand}", GoToBase); cmd.Tag = member; list.Add(cmd); } - if (member.IsVirtual || member.IsAbstract || (member.IsOverride && !member.DeclaringType.IsSealed) - // Interface members have IsVirtual == IsAbstract == false. These properties are based on modifiers only. - || (member.DeclaringType != null && member.DeclaringType.ClassType == ClassType.Interface)) { + if (member != null && member.IsOverridable) { cmd = new MenuCommand("${res:SharpDevelop.Refactoring.FindOverridesCommand}", FindOverrides); cmd.Tag = member; list.Add(cmd); @@ -240,13 +238,7 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands { MenuCommand item = (MenuCommand)sender; IMember member = (IMember)item.Tag; - string memberName = member.DeclaringType.Name + "." + member.Name; - using (AsynchronousWaitDialog monitor = AsynchronousWaitDialog.ShowWaitDialog("${res:SharpDevelop.Refactoring.FindReferences}")) - { - FindReferencesAndRenameHelper.ShowAsSearchResults(StringParser.Parse("${res:SharpDevelop.Refactoring.ReferencesTo}", - new string[,] {{ "Name", memberName }}), - RefactoringService.FindReferences(member, monitor)); - } + FindReferencesAndRenameHelper.RunFindReferences(member); } bool IsAutomaticProperty(ITextEditor editor, IProperty property) diff --git a/src/Main/Base/Project/Src/Editor/Commands/FindBaseClasses.cs b/src/Main/Base/Project/Src/Editor/Commands/FindBaseClasses.cs new file mode 100644 index 0000000000..00ab0bf8b3 --- /dev/null +++ b/src/Main/Base/Project/Src/Editor/Commands/FindBaseClasses.cs @@ -0,0 +1,30 @@ +// +// +// +// +// $Revision: $ +// +using System; +using ICSharpCode.SharpDevelop.Dom; +using ICSharpCode.SharpDevelop.Refactoring; + +namespace ICSharpCode.SharpDevelop.Editor.Commands +{ + /// + /// Description of FindBaseClasses. + /// + public class FindBaseClasses : SymbolUnderCaretCommand + { + protected override void RunImpl(ITextEditor editor, int offset, ResolveResult symbol) + { + if (symbol == null) + return; + if (symbol is TypeResolveResult) { + var classUnderCaret = ((TypeResolveResult)symbol).ResolvedClass; + if (classUnderCaret == null) + return; + ContextActionsHelper.MakePopupWithBaseClasses(classUnderCaret).Open(editor); + } + } + } +} diff --git a/src/Main/Base/Project/Src/Editor/Commands/FindDerivedClassesOrOverrides.cs b/src/Main/Base/Project/Src/Editor/Commands/FindDerivedClassesOrOverrides.cs new file mode 100644 index 0000000000..7906842b54 --- /dev/null +++ b/src/Main/Base/Project/Src/Editor/Commands/FindDerivedClassesOrOverrides.cs @@ -0,0 +1,36 @@ +// +// +// +// +// $Revision: $ +// +using System; +using ICSharpCode.SharpDevelop.Dom; +using ICSharpCode.SharpDevelop.Refactoring; + +namespace ICSharpCode.SharpDevelop.Editor.Commands +{ + /// + /// Description of FindDerivedClassesOrOverrides. + /// + public class FindDerivedClassesOrOverrides : SymbolUnderCaretCommand + { + protected override void RunImpl(ITextEditor editor, int offset, ResolveResult symbol) + { + if (symbol == null) + return; + if (symbol is TypeResolveResult) { + var classUnderCaret = ((TypeResolveResult)symbol).ResolvedClass; + if (classUnderCaret == null) + return; + ContextActionsHelper.MakePopupWithDerivedClasses(classUnderCaret).Open(editor); + } + if (symbol is MemberResolveResult) { + IMember memberUnderCaret = ((MemberResolveResult)symbol).ResolvedMember as IMember; + if (memberUnderCaret != null && memberUnderCaret.IsOverridable) { + ContextActionsHelper.MakePopupWithOverrides(memberUnderCaret).Open(editor); + } + } + } + } +} diff --git a/src/Main/Base/Project/Src/Editor/Commands/FindReferences.cs b/src/Main/Base/Project/Src/Editor/Commands/FindReferences.cs new file mode 100644 index 0000000000..bb0cb31815 --- /dev/null +++ b/src/Main/Base/Project/Src/Editor/Commands/FindReferences.cs @@ -0,0 +1,36 @@ +// +// +// +// +// $Revision: $ +// +using System; +using ICSharpCode.SharpDevelop.Dom; +using ICSharpCode.SharpDevelop.Refactoring; + +namespace ICSharpCode.SharpDevelop.Editor.Commands +{ + /// + /// Description of FindReferences. + /// + public class FindReferences : SymbolUnderCaretCommand + { + protected override void RunImpl(ITextEditor editor, int offset, ResolveResult symbol) + { + if (symbol == null) + return; + if (symbol is TypeResolveResult) { + var classUnderCaret = ((TypeResolveResult)symbol).ResolvedClass; + if (classUnderCaret == null) + return; + FindReferencesAndRenameHelper.RunFindReferences(classUnderCaret); + } + if (symbol is MemberResolveResult) { + IMember memberUnderCaret = ((MemberResolveResult)symbol).ResolvedMember as IMember; + if (memberUnderCaret == null) + return; + FindReferencesAndRenameHelper.RunFindReferences(memberUnderCaret); + } + } + } +} diff --git a/src/Main/Base/Project/Src/Editor/Commands/GoToDefinition.cs b/src/Main/Base/Project/Src/Editor/Commands/GoToDefinition.cs index db4683552d..91e21b139b 100644 --- a/src/Main/Base/Project/Src/Editor/Commands/GoToDefinition.cs +++ b/src/Main/Base/Project/Src/Editor/Commands/GoToDefinition.cs @@ -12,41 +12,22 @@ using ICSharpCode.SharpDevelop.Gui; namespace ICSharpCode.SharpDevelop.Editor.Commands { - public class GoToDefinition : AbstractMenuCommand + public class GoToDefinition : SymbolUnderCaretCommand { - public override void Run() + protected override void RunImpl(ITextEditor editor, int offset, ResolveResult symbol) { - ITextEditorProvider editorProvider = WorkbenchSingleton.Workbench.ActiveViewContent as ITextEditorProvider; - if (editorProvider != null) { - Run(editorProvider.TextEditor, editorProvider.TextEditor.Caret.Offset); - } - } - - public static void Run(ITextEditor editor, int offset) - { - IDocument document = editor.Document; - string textContent = document.Text; - - IExpressionFinder expressionFinder = ParserService.GetExpressionFinder(editor.FileName); - if (expressionFinder == null) + if (symbol == null) return; - ExpressionResult expression = expressionFinder.FindFullExpression(textContent, offset); - if (expression.Expression == null || expression.Expression.Length == 0) + FilePosition pos = symbol.GetDefinitionPosition(); + if (pos.IsEmpty) return; - var caretPos = editor.Document.OffsetToPosition(offset); - ResolveResult result = ParserService.Resolve(expression, caretPos.Line, caretPos.Column, editor.FileName, textContent); - if (result != null) { - FilePosition pos = result.GetDefinitionPosition(); - if (pos.IsEmpty == false) { - try { - if (pos.Position.IsEmpty) - FileService.OpenFile(pos.FileName); - else - FileService.JumpToFilePosition(pos.FileName, pos.Line, pos.Column); - } catch (Exception ex) { - MessageService.ShowException(ex, "Error jumping to '" + pos.FileName + "'."); - } - } + try { + if (pos.Position.IsEmpty) + FileService.OpenFile(pos.FileName); + else + FileService.JumpToFilePosition(pos.FileName, pos.Line, pos.Column); + } catch (Exception ex) { + MessageService.ShowException(ex, "Error jumping to '" + pos.FileName + "'."); } } } diff --git a/src/Main/Base/Project/Src/Editor/Commands/SymbolUnderCaretCommand.cs b/src/Main/Base/Project/Src/Editor/Commands/SymbolUnderCaretCommand.cs new file mode 100644 index 0000000000..1770079dea --- /dev/null +++ b/src/Main/Base/Project/Src/Editor/Commands/SymbolUnderCaretCommand.cs @@ -0,0 +1,35 @@ +// +// +// +// +// $Revision: $ +// +using System; +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Dom; +using ICSharpCode.SharpDevelop.Gui; + +namespace ICSharpCode.SharpDevelop.Editor.Commands +{ + /// + /// A menu command that uses the symbol under the editor's caret. + /// + public abstract class SymbolUnderCaretCommand : AbstractMenuCommand + { + public override void Run() + { + ITextEditorProvider editorProvider = WorkbenchSingleton.Workbench.ActiveViewContent as ITextEditorProvider; + if (editorProvider != null) { + Run(editorProvider.TextEditor, editorProvider.TextEditor.Caret.Offset); + } + } + + public void Run(ITextEditor editor, int caretOffset) + { + var resolveResult = ParserService.Resolve(caretOffset, editor.Document, editor.FileName); + RunImpl(editor, caretOffset, resolveResult); + } + + protected abstract void RunImpl(ITextEditor editor, int caretOffset, ResolveResult symbol); + } +} diff --git a/src/Main/Base/Project/Src/Services/RefactoringService/ContextActions/ContextActionsControl.xaml b/src/Main/Base/Project/Src/Services/RefactoringService/ContextActions/ContextActionsControl.xaml index f58775e513..c9b000123d 100644 --- a/src/Main/Base/Project/Src/Services/RefactoringService/ContextActions/ContextActionsControl.xaml +++ b/src/Main/Base/Project/Src/Services/RefactoringService/ContextActions/ContextActionsControl.xaml @@ -8,7 +8,6 @@ -