Browse Source

Moved "Find derived classes", "Find base classes", "Find overrides" to Class/Member menu builders, where they logically belong. Now they are available also in class browser.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@6334 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
pull/1/head
Martin Koníček 16 years ago
parent
commit
2dfc2946aa
  1. 27
      src/Main/Base/Project/Src/Editor/Commands/ClassBookmarkSubmenuBuilder.cs
  2. 15
      src/Main/Base/Project/Src/Editor/Commands/ClassMemberMenuBuilder.cs
  3. 2
      src/Main/Base/Project/Src/Editor/Commands/FindBaseClasses.cs
  4. 16
      src/Main/Base/Project/Src/Editor/Commands/FindDerivedClassesOrOverrides.cs
  5. 20
      src/Main/Base/Project/Src/Services/RefactoringService/ContextActions/ContextActionsPopup.cs
  6. 129
      src/Main/Base/Project/Src/Services/RefactoringService/RefactoringMenuBuilder.cs

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

@ -72,6 +72,8 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands @@ -72,6 +72,8 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands
cmd = FindReferencesAndRenameHelper.MakeFindReferencesMenuCommand(FindReferences);
cmd.Tag = c;
list.Add(cmd);
list.AddIfNotNull(MakeFindBaseClassesItem(c));
list.AddIfNotNull(MakeFindDerivedClassesItem(c));
return list.ToArray();
}
@ -83,6 +85,31 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands @@ -83,6 +85,31 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands
FindReferencesAndRenameHelper.RunFindReferences(c);
}
MenuCommand MakeFindDerivedClassesItem(IClass baseClass)
{
if (baseClass == null || baseClass.IsStatic || baseClass.IsSealed)
return null;
var item = new MenuCommand(StringParser.Parse("${res:SharpDevelop.Refactoring.FindDerivedClassesCommand}"));
item.ShortcutKeys = System.Windows.Forms.Keys.F6;
//item.Image = ClassBrowserIconService.Class.Bitmap;
item.Click += delegate {
ContextActionsHelper.MakePopupWithDerivedClasses(baseClass).OpenAtCaretAndFocus();
};
return item;
}
MenuCommand MakeFindBaseClassesItem(IClass @class)
{
if (@class == null || @class.BaseTypes == null || @class.BaseTypes.Count == 0)
return null;
var item = new MenuCommand(StringParser.Parse("${res:SharpDevelop.Refactoring.FindBaseClassesCommand}"));
//item.Image = ClassBrowserIconService.Class.Bitmap;
item.Click += delegate {
ContextActionsHelper.MakePopupWithBaseClasses(@class).OpenAtCaretAndFocus();
};
return item;
}
// void GoToBase(object sender, EventArgs e)
// {
// MenuCommand item = (MenuCommand)sender;

15
src/Main/Base/Project/Src/Editor/Commands/ClassMemberMenuBuilder.cs

@ -71,6 +71,8 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands @@ -71,6 +71,8 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands
cmd.Tag = member;
list.Add(cmd);
list.AddIfNotNull(MakeFindOverridesItem(member));
if (member is IField && member.DeclaringType.ClassType != ClassType.Enum) {
IProperty foundProperty = FindReferencesAndRenameHelper.FindProperty(member as IField);
if (foundProperty != null) {
@ -113,6 +115,19 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands @@ -113,6 +115,19 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands
return list.ToArray();
}
MenuCommand MakeFindOverridesItem(IMember member)
{
if (member == null || !member.IsOverridable)
return null;
var item = new MenuCommand(StringParser.Parse("${res:SharpDevelop.Refactoring.FindOverridesCommand}"));
//item.Image = ClassBrowserIconService.Method.Bitmap;
item.ShortcutKeys = Keys.F6;
item.Click += delegate {
ContextActionsHelper.MakePopupWithOverrides(member).OpenAtCaretAndFocus();
};
return item;
}
void CreateProperty(object sender, EventArgs e)
{
CreateProperty(sender, e, true);

2
src/Main/Base/Project/Src/Editor/Commands/FindBaseClasses.cs

@ -21,7 +21,7 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands @@ -21,7 +21,7 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands
var classUnderCaret = GetClass(symbol);
if (classUnderCaret != null)
{
ContextActionsHelper.MakePopupWithBaseClasses(classUnderCaret).OpenAtCaretAndFocus(editor);
ContextActionsHelper.MakePopupWithBaseClasses(classUnderCaret).OpenAtCaretAndFocus();
return;
}
MessageService.ShowError("${res:ICSharpCode.Refactoring.NoClassUnderCursorError}");

16
src/Main/Base/Project/Src/Editor/Commands/FindDerivedClassesOrOverrides.cs

@ -7,6 +7,7 @@ @@ -7,6 +7,7 @@
using System;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Refactoring;
namespace ICSharpCode.SharpDevelop.Editor.Commands
@ -20,16 +21,27 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands @@ -20,16 +21,27 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands
{
var classUnderCaret = GetClass(symbol);
if (classUnderCaret != null) {
ContextActionsHelper.MakePopupWithDerivedClasses(classUnderCaret).OpenAtCaretAndFocus(editor);
ContextActionsHelper.MakePopupWithDerivedClasses(classUnderCaret).OpenAtCaretAndFocus();
return;
}
var memberUnderCaret = GetMember(symbol);
if (memberUnderCaret != null && memberUnderCaret.IsOverridable)
{
ContextActionsHelper.MakePopupWithOverrides(memberUnderCaret).OpenAtCaretAndFocus(editor);
ContextActionsHelper.MakePopupWithOverrides(memberUnderCaret).OpenAtCaretAndFocus();
return;
}
MessageService.ShowError("${res:ICSharpCode.Refactoring.NoClassOrOverridableSymbolUnderCursorError}");
}
// TODO
// public override bool IsEnabled {
// get {
// WorkbenchSingleton.Workbench.ActiveViewContent.
// var symbol = ParserService.Resolve(
// var classUnderCaret = GetClass(symbol);
// if (classUnderCaret !=
// }
// set { base.IsEnabled = value; }
// }
}
}

