/* * Ext JS Library 2.0 Copyright(c) 2006-2007, Ext JS, LLC. licensing@extjs.com * * http://extjs.com/license */ /** * @class Ext.KeyNav *
* Provides a convenient wrapper for normalized keyboard navigation. * KeyNav allows you to bind navigation keys to function calls that will * get called when the keys are pressed, providing an easy way to * implement custom navigation schemes for any UI component. *
** The following are all of the possible keys that can be implemented: * enter, left, right, up, down, tab, esc, pageUp, pageDown, del, home, * end. Usage: *
* *
* var nav = new Ext.KeyNav("my-element", {
* "left" : function(e) {
* this.moveLeft(e.ctrlKey);
* },
* "right" : function(e) {
* this.moveRight(e.ctrlKey);
* },
* "enter" : function(e) {
* this.save();
* },
* scope : this
* });
*
*
* @constructor
* @param {Mixed}
* el The element to bind to
* @param {Object}
* config The config
*/
Ext.KeyNav = function(el, config) {
this.el = Ext.get(el);
Ext.apply(this, config);
if (!this.disabled) {
this.disabled = true;
this.enable();
}
};
Ext.KeyNav.prototype = {
/**
* @cfg {Boolean} disabled True to disable this KeyNav instance (defaults to
* false)
*/
disabled : false,
/**
* @cfg {String} defaultEventAction The method to call on the
* {@link Ext.EventObject} after this KeyNav intercepts a key. Valid
* values are {@link Ext.EventObject#stopEvent},
* {@link Ext.EventObject#preventDefault} and
* {@link Ext.EventObject#stopPropagation} (defaults to 'stopEvent')
*/
defaultEventAction : "stopEvent",
/**
* @cfg {Boolean} forceKeyDown Handle the keydown event instead of keypress
* (defaults to false). KeyNav automatically does this for IE since IE
* does not propagate special keys on keypress, but setting this to
* true will force other browsers to also handle keydown instead of
* keypress.
*/
forceKeyDown : false,
// private
prepareEvent : function(e) {
var k = e.getKey();
var h = this.keyToHandler[k];
// if(h && this[h]){
// e.stopPropagation();
// }
if (Ext.isSafari && h && k >= 37 && k <= 40) {
e.stopEvent();
}
},
// private
relay : function(e) {
var k = e.getKey();
var h = this.keyToHandler[k];
if (h && this[h]) {
if (this.doRelay(e, this[h], h) !== true) {
e[this.defaultEventAction]();
}
}
},
// private
doRelay : function(e, h, hname) {
return h.call(this.scope || this, e);
},
// possible handlers
enter : false,
left : false,
right : false,
up : false,
down : false,
tab : false,
esc : false,
pageUp : false,
pageDown : false,
del : false,
home : false,
end : false,
// quick lookup hash
keyToHandler : {
37 : "left",
39 : "right",
38 : "up",
40 : "down",
33 : "pageUp",
34 : "pageDown",
46 : "del",
36 : "home",
35 : "end",
13 : "enter",
27 : "esc",
9 : "tab"
},
/**
* Enable this KeyNav
*/
enable : function() {
if (this.disabled) {
// ie won't do special keys on keypress, no one else will repeat
// keys with keydown
// the EventObject will normalize Safari automatically
if (this.forceKeyDown || Ext.isIE || Ext.isAir) {
this.el.on("keydown", this.relay, this);
} else {
this.el.on("keydown", this.prepareEvent, this);
this.el.on("keypress", this.relay, this);
}
this.disabled = false;
}
},
/**
* Disable this KeyNav
*/
disable : function() {
if (!this.disabled) {
if (this.forceKeyDown || Ext.isIE || Ext.isAir) {
this.el.un("keydown", this.relay);
} else {
this.el.un("keydown", this.prepareEvent);
this.el.un("keypress", this.relay);
}
this.disabled = true;
}
}
};