internal void ApplyChanges(TextEdit textEdit, List<ITextChange> changes, EditOptions options, int? reiteratedVersionNumber, object editTag) { VerifyAccess(); if (textEdit != textEditInProgress) throw new InvalidOperationException(); textEditInProgress = null; if (RaiseChangingGetIsCanceled(editTag)) { PostChanged?.Invoke(this, EventArgs.Empty); return; } if (changes.Count != 0) { // We don't support overlapping changes. All offsets are relative to the original buffer changes.Sort((a, b) => b.OldPosition - a.OldPosition); for (int i = 1; i < changes.Count; i++) { if (changes[i - 1].OldSpan.OverlapsWith(changes[i].OldSpan)) throw new InvalidOperationException("Two edit operations overlap"); } var beforeSnapshot = CurrentSnapshot; Document.BeginUpdate(); // changes is sorted in reverse order by OldPosition foreach (var change in changes) Document.Replace(change.OldPosition, change.OldLength, change.NewText); Document.EndUpdate(); CreateNewCurrentSnapshot(changes, reiteratedVersionNumber, Document.CreateSnapshot()); var afterSnapshot = CurrentSnapshot; TextContentChangedEventArgs args = null; //TODO: The event handlers are allowed to modify the buffer, but the new events must only be // raised after all of these three events have been raised. ChangedHighPriority?.Invoke(this, args ?? (args = new TextContentChangedEventArgs(beforeSnapshot, afterSnapshot, options, editTag))); Changed?.Invoke(this, args ?? (args = new TextContentChangedEventArgs(beforeSnapshot, afterSnapshot, options, editTag))); ChangedLowPriority?.Invoke(this, args ?? (args = new TextContentChangedEventArgs(beforeSnapshot, afterSnapshot, options, editTag))); } PostChanged?.Invoke(this, EventArgs.Empty); }
public ITextEdit CreateEdit(EditOptions options, int? reiteratedVersionNumber, object editTag) { VerifyAccess(); if (EditInProgress) throw new InvalidOperationException("An edit operation is in progress"); return textEditInProgress = new TextEdit(this, options, reiteratedVersionNumber, editTag); }
internal void Cancel(TextEdit textEdit) { VerifyAccess(); if (textEdit != textEditInProgress) throw new InvalidOperationException(); textEditInProgress = null; PostChanged?.Invoke(this, EventArgs.Empty); }