blob: 5c6a4a060bfbf5a9f76865335f37b9736ee1cdb9 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
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();
}
}
|