Another Atlas keyboard behavior?
I wrote this keyboard behavior a while ago and I just realized that Wilco published something very similar long before me. Oh well, just use the one you like best...
Here's how you use the behavior:
<textBox id="tb">
<behaviors>
<keyPressBehavior key="Esc" keyPress="onEscKeyPress"/>
<keyPressBehavior key="b" shiftKey="true" keyPress="onShiftBKeyPress"/>
</behaviors>
</textBox>
You can also get all keypresses if you don't specify the key.
Here's the source code for it:
Web.UI.Key = {
Backspace: 8,
Tab: 9,
Return: 13,
Esc: 27,
PageUp: 33,
PageDown: 34,
End: 35,
Home: 36,
Left: 37,
Up: 38,
Right: 39,
Down: 40,
F1: 112,
F2: 113,
F3: 114,
F4: 115,
F5: 116,
F6: 117,
F7: 118,
F8: 119,
F9: 120,
F10: 121,
F11: 122,
F12: 123,
Delete: 127
}; // del is 46 on Windows
Web.UI.Key.parse = function(s) {
if (s.length == 1) {
return s;
}
var result = parseInt(s);
if (!isNaN(result)) {
return result;
}
for (var f in this) {
if ((f == s) && (typeof(this[f]) == 'number')) {
return this[f];
}
}
throw 'Invalid Key Value';
}
Web.UI.Key.toString = function(value) {
if (typeof(value) == 'string') {
return value;
}
for (var v in this) {
if (this[v] == value) {
return v;
}
}
return value.toString();
}
Web.UI.KeyPressEventArgs = function(key, shiftKey, controlKey, altKey) {
Web.UI.KeyPressEventArgs.initializeBase(this, []);
var _key = key;
var _shiftKey = shiftKey;
var _controlKey = controlKey;
var _altKey = altKey;
this.get_altKey = function() {
return _altKey;
}
this.get_controlKey = function() {
return _controlKey;
}
this.get_key = function() {
return _key;
}
this.get_shiftKey = function() {
return _shiftKey;
}
this.getDescriptor = function() {
var td = Web.UI.KeyPressEventArgs.callBaseMethod(this, 'getDescriptor');
td.addProperty('altKey', Boolean, true);
td.addProperty('controlKey', Boolean, true);
td.addProperty('key', Web.UI.Key, true);
td.addProperty('shiftKey', Boolean, true);
return td;
}
Web.UI.KeyPressEventArgs.registerBaseMethod(this, 'getDescriptor');
}
Type.registerClass('Web.UI.KeyPressEventArgs', Web.CancelEventArgs);
Web.UI.KeyPressBehavior = function() {
Web.UI.KeyPressBehavior.initializeBase(this);
var _keyHandler;
var _key;
var _shiftKey;
var _controlKey = false;
var _altKey = false;
this.get_altKey = function() {
return _altKey;
}
this.set_altKey = function(value) {
if (_altKey != value) {
_altKey = value;
this.raisePropertyChanged('altKey');
}
}
this.get_controlKey = function() {
return _controlKey;
}
this.set_controlKey = function(value) {
if (_controlKey != value) {
_controlKey = value;
this.raisePropertyChanged('controlKey');
}
}
this.get_key = function() {
return _key;
}
this.set_key = function(value) {
if (_key != value) {
if (this.get_isInitialized()) {
disposeKeyHandler.call(this)();
_keyHandler = Function.createDelegate(this, keyHandler);
this.control.element.attachEvent((typeof(value) == 'number') ? 'onkeyup' : 'onkeypress', _keyHandler);
}
_key = value;
this.raisePropertyChanged('key');
}
}
this.get_shiftKey = function() {
return _shiftKey;
}
this.set_shiftKey = function(value) {
if (_shiftKey != value) {
_shiftKey = value;
this.raisePropertyChanged('shiftKey');
}
}
this.getDescriptor = function() {
var td = new Web.TypeDescriptor();
td.addProperty('key', Web.UI.Key);
td.addProperty('shiftKey', Boolean);
td.addProperty('controlKey', Boolean);
td.addProperty('altKey', Boolean);
td.addEvent('keyPress', true);
return td;
}
this.keyPress = this.createEvent();
this.dispose = function() {
disposeKeyHandler.call(this);
Web.UI.KeyPressBehavior.callBaseMethod(this, 'dispose');
}
function disposeKeyHandler() {
if (_keyHandler) {
this.control.element.detachEvent((typeof(_key) == 'number') ? 'onkeyup' : 'onkeypress', _keyHandler);
_keyHandler = null;
}
}
this.initialize = function() {
Web.UI.KeyPressBehavior.callBaseMethod(this, 'initialize');
_keyHandler = Function.createDelegate(this, keyHandler);
this.control.element.attachEvent((typeof(_key) == 'number') ? 'onkeyup' : 'onkeypress', _keyHandler);
}
function keyHandler() {
var evt = event;
var keyCode = evt.charCode ? evt.charCode : evt.keyCode;
// Special-case delete as the Windows delete key has a non-standard keyCode.
// See http://www.w3.org/TR/1999/WD-DOM-Level-2-19990923/events.html#Events-KeyEvent for a list of standard key codes.
// See http://www.w3.org/2002/09/tests/keys.html for a keyCode testing tool.
// Cancelling for Delete doesn't work in IE.
if ((keyCode == 46) && (_key == Web.UI.Key.Delete)) {
keyCode = Web.UI.Key.Delete;
}
if ((evt.altKey == _altKey) &&
(evt.ctrlKey == _controlKey) &&
((_shiftKey == null) || (typeof(_shiftKey) == 'undefined') || (evt.shiftKey == _shiftKey)) &&
(((typeof(_key) == 'number') && (keyCode == _key)) ||
((typeof(_key) == 'string') && (String.fromCharCode(keyCode).toLowerCase() == _key.toLowerCase())) ||
(_key == null) || (typeof(_key) == 'undefined'))) {
var args = new Web.UI.KeyPressEventArgs(_key ? _key : String.fromCharCode(keyCode), evt.shiftKey, evt.ctrlKey, evt.altKey);
this.keyPress.invoke(this, args);
if (args.get_canceled()) {
event.returnValue = false;
event.cancelBubble = true;
}
}
}
}
Type.registerSealedClass('Web.UI.KeyPressBehavior', Web.UI.Behavior);
Web.TypeDescriptor.addType('script', 'keyPressBehavior', Web.UI.KeyPressBehavior);