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); }
public void Rollback() { while (IntPeek() != TRANS_DELIMITER) { CustomOperation cmd = fList[fCurrentIndex]; fCurrentIndex--; cmd.Undo(); } Transaction(TransactionType.taRollback); }
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); } }
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); } }
private void IntPush(CustomOperation op) { fList.Add(op); fCurrentIndex++; }