From 5a9eb62f099eafb232905cea6e15b24230d6100f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Kon=C3=AD=C4=8Dek?= Date: Tue, 18 Aug 2009 23:13:00 +0000 Subject: [PATCH] Debugger tooltips: - fixed tooltip position on non-default DPI - tooltip is aligned to line bottom git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@4732 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../AvalonEdit.AddIn/Src/CodeEditor.cs | 19 ++++++--- .../Utils/ExtensionMethods.cs | 12 ++++++ .../Tooltips/DebuggerTooltipControl.xaml.cs | 3 +- .../Base/Project/Src/Util/ExtensionMethods.cs | 39 +++++++++++++++++++ 4 files changed, 66 insertions(+), 7 deletions(-) diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs index c35620822e..a90fdef4f8 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs @@ -375,18 +375,25 @@ namespace ICSharpCode.AvalonEdit.AddIn popup.VerticalOffset = popupPosition.Y; } + /// Returns Popup position based on mouse position, in device independent units Point getPopupPosition(TextEditor textEditor, MouseEventArgs mouseArgs) { Point mousePos = mouseArgs.GetPosition(textEditor); - return textEditor.PointToScreen(mousePos + new Vector(-4, 6)); - // attempt to align Popup with line bottom - /*TextViewPosition? logicalPos = textEditor.GetPositionFromPoint(mousePos); + Point positionInPixels; + // align Popup with line bottom + TextViewPosition? logicalPos = textEditor.GetPositionFromPoint(mousePos); if (logicalPos.HasValue) { - return textEditor.TextArea.TextView.GetVisualPosition(logicalPos.Value, VisualYPosition.LineBottom); + var textView = textEditor.TextArea.TextView; + positionInPixels = + textView.PointToScreen( + textView.GetVisualPosition(logicalPos.Value, VisualYPosition.LineBottom) - textView.ScrollOffset); + positionInPixels.X -= 4; } else { - return popupPos; - }*/ + positionInPixels = textEditor.PointToScreen(mousePos + new Vector(-4, 6)); + } + / use device independent units, because Popup Left/Top are in independent units + return positionInPixels.TransformFromDevice(textEditor); } Popup createPopup() diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Utils/ExtensionMethods.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Utils/ExtensionMethods.cs index 633a7d93bc..60b547fa6d 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Utils/ExtensionMethods.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Utils/ExtensionMethods.cs @@ -156,6 +156,18 @@ namespace ICSharpCode.AvalonEdit.Utils Matrix matrix = PresentationSource.FromVisual(visual).CompositionTarget.TransformFromDevice; return new Size(size.Width * matrix.M11, size.Height * matrix.M22); } + + public static Point TransformToDevice(this Point point, Visual visual) + { + Matrix matrix = PresentationSource.FromVisual(visual).CompositionTarget.TransformToDevice; + return new Point(point.X * matrix.M11, point.Y * matrix.M22); + } + + public static Point TransformFromDevice(this Point point, Visual visual) + { + Matrix matrix = PresentationSource.FromVisual(visual).CompositionTarget.TransformFromDevice; + return new Point(point.X * matrix.M11, point.Y * matrix.M22); + } #endregion #region System.Drawing <-> WPF conversions diff --git a/src/Main/Base/Project/Src/Services/Debugger/Tooltips/DebuggerTooltipControl.xaml.cs b/src/Main/Base/Project/Src/Services/Debugger/Tooltips/DebuggerTooltipControl.xaml.cs index 74e0d9f3cd..3717e83558 100644 --- a/src/Main/Base/Project/Src/Services/Debugger/Tooltips/DebuggerTooltipControl.xaml.cs +++ b/src/Main/Base/Project/Src/Services/Debugger/Tooltips/DebuggerTooltipControl.xaml.cs @@ -165,7 +165,8 @@ namespace ICSharpCode.SharpDevelop.Debugging { var clickedButton = (ToggleButton)e.OriginalSource; var clickedNode = (ITreeNode)clickedButton.DataContext; - Point buttonPos = clickedButton.PointToScreen(new Point(0, 0)); + // use device independent units, because child popup Left/Top are in independent units + Point buttonPos = clickedButton.PointToScreen(new Point(0, 0)).TransformFromDevice(clickedButton); if (clickedButton.IsChecked.GetValueOrDefault(false)) { diff --git a/src/Main/Base/Project/Src/Util/ExtensionMethods.cs b/src/Main/Base/Project/Src/Util/ExtensionMethods.cs index 458bad65f6..4a2d66a62b 100644 --- a/src/Main/Base/Project/Src/Util/ExtensionMethods.cs +++ b/src/Main/Base/Project/Src/Util/ExtensionMethods.cs @@ -14,6 +14,7 @@ using System.Text; using System.Threading; using System.Windows; using System.Windows.Controls; +using System.Windows.Media; using System.Windows.Documents; using System.Windows.Forms; @@ -252,6 +253,44 @@ namespace ICSharpCode.SharpDevelop } #endregion + #region DPI independence + public static Rect TransformToDevice(this Rect rect, Visual visual) + { + Matrix matrix = PresentationSource.FromVisual(visual).CompositionTarget.TransformToDevice; + return Rect.Transform(rect, matrix); + } + + public static Rect TransformFromDevice(this Rect rect, Visual visual) + { + Matrix matrix = PresentationSource.FromVisual(visual).CompositionTarget.TransformFromDevice; + return Rect.Transform(rect, matrix); + } + + public static Size TransformToDevice(this Size size, Visual visual) + { + Matrix matrix = PresentationSource.FromVisual(visual).CompositionTarget.TransformToDevice; + return new Size(size.Width * matrix.M11, size.Height * matrix.M22); + } + + public static Size TransformFromDevice(this Size size, Visual visual) + { + Matrix matrix = PresentationSource.FromVisual(visual).CompositionTarget.TransformFromDevice; + return new Size(size.Width * matrix.M11, size.Height * matrix.M22); + } + + public static Point TransformToDevice(this Point point, Visual visual) + { + Matrix matrix = PresentationSource.FromVisual(visual).CompositionTarget.TransformToDevice; + return new Point(point.X * matrix.M11, point.Y * matrix.M22); + } + + public static Point TransformFromDevice(this Point point, Visual visual) + { + Matrix matrix = PresentationSource.FromVisual(visual).CompositionTarget.TransformFromDevice; + return new Point(point.X * matrix.M11, point.Y * matrix.M22); + } + #endregion + public static string Replace(this string original, string pattern, string replacement, StringComparison comparisonType) { if (original == null)