hostile-takeover/AniMax/UndoManager.cs
2014-07-06 17:47:28 -07:00

70 lines
1.3 KiB
C#

using System;
using System.Collections;
using System.Diagnostics;
namespace SpiffCode {
public delegate void UndoDelegate(object[] aobArgs);
public class UndoManager {
private static Stack s_stk = new Stack();
private static int s_cElements;
private static bool s_fGrouping = false;
public static void AddUndo(UndoDelegate dgtUndo, object[] aobArgs) {
if (s_fGrouping)
s_cElements++;
s_stk.Push(aobArgs);
s_stk.Push(dgtUndo);
}
public static void Flush() {
s_stk.Clear();
}
public static void Undo() {
if (s_stk.Count == 0)
return;
UndoDelegate dgtUndo;
object[] aobArgs;
object ob = s_stk.Pop();
if (ob is int) {
int cElements = (int)ob;
for (int i = 0; i < cElements; i++) {
dgtUndo = (UndoDelegate)s_stk.Pop();
aobArgs = (object[])s_stk.Pop();
dgtUndo(aobArgs);
}
return;
}
dgtUndo = (UndoDelegate)ob;
aobArgs = (object[])s_stk.Pop();
dgtUndo(aobArgs);
}
public static void Redo() {
// UNDONE:
}
public static bool AnyUndos() {
return s_stk.Count != 0;
}
// WARNING: can't do nested groups
public static void BeginGroup() {
Debug.Assert(!s_fGrouping);
s_fGrouping = true;
s_cElements = 0;
}
public static void EndGroup() {
s_fGrouping = false;
s_stk.Push(s_cElements);
}
}
}