From a518dc16af849ae4cbaf08cdbc917958f018aad2 Mon Sep 17 00:00:00 2001 From: Zak Smolen Date: Mon, 8 Mar 2021 12:34:36 -0500 Subject: [PATCH 1/2] Fixes for block select slowness and jumping caret issues --- ICSharpCode.AvalonEdit/Editing/RectangleSelection.cs | 5 ++++- ICSharpCode.AvalonEdit/Editing/TextArea.cs | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/ICSharpCode.AvalonEdit/Editing/RectangleSelection.cs b/ICSharpCode.AvalonEdit/Editing/RectangleSelection.cs index 60888d88..54c36feb 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(); + TextViewPosition? calculatedPositon = textArea.TextView.GetPosition(new Point(GetXPos(textArea, pos), textArea.TextView.GetVisualTopByDocumentLine(Math.Max(startLine, endLine)))); + if (calculatedPositon != null) { + textArea.Caret.Position = calculatedPositon.GetValueOrDefault(); + } } } diff --git a/ICSharpCode.AvalonEdit/Editing/TextArea.cs b/ICSharpCode.AvalonEdit/Editing/TextArea.cs index 5ede9a16..35c5d9ca 100644 --- a/ICSharpCode.AvalonEdit/Editing/TextArea.cs +++ b/ICSharpCode.AvalonEdit/Editing/TextArea.cs @@ -317,7 +317,10 @@ void OnDocumentChanging() void OnDocumentChanged(DocumentChangeEventArgs e) { caret.OnDocumentChanged(e); - this.Selection = selection.UpdateOnDocumentChange(e); + + if (! (selection is RectangleSelection)) { + this.Selection = selection.UpdateOnDocumentChange(e); + } } void OnUpdateStarted() From 757a54c08733f9fac5bb7ff292d891df02e1f45f Mon Sep 17 00:00:00 2001 From: Zak Smolen Date: Mon, 8 Mar 2021 15:41:04 -0500 Subject: [PATCH 2/2] Update solution based on suggestions I updated the solution based on Siegfried's suggestions, removing the hardcoded exception for rectangular selections and instead having the update event just return the selection itself --- .../Editing/RectangleSelection.cs | 15 +++++++++------ ICSharpCode.AvalonEdit/Editing/TextArea.cs | 5 +---- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/ICSharpCode.AvalonEdit/Editing/RectangleSelection.cs b/ICSharpCode.AvalonEdit/Editing/RectangleSelection.cs index 54c36feb..2834b2e0 100644 --- a/ICSharpCode.AvalonEdit/Editing/RectangleSelection.cs +++ b/ICSharpCode.AvalonEdit/Editing/RectangleSelection.cs @@ -288,12 +288,15 @@ int GetVisualColumnFromXPos(int line, double xPos) /// public override Selection UpdateOnDocumentChange(DocumentChangeEventArgs e) { - TextLocation newStartLocation = textArea.Document.GetLocation(e.GetNewOffset(topLeftOffset, AnchorMovementType.AfterInsertion)); - TextLocation newEndLocation = textArea.Document.GetLocation(e.GetNewOffset(bottomRightOffset, AnchorMovementType.BeforeInsertion)); - - return new RectangleSelection(textArea, - new TextViewPosition(newStartLocation, GetVisualColumnFromXPos(newStartLocation.Line, startXPos)), - new TextViewPosition(newEndLocation, GetVisualColumnFromXPos(newEndLocation.Line, endXPos))); + // we don't want to recalculate the whole selection, as this is called for every line within the selection + // and it can cause selection changes to take a wildly-long time. + return this; + //TextLocation newStartLocation = textArea.Document.GetLocation(e.GetNewOffset(topLeftOffset, AnchorMovementType.AfterInsertion)); + //TextLocation newEndLocation = textArea.Document.GetLocation(e.GetNewOffset(bottomRightOffset, AnchorMovementType.BeforeInsertion)); + + //return new RectangleSelection(textArea, + // new TextViewPosition(newStartLocation, GetVisualColumnFromXPos(newStartLocation.Line, startXPos)), + // new TextViewPosition(newEndLocation, GetVisualColumnFromXPos(newEndLocation.Line, endXPos))); } /// diff --git a/ICSharpCode.AvalonEdit/Editing/TextArea.cs b/ICSharpCode.AvalonEdit/Editing/TextArea.cs index 35c5d9ca..5ede9a16 100644 --- a/ICSharpCode.AvalonEdit/Editing/TextArea.cs +++ b/ICSharpCode.AvalonEdit/Editing/TextArea.cs @@ -317,10 +317,7 @@ void OnDocumentChanging() void OnDocumentChanged(DocumentChangeEventArgs e) { caret.OnDocumentChanged(e); - - if (! (selection is RectangleSelection)) { - this.Selection = selection.UpdateOnDocumentChange(e); - } + this.Selection = selection.UpdateOnDocumentChange(e); } void OnUpdateStarted()