Files
archeo010110-ananthology/bower_components/KeyboardJS/lib/locale.js
T

152 lines
3.6 KiB
JavaScript

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;