added pages and keyboard navigation
This commit is contained in:
+151
@@ -0,0 +1,151 @@
|
||||
|
||||
var KeyCombo = require('./key-combo');
|
||||
|
||||
|
||||
function Locale(name) {
|
||||
this.localeName = name;
|
||||
this.pressedKeys = [];
|
||||
this._appliedMacros = [];
|
||||
this._keyMap = {};
|
||||
this._killKeyCodes = [];
|
||||
this._macros = [];
|
||||
}
|
||||
|
||||
Locale.prototype.bindKeyCode = function(keyCode, keyNames) {
|
||||
if (typeof keyNames === 'string') {
|
||||
keyNames = [keyNames];
|
||||
}
|
||||
|
||||
this._keyMap[keyCode] = keyNames;
|
||||
};
|
||||
|
||||
Locale.prototype.bindMacro = function(keyComboStr, keyNames) {
|
||||
if (typeof keyNames === 'string') {
|
||||
keyNames = [ keyNames ];
|
||||
}
|
||||
|
||||
var handler = null;
|
||||
if (typeof keyNames === 'function') {
|
||||
handler = keyNames;
|
||||
keyNames = null;
|
||||
}
|
||||
|
||||
var macro = {
|
||||
keyCombo : new KeyCombo(keyComboStr),
|
||||
keyNames : keyNames,
|
||||
handler : handler
|
||||
};
|
||||
|
||||
this._macros.push(macro);
|
||||
};
|
||||
|
||||
Locale.prototype.getKeyCodes = function(keyName) {
|
||||
var keyCodes = [];
|
||||
for (var keyCode in this._keyMap) {
|
||||
var index = this._keyMap[keyCode].indexOf(keyName);
|
||||
if (index > -1) { keyCodes.push(keyCode|0); }
|
||||
}
|
||||
return keyCodes;
|
||||
};
|
||||
|
||||
Locale.prototype.getKeyNames = function(keyCode) {
|
||||
return this._keyMap[keyCode] || [];
|
||||
};
|
||||
|
||||
Locale.prototype.setKillKey = function(keyCode) {
|
||||
if (typeof keyCode === 'string') {
|
||||
var keyCodes = this.getKeyCodes(keyCode);
|
||||
for (var i = 0; i < keyCodes.length; i += 1) {
|
||||
this.setKillKey(keyCodes[i]);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
this._killKeyCodes.push(keyCode);
|
||||
};
|
||||
|
||||
Locale.prototype.pressKey = function(keyCode) {
|
||||
if (typeof keyCode === 'string') {
|
||||
var keyCodes = this.getKeyCodes(keyCode);
|
||||
for (var i = 0; i < keyCodes.length; i += 1) {
|
||||
this.pressKey(keyCodes[i]);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
var keyNames = this.getKeyNames(keyCode);
|
||||
for (var i = 0; i < keyNames.length; i += 1) {
|
||||
if (this.pressedKeys.indexOf(keyNames[i]) === -1) {
|
||||
this.pressedKeys.push(keyNames[i]);
|
||||
}
|
||||
}
|
||||
|
||||
this._applyMacros();
|
||||
};
|
||||
|
||||
Locale.prototype.releaseKey = function(keyCode) {
|
||||
if (typeof keyCode === 'string') {
|
||||
var keyCodes = this.getKeyCodes(keyCode);
|
||||
for (var i = 0; i < keyCodes.length; i += 1) {
|
||||
this.releaseKey(keyCodes[i]);
|
||||
}
|
||||
}
|
||||
|
||||
else {
|
||||
var keyNames = this.getKeyNames(keyCode);
|
||||
var killKeyCodeIndex = this._killKeyCodes.indexOf(keyCode);
|
||||
|
||||
if (killKeyCodeIndex > -1) {
|
||||
this.pressedKeys.length = 0;
|
||||
} else {
|
||||
for (var i = 0; i < keyNames.length; i += 1) {
|
||||
var index = this.pressedKeys.indexOf(keyNames[i]);
|
||||
if (index > -1) {
|
||||
this.pressedKeys.splice(index, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
this._clearMacros();
|
||||
}
|
||||
};
|
||||
|
||||
Locale.prototype._applyMacros = function() {
|
||||
var macros = this._macros.slice(0);
|
||||
for (var i = 0; i < macros.length; i += 1) {
|
||||
var macro = macros[i];
|
||||
if (macro.keyCombo.check(this.pressedKeys)) {
|
||||
if (macro.handler) {
|
||||
macro.keyNames = macro.handler(this.pressedKeys);
|
||||
}
|
||||
for (var j = 0; j < macro.keyNames.length; j += 1) {
|
||||
if (this.pressedKeys.indexOf(macro.keyNames[j]) === -1) {
|
||||
this.pressedKeys.push(macro.keyNames[j]);
|
||||
}
|
||||
}
|
||||
this._appliedMacros.push(macro);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Locale.prototype._clearMacros = function() {
|
||||
for (var i = 0; i < this._appliedMacros.length; i += 1) {
|
||||
var macro = this._appliedMacros[i];
|
||||
if (!macro.keyCombo.check(this.pressedKeys)) {
|
||||
for (var j = 0; j < macro.keyNames.length; j += 1) {
|
||||
var index = this.pressedKeys.indexOf(macro.keyNames[j]);
|
||||
if (index > -1) {
|
||||
this.pressedKeys.splice(index, 1);
|
||||
}
|
||||
}
|
||||
if (macro.handler) {
|
||||
macro.keyNames = null;
|
||||
}
|
||||
this._appliedMacros.splice(i, 1);
|
||||
i -= 1;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
module.exports = Locale;
|
||||
Reference in New Issue
Block a user