private void OnTransactionStackCompleted(BasicUndoTransaction transaction) { Debug.Assert(_openTransactionStack.Count == 0); ITextUndoTransaction eventArgument = transaction; var result = TextUndoTransactionCompletionResult.TransactionAdded; if (_undoStack.Count > 0) { var previous = _undoStack.Peek(); if (transaction.MergePolicy != null && previous.MergePolicy != null && previous.MergePolicy.TestCompatiblePolicy(transaction.MergePolicy) && previous.MergePolicy.CanMerge(newerTransaction: transaction, olderTransaction: previous)) { eventArgument = previous; previous.MergePolicy.PerformTransactionMerge(existingTransaction: previous, newTransaction: transaction); } else { _undoStack.Push(transaction); } } else { _undoStack.Push(transaction); } var list = _undoTransactionCompleted; if (list != null) { list(this, new TextUndoTransactionCompletedEventArgs(eventArgument, result)); } }
internal void OnTransactionClosed(BasicUndoTransaction transaction, bool didComplete) { if (_openTransactionStack.Count == 0 || transaction != _openTransactionStack.Peek()) { // Happens in dispose after complete / cancel return; } _openTransactionStack.Pop(); if (!didComplete) { return; } if (_openTransactionStack.Count == 0) { OnTransactionStackCompleted(transaction); } else { var top = _openTransactionStack.Peek(); foreach (var cur in transaction.UndoPrimitives) { top.AddUndo(cur); } transaction.UndoPrimitives.Clear(); } }