X-Git-Url: http://gitweb.fperrin.net/?p=GpsPrune.git;a=blobdiff_plain;f=src%2Ftim%2Fprune%2Fundo%2FUndoStack.java;fp=src%2Ftim%2Fprune%2Fundo%2FUndoStack.java;h=d3e85e02e3f5d078eb49ac612e084528d34eae1c;hp=0000000000000000000000000000000000000000;hb=ce6f2161b8596f7018d6a76bff79bc9e571f35fd;hpb=2d8cb72e84d5cc1089ce77baf1e34ea3ea2f8465 diff --git a/src/tim/prune/undo/UndoStack.java b/src/tim/prune/undo/UndoStack.java new file mode 100644 index 0000000..d3e85e0 --- /dev/null +++ b/src/tim/prune/undo/UndoStack.java @@ -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 +{ + /** 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; + } +}