Skip to content
This repository was archived by the owner on Oct 16, 2020. It is now read-only.

Commit 5a9eb62

Browse files
committed
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
1 parent f3f87a4 commit 5a9eb62

4 files changed

Lines changed: 66 additions & 7 deletions

File tree

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

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -375,18 +375,25 @@ void setPopupPosition(Popup popup, TextEditor textEditor, MouseEventArgs mouseAr
375375
popup.VerticalOffset = popupPosition.Y;
376376
}
377377

378+
/// <summary> Returns Popup position based on mouse position, in device independent units </summary>
378379
Point getPopupPosition(TextEditor textEditor, MouseEventArgs mouseArgs)
379380
{
380381
Point mousePos = mouseArgs.GetPosition(textEditor);
381-
return textEditor.PointToScreen(mousePos + new Vector(-4, 6));
382-
// attempt to align Popup with line bottom
383-
/*TextViewPosition? logicalPos = textEditor.GetPositionFromPoint(mousePos);
382+
Point positionInPixels;
383+
// align Popup with line bottom
384+
TextViewPosition? logicalPos = textEditor.GetPositionFromPoint(mousePos);
384385
if (logicalPos.HasValue) {
385-
return textEditor.TextArea.TextView.GetVisualPosition(logicalPos.Value, VisualYPosition.LineBottom);
386+
var textView = textEditor.TextArea.TextView;
387+
positionInPixels =
388+
textView.PointToScreen(
389+
textView.GetVisualPosition(logicalPos.Value, VisualYPosition.LineBottom) - textView.ScrollOffset);
390+
positionInPixels.X -= 4;
386391
}
387392
else {
388-
return popupPos;
389-
}*/
393+
positionInPixels = textEditor.PointToScreen(mousePos + new Vector(-4, 6));
394+
}
395+
/ use device independent units, because Popup Left/Top are in independent units
396+
return positionInPixels.TransformFromDevice(textEditor);
390397
}
391398

392399
Popup createPopup()

src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Utils/ExtensionMethods.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,18 @@ public static Size TransformFromDevice(this Size size, Visual visual)
156156
Matrix matrix = PresentationSource.FromVisual(visual).CompositionTarget.TransformFromDevice;
157157
return new Size(size.Width * matrix.M11, size.Height * matrix.M22);
158158
}
159+
160+
public static Point TransformToDevice(this Point point, Visual visual)
161+
{
162+
Matrix matrix = PresentationSource.FromVisual(visual).CompositionTarget.TransformToDevice;
163+
return new Point(point.X * matrix.M11, point.Y * matrix.M22);
164+
}
165+
166+
public static Point TransformFromDevice(this Point point, Visual visual)
167+
{
168+
Matrix matrix = PresentationSource.FromVisual(visual).CompositionTarget.TransformFromDevice;
169+
return new Point(point.X * matrix.M11, point.Y * matrix.M22);
170+
}
159171
#endregion
160172

161173
#region System.Drawing <-> WPF conversions

src/Main/Base/Project/Src/Services/Debugger/Tooltips/DebuggerTooltipControl.xaml.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,8 @@ private void btnExpander_Click(object sender, RoutedEventArgs e)
165165
{
166166
var clickedButton = (ToggleButton)e.OriginalSource;
167167
var clickedNode = (ITreeNode)clickedButton.DataContext;
168-
Point buttonPos = clickedButton.PointToScreen(new Point(0, 0));
168+
// use device independent units, because child popup Left/Top are in independent units
169+
Point buttonPos = clickedButton.PointToScreen(new Point(0, 0)).TransformFromDevice(clickedButton);
169170

170171
if (clickedButton.IsChecked.GetValueOrDefault(false))
171172
{

src/Main/Base/Project/Src/Util/ExtensionMethods.cs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
using System.Threading;
1515
using System.Windows;
1616
using System.Windows.Controls;
17+
using System.Windows.Media;
1718
using System.Windows.Documents;
1819
using System.Windows.Forms;
1920

@@ -252,6 +253,44 @@ public static System.Windows.Media.Color ToWpf(this System.Drawing.Color c)
252253
}
253254
#endregion
254255

256+
#region DPI independence
257+
public static Rect TransformToDevice(this Rect rect, Visual visual)
258+
{
259+
Matrix matrix = PresentationSource.FromVisual(visual).CompositionTarget.TransformToDevice;
260+
return Rect.Transform(rect, matrix);
261+
}
262+
263+
public static Rect TransformFromDevice(this Rect rect, Visual visual)
264+
{
265+
Matrix matrix = PresentationSource.FromVisual(visual).CompositionTarget.TransformFromDevice;
266+
return Rect.Transform(rect, matrix);
267+
}
268+
269+
public static Size TransformToDevice(this Size size, Visual visual)
270+
{
271+
Matrix matrix = PresentationSource.FromVisual(visual).CompositionTarget.TransformToDevice;
272+
return new Size(size.Width * matrix.M11, size.Height * matrix.M22);
273+
}
274+
275+
public static Size TransformFromDevice(this Size size, Visual visual)
276+
{
277+
Matrix matrix = PresentationSource.FromVisual(visual).CompositionTarget.TransformFromDevice;
278+
return new Size(size.Width * matrix.M11, size.Height * matrix.M22);
279+
}
280+
281+
public static Point TransformToDevice(this Point point, Visual visual)
282+
{
283+
Matrix matrix = PresentationSource.FromVisual(visual).CompositionTarget.TransformToDevice;
284+
return new Point(point.X * matrix.M11, point.Y * matrix.M22);
285+
}
286+
287+
public static Point TransformFromDevice(this Point point, Visual visual)
288+
{
289+
Matrix matrix = PresentationSource.FromVisual(visual).CompositionTarget.TransformFromDevice;
290+
return new Point(point.X * matrix.M11, point.Y * matrix.M22);
291+
}
292+
#endregion
293+
255294
public static string Replace(this string original, string pattern, string replacement, StringComparison comparisonType)
256295
{
257296
if (original == null)

0 commit comments

Comments
 (0)