diff options
author | Mike Krüger <mkrueger@xamarin.com> | 2017-02-22 15:27:35 +0300 |
---|---|---|
committer | Mike Krüger <mkrueger@xamarin.com> | 2017-02-22 15:27:35 +0300 |
commit | c029431d1ad1681a8f34487d5983b4ffd0ae6bcb (patch) | |
tree | b28e4f1552e21bfa6e9d0fe2aaed8dae80f01055 /main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Editor | |
parent | ed48be60e2151d5934b1ec16459cb822cd9a5bbe (diff) |
[TextEditor] Changed text changed model.
It's now like vs.net where a batch of changes are done in a single event.
Diffstat (limited to 'main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Editor')
-rw-r--r-- | main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Editor/Projection/Projection.cs | 10 | ||||
-rw-r--r-- | main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Editor/SegmentTree.cs | 66 |
2 files changed, 40 insertions, 36 deletions
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Editor/Projection/Projection.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Editor/Projection/Projection.cs index b1a17b8064..a68ca66352 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Editor/Projection/Projection.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Editor/Projection/Projection.cs @@ -117,10 +117,12 @@ namespace MonoDevelop.Ide.Editor.Projection void HandleTextChanging (object sender, TextChangeEventArgs e) { - foreach (var segment in originalProjections) { - if (segment.Contains (e.Offset)) { - var projectedOffset = e.Offset - segment.Offset + segment.LinkedTo.Offset; - projectedEditor.ReplaceText (projectedOffset, e.RemovalLength, e.InsertedText); + foreach (var change in e.TextChanges) { + foreach (var segment in originalProjections) { + if (segment.Contains (change.Offset)) { + var projectedOffset = change.Offset - segment.Offset + segment.LinkedTo.Offset; + projectedEditor.ReplaceText (projectedOffset, change.RemovalLength, change.InsertedText); + } } } diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Editor/SegmentTree.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Editor/SegmentTree.cs index 6c23884dcd..6819994773 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Editor/SegmentTree.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Editor/SegmentTree.cs @@ -169,43 +169,45 @@ namespace MonoDevelop.Ide.Editor internal void UpdateOnTextReplace (object sender, TextChangeEventArgs e) { - if (e.RemovalLength == 0) { - var length = e.InsertionLength; - foreach (var segment in GetSegmentsAt (e.Offset).Where (s => s.Offset < e.Offset && e.Offset < s.EndOffset)) { - segment.Length += length; - segment.UpdateAugmentedData (); - } - var node = SearchFirstSegmentWithStartAfter (e.Offset); - if (node != null) { - node.DistanceToPrevNode += length; - node.UpdateAugmentedData (); - } - return; - } - int delta = e.ChangeDelta; - foreach (var segment in new List<T> (GetSegmentsOverlapping (e.Offset, e.RemovalLength))) { - if (segment.Offset < e.Offset) { - if (segment.EndOffset >= e.Offset + e.RemovalLength) { - segment.Length += delta; - } else { - segment.Length = e.Offset - segment.Offset; + foreach (var change in e.TextChanges) { + if (change.RemovalLength == 0) { + var length = change.InsertionLength; + foreach (var segment in GetSegmentsAt (change.Offset).Where (s => s.Offset < change.Offset && change.Offset < s.EndOffset)) { + segment.Length += length; + segment.UpdateAugmentedData (); + } + var node = SearchFirstSegmentWithStartAfter (change.Offset); + if (node != null) { + node.DistanceToPrevNode += length; + node.UpdateAugmentedData (); } - segment.UpdateAugmentedData (); continue; } - int remainingLength = segment.EndOffset - (e.Offset + e.RemovalLength); - InternalRemove (segment); - if (remainingLength > 0) { - segment.Offset = e.Offset + e.RemovalLength; - segment.Length = remainingLength; - InternalAdd (segment); + int delta = change.ChangeDelta; + foreach (var segment in new List<T> (GetSegmentsOverlapping (change.Offset, change.RemovalLength))) { + if (segment.Offset < change.Offset) { + if (segment.EndOffset >= change.Offset + change.RemovalLength) { + segment.Length += delta; + } else { + segment.Length = change.Offset - segment.Offset; + } + segment.UpdateAugmentedData (); + continue; + } + int remainingLength = segment.EndOffset - (change.Offset + change.RemovalLength); + InternalRemove (segment); + if (remainingLength > 0) { + segment.Offset = change.Offset + change.RemovalLength; + segment.Length = remainingLength; + InternalAdd (segment); + } } - } - var next = SearchFirstSegmentWithStartAfter (e.Offset + 1); + var next = SearchFirstSegmentWithStartAfter (change.Offset + 1); - if (next != null) { - next.DistanceToPrevNode += delta; - next.UpdateAugmentedData (); + if (next != null) { + next.DistanceToPrevNode += delta; + next.UpdateAugmentedData (); + } } } |