Browse Source
Currently, only "go to base class" is available for overridden methods, which jumps to the method that was overridden. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@146 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61shortcuts
16 changed files with 297 additions and 12 deletions
@ -0,0 +1,134 @@ |
|||||||
|
// <file>
|
||||||
|
// <copyright see="prj:///doc/copyright.txt"/>
|
||||||
|
// <license see="prj:///doc/license.txt"/>
|
||||||
|
// <owner name="Daniel Grunwald" email="daniel@danielgrunwald.de"/>
|
||||||
|
// <version value="$version"/>
|
||||||
|
// </file>
|
||||||
|
|
||||||
|
using System; |
||||||
|
using System.Collections.Generic; |
||||||
|
using System.Drawing; |
||||||
|
using System.Text; |
||||||
|
using System.Windows.Forms; |
||||||
|
using ICSharpCode.Core; |
||||||
|
using ICSharpCode.TextEditor; |
||||||
|
using ICSharpCode.TextEditor.Document; |
||||||
|
using ICSharpCode.SharpDevelop.Dom; |
||||||
|
using ICSharpCode.SharpDevelop.Bookmarks; |
||||||
|
|
||||||
|
namespace ICSharpCode.SharpDevelop.Commands |
||||||
|
{ |
||||||
|
/// <summary>
|
||||||
|
/// Build context menu for class members in the text editor.
|
||||||
|
/// </summary>
|
||||||
|
public class ClassMemberMenuBuilder : ISubmenuBuilder |
||||||
|
{ |
||||||
|
public ToolStripItem[] BuildSubmenu(Codon codon, object owner) |
||||||
|
{ |
||||||
|
MenuCommand cmd; |
||||||
|
ClassMemberBookmark bookmark = (ClassMemberBookmark)owner; |
||||||
|
IMember member = bookmark.Member; |
||||||
|
List<ToolStripItem> list = new List<ToolStripItem>(); |
||||||
|
|
||||||
|
cmd = new MenuCommand("&Rename", Rename); |
||||||
|
cmd.Tag = member; |
||||||
|
list.Add(cmd); |
||||||
|
|
||||||
|
if (member.IsOverride) { |
||||||
|
cmd = new MenuCommand("Go to &base class", GoToBase); |
||||||
|
cmd.Tag = member; |
||||||
|
list.Add(cmd); |
||||||
|
} |
||||||
|
if (member.IsVirtual || member.IsAbstract || (member.IsOverride && !member.DeclaringType.IsSealed)) { |
||||||
|
cmd = new MenuCommand("Find &overrides", FindOverrides); |
||||||
|
cmd.Tag = member; |
||||||
|
list.Add(cmd); |
||||||
|
} |
||||||
|
|
||||||
|
cmd = new MenuCommand("&Find references", FindReferences); |
||||||
|
cmd.Tag = member; |
||||||
|
list.Add(cmd); |
||||||
|
|
||||||
|
return list.ToArray(); |
||||||
|
} |
||||||
|
|
||||||
|
#region GoToBase
|
||||||
|
void GoToBase(object sender, EventArgs e) |
||||||
|
{ |
||||||
|
MenuCommand item = (MenuCommand)sender; |
||||||
|
IMember member = (IMember)item.Tag; |
||||||
|
IMember baseMember = FindBaseMember(member); |
||||||
|
if (baseMember != null) { |
||||||
|
ICompilationUnit cu = baseMember.DeclaringType.CompilationUnit; |
||||||
|
if (cu != null) { |
||||||
|
string fileName = cu.FileName; |
||||||
|
if (fileName != null) { |
||||||
|
if (baseMember.Region != null && baseMember.Region.BeginLine > 0) { |
||||||
|
FileService.JumpToFilePosition(fileName, baseMember.Region.BeginLine - 1, 0); |
||||||
|
} else { |
||||||
|
FileService.JumpToFilePosition(fileName, 0, 0); |
||||||
|
} |
||||||
|
return; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
IMember FindBaseMember(IMember member) |
||||||
|
{ |
||||||
|
IClass parentClass = member.DeclaringType; |
||||||
|
IClass baseClass = parentClass.BaseClass; |
||||||
|
if (baseClass == null) return null; |
||||||
|
if (member is IMethod) { |
||||||
|
IMethod parentMethod = (IMethod)member; |
||||||
|
foreach (IClass childClass in baseClass.ClassInheritanceTree) { |
||||||
|
foreach (IMethod m in childClass.Methods) { |
||||||
|
if (string.Equals(parentMethod.Name, m.Name, StringComparison.InvariantCultureIgnoreCase)) { |
||||||
|
if (m.IsStatic == parentMethod.IsStatic) { |
||||||
|
if (DiffUtility.Compare(parentMethod.Parameters, m.Parameters) == 0) { |
||||||
|
return m; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} else if (member is IProperty) { |
||||||
|
IProperty parentMethod = (IProperty)member; |
||||||
|
foreach (IClass childClass in baseClass.ClassInheritanceTree) { |
||||||
|
foreach (IProperty m in childClass.Properties) { |
||||||
|
if (string.Equals(parentMethod.Name, m.Name, StringComparison.InvariantCultureIgnoreCase)) { |
||||||
|
if (m.IsStatic == parentMethod.IsStatic) { |
||||||
|
if (DiffUtility.Compare(parentMethod.Parameters, m.Parameters) == 0) { |
||||||
|
return m; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
return null; |
||||||
|
} |
||||||
|
#endregion
|
||||||
|
|
||||||
|
void Rename(object sender, EventArgs e) |
||||||
|
{ |
||||||
|
MenuCommand item = (MenuCommand)sender; |
||||||
|
IMember member = (IMember)item.Tag; |
||||||
|
MessageService.ShowMessage("Not implemented."); |
||||||
|
} |
||||||
|
|
||||||
|
void FindOverrides(object sender, EventArgs e) |
||||||
|
{ |
||||||
|
MenuCommand item = (MenuCommand)sender; |
||||||
|
IMember member = (IMember)item.Tag; |
||||||
|
MessageService.ShowMessage("Not implemented."); |
||||||
|
} |
||||||
|
|
||||||
|
void FindReferences(object sender, EventArgs e) |
||||||
|
{ |
||||||
|
MenuCommand item = (MenuCommand)sender; |
||||||
|
IMember member = (IMember)item.Tag; |
||||||
|
MessageService.ShowMessage("Not implemented."); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,82 @@ |
|||||||
|
// <file>
|
||||||
|
// <copyright see="prj:///doc/copyright.txt"/>
|
||||||
|
// <license see="prj:///doc/license.txt"/>
|
||||||
|
// <owner name="Daniel Grunwald" email="daniel@danielgrunwald.de"/>
|
||||||
|
// <version value="$version"/>
|
||||||
|
// </file>
|
||||||
|
|
||||||
|
using System; |
||||||
|
using System.Collections; |
||||||
|
using System.Collections.Generic; |
||||||
|
using System.Drawing; |
||||||
|
using System.Text; |
||||||
|
using System.Windows.Forms; |
||||||
|
using ICSharpCode.Core; |
||||||
|
using ICSharpCode.TextEditor; |
||||||
|
using ICSharpCode.TextEditor.Document; |
||||||
|
using ICSharpCode.SharpDevelop.Dom; |
||||||
|
|
||||||
|
namespace ICSharpCode.SharpDevelop.Bookmarks |
||||||
|
{ |
||||||
|
/// <summary>
|
||||||
|
/// Bookmark used to give additional operations for class members.
|
||||||
|
/// Does not derive from SDBookmark because it is not stored in the central BookmarkManager,
|
||||||
|
/// but only in the document's BookmarkManager.
|
||||||
|
/// </summary>
|
||||||
|
public class ClassMemberBookmark : Bookmark |
||||||
|
{ |
||||||
|
IMember member; |
||||||
|
|
||||||
|
public IMember Member { |
||||||
|
get { |
||||||
|
return member; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public ClassMemberBookmark(IDocument document, IMember member) |
||||||
|
: base(document, member.Region.BeginLine - 1) |
||||||
|
{ |
||||||
|
this.member = member; |
||||||
|
} |
||||||
|
|
||||||
|
public override void Click(Control parent, MouseEventArgs e) |
||||||
|
{ |
||||||
|
MenuService.ShowContextMenu(this, "/SharpDevelop/ViewContent/DefaultTextEditor/ClassMemberContextMenu", parent, e.X, e.Y); |
||||||
|
} |
||||||
|
|
||||||
|
protected void DrawIcon(int iconIndex, Graphics g, Point p) |
||||||
|
{ |
||||||
|
g.DrawImageUnscaled(ClassBrowserIconService.ImageList.Images[iconIndex], p); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public class PropertyBookmark : ClassMemberBookmark |
||||||
|
{ |
||||||
|
IProperty property; |
||||||
|
|
||||||
|
public PropertyBookmark(IDocument document, IProperty property) : base(document, property) |
||||||
|
{ |
||||||
|
this.property = property; |
||||||
|
} |
||||||
|
|
||||||
|
public override void Draw(IconBarMargin margin, Graphics g, Point p) |
||||||
|
{ |
||||||
|
DrawIcon(ClassBrowserIconService.GetIcon(property), g, p); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public class MethodBookmark : ClassMemberBookmark |
||||||
|
{ |
||||||
|
IMethod method; |
||||||
|
|
||||||
|
public MethodBookmark(IDocument document, IMethod method) : base(document, method) |
||||||
|
{ |
||||||
|
this.method = method; |
||||||
|
} |
||||||
|
|
||||||
|
public override void Draw(IconBarMargin margin, Graphics g, Point p) |
||||||
|
{ |
||||||
|
DrawIcon(ClassBrowserIconService.GetIcon(method), g, p); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
Loading…
Reference in new issue