From 4f2269751fec54c9408d60651b874f22ce200703 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Tue, 21 Sep 2010 14:48:29 +0200 Subject: [PATCH] Fixed inaccuracy in GetVisualLineElementFromPosition (was incorrect by up to a half visual column) --- .../ICSharpCode.AvalonEdit/Rendering/TextView.cs | 4 ++-- .../ICSharpCode.AvalonEdit/Rendering/VisualLine.cs | 12 ++++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Rendering/TextView.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Rendering/TextView.cs index ed5338030b..ea3e74fe00 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Rendering/TextView.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Rendering/TextView.cs @@ -1307,10 +1307,10 @@ namespace ICSharpCode.AvalonEdit.Rendering { VisualLine vl = GetVisualLineFromVisualTop(visualPosition.Y); if (vl != null) { - int column = vl.GetVisualColumn(visualPosition); + int column = vl.GetVisualColumnFloor(visualPosition); // Debug.WriteLine(vl.FirstDocumentLine.LineNumber + " vc " + column); foreach (VisualLineElement element in vl.Elements) { - if (element.VisualColumn + element.VisualLength < column) + if (element.VisualColumn + element.VisualLength <= column) continue; return element; } diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Rendering/VisualLine.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Rendering/VisualLine.cs index fb153a8366..29ff6c1629 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Rendering/VisualLine.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Rendering/VisualLine.cs @@ -306,6 +306,7 @@ namespace ICSharpCode.AvalonEdit.Rendering /// /// Gets the visual column from a document position (relative to top left of the document). + /// If the user clicks between two visual columns, rounds to the nearest column. /// public int GetVisualColumn(Point point) { @@ -314,6 +315,17 @@ namespace ICSharpCode.AvalonEdit.Rendering return ch.FirstCharacterIndex + ch.TrailingLength; } + /// + /// Gets the visual column from a document position (relative to top left of the document). + /// If the user clicks between two visual columns, returns the first of those columns. + /// + public int GetVisualColumnFloor(Point point) + { + TextLine textLine = GetTextLineByVisualYPosition(point.Y); + CharacterHit ch = textLine.GetCharacterHitFromDistance(point.X); + return ch.FirstCharacterIndex; + } + /// /// Gets whether the visual line was disposed. ///