9
9
import java .util .ArrayList ;
10
10
import java .util .Enumeration ;
11
11
import java .util .List ;
12
+ import java .util .Optional ;
12
13
import javax .swing .tree .DefaultMutableTreeNode ;
13
14
import javax .swing .tree .DefaultTreeModel ;
14
15
@@ -131,12 +132,15 @@ public synchronized void gotoNode(final HistoryNode node) {
131
132
* removes all changes that occurred after this node.
132
133
*/
133
134
public synchronized void removeAllHistoryAfterNode (final HistoryNode removeAfterNode ) {
134
- gotoNode (removeAfterNode );
135
135
assertCorrectThread ();
136
+ if (!seekingEnabled ) {
137
+ nextChangeIndex = changes .size ();
138
+ seekingEnabled = true ;
139
+ }
140
+ gotoNode (getNearestLeafAtOrBefore (removeAfterNode ).orElse ((HistoryNode ) getRoot ()));
136
141
try (GameData .Unlocker ignored = gameData .acquireWriteLock ()) {
137
- final int lastChange = getLastChange (removeAfterNode ) + 1 ;
138
- while (changes .size () > lastChange ) {
139
- changes .remove (lastChange );
142
+ if (changes .size () > nextChangeIndex ) {
143
+ changes .subList (nextChangeIndex , changes .size ()).clear ();
140
144
}
141
145
final Enumeration <?> enumeration =
142
146
((DefaultMutableTreeNode ) this .getRoot ()).preorderEnumeration ();
@@ -147,20 +151,27 @@ public synchronized void removeAllHistoryAfterNode(final HistoryNode removeAfter
147
151
final HistoryNode node = (HistoryNode ) enumeration .nextElement ();
148
152
if (node instanceof IndexedHistoryNode ) {
149
153
final int index = ((IndexedHistoryNode ) node ).getChangeStartIndex ();
150
- if (index >= lastChange ) {
154
+ if (index >= nextChangeIndex ) {
151
155
startRemoving = true ;
152
156
}
153
157
if (startRemoving ) {
154
158
nodesToRemove .add (node );
155
159
}
156
160
}
157
161
}
158
- while (! nodesToRemove . isEmpty () ) {
159
- removeNodeFromParent (nodesToRemove . remove ( 0 ) );
162
+ for ( HistoryNode node : nodesToRemove ) {
163
+ removeNodeFromParent (node );
160
164
}
161
165
}
162
166
}
163
167
168
+ public Optional <HistoryNode > getNearestLeafAtOrBefore (HistoryNode node ) {
169
+ if (node .isLeaf ()) {
170
+ return Optional .of (node );
171
+ }
172
+ return Optional .ofNullable ((HistoryNode ) node .getPreviousLeaf ());
173
+ }
174
+
164
175
synchronized void changeAdded (final Change change ) {
165
176
changes .add (change );
166
177
if (seekingEnabled && nextChangeIndex == changes .size ()) {
0 commit comments