| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273 | <!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-Shadow'>/**</span> * Simple class that can provide a shadow effect for any element.  Note that the element * MUST be absolutely positioned, and the shadow does not provide any shimming.  This * should be used only in simple cases - for more advanced functionality that can also * provide the same shadow effect, see the {@link Ext.Layer} class. */Ext.define('Ext.Shadow', {    requires: ['Ext.ShadowPool'],<span id='Ext-Shadow-method-constructor'>    /**</span>     * Creates new Shadow.     * @param {Object} config (optional) Config object.     */    constructor: function(config) {        var me = this,            adjusts,            offset,            rad;                Ext.apply(me, config);        if (!Ext.isString(me.mode)) {            me.mode = me.defaultMode;        }        offset = me.offset;        rad = Math.floor(offset / 2);        me.opacity = 50;        switch (me.mode.toLowerCase()) {            // all this hideous nonsense calculates the various offsets for shadows            case "drop":                if (Ext.supports.CSS3BoxShadow) {                    adjusts = {                        t: offset,                        l: offset,                        h: -offset,                        w: -offset                    };                }                else {                    adjusts = {                        t: -rad,                        l: -rad,                        h: -rad,                        w: -rad                    };                }                break;            case "sides":                if (Ext.supports.CSS3BoxShadow) {                    adjusts = {                        t: offset,                        l: 0,                        h: -offset,                        w: 0                    };                }                else {                    adjusts = {                        t: - (1 + rad),                        l: 1 + rad - 2 * offset,                        h: -1,                        w: rad - 1                    };                }                break;            case "frame":                if (Ext.supports.CSS3BoxShadow) {                    adjusts = {                        t: 0,                        l: 0,                        h: 0,                        w: 0                    };                }                else {                    adjusts = {                        t: 1 + rad - 2 * offset,                        l: 1 + rad - 2 * offset,                        h: offset - rad - 1,                        w: offset - rad - 1                    };                }                break;        }        me.adjusts = adjusts;    },<span id='Ext-Shadow-method-getShadowSize'>    /**</span>     * @private     * Returns the shadow size on each side of the element in standard CSS order: top, right, bottom, left;     * @return {Number[]} Top, right, bottom and left shadow size.     */    getShadowSize: function() {        var me = this,            offset = me.el ? me.offset : 0,            result = [offset, offset, offset, offset],            mode = me.mode.toLowerCase();        // There are only offsets if the shadow element is present.        if (me.el && mode !== 'frame') {            result[0] = 0;            if (mode == 'drop') {                result[3] = 0;            }        }        return result;    },<span id='Ext-Shadow-cfg-mode'>    /**</span>     * @cfg {String} mode     * The shadow display mode.  Supports the following options:     *     * - sides : Shadow displays on both sides and bottom only</li>     * - frame : Shadow displays equally on all four sides</li>     * - drop : Traditional bottom-right drop shadow</li>     */<span id='Ext-Shadow-cfg-offset'>    /**</span>     * @cfg {Number} offset     * The number of pixels to offset the shadow from the element     */    offset: 4,    // private    defaultMode: "drop",    // private - CSS property to use to set the box shadow    boxShadowProperty: (function() {        var property = 'boxShadow',            style = document.documentElement.style;        if (!('boxShadow' in style)) {            if ('WebkitBoxShadow' in style) {                // Safari prior to version 5.1 and Chrome prior to version 10                property = 'WebkitBoxShadow';            }            else if ('MozBoxShadow' in style) {                // FF 3.5 & 3.6                property = 'MozBoxShadow';            }        }        return property;    }()),<span id='Ext-Shadow-method-show'>    /**</span>     * Displays the shadow under the target element     * @param {String/HTMLElement/Ext.Element} targetEl The id or element under which the shadow should display     */    show: function(target) {        var me = this,            index;                target = Ext.get(target);        if (!me.el) {            me.el = Ext.ShadowPool.pull();            if (me.el.dom.nextSibling != target.dom) {                me.el.insertBefore(target);            }        }        index = (parseInt(target.getStyle("z-index"), 10) - 1) || 0;        me.el.setStyle("z-index", me.zIndex || index);        if (Ext.isIE && !Ext.supports.CSS3BoxShadow) {            me.el.dom.style.filter = "progid:DXImageTransform.Microsoft.alpha(opacity=" + me.opacity + ") progid:DXImageTransform.Microsoft.Blur(pixelradius=" + (me.offset) + ")";        }        me.realign(            target.getLocalX(),            target.getLocalY(),            target.dom.offsetWidth,            target.dom.offsetHeight        );        me.el.dom.style.display = "block";    },<span id='Ext-Shadow-method-isVisible'>    /**</span>     * Returns true if the shadow is visible, else false     */    isVisible: function() {        return this.el ? true: false;    },<span id='Ext-Shadow-method-realign'>    /**</span>     * Direct alignment when values are already available. Show must be called at least once before     * calling this method to ensure it is initialized.     * @param {Number} left The target element left position     * @param {Number} top The target element top position     * @param {Number} width The target element width     * @param {Number} height The target element height     */    realign: function(l, t, targetWidth, targetHeight) {        if (!this.el) {            return;        }        var adjusts = this.adjusts,            d = this.el.dom,            targetStyle = d.style,            shadowWidth,            shadowHeight,            sws,            shs;        targetStyle.left = (l + adjusts.l) + "px";        targetStyle.top = (t + adjusts.t) + "px";        shadowWidth = Math.max(targetWidth + adjusts.w, 0);        shadowHeight = Math.max(targetHeight + adjusts.h, 0);        sws = shadowWidth + "px";        shs = shadowHeight + "px";        if (targetStyle.width != sws || targetStyle.height != shs) {            targetStyle.width = sws;            targetStyle.height = shs;            if (Ext.supports.CSS3BoxShadow) {                targetStyle[this.boxShadowProperty] = '0 0 ' + this.offset + 'px #888';            }        }    },<span id='Ext-Shadow-method-hide'>    /**</span>     * Hides this shadow     */    hide: function() {        var me = this;                if (me.el) {            me.el.dom.style.display = "none";            Ext.ShadowPool.push(me.el);            delete me.el;        }    },<span id='Ext-Shadow-method-setZIndex'>    /**</span>     * Adjust the z-index of this shadow     * @param {Number} zindex The new z-index     */    setZIndex: function(z) {        this.zIndex = z;        if (this.el) {            this.el.setStyle("z-index", z);        }    },    <span id='Ext-Shadow-method-setOpacity'>    /**</span>     * Sets the opacity of the shadow     * @param {Number} opacity The opacity     */    setOpacity: function(opacity){        if (this.el) {            if (Ext.isIE && !Ext.supports.CSS3BoxShadow) {                opacity = Math.floor(opacity * 100 / 2) / 100;            }            this.opacity = opacity;            this.el.setOpacity(opacity);        }    }});</pre></body></html>
 |