|
|
@ -5,17 +5,20 @@ |
|
|
|
// <version>$Revision$</version>
|
|
|
|
// <version>$Revision$</version>
|
|
|
|
// </file>
|
|
|
|
// </file>
|
|
|
|
|
|
|
|
|
|
|
|
using ICSharpCode.SharpDevelop.Editor; |
|
|
|
|
|
|
|
using System; |
|
|
|
using System; |
|
|
|
|
|
|
|
using System.Collections; |
|
|
|
using System.Collections.Generic; |
|
|
|
using System.Collections.Generic; |
|
|
|
using System.Diagnostics; |
|
|
|
using System.Diagnostics; |
|
|
|
using System.Linq; |
|
|
|
using System.Linq; |
|
|
|
using System.Windows.Forms; |
|
|
|
using System.Threading; |
|
|
|
|
|
|
|
using System.Windows.Controls; |
|
|
|
|
|
|
|
using System.Windows.Input; |
|
|
|
|
|
|
|
|
|
|
|
using ICSharpCode.Core; |
|
|
|
using ICSharpCode.Core; |
|
|
|
using ICSharpCode.Core.WinForms; |
|
|
|
using ICSharpCode.Core.Presentation; |
|
|
|
using ICSharpCode.SharpDevelop.Bookmarks; |
|
|
|
using ICSharpCode.SharpDevelop.Bookmarks; |
|
|
|
using ICSharpCode.SharpDevelop.Dom; |
|
|
|
using ICSharpCode.SharpDevelop.Dom; |
|
|
|
using ICSharpCode.SharpDevelop.Dom.Refactoring; |
|
|
|
using ICSharpCode.SharpDevelop.Editor; |
|
|
|
using ICSharpCode.SharpDevelop.Gui; |
|
|
|
using ICSharpCode.SharpDevelop.Gui; |
|
|
|
using ICSharpCode.SharpDevelop.Gui.ClassBrowser; |
|
|
|
using ICSharpCode.SharpDevelop.Gui.ClassBrowser; |
|
|
|
using ICSharpCode.SharpDevelop.Project; |
|
|
|
using ICSharpCode.SharpDevelop.Project; |
|
|
@ -33,16 +36,16 @@ namespace ICSharpCode.SharpDevelop.Refactoring |
|
|
|
/// <summary>
|
|
|
|
/// <summary>
|
|
|
|
/// Build a menu with refactoring commands for the item that has been clicked on in the text editor.
|
|
|
|
/// Build a menu with refactoring commands for the item that has been clicked on in the text editor.
|
|
|
|
/// </summary>
|
|
|
|
/// </summary>
|
|
|
|
public class RefactoringMenuBuilder : ISubmenuBuilder |
|
|
|
public class RefactoringMenuBuilder : IMenuItemBuilder |
|
|
|
{ |
|
|
|
{ |
|
|
|
public ToolStripItem[] BuildSubmenu(Codon codon, object owner) |
|
|
|
public ICollection BuildItems(Codon codon, object owner) |
|
|
|
{ |
|
|
|
{ |
|
|
|
ToolStripMenuItem item; |
|
|
|
MenuItem item; |
|
|
|
|
|
|
|
|
|
|
|
ITextEditor textEditor = (ITextEditor)owner; |
|
|
|
ITextEditor textEditor = (ITextEditor)owner; |
|
|
|
if (string.IsNullOrEmpty(textEditor.FileName)) |
|
|
|
if (string.IsNullOrEmpty(textEditor.FileName)) |
|
|
|
return new ToolStripItem[0]; |
|
|
|
return new object[0]; |
|
|
|
List<ToolStripItem> resultItems = new List<ToolStripItem>(); |
|
|
|
List<object> resultItems = new List<object>(); |
|
|
|
IDocument doc = textEditor.Document; |
|
|
|
IDocument doc = textEditor.Document; |
|
|
|
int caretLine = textEditor.Caret.Line; |
|
|
|
int caretLine = textEditor.Caret.Line; |
|
|
|
IBookmarkMargin bookmarkMargin = textEditor.GetService(typeof(IBookmarkMargin)) as IBookmarkMargin; |
|
|
|
IBookmarkMargin bookmarkMargin = textEditor.GetService(typeof(IBookmarkMargin)) as IBookmarkMargin; |
|
|
@ -62,9 +65,11 @@ namespace ICSharpCode.SharpDevelop.Refactoring |
|
|
|
IClass type = null; |
|
|
|
IClass type = null; |
|
|
|
if (cmb != null) { |
|
|
|
if (cmb != null) { |
|
|
|
definitions.Add(cmb.Member.DotNetName); |
|
|
|
definitions.Add(cmb.Member.DotNetName); |
|
|
|
item = new ToolStripMenuItem(MemberNode.GetText(cmb.Member), |
|
|
|
item = new MenuItem { |
|
|
|
cmb.Image.Bitmap); |
|
|
|
Header = MemberNode.GetText(cmb.Member), |
|
|
|
MenuService.AddItemsToMenu(item.DropDown.Items, mark, ClassMemberBookmark.ContextMenuPath); |
|
|
|
Icon = cmb.Image.ImageSource, |
|
|
|
|
|
|
|
ItemsSource = MenuService.CreateMenuItems(null, mark, ClassMemberBookmark.ContextMenuPath) |
|
|
|
|
|
|
|
}; |
|
|
|
resultItems.Add(item); |
|
|
|
resultItems.Add(item); |
|
|
|
type = cmb.Member.DeclaringType; |
|
|
|
type = cmb.Member.DeclaringType; |
|
|
|
} else if (cb != null) { |
|
|
|
} else if (cb != null) { |
|
|
@ -72,10 +77,13 @@ namespace ICSharpCode.SharpDevelop.Refactoring |
|
|
|
} |
|
|
|
} |
|
|
|
if (type != null) { |
|
|
|
if (type != null) { |
|
|
|
definitions.Add(type.DotNetName); |
|
|
|
definitions.Add(type.DotNetName); |
|
|
|
item = new ToolStripMenuItem(ClassNode.GetText(type), ClassBrowserIconService.GetIcon(type).Bitmap); |
|
|
|
item = new MenuItem { |
|
|
|
MenuService.AddItemsToMenu(item.DropDown.Items, |
|
|
|
Header = ClassNode.GetText(type), |
|
|
|
cb ?? new ClassBookmark(type), |
|
|
|
Icon = ClassBrowserIconService.GetIcon(type).ImageSource, |
|
|
|
ClassBookmark.ContextMenuPath); |
|
|
|
ItemsSource = MenuService.CreateMenuItems(null, |
|
|
|
|
|
|
|
cb ?? new ClassBookmark(type), |
|
|
|
|
|
|
|
ClassBookmark.ContextMenuPath) |
|
|
|
|
|
|
|
}; |
|
|
|
resultItems.Add(item); |
|
|
|
resultItems.Add(item); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
@ -144,37 +152,35 @@ namespace ICSharpCode.SharpDevelop.Refactoring |
|
|
|
if (callingMember != null) { |
|
|
|
if (callingMember != null) { |
|
|
|
item = MakeItem(definitions, callingMember); |
|
|
|
item = MakeItem(definitions, callingMember); |
|
|
|
if (item != null) { |
|
|
|
if (item != null) { |
|
|
|
item.Text = StringParser.Parse("${res:SharpDevelop.Refactoring.CurrentMethod}: ") + callingMember.Name; |
|
|
|
item.Header = StringParser.Parse("${res:SharpDevelop.Refactoring.CurrentMethod}: ") + callingMember.Name; |
|
|
|
resultItems.Add(item); |
|
|
|
resultItems.Add(item); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (resultItems.Count == 0) { |
|
|
|
if (resultItems.Count > 0) { |
|
|
|
return new ToolStripItem[0]; |
|
|
|
resultItems.Add(new Separator()); |
|
|
|
} else { |
|
|
|
|
|
|
|
resultItems.Add(new MenuSeparator()); |
|
|
|
|
|
|
|
return resultItems.ToArray(); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return resultItems; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
ToolStripMenuItem MakeItemForResolveError(UnknownIdentifierResolveResult rr, ExpressionContext context, ITextEditor textArea) |
|
|
|
MenuItem MakeItemForResolveError(UnknownIdentifierResolveResult rr, ExpressionContext context, ITextEditor textArea) |
|
|
|
{ |
|
|
|
{ |
|
|
|
return MakeItemForUnknownClass(rr.CallingClass, rr.Identifier, textArea); |
|
|
|
return MakeItemForUnknownClass(rr.CallingClass, rr.Identifier, textArea); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
ToolStripMenuItem MakeItemForResolveError(UnknownConstructorCallResolveResult rr, ExpressionContext context, ITextEditor textArea) |
|
|
|
MenuItem MakeItemForResolveError(UnknownConstructorCallResolveResult rr, ExpressionContext context, ITextEditor textArea) |
|
|
|
{ |
|
|
|
{ |
|
|
|
return MakeItemForUnknownClass(rr.CallingClass, rr.TypeName, textArea); |
|
|
|
return MakeItemForUnknownClass(rr.CallingClass, rr.TypeName, textArea); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
ToolStripMenuItem MakeItemForUnknownClass(IClass callingClass, string unknownClassName, ITextEditor textArea) |
|
|
|
MenuItem MakeItemForUnknownClass(IClass callingClass, string unknownClassName, ITextEditor textArea) |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (callingClass == null) |
|
|
|
if (callingClass == null) |
|
|
|
return null; |
|
|
|
return null; |
|
|
|
IProjectContent pc = callingClass.ProjectContent; |
|
|
|
IProjectContent pc = callingClass.ProjectContent; |
|
|
|
if (!pc.Language.RefactoringProvider.IsEnabledForFile(callingClass.CompilationUnit.FileName)) |
|
|
|
if (!pc.Language.RefactoringProvider.IsEnabledForFile(callingClass.CompilationUnit.FileName)) |
|
|
|
return null; |
|
|
|
return null; |
|
|
|
ToolStripMenuItem item = MakeItemInternal(unknownClassName, ClassBrowserIconService.GotoArrow, callingClass.CompilationUnit, DomRegion.Empty); |
|
|
|
MenuItem item = MakeItemInternal(unknownClassName, ClassBrowserIconService.GotoArrow, callingClass.CompilationUnit, DomRegion.Empty); |
|
|
|
List<IClass> searchResults = new List<IClass>(); |
|
|
|
List<IClass> searchResults = new List<IClass>(); |
|
|
|
SearchAllClassesWithName(searchResults, pc, unknownClassName, pc.Language); |
|
|
|
SearchAllClassesWithName(searchResults, pc, unknownClassName, pc.Language); |
|
|
|
foreach (IProjectContent rpc in pc.ReferencedContents) { |
|
|
|
foreach (IProjectContent rpc in pc.ReferencedContents) { |
|
|
@ -184,8 +190,10 @@ namespace ICSharpCode.SharpDevelop.Refactoring |
|
|
|
return null; |
|
|
|
return null; |
|
|
|
foreach (IClass c in searchResults) { |
|
|
|
foreach (IClass c in searchResults) { |
|
|
|
string newNamespace = c.Namespace; |
|
|
|
string newNamespace = c.Namespace; |
|
|
|
ToolStripMenuItem subItem = new ToolStripMenuItem("using " + newNamespace, ClassBrowserIconService.Namespace.Bitmap); |
|
|
|
MenuItem subItem = new MenuItem(); |
|
|
|
item.DropDownItems.Add(subItem); |
|
|
|
subItem.Header = "using " + newNamespace; |
|
|
|
|
|
|
|
subItem.Icon = ClassBrowserIconService.Namespace.Bitmap; |
|
|
|
|
|
|
|
item.Items.Add(subItem); |
|
|
|
subItem.Click += delegate { |
|
|
|
subItem.Click += delegate { |
|
|
|
NamespaceRefactoringService.AddUsingDeclaration(callingClass.CompilationUnit, textArea.Document, newNamespace, true); |
|
|
|
NamespaceRefactoringService.AddUsingDeclaration(callingClass.CompilationUnit, textArea.Document, newNamespace, true); |
|
|
|
}; |
|
|
|
}; |
|
|
@ -220,36 +228,37 @@ namespace ICSharpCode.SharpDevelop.Refactoring |
|
|
|
return null; |
|
|
|
return null; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
ToolStripMenuItem MakeItem(LocalResolveResult local, RefactoringMenuContext context) |
|
|
|
MenuItem MakeItem(LocalResolveResult local, RefactoringMenuContext context) |
|
|
|
{ |
|
|
|
{ |
|
|
|
Debug.Assert(local == context.ResolveResult); |
|
|
|
Debug.Assert(local == context.ResolveResult); |
|
|
|
ToolStripMenuItem item = MakeItemInternal(local.VariableName, |
|
|
|
MenuItem item = MakeItemInternal(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); |
|
|
|
string treePath = "/SharpDevelop/ViewContent/DefaultTextEditor/Refactoring/"; |
|
|
|
string treePath = "/SharpDevelop/ViewContent/DefaultTextEditor/Refactoring/"; |
|
|
|
treePath += local.IsParameter ? "Parameter" : "LocalVariable"; |
|
|
|
treePath += local.IsParameter ? "Parameter" : "LocalVariable"; |
|
|
|
if (context.IsDefinition) treePath += "Definition"; |
|
|
|
if (context.IsDefinition) treePath += "Definition"; |
|
|
|
MenuService.AddItemsToMenu(item.DropDown.Items, context, treePath); |
|
|
|
foreach (object obj in MenuService.CreateMenuItems(null, context, treePath)) |
|
|
|
|
|
|
|
item.Items.Add(obj); |
|
|
|
return item; |
|
|
|
return item; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
ToolStripMenuItem MakeItem(List<string> definitions, IMember member) |
|
|
|
MenuItem MakeItem(List<string> definitions, IMember member) |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (member == null) return null; |
|
|
|
if (member == null) return null; |
|
|
|
if (definitions.Contains(member.DotNetName)) return null; |
|
|
|
if (definitions.Contains(member.DotNetName)) return null; |
|
|
|
definitions.Add(member.DotNetName); |
|
|
|
definitions.Add(member.DotNetName); |
|
|
|
ToolStripMenuItem item = MakeItem(MemberNode.Create(member), member.DeclaringType.CompilationUnit, member.Region); |
|
|
|
MenuItem item = MakeItem(MemberNode.Create(member), member.DeclaringType.CompilationUnit, member.Region); |
|
|
|
ToolStripMenuItem declaringType = MakeItem(null, member.DeclaringType); |
|
|
|
MenuItem declaringType = MakeItem(null, member.DeclaringType); |
|
|
|
if (declaringType != null) { |
|
|
|
if (declaringType != null) { |
|
|
|
item.DropDown.Items.Add(new ToolStripSeparator()); |
|
|
|
item.Items.Add(new Separator()); |
|
|
|
declaringType.Text = StringParser.Parse("${res:SharpDevelop.Refactoring.DeclaringType}: ") + declaringType.Text; |
|
|
|
declaringType.Header = StringParser.Parse("${res:SharpDevelop.Refactoring.DeclaringType}: ") + declaringType.Header; |
|
|
|
item.DropDown.Items.Add(declaringType); |
|
|
|
item.Items.Add(declaringType); |
|
|
|
} |
|
|
|
} |
|
|
|
return item; |
|
|
|
return item; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
ToolStripMenuItem MakeItem(List<string> definitions, IClass c) |
|
|
|
MenuItem MakeItem(List<string> definitions, IClass c) |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (c == null) return null; |
|
|
|
if (c == null) return null; |
|
|
|
if (definitions != null) { |
|
|
|
if (definitions != null) { |
|
|
@ -259,9 +268,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); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
ToolStripMenuItem MakeItemInternal(string title, IImage image, ICompilationUnit cu, DomRegion region) |
|
|
|
MenuItem MakeItemInternal(string title, IImage image, ICompilationUnit cu, DomRegion region) |
|
|
|
{ |
|
|
|
{ |
|
|
|
ToolStripMenuItem item = new ToolStripMenuItem(title, image.Bitmap); |
|
|
|
MenuItem item = new MenuItem(); |
|
|
|
|
|
|
|
item.Header = title; |
|
|
|
|
|
|
|
item.Icon = image.ImageSource; |
|
|
|
|
|
|
|
|
|
|
|
//ToolStripMenuItem titleItem = new ToolStripMenuItem(title);
|
|
|
|
//ToolStripMenuItem titleItem = new ToolStripMenuItem(title);
|
|
|
|
//titleItem.Enabled = false;
|
|
|
|
//titleItem.Enabled = false;
|
|
|
@ -269,22 +280,24 @@ namespace ICSharpCode.SharpDevelop.Refactoring |
|
|
|
//item.DropDown.Items.Add(new ToolStripSeparator());
|
|
|
|
//item.DropDown.Items.Add(new ToolStripSeparator());
|
|
|
|
|
|
|
|
|
|
|
|
if (cu != null && cu.FileName != null && !region.IsEmpty) { |
|
|
|
if (cu != null && cu.FileName != null && !region.IsEmpty) { |
|
|
|
ToolStripMenuItem gotoDefinitionItem = new ToolStripMenuItem(StringParser.Parse("${res:ICSharpCode.NAntAddIn.GotoDefinitionMenuLabel}"), |
|
|
|
MenuItem gotoDefinitionItem = new MenuItem(); |
|
|
|
ClassBrowserIconService.GotoArrow.Bitmap); |
|
|
|
gotoDefinitionItem.Header = StringParser.Parse("${res:ICSharpCode.NAntAddIn.GotoDefinitionMenuLabel}"); |
|
|
|
gotoDefinitionItem.ShortcutKeys = Keys.Control | Keys.Enter; |
|
|
|
gotoDefinitionItem.Icon = ClassBrowserIconService.GotoArrow.ImageSource; |
|
|
|
|
|
|
|
gotoDefinitionItem.InputGestureText = new KeyGesture(Key.Enter, ModifierKeys.Control).GetDisplayStringForCulture(Thread.CurrentThread.CurrentUICulture); |
|
|
|
gotoDefinitionItem.Click += delegate { |
|
|
|
gotoDefinitionItem.Click += delegate { |
|
|
|
FileService.JumpToFilePosition(cu.FileName, region.BeginLine, region.BeginColumn); |
|
|
|
FileService.JumpToFilePosition(cu.FileName, region.BeginLine, region.BeginColumn); |
|
|
|
}; |
|
|
|
}; |
|
|
|
item.DropDown.Items.Add(gotoDefinitionItem); |
|
|
|
item.Items.Add(gotoDefinitionItem); |
|
|
|
item.DropDown.Items.Add(new ToolStripSeparator()); |
|
|
|
item.Items.Add(new Separator()); |
|
|
|
} |
|
|
|
} |
|
|
|
return item; |
|
|
|
return item; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
ToolStripMenuItem MakeItem(ExtTreeNode classBrowserTreeNode, ICompilationUnit cu, DomRegion region) |
|
|
|
MenuItem MakeItem(ExtTreeNode classBrowserTreeNode, ICompilationUnit cu, DomRegion region) |
|
|
|
{ |
|
|
|
{ |
|
|
|
ToolStripMenuItem item = MakeItemInternal(classBrowserTreeNode.Text, ClassBrowserIconService.GetImageByIndex(classBrowserTreeNode.ImageIndex), cu, region); |
|
|
|
MenuItem item = MakeItemInternal(classBrowserTreeNode.Text, ClassBrowserIconService.GetImageByIndex(classBrowserTreeNode.ImageIndex), cu, region); |
|
|
|
MenuService.AddItemsToMenu(item.DropDown.Items, classBrowserTreeNode, classBrowserTreeNode.ContextmenuAddinTreePath); |
|
|
|
foreach (object obj in MenuService.CreateMenuItems(null, classBrowserTreeNode, classBrowserTreeNode.ContextmenuAddinTreePath)) |
|
|
|
|
|
|
|
item.Items.Add(obj); |
|
|
|
return item; |
|
|
|
return item; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|