OSDN Git Service

Version 0.6.37, X.Dom.Anime removed.
[pettanr/clientJs.git] / 0.6.x / js / core / 03_XCallback.js
1 \r
2 \r
3 X.Callback = {\r
4         \r
5         NONE             :  0,\r
6         UN_LISTEN        :  1,\r
7         STOP_PROPAGATION :  2,  // 上位階層への伝播のキャンセル\r
8         STOP_NOW         :  4,  // 同一階層のリスナーのキャンセル\r
9         PREVENT_DEFAULT  :  8,  // 結果動作のキャンセル,\r
10         MONOPOLY         : 16,  // move event を独占する\r
11         SYS_CANCEL       : 32,\r
12         \r
13         _LIVE_LIST       : [],\r
14         _POOL_LIST       : [],\r
15         \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
20                 \r
21                 if( typeof arg1 === 'function' ){\r
22                         context  = arg0;\r
23                         callback = arg1;\r
24                 } else\r
25                 if( typeof arg0 === 'function' ){\r
26                         callback = arg0;\r
27                         if( !( arg2 = arg1 ) ) return callback; // function のみの場合 callback オブジェクトを作らない\r
28                 } else\r
29                 if( arg0 && typeof arg0.handleEvent === 'function' ){\r
30                         listener = arg0;\r
31                         arg2     = arg1;\r
32                 } else {\r
33                         var v = '';\r
34                         for( var k in  arg0 ){\r
35                                 v += k + '=' + arg0[ k ] + ' ';\r
36                         };\r
37                         alert( 'Callback.create() fail! ' + v );\r
38                 };\r
39                 \r
40                 f = self._POOL_LIST.pop();\r
41                 if( !f ){\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
45                 };\r
46                 live[ live.length ] = f;\r
47                 if( listener ){\r
48                         f.c        = self._contextCallback;\r
49                         f.listener = listener;\r
50                         f.context  = listener;\r
51                         f.callback = listener.handleEvent;\r
52                 } else\r
53                 if( context ){\r
54                         f.c        = self._contextCallback;\r
55                         f.context  = context;\r
56                         f.callback = callback;\r
57                 } else {\r
58                         f.c        = self._generalCallback;\r
59                         f.callback = callback;\r
60                 };\r
61 \r
62                 if( X.Type.isArray( arg2 ) ){\r
63                         f.add = arg2;\r
64                 };\r
65                 return f;\r
66         },\r
67         _contextCallback : function(){\r
68                 var f = this,\r
69                         a = f.a,\r
70                         s = f.add,\r
71                         c = f.callback,\r
72                         x = f.context,\r
73                         i = 0,\r
74                         ary, r;\r
75                 //s && s.push.apply( a, s );\r
76                 if( s && s.length ){\r
77                         ary = [];\r
78                         a.length &&\r
79                                 (\r
80                                         a.length === 1 ?\r
81                                                 ( ary[ 0 ] = a[ 0 ] ) :\r
82                                                 ary.push.apply( ary, a )\r
83                                 );\r
84                         s.length === 1 ?\r
85                                 ( ary[ ary.length ] = s[ 0 ] ) :\r
86                                 ary.push.apply( ary, s );\r
87                         a = ary;\r
88                 };\r
89                 r = a.length === 0 ? c.call( x ) : c.apply( x, a );\r
90                 delete f.a;\r
91                 //delete f.t;\r
92                 return r;\r
93         },\r
94         _generalCallback : function(){\r
95                 var f = this,\r
96                         a = f.a,\r
97                         s = f.add,\r
98                         c = f.callback,\r
99                         i = 0,\r
100                         ary, r;\r
101                 //s && s.push.apply( a, s );\r
102                 if( s && s.length ){\r
103                         ary = [];\r
104                         a.length &&\r
105                                 (\r
106                                         a.length === 1 ?\r
107                                                 ( ary[ 0 ] = a[ 0 ] ) :\r
108                                                 ary.push.apply( ary, a )\r
109                                 );\r
110                         s.length === 1 ?\r
111                                 ( ary[ ary.length ] = s[ 0 ] ) :\r
112                                 ary.push.apply( ary, s );\r
113                         a = ary;\r
114                 };\r
115                 r = a.length === 0 ?\r
116                                 c() :\r
117                         a.length === 1 ?\r
118                                 c( a[ 0 ] ) :\r
119                                 c.apply( null, a );\r
120                 delete f.a;\r
121                 //delete f.t;\r
122                 return r;\r
123         },\r
124         _kill : function(){\r
125                 X.Callback._correct( this );\r
126         },\r
127         _same : function( arg0, arg1, arg2 ){\r
128                 var listener, context, callback,\r
129                         f = this;\r
130                         \r
131                 if( arg0.kill === X.Callback._kill ){ // arg0 === X.Callback toString() で判定は?\r
132                         return this === arg0;\r
133                 } else\r
134                 if( typeof arg1 === 'function' ){\r
135                         context  = arg0;\r
136                         callback = arg1;\r
137                 } else\r
138                 if( typeof arg0 === 'function' ){\r
139                         callback = arg0;\r
140                         arg2     = arg1;\r
141                 } else\r
142                 if( arg0 && typeof arg0.handleEvent === 'function' ){\r
143                         listener = arg0;\r
144                         arg2     = arg1;\r
145                 };\r
146                 \r
147                 if( arg2 && f.add !== arg2 ){\r
148                         return false;\r
149                 };\r
150                 \r
151                 if( listener && f.listener === listener ){\r
152                         return true;\r
153                 } else\r
154                 if( context && f.context === context && f.callback === callback ){\r
155                         return true;\r
156                 } else          \r
157                 if( f.callback === callback ){\r
158                         return true;\r
159                 };\r
160                 return false;\r
161         },\r
162         _correct : function( f ){\r
163                 var self = X.Callback,\r
164                         i    = self._LIVE_LIST.indexOf( f );\r
165                 if( f.c ) delete f.c;\r
166                 if( f.listener ) delete f.listener;\r
167                 if( f.context  ) delete f.context;\r
168                 if( f.callback ) delete f.callback;\r
169                 if( f.add      ) delete f.add;\r
170                 if( i === -1 ) return;\r
171                 self._LIVE_LIST.splice( i, 1 );\r
172                 self._POOL_LIST.push( f );\r
173         },\r
174         sys_monitor : function(){\r
175                 return {\r
176                         'Live callback' : X.Callback._LIVE_LIST.length,\r
177                         'Pool callback' : X.Callback._POOL_LIST.length\r
178                 };\r
179         },\r
180         sys_gc : function(){\r
181                 var self = X.Callback,\r
182                         list = self._POOL_LIST, f;\r
183                 while( 0 < list.length ){\r
184                         f = list.shift();\r
185                         self._correct( f );\r
186                         delete f.kill;\r
187                         delete f.same;\r
188                 };\r
189         }\r
190 };\r