123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265 |
- <!DOCTYPE html>
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>The source code</title>
- <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />
- <script type="text/javascript" src="../resources/prettify/prettify.js"></script>
- <style type="text/css">
- .highlight { display: block; background-color: #ddd; }
- </style>
- <script type="text/javascript">
- function highlight() {
- document.getElementById(location.hash.replace(/#/, "")).className = "highlight";
- }
- </script>
- </head>
- <body onload="prettyPrint(); highlight();">
- <pre class="prettyprint lang-js"><span id='Ext-util-KeyNav'>/**
- </span> * 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, space, left, right, up, down, tab, esc,
- * pageUp, pageDown, del, backspace, home, end.
- *
- * Usage:
- *
- * var nav = new Ext.util.KeyNav({
- * target : "my-element",
- * left : function(e){
- * this.moveLeft(e.ctrlKey);
- * },
- * right : function(e){
- * this.moveRight(e.ctrlKey);
- * },
- * enter : function(e){
- * this.save();
- * },
- *
- * // Binding may be a function specifiying fn, scope and defaultAction
- * esc: {
- * fn: this.onEsc,
- * defaultEventAction: false
- * },
- * scope : this
- * });
- */
- Ext.define('Ext.util.KeyNav', {
- alternateClassName: 'Ext.KeyNav',
-
- requires: ['Ext.util.KeyMap'],
-
- statics: {
- keyOptions: {
- left: 37,
- right: 39,
- up: 38,
- down: 40,
- space: 32,
- pageUp: 33,
- pageDown: 34,
- del: 46,
- backspace: 8,
- home: 36,
- end: 35,
- enter: 13,
- esc: 27,
- tab: 9
- }
- },
- constructor: function(config) {
- var me = this;
- if (arguments.length === 2) {
- me.legacyConstructor.apply(me, arguments);
- return;
- }
- me.setConfig(config);
- },
- <span id='Ext-util-KeyNav-method-legacyConstructor'> /**
- </span> * @private
- * Old constructor signature.
- * @param {String/HTMLElement/Ext.Element} el The element or its ID to bind to
- * @param {Object} config The config
- */
- legacyConstructor: function(el, config) {
- this.setConfig(Ext.apply({
- target: el
- }, config));
- },
- <span id='Ext-util-KeyNav-method-setConfig'> /**
- </span> * Sets up a configuration for the KeyNav.
- * @private
- * @param {String/HTMLElement/Ext.Element} el The element or its ID to bind to
- * @param {Object} config A configuration object as specified in the constructor.
- */
- setConfig: function(config) {
- var me = this,
- keymapCfg = {
- target: config.target,
- ignoreInputFields: config.ignoreInputFields,
- eventName: me.getKeyEvent('forceKeyDown' in config ? config.forceKeyDown : me.forceKeyDown, config.eventName)
- },
- map, keyCodes, defaultScope, keyName, binding;
- if (me.map) {
- me.map.destroy();
- }
- if (config.processEvent) {
- keymapCfg.processEvent = config.processEvent;
- keymapCfg.processEventScope = config.processEventScope||me;
- }
- map = me.map = new Ext.util.KeyMap(keymapCfg);
- keyCodes = Ext.util.KeyNav.keyOptions;
- defaultScope = config.scope || me;
-
- for (keyName in keyCodes) {
- if (keyCodes.hasOwnProperty(keyName)) {
- // There is a property named after a key name.
- // It may be a function or an binding spec containing handler, scope and defaultAction configs
- if (binding = config[keyName]) {
- if (typeof binding === 'function') {
- binding = {
- handler: binding,
- defaultAction: (config.defaultEventAction !== undefined) ? config.defaultEventAction : me.defaultEventAction
- };
- }
- map.addBinding({
- key: keyCodes[keyName],
- handler: Ext.Function.bind(me.handleEvent, binding.scope||defaultScope, binding.handler||binding.fn, true),
- defaultEventAction: (binding.defaultEventAction !== undefined) ? binding.defaultAction : me.defaultEventAction
- });
- }
- }
- }
-
- map.disable();
- if (!config.disabled) {
- map.enable();
- }
- },
-
- <span id='Ext-util-KeyNav-method-handleEvent'> /**
- </span> * Method for filtering out the map argument
- * @private
- * @param {Number} keyCode
- * @param {Ext.EventObject} event
- * @param {Object} options Contains the handler to call
- */
- handleEvent: function(keyCode, event, handler){
- return handler.call(this, event);
- },
-
- <span id='Ext-util-KeyNav-cfg-disabled'> /**
- </span> * @cfg {Boolean} disabled
- * True to disable this KeyNav instance.
- */
- disabled: false,
-
- <span id='Ext-util-KeyNav-cfg-defaultEventAction'> /**
- </span> * @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}.
- *
- * If a falsy value is specified, no method is called on the key event.
- */
- defaultEventAction: "stopEvent",
-
- <span id='Ext-util-KeyNav-cfg-forceKeyDown'> /**
- </span> * @cfg {Boolean} forceKeyDown
- * Handle the keydown event instead of keypress. 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,
- <span id='Ext-util-KeyNav-cfg-target'> /**
- </span> * @cfg {Ext.Component/Ext.Element/HTMLElement/String} target
- * The object on which to listen for the event specified by the {@link #eventName} config option.
- */
- <span id='Ext-util-KeyNav-cfg-eventName'> /**
- </span> * @cfg {String} eventName
- * The event to listen for to pick up key events.
- */
- eventName: 'keypress',
- <span id='Ext-util-KeyNav-cfg-processEvent'> /**
- </span> * @cfg {Function} processEvent
- * An optional event processor function which accepts the argument list provided by the {@link #eventName configured
- * event} of the {@link #target}, and returns a keyEvent for processing by the KeyMap.
- *
- * This may be useful when the {@link #target} is a Component with s complex event signature. Extra information from
- * the event arguments may be injected into the event for use by the handler functions before returning it.
- */
- <span id='Ext-util-KeyNav-cfg-processEventScope'> /**
- </span> * @cfg {Object} [processEventScope=this]
- * The scope (`this` context) in which the {@link #processEvent} method is executed.
- */
- <span id='Ext-util-KeyNav-cfg-ignoreInputFields'> /**
- </span> * @cfg {Boolean} [ignoreInputFields=false]
- * Configure this as `true` if there are any input fields within the {@link #target}, and this KeyNav
- * should not process events from input fields, (`&lt;input>, &lt;textarea> and elements with `contentEditable="true"`)
- */
- <span id='Ext-util-KeyNav-method-destroy'> /**
- </span> * Destroy this KeyNav (this is the same as calling disable).
- * @param {Boolean} removeEl True to remove the element associated with this KeyNav.
- */
- destroy: function(removeEl) {
- this.map.destroy(removeEl);
- delete this.map;
- },
- <span id='Ext-util-KeyNav-method-enable'> /**
- </span> * Enables this KeyNav.
- */
- enable: function() {
- this.map.enable();
- this.disabled = false;
- },
- <span id='Ext-util-KeyNav-method-disable'> /**
- </span> * Disables this KeyNav.
- */
- disable: function() {
- this.map.disable();
- this.disabled = true;
- },
-
- <span id='Ext-util-KeyNav-method-setDisabled'> /**
- </span> * Convenience function for setting disabled/enabled by boolean.
- * @param {Boolean} disabled
- */
- setDisabled : function(disabled) {
- this.map.setDisabled(disabled);
- this.disabled = disabled;
- },
-
- <span id='Ext-util-KeyNav-method-getKeyEvent'> /**
- </span> * @private
- * Determines the event to bind to listen for keys. Defaults to the {@link #eventName} value, but
- * may be overridden the {@link #forceKeyDown} setting.
- *
- * The useKeyDown option on the EventManager modifies the default {@link #eventName} to be `keydown`,
- * but a configured {@link #eventName} takes priority over this.
- *
- * @return {String} The type of event to listen for.
- */
- getKeyEvent: function(forceKeyDown, configuredEventName) {
- if (forceKeyDown || (Ext.EventManager.useKeyDown && !configuredEventName)) {
- return 'keydown';
- } else {
- return configuredEventName||this.eventName;
- }
- }
- });</pre>
- </body>
- </html>
|