OSDN Git Service

Version 0.6.6
[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         CANCEL_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         create : function( arg0, arg1, arg2 /* [ listener || ( context + function ) || function ][ args... ] */ ){\r
16                 var self  = X.Callback,\r
17                         live  = self._LIVE_LIST,\r
18                         f, listener, context, callback;\r
19                 \r
20                 if( typeof arg1 === 'function' ){\r
21                         context  = arg0;\r
22                         callback = arg1;\r
23                 } else\r
24                 if( typeof arg0 === 'function' ){\r
25                         callback = arg0;\r
26                         arg2     = arg1;\r
27                 } else\r
28                 if( arg0 && typeof arg0.handleEvent === 'function' ){\r
29                         listener = arg0;\r
30                         arg2     = arg1;\r
31                 } else {\r
32                         alert( 'Callback.create() fail!' );\r
33                 };\r
34                 \r
35                 f = self._POOL_LIST.pop();\r
36                 if( !f ){\r
37                         f = new Function( 'var a=arguments,f=a.callee;f.a=a;return f.c()' ); // f.t=this;\r
38                         f.kill = self._kill;\r
39                         f.same = self._same;                    \r
40                 };\r
41                 live[ live.length ] = f;\r
42                 if( listener ){\r
43                         f.c        = self._contextCallback;\r
44                         f.listener = listener;\r
45                         f.context  = listener;\r
46                         f.callback = listener.handleEvent;\r
47                 } else\r
48                 if( context ){\r
49                         f.c        = self._contextCallback;\r
50                         f.context  = context;\r
51                         f.callback = callback;\r
52                 } else {\r
53                         f.c        = self._generalCallback;\r
54                         f.callback = callback;\r
55                 };\r
56 \r
57                 if( arg2 && typeof arg2.length === 'number' ){\r
58                         f.add = arg2;\r
59                 };\r
60                 return f;\r
61         },\r
62         once : function( arg0, arg1, arg2 ){\r
63                 var f = X.Callback.create( arg0, arg1, arg2 );\r
64                 f.once = true;\r
65                 return f;\r
66         },\r
67         find : function( arg0, arg1 /* [ listener || ( context + function ) || function ] */ ){\r
68                 var live     = X.Callback._LIVE_LIST,\r
69                         i        = live.length,\r
70                         listener, context, callback,\r
71                         f;\r
72                 if( typeof arg1 === 'function' ){\r
73                         context  = arg0;\r
74                         callback = arg1;\r
75                 } else\r
76                 if( typeof arg0 === 'function' ){\r
77                         callback = arg0;\r
78                 } else\r
79                 if( arg0 && typeof arg0.handleEvent === 'function' ){\r
80                         listener = arg0;\r
81                 };\r
82                 \r
83                 for( ; i; ){\r
84                         f = live[ --i ];\r
85                         if( listener && f.listener === listener ){\r
86                                 return f;\r
87                         } else\r
88                         if( context && f.context === context && f.callback === callback ){\r
89                                 return f;\r
90                         } else          \r
91                         if( f.callback === callback ){\r
92                                 return f;\r
93                         };\r
94                 };\r
95                 return null;\r
96         },\r
97         _contextCallback : function(){\r
98                 var f = this,\r
99                         a = f.a,\r
100                         s = f.add,\r
101                         c = f.callback,\r
102                         x = f.context,\r
103                         i = 0, l, r;\r
104                 s && s.push.apply( a, s );\r
105                 l = a.length;\r
106                 r = l === 0 ? c.call( x ) :\r
107                     l === 1 ? c.call( x, a[ 0 ] ) : c.apply( x, a );\r
108                 delete f.a;\r
109                 //delete f.t;\r
110                 f.once && X.Callback._correct( f );\r
111                 return r;\r
112         },\r
113         _generalCallback : function(){\r
114                 var f = this,\r
115                         a = f.a,\r
116                         s = f.add,\r
117                         c = f.callback,\r
118                         i = 0, l, r;\r
119                 s && s.push.apply( a, s );\r
120                 l = a.length;\r
121                 r = l === 0 ? c() :\r
122                         l === 1 ? c( a[ 0 ] ) : c.apply( null, a );\r
123                 delete f.a;\r
124                 //delete f.t;\r
125                 f.once && X.Callback._correct( f );\r
126                 return r;\r
127         },\r
128         _kill : function(){\r
129                 X.Callback._correct( this );\r
130         },\r
131         _same : function( arg0, arg1, arg2 ){\r
132                 var listener, context, callback,\r
133                         f = this;\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 && 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.once     ) delete f.once;\r
170                 if( f.add      ) delete f.add;\r
171                 if( i === -1 ) return;\r
172                 self._LIVE_LIST.splice( i, 1 );\r
173                 self._POOL_LIST.push( f );\r
174         },\r
175         sys_monitor : function(){\r
176                 return {\r
177                         'Live callback' : X.Callback._LIVE_LIST.length,\r
178                         'Pool callback' : X.Callback._POOL_LIST.length\r
179                 };\r
180         },\r
181         sys_gc : function(){\r
182                 var self = X.Callback,\r
183                         list = self._POOL_LIST, f;\r
184                 while( 0 < list.length ){\r
185                         f = list.shift();\r
186                         self._correct( f );\r
187                         delete f.kill;\r
188                         delete f.same;\r
189                 };\r
190         }\r
191 };\r