OSDN Git Service

Version 0.6.13, X.UI use X.Dom.Node.
[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( X.Type.isArray( arg2 ) ){\r
62                         f.add = arg2;\r
63                 };\r
64                 return f;\r
65         },\r
66         find : function( arg0, arg1 /* [ listener || ( context + function ) || function ] */ ){\r
67                 var live     = X.Callback._LIVE_LIST,\r
68                         i        = live.length,\r
69                         listener, context, callback,\r
70                         f;\r
71                 if( typeof arg1 === 'function' ){\r
72                         context  = arg0;\r
73                         callback = arg1;\r
74                 } else\r
75                 if( typeof arg0 === 'function' ){\r
76                         callback = arg0;\r
77                 } else\r
78                 if( arg0 && typeof arg0.handleEvent === 'function' ){\r
79                         listener = arg0;\r
80                 };\r
81                 \r
82                 for( ; i; ){\r
83                         f = live[ --i ];\r
84                         if( listener && f.listener === listener ){\r
85                                 return f;\r
86                         } else\r
87                         if( context && f.context === context && f.callback === callback ){\r
88                                 return f;\r
89                         } else          \r
90                         if( f.callback === callback ){\r
91                                 return f;\r
92                         };\r
93                 };\r
94                 return null;\r
95         },\r
96         _contextCallback : function(){\r
97                 var f = this,\r
98                         a = f.a,\r
99                         s = f.add,\r
100                         c = f.callback,\r
101                         x = f.context,\r
102                         i = 0,\r
103                         ary, r;\r
104                 //s && s.push.apply( a, s );\r
105                 if( s && s.length ){\r
106                         ary = [];\r
107                         a.length && ary.push.apply( ary, a );\r
108                         ary.push.apply( ary, s );\r
109                         a = ary;\r
110                 };\r
111                 r = a.length === 0 ? c.call( x ) : c.apply( x, a );\r
112                 delete f.a;\r
113                 //delete f.t;\r
114                 return r;\r
115         },\r
116         _generalCallback : function(){\r
117                 var f = this,\r
118                         a = f.a,\r
119                         s = f.add,\r
120                         c = f.callback,\r
121                         i = 0,\r
122                         ary, r;\r
123                 //s && s.push.apply( a, s );\r
124                 if( s && s.length ){\r
125                         ary = [];\r
126                         a.length && ary.push.apply( ary, a );\r
127                         ary.push.apply( ary, s );\r
128                         a = ary;\r
129                 };\r
130                 r = a.length === 0 ? c() : c.apply( null, a );\r
131                 delete f.a;\r
132                 //delete f.t;\r
133                 return r;\r
134         },\r
135         _kill : function(){\r
136                 X.Callback._correct( this );\r
137         },\r
138         _same : function( arg0, arg1, arg2 ){\r
139                 var listener, context, callback,\r
140                         f = this;\r
141                         \r
142                 if( arg0.kill === X.Callback._kill ){ // arg0 === X.Callback toString() で判定は?\r
143                         return this === arg0;\r
144                 } else\r
145                 if( typeof arg1 === 'function' ){\r
146                         context  = arg0;\r
147                         callback = arg1;\r
148                 } else\r
149                 if( typeof arg0 === 'function' ){\r
150                         callback = arg0;\r
151                         arg2     = arg1;\r
152                 } else\r
153                 if( arg0 && typeof arg0.handleEvent === 'function' ){\r
154                         listener = arg0;\r
155                         arg2     = arg1;\r
156                 };\r
157                 \r
158                 if( arg2 && f.add !== arg2 ){\r
159                         return false;\r
160                 };\r
161                 \r
162                 if( listener && f.listener === listener ){\r
163                         return true;\r
164                 } else\r
165                 if( context && f.context === context && f.callback === callback ){\r
166                         return true;\r
167                 } else          \r
168                 if( f.callback === callback ){\r
169                         return true;\r
170                 };\r
171                 return false;\r
172         },\r
173         _correct : function( f ){\r
174                 var self = X.Callback,\r
175                         i    = self._LIVE_LIST.indexOf( f );\r
176                 if( f.c ) delete f.c;\r
177                 if( f.listener ) delete f.listener;\r
178                 if( f.context  ) delete f.context;\r
179                 if( f.callback ) delete f.callback;\r
180                 if( f.add      ) delete f.add;\r
181                 if( i === -1 ) return;\r
182                 self._LIVE_LIST.splice( i, 1 );\r
183                 self._POOL_LIST.push( f );\r
184         },\r
185         sys_monitor : function(){\r
186                 return {\r
187                         'Live callback' : X.Callback._LIVE_LIST.length,\r
188                         'Pool callback' : X.Callback._POOL_LIST.length\r
189                 };\r
190         },\r
191         sys_gc : function(){\r
192                 var self = X.Callback,\r
193                         list = self._POOL_LIST, f;\r
194                 while( 0 < list.length ){\r
195                         f = list.shift();\r
196                         self._correct( f );\r
197                         delete f.kill;\r
198                         delete f.same;\r
199                 };\r
200         }\r
201 };\r