diff --git a/src/Main/Base/Project/Src/Editor/Commands/ClassBookmarkSubmenuBuilder.cs b/src/Main/Base/Project/Src/Editor/Commands/ClassBookmarkSubmenuBuilder.cs index 8e5ec474c7..0070327259 100644 --- a/src/Main/Base/Project/Src/Editor/Commands/ClassBookmarkSubmenuBuilder.cs +++ b/src/Main/Base/Project/Src/Editor/Commands/ClassBookmarkSubmenuBuilder.cs @@ -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 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; diff --git a/src/Main/Base/Project/Src/Editor/Commands/ClassMemberMenuBuilder.cs b/src/Main/Base/Project/Src/Editor/Commands/ClassMemberMenuBuilder.cs index 0d6950d6c8..d8a39e2964 100644 --- a/src/Main/Base/Project/Src/Editor/Commands/ClassMemberMenuBuilder.cs +++ b/src/Main/Base/Project/Src/Editor/Commands/ClassMemberMenuBuilder.cs @@ -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 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); diff --git a/src/Main/Base/Project/Src/Editor/Commands/FindBaseClasses.cs b/src/Main/Base/Project/Src/Editor/Commands/FindBaseClasses.cs index 9a3bc45b31..d30708b188 100644 --- a/src/Main/Base/Project/Src/Editor/Commands/FindBaseClasses.cs +++ b/src/Main/Base/Project/Src/Editor/Commands/FindBaseClasses.cs @@ -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}"); diff --git a/src/Main/Base/Project/Src/Editor/Commands/FindDerivedClassesOrOverrides.cs b/src/Main/Base/Project/Src/Editor/Commands/FindDerivedClassesOrOverrides.cs index 94278a693a..58c4fb9d89 100644 --- a/src/Main/Base/Project/Src/Editor/Commands/FindDerivedClassesOrOverrides.cs +++ b/src/Main/Base/Project/Src/Editor/Commands/FindDerivedClassesOrOverrides.cs @@ -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 { 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; } +// } } } diff --git a/src/Main/Base/Project/Src/Services/RefactoringService/ContextActions/ContextActionsPopup.cs b/src/Main/Base/Project/Src/Services/RefactoringService/ContextActions/ContextActionsPopup.cs index 1b1c11329b..f231beec87 100644 --- a/src/Main/Base/Project/Src/Services/RefactoringService/ContextActions/ContextActionsPopup.cs +++ b/src/Main/Base/Project/Src/Services/RefactoringService/ContextActions/ContextActionsPopup.cs @@ -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 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 } 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(); } diff --git a/src/Main/Base/Project/Src/Services/RefactoringService/RefactoringMenuBuilder.cs b/src/Main/Base/Project/Src/Services/RefactoringService/RefactoringMenuBuilder.cs index 4bcab07136..8007a61e05 100644 --- a/src/Main/Base/Project/Src/Services/RefactoringService/RefactoringMenuBuilder.cs +++ b/src/Main/Base/Project/Src/Services/RefactoringService/RefactoringMenuBuilder.cs @@ -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 resultItems, ITextEditor textEditor, ExpressionResult expressionResult, List 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 resultItems, ITextEditor textEditor, ExpressionResult expressionResult, List 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 } 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 } } - #region AddTopLevelContextItems - - /// - /// Adds top-level context items like "Go to definition", "Find references", "Find derived classes", "Find overrides" - /// - void AddContextItems(List resultItems, RefactoringMenuContext context) - { - var contextItems = MakeContextItems(context); - resultItems.AddRange(contextItems); - if (contextItems.Count > 0) - resultItems.Add(new Separator()); - } - - List MakeContextItems(RefactoringMenuContext context) + void AddItemForCurrentClassAndMethod(List resultItems, ITextEditor textEditor, ExpressionResult expressionResult, List definitions) { - var contextItems = new List(); - 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) {