mirror of
https://github.com/spiffcode/hostile-takeover.git
synced 2026-02-17 10:33:03 -07:00
70 lines
1.3 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|