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
16 create : function( arg0, arg1, arg2 /* [ listener || ( context + function ) || function ][ args... ] */ ){
\r
17 var self = X.Callback,
\r
18 live = self._LIVE_LIST,
\r
19 f, listener, context, callback;
\r
21 if( typeof arg1 === 'function' ){
\r
25 if( typeof arg0 === 'function' ){
\r
27 if( !( arg2 = arg1 ) ) return callback; // function のみの場合 callback オブジェクトを作らない
\r
29 if( arg0 && typeof arg0.handleEvent === 'function' ){
\r
34 for( var k in arg0 ){
\r
35 v += k + '=' + arg0[ k ] + ' ';
\r
37 alert( 'Callback.create() fail! ' + v );
\r
40 f = self._POOL_LIST.pop();
\r
42 f = new Function( 'var a=arguments,f=a.callee;f.a=a;return f.c()' ); // f.t=this;
\r
43 f.kill = self._kill;
\r
44 f.same = self._same;
\r
46 live[ live.length ] = f;
\r
48 f.c = self._contextCallback;
\r
49 f.listener = listener;
\r
50 f.context = listener;
\r
51 f.callback = listener.handleEvent;
\r
54 f.c = self._contextCallback;
\r
55 f.context = context;
\r
56 f.callback = callback;
\r
58 f.c = self._generalCallback;
\r
59 f.callback = callback;
\r
62 if( X.Type.isArray( arg2 ) ){
\r
68 _contextCallback : function(){
\r
76 //s && s.push.apply( a, s );
\r
77 if( s && s.length ){
\r
82 ( ary[ 0 ] = a[ 0 ] ) :
\r
83 ary.push.apply( ary, a )
\r
86 ( ary[ ary.length ] = s[ 0 ] ) :
\r
87 ary.push.apply( ary, s );
\r
90 r = a.length === 0 ? c.call( x ) : c.apply( x, a );
\r
95 _generalCallback : function(){
\r
102 //s && s.push.apply( a, s );
\r
103 if( s && s.length ){
\r
108 ( ary[ 0 ] = a[ 0 ] ) :
\r
109 ary.push.apply( ary, a )
\r
112 ( ary[ ary.length ] = s[ 0 ] ) :
\r
113 ary.push.apply( ary, s );
\r
116 r = a.length === 0 ?
\r
120 c.apply( null, a );
\r
125 _kill : function(){
\r
126 X.Callback._correct( this );
\r
128 _same : function( arg0, arg1, arg2 ){
\r
129 var listener, context, callback,
\r
132 if( arg0.kill === X.Callback._kill ){ // arg0 === X.Callback toString() で判定は?
\r
133 return this === arg0;
\r
135 if( typeof arg1 === 'function' ){
\r
139 if( typeof arg0 === 'function' ){
\r
143 if( arg0 && typeof arg0.handleEvent === 'function' ){
\r
148 if( arg2 && f.add !== arg2 ){
\r
152 if( listener && f.listener === listener ){
\r
155 if( context && f.context === context && f.callback === callback ){
\r
158 if( f.callback === callback ){
\r
163 _correct : function( f ){
\r
164 var self = X.Callback,
\r
165 i = self._LIVE_LIST.indexOf( f );
\r
166 if( f.c ) delete f.c;
\r
167 if( f.listener ) delete f.listener;
\r
168 if( f.context ) delete f.context;
\r
169 if( f.callback ) delete f.callback;
\r
170 if( f.add ) delete f.add;
\r
171 if( i === -1 ) return;
\r
172 self._LIVE_LIST.splice( i, 1 );
\r
173 self._POOL_LIST.push( f );
\r
175 sys_monitor : function(){
\r
177 'Live callback' : X.Callback._LIVE_LIST.length,
\r
178 'Pool callback' : X.Callback._POOL_LIST.length
\r
181 sys_gc : function(){
\r
182 var self = X.Callback,
\r
183 list = self._POOL_LIST, f;
\r
184 while( 0 < list.length ){
\r
186 self._correct( f );
\r
193 console.log( 'X.Core.Callback' );
\r