20
src/Main/Base/Project/Src/Services/RefactoringService/ContextActions/ContextActionsPopup.cs

@ -67,9 +67,10 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -67,9 +67,10 @@ namespace ICSharpCode.SharpDevelop.Refactoring
this.IsOpen = false;
}
public void OpenAtCaretAndFocus(ITextEditor editor)
public void OpenAtCaretAndFocus()
{
OpenAtPosition(editor, editor.Caret.Line, editor.Caret.Column, true);
OpenAtMousePosition();
//OpenAtPosition(editor, editor.Caret.Line, editor.Caret.Column, true);
this.Focus();
}
@ -79,9 +80,15 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -79,9 +80,15 @@ namespace ICSharpCode.SharpDevelop.Refactoring
this.VerticalOffset -= 16;
}
void OpenAtMousePosition()
{
this.Placement = PlacementMode.MousePoint;
this.Open();
}
void OpenAtPosition(ITextEditor editor, int line, int column, bool openAtWordStart)
{
var editorUIService = editor.GetService(typeof(IEditorUIService)) as IEditorUIService;
var editorUIService = editor == null ? null : editor.GetService(typeof(IEditorUIService)) as IEditorUIService;
if (editorUIService != null) {
var document = editor.Document;
int offset = document.PositionToOffset(line, column);
@ -102,13 +109,12 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -102,13 +109,12 @@ namespace ICSharpCode.SharpDevelop.Refactoring
}
catch
{
this.HorizontalOffset = 200;
this.VerticalOffset = 200;
this.Placement = PlacementMode.MousePoint;
}
} else {
this.HorizontalOffset = 200;
this.VerticalOffset = 200;
// if no editor information, open at mouse positions
this.Placement = PlacementMode.MousePoint;
}
this.Open();
}

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

