root / trunk / web / dojo / dojox / lang / observable.js
History | View | Annotate | Download (3.57 KB)
| 1 |
/*
|
|---|---|
| 2 |
Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
|
| 3 |
Available via Academic Free License >= 2.1 OR the modified BSD license.
|
| 4 |
see: http://dojotoolkit.org/license for details
|
| 5 |
*/
|
| 6 |
|
| 7 |
|
| 8 |
if(!dojo._hasResource["dojox.lang.observable"]){ |
| 9 |
dojo._hasResource["dojox.lang.observable"]=true; |
| 10 |
dojo.provide("dojox.lang.observable");
|
| 11 |
dojo.experimental("dojox.lang.observable");
|
| 12 |
dojox.lang.observable=function(_1,_2,_3,_4){ |
| 13 |
return dojox.lang.makeObservable(_2,_3,_4)(_1);
|
| 14 |
}; |
| 15 |
dojox.lang.makeObservable=function(_5,_6,_7,_8){ |
| 16 |
_8=_8||{};
|
| 17 |
_7=_7||function(_9,_a,_b,_c){
|
| 18 |
return _a[_b].apply(_9,_c);
|
| 19 |
}; |
| 20 |
function _d(_e,_f,i){ |
| 21 |
return function(){ |
| 22 |
return _7(_e,_f,i,arguments); |
| 23 |
}; |
| 24 |
}; |
| 25 |
if(dojox.lang.lettableWin){
|
| 26 |
var _10=dojox.lang.makeObservable;
|
| 27 |
_10.inc=(_10.inc||0)+1; |
| 28 |
var _11="gettable_"+_10.inc; |
| 29 |
dojox.lang.lettableWin[_11]=_5; |
| 30 |
var _12="settable_"+_10.inc; |
| 31 |
dojox.lang.lettableWin[_12]=_6; |
| 32 |
var _13={};
|
| 33 |
return function(_14){ |
| 34 |
if(_14.__observable){
|
| 35 |
return _14.__observable;
|
| 36 |
} |
| 37 |
if(_14.data__){
|
| 38 |
throw new Error("Can wrap an object that is already wrapped"); |
| 39 |
} |
| 40 |
var _15=[],i,l;
|
| 41 |
for(i in _8){ |
| 42 |
_15.push(i); |
| 43 |
} |
| 44 |
var _16={type:1,event:1}; |
| 45 |
for(i in _14){ |
| 46 |
if(i.match(/^[a-zA-Z][\w\$_]*$/)&&!(i in _8)&&!(i in _16)){ |
| 47 |
_15.push(i); |
| 48 |
} |
| 49 |
} |
| 50 |
var _17=_15.join(","); |
| 51 |
var _18,_19=_13[_17];
|
| 52 |
if(!_19){
|
| 53 |
var _1a="dj_lettable_"+(_10.inc++); |
| 54 |
var _1b=_1a+"_dj_getter"; |
| 55 |
var _1c=["Class "+_1a,"\tPublic data__"]; |
| 56 |
for(i=0,l=_15.length;i<l;i++){ |
| 57 |
_18=_15[i]; |
| 58 |
var _1d=typeof _14[_18]; |
| 59 |
if(_1d=="function"||_8[_18]){ |
| 60 |
_1c.push(" Public "+_18);
|
| 61 |
}else{
|
| 62 |
if(_1d!="object"){ |
| 63 |
_1c.push("\tPublic Property Let "+_18+"(val)","\t\tCall "+_12+"(me.data__,\""+_18+"\",val)","\tEnd Property","\tPublic Property Get "+_18,"\t\t"+_18+" = "+_11+"(me.data__,\""+_18+"\")","\tEnd Property"); |
| 64 |
} |
| 65 |
} |
| 66 |
} |
| 67 |
_1c.push("End Class");
|
| 68 |
_1c.push("Function "+_1b+"()","\tDim tmp","\tSet tmp = New "+_1a,"\tSet "+_1b+" = tmp","End Function"); |
| 69 |
dojox.lang.lettableWin.vbEval(_1c.join("\n"));
|
| 70 |
_13[_17]=_19=function(){ |
| 71 |
return dojox.lang.lettableWin.construct(_1b);
|
| 72 |
}; |
| 73 |
} |
| 74 |
var _1e=_19();
|
| 75 |
_1e.data__=_14; |
| 76 |
try{
|
| 77 |
_14.__observable=_1e; |
| 78 |
} |
| 79 |
catch(e){
|
| 80 |
} |
| 81 |
for(i=0,l=_15.length;i<l;i++){ |
| 82 |
_18=_15[i]; |
| 83 |
try{
|
| 84 |
var val=_14[_18];
|
| 85 |
} |
| 86 |
catch(e){
|
| 87 |
} |
| 88 |
if(typeof val=="function"||_8[_18]){ |
| 89 |
_1e[_18]=_d(_1e,_14,_18); |
| 90 |
} |
| 91 |
} |
| 92 |
return _1e;
|
| 93 |
}; |
| 94 |
}else{
|
| 95 |
return function(_1f){ |
| 96 |
if(_1f.__observable){
|
| 97 |
return _1f.__observable;
|
| 98 |
} |
| 99 |
var _20=_1f instanceof Array?[]:{}; |
| 100 |
_20.data__=_1f; |
| 101 |
for(var i in _1f){ |
| 102 |
if(i.charAt(0)!="_"){ |
| 103 |
if(typeof _1f[i]=="function"){ |
| 104 |
_20[i]=_d(_20,_1f,i); |
| 105 |
}else{
|
| 106 |
if(typeof _1f[i]!="object"){ |
| 107 |
(function(i){
|
| 108 |
_20.__defineGetter__(i,function(){
|
| 109 |
return _5(_1f,i);
|
| 110 |
}); |
| 111 |
_20.__defineSetter__(i,function(_21){
|
| 112 |
return _6(_1f,i,_21);
|
| 113 |
}); |
| 114 |
})(i); |
| 115 |
} |
| 116 |
} |
| 117 |
} |
| 118 |
} |
| 119 |
for(i in _8){ |
| 120 |
_20[i]=_d(_20,_1f,i); |
| 121 |
} |
| 122 |
_1f.__observable=_20; |
| 123 |
return _20;
|
| 124 |
}; |
| 125 |
} |
| 126 |
}; |
| 127 |
if(!{}.__defineGetter__){
|
| 128 |
if(dojo.isIE){
|
| 129 |
var frame;
|
| 130 |
if(document.body){
|
| 131 |
frame=document.createElement("iframe");
|
| 132 |
document.body.appendChild(frame); |
| 133 |
}else{
|
| 134 |
document.write("<iframe id='dj_vb_eval_frame'></iframe>");
|
| 135 |
frame=document.getElementById("dj_vb_eval_frame");
|
| 136 |
} |
| 137 |
frame.style.display="none";
|
| 138 |
var doc=frame.contentWindow.document;
|
| 139 |
dojox.lang.lettableWin=frame.contentWindow; |
| 140 |
doc.write("<html><head><script language=\"VBScript\" type=\"text/VBScript\">"+"Function vb_global_eval(code)"+"ExecuteGlobal(code)"+"End Function"+"</script>"+"<script type=\"text/javascript\">"+"function vbEval(code){ \n"+"return vb_global_eval(code);"+"}"+"function construct(name){ \n"+"return window[name]();"+"}"+"</script>"+"</head><body>vb-eval</body></html>"); |
| 141 |
doc.close(); |
| 142 |
}else{
|
| 143 |
throw new Error("This browser does not support getters and setters"); |
| 144 |
} |
| 145 |
} |
| 146 |
dojox.lang.ReadOnlyProxy=dojox.lang.makeObservable(function(obj,i){
|
| 147 |
return obj[i];
|
| 148 |
},function(obj,i,_22){
|
| 149 |
}); |
| 150 |
} |