1 X.EventDispatcher = ( function(){
\r
2 var LIST = [], TEMP = [], once;
\r
4 function getList( instance, type, create ){
\r
5 var i = LIST.indexOf( instance ),
\r
8 if( !create ) return;
\r
9 LIST[ LIST.length ] = instance;
\r
10 TEMP[ TEMP.length ] = data = {};
\r
11 if( window[ 'AbstractDisplayNode' ] && instance.instanceOf && instance.instanceOf( window[ 'AbstractDisplayNode' ] ) ){
\r
12 X.Class._getPrivate( instance ).events = data;
\r
17 list = data[ type ];
\r
18 if( !create || list ) return list;
\r
19 list = data[ type ] = [];
\r
24 function exist( list, arg1, arg2 ){
\r
25 for( var i = list.length; i; ){
\r
26 if( list[ --i ].same( arg1, arg2 ) === true ) return i;
\r
31 return X.Class.create(
\r
34 listen : function( type, arg1, arg2 ){
\r
35 var list = getList( this, type, true );
\r
36 if( list.length && exist( list, arg1, arg2 ) !== -1 ) return this;
\r
37 list[ list.length ] = X.Callback[ once === true ? 'once' : 'create' ]( arg1, arg2 );
\r
40 listenOnce : function( type, arg1, arg2 ){
\r
42 X.EventDispatcher.prototype.listen.call( this, type, arg1, arg2 );
\r
46 unlisten : function( type, arg1, arg2 ){
\r
47 var list = getList( this, type ),
\r
49 if( !list ) return this;
\r
50 i = exist( list, arg1, arg2 );
\r
53 list.splice( i, 1 );
\r
54 if( list.length === 0 ){
\r
55 list.data[ e.type ] = void 0;
\r
61 listening : function( type, arg1, arg2 ){
\r
62 var list = getList( this, type );
\r
63 if( !list ) return false;
\r
64 return exist( list, arg1, arg2 ) !== -1;
\r
66 dispatch : function( e ){
\r
67 // dispatch 中の listen は?
\r
68 var list = getList( this, e.type ),
\r
69 i, f, ret, sysOnly, _ret;
\r
71 for( i = list.length; i; ){
\r
73 // once の場合リストから削除してからファイア
\r
74 if( f.once === true ){
\r
75 list.splice( i, 1 );
\r
79 if( ret === false || ret & X.Callback.UN_LISTEN ){
\r
80 list.splice( i, 1 );
\r
84 if( list.length === 0 ){
\r
85 list.data[ e.type ] = void 0;
\r
88 if( ret & X.Callback.STOP_NOW ){
\r
95 }//, onKillCallback( instance )
\r