OSDN Git Service

Version 0.6.6
[pettanr/clientJs.git] / 0.6.x / js / core / 06_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 && 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                                 X.EventDispatcher.prototype.listen.call( this, type, arg1, arg2 );\r
43                                 once = false;\r
44                                 return this;\r
45                         },\r
46                         unlisten : function( type, arg1, arg2 ){\r
47                                 var list = getList( this, type ),\r
48                                         list, i;\r
49                                 if( !list ) return this;\r
50                                 i = exist( list, arg1, arg2 );\r
51                                 if( i !== -1 ){\r
52                                         list[ i ].kill();\r
53                                         list.splice( i, 1 );\r
54                                         if( list.length === 0 ){\r
55                                                 list.data[ e.type ] = void 0;\r
56                                                 delete list.data;\r
57                                         };\r
58                                 };\r
59                                 return this;\r
60                         },\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
65                         },\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
70                                 if( !list ) return;\r
71                                 for( i = list.length; i; ){\r
72                                         f = list[ --i ];\r
73                                         // once の場合リストから削除してからファイア\r
74                                         if( f.once === true ){\r
75                                                 list.splice( i, 1 );\r
76                                                 ret = f( e );\r
77                                         } else {\r
78                                                 ret = f( e );\r
79                                                 if( ret === false || ret & X.Callback.UN_LISTEN ){\r
80                                                         list.splice( i, 1 );\r
81                                                         f.kill();\r
82                                                 };\r
83                                         };\r
84                                         if( list.length === 0 ){\r
85                                                 list.data[ e.type ] = void 0;\r
86                                                 delete list.data;\r
87                                         };\r
88                                         if( ret & X.Callback.STOP_NOW ){\r
89                                                 sysOnly = true;\r
90                                         };\r
91                                         _ret |= ret;\r
92                                 };\r
93                                 return _ret;\r
94                         }\r
95                 }//, onKillCallback( instance )\r
96         );\r
97 })();\r
98 \r
99 \r