Browse Source

Added basic classes for editor Context actions (ReSharper-like "bulb").

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@6162 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
pull/1/head
Martin Koníček 15 years ago
parent
commit
d95e218172
  1. 1
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.csproj
  2. 28
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs
  3. 2
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditorView.cs
  4. 79
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ContextActionsRenderer.cs
  5. 6
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Snippets/SnippetManager.cs
  6. 9
      src/AddIns/Misc/SharpRefactoring/Project/SharpRefactoring.addin
  7. 5
      src/AddIns/Misc/SharpRefactoring/Project/SharpRefactoring.csproj
  8. 29
      src/AddIns/Misc/SharpRefactoring/Project/Src/ContextActions/AddUsing.cs
  9. 29
      src/AddIns/Misc/SharpRefactoring/Project/Src/ContextActions/GenerateMember.cs
  10. 39
      src/AddIns/Misc/SharpRefactoring/Project/Src/ContextActions/ImplementAbstractClass.cs
  11. 39
      src/AddIns/Misc/SharpRefactoring/Project/Src/ContextActions/ImplementInterface.cs
  12. 3
      src/AddIns/Misc/SharpRefactoring/Project/Src/SwitchSnippetProvider.cs
  13. 4
      src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
  14. 48
      src/Main/Base/Project/Src/Editor/AvalonEdit/ContextActionsService.cs
  15. 23
      src/Main/Base/Project/Src/Editor/AvalonEdit/IContextActionsProvider.cs
  16. 4
      src/Main/Base/Project/Src/Editor/Commands/FindBaseClasses.cs
  17. 6
      src/Main/Base/Project/Src/Editor/Commands/FindDerivedClassesOrOverrides.cs
  18. 2
      src/Main/Base/Project/Src/Editor/Commands/FindReferences.cs
  19. 2
      src/Main/Base/Project/Src/Editor/Commands/GoToDefinition.cs
  20. 6
      src/Main/Base/Project/Src/Editor/Commands/SymbolUnderCaretMenuCommand.cs
  21. 3
      src/Main/Base/Project/Src/Services/RefactoringService/ContextActions/ContextActionCommand.cs
  22. 13
      src/Main/Base/Project/Src/Services/RefactoringService/ContextActions/ContextActionViewModel.cs
  23. 47
      src/Main/Base/Project/Src/Services/RefactoringService/ContextActions/ContextActionsPopup.cs
  24. 1
      src/Main/Base/Project/Src/Services/RefactoringService/ContextActions/IContextAction.cs
  25. 6
      src/Main/Base/Project/Src/Services/RefactoringService/ContextActionsHelper.cs
  26. 8
      src/Main/Base/Project/Src/Services/RefactoringService/GoToClassAction.cs
  27. 8
      src/Main/Base/Project/Src/Services/RefactoringService/GoToMemberAction.cs
  28. 6
      src/Main/Base/Project/Src/Services/RefactoringService/RefactoringMenuBuilder.cs

1
src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.csproj

@ -89,6 +89,7 @@ @@ -89,6 +89,7 @@
<Compile Include="Src\CodeEditor.cs" />
<Compile Include="Src\CodeEditorAdapter.cs" />
<Compile Include="Src\CodeEditorView.cs" />
<Compile Include="Src\ContextActionsRenderer.cs" />
<Compile Include="Src\ExpressionHighlightRenderer.cs" />
<Compile Include="Src\NewLineConsistencyCheck.cs" />
<Compile Include="Src\SharpDevelopTextEditor.cs" />

28
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs

