internal TextReplaceAction AddChange(int offset, int removedChars, string insertedText) { if (offset < 0) { throw new ArgumentOutOfRangeException("offset", "Should be >= 0"); } if (offset >= document.TextLength) { throw new ArgumentOutOfRangeException("offset", "Should be < document.TextLength"); } if (removedChars < 0) { throw new ArgumentOutOfRangeException("removedChars", "Should be >= 0"); } if (removedChars > offset + document.TextLength) { throw new ArgumentOutOfRangeException("removedChars", "Tried to remove beyond end of text"); } if (removedChars == 0 && string.IsNullOrEmpty(insertedText)) { return(null); } var action = new TextReplaceAction(offset, removedChars, insertedText); changes.Add(action); return(action); }
public override bool Equals(object obj) { TextReplaceAction other = obj as TextReplaceAction; if (other == null) { return(false); } return(this.Offset == other.Offset && this.RemovalLength == other.RemovalLength && this.NewText == other.NewText); }
TextReplaceAction AddChange(int offset, int removedChars, string insertedText) { if (removedChars == 0 && string.IsNullOrEmpty(insertedText)) { return(null); } var action = new TextReplaceAction(offset, removedChars, insertedText); changes.Add(action); return(action); }
public void ApplyChanges(int startOffset, int length, Action <int, int, string> documentReplace, Func <int, int, string, bool> filter = null) { int endOffset = startOffset + length; TextReplaceAction previousChange = null; int delta = 0; var depChanges = new List <TextReplaceAction> (); changes.Sort(new ReplaceActionComparer()); foreach (var change in changes) { if (previousChange != null) { if (change.Equals(previousChange)) { // ignore duplicate changes continue; } if (change.Offset < previousChange.Offset + previousChange.RemovalLength) { var sb = new StringBuilder(); #if DEBUG sb.AppendLine("change 1:" + change + " at " + document.ToLocation(change.Offset)); sb.AppendLine(change.StackTrace); sb.AppendLine("change 2:" + previousChange + " at " + document.ToLocation(previousChange.Offset)); sb.AppendLine(previousChange.StackTrace); #endif sb.AppendLine("Detected overlapping changes " + change + "/" + previousChange); throw new InvalidOperationException(sb.ToString()); } } previousChange = change; bool skipChange = change.Offset <startOffset || change.Offset> endOffset; skipChange |= filter != null && filter(change.Offset + delta, change.RemovalLength, change.NewText); skipChange &= !depChanges.Contains(change); if (!skipChange) { documentReplace(change.Offset + delta, change.RemovalLength, change.NewText); delta += change.NewText.Length - change.RemovalLength; /*if (change.DependsOn != null) { * depChanges.Add(change.DependsOn); * }*/ } } changes.Clear(); }
public void ApplyChanges(int startOffset, int length, Action <int, int, string> documentReplace, Func <int, int, string, bool> filter = null) { int endOffset = startOffset + length; // Console.WriteLine ("apply:"+ startOffset + "->" + endOffset); // Console.WriteLine (document.Text.Substring (0, startOffset) + new string ('x',length) + document.Text.Substring (startOffset+ length)); TextReplaceAction previousChange = null; int delta = 0; var depChanges = new List <TextReplaceAction> (); foreach (var change in changes.OrderBy(c => c.Offset)) { if (previousChange != null) { if (change.Equals(previousChange)) { // ignore duplicate changes continue; } if (change.Offset < previousChange.Offset + previousChange.RemovalLength) { throw new InvalidOperationException("Detected overlapping changes " + change + "/" + previousChange); } } previousChange = change; bool skipChange = change.Offset + change.RemovalLength <startOffset || change.Offset> endOffset; skipChange |= filter != null && filter(change.Offset + delta, change.RemovalLength, change.NewText); skipChange &= !depChanges.Contains(change); if (!skipChange) { documentReplace(change.Offset + delta, change.RemovalLength, change.NewText); delta += change.NewText.Length - change.RemovalLength; if (change.DependsOn != null) { depChanges.Add(change.DependsOn); } } } changes.Clear(); }
TextReplaceAction AddChange(int offset, int removedChars, string insertedText) { if (removedChars == 0 && string.IsNullOrEmpty (insertedText)) return null; var action = new TextReplaceAction (offset, removedChars, insertedText); changes.Add(action); return action; }