예제 #1
0
        public bool DoOperation(CustomOperation operation)
        {
            if (operation == null)
            {
                return(false);
            }

            bool result;

            if (!operation.Redo())
            {
                Rollback();
                result = false;
            }
            else
            {
                // cut off redo-items
                int index = fCurrentIndex + 1;
                if (index < fList.Count)
                {
                    fList.RemoveRange(index, fList.Count - index);
                }

                // add new operation
                IntPush(operation);

                result = true;
            }

            return(result);
        }
예제 #2
0
 public void Rollback()
 {
     while (IntPeek() != TRANS_DELIMITER)
     {
         CustomOperation cmd = fList[fCurrentIndex];
         fCurrentIndex--;
         cmd.Undo();
     }
     Transaction(TransactionType.taRollback);
 }
예제 #3
0
        public void Undo()
        {
            if (fCurrentIndex >= 1)
            {
                if (IntPeek() == TRANS_DELIMITER)
                {
                    fCurrentIndex--;
                }

                while (IntPeek() != TRANS_DELIMITER)
                {
                    CustomOperation cmd = fList[fCurrentIndex];
                    fCurrentIndex--;
                    cmd.Undo();
                }

                Transaction(TransactionType.taCommitUndo);
            }
        }
예제 #4
0
        public void Redo()
        {
            if (fCurrentIndex < fList.Count - 1)
            {
                if (fList[fCurrentIndex] == TRANS_DELIMITER)
                {
                    fCurrentIndex++;
                }

                while (IntPeek() != TRANS_DELIMITER)
                {
                    CustomOperation cmd = fList[fCurrentIndex];
                    fCurrentIndex++;

                    if (!cmd.Redo())
                    {
                        Rollback();
                        return;
                    }
                }

                Transaction(TransactionType.taCommitRedo);
            }
        }
예제 #5
0
 private void IntPush(CustomOperation op)
 {
     fList.Add(op);
     fCurrentIndex++;
 }