/// <summary> /// Redo last undone action /// </summary> public void PerformRedo() { if (!Enabled || !CanRedo) { return; } var action = (IUndoAction)UndoOperationsStack.PopReverse(); action.Do(); OnRedo(action); }
/// <summary> /// Undo last recorded action /// </summary> public void PerformUndo() { if (!Enabled || !CanUndo) { return; } var action = (IUndoAction)UndoOperationsStack.PopHistory(); action.Undo(); OnUndo(action); }
/// <summary> /// Adds the action to the history. /// </summary> /// <param name="action">The action.</param> public void AddAction(IUndoAction action) { if (action == null) { throw new ArgumentNullException(); } if (!Enabled) { return; } UndoOperationsStack.Push(action); OnAction(action); }
/// <summary> /// Ends recording for undo action. /// </summary> /// <param name="snapshotInstance">Instance of an object to finish recording, if null take last provided.</param> public void RecordMultiEnd(object[] snapshotInstance = null) { if (!Enabled) { return; } if (snapshotInstance == null) { snapshotInstance = (object[])_snapshots.Last().Key; } var action = _snapshots[snapshotInstance].End(snapshotInstance); _snapshots.Remove(snapshotInstance); // It may be null if no changes has been found during recording if (action != null) { UndoOperationsStack.Push(action); OnAction(action); } }
/// <summary> /// Ends recording for undo action. /// </summary> /// <param name="snapshotInstance">Instance of an object to finish recording, if null take last provided.</param> /// <param name="customActionBefore">Custom action to append to the undo block action before recorded modifications apply.</param> /// <param name="customActionAfter">Custom action to append to the undo block action after recorded modifications apply.</param> public void RecordMultiEnd(object[] snapshotInstance = null, IUndoAction customActionBefore = null, IUndoAction customActionAfter = null) { if (!Enabled) { return; } if (snapshotInstance == null) { snapshotInstance = (object[])_snapshots.Last().Key; } var action = _snapshots[snapshotInstance].End(snapshotInstance); _snapshots.Remove(snapshotInstance); // It may be null if no changes has been found during recording if (action != null) { // Batch with a custom action if provided if (customActionBefore != null && customActionAfter != null) { action = new MultiUndoAction(new[] { customActionBefore, action, customActionAfter }); } else if (customActionBefore != null) { action = new MultiUndoAction(new[] { customActionBefore, action }); } else if (customActionAfter != null) { action = new MultiUndoAction(new[] { action, customActionAfter }); } UndoOperationsStack.Push(action); OnAction(action); } }
/// <summary> /// Clears the history. /// </summary> public void Clear() { _snapshots.Clear(); UndoOperationsStack.Clear(); }