UnitResult Redo() { if (globallyRedoableUnits.Count < 1) { throw new InvalidOperationException("No unit to redo."); /* TODO: Make localizable resource. */ } var unit = globallyRedoableUnits.Pop(); var eventArgs = new CancellableUndoServiceEventArgs(unit); OnRedoing(eventArgs); if (eventArgs.Cancel) { globallyRedoableUnits.AddLast(unit); return(UnitResult.Cancelled); } var internalUnit = (IInternalUnit)unit; globallyRepeatableUnits.AddLast(internalUnit); globallyUndoableUnits.AddLast(unit); var result = internalUnit.PerformUnit(internalUnit.Argument, UnitMode.Redo); TrimIfRequired(); OnRedone(new UndoServiceEventArgs(unit)); return(result); }
UnitResult Undo() { if (globallyRepeatableUnits.Count < 1) { throw new InvalidOperationException("No unit to undo."); } IUndoableUnit undoableUnit = globallyUndoableUnits.Pop(); IInternalUnit repeatableUnit = globallyRepeatableUnits.Pop(); var eventArgs = new CancellableUndoServiceEventArgs(undoableUnit); OnUndoing(eventArgs); if (eventArgs.Cancel) { globallyUndoableUnits.AddLast(undoableUnit); globallyRepeatableUnits.AddLast(repeatableUnit); return(UnitResult.Cancelled); } globallyRedoableUnits.AddLast(undoableUnit); UnitResult result = undoableUnit.Undo(); OnUndone(new UndoServiceEventArgs(undoableUnit)); return(result); }