448 lines
No EOL
15 KiB
HTML
448 lines
No EOL
15 KiB
HTML
<html><head><title>Layer.js</title><link rel="stylesheet" type="text/css" href="../resources/style.css" media="screen"/></head><body><h1>Layer.js</h1><pre class="highlighted"><code><i>/**
|
|
* @class Ext.Layer
|
|
* @extends Ext.Element
|
|
* An extended Element object that supports a shadow and shim, constrain to viewport and
|
|
* automatic maintaining of shadow/shim positions.
|
|
* @cfg {Boolean} shim False to disable the iframe shim <b>in</b> browsers which need one (defaults to true)
|
|
* @cfg {String/Boolean} shadow True to create a shadow element <b>with</b> default class "x-layer-shadow" or
|
|
* you can pass a string <b>with</b> a css class name. False turns off the shadow.
|
|
* @cfg {Object} dh DomHelper object config to create element <b>with</b> (defaults to {tag: "div", cls: "x-layer"}).
|
|
* @cfg {Boolean} constrain False to disable constrain to viewport (defaults to true)
|
|
* @cfg {String} cls CSS class to add to the element
|
|
* @cfg {Number} zindex Starting z-index (defaults to 11000!)
|
|
* @cfg {Number} shadowOffset Number of pixels to offset the shadow (defaults to 3)
|
|
* @constructor
|
|
* @param {Object} config
|
|
* @param {String/HTMLElement} existingEl (optional) Uses an existing dom element. If the element is not found it creates it.
|
|
*/</i>
|
|
(<b>function</b>(){
|
|
Ext.Layer = <b>function</b>(config, existingEl){
|
|
config = config || {};
|
|
<b>var</b> dh = Ext.DomHelper;
|
|
<b>var</b> cp = config.parentEl, pel = cp ? Ext.getDom(cp) : document.body;
|
|
<b>if</b>(existingEl){
|
|
<b>this</b>.dom = Ext.getDom(existingEl);
|
|
}
|
|
<b>if</b>(!<b>this</b>.dom){
|
|
<b>var</b> o = config.dh || {tag: "div", cls: "x-layer"};
|
|
<b>this</b>.dom = dh.append(pel, o);
|
|
}
|
|
<b>if</b>(config.cls){
|
|
<b>this</b>.addClass(config.cls);
|
|
}
|
|
<b>this</b>.constrain = config.constrain !== false;
|
|
<b>this</b>.visibilityMode = Ext.Element.VISIBILITY;
|
|
<b>if</b>(config.id){
|
|
<b>this</b>.id = <b>this</b>.dom.id = config.id;
|
|
}<b>else</b>{
|
|
<b>this</b>.id = Ext.id(<b>this</b>.dom);
|
|
}
|
|
<b>this</b>.zindex = config.zindex || <b>this</b>.getZIndex();
|
|
<b>this</b>.position("absolute", <b>this</b>.zindex);
|
|
<b>if</b>(config.shadow){
|
|
<b>this</b>.shadowOffset = config.shadowOffset || 4;
|
|
<b>this</b>.shadow = <b>new</b> Ext.Shadow({
|
|
offset : <b>this</b>.shadowOffset,
|
|
mode : config.shadow
|
|
});
|
|
}<b>else</b>{
|
|
<b>this</b>.shadowOffset = 0;
|
|
}
|
|
<b>this</b>.useShim = config.shim !== false && Ext.useShims;
|
|
<b>this</b>.useDisplay = config.useDisplay;
|
|
<b>this</b>.hide();
|
|
};
|
|
|
|
<b>var</b> supr = Ext.Element.prototype;
|
|
|
|
<i>// shims are shared among layer to keep from having 100 iframes</i>
|
|
<b>var</b> shims = [];
|
|
|
|
Ext.extend(Ext.Layer, Ext.Element, {
|
|
|
|
getZIndex : <b>function</b>(){
|
|
<b>return</b> this.zindex || parseInt(<b>this</b>.getStyle("z-index"), 10) || 11000;
|
|
},
|
|
|
|
getShim : <b>function</b>(){
|
|
<b>if</b>(!<b>this</b>.useShim){
|
|
<b>return</b> null;
|
|
}
|
|
<b>if</b>(this.shim){
|
|
<b>return</b> this.shim;
|
|
}
|
|
<b>var</b> shim = shims.shift();
|
|
<b>if</b>(!shim){
|
|
shim = <b>this</b>.createShim();
|
|
shim.enableDisplayMode('block');
|
|
shim.dom.style.display = 'none';
|
|
shim.dom.style.visibility = 'visible';
|
|
}
|
|
<b>var</b> pn = <b>this</b>.dom.parentNode;
|
|
<b>if</b>(shim.dom.parentNode != pn){
|
|
pn.insertBefore(shim.dom, <b>this</b>.dom);
|
|
}
|
|
shim.setStyle('z-index', <b>this</b>.getZIndex()-2);
|
|
<b>this</b>.shim = shim;
|
|
<b>return</b> shim;
|
|
},
|
|
|
|
hideShim : <b>function</b>(){
|
|
<b>if</b>(this.shim){
|
|
<b>this</b>.shim.setDisplayed(false);
|
|
shims.push(<b>this</b>.shim);
|
|
<b>delete</b> this.shim;
|
|
}
|
|
},
|
|
|
|
disableShadow : <b>function</b>(){
|
|
<b>if</b>(this.shadow){
|
|
<b>this</b>.shadowDisabled = true;
|
|
<b>this</b>.shadow.hide();
|
|
<b>this</b>.lastShadowOffset = <b>this</b>.shadowOffset;
|
|
<b>this</b>.shadowOffset = 0;
|
|
}
|
|
},
|
|
|
|
enableShadow : <b>function</b>(show){
|
|
<b>if</b>(this.shadow){
|
|
<b>this</b>.shadowDisabled = false;
|
|
<b>this</b>.shadowOffset = <b>this</b>.lastShadowOffset;
|
|
<b>delete</b> this.lastShadowOffset;
|
|
<b>if</b>(show){
|
|
<b>this</b>.sync(true);
|
|
}
|
|
}
|
|
},
|
|
|
|
<i>// private</i>
|
|
<i>// <b>this</b> code can execute repeatedly <b>in</b> milliseconds (i.e. during a drag) so</i>
|
|
<i>// code size was sacrificed <b>for</b> effeciency (e.g. no getBox/setBox, no XY calls)</i>
|
|
sync : <b>function</b>(doShow){
|
|
<b>var</b> sw = <b>this</b>.shadow;
|
|
<b>if</b>(!<b>this</b>.updating && <b>this</b>.isVisible() && (sw || <b>this</b>.useShim)){
|
|
<b>var</b> sh = <b>this</b>.getShim();
|
|
|
|
<b>var</b> w = <b>this</b>.getWidth(),
|
|
h = <b>this</b>.getHeight();
|
|
|
|
<b>var</b> l = <b>this</b>.getLeft(true),
|
|
t = <b>this</b>.getTop(true);
|
|
|
|
<b>if</b>(sw && !<b>this</b>.shadowDisabled){
|
|
<b>if</b>(doShow && !sw.isVisible()){
|
|
sw.show(<b>this</b>);
|
|
}<b>else</b>{
|
|
sw.realign(l, t, w, h);
|
|
}
|
|
<b>if</b>(sh){
|
|
<b>if</b>(doShow){
|
|
sh.show();
|
|
}
|
|
<i>// fit the shim behind the shadow, so it is shimmed too</i>
|
|
<b>var</b> a = sw.adjusts, s = sh.dom.style;
|
|
s.left = (Math.min(l, l+a.l))+"px";
|
|
s.top = (Math.min(t, t+a.t))+"px";
|
|
s.width = (w+a.w)+"px";
|
|
s.height = (h+a.h)+"px";
|
|
}
|
|
}<b>else</b> if(sh){
|
|
<b>if</b>(doShow){
|
|
sh.show();
|
|
}
|
|
sh.setSize(w, h);
|
|
sh.setLeftTop(l, t);
|
|
}
|
|
|
|
}
|
|
},
|
|
|
|
<i>// private</i>
|
|
destroy : <b>function</b>(){
|
|
<b>this</b>.hideShim();
|
|
<b>if</b>(this.shadow){
|
|
<b>this</b>.shadow.hide();
|
|
}
|
|
<b>this</b>.removeAllListeners();
|
|
<b>var</b> pn = <b>this</b>.dom.parentNode;
|
|
<b>if</b>(pn){
|
|
pn.removeChild(<b>this</b>.dom);
|
|
}
|
|
Ext.Element.uncache(<b>this</b>.id);
|
|
},
|
|
|
|
remove : <b>function</b>(){
|
|
<b>this</b>.destroy();
|
|
},
|
|
|
|
<i>// private</i>
|
|
beginUpdate : <b>function</b>(){
|
|
<b>this</b>.updating = true;
|
|
},
|
|
|
|
<i>// private</i>
|
|
endUpdate : <b>function</b>(){
|
|
<b>this</b>.updating = false;
|
|
<b>this</b>.sync(true);
|
|
},
|
|
|
|
<i>// private</i>
|
|
hideUnders : <b>function</b>(negOffset){
|
|
<b>if</b>(this.shadow){
|
|
<b>this</b>.shadow.hide();
|
|
}
|
|
<b>this</b>.hideShim();
|
|
},
|
|
|
|
<i>// private</i>
|
|
constrainXY : <b>function</b>(){
|
|
<b>if</b>(this.constrain){
|
|
<b>var</b> vw = Ext.lib.Dom.getViewWidth(),
|
|
vh = Ext.lib.Dom.getViewHeight();
|
|
<b>var</b> s = Ext.get(document).getScroll();
|
|
|
|
<b>var</b> xy = <b>this</b>.getXY();
|
|
<b>var</b> x = xy[0], y = xy[1];
|
|
<b>var</b> w = <b>this</b>.dom.offsetWidth+<b>this</b>.shadowOffset, h = <b>this</b>.dom.offsetHeight+<b>this</b>.shadowOffset;
|
|
<i>// only move it <b>if</b> it needs it</i>
|
|
<b>var</b> moved = false;
|
|
<i>// first validate right/bottom</i>
|
|
<b>if</b>((x + w) > vw+s.left){
|
|
x = vw - w - <b>this</b>.shadowOffset;
|
|
moved = true;
|
|
}
|
|
<b>if</b>((y + h) > vh+s.top){
|
|
y = vh - h - <b>this</b>.shadowOffset;
|
|
moved = true;
|
|
}
|
|
<i>// then make sure top/left isn't negative</i>
|
|
<b>if</b>(x < s.left){
|
|
x = s.left;
|
|
moved = true;
|
|
}
|
|
<b>if</b>(y < s.top){
|
|
y = s.top;
|
|
moved = true;
|
|
}
|
|
<b>if</b>(moved){
|
|
<b>if</b>(this.avoidY){
|
|
<b>var</b> ay = <b>this</b>.avoidY;
|
|
<b>if</b>(y <= ay && (y+h) >= ay){
|
|
y = ay-h-5;
|
|
}
|
|
}
|
|
xy = [x, y];
|
|
<b>this</b>.storeXY(xy);
|
|
supr.setXY.call(<b>this</b>, xy);
|
|
<b>this</b>.sync();
|
|
}
|
|
}
|
|
},
|
|
|
|
isVisible : <b>function</b>(){
|
|
<b>return</b> this.visible;
|
|
},
|
|
|
|
<i>// private</i>
|
|
showAction : <b>function</b>(){
|
|
<b>this</b>.visible = true; <i>// track visibility to prevent getStyle calls</i>
|
|
<b>if</b>(this.useDisplay === true){
|
|
<b>this</b>.setDisplayed("");
|
|
}<b>else</b> if(<b>this</b>.lastXY){
|
|
supr.setXY.call(<b>this</b>, <b>this</b>.lastXY);
|
|
}<b>else</b> if(<b>this</b>.lastLT){
|
|
supr.setLeftTop.call(<b>this</b>, <b>this</b>.lastLT[0], <b>this</b>.lastLT[1]);
|
|
}
|
|
},
|
|
|
|
<i>// private</i>
|
|
hideAction : <b>function</b>(){
|
|
<b>this</b>.visible = false;
|
|
<b>if</b>(this.useDisplay === true){
|
|
<b>this</b>.setDisplayed(false);
|
|
}<b>else</b>{
|
|
<b>this</b>.setLeftTop(-10000,-10000);
|
|
}
|
|
},
|
|
|
|
<i>// overridden Element method</i>
|
|
setVisible : <b>function</b>(v, a, d, c, e){
|
|
<b>if</b>(v){
|
|
<b>this</b>.showAction();
|
|
}
|
|
<b>if</b>(a && v){
|
|
<b>var</b> cb = <b>function</b>(){
|
|
<b>this</b>.sync(true);
|
|
<b>if</b>(c){
|
|
c();
|
|
}
|
|
}.createDelegate(<b>this</b>);
|
|
supr.setVisible.call(<b>this</b>, true, true, d, cb, e);
|
|
}<b>else</b>{
|
|
<b>if</b>(!v){
|
|
<b>this</b>.hideUnders(true);
|
|
}
|
|
<b>var</b> cb = c;
|
|
<b>if</b>(a){
|
|
cb = <b>function</b>(){
|
|
<b>this</b>.hideAction();
|
|
<b>if</b>(c){
|
|
c();
|
|
}
|
|
}.createDelegate(<b>this</b>);
|
|
}
|
|
supr.setVisible.call(<b>this</b>, v, a, d, cb, e);
|
|
<b>if</b>(v){
|
|
<b>this</b>.sync(true);
|
|
}<b>else</b> if(!a){
|
|
<b>this</b>.hideAction();
|
|
}
|
|
}
|
|
},
|
|
|
|
storeXY : <b>function</b>(xy){
|
|
<b>delete</b> this.lastLT;
|
|
<b>this</b>.lastXY = xy;
|
|
},
|
|
|
|
storeLeftTop : <b>function</b>(left, top){
|
|
<b>delete</b> this.lastXY;
|
|
<b>this</b>.lastLT = [left, top];
|
|
},
|
|
|
|
<i>// private</i>
|
|
beforeFx : <b>function</b>(){
|
|
<b>this</b>.beforeAction();
|
|
<b>return</b> Ext.Layer.superclass.beforeFx.apply(<b>this</b>, arguments);
|
|
},
|
|
|
|
<i>// private</i>
|
|
afterFx : <b>function</b>(){
|
|
Ext.Layer.superclass.afterFx.apply(<b>this</b>, arguments);
|
|
<b>this</b>.sync(<b>this</b>.isVisible());
|
|
},
|
|
|
|
<i>// private</i>
|
|
beforeAction : <b>function</b>(){
|
|
<b>if</b>(!<b>this</b>.updating && <b>this</b>.shadow){
|
|
<b>this</b>.shadow.hide();
|
|
}
|
|
},
|
|
|
|
<i>// overridden Element method</i>
|
|
setLeft : <b>function</b>(left){
|
|
<b>this</b>.storeLeftTop(left, <b>this</b>.getTop(true));
|
|
supr.setLeft.apply(<b>this</b>, arguments);
|
|
<b>this</b>.sync();
|
|
},
|
|
|
|
setTop : <b>function</b>(top){
|
|
<b>this</b>.storeLeftTop(<b>this</b>.getLeft(true), top);
|
|
supr.setTop.apply(<b>this</b>, arguments);
|
|
<b>this</b>.sync();
|
|
},
|
|
|
|
setLeftTop : <b>function</b>(left, top){
|
|
<b>this</b>.storeLeftTop(left, top);
|
|
supr.setLeftTop.apply(<b>this</b>, arguments);
|
|
<b>this</b>.sync();
|
|
},
|
|
|
|
setXY : <b>function</b>(xy, a, d, c, e){
|
|
<b>this</b>.fixDisplay();
|
|
<b>this</b>.beforeAction();
|
|
<b>this</b>.storeXY(xy);
|
|
<b>var</b> cb = <b>this</b>.createCB(c);
|
|
supr.setXY.call(<b>this</b>, xy, a, d, cb, e);
|
|
<b>if</b>(!a){
|
|
cb();
|
|
}
|
|
},
|
|
|
|
<i>// private</i>
|
|
createCB : <b>function</b>(c){
|
|
<b>var</b> el = <b>this</b>;
|
|
<b>return</b> function(){
|
|
el.constrainXY();
|
|
el.sync(true);
|
|
<b>if</b>(c){
|
|
c();
|
|
}
|
|
};
|
|
},
|
|
|
|
<i>// overridden Element method</i>
|
|
setX : <b>function</b>(x, a, d, c, e){
|
|
<b>this</b>.setXY([x, <b>this</b>.getY()], a, d, c, e);
|
|
},
|
|
|
|
<i>// overridden Element method</i>
|
|
setY : <b>function</b>(y, a, d, c, e){
|
|
<b>this</b>.setXY([<b>this</b>.getX(), y], a, d, c, e);
|
|
},
|
|
|
|
<i>// overridden Element method</i>
|
|
setSize : <b>function</b>(w, h, a, d, c, e){
|
|
<b>this</b>.beforeAction();
|
|
<b>var</b> cb = <b>this</b>.createCB(c);
|
|
supr.setSize.call(<b>this</b>, w, h, a, d, cb, e);
|
|
<b>if</b>(!a){
|
|
cb();
|
|
}
|
|
},
|
|
|
|
<i>// overridden Element method</i>
|
|
setWidth : <b>function</b>(w, a, d, c, e){
|
|
<b>this</b>.beforeAction();
|
|
<b>var</b> cb = <b>this</b>.createCB(c);
|
|
supr.setWidth.call(<b>this</b>, w, a, d, cb, e);
|
|
<b>if</b>(!a){
|
|
cb();
|
|
}
|
|
},
|
|
|
|
<i>// overridden Element method</i>
|
|
setHeight : <b>function</b>(h, a, d, c, e){
|
|
<b>this</b>.beforeAction();
|
|
<b>var</b> cb = <b>this</b>.createCB(c);
|
|
supr.setHeight.call(<b>this</b>, h, a, d, cb, e);
|
|
<b>if</b>(!a){
|
|
cb();
|
|
}
|
|
},
|
|
|
|
<i>// overridden Element method</i>
|
|
setBounds : <b>function</b>(x, y, w, h, a, d, c, e){
|
|
<b>this</b>.beforeAction();
|
|
<b>var</b> cb = <b>this</b>.createCB(c);
|
|
<b>if</b>(!a){
|
|
<b>this</b>.storeXY([x, y]);
|
|
supr.setXY.call(<b>this</b>, [x, y]);
|
|
supr.setSize.call(<b>this</b>, w, h, a, d, cb, e);
|
|
cb();
|
|
}<b>else</b>{
|
|
supr.setBounds.call(<b>this</b>, x, y, w, h, a, d, cb, e);
|
|
}
|
|
<b>return</b> this;
|
|
},
|
|
|
|
<i>/**
|
|
* Set the z-index of <b>this</b> layer and adjusts any shadow and shim z-indexes. The layer z-index is automatically
|
|
* incremented by two more than the value passed <b>in</b> so that it always shows above any shadow or shim (the shadow
|
|
* element, <b>if</b> any, will be assigned z-index + 1, and the shim element, <b>if</b> any, will be assigned the unmodified z-index).
|
|
* @param {Number} zindex The <b>new</b> z-index to set
|
|
* @<b>return</b> {<b>this</b>} The Layer
|
|
*/</i>
|
|
setZIndex : <b>function</b>(zindex){
|
|
<b>this</b>.zindex = zindex;
|
|
<b>this</b>.setStyle("z-index", zindex + 2);
|
|
<b>if</b>(this.shadow){
|
|
<b>this</b>.shadow.setZIndex(zindex + 1);
|
|
}
|
|
<b>if</b>(this.shim){
|
|
<b>this</b>.shim.setStyle("z-index", zindex);
|
|
}
|
|
}
|
|
});
|
|
})();</code></pre><hr><div style="font-size:10px;text-align:center;color:gray;">Ext - Copyright © 2006-2007 Ext JS, LLC<br />All rights reserved.</div>
|
|
</body></html> |