| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358 | <!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-tip-QuickTip'>/**</span> * A specialized tooltip class for tooltips that can be specified in markup and automatically managed * by the global {@link Ext.tip.QuickTipManager} instance.  See the QuickTipManager documentation for * additional usage details and examples. */Ext.define('Ext.tip.QuickTip', {    extend: 'Ext.tip.ToolTip',    alias: 'widget.quicktip',    alternateClassName: 'Ext.QuickTip',<span id='Ext-tip-QuickTip-cfg-target'>    /**</span>     * @cfg {String/HTMLElement/Ext.Element} target     * The target HTMLElement, Ext.Element or id to associate with this Quicktip.     *      * Defaults to the document.     */<span id='Ext-tip-QuickTip-cfg-interceptTitles'>    /**</span>     * @cfg {Boolean} interceptTitles     * True to automatically use the element's DOM title value if available.     */    interceptTitles : false,    // Force creation of header Component    title: '&#160;',    // private    tagConfig : {        namespace : "data-",        attribute : "qtip",        width : "qwidth",        target : "target",        title : "qtitle",        hide : "hide",        cls : "qclass",        align : "qalign",        anchor : "anchor"    },    // private    initComponent : function(){        var me = this;        me.target = me.target || Ext.getDoc();        me.targets = me.targets || {};        me.callParent();    },<span id='Ext-tip-QuickTip-method-register'>    /**</span>     * Configures a new quick tip instance and assigns it to a target element.     *     * For example usage, see the {@link Ext.tip.QuickTipManager} class header.     *     * @param {Object} config The config object with the following properties:     * @param config.autoHide     * @param config.cls     * @param config.dismissDelay overrides the singleton value     * @param config.target required     * @param config.text required     * @param config.title     * @param config.width     */    register : function(config){        var configs = Ext.isArray(config) ? config : arguments,            i = 0,            len = configs.length,            target, j, targetLen;        for (; i < len; i++) {            config = configs[i];            target = config.target;            if (target) {                if (Ext.isArray(target)) {                    for (j = 0, targetLen = target.length; j < targetLen; j++) {                        this.targets[Ext.id(target[j])] = config;                    }                } else{                    this.targets[Ext.id(target)] = config;                }            }        }    },<span id='Ext-tip-QuickTip-method-unregister'>    /**</span>     * Removes this quick tip from its element and destroys it.     * @param {String/HTMLElement/Ext.Element} el The element from which the quick tip     * is to be removed or ID of the element.     */    unregister : function(el){        delete this.targets[Ext.id(el)];    },<span id='Ext-tip-QuickTip-method-cancelShow'>    /**</span>     * Hides a visible tip or cancels an impending show for a particular element.     * @param {String/HTMLElement/Ext.Element} el The element that is the target of     * the tip or ID of the element.     */    cancelShow: function(el){        var me = this,            activeTarget = me.activeTarget;        el = Ext.get(el).dom;        if (me.isVisible()) {            if (activeTarget && activeTarget.el == el) {                me.hide();            }        } else if (activeTarget && activeTarget.el == el) {            me.clearTimer('show');        }    },<span id='Ext-tip-QuickTip-method-getTipCfg'>    /**</span>     * @private     * Reads the tip text from the closest node to the event target which contains the     * attribute we are configured to look for. Returns an object containing the text     * from the attribute, and the target element from which the text was read.     */    getTipCfg: function(e) {        var t = e.getTarget(),            titleText = t.title,            cfg;        if (this.interceptTitles && titleText && Ext.isString(titleText)) {            t.qtip = titleText;            t.removeAttribute("title");            e.preventDefault();            return {                text: titleText            };        }        else {            cfg = this.tagConfig;            t = e.getTarget('[' + cfg.namespace + cfg.attribute + ']');            if (t) {                return {                    target: t,                    text: t.getAttribute(cfg.namespace + cfg.attribute)                };            }        }    },    // private    onTargetOver : function(e){        var me = this,            target = e.getTarget(me.delegate),            hasShowDelay,            delay,            elTarget,            cfg,            ns,            tipConfig,            autoHide,            targets, targetEl, value, key;        if (me.disabled) {            return;        }        // TODO - this causes "e" to be recycled in IE6/7 (EXTJSIV-1608) so ToolTip#setTarget        // was changed to include freezeEvent. The issue seems to be a nested 'resize' event        // that smashed Ext.EventObject.        me.targetXY = e.getXY();        // If the over target was filtered out by the delegate selector, or is not an HTMLElement, or is the <html> or the <body>, then return        if(!target || target.nodeType !== 1 || target == document.documentElement || target == document.body){            return;        }        if (me.activeTarget && ((target == me.activeTarget.el) || Ext.fly(me.activeTarget.el).contains(target))) {            me.clearTimer('hide');            me.show();            return;        }        if (target) {            targets = me.targets;            for (key in targets) {                if (targets.hasOwnProperty(key)) {                    value = targets[key];                    targetEl = Ext.fly(value.target);                    if (targetEl && (targetEl.dom === target || targetEl.contains(target))) {                        elTarget = targetEl.dom;                        break;                    }                }            }            if (elTarget) {                me.activeTarget = me.targets[elTarget.id];                me.activeTarget.el = target;                me.anchor = me.activeTarget.anchor;                if (me.anchor) {                    me.anchorTarget = target;                }                hasShowDelay = Ext.isDefined(me.activeTarget.showDelay);                if (hasShowDelay) {                    delay = me.showDelay;                    me.showDelay = me.activeTarget.showDelay;                }                me.delayShow();                if (hasShowDelay) {                    me.showDelay = delay;                }                return;            }        }        // Should be a fly.        elTarget = Ext.fly(target, '_quicktip-target');        cfg = me.tagConfig;        ns = cfg.namespace;        tipConfig = me.getTipCfg(e);        if (tipConfig) {            // getTipCfg may look up the parentNode axis for a tip text attribute and will return the new target node.            // Change our target element to match that from which the tip text attribute was read.            if (tipConfig.target) {                target = tipConfig.target;                elTarget = Ext.fly(target, '_quicktip-target');            }            autoHide = elTarget.getAttribute(ns + cfg.hide);            me.activeTarget = {                el: target,                text: tipConfig.text,                width: +elTarget.getAttribute(ns + cfg.width) || null,                autoHide: autoHide != "user" && autoHide !== 'false',                title: elTarget.getAttribute(ns + cfg.title),                cls: elTarget.getAttribute(ns + cfg.cls),                align: elTarget.getAttribute(ns + cfg.align)            };            me.anchor = elTarget.getAttribute(ns + cfg.anchor);            if (me.anchor) {                me.anchorTarget = target;            }            hasShowDelay = Ext.isDefined(me.activeTarget.showDelay);            if (hasShowDelay) {                delay = me.showDelay;                me.showDelay = me.activeTarget.showDelay;            }            me.delayShow();            if (hasShowDelay) {                me.showDelay = delay;            }        }    },    // private    onTargetOut : function(e){        var me = this,            active = me.activeTarget,            hasHideDelay,            delay;        // If moving within the current target, and it does not have a new tip, ignore the mouseout        // EventObject.within is the only correct way to determine this.        if (active && e.within(me.activeTarget.el) && !me.getTipCfg(e)) {            return;        }        me.clearTimer('show');        delete me.activeTarget;        if (me.autoHide !== false) {            hasHideDelay = active && Ext.isDefined(active.hideDelay);            if (hasHideDelay) {                delay = me.hideDelay;                me.hideDelay = active.hideDelay;            }            me.delayHide();            if (hasHideDelay) {                me.hideDelay = delay;            }        }    },    // inherit docs    showAt : function(xy){        var me = this,            target = me.activeTarget,            cls;        if (target) {            if (!me.rendered) {                me.render(Ext.getBody());                me.activeTarget = target;            }            me.suspendLayouts();            if (target.title) {                me.setTitle(target.title);                me.header.show();            } else {                me.header.hide();            }            me.update(target.text);            me.autoHide = target.autoHide;            me.dismissDelay = target.dismissDelay || me.dismissDelay;            if (target.mouseOffset) {                xy[0] += target.mouseOffset[0];                xy[1] += target.mouseOffset[1];            }            cls = me.lastCls;            if (cls) {                me.removeCls(cls);                delete me.lastCls;            }            cls = target.cls;            if (cls) {                me.addCls(cls);                me.lastCls = cls;            }            me.setWidth(target.width);            if (me.anchor) {                me.constrainPosition = false;            } else if (target.align) { // TODO: this doesn't seem to work consistently                xy = me.el.getAlignToXY(target.el, target.align);                me.constrainPosition = false;            }else{                me.constrainPosition = true;            }            me.resumeLayouts(true);        }        me.callParent([xy]);    },    // inherit docs    hide: function(){        delete this.activeTarget;        this.callParent();    }});</pre></body></html>
 |