Пример #1
0
        /// <summary>
        /// OperationManagerのUndoStackとマージします。
        /// 統合されたOperationはUndoStackから除外されます。
        /// Operationが統合された場合OperationManagerのRedoStackはクリアされます。
        /// </summary>
        /// <param name="operationController"></param>
        /// <returns></returns>
        public IOperation Merge(IOperationController operationController)
        {
            if (operationController.CanUndo is false)
            {
                return(this);
            }

            if (MergeJudge is null)
            {
                return(this);
            }

            var topCommand = operationController.Peek();
            var prevValue  = PrevProperty;
            var mergeInfo  = MergeJudge;

            while (topCommand is MergeableOperation <T> propertyChangeOperation)
            {
                if (MergeJudge.CanMerge(propertyChangeOperation.MergeJudge) is false)
                {
                    break;
                }
                mergeInfo = propertyChangeOperation.MergeJudge;
                prevValue = propertyChangeOperation.PrevProperty;
                operationController.Pop();
                topCommand = operationController.Peek();
            }

            PrevProperty = prevValue;
            MergeJudge   = mergeInfo;
            return(this);
        }
Пример #2
0
 public bool CanMerge(IOperationMergeJudge operationMergeJudge)
 {
     if (operationMergeJudge is KeyOperationMergeJudge <T> timeStampMergeInfo)
     {
         return(Equals(Key, timeStampMergeInfo.Key) &&
                TimeStamp - timeStampMergeInfo.TimeStamp < Permission);
     }
     return(false);
 }
Пример #3
0
 public MergeableOperation(
     Action <T> setter,
     T newValue,
     T oldValue,
     IOperationMergeJudge operationMergeJudge = null)
 {
     Setter       = setter;
     PrevProperty = oldValue;
     Property     = newValue;
     MergeJudge   = operationMergeJudge;
 }