diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.addin b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.addin index f13422a6aa..948128e530 100755 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.addin +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.addin @@ -157,9 +157,15 @@ class = "ICSharpCode.AvalonEdit.AddIn.ContextActions.FindBaseClasses"/> </Path> - <Path name = "/SharpDevelop/ViewContent/TextEditor/ContextMenu/TypeContextMenu"> - <Include id="FindDerivedOrOverridesClasses" item="/SharpDevelop/Workbench/MainMenu/Search/FindDerivedOrOverridesClasses" /> - <Include id="FindBaseClasses" item="/SharpDevelop/Workbench/MainMenu/Search/FindBaseClasses" /> + <Path name = "/SharpDevelop/EntityContextMenu"> + <Condition name="SymbolTypeAtCaret" type="type" action="Exclude"> + <Include id="FindDerivedOrOverridesClasses" + insertafter="FindReferences" + item="/SharpDevelop/Workbench/MainMenu/Search/FindDerivedOrOverridesClasses" /> + <Include id="FindBaseClasses" + insertafter="FindDerivedOrOverridesClasses" + item="/SharpDevelop/Workbench/MainMenu/Search/FindBaseClasses" /> + </Condition> </Path> <Path name = "/SharpDevelop/Dialogs/OptionsDialog/CodingOptions"> diff --git a/src/AddIns/DisplayBindings/ILSpyAddIn/ILSpyAddIn.addin b/src/AddIns/DisplayBindings/ILSpyAddIn/ILSpyAddIn.addin index 26e4f5eec0..604748c51b 100644 --- a/src/AddIns/DisplayBindings/ILSpyAddIn/ILSpyAddIn.addin +++ b/src/AddIns/DisplayBindings/ILSpyAddIn/ILSpyAddIn.addin @@ -22,6 +22,7 @@ <!-- Text editor context menu: Launch ILSpy command --> <Path name="/SharpDevelop/EntityContextMenu"> + <MenuItem id="ILSpySeparator" type="Separator" /> <MenuItem id="ILSpy" icon="ILSpy" type="Item" label="${res:ILSpyAddIn.OpenILSpyCommand}" class="ICSharpCode.ILSpyAddIn.OpenInILSpyCommand"/> </Path> </AddIn> diff --git a/src/Main/Base/Project/ICSharpCode.SharpDevelop.addin b/src/Main/Base/Project/ICSharpCode.SharpDevelop.addin index 388d298d64..23a5e5042a 100755 --- a/src/Main/Base/Project/ICSharpCode.SharpDevelop.addin +++ b/src/Main/Base/Project/ICSharpCode.SharpDevelop.addin @@ -1994,9 +1994,13 @@ <!-- TEXT EDITOR --> <Path name = "/SharpDevelop/EntityContextMenu"> + <Include id="GotoDefinition" item="/SharpDevelop/Workbench/MainMenu/Search/GotoDefinition" /> + <Include id="Rename" item="/SharpDevelop/Workbench/MainMenu/Search/Rename" /> <MenuItem id = "FindReferences" label = "${res:SharpDevelop.Refactoring.FindReferencesCommand}" class = "ICSharpCode.SharpDevelop.Editor.Commands.FindReferencesCommand"/> + + <MenuItem id="DeclaringTypeContextMenu" type="Builder" class="ICSharpCode.SharpDevelop.Editor.Commands.DeclaringTypeSubMenuBuilder" /> </Path> <!-- @@ -2025,38 +2029,11 @@ <Include id = "Common" path = "/SharpDevelop/ViewContent/DefaultTextEditor/Refactoring/Common"/> </Path>--> - <Path name = "/SharpDevelop/ViewContent/TextEditor/ContextMenu/MemberContextMenu"> - <Include id="GotoDefinition" item="/SharpDevelop/Workbench/MainMenu/Search/GotoDefinition" /> - <Include id="Rename" item="/SharpDevelop/Workbench/MainMenu/Search/Rename" /> - </Path> - - <Path name = "/SharpDevelop/ViewContent/TextEditor/ContextMenu/TypeContextMenu"> - <Include id="GotoDefinition" item="/SharpDevelop/Workbench/MainMenu/Search/GotoDefinition" /> - <Include id="Rename" item="/SharpDevelop/Workbench/MainMenu/Search/Rename" /> - </Path> - - <Path name = "/SharpDevelop/ViewContent/TextEditor/ContextMenu/LocalContextMenu"> - <Include id="GotoDefinition" item="/SharpDevelop/Workbench/MainMenu/Search/GotoDefinition" /> - <Include id="Rename" item="/SharpDevelop/Workbench/MainMenu/Search/Rename" /> - </Path> - <Path name = "/SharpDevelop/ViewContent/TextEditor/ContextMenu"> - <Condition name="SymbolTypeAtCaret" type="member" action="Exclude"> - <Include id="MemberContextMenu" path="/SharpDevelop/ViewContent/TextEditor/ContextMenu/MemberContextMenu" /> + <Condition name="SymbolTypeAtCaret" type="member,type,local" action="Exclude"> <Include id="EntityContextMenu" path="/SharpDevelop/EntityContextMenu" /> <MenuItem id="Separator1" type="Separator" /> </Condition> - <Condition name="SymbolTypeAtCaret" type="type" action="Exclude"> - <Include id="TypeContextMenu" path="/SharpDevelop/ViewContent/TextEditor/ContextMenu/TypeContextMenu" /> - <Include id="EntityContextMenu" path="/SharpDevelop/EntityContextMenu" /> - <MenuItem id="Separator1" type="Separator" /> - </Condition> - <Condition name="SymbolTypeAtCaret" type="local" action="Exclude"> - <Include id="LocalContextMenu" path="/SharpDevelop/ViewContent/TextEditor/ContextMenu/LocalContextMenu" /> - <MenuItem id="Separator1" type="Separator" /> - </Condition> - - <MenuItem id="DeclaringTypeContextMenu" type="Builder" class="ICSharpCode.SharpDevelop.Editor.Commands.DeclaringTypeSubMenuBuilder" /> <Include id = "Cut" item = "/SharpDevelop/Workbench/MainMenu/Edit/Cut"/> <Include id = "Copy" item = "/SharpDevelop/Workbench/MainMenu/Edit/Copy"/> diff --git a/src/Main/Base/Project/Src/Editor/Commands/DeclaringTypeSubMenuBuilder.cs b/src/Main/Base/Project/Src/Editor/Commands/DeclaringTypeSubMenuBuilder.cs index 2a474ae27e..3010de7654 100644 --- a/src/Main/Base/Project/Src/Editor/Commands/DeclaringTypeSubMenuBuilder.cs +++ b/src/Main/Base/Project/Src/Editor/Commands/DeclaringTypeSubMenuBuilder.cs @@ -2,6 +2,7 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; +using System.Linq; using System.Collections.Generic; using System.Windows; using System.Windows.Controls; @@ -9,6 +10,7 @@ using ICSharpCode.Core; using ICSharpCode.Core.Presentation; using ICSharpCode.NRefactory.Semantics; using ICSharpCode.NRefactory.TypeSystem; +using ICSharpCode.SharpDevelop.Dom; namespace ICSharpCode.SharpDevelop.Editor.Commands { @@ -19,12 +21,28 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands { public IEnumerable<object> BuildItems(Codon codon, object parameter) { - MemberResolveResult resolveResult = GetResolveResult() as MemberResolveResult; - if (resolveResult == null) { - return null; + IMember member = null; + + if (parameter is IMemberModel) { + // Menu is directly created from a member model (e.g. bookmarks etc.) + member = ((IMemberModel) parameter).Resolve(); + } else if (parameter is ResolveResult) { + MemberResolveResult resolveResult = parameter as MemberResolveResult; + if (resolveResult != null) { + member = resolveResult.Member; + } + } else if (parameter is ITextEditor) { + // Shown in context menu of a text editor + MemberResolveResult resolveResult = GetResolveResult((ITextEditor) parameter) as MemberResolveResult; + if (resolveResult != null) { + member = resolveResult.Member; + } } - IMember member = resolveResult.Member; + if (member == null) { + return null; + } + IType declaringType = member.DeclaringTypeDefinition; if (declaringType == null) { return null; @@ -33,31 +51,28 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands var items = new List<object>(); var declaringTypeItem = new MenuItem() { Header = "Declaring type: " + declaringType.Name, - Icon = ClassBrowserIconService.GetIcon(declaringType).ImageSource + Icon = new Image() { Source = ClassBrowserIconService.GetIcon(declaringType).ImageSource } }; var subItems = MenuService.CreateMenuItems( - null, new TypeResolveResult(declaringType), "/SharpDevelop/ViewContent/TextEditor/ContextMenu/TypeContextMenu"); + null, new TypeResolveResult(declaringType), "/SharpDevelop/EntityContextMenu"); if (subItems != null) { foreach (var item in subItems) { declaringTypeItem.Items.Add(item); } } - items.Add(declaringTypeItem); - items.Add(new Separator()); return items; } - static ResolveResult GetResolveResult() + static ResolveResult GetResolveResult(ITextEditor currentEditor) { - ITextEditor currentEditor = SD.GetActiveViewContentService<ITextEditor>(); if (currentEditor != null) { return SD.ParserService.Resolve(currentEditor, currentEditor.Caret.Location); - } else { - return ErrorResolveResult.UnknownError; } + + return ErrorResolveResult.UnknownError; } } } diff --git a/src/Main/Base/Project/Src/Internal/ConditionEvaluators/SymbolTypeAtCaretConditionEvaluator.cs b/src/Main/Base/Project/Src/Internal/ConditionEvaluators/SymbolTypeAtCaretConditionEvaluator.cs index 403ebbedcf..b9e0d3a256 100644 --- a/src/Main/Base/Project/Src/Internal/ConditionEvaluators/SymbolTypeAtCaretConditionEvaluator.cs +++ b/src/Main/Base/Project/Src/Internal/ConditionEvaluators/SymbolTypeAtCaretConditionEvaluator.cs @@ -4,7 +4,10 @@ using System; using ICSharpCode.Core; using ICSharpCode.NRefactory.Semantics; +using ICSharpCode.NRefactory.TypeSystem; +using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Editor; +using ICSharpCode.SharpDevelop.Editor.Commands; namespace ICSharpCode.SharpDevelop.Internal.ConditionEvaluators { @@ -15,7 +18,7 @@ namespace ICSharpCode.SharpDevelop.Internal.ConditionEvaluators { public bool IsValid(object parameter, Condition condition) { - ResolveResult resolveResult = GetResolveResult(); + ResolveResult resolveResult = GetResolveResult(parameter); if ((resolveResult != null) && !resolveResult.IsError) { // Check type of symbol string typesList = condition.Properties["type"]; @@ -53,14 +56,46 @@ namespace ICSharpCode.SharpDevelop.Internal.ConditionEvaluators return false; } - static ResolveResult GetResolveResult() + static ResolveResult GetResolveResult(object parameter) + { + if (parameter == null) + return GetResolveResultFromCurrentEditor(); + + if (parameter is ITextEditor) + return GetResolveResultFromCurrentEditor((ITextEditor) parameter); + + if (parameter is ResolveResult) + return (ResolveResult) parameter; + + if (parameter is IEntityModel) + return GetResolveResultFromEntityModel((IEntityModel) parameter); + + return null; + } + + static ResolveResult GetResolveResultFromEntityModel(IEntityModel entityModel) + { + IEntity entity = entityModel.Resolve(); + if (entity is IMember) + return new MemberResolveResult(null, (IMember) entity); + if (entity is ITypeDefinition) + return new TypeResolveResult((ITypeDefinition) entity); + return ErrorResolveResult.UnknownError; + } + + static ResolveResult GetResolveResultFromCurrentEditor() { ITextEditor currentEditor = SD.GetActiveViewContentService<ITextEditor>(); + return GetResolveResultFromCurrentEditor(currentEditor); + } + + static ResolveResult GetResolveResultFromCurrentEditor(ITextEditor currentEditor) + { if (currentEditor != null) { return SD.ParserService.Resolve(currentEditor, currentEditor.Caret.Location); - } else { - return ErrorResolveResult.UnknownError; } + + return ErrorResolveResult.UnknownError; } } }