| 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>
 |