diff --git a/src/Main/Base/Project/Src/Gui/Pads/ClassBrowser/Nodes/MemberNode.cs b/src/Main/Base/Project/Src/Gui/Pads/ClassBrowser/Nodes/MemberNode.cs index 8ba89d2224..8e69d3db2c 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ClassBrowser/Nodes/MemberNode.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ClassBrowser/Nodes/MemberNode.cs @@ -69,6 +69,11 @@ namespace ICSharpCode.SharpDevelop.Gui } } + public static string GetText(IMember member) + { + return Create(member).Text; + } + public static MemberNode Create(IMember member) { if (member is IMethod) diff --git a/src/Main/Base/Project/Src/Services/RefactoringService/RefactoringMenuBuilder.cs b/src/Main/Base/Project/Src/Services/RefactoringService/RefactoringMenuBuilder.cs index 80f19ccf9c..0ad3bd3797 100644 --- a/src/Main/Base/Project/Src/Services/RefactoringService/RefactoringMenuBuilder.cs +++ b/src/Main/Base/Project/Src/Services/RefactoringService/RefactoringMenuBuilder.cs @@ -20,12 +20,14 @@ using ICSharpCode.TextEditor.Document; namespace ICSharpCode.SharpDevelop.Refactoring { /// - /// Description of RefactoringMenuBuilder + /// Build a menu with refactoring commands for the item that has been clicked on in the text editor. /// public class RefactoringMenuBuilder : ISubmenuBuilder { public ToolStripItem[] BuildSubmenu(Codon codon, object owner) { + ToolStripMenuItem item; + TextEditorControl textEditorControl = (TextEditorControl)owner; if (textEditorControl.FileName == null) return new ToolStripItem[0]; @@ -34,43 +36,66 @@ namespace ICSharpCode.SharpDevelop.Refactoring IDocument doc = textArea.Document; int caretLine = textArea.Caret.Line; - bool lineHasDefinitions = false; + // list of dotnet names that have definition bookmarks in this line + List definitions = new List(); // Include definitions (use the bookmarks which should already be present) foreach (Bookmark mark in doc.BookmarkManager.Marks) { if (mark != null && mark.LineNumber == caretLine) { - string path = null; - int iconIndex = 0; - string name = null; ClassMemberBookmark cmb = mark as ClassMemberBookmark; ClassBookmark cb = mark as ClassBookmark; + IClass type = null; if (cmb != null) { - path = ClassMemberBookmark.ContextMenuPath; - iconIndex = cmb.IconIndex; - name = cmb.Member.Name; + definitions.Add(cmb.Member.DotNetName); + item = new ToolStripMenuItem(MemberNode.GetText(cmb.Member), + ClassBrowserIconService.ImageList.Images[cmb.IconIndex]); + MenuService.AddItemsToMenu(item.DropDown.Items, mark, ClassMemberBookmark.ContextMenuPath); + resultItems.Add(item); + type = cmb.Member.DeclaringType; } else if (cb != null) { - path = ClassBookmark.ContextMenuPath; - iconIndex = ClassBrowserIconService.GetIcon(cb.Class); - name = cb.Class.Name; + type = cb.Class; } - if (path != null) { - lineHasDefinitions = true; - ToolStripMenuItem item = new ToolStripMenuItem(name, ClassBrowserIconService.ImageList.Images[iconIndex]); - MenuService.AddItemsToMenu(item.DropDown.Items, mark, path); + if (type != null) { + definitions.Add(type.DotNetName); + item = new ToolStripMenuItem(type.Name, ClassBrowserIconService.ImageList.Images[ClassBrowserIconService.GetIcon(type)]); + MenuService.AddItemsToMenu(item.DropDown.Items, + cb ?? new ClassBookmark(textArea.Document, type), + ClassBookmark.ContextMenuPath); resultItems.Add(item); } } } - if (!lineHasDefinitions) { - ResolveResult rr = ResolveAtCaret(textEditorControl, textArea); - ToolStripMenuItem item = null; - if (rr is MemberResolveResult) { - item = MakeItem(((MemberResolveResult)rr).ResolvedMember); - } else if (rr is TypeResolveResult) { - item = MakeItem(((TypeResolveResult)rr).ResolvedClass); + // Include menu for member that has been clicked on + ResolveResult rr = ResolveAtCaret(textEditorControl, textArea); + item = null; + if (rr is MemberResolveResult) { + item = MakeItem(definitions, ((MemberResolveResult)rr).ResolvedMember); + } else if (rr is TypeResolveResult) { + item = MakeItem(definitions, ((TypeResolveResult)rr).ResolvedClass); + } + if (item != null) { + resultItems.Add(item); + } + + // Include menu for current class and method + IMember callingMember = null; + if (rr != null) { + callingMember = rr.CallingMember; + } else { + ParseInformation parseInfo = ParserService.GetParseInformation(textEditorControl.FileName); + if (parseInfo != null) { + ICompilationUnit cu = parseInfo.MostRecentCompilationUnit; + if (cu != null) { + IClass callingClass = cu.GetInnermostClass(caretLine + 1, textArea.Caret.Column + 1); + callingMember = GetCallingMember(callingClass, caretLine + 1, textArea.Caret.Column + 1); + } } + } + if (callingMember != null) { + item = MakeItem(definitions, callingMember); if (item != null) { + item.Text = StringParser.Parse("${res:SharpDevelop.Refactoring.CurrentMethod}: ") + callingMember.Name; resultItems.Add(item); } } @@ -85,22 +110,59 @@ namespace ICSharpCode.SharpDevelop.Refactoring } } - ToolStripMenuItem MakeItem(IMember member) + IMember GetCallingMember(IClass callingClass, int caretLine, int caretColumn) + { + if (callingClass == null) { + return null; + } + foreach (IMethod method in callingClass.Methods) { + if (method.BodyRegion != null && method.BodyRegion.IsInside(caretLine, caretColumn)) { + return method; + } + } + foreach (IProperty property in callingClass.Properties) { + if (property.BodyRegion != null && property.BodyRegion.IsInside(caretLine, caretColumn)) { + return property; + } + } + return null; + } + + ToolStripMenuItem MakeItem(List definitions, IMember member) { if (member == null) return null; - return MakeItem(MemberNode.Create(member), member.DeclaringType.CompilationUnit, member.Region); + if (definitions.Contains(member.DotNetName)) return null; + definitions.Add(member.DotNetName); + ToolStripMenuItem item = MakeItem(member.FullyQualifiedName, MemberNode.Create(member), member.DeclaringType.CompilationUnit, member.Region); + ToolStripMenuItem declaringType = MakeItem(null, member.DeclaringType); + if (declaringType != null) { + item.DropDown.Items.Add(new ToolStripSeparator()); + declaringType.Text = StringParser.Parse("${res:SharpDevelop.Refactoring.DeclaringType}: ") + declaringType.Text; + item.DropDown.Items.Add(declaringType); + } + return item; } - ToolStripMenuItem MakeItem(IClass c) + ToolStripMenuItem MakeItem(List definitions, IClass c) { if (c == null) return null; - return MakeItem(new ClassNode(c.ProjectContent.Project, c), c.CompilationUnit, c.Region); + if (definitions != null) { + if (definitions.Contains(c.DotNetName)) return null; + definitions.Add(c.DotNetName); + } + return MakeItem(c.FullyQualifiedName, new ClassNode(c.ProjectContent.Project, c), c.CompilationUnit, c.Region); } - ToolStripMenuItem MakeItem(ExtTreeNode classBrowserTreeNode, ICompilationUnit cu, IRegion region) + ToolStripMenuItem MakeItem(string title, ExtTreeNode classBrowserTreeNode, ICompilationUnit cu, IRegion region) { ToolStripMenuItem item = new ToolStripMenuItem(classBrowserTreeNode.Text, ClassBrowserIconService.ImageList.Images[classBrowserTreeNode.ImageIndex]); + + //ToolStripMenuItem titleItem = new ToolStripMenuItem(title); + //titleItem.Enabled = false; + //item.DropDown.Items.Add(titleItem); + //item.DropDown.Items.Add(new ToolStripSeparator()); + if (cu.FileName != null && region != null) { ToolStripMenuItem gotoDefinitionItem = new ToolStripMenuItem(StringParser.Parse("${res:ICSharpCode.NAntAddIn.GotoDefinitionMenuLabel}"), ClassBrowserIconService.ImageList.Images[ClassBrowserIconService.GotoArrowIndex]); @@ -111,6 +173,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring item.DropDown.Items.Add(gotoDefinitionItem); item.DropDown.Items.Add(new ToolStripSeparator()); } + MenuService.AddItemsToMenu(item.DropDown.Items, classBrowserTreeNode, classBrowserTreeNode.ContextmenuAddinTreePath); return item; } diff --git a/src/Main/StartUp/Project/Resources/StringResources.resources b/src/Main/StartUp/Project/Resources/StringResources.resources index d49b1d4356..23ca702d83 100644 Binary files a/src/Main/StartUp/Project/Resources/StringResources.resources and b/src/Main/StartUp/Project/Resources/StringResources.resources differ diff --git a/src/Main/StartUp/Project/StartUp.csproj b/src/Main/StartUp/Project/StartUp.csproj index 5eb2bd4674..ff18c32e04 100644 --- a/src/Main/StartUp/Project/StartUp.csproj +++ b/src/Main/StartUp/Project/StartUp.csproj @@ -11,7 +11,6 @@ False true Resources\StartUp.snk - Exe .\Resources\SharpDevelop.ico ..\src\Tools\UpdateAssemblyInfo\bin\Debug\UpdateAssemblyInfo.exe StartupOnly