Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/monodevelop.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Krüger <mkrueger@xamarin.com>2017-02-22 15:27:35 +0300
committerMike Krüger <mkrueger@xamarin.com>2017-02-22 15:27:35 +0300
commitc029431d1ad1681a8f34487d5983b4ffd0ae6bcb (patch)
treeb28e4f1552e21bfa6e9d0fe2aaed8dae80f01055 /main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Editor
parented48be60e2151d5934b1ec16459cb822cd9a5bbe (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.cs10
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Editor/SegmentTree.cs66
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 ();
+ }
}
}