예제 #1
0
        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));
            }
        }
예제 #2
0
        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();
            }
        }