#develop (short for SharpDevelop) is a free IDE for .NET programming languages.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

205 lines
7.0 KiB

// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Windows.Forms;
using ICSharpCode.Core;
using ICSharpCode.Core.Presentation;
using ICSharpCode.Core.WinForms;
using ICSharpCode.NRefactory;
using ICSharpCode.SharpDevelop.Bookmarks;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Dom.Refactoring;
using ICSharpCode.SharpDevelop.Editor;
using ICSharpCode.SharpDevelop.Editor.Search;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Gui.ClassBrowser;
using ICSharpCode.SharpDevelop.Refactoring;
namespace ICSharpCode.SharpDevelop.Editor.Commands
{
/// <summary>
/// Build context menu for class members in the text editor.
/// </summary>
public class ClassMemberMenuBuilder : ISubmenuBuilder, IMenuItemBuilder
{
public System.Collections.ICollection BuildItems(Codon codon, object owner)
{
return BuildSubmenu(codon, owner).TranslateToWpf();
}
public ToolStripItem[] BuildSubmenu(Codon codon, object owner)
{
MenuCommand cmd;
IMember member;
MemberNode memberNode = owner as MemberNode;
if (memberNode != null) {
member = memberNode.Member;
} else {
ClassMemberBookmark bookmark = (ClassMemberBookmark)owner;
member = bookmark.Member;
}
IMethod method = member as IMethod;
List<ToolStripItem> list = new List<ToolStripItem>();
bool canGenerateCode =
member.DeclaringType.ProjectContent.Language.CodeGenerator != null
&& !FindReferencesAndRenameHelper.IsReadOnly(member.DeclaringType);
if (method == null || !method.IsConstructor && !method.IsOperator) {
if (!FindReferencesAndRenameHelper.IsReadOnly(member.DeclaringType) &&
!(member is IProperty && ((IProperty)member).IsIndexer)) {
cmd = new MenuCommand("${res:SharpDevelop.Refactoring.RenameCommand}", Rename);
cmd.ShortcutKeys = Keys.Control | Keys.R;
cmd.Tag = member;
list.Add(cmd);
}
}
if (member != null && member.IsOverride) {
cmd = new MenuCommand("${res:SharpDevelop.Refactoring.GoToBaseClassCommand}", GoToBase);
cmd.Tag = member;
list.Add(cmd);
}
cmd = new MenuCommand("${res:SharpDevelop.Refactoring.FindReferencesCommand}", FindReferences);
cmd.ShortcutKeys = Keys.F12;
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) {
cmd = new MenuCommand("${res:SharpDevelop.Refactoring.GoToProperty}", GotoTagMember);
cmd.Tag = foundProperty;
list.Add(cmd);
} else {
if (canGenerateCode) {
if (member.IsReadonly) {
cmd = new MenuCommand("${res:SharpDevelop.Refactoring.CreateProperty}", CreateGetter);
cmd.Tag = member;
list.Add(cmd);
} else {
cmd = new MenuCommand("${res:SharpDevelop.Refactoring.CreateGetter}", CreateGetter);
cmd.Tag = member;
list.Add(cmd);
cmd = new MenuCommand("${res:SharpDevelop.Refactoring.CreateProperty}", CreateProperty);
cmd.Tag = member;
list.Add(cmd);
}
}
}
}
if (member is IProperty) {
IProperty property = member as IProperty;
if (property.CanSet && canGenerateCode && !property.IsAbstract && property.DeclaringType.ClassType != ClassType.Interface) {
cmd = new MenuCommand("${res:SharpDevelop.Refactoring.CreateChangedEvent}", CreateChangedEvent);
cmd.Tag = member;
list.Add(cmd);
}
}
if (member is IEvent) {
if (canGenerateCode && !member.IsAbstract && member.DeclaringType.ClassType != ClassType.Interface) {
cmd = new MenuCommand("${res:SharpDevelop.Refactoring.CreateOnEventMethod}", CreateOnEventMethod);
cmd.Tag = member;
list.Add(cmd);
}
}
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);
}
void CreateGetter(object sender, EventArgs e)
{
CreateProperty(sender, e, false);
}
void CreateProperty(object sender, EventArgs e, bool includeSetter)
{
MenuCommand item = (MenuCommand)sender;
IField member = (IField)item.Tag;
ITextEditor textEditor = FindReferencesAndRenameHelper.JumpBehindDefinition(member);
if (textEditor != null) {
CodeGenerator codeGen = member.DeclaringType.ProjectContent.Language.CodeGenerator;
codeGen.InsertCodeAfter(member, new RefactoringDocumentAdapter(textEditor.Document),
codeGen.CreateProperty(member, true, includeSetter));
ParserService.ParseCurrentViewContent();
}
}
void CreateChangedEvent(object sender, EventArgs e)
{
MenuCommand item = (MenuCommand)sender;
IProperty member = (IProperty)item.Tag;
ITextEditor textEditor = FindReferencesAndRenameHelper.JumpBehindDefinition(member);
if (textEditor != null) {
member.DeclaringType.ProjectContent.Language.CodeGenerator.CreateChangedEvent(member, new RefactoringDocumentAdapter(textEditor.Document));
ParserService.ParseCurrentViewContent();
}
}
void CreateOnEventMethod(object sender, EventArgs e)
{
MenuCommand item = (MenuCommand)sender;
IEvent member = (IEvent)item.Tag;
ITextEditor textEditor = FindReferencesAndRenameHelper.JumpBehindDefinition(member);
if (textEditor != null) {
CodeGenerator codeGen = member.DeclaringType.ProjectContent.Language.CodeGenerator;
codeGen.InsertCodeAfter(member, new RefactoringDocumentAdapter(textEditor.Document),
codeGen.CreateOnEventMethod(member));
ParserService.ParseCurrentViewContent();
}
}
void GotoTagMember(object sender, EventArgs e)
{
FindReferencesAndRenameHelper.JumpToDefinition((IMember)(sender as MenuCommand).Tag);
}
void GoToBase(object sender, EventArgs e)
{
MenuCommand item = (MenuCommand)sender;
IMember member = (IMember)item.Tag;
IMember baseMember = MemberLookupHelper.FindBaseMember(member);
if (baseMember != null) {
FindReferencesAndRenameHelper.JumpToDefinition(baseMember);
}
}
void Rename(object sender, EventArgs e)
{
MenuCommand item = (MenuCommand)sender;
FindReferencesAndRenameHelper.RenameMember((IMember)item.Tag);
}
void FindReferences(object sender, EventArgs e)
{
MenuCommand item = (MenuCommand)sender;
IMember member = (IMember)item.Tag;
FindReferencesAndRenameHelper.RunFindReferences(member);
}
}
}