Browse Source

Shortcuts:

Rename - Ctrl+R (Replace changed Ctrl+R -> Alt+R),
Find references - F12 (VS uses F12 for Go to definition)
Go to derived class / override - F11
Go to base class - no shortcut

To make these shortcuts work, added items to "Search" menu.

Modified AbstractEntity.IsOverridable to return true also for interface members.


git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@6093 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
pull/1/head
Martin Koníček 16 years ago
parent
commit
ba590ca416
  1. 24
      AddIns/ICSharpCode.SharpDevelop.addin
  2. 20
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditorView.cs
  3. 2
      src/AddIns/Misc/SearchAndReplace/Project/SearchAndReplace.addin
  4. 4
      src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
  5. 12
      src/Main/Base/Project/Src/Editor/Commands/ClassBookmarkMenuBuilder.cs
  6. 14
      src/Main/Base/Project/Src/Editor/Commands/ClassMemberMenuBuilder.cs
  7. 30
      src/Main/Base/Project/Src/Editor/Commands/FindBaseClasses.cs
  8. 36
      src/Main/Base/Project/Src/Editor/Commands/FindDerivedClassesOrOverrides.cs
  9. 36
      src/Main/Base/Project/Src/Editor/Commands/FindReferences.cs
  10. 43
      src/Main/Base/Project/Src/Editor/Commands/GoToDefinition.cs
  11. 35
      src/Main/Base/Project/Src/Editor/Commands/SymbolUnderCaretCommand.cs
  12. 1
      src/Main/Base/Project/Src/Services/RefactoringService/ContextActions/ContextActionsControl.xaml
  13. 27
      src/Main/Base/Project/Src/Services/RefactoringService/ContextActions/ContextActionsPopup.cs
  14. 33
      src/Main/Base/Project/Src/Services/RefactoringService/FindReferencesAndRenameHelper.cs
  15. 41
      src/Main/Base/Project/Src/Services/RefactoringService/RefactoringMenuBuilder.cs
  16. 5
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Implementations/AbstractEntity.cs

24
AddIns/ICSharpCode.SharpDevelop.addin

@ -1340,7 +1340,8 @@ @@ -1340,7 +1340,8 @@
<MenuItem id = "Refactor" label = "${res:XML.MainMenu.RefactorMenu}" type="Menu">
<MenuItem id = "Rename"
label = "${res:SharpDevelop.Refactoring.RenameCommand}"
class = "ICSharpCode.SharpDevelop.Refactoring.RenameCommand" />
class = "ICSharpCode.SharpDevelop.Refactoring.RenameCommand"
shortcut = "Control|R" />
<Condition name="RefactoringProviderSupports" supports="FindUnusedUsingDeclarations">
<MenuItem id = "RemoveUnusedUsings"
label = "${res:SharpDevelop.Refactoring.RemoveUnusedImports}"
@ -1549,15 +1550,36 @@ @@ -1549,15 +1550,36 @@
icon = "Bookmarks.ClearAll"
class = "ICSharpCode.SharpDevelop.Bookmarks.ClearBookmarks"/>
<MenuItem id = "Separator2" type = "Separator" />
<MenuItem id = "GotoLineNr"
label = "${res:XML.MainMenu.SearchMenu.Goto}"
shortcut = "Control|G"
class = "ICSharpCode.SharpDevelop.Editor.Commands.GotoLineNumber"/>
<MenuItem id = "GotoDefinition"
label = "${res:ICSharpCode.NAntAddIn.GotoDefinitionMenuLabel}"
shortcut = "Control|Return"
icon="Icons.16x16.SelectionArrow"
class = "ICSharpCode.SharpDevelop.Editor.Commands.GoToDefinition"/>
<MenuItem id = "FindReferences"
label = "${res:SharpDevelop.Refactoring.FindReferences}"
shortcut = "F12"
icon="Icons.16x16.SelectionArrow"
class = "ICSharpCode.SharpDevelop.Editor.Commands.FindReferences"/>
<MenuItem id = "FindDerivedOrOverridesClasses"
label = "${res:SharpDevelop.Refactoring.FindDerivedClassesOrOverridesCommand}"
shortcut = "F11"
icon="Icons.16x16.Class"
class = "ICSharpCode.SharpDevelop.Editor.Commands.FindDerivedClassesOrOverrides"/>
<MenuItem id = "FindBaseClasses"
label = "${res:SharpDevelop.Refactoring.FindBaseClassesCommand}"
shortcut = ""
icon="Icons.16x16.Interface"
class = "ICSharpCode.SharpDevelop.Editor.Commands.FindBaseClasses"/>
<MenuItem id = "GotoBrace"
label = "${res:XML.MainMenu.SearchMenu.GotoBrace}"
shortcut = "Control|B"

