Browse Source

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
pull/1/head
Martin Koníček 16 years ago
parent
commit
f46f076fbc
  1. 42
      src/Main/Base/Project/Src/Editor/Commands/ClassBookmarkSubmenuBuilder.cs
  2. 123
      src/Main/Base/Project/Src/Services/RefactoringService/RefactoringMenuBuilder.cs

42
src/Main/Base/Project/Src/Editor/Commands/ClassBookmarkSubmenuBuilder.cs

@ -60,30 +60,42 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands
List<ToolStripItem> list = new List<ToolStripItem>(); List<ToolStripItem> list = new List<ToolStripItem>();
// navigation actions // "Go to base" for classes is not that useful as it is faster to click the base class in the editor.
if (c.BaseTypes.Count > 0) { // Also, we have "Find base classes" which shows all base classes.
list.Add(new MenuSeparator()); // if (c.BaseTypes.Count > 0) {
cmd = new MenuCommand("${res:SharpDevelop.Refactoring.GoToBaseCommand}", GoToBase); // list.Add(new MenuSeparator());
cmd.Tag = c; // cmd = new MenuCommand("${res:SharpDevelop.Refactoring.GoToBaseCommand}", GoToBase);
list.Add(cmd); // cmd.Tag = c;
} // list.Add(cmd);
// }
cmd = FindReferencesAndRenameHelper.MakeFindReferencesMenuCommand(FindReferences);
cmd.Tag = c;
list.Add(cmd);
return list.ToArray(); return list.ToArray();
} }
void GoToBase(object sender, EventArgs e) void FindReferences(object sender, EventArgs e)
{ {
MenuCommand item = (MenuCommand)sender; MenuCommand item = (MenuCommand)sender;
IClass c = (IClass)item.Tag; IClass c = (IClass)item.Tag;
IClass baseClass = c.BaseClass; FindReferencesAndRenameHelper.RunFindReferences(c);
if (baseClass != null) {
string fileName = baseClass.CompilationUnit.FileName;
if (fileName != null) {
FileService.JumpToFilePosition(fileName, baseClass.Region.BeginLine, baseClass.Region.BeginColumn);
}
}
} }
// 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) public static IClass GetClass(object menuOwner)
{ {
IClass c; IClass c;

123
src/Main/Base/Project/Src/Services/RefactoringService/RefactoringMenuBuilder.cs

@ -55,57 +55,42 @@ namespace ICSharpCode.SharpDevelop.Refactoring
{ {
public ICollection BuildItems(Codon codon, object owner) public ICollection BuildItems(Codon codon, object owner)
{ {
MenuItem item;
ITextEditor textEditor = (ITextEditor)owner; ITextEditor textEditor = (ITextEditor)owner;
if (string.IsNullOrEmpty(textEditor.FileName)) if (string.IsNullOrEmpty(textEditor.FileName))
return new object[0]; return new object[0];
List<object> resultItems = new List<object>(); List<object> resultItems = new List<object>();
IDocument doc = textEditor.Document;
int caretLine = textEditor.Caret.Line;
// list of dotnet names that have definitions in this line // list of dotnet names that have definitions in this line
List<string> definitions = new List<string>(); List<string> definitions = new List<string>();
// Include menu for member that has been clicked on // Include menu for member that has been clicked on
IExpressionFinder expressionFinder = ParserService.GetExpressionFinder(textEditor.FileName); IExpressionFinder expressionFinder = ParserService.GetExpressionFinder(textEditor.FileName);
ExpressionResult expressionResult; ExpressionResult expressionResult = FindFullExpressionAtCaret(textEditor, expressionFinder);
ResolveResult rr;
int insertIndex = resultItems.Count; // Insert items at this position to get the outermost expression first, followed by the inner expressions (if any). AddTopLevelItems(resultItems, textEditor, expressionResult, definitions, false);
expressionResult = FindFullExpressionAtCaret(textEditor, expressionFinder);
repeatResolve: AddItemForCurrentClassAndMethod(resultItems, textEditor, expressionResult, definitions);
rr = ResolveExpressionAtCaret(textEditor, expressionResult);
if (resultItems.Count > 0) {
resultItems.Add(new Separator());
}
// TODO move to ClassBookmark
RefactoringMenuContext context = new RefactoringMenuContext { RefactoringMenuContext context = new RefactoringMenuContext {
Editor = textEditor, Editor = textEditor,
ResolveResult = rr, ResolveResult = ResolveExpressionAtCaret(textEditor, expressionResult),
ExpressionResult = expressionResult ExpressionResult = expressionResult
}; };
item = null; AddContextItems(resultItems, context);
// end TODO move
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);
}
return resultItems;
}
void AddItemForCurrentClassAndMethod(List<object> resultItems, ITextEditor textEditor, ExpressionResult expressionResult, List<string> definitions)
{
ResolveResult rr = ResolveExpressionAtCaret(textEditor, expressionResult);
MenuItem item = null;
int caretLine = textEditor.Caret.Line;
// Include menu for current class and method // Include menu for current class and method
ICompilationUnit cu = null; ICompilationUnit cu = null;
IMember callingMember = null; IMember callingMember = null;
@ -128,14 +113,52 @@ namespace ICSharpCode.SharpDevelop.Refactoring
resultItems.Add(item); resultItems.Add(item);
} }
} }
}
void AddTopLevelItems(List<object> resultItems, ITextEditor textEditor, ExpressionResult expressionResult, List<string> 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) { if (rr is MethodGroupResolveResult) {
resultItems.Add(new Separator()); 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 #region AddTopLevelContextItems
@ -228,7 +251,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring
MenuItem MakeItem(LocalResolveResult local, RefactoringMenuContext context) MenuItem MakeItem(LocalResolveResult local, RefactoringMenuContext context)
{ {
Debug.Assert(local == context.ResolveResult); Debug.Assert(local == context.ResolveResult);
MenuItem item = MakeItemInternal(local.VariableName, MenuItem item = MakeItemWithGoToDefinition(local.VariableName,
local.IsParameter ? ClassBrowserIconService.Parameter : ClassBrowserIconService.LocalVariable, local.IsParameter ? ClassBrowserIconService.Parameter : ClassBrowserIconService.LocalVariable,
local.CallingClass.CompilationUnit, local.CallingClass.CompilationUnit,
context.IsDefinition ? DomRegion.Empty : local.VariableDefinitionRegion); 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 item = MakeItem(MemberNode.Create(member), member.DeclaringType.CompilationUnit, member.Region);
MenuItem declaringType = MakeItem(null, member.DeclaringType); MenuItem declaringType = MakeItem(null, member.DeclaringType);
if (declaringType != null) { if (declaringType != null) {
item.Items.Add(new Separator());
declaringType.Header = StringParser.Parse("${res:SharpDevelop.Refactoring.DeclaringType}: ") + declaringType.Header; declaringType.Header = StringParser.Parse("${res:SharpDevelop.Refactoring.DeclaringType}: ") + declaringType.Header;
item.Items.Add(declaringType); 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); 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(); MenuItem item = new MenuItem();
item.Header = title; item.Header = title;
item.Icon = image.CreateImage(); 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) { if (cu != null && cu.FileName != null && !region.IsEmpty) {
MenuItem gotoDefinitionItem = new MenuItem(); MenuItem gotoDefinitionItem = new MenuItem();
gotoDefinitionItem.Header = MenuService.ConvertLabel(StringParser.Parse("${res:ICSharpCode.NAntAddIn.GotoDefinitionMenuLabel}")); 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); FileService.JumpToFilePosition(cu.FileName, region.BeginLine, region.BeginColumn);
}; };
item.Items.Add(gotoDefinitionItem); item.Items.Add(gotoDefinitionItem);
item.Items.Add(new Separator());
} }
return item; return item;
} }
MenuItem MakeItem(ExtTreeNode classBrowserTreeNode, ICompilationUnit cu, DomRegion region) 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)) foreach (object obj in MenuService.CreateMenuItems(null, classBrowserTreeNode, classBrowserTreeNode.ContextmenuAddinTreePath))
item.Items.Add(obj); item.Items.Add(obj);
return item; return item;

Loading…
Cancel
Save