1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.vectomatic.svg.chess;
19
20 import com.google.gwt.core.client.GWT;
21 import com.google.gwt.event.logical.shared.ValueChangeEvent;
22 import com.google.gwt.event.logical.shared.ValueChangeHandler;
23 import com.google.gwt.user.client.History;
24
25 public class HistoryManagerMozilla extends HistoryManager {
26
27
28
29 private boolean undoActivated;
30
31
32
33
34 private Main main;
35
36 @Override
37 public void initialize(Main mainApp) {
38 main = mainApp;
39
40 History.addValueChangeHandler(new ValueChangeHandler<String>() {
41 @Override
42 public void onValueChange(ValueChangeEvent<String> event) {
43 GWT.log("Main.onValueChange(" + History.getToken() + ", " + undoActivated + ")", null);
44 if (undoActivated) {
45 int targetMoveNumber = getCurrentToken();
46 if (targetMoveNumber != -1) {
47 int moveNumber = main.board.getMoveNumber();
48 switch(main.getMode()) {
49 case whitesVsBlacks:
50 break;
51 case whitesVsComputer:
52 if (targetMoveNumber < moveNumber) {
53 if (targetMoveNumber % 2 == 1) {
54 targetMoveNumber--;
55 History.back();
56 }
57 } else if (targetMoveNumber > moveNumber) {
58 if (targetMoveNumber % 2 == 1 && targetMoveNumber < main.lastMoveNumber) {
59 targetMoveNumber++;
60 History.forward();
61 }
62 }
63 break;
64 case blacksVsComputer:
65 if (targetMoveNumber < moveNumber) {
66 if (targetMoveNumber % 2 == 0) {
67 targetMoveNumber--;
68 History.back();
69 }
70 } else if (targetMoveNumber > moveNumber) {
71 if (targetMoveNumber % 2 == 0 && targetMoveNumber < main.lastMoveNumber) {
72 targetMoveNumber++;
73 History.forward();
74 }
75 }
76 break;
77 case computerVsComputer:
78 return;
79 }
80 assert targetMoveNumber >= -1;
81 assert targetMoveNumber <= main.lastMoveNumber;
82 if (moveNumber == -1) {
83 main.board.startPosition();
84 } else {
85 main.board.undoMove(targetMoveNumber);
86 }
87
88
89
90 main.chessboard.update(true);
91 main.nextMove();
92 return;
93 }
94 }
95 undoActivated = true;
96 }
97 });
98 History.fireCurrentHistoryState();
99 undoActivated = true;
100 }
101
102
103
104
105
106
107
108 private int getCurrentToken() {
109 int moveNumber = -1;
110 try {
111 String token = History.getToken();
112 int index = token.indexOf('_');
113 if (index != -1) {
114 moveNumber = Integer.parseInt(token.substring(0, index));
115 }
116 } catch (NumberFormatException e) {
117 }
118 return moveNumber;
119 }
120
121 @Override
122 public void addMove() {
123 int moveNumber = main.board.getMoveNumber();
124 History.newItem(Integer.toString(moveNumber) + "_" + main.board.getSanMove(moveNumber - 1), false);
125 }
126
127 @Override
128 public void setMove(int moveNumber) {
129 int moveCount = main.board.getMoveNumber() - (moveNumber == -1 ? 0 : moveNumber);
130 undoActivated = false;
131 if (moveCount > 0) {
132 for (int i = 0; i < moveCount; i++) {
133 History.back();
134 }
135 } else if (moveCount < 0) {
136 for (int i = 0; i < -moveCount; i++) {
137 History.forward();
138 }
139 }
140 }
141
142 }