20
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditorView.cs

@ -341,17 +341,27 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -341,17 +341,27 @@ namespace ICSharpCode.AvalonEdit.AddIn
#endregion
#region Ctrl+Click Go To Definition
GoToDefinition goToDefinitionCommand;
protected GoToDefinition GotoDefinitionCommand {
get
{
if (goToDefinitionCommand == null)
goToDefinitionCommand = new GoToDefinition();
return goToDefinitionCommand;
}
}
void TextViewMouseDown(object sender, MouseButtonEventArgs e)
{
// close existing popup immediately on text editor mouse down
TryCloseExistingPopup(false);
if (options.CtrlClickGoToDefinition && e.ChangedButton == MouseButton.Left && Keyboard.Modifiers == ModifierKeys.Control) {
var position = GetPositionFromPoint(e.GetPosition(this));
if (position != null) {
Core.AnalyticsMonitorService.TrackFeature(typeof(GoToDefinition).FullName, "Ctrl+Click");
GoToDefinition.Run(this.Adapter, this.Document.GetOffset(position.Value));
e.Handled = true;
}
if (position == null)
return;
Core.AnalyticsMonitorService.TrackFeature(typeof(GoToDefinition).FullName, "Ctrl+Click");
this.GotoDefinitionCommand.Run(this.Adapter, this.Document.GetOffset(position.Value));
e.Handled = true;
}
}
#endregion

2
src/AddIns/Misc/SearchAndReplace/Project/SearchAndReplace.addin

@ -33,7 +33,7 @@ @@ -33,7 +33,7 @@
insertafter = "FindNextSelected"
label = "${res:XML.MainMenu.SearchMenu.Replace}"
icon = "Icons.16x16.ReplaceIcon"
shortcut = "Control|R"
shortcut = "Alt|R"
class = "SearchAndReplace.Replace"/>
</Path>

4
src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj

@ -99,7 +99,11 @@ @@ -99,7 +99,11 @@
<Compile Include="Src\Editor\CodeCompletion\NRefactoryCompletionItemList.cs" />
<Compile Include="Src\Editor\Commands\ClassBookmarkMenuBuilder.cs" />
<Compile Include="Src\Editor\Commands\ClassMemberMenuBuilder.cs" />
<Compile Include="Src\Editor\Commands\FindBaseClasses.cs" />
<Compile Include="Src\Editor\Commands\FindDerivedClassesOrOverrides.cs" />
<Compile Include="Src\Editor\Commands\FindReferences.cs" />
<Compile Include="Src\Editor\Commands\GotoLineNumber.cs" />
<Compile Include="Src\Editor\Commands\SymbolUnderCaretCommand.cs" />
<Compile Include="Src\Editor\IEditorControlService.cs" />
<Compile Include="Src\Editor\IEditorUIService.cs" />
<Compile Include="Src\Editor\CodeCompletion\AttributesItemProvider.cs" />

12
src/Main/Base/Project/Src/Editor/Commands/ClassBookmarkMenuBuilder.cs

@ -149,6 +149,7 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands @@ -149,6 +149,7 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands
}
cmd = new MenuCommand("${res:SharpDevelop.Refactoring.RenameCommand}", Rename);
cmd.ShortcutKeys = MenuCommand.ParseShortcut("Control|R");
cmd.Tag = c;
list.Add(cmd);
@ -179,7 +180,7 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands @@ -179,7 +180,7 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands
list.Add(cmd);
}
cmd = new MenuCommand("${res:SharpDevelop.Refactoring.FindReferencesCommand}", FindReferences);
cmd = FindReferencesAndRenameHelper.MakeFindReferencesMenuCommand(FindReferences);
cmd.Tag = c;
list.Add(cmd);
@ -309,14 +310,7 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands @@ -309,14 +310,7 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands
{
MenuCommand item = (MenuCommand)sender;
IClass c = (IClass)item.Tag;
using (AsynchronousWaitDialog monitor = AsynchronousWaitDialog.ShowWaitDialog("${res:SharpDevelop.Refactoring.FindReferences}"))
{
FindReferencesAndRenameHelper.ShowAsSearchResults(
StringParser.Parse("${res:SharpDevelop.Refactoring.ReferencesTo}",
new string[,] {{ "Name", c.Name }}),
RefactoringService.FindReferences(c, monitor)
);
}
FindReferencesAndRenameHelper.RunFindReferences(c);
}
}
}

