/**
 * @class Ext.mixin.Focusable
 * @extend Ext.Base
 * This mixin implements focus management functionality in Widgets and Components
 */
 
/**
 * @property {Boolean} [focusable=false]
 * @readonly
 *
 * `true` for keyboard interactive Components or Widgets, `false` otherwise.
 * For Containers, this property reflects interactiveness of the
 * Container itself, not its children. See {@link #isFocusable}.
 *
 * **Note:** It is not enough to set this property to `true` to make
 * a component keyboard interactive. You also need to make sure that
 * the component's {@link #focusEl} is reachable via Tab key (tabbable).
 * See also {@link #tabIndex}.
 */
 
/**
 * @property {Boolean} [hasFocus=false]
 * `true` if this component's {@link #focusEl} is focused.
 * See also {@link #containsFocus}.
 *
 * @readonly
 */
 
/**
 * @property {Boolean} [containsFocus=false]
 *
 * `true` if this currently focused element
 * is within this Component's or Container's hierarchy. This property is set separately
 * from {@link #hasFocus}, and can be `true` when `hasFocus` is `false`.
 *
 * Examples:
 *
 * + Text field with input element focused would be:
 *      focusable: true,
 *      hasFocus: true,
 *      containsFocus: true
 *
 * + Date field with drop-down picker currently focused would be:
 *      focusable: true,
 *      hasFocus: false,
 *      containsFocus: true
 *
 * + Form Panel with a child input field currently focused would be:
 *      focusable: false,
 *      hasFocus: false,
 *      containsFocus: true
 *
 * See also {@link #hasFocus}.
 *
 * @readonly
 */
 
/**
 * @cfg {String} [focusCls='x-focused']
 * CSS class that will be added to focused
 * component's {@link #focusClsEl}, and removed when component blurs.
 */
 
/**
 * @property {Ext.dom.Element} [focusEl='el']
 * The element that will be focused
 * when {@link #focus} method is called on this component. Usually this is
 * the same element that receives focus via mouse clicks, taps, and pressing
 * Tab key.
 */
 
/**
 * @property {Ext.dom.Element} focusClsEl
 * The element that will have the {@link #focusCls} applied when component's
 * {@link #focusEl} is focused.
 */
 
/**
 * @event focus
 * Fires when this Component's {@link #focusEl} receives focus.
 * @param {Ext.Component/Ext.Widget} this
 * @param {Ext.event.Event} event The focus event.
 */
 
/**
 * @event blur
 * Fires when this Component's {@link #focusEl} loses focus.
 * @param {Ext.Component} this
 * @param {Ext.event.Event} event The blur event.
 */
 
/**
 * @event focusenter
 * Fires when focus enters this Component's hierarchy.
 * @param {Ext.Component} this
 * @param {Ext.event.Event} event The focusenter event.
 */
 
/**
 * @event focusleave
 * Fires when focus leaves this Component's hierarchy.
 * @param {Ext.Component} this
 * @param {Ext.event.Event} event The focusleave event.
 */
 
/**
 * @method isFocusable
 * Determine if this Focusable can receive focus at this time.
 *
 * Note that Containers can be non-focusable themselves while delegating
 * focus treatment to a child Component; see {@link Ext.Container #defaultFocus}
 * for more information.
 *
 * @param {Boolean} [deep=false] Optionally determine if the container itself
 * is focusable, or if container's focus is delegated to a child component
 * and that child is focusable.
 *
 * @return {Boolean} True if component is focusable, false if not.
 */
 
/**
 * @method focus
 * Try to focus this component.
 *
 * If this component is disabled or otherwise not focusable, a close relation
 * will be targeted for focus instead to keep focus localized for keyboard users.
 *
 * @param {Boolean/Number[]} [selectText] If applicable, `true` to also select all the text
 * in this component, or an array consisting of start and end (defaults to start)
 * position of selection.
 *
 * @return {Boolean} `true` if focus target was found and focusing was attempted,
 * `false` if no focusing attempt was made.
 */
 
/**
 * @method getTabIndex
 * Return the actual tabIndex for this Focusable.
 *
 * @return {Number} tabIndex attribute value
 */
 
/**
 * @method setTabIndex
 * Set the tabIndex property for this Focusable. If the focusEl
 * is available, set tabIndex attribute on it, too.
 *
 * @param {Number} newTabIndex new tabIndex to set
 */