@ -180,17 +180,17 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -180,17 +180,17 @@ namespace ICSharpCode.AvalonEdit.AddIn
protected virtual CodeEditorView CreateTextEditor()
{
CodeEditorView textEditor = new CodeEditorView();
CodeEditorAdapter adapter = new CodeEditorAdapter(this, textEditor);
textEditor.Adapter = adapter;
TextView textView = textEditor.TextArea.TextView;
CodeEditorView codeEditorView = new CodeEditorView();
CodeEditorAdapter adapter = new CodeEditorAdapter(this, codeEditorView);
codeEditorView.Adapter = adapter;
TextView textView = codeEditorView.TextArea.TextView;
textView.Services.AddService(typeof(ITextEditor), adapter);
textView.Services.AddService(typeof(CodeEditor), this);
textEditor.TextArea.TextEntering += TextAreaTextEntering;
textEditor.TextArea.TextEntered += TextAreaTextEntered;
textEditor.TextArea.Caret.PositionChanged += TextAreaCaretPositionChanged;
textEditor.TextArea.DefaultInputHandler.CommandBindings.Add(
codeEditorView.TextArea.TextEntering += TextAreaTextEntering;
codeEditorView.TextArea.TextEntered += TextAreaTextEntered;
codeEditorView.TextArea.Caret.PositionChanged += TextAreaCaretPositionChanged;
codeEditorView.TextArea.DefaultInputHandler.CommandBindings.Add(
new CommandBinding(CustomCommands.CtrlSpaceCompletion, OnCodeCompletion));
textView.BackgroundRenderers.Add(textMarkerService);
@ -200,16 +200,16 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -200,16 +200,16 @@ namespace ICSharpCode.AvalonEdit.AddIn
textView.Services.AddService(typeof(IEditorUIService), new AvalonEditEditorUIService(textView));
textView.Services.AddService(typeof(IBookmarkMargin), iconBarManager);
textEditor.TextArea.LeftMargins.Insert(0, new IconBarMargin(iconBarManager));
codeEditorView.TextArea.LeftMargins.Insert(0, new IconBarMargin(iconBarManager));
textView.Services.AddService(typeof(ISyntaxHighlighter), new AvalonEditSyntaxHighlighterAdapter(textView));
textEditor.TextArea.MouseRightButtonDown += TextAreaMouseRightButtonDown;
textEditor.TextArea.ContextMenuOpening += TextAreaContextMenuOpening;
textEditor.TextArea.TextCopied += textEditor_TextArea_TextCopied;
textEditor.GotFocus += textEditor_GotFocus;
codeEditorView.TextArea.MouseRightButtonDown += TextAreaMouseRightButtonDown;
codeEditorView.TextArea.ContextMenuOpening += TextAreaContextMenuOpening;
codeEditorView.TextArea.TextCopied += textEditor_TextArea_TextCopied;
codeEditorView.GotFocus += textEditor_GotFocus;
return textEditor;
return codeEditorView;
}
public event EventHandler<TextEventArgs> TextCopied;

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

@ -42,6 +42,7 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -42,6 +42,7 @@ namespace ICSharpCode.AvalonEdit.AddIn
BracketHighlightRenderer bracketRenderer;
CaretReferencesRenderer caretReferencesRenderer;
ContextActionsRenderer contextActionsRenderer;
public CodeEditorView()
{
@ -51,6 +52,7 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -51,6 +52,7 @@ namespace ICSharpCode.AvalonEdit.AddIn
this.bracketRenderer = new BracketHighlightRenderer(this.TextArea.TextView);
this.caretReferencesRenderer = new CaretReferencesRenderer(this);
this.contextActionsRenderer = new ContextActionsRenderer(this);
this.MouseHover += TextEditorMouseHover;
this.MouseHoverStopped += TextEditorMouseHoverStopped;

79
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ContextActionsRenderer.cs

@ -0,0 +1,79 @@ @@ -0,0 +1,79 @@
// <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 System.Collections.ObjectModel;
using System.Linq;
using System.Windows.Threading;
using ICSharpCode.SharpDevelop.Editor;
using ICSharpCode.SharpDevelop.Editor.AvalonEdit;
using ICSharpCode.SharpDevelop.Refactoring;
namespace ICSharpCode.AvalonEdit.AddIn
{
/// <summary>
/// Renders Popup with context actions on the left side of the current line in the editor.
/// </summary>
public class ContextActionsRenderer
{
readonly CodeEditorView editorView;
ITextEditor Editor { get { return this.editorView.Adapter; } }
/// <summary>
/// This popup is reused (closed and opened again).
/// </summary>
ContextActionsPopup popup = new ContextActionsPopup() { StaysOpen = true };
/// <summary>
/// Delays the available actions resolution so that it does not get called too often when user holds an arrow.
/// </summary>
DispatcherTimer delayMoveTimer;
const int delayMoveMilliseconds = 100;
public ContextActionsRenderer(CodeEditorView editor)
{
if (editor == null)
throw new ArgumentNullException("editor");
this.editorView = editor;
this.editorView.TextArea.Caret.PositionChanged += CaretPositionChanged;
editor.TextArea.TextView.ScrollOffsetChanged += ScrollChanged;
this.delayMoveTimer = new DispatcherTimer() { Interval = TimeSpan.FromMilliseconds(delayMoveMilliseconds) };
this.delayMoveTimer.Stop();
this.delayMoveTimer.Tick += TimerMoveTick;
}
void ScrollChanged(object sender, EventArgs e)
{
this.popup.Close();
}
void TimerMoveTick(object sender, EventArgs e)
{
this.delayMoveTimer.Stop();
var availableActions = ContextActionsService.Instance.GetAvailableActions(this.Editor);
var availableActionsVM = new ObservableCollection<ContextActionViewModel>(
availableActions.Select(a => new ContextActionViewModel(a)));
if (availableActionsVM.Count == 0)
return;
this.popup.Actions = new ContextActionsViewModel {
Title = "Actions",
Actions = availableActionsVM
};
this.popup.OpenAtLineStart(this.Editor);
}
void CaretPositionChanged(object sender, EventArgs e)
{
this.popup.Close();
this.popup.Actions = null;
this.delayMoveTimer.Stop();
this.delayMoveTimer.Start();
}
}
}

6
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Snippets/SnippetManager.cs

@ -38,6 +38,12 @@ namespace ICSharpCode.AvalonEdit.AddIn.Snippets @@ -38,6 +38,12 @@ namespace ICSharpCode.AvalonEdit.AddIn.Snippets
Text = "foreach (${var} ${element} in ${collection}) {\n\t${Selection}\n}",
Keyword = "foreach"
},
/*new CodeSnippet {
Name = "ff",
Description = "foreach loop",
Text = "foreach (var ${toElementName(items)} in ${items}) {\n\t${Selection}\n}",
Keyword = "foreach"
},*/
new CodeSnippet {
Name = "if",
Description = "if statement",

9
src/AddIns/Misc/SharpRefactoring/Project/SharpRefactoring.addin

@ -48,7 +48,14 @@ @@ -48,7 +48,14 @@
<Path name="/SharpDevelop/ViewContent/AvalonEdit/SnippetElementProviders">
<Class id="ctor" class="SharpRefactoring.InsertCtorSnippetRefactoring" />
<Class id="ctor" class="SharpRefactoring.SwitchSnippetProvider" />
<Class id="switch" class="SharpRefactoring.SwitchSnippetProvider" />
</Path>
<Path name="/SharpDevelop/ViewContent/AvalonEdit/ContextActionProviders">
<Class id="addUsing" class="SharpRefactoring.ContextActions.AddUsingProvider" />
<Class id="implementInterface" class="SharpRefactoring.ContextActions.ImplementInterfaceProvider" />
<Class id="implementAbstractClass" class="SharpRefactoring.ContextActions.ImplementAbstractClassProvider" />
<Class id="generateMember" class="SharpRefactoring.ContextActions.GenerateMemberProvider" />
</Path>
<Path name="/SharpDevelop/ViewContent/TextEditor/OverrideCompletionHandler">

5
src/AddIns/Misc/SharpRefactoring/Project/SharpRefactoring.csproj

@ -70,6 +70,10 @@ @@ -70,6 +70,10 @@
</None>
<Compile Include="Configuration\AssemblyInfo.cs" />
<Compile Include="Src\ClassRefactoringSubmenuBuilder.cs" />
<Compile Include="Src\ContextActions\AddUsing.cs" />
<Compile Include="Src\ContextActions\GenerateMember.cs" />
<Compile Include="Src\ContextActions\ImplementAbstractClass.cs" />
<Compile Include="Src\ContextActions\ImplementInterface.cs" />
<Compile Include="Src\CSharpMethodExtractor.cs" />
<Compile Include="Src\Extensions.cs" />
<Compile Include="Src\ExtractMethodCommand.cs" />
@ -122,6 +126,7 @@ @@ -122,6 +126,7 @@
</ItemGroup>
<ItemGroup>
<Folder Include="Src\Gui" />
<Folder Include="Src\ContextActions" />
</ItemGroup>
<ItemGroup>
<Page Include="Src\Gui\InsertCtorDialog.xaml" />

29
src/AddIns/Misc/SharpRefactoring/Project/Src/ContextActions/AddUsing.cs

@ -0,0 +1,29 @@ @@ -0,0 +1,29 @@
// <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 System.Collections.Generic;
using ICSharpCode.SharpDevelop.Editor;
using ICSharpCode.SharpDevelop.Editor.AvalonEdit;
using ICSharpCode.SharpDevelop.Refactoring;
namespace SharpRefactoring.ContextActions
{
/// <summary>
/// Description of AddUsing.
/// </summary>
public class AddUsingProvider : IContextActionsProvider
{
public IEnumerable<IContextAction> GetAvailableActions(ITextEditor editor)
{
yield break;
}
}
public class AddUsingAction
{
}
}

29
src/AddIns/Misc/SharpRefactoring/Project/Src/ContextActions/GenerateMember.cs

@ -0,0 +1,29 @@ @@ -0,0 +1,29 @@
// <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 System.Collections.Generic;
using ICSharpCode.SharpDevelop.Editor;
using ICSharpCode.SharpDevelop.Editor.AvalonEdit;
using ICSharpCode.SharpDevelop.Refactoring;
namespace SharpRefactoring.ContextActions
{
/// <summary>
/// Description of GenerateMember.
/// </summary>
public class GenerateMemberProvider : IContextActionsProvider
{
public IEnumerable<IContextAction> GetAvailableActions(ITextEditor editor)
{
yield break;
}
}
public class GenerateMemberAction
{
}
}

39
src/AddIns/Misc/SharpRefactoring/Project/Src/ContextActions/ImplementAbstractClass.cs

@ -0,0 +1,39 @@ @@ -0,0 +1,39 @@
// <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 System.Collections.Generic;
using System.Windows;
using ICSharpCode.SharpDevelop.Editor;
using ICSharpCode.SharpDevelop.Editor.AvalonEdit;
using ICSharpCode.SharpDevelop.Refactoring;
namespace SharpRefactoring.ContextActions
{
/// <summary>
/// Description of ImplementAbstractClass.
/// </summary>
public class ImplementAbstractClassProvider : IContextActionsProvider
{
public IEnumerable<IContextAction> GetAvailableActions(ITextEditor editor)
{
var currentLine = editor.Document.GetLine(editor.Caret.Line);
yield break;
}
}
public class ImplementAbstractClassAction : IContextAction
{
public string Title {
get { return "Dummy implement abstract class"; }
}
public void Execute()
{
MessageBox.Show("Dummy implement abstract class");
}
}
}

39
src/AddIns/Misc/SharpRefactoring/Project/Src/ContextActions/ImplementInterface.cs

@ -0,0 +1,39 @@ @@ -0,0 +1,39 @@
// <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 System.Collections.Generic;
using System.Windows;
using ICSharpCode.SharpDevelop.Editor;
using ICSharpCode.SharpDevelop.Editor.AvalonEdit;
using ICSharpCode.SharpDevelop.Refactoring;
namespace SharpRefactoring.ContextActions
{
/// <summary>
/// Description of ImplementInterface.
/// </summary>
public class ImplementInterfaceProvider : IContextActionsProvider
{
public IEnumerable<IContextAction> GetAvailableActions(ITextEditor editor)
{
var currentLine = editor.Document.GetLine(editor.Caret.Line);
yield break;
}
}
public class ImplementInterfaceAction : IContextAction
{
public string Title {
get { return "Dummy implement interface"; }
}
public void Execute()
{
MessageBox.Show("Dummy implement interface");
}
}
}

3
src/AddIns/Misc/SharpRefactoring/Project/Src/SwitchSnippetProvider.cs

@ -11,7 +11,8 @@ using ICSharpCode.SharpDevelop.Editor.AvalonEdit; @@ -11,7 +11,8 @@ using ICSharpCode.SharpDevelop.Editor.AvalonEdit;
namespace SharpRefactoring
{
/// <summary>
/// Description of SwitchSnippetProvider.
/// Registers refactoring:switchbody snippet tag.
/// (path /SharpDevelop/ViewContent/AvalonEdit/SnippetElementProviders)
/// </summary>
public class SwitchSnippetProvider : ISnippetElementProvider
{

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

@ -89,6 +89,8 @@ @@ -89,6 +89,8 @@
<Compile Include="Src\Editor\AvalonEdit\AvalonEditSyntaxHighlighterAdapter.cs" />
<Compile Include="Src\Editor\AvalonEdit\AvalonEditTextEditorAdapter.cs" />
<Compile Include="Src\Editor\AvalonEdit\AvalonEditTextSourceAdapter.cs" />
<Compile Include="Src\Editor\AvalonEdit\ContextActionsService.cs" />
<Compile Include="Src\Editor\AvalonEdit\IContextActionsProvider.cs" />
<Compile Include="Src\Editor\AvalonEdit\IndentationStrategyAdapter.cs" />
<Compile Include="Src\Editor\AvalonEdit\ISnippetElementProvider.cs" />
<Compile Include="Src\Editor\AvalonEdit\TextContentCondition.cs" />
@ -103,7 +105,7 @@ @@ -103,7 +105,7 @@
<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\Commands\SymbolUnderCaretMenuCommand.cs" />
<Compile Include="Src\Editor\IEditorControlService.cs" />
<Compile Include="Src\Editor\IEditorUIService.cs" />
<Compile Include="Src\Editor\CodeCompletion\AttributesItemProvider.cs" />

48
src/Main/Base/Project/Src/Editor/AvalonEdit/ContextActionsService.cs

@ -0,0 +1,48 @@ @@ -0,0 +1,48 @@
// <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 System.Collections.Generic;
using System.Linq;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Refactoring;
namespace ICSharpCode.SharpDevelop.Editor.AvalonEdit
{
/// <summary>
/// Provides context actions available for current line of the editor.
/// </summary>
public sealed class ContextActionsService
{
private static ContextActionsService instance = new ContextActionsService();
public static ContextActionsService Instance {
get {
return instance;
}
}
List<IContextActionsProvider> providers;
private ContextActionsService()
{
this.providers = AddInTree.BuildItems<IContextActionsProvider>("/SharpDevelop/ViewContent/AvalonEdit/ContextActionProviders", null, false);
}
/// <summary>
/// Gets actions available for current line of the editor.
/// </summary>
public IEnumerable<IContextAction> GetAvailableActions(ITextEditor editor)
{
// could run providers in parallel
foreach (var provider in this.providers) {
foreach (var action in provider.GetAvailableActions(editor)) {
yield return action;
}
}
}
}
}

23
src/Main/Base/Project/Src/Editor/AvalonEdit/IContextActionsProvider.cs

@ -0,0 +1,23 @@ @@ -0,0 +1,23 @@
// <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 System.Collections.Generic;
using ICSharpCode.SharpDevelop.Refactoring;
namespace ICSharpCode.SharpDevelop.Editor.AvalonEdit
{
/// <summary>
/// Provides <see cref="ContextAction" />s to appear in a popup on the left side of the editor.
/// </summary>
public interface IContextActionsProvider
{
/// <summary>
/// Gets actions available for current line of the editor.
/// </summary>
IEnumerable<IContextAction> GetAvailableActions(ITextEditor editor);
}
}

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

@ -14,14 +14,14 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands @@ -14,14 +14,14 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands
/// <summary>
/// Description of FindBaseClasses.
/// </summary>
public class FindBaseClasses : SymbolUnderCaretCommand
public class FindBaseClasses : SymbolUnderCaretMenuCommand
{
protected override void RunImpl(ITextEditor editor, int offset, ResolveResult symbol)
{
var classUnderCaret = GetClass(symbol);
if (classUnderCaret != null)
{
ContextActionsHelper.MakePopupWithBaseClasses(classUnderCaret).Open(editor);
ContextActionsHelper.MakePopupWithBaseClasses(classUnderCaret).OpenAtCaretAndFocus(editor);
return;
}
MessageService.ShowError("${res:ICSharpCode.Refactoring.NoClassUnderCursorError}");

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

@ -14,19 +14,19 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands @@ -14,19 +14,19 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands
/// <summary>
/// Description of FindDerivedClassesOrOverrides.
/// </summary>
public class FindDerivedClassesOrOverrides : SymbolUnderCaretCommand
public class FindDerivedClassesOrOverrides : SymbolUnderCaretMenuCommand
{
protected override void RunImpl(ITextEditor editor, int offset, ResolveResult symbol)
{
var classUnderCaret = GetClass(symbol);
if (classUnderCaret != null) {
ContextActionsHelper.MakePopupWithDerivedClasses(classUnderCaret).Open(editor);
ContextActionsHelper.MakePopupWithDerivedClasses(classUnderCaret).OpenAtCaretAndFocus(editor);
return;
}
var memberUnderCaret = GetMember(symbol);
if (memberUnderCaret != null && memberUnderCaret.IsOverridable)
{
ContextActionsHelper.MakePopupWithOverrides(memberUnderCaret).Open(editor);
ContextActionsHelper.MakePopupWithOverrides(memberUnderCaret).OpenAtCaretAndFocus(editor);
return;
}
MessageService.ShowError("${res:ICSharpCode.Refactoring.NoClassOrOverridableSymbolUnderCursorError}");

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

@ -13,7 +13,7 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands @@ -13,7 +13,7 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands
/// <summary>
/// Description of FindReferences.
/// </summary>
public class FindReferences : SymbolUnderCaretCommand
public class FindReferences : SymbolUnderCaretMenuCommand
{
protected override void RunImpl(ITextEditor editor, int offset, ResolveResult symbol)
{

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

@ -12,7 +12,7 @@ using ICSharpCode.SharpDevelop.Gui; @@ -12,7 +12,7 @@ using ICSharpCode.SharpDevelop.Gui;
namespace ICSharpCode.SharpDevelop.Editor.Commands
{
public class GoToDefinition : SymbolUnderCaretCommand
public class GoToDefinition : SymbolUnderCaretMenuCommand
{
protected override void RunImpl(ITextEditor editor, int offset, ResolveResult symbol)
{

6
src/Main/Base/Project/Src/Editor/Commands/SymbolUnderCaretCommand.cs → src/Main/Base/Project/Src/Editor/Commands/SymbolUnderCaretMenuCommand.cs

@ -14,7 +14,7 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands @@ -14,7 +14,7 @@ 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 abstract class SymbolUnderCaretMenuCommand : AbstractMenuCommand
{
public override void Run()
{
@ -30,6 +30,8 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands @@ -30,6 +30,8 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands
RunImpl(editor, caretOffset, resolveResult);
}
protected abstract void RunImpl(ITextEditor editor, int caretOffset, ResolveResult symbol);
public IClass GetClass(ResolveResult symbol)
{
if (symbol == null || !(symbol is TypeResolveResult)) {
@ -45,7 +47,5 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands @@ -45,7 +47,5 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands
}
return ((MemberResolveResult)symbol).ResolvedMember;
}
protected abstract void RunImpl(ITextEditor editor, int caretOffset, ResolveResult symbol);
}
}

3
src/Main/Base/Project/Src/Services/RefactoringService/ContextActions/ContextActionCommand.cs

@ -10,7 +10,7 @@ using System.Windows.Input; @@ -10,7 +10,7 @@ using System.Windows.Input;
namespace ICSharpCode.SharpDevelop.Refactoring
{
/// <summary>
/// Description of ContextActionCommand.
/// Just wraps <see cref="IContextAction"></see> inside a WPF Command to be used in XAML.
/// </summary>
public class ContextActionCommand : ICommand
{
@ -25,6 +25,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -25,6 +25,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring
public event EventHandler CanExecuteChanged
{
// not supported - Context actions can always be executed
add { }
remove { }
}

13
src/Main/Base/Project/Src/Services/RefactoringService/ContextActions/ContextActionViewModel.cs

@ -18,7 +18,18 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -18,7 +18,18 @@ namespace ICSharpCode.SharpDevelop.Refactoring
/// </summary>
public class ContextActionViewModel
{
public string Name { get; set; }
public ContextActionViewModel()
{
}
public ContextActionViewModel(IContextAction action)
{
if (action == null)
throw new ArgumentNullException("action");
this.Action = action;
}
public string Name { get { return this.action.Title; } }
public string Comment { get; set; }

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

@ -35,13 +35,13 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -35,13 +35,13 @@ namespace ICSharpCode.SharpDevelop.Refactoring
Close();
}
private ContextActionsControl ActionsControl
private ContextActionsControl ActionsControl
{
get { return (ContextActionsControl)this.Child; }
set { this.Child = value; }
}
public ContextActionsViewModel Actions
public ContextActionsViewModel Actions
{
get { return (ContextActionsViewModel)ActionsControl.DataContext; }
set { ActionsControl.DataContext = value; }
@ -62,30 +62,49 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -62,30 +62,49 @@ namespace ICSharpCode.SharpDevelop.Refactoring
this.IsOpen = false;
}
public void Open(ITextEditor editor)
public void OpenAtCaretAndFocus(ITextEditor editor)
{
OpenAtPosition(editor, editor.Caret.Line, editor.Caret.Column, true);
this.Focus();
}
public void OpenAtLineStart(ITextEditor editor)
{
OpenAtPosition(editor, editor.Caret.Line, 1, false);
}
void OpenAtPosition(ITextEditor editor, int line, int column, bool openAtWordStart)
{
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;
if (openAtWordStart) {
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;
try
{
var caretScreenPos = editorUIService.GetScreenPosition(line, column);
this.HorizontalOffset = caretScreenPos.X;
this.VerticalOffset = caretScreenPos.Y;
}
catch
{
this.HorizontalOffset = 200;
this.VerticalOffset = 200;
}
} else {
this.HorizontalOffset = 200;
this.VerticalOffset = 200;
}
this.Open();
this.Focus();
}
}
}

1
src/Main/Base/Project/Src/Services/RefactoringService/ContextActions/IContextAction.cs

@ -14,6 +14,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -14,6 +14,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring
/// </summary>
public interface IContextAction
{
string Title { get; }
void Execute();
}
}

6
src/Main/Base/Project/Src/Services/RefactoringService/ContextActionsHelper.cs

@ -65,10 +65,9 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -65,10 +65,9 @@ namespace ICSharpCode.SharpDevelop.Refactoring
protected ContextActionViewModel MakeGoToClassAction(IClass @class, ObservableCollection<ContextActionViewModel> childActions)
{
return new ContextActionViewModel {
Name = this.LabelAmbience.Convert(@class),
Action = new GoToClassAction(@class, this.LabelAmbience),
Image = ClassBrowserIconService.GetIcon(@class).ImageSource,
Comment = string.Format("(in {0})", @class.Namespace),
Action = new GoToClassAction(@class),
ChildActions = childActions
};
}
@ -111,10 +110,9 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -111,10 +110,9 @@ namespace ICSharpCode.SharpDevelop.Refactoring
return null;
return new ContextActionViewModel {
Name = this.LabelAmbience.Convert(overridenMember),
Action = new GoToMemberAction(overridenMember, this.LabelAmbience),
Image = ClassBrowserIconService.GetIcon(overridenMember).ImageSource,
Comment = string.Format("(in {0})", containingClass.FullyQualifiedName),
Action = new GoToMemberAction(overridenMember),
ChildActions = childActions
};
}

8
src/Main/Base/Project/Src/Services/RefactoringService/GoToClassAction.cs

@ -14,20 +14,24 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -14,20 +14,24 @@ namespace ICSharpCode.SharpDevelop.Refactoring
/// </summary>
public class GoToClassAction : IContextAction
{
public string Title { get; private set; }
public IClass Class { get; private set; }
public GoToClassAction(IClass c)
public GoToClassAction(IClass c, IAmbience ambience)
{
if (ambience == null)
throw new ArgumentNullException("ambience");
if (c == null)
throw new ArgumentNullException("c");
this.Class = c;
this.Title = ambience.Convert(c);
}
public void Execute()
{
var cu = this.Class.CompilationUnit;
var region = this.Class.Region;
if (cu == null || cu.FileName == null || this.Class.Region.IsEmpty)
if (cu == null || cu.FileName == null || region == null || region.IsEmpty)
return;
FileService.JumpToFilePosition(cu.FileName, region.BeginLine, region.BeginColumn);
}

8
src/Main/Base/Project/Src/Services/RefactoringService/GoToMemberAction.cs

@ -14,20 +14,24 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -14,20 +14,24 @@ namespace ICSharpCode.SharpDevelop.Refactoring
/// </summary>
public class GoToMemberAction : IContextAction
{
public string Title { get; private set; }
public IMember Member { get; private set; }
public GoToMemberAction(IMember member)
public GoToMemberAction(IMember member, IAmbience ambience)
{
if (ambience == null)
throw new ArgumentNullException("ambience");
if (member == null)
throw new ArgumentNullException("member");
this.Member = member;
this.Title = ambience.Convert(member);
}
public void Execute()
{
var cu = this.Member.CompilationUnit;
var region = this.Member.Region;
if (cu == null || cu.FileName == null || region.IsEmpty)
if (cu == null || cu.FileName == null || region == null || region.IsEmpty)
return;
FileService.JumpToFilePosition(cu.FileName, region.BeginLine, region.BeginColumn);
}

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

@ -195,7 +195,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -195,7 +195,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring
item.Icon = ClassBrowserIconService.Class.CreateImage();
item.InputGestureText = new KeyGesture(Key.F9).GetDisplayStringForCulture(Thread.CurrentThread.CurrentUICulture);
item.Click += delegate {
ContextActionsHelper.MakePopupWithDerivedClasses(baseClass).Open(context.Editor);
ContextActionsHelper.MakePopupWithDerivedClasses(baseClass).OpenAtCaretAndFocus(context.Editor);
};
return item;
}
@ -208,7 +208,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -208,7 +208,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring
item.Icon = ClassBrowserIconService.Interface.CreateImage();
//item.InputGestureText = new KeyGesture(Key.F10).GetDisplayStringForCulture(Thread.CurrentThread.CurrentUICulture);
item.Click += delegate {
ContextActionsHelper.MakePopupWithBaseClasses(@class).Open(context.Editor);
ContextActionsHelper.MakePopupWithBaseClasses(@class).OpenAtCaretAndFocus(context.Editor);
};
return item;
}
@ -221,7 +221,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -221,7 +221,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring
item.Icon = ClassBrowserIconService.Method.CreateImage();
item.InputGestureText = new KeyGesture(Key.F9).GetDisplayStringForCulture(Thread.CurrentThread.CurrentUICulture);
item.Click += delegate {
ContextActionsHelper.MakePopupWithOverrides(member).Open(context.Editor);
ContextActionsHelper.MakePopupWithOverrides(member).OpenAtCaretAndFocus(context.Editor);
};
return item;
}

Loading…
Cancel
Save