14
src/Main/Base/Project/Src/Editor/Commands/ClassMemberMenuBuilder.cs

@ -63,14 +63,12 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands @@ -63,14 +63,12 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands
list.Add(cmd);
}
}
if (member.IsOverride) {
if (member != null && member.IsOverride) {
cmd = new MenuCommand("${res:SharpDevelop.Refactoring.GoToBaseClassCommand}", GoToBase);
cmd.Tag = member;
list.Add(cmd);
}
if (member.IsVirtual || member.IsAbstract || (member.IsOverride && !member.DeclaringType.IsSealed)
// Interface members have IsVirtual == IsAbstract == false. These properties are based on modifiers only.
|| (member.DeclaringType != null && member.DeclaringType.ClassType == ClassType.Interface)) {
if (member != null && member.IsOverridable) {
cmd = new MenuCommand("${res:SharpDevelop.Refactoring.FindOverridesCommand}", FindOverrides);
cmd.Tag = member;
list.Add(cmd);
@ -240,13 +238,7 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands @@ -240,13 +238,7 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands
{
MenuCommand item = (MenuCommand)sender;
IMember member = (IMember)item.Tag;
string memberName = member.DeclaringType.Name + "." + member.Name;
using (AsynchronousWaitDialog monitor = AsynchronousWaitDialog.ShowWaitDialog("${res:SharpDevelop.Refactoring.FindReferences}"))
{
FindReferencesAndRenameHelper.ShowAsSearchResults(StringParser.Parse("${res:SharpDevelop.Refactoring.ReferencesTo}",
new string[,] {{ "Name", memberName }}),
RefactoringService.FindReferences(member, monitor));
}
FindReferencesAndRenameHelper.RunFindReferences(member);
}
bool IsAutomaticProperty(ITextEditor editor, IProperty property)

30
src/Main/Base/Project/Src/Editor/Commands/FindBaseClasses.cs

@ -0,0 +1,30 @@ @@ -0,0 +1,30 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Martin Konicek" email="martin.konicek@gmail.com"/>
// <version>$Revision: $</version>
// </file>
using System;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Refactoring;
namespace ICSharpCode.SharpDevelop.Editor.Commands
{
/// <summary>
/// Description of FindBaseClasses.
/// </summary>
public class FindBaseClasses : SymbolUnderCaretCommand
{
protected override void RunImpl(ITextEditor editor, int offset, ResolveResult symbol)
{
if (symbol == null)
return;
if (symbol is TypeResolveResult) {
var classUnderCaret = ((TypeResolveResult)symbol).ResolvedClass;
if (classUnderCaret == null)
return;
ContextActionsHelper.MakePopupWithBaseClasses(classUnderCaret).Open(editor);
}
}
}
}

36
src/Main/Base/Project/Src/Editor/Commands/FindDerivedClassesOrOverrides.cs

@ -0,0 +1,36 @@ @@ -0,0 +1,36 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Martin Konicek" email="martin.konicek@gmail.com"/>
// <version>$Revision: $</version>
// </file>
using System;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Refactoring;
namespace ICSharpCode.SharpDevelop.Editor.Commands
{
/// <summary>
/// Description of FindDerivedClassesOrOverrides.
/// </summary>
public class FindDerivedClassesOrOverrides : SymbolUnderCaretCommand
{
protected override void RunImpl(ITextEditor editor, int offset, ResolveResult symbol)
{
if (symbol == null)
return;
if (symbol is TypeResolveResult) {
var classUnderCaret = ((TypeResolveResult)symbol).ResolvedClass;
if (classUnderCaret == null)
return;
ContextActionsHelper.MakePopupWithDerivedClasses(classUnderCaret).Open(editor);
}
if (symbol is MemberResolveResult) {
IMember memberUnderCaret = ((MemberResolveResult)symbol).ResolvedMember as IMember;
if (memberUnderCaret != null && memberUnderCaret.IsOverridable) {
ContextActionsHelper.MakePopupWithOverrides(memberUnderCaret).Open(editor);
}
}
}
}
}

36
src/Main/Base/Project/Src/Editor/Commands/FindReferences.cs

@ -0,0 +1,36 @@ @@ -0,0 +1,36 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Martin Konicek" email="martin.konicek@gmail.com"/>
// <version>$Revision: $</version>
// </file>
using System;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Refactoring;
namespace ICSharpCode.SharpDevelop.Editor.Commands
{
/// <summary>
/// Description of FindReferences.
/// </summary>
public class FindReferences : SymbolUnderCaretCommand
{
protected override void RunImpl(ITextEditor editor, int offset, ResolveResult symbol)
{
if (symbol == null)
return;
if (symbol is TypeResolveResult) {
var classUnderCaret = ((TypeResolveResult)symbol).ResolvedClass;
if (classUnderCaret == null)
return;
FindReferencesAndRenameHelper.RunFindReferences(classUnderCaret);
}
if (symbol is MemberResolveResult) {
IMember memberUnderCaret = ((MemberResolveResult)symbol).ResolvedMember as IMember;
if (memberUnderCaret == null)
return;
FindReferencesAndRenameHelper.RunFindReferences(memberUnderCaret);
}
}
}
}

43
src/Main/Base/Project/Src/Editor/Commands/GoToDefinition.cs

@ -12,41 +12,22 @@ using ICSharpCode.SharpDevelop.Gui; @@ -12,41 +12,22 @@ using ICSharpCode.SharpDevelop.Gui;
namespace ICSharpCode.SharpDevelop.Editor.Commands
{
public class GoToDefinition : AbstractMenuCommand
public class GoToDefinition : SymbolUnderCaretCommand
{
public override void Run()
protected override void RunImpl(ITextEditor editor, int offset, ResolveResult symbol)
{
ITextEditorProvider editorProvider = WorkbenchSingleton.Workbench.ActiveViewContent as ITextEditorProvider;
if (editorProvider != null) {
Run(editorProvider.TextEditor, editorProvider.TextEditor.Caret.Offset);
}
}
public static void Run(ITextEditor editor, int offset)
{
IDocument document = editor.Document;
string textContent = document.Text;
IExpressionFinder expressionFinder = ParserService.GetExpressionFinder(editor.FileName);
if (expressionFinder == null)
if (symbol == null)
return;
ExpressionResult expression = expressionFinder.FindFullExpression(textContent, offset);
if (expression.Expression == null || expression.Expression.Length == 0)
FilePosition pos = symbol.GetDefinitionPosition();
if (pos.IsEmpty)
return;
var caretPos = editor.Document.OffsetToPosition(offset);
ResolveResult result = ParserService.Resolve(expression, caretPos.Line, caretPos.Column, editor.FileName, textContent);
if (result != null) {
FilePosition pos = result.GetDefinitionPosition();
if (pos.IsEmpty == false) {
try {
if (pos.Position.IsEmpty)
FileService.OpenFile(pos.FileName);
else
FileService.JumpToFilePosition(pos.FileName, pos.Line, pos.Column);
} catch (Exception ex) {
MessageService.ShowException(ex, "Error jumping to '" + pos.FileName + "'.");
}
}
try {
if (pos.Position.IsEmpty)
FileService.OpenFile(pos.FileName);
else
FileService.JumpToFilePosition(pos.FileName, pos.Line, pos.Column);
} catch (Exception ex) {
MessageService.ShowException(ex, "Error jumping to '" + pos.FileName + "'.");
}
}
}

35
src/Main/Base/Project/Src/Editor/Commands/SymbolUnderCaretCommand.cs

@ -0,0 +1,35 @@ @@ -0,0 +1,35 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Martin Konicek" email="martin.konicek@gmail.com"/>
// <version>$Revision: $</version>
// </file>
using System;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Gui;
namespace ICSharpCode.SharpDevelop.Editor.Commands
{
/// <summary>
/// A menu command that uses the symbol under the editor's caret.
/// </summary>
public abstract class SymbolUnderCaretCommand : AbstractMenuCommand
{
public override void Run()
{
ITextEditorProvider editorProvider = WorkbenchSingleton.Workbench.ActiveViewContent as ITextEditorProvider;
if (editorProvider != null) {
Run(editorProvider.TextEditor, editorProvider.TextEditor.Caret.Offset);
}
}
public void Run(ITextEditor editor, int caretOffset)
{
var resolveResult = ParserService.Resolve(caretOffset, editor.Document, editor.FileName);
RunImpl(editor, caretOffset, resolveResult);
}
protected abstract void RunImpl(ITextEditor editor, int caretOffset, ResolveResult symbol);
}
}

1
src/Main/Base/Project/Src/Services/RefactoringService/ContextActions/ContextActionsControl.xaml

@ -8,7 +8,6 @@ @@ -8,7 +8,6 @@
<UserControl.Resources>
<SolidColorBrush x:Key="OuterBorderBrush" Color="#436C82"></SolidColorBrush>
<BitmapImage x:Key="Magnifier" UriSource="magnifier.png" />
<Style x:Key="ClearButton" TargetType="Button">
<Setter Property="FocusVisualStyle" Value="{x:Null}"></Setter> <!-- Disable the dashed focus rectangle -->

27
src/Main/Base/Project/Src/Services/RefactoringService/ContextActions/ContextActionsPopup.cs

@ -7,6 +7,7 @@ @@ -7,6 +7,7 @@
using System;
using System.Windows;
using System.Windows.Controls.Primitives;
using ICSharpCode.SharpDevelop.Editor;
namespace ICSharpCode.SharpDevelop.Refactoring
{
@ -51,5 +52,31 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -51,5 +52,31 @@ namespace ICSharpCode.SharpDevelop.Refactoring
{
this.IsOpen = false;
}
public void Open(ITextEditor editor)
{
var editorUIService = editor.GetService(typeof(IEditorUIService)) as IEditorUIService;
if (editorUIService != null) {
var document = editor.Document;
int line = editor.Caret.Line;
int column = editor.Caret.Column;
int offset = document.PositionToOffset(line, column);
int wordStart = document.FindPrevWordStart(offset);
if (wordStart != -1) {
var wordStartLocation = document.OffsetToPosition(wordStart);
line = wordStartLocation.Line;
column = wordStartLocation.Column;
}
var caretScreenPos = editorUIService.GetScreenPosition(line, column);
this.Placement = PlacementMode.Absolute;
this.HorizontalOffset = caretScreenPos.X;
this.VerticalOffset = caretScreenPos.Y;
} else {
this.HorizontalOffset = 200;
this.VerticalOffset = 200;
}
this.Open();
this.Focus();
}
}
}

33
src/Main/Base/Project/Src/Services/RefactoringService/FindReferencesAndRenameHelper.cs

@ -519,5 +519,38 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -519,5 +519,38 @@ namespace ICSharpCode.SharpDevelop.Refactoring
}
#endregion
#region Find references
public static void RunFindReferences(IMember member)
{
string memberName = member.DeclaringType.Name + "." + member.Name;
using (AsynchronousWaitDialog monitor = AsynchronousWaitDialog.ShowWaitDialog("${res:SharpDevelop.Refactoring.FindReferences}"))
{
FindReferencesAndRenameHelper.ShowAsSearchResults(StringParser.Parse("${res:SharpDevelop.Refactoring.ReferencesTo}",
new string[,] {{ "Name", memberName }}),
RefactoringService.FindReferences(member, monitor));
}
}
public static void RunFindReferences(IClass c)
{
using (AsynchronousWaitDialog monitor = AsynchronousWaitDialog.ShowWaitDialog("${res:SharpDevelop.Refactoring.FindReferences}"))
{
FindReferencesAndRenameHelper.ShowAsSearchResults(
StringParser.Parse("${res:SharpDevelop.Refactoring.ReferencesTo}",
new string[,] {{ "Name", c.Name }}),
RefactoringService.FindReferences(c, monitor)
);
}
}
public static ICSharpCode.Core.WinForms.MenuCommand MakeFindReferencesMenuCommand(EventHandler handler)
{
return new ICSharpCode.Core.WinForms.MenuCommand("${res:SharpDevelop.Refactoring.FindReferencesCommand}", handler) {
ShortcutKeys = System.Windows.Forms.Keys.F12
};
}
#endregion
}
}

41
src/Main/Base/Project/Src/Services/RefactoringService/RefactoringMenuBuilder.cs

@ -177,9 +177,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -177,9 +177,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring
}
if (context.ResolveResult is MemberResolveResult) {
IMember member = ((MemberResolveResult)context.ResolveResult).ResolvedMember as IMember;
if (member != null && member.IsVirtual || member.IsAbstract || (member.IsOverride && !member.DeclaringType.IsSealed)
// Interface members have IsVirtual == IsAbstract == false. These properties are based on modifiers only.
|| (member.DeclaringType != null && member.DeclaringType.ClassType == ClassType.Interface)) {
if (member != null && member.IsOverridable) {
contextItems.AddIfNotNull(MakeFindOverridesItem(member, context));
}
}
@ -194,7 +192,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -194,7 +192,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring
item.Icon = ClassBrowserIconService.Class.CreateImage();
item.InputGestureText = new KeyGesture(Key.F11).GetDisplayStringForCulture(Thread.CurrentThread.CurrentUICulture);
item.Click += delegate {
OpenPopup(ContextActionsHelper.MakePopupWithDerivedClasses(baseClass), context);
ContextActionsHelper.MakePopupWithDerivedClasses(baseClass).Open(context.Editor);
};
return item;
}
@ -203,11 +201,11 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -203,11 +201,11 @@ namespace ICSharpCode.SharpDevelop.Refactoring
{
if (@class == null)
return null;
var item = new MenuItem { Header = MenuService.ConvertLabel("Find base classes..") };
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.InputGestureText = new KeyGesture(Key.F10).GetDisplayStringForCulture(Thread.CurrentThread.CurrentUICulture);
item.Click += delegate {
OpenPopup(ContextActionsHelper.MakePopupWithBaseClasses(@class), context);
ContextActionsHelper.MakePopupWithBaseClasses(@class).Open(context.Editor);
};
return item;
}
@ -220,36 +218,11 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -220,36 +218,11 @@ namespace ICSharpCode.SharpDevelop.Refactoring
item.Icon = ClassBrowserIconService.Method.CreateImage();
item.InputGestureText = new KeyGesture(Key.F11).GetDisplayStringForCulture(Thread.CurrentThread.CurrentUICulture);
item.Click += delegate {
OpenPopup(ContextActionsHelper.MakePopupWithOverrides(member), context);
ContextActionsHelper.MakePopupWithOverrides(member).Open(context.Editor);
};
return item;
}
void OpenPopup(ContextActionsPopup popup, RefactoringMenuContext context)
{
var editorUIService = context.Editor.GetService(typeof(IEditorUIService)) as IEditorUIService;
if (editorUIService != null) {
int line = context.Editor.Caret.Line;
int column = context.Editor.Caret.Column;
int offset = context.Editor.Document.PositionToOffset(line, column);
int wordStart = context.Editor.Document.FindPrevWordStart(offset);
if (wordStart != -1) {
var wordStartLocation = context.Editor.Document.OffsetToPosition(wordStart);
line = wordStartLocation.Line;
column = wordStartLocation.Column;
}
var caretScreenPos = editorUIService.GetScreenPosition(line, column);
popup.Placement = PlacementMode.Absolute;
popup.HorizontalOffset = caretScreenPos.X;
popup.VerticalOffset = caretScreenPos.Y;
} else {
popup.HorizontalOffset = 200;
popup.VerticalOffset = 200;
}
popup.Open();
popup.Focus();
}
#endregion
MenuItem MakeItemForResolveError(UnknownIdentifierResolveResult rr, ExpressionContext context, ITextEditor textArea)

5
src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Implementations/AbstractEntity.cs

@ -285,7 +285,10 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -285,7 +285,10 @@ namespace ICSharpCode.SharpDevelop.Dom
}
public bool IsOverridable {
get {
return (IsOverride || IsVirtual || IsAbstract) && !IsSealed;
return (IsOverride || IsVirtual || IsAbstract ||
// Interface members have IsVirtual == IsAbstract == false. These properties are based on modifiers only.
(this.DeclaringType != null && this.DeclaringType.ClassType == ClassType.Interface))
&& !IsSealed;
}
}
public bool IsNew {

Loading…
Cancel
Save