7 STOP_PROPAGATION : 2, // 上位階層への伝播のキャンセル
\r
8 STOP_NOW : 4 | 2, // 同一階層のリスナーのキャンセル(上位へもキャンセル)
\r
9 PREVENT_DEFAULT : 8, // 結果動作のキャンセル,
\r
10 MONOPOLY : 16, // move event を独占する
\r
11 SYS_CANCEL : 32 | 4 | 2,
\r
13 _USE_CLOSURE : false,
\r
22 create : function( arg1, arg2, arg3 /* [ listener || ( context + function ) || function ][ args... ] */ ){
\r
23 var live = X.Callback._LIVE_LIST,
\r
24 hash = X.Callback._classifyCallbackArgs( arg1, arg2, arg3 ),
\r
27 if( !hash.k ) return hash;
\r
29 f = X.Callback._POOL_LIST.pop();
\r
31 f = new Function( 'var a=arguments,f=a.callee;f.a=a;return f._(f)' ); // f.x=this;
\r
32 f[ 'kill' ] = X.Callback._kill;
\r
33 f[ 'same' ] = X.Callback._same;
\r
34 f._ = X.Callback._proxyCallback;
\r
37 live[ live.length ] = f;
\r
39 switch( f.k = hash.k ){
\r
40 case X.Callback._THIS_FUNC :
\r
44 case X.Callback._HANDLEEVENT :
\r
47 case X.Callback._FUNC_ONLY :
\r
52 if( hash.s ) f.s = hash.s;
\r
56 _createClosure : function( obj ){
\r
59 return obj._( obj );
\r
63 _classifyCallbackArgs : function( arg1, arg2, arg3, alt_context ){
\r
66 if( arg1 && X.Type.isFunction( arg2 ) ){
\r
67 obj = { x : arg1, f : arg2, k : X.Callback._THIS_FUNC };
\r
69 if( arg1 && X.Type.isFunction( arg1[ 'handleEvent' ] ) ){
\r
70 obj = { x : arg1, k : X.Callback._HANDLEEVENT };
\r
73 if( X.Type.isFunction( arg1 ) ){
\r
76 obj = { x : alt_context, f : arg1, k : X.Callback._THIS_FUNC };
\r
78 obj = { f : arg1, k : X.Callback._FUNC_ONLY };
\r
81 if( X.Type.isFunction( arg2 ) ){
\r
82 console.log( 'X.Callback._classifyCallbackArgs : arg1 が ' + arg1 + 'です' );
\r
84 obj = { x : alt_context, f : arg2, k : X.Callback._THIS_FUNC };
\r
86 obj = { f : arg2, k : X.Callback._FUNC_ONLY };
\r
90 obj = { x : alt_context, k : X.Callback._HANDLEEVENT };
\r
93 console.log( '不正 ' + arg1 );
\r
94 console.dir( arg1 );
\r
98 if( X.Type.isArray( arg3 )){
\r
101 return ( obj.x || obj.s ) ? obj : arg1;
\r
104 _proxyCallback : function( xfunc ){
\r
105 var args = xfunc.a || [],
\r
113 if( supp && supp.length ){
\r
117 args.length === 1 ?
\r
118 ( temp[ 0 ] = args[ 0 ] ) :
\r
119 temp.push.apply( temp, args )
\r
121 supp.length === 1 ?
\r
122 ( temp[ temp.length ] = supp[ 0 ] ) :
\r
123 temp.push.apply( temp, supp );
\r
129 case X.Callback._THIS_FUNC :
\r
130 return args.length === 0 ? func.call( thisObj ) : func.apply( thisObj, args );
\r
132 case X.Callback._HANDLEEVENT :
\r
133 temp = thisObj[ 'handleEvent' ];
\r
134 if( X.Type.isFunction( temp ) ){
\r
135 return args.length === 0 ? thisObj[ 'handleEvent' ]() :
\r
136 args.length === 1 ? thisObj[ 'handleEvent' ]( args[ 0 ] ) : temp.apply( thisObj, args );
\r
140 if( temp !== func && X.Type.isFunction( temp ) ){
\r
141 return args.length === 0 ? thisObj[ 'handleEvent' ]() : temp.apply( thisObj, args );
\r
143 if( X.Type.isFunction( thisObj ) ){
\r
144 return args.length === 0 ? thisObj.call( thisObj ) : thisObj.apply( thisObj, args );
\r
146 return args.length === 0 ? func.call( thisObj ) : func.apply( thisObj, args );*/
\r
148 case X.Callback._FUNC_ONLY :
\r
149 return args.length === 0 ?
\r
151 args.length === 1 ?
\r
152 func( args[ 0 ] ) :
\r
153 func.apply( null, args );
\r
155 return X.Callback.NONE;
\r
158 _kill : function(){
\r
159 X.Callback._correct( this );
\r
161 _same : function( arg1, arg2, arg3 ){
\r
164 if( arg1 && arg1[ 'kill' ] === X.Callback._kill ) return this === arg1;
\r
166 hash = X.Callback._classifyCallbackArgs( arg1, arg2, arg3 );
\r
168 return hash && this.k === hash.k && this.x === hash.x && this.f === hash.f && this.s === hash.s;
\r
170 _correct : function( f ){
\r
171 var i = X.Callback._LIVE_LIST.indexOf( f );
\r
174 if( f.x ) delete f.x;
\r
175 if( f.f ) delete f.f;
\r
176 if( f.s ) delete f.s;
\r
177 if( i === -1 ) return;
\r
178 X.Callback._LIVE_LIST.splice( i, 1 );
\r
179 X.Callback._POOL_LIST.push( f );
\r
182 sys_monitor : function(){
\r
184 'Live callback' : X.Callback._LIVE_LIST.length,
\r
185 'Pool callback' : X.Callback._POOL_LIST.length
\r
188 sys_gc : function(){
\r
189 var list = X.Callback._POOL_LIST,
\r
191 while( 0 < list.length ){
\r
193 X.Callback._correct( f );
\r
195 delete f[ 'kill' ];
\r
196 delete f[ 'same' ];
\r
201 console.log( 'X.Core.Callback' );
\r