OSDN Git Service

Version 0.6.11, add XUI_Gesture.
[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         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                         var v = '';\r
33                         for( var k in  arg0 ){\r
34                                 v += k + '=' + arg0[ k ] + ' ';\r
35                         };\r
36                         alert( 'Callback.create() fail! ' + v );\r
37                 };\r
38                 \r
39                 f = self._POOL_LIST.pop();\r
40                 if( !f ){\r
41                         f = new Function( 'var a=arguments,f=a.callee;f.a=a;return f.c()' ); // f.t=this;\r
42                         f.kill = self._kill;\r
43                         f.same = self._same;\r
44                 };\r
45                 live[ live.length ] = f;\r
46                 if( listener ){\r
47                         f.c        = self._contextCallback;\r
48                         f.listener = listener;\r
49                         f.context  = listener;\r
50                         f.callback = listener.handleEvent;\r
51                 } else\r
52                 if( context ){\r
53                         f.c        = self._contextCallback;\r
54                         f.context  = context;\r
55                         f.callback = callback;\r
56                 } else {\r
57                         f.c        = self._generalCallback;\r
58                         f.callback = callback;\r
59                 };\r
60 \r
61                 if( arg2 && typeof arg2.length === 'number' ){\r
62                         f.add = arg2;\r
63                 };\r
64                 return f;\r
65         },\r
66         once : function( arg0, arg1, arg2 ){\r
67                 var f = X.Callback.create( arg0, arg1, arg2 );\r
68                 f.once = true;\r
69                 return f;\r
70         },\r
71         find : function( arg0, arg1 /* [ listener || ( context + function ) || function ] */ ){\r
72                 var live     = X.Callback._LIVE_LIST,\r
73                         i        = live.length,\r
74                         listener, context, callback,\r
75                         f;\r
76                 if( typeof arg1 === 'function' ){\r
77                         context  = arg0;\r
78                         callback = arg1;\r
79                 } else\r
80                 if( typeof arg0 === 'function' ){\r
81                         callback = arg0;\r
82                 } else\r
83                 if( arg0 && typeof arg0.handleEvent === 'function' ){\r
84                         listener = arg0;\r
85                 };\r
86                 \r
87                 for( ; i; ){\r
88                         f = live[ --i ];\r
89                         if( listener && f.listener === listener ){\r
90                                 return f;\r
91                         } else\r
92                         if( context && f.context === context && f.callback === callback ){\r
93                                 return f;\r
94                         } else          \r
95                         if( f.callback === callback ){\r
96                                 return f;\r
97                         };\r
98                 };\r
99                 return null;\r
100         },\r
101         _contextCallback : function(){\r
102                 var f = this,\r
103                         a = f.a,\r
104                         s = f.add,\r
105                         c = f.callback,\r
106                         x = f.context,\r
107                         i = 0, l, r;\r
108                 s && s.push.apply( a, s );\r
109                 l = a.length;\r
110                 r = l === 0 ? c.call( x ) :\r
111                     l === 1 ? c.call( x, a[ 0 ] ) : c.apply( x, a );\r
112                 delete f.a;\r
113                 //delete f.t;\r
114                 f.once && X.Callback._correct( f );\r
115                 return r;\r
116         },\r
117         _generalCallback : function(){\r
118                 var f = this,\r
119                         a = f.a,\r
120                         s = f.add,\r
121                         c = f.callback,\r
122                         i = 0, l, r;\r
123                 s && s.push.apply( a, s );\r
124                 l = a.length;\r
125                 r = l === 0 ? c() :\r
126                         l === 1 ? c( a[ 0 ] ) : c.apply( null, a );\r
127                 delete f.a;\r
128                 //delete f.t;\r
129                 f.once && X.Callback._correct( f );\r
130                 return r;\r
131         },\r
132         _kill : function(){\r
133                 X.Callback._correct( this );\r
134         },\r
135         _same : function( arg0, arg1, arg2 ){\r
136                 var listener, context, callback,\r
137                         f = this;\r
138                 if( typeof arg1 === 'function' ){\r
139                         context  = arg0;\r
140                         callback = arg1;\r
141                 } else\r
142                 if( typeof arg0 === 'function' ){\r
143                         callback = arg0;\r
144                         arg2     = arg1;\r
145                 } else\r
146                 if( arg0 && typeof arg0.handleEvent === 'function' ){\r
147                         listener = arg0;\r
148                         arg2     = arg1;\r
149                 };\r
150                 \r
151                 if( arg2 && f.add && f.add !== arg2 ){\r
152                         return false;\r
153                 };\r
154                 \r
155                 if( listener && f.listener === listener ){\r
156                         return true;\r
157                 } else\r
158                 if( context && f.context === context && f.callback === callback ){\r
159                         return true;\r
160                 } else          \r
161                 if( f.callback === callback ){\r
162                         return true;\r
163                 };\r
164                 return false;\r
165         },\r
166         _correct : function( f ){\r
167                 var self = X.Callback,\r
168                         i    = self._LIVE_LIST.indexOf( f );\r
169                 if( f.c ) delete f.c;\r
170                 if( f.listener ) delete f.listener;\r
171                 if( f.context  ) delete f.context;\r
172                 if( f.callback ) delete f.callback;\r
173                 if( f.once     ) delete f.once;\r
174                 if( f.add      ) delete f.add;\r
175                 if( i === -1 ) return;\r
176                 self._LIVE_LIST.splice( i, 1 );\r
177                 self._POOL_LIST.push( f );\r
178         },\r
179         sys_monitor : function(){\r
180                 return {\r
181                         'Live callback' : X.Callback._LIVE_LIST.length,\r
182                         'Pool callback' : X.Callback._POOL_LIST.length\r
183                 };\r
184         },\r
185         sys_gc : function(){\r
186                 var self = X.Callback,\r
187                         list = self._POOL_LIST, f;\r
188                 while( 0 < list.length ){\r
189                         f = list.shift();\r
190                         self._correct( f );\r
191                         delete f.kill;\r
192                         delete f.same;\r
193                 };\r
194         }\r
195 };\r