OSDN Git Service

Version 0.6.3
[pettanr/clientJs.git] / 0.6.x / js / core / 07_XEventDispatcher.js
1 X.EventDispatcher = ( function(){\r
2         var LIST = [], TEMP = [], once;\r
3         \r
4         function getList( instance, type, create ){\r
5                 var i = LIST.indexOf( instance ),\r
6                         data, list;\r
7                 if( i === -1 ){\r
8                         if( !create ) return;\r
9                         LIST[ LIST.length ] = instance;\r
10                         TEMP[ TEMP.length ] = data = {};\r
11                         if( window[ 'AbstractDisplayNode' ] && instance instanceof window[ 'AbstractDisplayNode' ] ){\r
12                                 X.Class._getPrivate( instance ).events = data;\r
13                         };\r
14                 } else {\r
15                         data = TEMP[ i ];\r
16                 };\r
17                 list = data[ type ];\r
18                 if( !create || list ) return list;\r
19                 list = data[ type ] = [];\r
20                 list.data = data;\r
21                 return list;\r
22         };\r
23         \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
27                 };\r
28                 return -1;\r
29         };\r
30         \r
31         return X.Class.create(\r
32                 'EventDispatcher',\r
33                 {\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
38                                 return this;\r
39                         },\r
40                         listenOnce : function( type, arg1, arg2 ){\r
41                                 once = true;\r
42                                 //this.listen( type, arg1, arg2 );\r
43                                 X.EventDispatcher.prototype.listen.call( this, type, arg1, arg2 );\r
44                                 once = false;\r
45                                 return this;\r
46                         },\r
47                         unlisten : function( type, arg1, arg2 ){\r
48                                 var list = getList( this, type ),\r
49                                         list, i;\r
50                                 if( !list ) return this;\r
51                                 i = exist( list, arg1, arg2 );\r
52                                 if( i !== -1 ){\r
53                                         list[ i ].kill();\r
54                                         list.splice( i, 1 );\r
55                                         if( list.length === 0 ){\r
56                                                 list.data[ e.type ] = void 0;\r
57                                                 delete list.data;\r
58                                         };\r
59                                 };\r
60                                 return this;\r
61                         },\r
62                         listening : function( type, arg1, arg2 ){\r
63                                 var list = getList( this, type );\r
64                                 if( !list ) return false;\r
65                                 return exist( list, arg1, arg2 ) !== -1;\r
66                         },\r
67                         dispatch : function( e ){\r
68                                 // dispatch 中の listen は?\r
69                                 var list = getList( this, e.type ),\r
70                                         i, f, ret, sysOnly, _ret;\r
71                                 if( !list ) return;\r
72                                 for( i = list.length; i; ){\r
73                                         f = list[ --i ];\r
74                                         // once の場合リストから削除してからファイア\r
75                                         if( f.once === true ){\r
76                                                 list.splice( i, 1 );\r
77                                                 ret = f( e );\r
78                                         } else {\r
79                                                 ret = f( e );\r
80                                                 if( ret === false || ret & X.Cancel.UN_LISTEN ){\r
81                                                         list.splice( i, 1 );\r
82                                                         f.kill();\r
83                                                 };\r
84                                         };\r
85                                         if( list.length === 0 ){\r
86                                                 list.data[ e.type ] = void 0;\r
87                                                 delete list.data;\r
88                                         };\r
89                                         if( ret & X.Cancel.STOP_NOW ){\r
90                                                 sysOnly = true;\r
91                                         };\r
92                                         _ret |= ret;\r
93                                 };\r
94                                 return _ret;\r
95                         }\r
96                 }//, onKillCallback( instance )\r
97         );\r
98 })();\r
99 \r
100 \r