OSDN Git Service

Version 0.6.x starting.
[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                 } else {\r
12                         data = TEMP[ i ];\r
13                 };\r
14                 list = data[ type ];\r
15                 if( !create || list ) return list;\r
16                 list = data[ type ] = [];\r
17                 list.data = data;\r
18                 return list;\r
19         };\r
20         \r
21         function exist( list, arg1, arg2 ){\r
22                 for( var i = list.length; i; ){\r
23                         if( list[ --i ].same( arg1, arg2 ) === true ) return i;\r
24                 };\r
25                 return -1;\r
26         };\r
27         \r
28         return X.Class.create(\r
29                 'EventDispatcher',\r
30                 {\r
31                         listen : function( type, arg1, arg2 ){\r
32                                 var list = getList( this, type, true );\r
33                                 if( list.length && exist( list, arg1, arg2 ) !== -1 ) return;\r
34                                 list[ list.length ] = X.Callback[ once === true ? 'once' : 'create' ]( arg1, arg2 );\r
35                         },\r
36                         listenOnce : function( type, arg1, arg2 ){\r
37                                 once = true;\r
38                                 this.listen( type, arg1, arg2 );\r
39                                 once = false;\r
40                         },\r
41                         unlisten : function( type, arg1, arg2 ){\r
42                                 var list = getList( this, type ),\r
43                                         list, i;\r
44                                 if( !list ) return;\r
45                                 i = exist( list, arg1, arg2 );\r
46                                 i !== -1 && list.splice( i, 1 );\r
47                                 if( list.length === 0 ){\r
48                                         list.data[ e.type ] = void 0;\r
49                                         delete list.data;\r
50                                 };\r
51                         },\r
52                         listening : function( type, arg1, arg2 ){\r
53                                 var list = getList( this, type );\r
54                                 if( !list ) return false;\r
55                                 return exist( list, arg1, arg2 ) !== -1;\r
56                         },\r
57                         dispatch : function( e ){\r
58                                 // dispatch 中の listen は?\r
59                                 // \r
60                                 \r
61                                 var list = getList( this, e.type ),\r
62                                         i, f;\r
63                                 if( !list ) return;\r
64                                 for( i = list.length; i; ){\r
65                                         f = list[ --i ];\r
66                                         // once の場合リストから削除してからファイア\r
67                                         f.once === true && list.splice( i, 1 );\r
68                                         if( f( e ) === false ){\r
69                                                 \r
70                                         };\r
71                                         if( list.length === 0 ){\r
72                                                 list.data[ e.type ] = void 0;\r
73                                                 delete list.data;\r
74                                         };\r
75                                 };\r
76                                 return;\r
77                         }\r
78                 }//, onKillCallback( instance )\r
79         );\r
80 })();\r
81 \r
82 \r
83 \r
84 \r