| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563 | <!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-Layer'>/**</span> * An extended {@link Ext.Element} object that supports a shadow and shim, constrain to viewport and * automatic maintaining of shadow/shim positions. */Ext.define('Ext.Layer', {    extend: 'Ext.Element',    uses: ['Ext.Shadow'],<span id='Ext-Layer-cfg-shim'>    /**</span>     * @cfg {Boolean} [shim=true]     * False to disable the iframe shim in browsers which need one.     */<span id='Ext-Layer-cfg-shadow'>    /**</span>     * @cfg {String/Boolean} [shadow=false]     * True to automatically create an {@link Ext.Shadow}, or a string indicating the     * shadow's display {@link Ext.Shadow#mode}. False to disable the shadow.     */<span id='Ext-Layer-cfg-dh'>    /**</span>     * @cfg {Object} [dh={tag: 'div', cls: 'x-layer'}]     * DomHelper object config to create element with.     */<span id='Ext-Layer-cfg-constrain'>    /**</span>     * @cfg {Boolean} [constrain=true]     * False to disable constrain to viewport.     */<span id='Ext-Layer-cfg-cls'>    /**</span>     * @cfg {String} cls     * CSS class to add to the element     */<span id='Ext-Layer-cfg-zindex'>    /**</span>     * @cfg {Number} [zindex=11000]     * Starting z-index.     */<span id='Ext-Layer-cfg-shadowOffset'>    /**</span>     * @cfg {Number} [shadowOffset=4]     * Number of pixels to offset the shadow     */<span id='Ext-Layer-cfg-useDisplay'>    /**</span>     * @cfg {Boolean} [useDisplay=false]     * Defaults to use css offsets to hide the Layer. Specify <tt>true</tt>     * to use css style <tt>'display:none;'</tt> to hide the Layer.     */<span id='Ext-Layer-cfg-visibilityCls'>    /**</span>     * @cfg {String} visibilityCls     * The CSS class name to add in order to hide this Layer if this layer     * is configured with <code>{@link #hideMode}: 'asclass'</code>     */<span id='Ext-Layer-cfg-hideMode'>    /**</span>     * @cfg {String} hideMode     * A String which specifies how this Layer will be hidden.     * Values may be:     *     * - `'display'` : The Component will be hidden using the `display: none` style.     * - `'visibility'` : The Component will be hidden using the `visibility: hidden` style.     * - `'offsets'` : The Component will be hidden by absolutely positioning it out of the visible area     *   of the document. This is useful when a hidden Component must maintain measurable dimensions.     *   Hiding using `display` results in a Component having zero dimensions.     */    // shims are shared among layer to keep from having 100 iframes    statics: {        shims: []    },        isLayer: true,<span id='Ext-Layer-method-constructor'>    /**</span>     * Creates new Layer.     * @param {Object} [config] An object with config options.     * @param {String/HTMLElement} [existingEl] Uses an existing DOM element.     * If the element is not found it creates it.     */    constructor: function(config, existingEl) {        config = config || {};        var me = this,            dh = Ext.DomHelper,            cp = config.parentEl,            pel = cp ? Ext.getDom(cp) : document.body,        hm = config.hideMode;        if (existingEl) {            me.dom = Ext.getDom(existingEl);        }        if (!me.dom) {            me.dom = dh.append(pel, config.dh || {                tag: 'div',                cls: Ext.baseCSSPrefix + 'layer' // primarily to give el 'position:absolute'            });        } else {            me.addCls(Ext.baseCSSPrefix + 'layer');            if (!me.dom.parentNode) {                pel.appendChild(me.dom);            }        }        if (config.id) {            me.id = me.dom.id = config.id;        } else {            me.id = Ext.id(me.dom);        }        Ext.Element.addToCache(me);        if (config.cls) {            me.addCls(config.cls);        }        me.constrain = config.constrain !== false;        // Allow Components to pass their hide mode down to the Layer if they are floating.        // Otherwise, allow useDisplay to override the default hiding method which is visibility.        // TODO: Have ExtJS's Element implement visibilityMode by using classes as in Mobile.        if (hm) {            me.setVisibilityMode(Ext.Element[hm.toUpperCase()]);            if (me.visibilityMode == Ext.Element.ASCLASS) {                me.visibilityCls = config.visibilityCls;            }        } else if (config.useDisplay) {            me.setVisibilityMode(Ext.Element.DISPLAY);        } else {            me.setVisibilityMode(Ext.Element.VISIBILITY);        }        if (config.shadow) {            me.shadowOffset = config.shadowOffset || 4;            me.shadow = new Ext.Shadow({                offset: me.shadowOffset,                mode: config.shadow            });            me.disableShadow();        } else {            me.shadowOffset = 0;        }        me.useShim = config.shim !== false && Ext.useShims;        if (config.hidden === true) {            me.hide();        } else {            me.show();        }    },    getZIndex: function() {        return parseInt((this.getShim() || this).getStyle('z-index'), 10);    },    getShim: function() {        var me = this,            shim, pn;        if (!me.useShim) {            return null;        }        if (!me.shim) {            shim = me.self.shims.shift();            if (!shim) {                shim = me.createShim();                shim.enableDisplayMode('block');                shim.hide();            }            pn = me.dom.parentNode;            if (shim.dom.parentNode != pn) {                pn.insertBefore(shim.dom, me.dom);            }            me.shim = shim;        }        return me.shim;    },    hideShim: function() {        var me = this;                if (me.shim) {            me.shim.setDisplayed(false);            me.self.shims.push(me.shim);            delete me.shim;        }    },    disableShadow: function() {        var me = this;                if (me.shadow && !me.shadowDisabled) {            me.shadowDisabled = true;            me.shadow.hide();            me.lastShadowOffset = me.shadowOffset;            me.shadowOffset = 0;        }    },    enableShadow: function(show) {        var me = this;                if (me.shadow && me.shadowDisabled) {            me.shadowDisabled = false;            me.shadowOffset = me.lastShadowOffset;            delete me.lastShadowOffset;            if (show) {                me.sync(true);            }        }    },<span id='Ext-Layer-method-sync'>    /**</span>     * @private     * Synchronize this Layer's associated elements, the shadow, and possibly the shim.     *     * This code can execute repeatedly in milliseconds,     * eg: dragging a Component configured liveDrag: true, or which has no ghost method     * so code size was sacrificed for efficiency (e.g. no getBox/setBox, no XY calls)     *     * @param {Boolean} doShow Pass true to ensure that the shadow is shown.     */    sync: function(doShow) {        var me = this,            shadow = me.shadow,            shadowPos, shimStyle, shadowSize,            shim, l, t, w, h, shimIndex;        if (!me.updating && me.isVisible() && (shadow || me.useShim)) {            shim = me.getShim();            l = me.getLocalX();            t = me.getLocalY();            w = me.dom.offsetWidth;            h = me.dom.offsetHeight;            if (shadow && !me.shadowDisabled) {                if (doShow && !shadow.isVisible()) {                    shadow.show(me);                } else {                    shadow.realign(l, t, w, h);                }                if (shim) {                    // TODO: Determine how the shims zIndex is above the layer zIndex at this point                    shimIndex = shim.getStyle('z-index');                    if (shimIndex > me.zindex) {                        me.shim.setStyle('z-index', me.zindex - 2);                    }                    shim.show();                    // fit the shim behind the shadow, so it is shimmed too                    if (shadow.isVisible()) {                        shadowPos = shadow.el.getXY();                        shimStyle = shim.dom.style;                        shadowSize = shadow.el.getSize();                        if (Ext.supports.CSS3BoxShadow) {                            shadowSize.height += 6;                            shadowSize.width += 4;                            shadowPos[0] -= 2;                            shadowPos[1] -= 4;                        }                        shimStyle.left = (shadowPos[0]) + 'px';                        shimStyle.top = (shadowPos[1]) + 'px';                        shimStyle.width = (shadowSize.width) + 'px';                        shimStyle.height = (shadowSize.height) + 'px';                    } else {                        shim.setSize(w, h);                        shim.setLeftTop(l, t);                    }                }            } else if (shim) {                // TODO: Determine how the shims zIndex is above the layer zIndex at this point                shimIndex = shim.getStyle('z-index');                if (shimIndex > me.zindex) {                    me.shim.setStyle('z-index', me.zindex - 2);                }                shim.show();                shim.setSize(w, h);                shim.setLeftTop(l, t);            }        }        return me;    },    remove: function() {        this.hideUnders();        this.callParent();    },    // private    beginUpdate: function() {        this.updating = true;    },    // private    endUpdate: function() {        this.updating = false;        this.sync(true);    },    // private    hideUnders: function() {        if (this.shadow) {            this.shadow.hide();        }        this.hideShim();    },    // private    constrainXY: function() {        if (this.constrain) {            var vw = Ext.Element.getViewWidth(),                vh = Ext.Element.getViewHeight(),                s = Ext.getDoc().getScroll(),                xy = this.getXY(),                x = xy[0],                y = xy[1],                so = this.shadowOffset,                w = this.dom.offsetWidth + so,                h = this.dom.offsetHeight + so,                moved = false; // only move it if it needs it            // first validate right/bottom            if ((x + w) > vw + s.left) {                x = vw - w - so;                moved = true;            }            if ((y + h) > vh + s.top) {                y = vh - h - so;                moved = true;            }            // then make sure top/left isn't negative            if (x < s.left) {                x = s.left;                moved = true;            }            if (y < s.top) {                y = s.top;                moved = true;            }            if (moved) {                Ext.Layer.superclass.setXY.call(this, [x, y]);                this.sync();            }        }        return this;    },    getConstrainOffset: function() {        return this.shadowOffset;    },    // overridden Element method    setVisible: function(visible, animate, duration, callback, easing) {        var me = this,            cb;        // post operation processing        cb = function() {            if (visible) {                me.sync(true);            }            if (callback) {                callback();            }        };        // Hide shadow and shim if hiding        if (!visible) {            me.hideUnders(true);        }        me.callParent([visible, animate, duration, callback, easing]);        if (!animate) {            cb();        }        return me;    },    // private    beforeFx: function() {        this.beforeAction();        return this.callParent(arguments);    },    // private    afterFx: function() {        this.callParent(arguments);        this.sync(this.isVisible());    },    // private    beforeAction: function() {        if (!this.updating && this.shadow) {            this.shadow.hide();        }    },    // overridden Element method    setLeft: function(left) {        this.callParent(arguments);        return this.sync();    },    setTop: function(top) {        this.callParent(arguments);        return this.sync();    },    setLeftTop: function(left, top) {        this.callParent(arguments);        return this.sync();    },    setXY: function(xy, animate, duration, callback, easing) {        var me = this;                // Callback will restore shadow state and call the passed callback        callback = me.createCB(callback);        me.fixDisplay();        me.beforeAction();        me.callParent([xy, animate, duration, callback, easing]);        if (!animate) {            callback();        }        return me;    },    // private    createCB: function(callback) {        var me = this,            showShadow = me.shadow && me.shadow.isVisible();        return function() {            me.constrainXY();            me.sync(showShadow);            if (callback) {                callback();            }        };    },    // overridden Element method    setX: function(x, animate, duration, callback, easing) {        this.setXY([x, this.getY()], animate, duration, callback, easing);        return this;    },    // overridden Element method    setY: function(y, animate, duration, callback, easing) {        this.setXY([this.getX(), y], animate, duration, callback, easing);        return this;    },    // overridden Element method    setSize: function(w, h, animate, duration, callback, easing) {        var me = this;                // Callback will restore shadow state and call the passed callback        callback = me.createCB(callback);        me.beforeAction();        me.callParent([w, h, animate, duration, callback, easing]);        if (!animate) {            callback();        }        return me;    },    // overridden Element method    setWidth: function(w, animate, duration, callback, easing) {        var me = this;                // Callback will restore shadow state and call the passed callback        callback = me.createCB(callback);        me.beforeAction();        me.callParent([w, animate, duration, callback, easing]);        if (!animate) {            callback();        }        return me;    },    // overridden Element method    setHeight: function(h, animate, duration, callback, easing) {        var me = this;                // Callback will restore shadow state and call the passed callback        callback = me.createCB(callback);        me.beforeAction();        me.callParent([h, animate, duration, callback, easing]);        if (!animate) {            callback();        }        return me;    },    // overridden Element method    setBounds: function(x, y, width, height, animate, duration, callback, easing) {        var me = this;                // Callback will restore shadow state and call the passed callback        callback = me.createCB(callback);        me.beforeAction();        if (!animate) {            Ext.Layer.superclass.setXY.call(me, [x, y]);            Ext.Layer.superclass.setSize.call(me, width, height);            callback();        } else {            me.callParent([x, y, width, height, animate, duration, callback, easing]);        }        return me;    },<span id='Ext-Layer-method-setZIndex'>    /**</span>     * Sets the z-index of this layer and adjusts any shadow and shim z-indexes. The layer     * z-index is automatically incremented depending upon the presence of a shim or a     * shadow in so that it always shows above those two associated elements.     *     * Any shim, will be assigned the passed z-index. A shadow will be assigned the next     * highet z-index, and the Layer's element will receive the highest  z-index.     *     * @param {Number} zindex The new z-index to set     * @return {Ext.Layer} The Layer     */    setZIndex: function(zindex) {        var me = this;                me.zindex = zindex;        if (me.getShim()) {            me.shim.setStyle('z-index', zindex++);        }        if (me.shadow) {            me.shadow.setZIndex(zindex++);        }        return me.setStyle('z-index', zindex);    },        onOpacitySet: function(opacity){        var shadow = this.shadow;        if (shadow) {            shadow.setOpacity(opacity);        }    }});</pre></body></html>
 |