From f46f076fbca1639faf3de96a269d65b301099dbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Kon=C3=AD=C4=8Dek?= Date: Sat, 31 Jul 2010 17:45:38 +0000 Subject: [PATCH] Moved context menu items from submenu to top level. Removed goto from RefactoringMenuBuilder. Commented part calling RefactoringService.FixIndexerExpression - the menu for indexer seems to work well. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@6332 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Commands/ClassBookmarkSubmenuBuilder.cs | 42 +++--- .../RefactoringMenuBuilder.cs | 123 ++++++++++-------- 2 files changed, 96 insertions(+), 69 deletions(-) diff --git a/src/Main/Base/Project/Src/Editor/Commands/ClassBookmarkSubmenuBuilder.cs b/src/Main/Base/Project/Src/Editor/Commands/ClassBookmarkSubmenuBuilder.cs index 0046e6b769..8e5ec474c7 100644 --- a/src/Main/Base/Project/Src/Editor/Commands/ClassBookmarkSubmenuBuilder.cs +++ b/src/Main/Base/Project/Src/Editor/Commands/ClassBookmarkSubmenuBuilder.cs @@ -60,30 +60,42 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands List list = new List(); - // navigation actions - if (c.BaseTypes.Count > 0) { - list.Add(new MenuSeparator()); - cmd = new MenuCommand("${res:SharpDevelop.Refactoring.GoToBaseCommand}", GoToBase); - cmd.Tag = c; - list.Add(cmd); - } + // "Go to base" for classes is not that useful as it is faster to click the base class in the editor. + // Also, we have "Find base classes" which shows all base classes. +// if (c.BaseTypes.Count > 0) { +// list.Add(new MenuSeparator()); +// cmd = new MenuCommand("${res:SharpDevelop.Refactoring.GoToBaseCommand}", GoToBase); +// cmd.Tag = c; +// list.Add(cmd); +// } + + cmd = FindReferencesAndRenameHelper.MakeFindReferencesMenuCommand(FindReferences); + cmd.Tag = c; + list.Add(cmd); return list.ToArray(); } - void GoToBase(object sender, EventArgs e) + void FindReferences(object sender, EventArgs e) { MenuCommand item = (MenuCommand)sender; IClass c = (IClass)item.Tag; - IClass baseClass = c.BaseClass; - if (baseClass != null) { - string fileName = baseClass.CompilationUnit.FileName; - if (fileName != null) { - FileService.JumpToFilePosition(fileName, baseClass.Region.BeginLine, baseClass.Region.BeginColumn); - } - } + FindReferencesAndRenameHelper.RunFindReferences(c); } +// void GoToBase(object sender, EventArgs e) +// { +// MenuCommand item = (MenuCommand)sender; +// IClass c = (IClass)item.Tag; +// IClass baseClass = c.BaseClass; +// if (baseClass != null) { +// string fileName = baseClass.CompilationUnit.FileName; +// if (fileName != null) { +// FileService.JumpToFilePosition(fileName, baseClass.Region.BeginLine, baseClass.Region.BeginColumn); +// } +// } +// } + public static IClass GetClass(object menuOwner) { IClass c; diff --git a/src/Main/Base/Project/Src/Services/RefactoringService/RefactoringMenuBuilder.cs b/src/Main/Base/Project/Src/Services/RefactoringService/RefactoringMenuBuilder.cs index 8c780743b2..4bcab07136 100644 --- a/src/Main/Base/Project/Src/Services/RefactoringService/RefactoringMenuBuilder.cs +++ b/src/Main/Base/Project/Src/Services/RefactoringService/RefactoringMenuBuilder.cs @@ -55,57 +55,42 @@ namespace ICSharpCode.SharpDevelop.Refactoring { public ICollection BuildItems(Codon codon, object owner) { - MenuItem item; - ITextEditor textEditor = (ITextEditor)owner; if (string.IsNullOrEmpty(textEditor.FileName)) return new object[0]; List resultItems = new List(); - IDocument doc = textEditor.Document; - int caretLine = textEditor.Caret.Line; - // list of dotnet names that have definitions in this line List definitions = new List(); // Include menu for member that has been clicked on IExpressionFinder expressionFinder = ParserService.GetExpressionFinder(textEditor.FileName); - ExpressionResult expressionResult; - ResolveResult rr; - int insertIndex = resultItems.Count; // Insert items at this position to get the outermost expression first, followed by the inner expressions (if any). - expressionResult = FindFullExpressionAtCaret(textEditor, expressionFinder); - repeatResolve: - rr = ResolveExpressionAtCaret(textEditor, expressionResult); + ExpressionResult expressionResult = FindFullExpressionAtCaret(textEditor, expressionFinder); + + AddTopLevelItems(resultItems, textEditor, expressionResult, definitions, false); + + AddItemForCurrentClassAndMethod(resultItems, textEditor, expressionResult, definitions); + + if (resultItems.Count > 0) { + resultItems.Add(new Separator()); + } + + // TODO move to ClassBookmark RefactoringMenuContext context = new RefactoringMenuContext { Editor = textEditor, - ResolveResult = rr, + ResolveResult = ResolveExpressionAtCaret(textEditor, expressionResult), ExpressionResult = expressionResult }; - item = null; - - if (rr is MethodGroupResolveResult) { - item = MakeItem(definitions, ((MethodGroupResolveResult)rr).GetMethodIfSingleOverload()); - } else if (rr is MemberResolveResult) { - MemberResolveResult mrr = (MemberResolveResult)rr; - item = MakeItem(definitions, mrr.ResolvedMember); - if (RefactoringService.FixIndexerExpression(expressionFinder, ref expressionResult, mrr)) { - if (item != null) { - resultItems.Insert(insertIndex, item); - } - // Include menu for the underlying expression of the - // indexer expression as well. - goto repeatResolve; - } - } else if (rr is TypeResolveResult) { - item = MakeItem(definitions, ((TypeResolveResult)rr).ResolvedClass); - } else if (rr is LocalResolveResult) { - context.IsDefinition = caretLine == ((LocalResolveResult)rr).VariableDefinitionRegion.BeginLine; - item = MakeItem((LocalResolveResult)rr, context); - insertIndex = 0; // Insert local variable menu item at the topmost position. - } - if (item != null) { - resultItems.Insert(insertIndex, item); - } + AddContextItems(resultItems, context); + // end TODO move + return resultItems; + } + + void AddItemForCurrentClassAndMethod(List resultItems, ITextEditor textEditor, ExpressionResult expressionResult, List definitions) + { + ResolveResult rr = ResolveExpressionAtCaret(textEditor, expressionResult); + MenuItem item = null; + int caretLine = textEditor.Caret.Line; // Include menu for current class and method ICompilationUnit cu = null; IMember callingMember = null; @@ -128,14 +113,52 @@ namespace ICSharpCode.SharpDevelop.Refactoring resultItems.Add(item); } } + } + + void AddTopLevelItems(List resultItems, ITextEditor textEditor, ExpressionResult expressionResult, List definitions, bool addAsSubmenu) + { + // Insert items at this position to get the outermost expression first, followed by the inner expressions (if any). + int insertIndex = resultItems.Count; + ResolveResult rr = ResolveExpressionAtCaret(textEditor, expressionResult); + RefactoringMenuContext context = new RefactoringMenuContext { + Editor = textEditor, + ResolveResult = rr, + ExpressionResult = expressionResult + }; + MenuItem item = null; - if (resultItems.Count > 0) { - resultItems.Add(new Separator()); + if (rr is MethodGroupResolveResult) { + item = MakeItem(definitions, ((MethodGroupResolveResult)rr).GetMethodIfSingleOverload()); + } else if (rr is MemberResolveResult) { + MemberResolveResult mrr = (MemberResolveResult)rr; + item = MakeItem(definitions, mrr.ResolvedMember); + // Seems not to be needed, as AddItemForCurrentClassAndMethod works for indexer as well (martin.konicek) + /*if (RefactoringService.FixIndexerExpression(expressionFinder, ref expressionResult, mrr)) { + if (item != null) { + // Insert this member + resultItems.Insert(insertIndex, item); + } + // Include menu for the underlying expression of the + // indexer expression as well. + AddTopLevelItems(textEditor, expressionResult, true); + }*/ + } else if (rr is TypeResolveResult) { + item = MakeItem(definitions, ((TypeResolveResult)rr).ResolvedClass); + } else if (rr is LocalResolveResult) { + int caretLine = textEditor.Caret.Line; + context.IsDefinition = caretLine == ((LocalResolveResult)rr).VariableDefinitionRegion.BeginLine; + item = MakeItem((LocalResolveResult)rr, context); + insertIndex = 0; // Insert local variable menu item at the topmost position. + } + if (item != null) { + if (addAsSubmenu) { + resultItems.Insert(insertIndex, item); + } else { + foreach (object subItem in item.Items) { + resultItems.Add(subItem); + } + } } - - AddContextItems(resultItems, context); - - return resultItems; } #region AddTopLevelContextItems @@ -228,7 +251,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring MenuItem MakeItem(LocalResolveResult local, RefactoringMenuContext context) { Debug.Assert(local == context.ResolveResult); - MenuItem item = MakeItemInternal(local.VariableName, + MenuItem item = MakeItemWithGoToDefinition(local.VariableName, local.IsParameter ? ClassBrowserIconService.Parameter : ClassBrowserIconService.LocalVariable, local.CallingClass.CompilationUnit, context.IsDefinition ? DomRegion.Empty : local.VariableDefinitionRegion); @@ -248,7 +271,6 @@ namespace ICSharpCode.SharpDevelop.Refactoring MenuItem item = MakeItem(MemberNode.Create(member), member.DeclaringType.CompilationUnit, member.Region); MenuItem declaringType = MakeItem(null, member.DeclaringType); if (declaringType != null) { - item.Items.Add(new Separator()); declaringType.Header = StringParser.Parse("${res:SharpDevelop.Refactoring.DeclaringType}: ") + declaringType.Header; item.Items.Add(declaringType); } @@ -265,17 +287,11 @@ namespace ICSharpCode.SharpDevelop.Refactoring return MakeItem(new ClassNode((IProject)c.ProjectContent.Project, c), c.CompilationUnit, c.Region); } - MenuItem MakeItemInternal(string title, IImage image, ICompilationUnit cu, DomRegion region) + MenuItem MakeItemWithGoToDefinition(string title, IImage image, ICompilationUnit cu, DomRegion region) { MenuItem item = new MenuItem(); item.Header = title; item.Icon = image.CreateImage(); - - //ToolStripMenuItem titleItem = new ToolStripMenuItem(title); - //titleItem.Enabled = false; - //item.DropDown.Items.Add(titleItem); - //item.DropDown.Items.Add(new ToolStripSeparator()); - if (cu != null && cu.FileName != null && !region.IsEmpty) { MenuItem gotoDefinitionItem = new MenuItem(); gotoDefinitionItem.Header = MenuService.ConvertLabel(StringParser.Parse("${res:ICSharpCode.NAntAddIn.GotoDefinitionMenuLabel}")); @@ -285,14 +301,13 @@ namespace ICSharpCode.SharpDevelop.Refactoring FileService.JumpToFilePosition(cu.FileName, region.BeginLine, region.BeginColumn); }; item.Items.Add(gotoDefinitionItem); - item.Items.Add(new Separator()); } return item; } MenuItem MakeItem(ExtTreeNode classBrowserTreeNode, ICompilationUnit cu, DomRegion region) { - MenuItem item = MakeItemInternal(classBrowserTreeNode.Text, ClassBrowserIconService.GetImageByIndex(classBrowserTreeNode.ImageIndex), cu, region); + MenuItem item = MakeItemWithGoToDefinition(classBrowserTreeNode.Text, ClassBrowserIconService.GetImageByIndex(classBrowserTreeNode.ImageIndex), cu, region); foreach (object obj in MenuService.CreateMenuItems(null, classBrowserTreeNode, classBrowserTreeNode.ContextmenuAddinTreePath)) item.Items.Add(obj); return item;