Browse Source

Editor context menus for Find derived classes etc. open at right position: added GetScreenPosition(int line, int column) to IEditorUIService.

TODO test on higher DPI.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@6057 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
pull/1/head
Martin Koníček 15 years ago
parent
commit
3038b54842
  1. 10
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/AvalonEditEditorUIService.cs
  2. 4
      src/Main/Base/Project/Src/Editor/IEditorUIService.cs
  3. 47
      src/Main/Base/Project/Src/Services/RefactoringService/RefactoringMenuBuilder.cs

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

@ -9,6 +9,7 @@ using System; @@ -9,6 +9,7 @@ using System;
using System.Windows;
using ICSharpCode.AvalonEdit.Document;
using ICSharpCode.AvalonEdit.Rendering;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Editor;
namespace ICSharpCode.AvalonEdit.AddIn
@ -22,6 +23,7 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -22,6 +23,7 @@ namespace ICSharpCode.AvalonEdit.AddIn
this.textView = textView;
}
/// <inheritdoc />
public IInlineUIElement CreateInlineUIElement(ITextAnchor position, UIElement element)
{
if (position == null)
@ -32,5 +34,13 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -32,5 +34,13 @@ namespace ICSharpCode.AvalonEdit.AddIn
this.textView.ElementGenerators.Add(inline);
return inline;
}
/// <inheritdoc />
public Point GetScreenPosition(int line, int column)
{
var positionInPixels = textView.PointToScreen(
textView.GetVisualPosition(new TextViewPosition(line, column), VisualYPosition.LineBottom) - textView.ScrollOffset);
return positionInPixels.TransformFromDevice(textView);
}
}
}

4
src/Main/Base/Project/Src/Editor/IEditorUIService.cs

@ -14,6 +14,10 @@ namespace ICSharpCode.SharpDevelop.Editor @@ -14,6 +14,10 @@ namespace ICSharpCode.SharpDevelop.Editor
public interface IEditorUIService
{
IInlineUIElement CreateInlineUIElement(ITextAnchor position, UIElement element);
/// <summary>
/// Gets the absolute screen position of given position in the document.
/// </summary>
Point GetScreenPosition(int line, int column);
}
public interface IInlineUIElement

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

@ -15,6 +15,7 @@ using System.Linq; @@ -15,6 +15,7 @@ using System.Linq;
using System.Threading;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Input;
using ICSharpCode.Core;
using ICSharpCode.Core.Presentation;
@ -177,8 +178,8 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -177,8 +178,8 @@ 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)) {
// Interface members have IsVirtual == IsAbstract == false. These properties are based on modifiers only.
|| (member.DeclaringType != null && member.DeclaringType.ClassType == ClassType.Interface)) {
contextItems.AddIfNotNull(MakeFindOverridesItem(member, context));
}
}
@ -192,11 +193,8 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -192,11 +193,8 @@ namespace ICSharpCode.SharpDevelop.Refactoring
var item = new MenuItem { Header = MenuService.ConvertLabel(StringParser.Parse("${res:SharpDevelop.Refactoring.FindDerivedClassesCommand}")) };
item.Icon = ClassBrowserIconService.Class.CreateImage();
item.InputGestureText = new KeyGesture(Key.F11).GetDisplayStringForCulture(Thread.CurrentThread.CurrentUICulture);
item.Click += delegate {
var derivedClassesPopup = ContextActionsHelper.MakePopupWithDerivedClasses(baseClass);
// position popup to caret - how?
derivedClassesPopup.Open();
derivedClassesPopup.Focus();
item.Click += delegate {
OpenPopup(ContextActionsHelper.MakePopupWithDerivedClasses(baseClass), context);
};
return item;
}
@ -209,10 +207,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -209,10 +207,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring
item.Icon = ClassBrowserIconService.Interface.CreateImage();
item.InputGestureText = new KeyGesture(Key.F10).GetDisplayStringForCulture(Thread.CurrentThread.CurrentUICulture);
item.Click += delegate {
var baseClassesPopup = ContextActionsHelper.MakePopupWithBaseClasses(@class);
// position popup to caret - how?
baseClassesPopup.Open();
baseClassesPopup.Focus();
OpenPopup(ContextActionsHelper.MakePopupWithBaseClasses(@class), context);
};
return item;
}
@ -225,14 +220,36 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -225,14 +220,36 @@ namespace ICSharpCode.SharpDevelop.Refactoring
item.Icon = ClassBrowserIconService.Method.CreateImage();
item.InputGestureText = new KeyGesture(Key.F11).GetDisplayStringForCulture(Thread.CurrentThread.CurrentUICulture);
item.Click += delegate {
var overridesPopup = ContextActionsHelper.MakePopupWithOverrides(member);
// position popup to caret - how?
overridesPopup.Open();
overridesPopup.Focus();
OpenPopup(ContextActionsHelper.MakePopupWithOverrides(member), context);
};
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)

Loading…
Cancel
Save