diff options
| author | Michael Lizzio <142752852+Michael-Lizzio@users.noreply.github.com> | 2025-11-11 08:17:00 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-11-11 08:17:00 -0500 |
| commit | f438bcc00e442ec18f6a0bc8715398b981b1b189 (patch) | |
| tree | df3e18485e9a4781236f3b6c5dd8fd79ecc564e3 /src/main/java/design/model/undo/UndoManager.java | |
| parent | 868e0b1e55763f2de686332b0887398839e1fe73 (diff) | |
| parent | b58b98704f6b2d2b4a5938f5a8b87eda268ad88b (diff) | |
| download | designproject-design-6-f438bcc00e442ec18f6a0bc8715398b981b1b189.tar.gz designproject-design-6-f438bcc00e442ec18f6a0bc8715398b981b1b189.tar.bz2 designproject-design-6-f438bcc00e442ec18f6a0bc8715398b981b1b189.zip | |
Merge pull request #15 from RIT-SWEN-262/lizzio-UndoRedoSubsystem
Lizzio undo redo subsystem
Diffstat (limited to 'src/main/java/design/model/undo/UndoManager.java')
| -rw-r--r-- | src/main/java/design/model/undo/UndoManager.java | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/src/main/java/design/model/undo/UndoManager.java b/src/main/java/design/model/undo/UndoManager.java new file mode 100644 index 0000000..5c6a4a0 --- /dev/null +++ b/src/main/java/design/model/undo/UndoManager.java @@ -0,0 +1,91 @@ +package design.model.undo; + +import java.util.ArrayDeque; +import java.util.Deque; +import java.util.List; +import java.util.stream.Collectors; + +// Singleton caretaker that handles undo and redo stacks. +public final class UndoManager { + + private static final UndoManager INSTANCE = new UndoManager(); + + public static UndoManager instance() { + return INSTANCE; + } + + private UndoManager() { + } + + // Stack entry + private static class Entry { + final Originator originator; + final Memento memento; + final String label; + + Entry(Originator originator, Memento memento, String label) { + this.originator = originator; + this.memento = memento; + this.label = label; + } + } + + private final Deque<Entry> undoStack = new ArrayDeque<>(); + private final Deque<Entry> redoStack = new ArrayDeque<>(); + + // Capture state + public void capture(Originator originator, String label) { + undoStack.push(new Entry(originator, originator.createMemento(), label)); + redoStack.clear(); + } + + // Undo / Redo ops + public boolean canUndo() { + return !undoStack.isEmpty(); + } + + public boolean canRedo() { + return !redoStack.isEmpty(); + } + + public String peekUndoLabel() { + return canUndo() ? undoStack.peek().label : null; + } + + public String peekRedoLabel() { + return canRedo() ? redoStack.peek().label : null; + } + + public List<String> getUndoHistoryLabels() { + return undoStack.stream() + .map(e -> e.label) + .collect(Collectors.toList()); + } + + public void undo() { + if (!canUndo()) { + System.out.println("Nothing to undo."); + return; + } + + Entry entry = undoStack.pop(); + redoStack.push(new Entry(entry.originator, entry.originator.createMemento(), entry.label)); + entry.originator.restore(entry.memento); + } + + public void redo() { + if (!canRedo()) { + System.out.println("Nothing to redo."); + return; + } + + Entry entry = redoStack.pop(); + undoStack.push(new Entry(entry.originator, entry.originator.createMemento(), entry.label)); + entry.originator.restore(entry.memento); + } + + public void purge() { + undoStack.clear(); + redoStack.clear(); + } +} |
