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 @@ -60,30 +60,42 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands
List<ToolStripItem> list = new List<ToolStripItem>();
// 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;

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

@ -55,57 +55,42 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -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<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<string> definitions = new List<string>();
// 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<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
ICompilationUnit cu = null;
IMember callingMember = null;
@ -128,14 +113,52 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -128,14 +113,52 @@ namespace ICSharpCode.SharpDevelop.Refactoring
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) {
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 @@ -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 @@ -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 @@ -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 @@ -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;

Loading…
Cancel
Save