예제 #1
0
        public bool CanMerge(ITextUndoTransaction newTransaction, ITextUndoTransaction oldTransaction)
        {
            MergeUndoActionPolicy oldPolicy = oldTransaction.MergePolicy as MergeUndoActionPolicy;
            MergeUndoActionPolicy newPolicy = newTransaction.MergePolicy as MergeUndoActionPolicy;

            if (oldPolicy != null && oldPolicy._mergeNext &&
                newPolicy != null && newPolicy._mergePrevious &&
                oldPolicy._actionName == newPolicy._actionName)
            {
                // If one of the transactions is empty, than it is safe to merge
                if (newTransaction.UndoPrimitives.Count == 0 ||
                    oldTransaction.UndoPrimitives.Count == 0)
                {
                    return(true);
                }

                // Make sure that we only merge consecutive edits
                ITextUndoPrimitive newPrimitive = newTransaction.UndoPrimitives[0];
                ITextUndoPrimitive oldPrimitive = oldTransaction.UndoPrimitives[oldTransaction.UndoPrimitives.Count - 1];

                return(newPrimitive.CanMerge(oldPrimitive));
            }

            return(false);
        }
예제 #2
0
        public void PerformTransactionMerge(ITextUndoTransaction oldTransaction, ITextUndoTransaction newTransaction)
        {
            MergeUndoActionPolicy oldPolicy = (MergeUndoActionPolicy)oldTransaction.MergePolicy;
            MergeUndoActionPolicy newPolicy = (MergeUndoActionPolicy)newTransaction.MergePolicy;

            // Remove trailing AfterTextBufferChangeUndoPrimitive from previous transaction and skip copying
            // initial BeforeTextBufferChangeUndoPrimitive from newTransaction, as they are unnecessary.

            if (oldTransaction.UndoPrimitives.Count > 0 && oldPolicy._addedTextChangePrimitives)
            {
                oldTransaction.UndoPrimitives.RemoveAt(oldTransaction.UndoPrimitives.Count - 1);
            }

            int copyStartIndex = newPolicy._addedTextChangePrimitives ? 1 : 0;

            for (int i = copyStartIndex; i < newTransaction.UndoPrimitives.Count; i++)
            {
                oldTransaction.UndoPrimitives.Add(newTransaction.UndoPrimitives[i]);
            }
        }