SuperX-Kernmodul
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

197 lines
5.4 KiB

/*
DynAPI Distribution
BorderManager Class
The DynAPI Distribution is distributed under the terms of the GNU LGPL license.
Requires: Highlighter
*/
BorderManager = {};
// usage: BorderManager.enableBorder(border_width,border_color,border_type,lyr1,lyr2,...lyrN);
BorderManager.enableBorder=function(w,c,style){
var lyr,arg=arguments;
for (var i=3;i<arg.length;i++){
lyr=arg[i];
if(lyr) lyr.setBorder(w,c,style);
}
};
var p = DynLayer.prototype;
/*
Border
style: inner, css-styles (solid, dotted, inset, outset,groove, etc)
ns4 will use layers for both inner and css-styles (only solid supported)
*/
p.setBorder = function(w,c,style){
var oldW = w,defW = 0;
var defCol = '#000000';
var defStyle = 'solid';
var tc,rc,bc,lc;
var ts,rs,bs,ls;
var tw=0,rw=0,bw=0,lw=0;
if(style=='inner') this.setInnerBorder(oldW,c);
else {
// handle width
if (w==null) w = defW;
else if(typeof(w)=='object') {
tw=w.top||w.light;
rw=w.right||w.dark;
bw=w.bottom||w.dark;
lw=w.left||w.light;
w=defW;
};
this._needBoxFix = true;
this._fixBoxModel = false;
this._fixBw = (lw+rw)||(w*2);
this._fixBh = (tw+bw)||(w*2);
this._fixBwp = this._fixBhp = 0;
if(dynapi.ua.ns4) this.setInnerBorder(oldW,c);
else {
// handle color
if (c==null) c = defCol;
else if(typeof(c)=='object') {
tc=c.top||c.light;
rc=c.right||c.dark;
bc=c.bottom||c.dark;
lc=c.left||c.light;
c=defCol;
};
// Style
if (style==null) style = defStyle;
else if(typeof(style)=='object') {
ts=style.top||style.light;
rs=style.right||style.dark;
bs=style.bottom||style.dark;
ls=style.left||style.light;
style=defStyle;
};
// Setup CSS
this._cssBorTop = (tw||w)+'px '+(ts||style)+' '+(tc||c);
this._cssBorRight = (rw||w)+'px '+(rs||style)+' '+(rc||c);
this._cssBorBottom = (bw||w)+'px '+(bs||style)+' '+(bc||c);
this._cssBorLeft = (lw||w)+'px '+(ls||style)+' '+(lc||c);
if(this.elm){
var css = this.css;
css.borderTop = this._cssBorTop;
css.borderRight = this._cssBorRight;
css.borderBottom = this._cssBorBottom;
css.borderLeft = this._cssBorLeft;
BorderManager.FixBoxModel(this);
}
else {
this._cssBorder = ' border-top:'+this._cssBorTop +
'; border-right:'+this._cssBorRight +
'; border-bottom:'+this._cssBorBottom +
'; border-left:'+this._cssBorLeft+'; '
}
}
}
};
/*
Inner Border Only.
useage: setInnerBorder(N,'#000000')
setInnerBorder(N,{top:'white',bottom:'black'});
setInnerBorder(N,{light:'white',dark:'silver'});
setInnerBorder({top:2,bottom:1},'#000000');
*/
p.setInnerBorder = function(w,c){
var _bor_tp={top:0,left:0,right:0-this._fixBw};
var _bor_rt={top:0,right:0-this._fixBw,bottom:0-this._fixBh};
var _bor_bm={bottom:0-this._fixBh,left:0,right:0-this._fixBw};
var _bor_lt={top:0,left:0,bottom:0-this._fixBh};
var tc,rc,bc,lc;
var tw=0,rw=0,bw=0,lw=0;
// handle width
if (w==null) w = 0;
else if(typeof(w)=='object') {
tw=w.top||w.light;
rw=w.right||w.dark;
bw=w.bottom||w.dark;
lw=w.left||w.light;
w = 0;
};
// handle color
if (c==null) c='#000000';
else if(typeof(c)=="object") {
tc=c.top||c.light;
rc=c.right||c.dark;
bc=c.bottom||c.dark;
lc=c.left||c.light;
c=null;
};
if(!this._borTp){
// create border layers
this.addChild(new Highlighter(),'_borTp');//top
this.addChild(new Highlighter(),'_borRt');//right
this.addChild(new Highlighter(),'_borBm');//bottom
this.addChild(new Highlighter(),'_borLt'); //left
// setup anchors
this._borTp.setAnchor(_bor_tp);
this._borRt.setAnchor(_bor_rt);
this._borBm.setAnchor(_bor_bm);
this._borLt.setAnchor(_bor_lt);
// z-index
this._borTp.setZIndex(10000);
this._borRt.setZIndex(10000);
this._borBm.setZIndex(10000);
this._borLt.setZIndex(10000);
}
// width
this._borTp.setHeight(tw||w);
this._borRt.setWidth(rw||w);
this._borBm.setHeight(bw||w);
this._borLt.setWidth(lw||w);
// color
this._borTp.setBgColor(tc||c);
this._borRt.setBgColor(rc||c);
this._borBm.setBgColor(bc||c);
this._borLt.setBgColor(lc||c);
// update anchors
if (this._updateAnchors) this._updateAnchors();
};
// Fix Box Model
BorderManager.FixBoxModel = function(lyr,force){
if(!this.compatCheck) {
var compat = document.compatMode;
this.compatCheck = true;
this.compatMode = (typeof compat=="string"&&compat!="BackCompat");
}
if (!dynapi.ua.opera && this.compatMode) return;
else if(!force && (!lyr||!lyr.css||lyr._fixBoxModel)) return;
var fixed,css = lyr.css;
var p = this.FixBoxModelParseInt;
var cWidth = lyr.w||p(css.width), cHeight = lyr.h||p(css.height);
var wBorder = lyr._fixBw;//||(p(css.borderLeftWidth) + p(css.borderRightWidth));
var hBorder = lyr._fixBh;//||(p(css.borderTopWidth) + p(css.borderBottomWidth));
var wPadding = lyr._fixBwp;//||(p(css.paddingLeft) + p(css.paddingRight));
var hPadding = lyr._fixBhp;//||(p(css.paddingTop) + p(css.paddingBottom));
if(wBorder>0||wPadding>0) {
fixed = true;
cWidth = cWidth + wBorder + wPadding;
if(!dynapi.ua.gecko) lyr.css.width = cWidth;
}
if(hBorder>0||hPadding>0) {
fixed = true;
cHeight = cHeight + hBorder + hPadding;
if(dynapi.ua.ie) lyr.css.height = cHeight;
}
if(fixed){
lyr.css.clip = 'rect(0px,'+(cWidth)+'px,'+(cHeight)+'px,0px)';
lyr._fixBoxModel = true;
lyr._fixBw = wBorder;
lyr._fixBh = hBorder;
lyr._fixBwp = wPadding;
lyr._fixBhp = hPadding;
}
};
BorderManager.FixBoxModelParseInt = function(s){
return parseInt(s,10)||0;
};