@ -73,48 +73,9 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -73,48 +73,9 @@ namespace ICSharpCode.SharpDevelop.Refactoring
if (resultItems.Count > 0) {
resultItems.Add(new Separator());
}
// TODO move to ClassBookmark
RefactoringMenuContext context = new RefactoringMenuContext {
Editor = textEditor,
ResolveResult = ResolveExpressionAtCaret(textEditor, expressionResult),
ExpressionResult = expressionResult
};
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;
if (rr != null && rr.CallingMember != null) {
callingMember = rr.CallingMember;
} else {
ParseInformation parseInfo = ParserService.GetParseInformation(textEditor.FileName);
if (parseInfo != null) {
cu = parseInfo.CompilationUnit;
if (cu != null) {
IClass callingClass = cu.GetInnermostClass(caretLine, textEditor.Caret.Column);
callingMember = GetCallingMember(callingClass, caretLine, textEditor.Caret.Column);
}
}
}
if (callingMember != null) {
item = MakeItem(definitions, callingMember);
if (item != null) {
item.Header = StringParser.Parse("${res:SharpDevelop.Refactoring.CurrentMethod}: ") + callingMember.Name;
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).
@ -132,7 +93,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -132,7 +93,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring
} 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)
// Seems not to be needed, as AddItemForCurrentClassAndMethod works for indexer as well (martinkonicek)
/*if (RefactoringService.FixIndexerExpression(expressionFinder, ref expressionResult, mrr)) {
if (item != null) {
// Insert this member
@ -161,75 +122,35 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -161,75 +122,35 @@ namespace ICSharpCode.SharpDevelop.Refactoring
}
}
#region AddTopLevelContextItems
/// <summary>
/// Adds top-level context items like "Go to definition", "Find references", "Find derived classes", "Find overrides"
/// </summary>
void AddContextItems(List<object> resultItems, RefactoringMenuContext context)
{
var contextItems = MakeContextItems(context);
resultItems.AddRange(contextItems);
if (contextItems.Count > 0)
resultItems.Add(new Separator());
}
List<object> MakeContextItems(RefactoringMenuContext context)
void AddItemForCurrentClassAndMethod(List<object> resultItems, ITextEditor textEditor, ExpressionResult expressionResult, List<string> definitions)
{
var contextItems = new List<object>();
if (context.ResolveResult is TypeResolveResult) {
var clickedClass = ((TypeResolveResult)context.ResolveResult).ResolvedClass;
contextItems.AddIfNotNull(MakeFindDerivedClassesItem(clickedClass, context));
contextItems.AddIfNotNull(MakeFindBaseClassesItem(clickedClass, context));
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;
if (rr != null && rr.CallingMember != null) {
callingMember = rr.CallingMember;
} else {
ParseInformation parseInfo = ParserService.GetParseInformation(textEditor.FileName);
if (parseInfo != null) {
cu = parseInfo.CompilationUnit;
if (cu != null) {
IClass callingClass = cu.GetInnermostClass(caretLine, textEditor.Caret.Column);
callingMember = GetCallingMember(callingClass, caretLine, textEditor.Caret.Column);
}
}
}
if (context.ResolveResult is MemberResolveResult) {
IMember member = ((MemberResolveResult)context.ResolveResult).ResolvedMember as IMember;
contextItems.AddIfNotNull(MakeFindOverridesItem(member, context));
if (callingMember != null) {
item = MakeItem(definitions, callingMember);
if (item != null) {
item.Header = StringParser.Parse("${res:SharpDevelop.Refactoring.CurrentMethod}: ") + callingMember.Name;
resultItems.Add(item);
}
}
return contextItems;
}
MenuItem MakeFindDerivedClassesItem(IClass baseClass, RefactoringMenuContext context)
{
if (baseClass == null || baseClass.IsStatic || baseClass.IsSealed)
return null;
var item = new MenuItem { Header = MenuService.ConvertLabel(StringParser.Parse("${res:SharpDevelop.Refactoring.FindDerivedClassesCommand}")) };
item.Icon = ClassBrowserIconService.Class.CreateImage();
item.InputGestureText = new KeyGesture(Key.F6).GetDisplayStringForCulture(Thread.CurrentThread.CurrentUICulture);
item.Click += delegate {
ContextActionsHelper.MakePopupWithDerivedClasses(baseClass).OpenAtCaretAndFocus(context.Editor);
};
return item;
}
MenuItem MakeFindBaseClassesItem(IClass @class, RefactoringMenuContext context)
{
if (@class == null || @class.BaseTypes == null || @class.BaseTypes.Count == 0)
return null;
var item = new MenuItem { Header = MenuService.ConvertLabel("${res:SharpDevelop.Refactoring.FindBaseClassesCommand}") };
item.Icon = ClassBrowserIconService.Interface.CreateImage();
//item.InputGestureText = new KeyGesture(Key.F10).GetDisplayStringForCulture(Thread.CurrentThread.CurrentUICulture);
item.Click += delegate {
ContextActionsHelper.MakePopupWithBaseClasses(@class).OpenAtCaretAndFocus(context.Editor);
};
return item;
}
MenuItem MakeFindOverridesItem(IMember member, RefactoringMenuContext context)
{
if (member == null || !member.IsOverridable)
return null;
var item = new MenuItem { Header = MenuService.ConvertLabel(StringParser.Parse("${res:SharpDevelop.Refactoring.FindOverridesCommand}")) };
item.Icon = ClassBrowserIconService.Method.CreateImage();
item.InputGestureText = new KeyGesture(Key.F6).GetDisplayStringForCulture(Thread.CurrentThread.CurrentUICulture);
item.Click += delegate {
ContextActionsHelper.MakePopupWithOverrides(member).OpenAtCaretAndFocus(context.Editor);
};
return item;
}
#endregion
IMember GetCallingMember(IClass callingClass, int caretLine, int caretColumn)
{
if (callingClass == null) {

Loading…
Cancel
Save