View Javadoc

1   /**********************************************
2    * Copyright (C) 2009 Lukas Laag
3    * This file is part of lib-gwt-svg-chess.
4    * 
5    * libgwtsvg-chess is free software: you can redistribute it and/or modify
6    * it under the terms of the GNU General Public License as published by
7    * the Free Software Foundation, either version 3 of the License, or
8    * (at your option) any later version.
9    * 
10   * libgwtsvg-chess is distributed in the hope that it will be useful,
11   * but WITHOUT ANY WARRANTY; without even the implied warranty of
12   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13   * GNU General Public License for more details.
14   * 
15   * You should have received a copy of the GNU General Public License
16   * along with libgwtsvg-chess.  If not, see http://www.gnu.org/licenses/
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  	 * True if the handler for the browser back/forward button is activated, false otherwise
28  	 */
29  	private boolean undoActivated;
30  	
31  	/**
32  	 * The main application
33  	 */
34  	private Main main;
35  	
36  	@Override
37  	public void initialize(Main mainApp) {
38  		main = mainApp;
39  		// Add undo-redo support through the browser back/forward buttons
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  						// Calls to nextMove will trigger a ValueChangeEvent due
88  						// to calls to History.back and History.forward
89  						// This event must be ignored
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 	 * Return the carballo index of the current move as
105 	 * parsed from the browser undo/redo stack
106 	 * @return
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 }