From 3a879f13b680f887c1ab13a3f0a7332ee1493a61 Mon Sep 17 00:00:00 2001 From: Roman Date: Wed, 19 Aug 2026 16:36:15 +0300 Subject: [PATCH 1/2] When pressing Tab in zero length rectangle selection, simply insert tab character at cursors positions --- ICSharpCode.AvalonEdit/Editing/EditingCommandHandler.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ICSharpCode.AvalonEdit/Editing/EditingCommandHandler.cs b/ICSharpCode.AvalonEdit/Editing/EditingCommandHandler.cs index fcdda52c..94a99263 100644 --- a/ICSharpCode.AvalonEdit/Editing/EditingCommandHandler.cs +++ b/ICSharpCode.AvalonEdit/Editing/EditingCommandHandler.cs @@ -197,7 +197,7 @@ static void OnTab(object target, ExecutedRoutedEventArgs args) TextArea textArea = GetTextArea(target); if (textArea != null && textArea.Document != null) { using (textArea.Document.RunUpdate()) { - if (textArea.Selection.IsMultiline) { + if (textArea.Selection.IsMultiline && !textArea.Selection.IsEmpty) { var segment = textArea.Selection.SurroundingSegment; DocumentLine start = textArea.Document.GetLineByOffset(segment.Offset); DocumentLine end = textArea.Document.GetLineByOffset(segment.EndOffset); From 7da3dcfb8c0f2d78bef12d4c36180f31b6751979 Mon Sep 17 00:00:00 2001 From: Roman Date: Wed, 19 Aug 2026 18:57:45 +0300 Subject: [PATCH 2/2] fix zero-length rectangle selection backspace Before this fix, pressing Backspace with zero-length rectangular selection would cause cursor to jump up one line each time Backspace pressed. It's breaks characters deletion. Root cause - math precision issues in HeightTree.GetVisualPositionFromNode. This fix avoid that math by reading VisualTop from VisualLine. --- ICSharpCode.AvalonEdit/Editing/RectangleSelection.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ICSharpCode.AvalonEdit/Editing/RectangleSelection.cs b/ICSharpCode.AvalonEdit/Editing/RectangleSelection.cs index 60888d88..7c3f505b 100644 --- a/ICSharpCode.AvalonEdit/Editing/RectangleSelection.cs +++ b/ICSharpCode.AvalonEdit/Editing/RectangleSelection.cs @@ -331,7 +331,10 @@ public override void ReplaceSelectionWithText(string newText) pos = new TextViewPosition(document.GetLocation(editOffset + firstInsertionLength)); textArea.ClearSelection(); } - textArea.Caret.Position = textArea.TextView.GetPosition(new Point(GetXPos(textArea, pos), textArea.TextView.GetVisualTopByDocumentLine(Math.Max(startLine, endLine)))).GetValueOrDefault(); + + DocumentLine documentLine = textArea.Document.GetLineByNumber(Math.Max(startLine, endLine)); + VisualLine visualLine = textArea.TextView.GetOrConstructVisualLine(documentLine); + textArea.Caret.Position = visualLine.GetTextViewPosition(new Point(GetXPos(textArea, pos), visualLine.VisualTop), EnableVirtualSpace); } }