Browse Source

implement Popup to let user choose a part (if there are more than one) to jump to in GoToDefinition

pull/59/merge
Siegfried Pammer 13 years ago
parent
commit
d08ff2c7c3
  1. 2
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/AvalonEditEditorUIService.cs
  2. 10
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditorView.cs
  3. 7
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ContextActions/ContextActionsPopup.cs
  4. 3
      src/Main/Base/Project/Refactoring/IContextAction.cs
  5. 62
      src/Main/Base/Project/Src/Editor/Commands/GoToDefinition.cs

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

@ -45,7 +45,7 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -45,7 +45,7 @@ namespace ICSharpCode.AvalonEdit.AddIn
/// <inheritdoc />
public void ShowContextActionsPopup(ContextActionsPopupViewModel viewModel)
{
new ContextActionsPopup { Actions = viewModel }.OpenAtCaretAndFocus();
new ContextActionsPopup { Actions = viewModel }.OpenAtCursorAndFocus();
}
}
}

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

@ -68,6 +68,7 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -68,6 +68,7 @@ namespace ICSharpCode.AvalonEdit.AddIn
this.MouseLeave += TextEditorMouseLeave;
this.Unloaded += OnUnloaded;
this.TextArea.TextView.MouseDown += TextViewMouseDown;
this.TextArea.TextView.MouseUp += TextViewMouseUp;
this.TextArea.Caret.PositionChanged += HighlightBrackets;
this.TextArea.TextView.VisualLinesChanged += CodeEditorView_VisualLinesChanged;
@ -400,10 +401,13 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -400,10 +401,13 @@ namespace ICSharpCode.AvalonEdit.AddIn
#endregion
#region Ctrl+Click Go To Definition
bool ctrlClickExecuted = false;
void TextViewMouseDown(object sender, MouseButtonEventArgs e)
{
// close existing debugger popup immediately on text editor mouse down
TryCloseExistingPopup(false);
ctrlClickExecuted = false;
if (options.CtrlClickGoToDefinition && e.ChangedButton == MouseButton.Left && Keyboard.Modifiers == ModifierKeys.Control) {
// Ctrl+Click Go to definition
@ -415,8 +419,14 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -415,8 +419,14 @@ namespace ICSharpCode.AvalonEdit.AddIn
var goToDefinitionCommand = new GoToDefinition();
goToDefinitionCommand.Run(resolveResult);
e.Handled = true;
ctrlClickExecuted = true;
}
}
void TextViewMouseUp(object sender, MouseButtonEventArgs e)
{
e.Handled = options.CtrlClickGoToDefinition && ctrlClickExecuted;
}
#endregion
public void JumpTo(int line, int column)

7
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ContextActions/ContextActionsPopup.cs

@ -68,6 +68,13 @@ namespace ICSharpCode.AvalonEdit.AddIn.ContextActions @@ -68,6 +68,13 @@ namespace ICSharpCode.AvalonEdit.AddIn.ContextActions
this.Focus();
}
public void OpenAtCursorAndFocus()
{
this.Placement = PlacementMode.MousePoint;
this.IsOpen = true;
this.Focus();
}
public static void SetPosition(Popup popup, ITextEditor editor, int line, int column, bool openAtWordStart = false)
{
var editorUIService = editor == null ? null : editor.GetService(typeof(IEditorUIService)) as IEditorUIService;

3
src/Main/Base/Project/Refactoring/IContextAction.cs

@ -18,10 +18,9 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -18,10 +18,9 @@ namespace ICSharpCode.SharpDevelop.Refactoring
IContextActionProvider Provider { get; }
/// <summary>
/// Name displayed in the context action's popup.
/// Returns the name displayed in the context action's popup.
/// </summary>
/// <param name="context">Refactoring context that can be used by the context action to create the display name.</param>
/// <returns></returns>
string GetDisplayName(EditorRefactoringContext context);
/// <summary>

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

@ -2,12 +2,16 @@ @@ -2,12 +2,16 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.ObjectModel;
using System.IO;
using System.Linq;
using ICSharpCode.AvalonEdit.CodeCompletion;
using ICSharpCode.Core;
using ICSharpCode.Core.Presentation;
using ICSharpCode.NRefactory.Semantics;
using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.SharpDevelop.Editor.ContextActions;
using ICSharpCode.SharpDevelop.Refactoring;
namespace ICSharpCode.SharpDevelop.Editor.Commands
{
@ -18,6 +22,13 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands @@ -18,6 +22,13 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands
if (symbol == null)
return;
var trr = symbol as TypeResolveResult;
var def = symbol.Type.GetDefinition();
if (trr != null && def != null && def.Parts.Count > 1) {
ShowPopupWithPartialClasses(def);
return;
}
DomRegion pos = symbol.GetDefinitionRegion();
if (string.IsNullOrEmpty(pos.FileName)) {
IEntity entity = GetEntity(symbol);
@ -35,5 +46,52 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands @@ -35,5 +46,52 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands
}
}
}
void ShowPopupWithPartialClasses(ITypeDefinition definition)
{
var popupViewModel = new ContextActionsPopupViewModel();
popupViewModel.Title = MenuService.ConvertLabel(StringParser.Parse(
"${res:SharpDevelop.Refactoring.PartsOfClass}", new StringTagPair("Name", definition.Name)));
popupViewModel.Actions = new ObservableCollection<ContextActionViewModel>(definition.Parts.Where(p => !p.Region.IsEmpty).Select(MakeViewModel));
var uiService = SD.GetActiveViewContentService<IEditorUIService>();
if (uiService != null)
uiService.ShowContextActionsPopup(popupViewModel);
}
ContextActionViewModel MakeViewModel(IUnresolvedTypeDefinition entity)
{
var ambience = AmbienceService.GetCurrentAmbience();
ambience.ConversionFlags = ConversionFlags.ShowDeclaringType | ConversionFlags.ShowTypeParameterList;
return new ContextActionViewModel {
Action = new GoToDomRegionAction(entity.Region),
Image = CompletionImage.GetImage(entity),
Comment = string.Format("(in {0})", Path.GetDirectoryName(entity.Region.FileName)),
ChildActions = null
};
}
class GoToDomRegionAction : IContextAction
{
DomRegion target;
public GoToDomRegionAction(DomRegion target)
{
this.target = target;
}
public string GetDisplayName(EditorRefactoringContext context)
{
return Path.GetFileName(target.FileName);
}
public void Execute(EditorRefactoringContext context)
{
SD.FileService.JumpToFilePosition(new FileName(target.FileName), target.BeginLine, target.BeginColumn);
}
IContextActionProvider IContextAction.Provider {
get { return null; }
}
}
}
}

Loading…
Cancel
Save