--- /dev/null
+package tim.prune.undo;
+
+import java.util.Stack;
+
+/**
+ * Class to hold an undo operation together with a counter
+ */
+class UndoOpWithState
+{
+ public UndoOperation _undoOperation = null;
+ public int _undoCounter = 0;
+ /** Constructor */
+ public UndoOpWithState(UndoOperation inOp, int inCounter)
+ {
+ _undoOperation = inOp;
+ _undoCounter = inCounter;
+ }
+}
+
+/**
+ * Stack of undo operations
+ * which also remembers how many undos have been performed
+ */
+public class UndoStack extends Stack<UndoOpWithState>
+{
+ /** Number of undos (and clears) already performed */
+ private int _numUndos = 0;
+
+ @Override
+ public void clear()
+ {
+ _numUndos++;
+ super.clear();
+ }
+
+ /** Add an undo operation to the stack */
+ public synchronized boolean add(UndoOperation inOp)
+ {
+ return super.add(new UndoOpWithState(inOp, _numUndos));
+ }
+
+ /** Pop the latest operation from the stack */
+ public synchronized UndoOperation popOperation()
+ {
+ _numUndos++;
+ return super.pop()._undoOperation;
+ }
+
+ /** Get the operation at the given index */
+ public UndoOperation getOperationAt(int inIndex)
+ {
+ return super.elementAt(inIndex)._undoOperation;
+ }
+
+ /** @return number of undos */
+ public int getNumUndos()
+ {
+ if (isEmpty()) {return 0;}
+ // Get the number of undos stored by the last operation on the stack
+ return peek()._undoCounter;
+ }
+}