]> gitweb.fperrin.net Git - GpsPrune.git/blobdiff - src/tim/prune/undo/UndoStack.java
Moved source into separate src directory due to popular request
[GpsPrune.git] / src / tim / prune / undo / UndoStack.java
diff --git a/src/tim/prune/undo/UndoStack.java b/src/tim/prune/undo/UndoStack.java
new file mode 100644 (file)
index 0000000..d3e85e0
--- /dev/null
@@ -0,0 +1,62 @@
+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;
+       }
+}