2015-06-23 15:31:23 +02:00
|
|
|
/**
|
|
|
|
* Represents the history of an object
|
|
|
|
* @constructor
|
|
|
|
*/
|
|
|
|
var History = function() {
|
|
|
|
/**
|
|
|
|
* Stores the different states of the object
|
|
|
|
* @type {Object[]}
|
|
|
|
*/
|
|
|
|
this.states = [];
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Represents the position in the history we're at
|
|
|
|
* @type {Number}
|
|
|
|
*/
|
|
|
|
this.index = -1;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Represents the number of elements in the history
|
|
|
|
* @type {Number}
|
|
|
|
*/
|
|
|
|
this.size = 0;
|
2015-07-01 10:14:15 +02:00
|
|
|
};
|
2015-06-23 15:31:23 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Appends a new state at the end of the history
|
|
|
|
* @param {Object} state the state to append
|
|
|
|
*/
|
|
|
|
History.prototype.addState = function(state) {
|
|
|
|
++this.index;
|
|
|
|
this.size = this.index + 1;
|
|
|
|
this.states[this.size-1] = state;
|
2015-07-01 10:14:15 +02:00
|
|
|
};
|
2015-06-23 15:31:23 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the previous state and change the index to the previous state (so you can redo)
|
|
|
|
*/
|
|
|
|
History.prototype.undo = function() {
|
|
|
|
if (this.undoable()) {
|
|
|
|
this.index--;
|
|
|
|
return this.currentState();
|
|
|
|
}
|
2015-07-01 10:14:15 +02:00
|
|
|
};
|
2015-06-23 15:31:23 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the next state and change the index to the next state (so you can re-undo)
|
|
|
|
*/
|
|
|
|
History.prototype.redo = function() {
|
|
|
|
if (this.redoable()) {
|
|
|
|
this.index++;
|
|
|
|
return this.currentState();
|
|
|
|
}
|
2015-07-01 10:14:15 +02:00
|
|
|
};
|
2015-06-23 15:31:23 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Checks if there is a undo possibility
|
|
|
|
* @returns {Boolean} true if undo is possible, false otherwise
|
|
|
|
*/
|
|
|
|
History.prototype.undoable = function() {
|
|
|
|
return this.index > 0;
|
2015-07-01 10:14:15 +02:00
|
|
|
};
|
2015-06-23 15:31:23 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Checks if there is a redo possibility
|
|
|
|
* @returns {Boolean} true if redo is possible, false otherwise
|
|
|
|
*/
|
|
|
|
History.prototype.redoable = function() {
|
|
|
|
return this.index < this.size - 1;
|
2015-07-01 10:14:15 +02:00
|
|
|
};
|
2015-06-23 15:31:23 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the current state in the history
|
|
|
|
* @returns {Object} the current state in the history
|
|
|
|
*/
|
|
|
|
History.prototype.currentState = function() {
|
|
|
|
return this.states[this.index];
|
2015-07-01 10:14:15 +02:00
|
|
|
};
|