root/as3/snapfit/trunk/src/snapfit/events/FAdapter.as

リビジョン 1346, 10.9 kB (コミッタ: nutsu, コミット時期: 1 年 前)

stretch util

Line 
1 //
2 // Licensed under the MIT License
3 //
4 // Copyright (C) 2008  TAKANAWA Tomoaki (http://nutsu.com) and
5 //                                         Spark project (www.libspark.org)
6 //
7 // Permission is hereby granted, free of charge, to any person obtaining a copy
8 // of this software and associated documentation files (the "Software"), to deal
9 // in the Software without restriction, including without limitation the rights
10 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 // copies of the Software, and to permit persons to whom the Software is
12 // furnished to do so, subject to the following conditions:
13 //
14 // The above copyright notice and this permission notice shall be included in
15 // all copies or substantial portions of the Software.
16 //
17 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23 // THE SOFTWARE.
24 //
25
26 package snapfit.events
27 {
28         import flash.events.Event;
29         import flash.events.EventDispatcher;
30         import flash.events.IEventDispatcher;
31         import flash.utils.Proxy;
32         import flash.utils.flash_proxy;
33        
34         /**
35         * FAdapter
36         * @author nutsu
37         * @version 0.2
38         */
39         dynamic public class FAdapter extends Proxy implements IAdapter
40         {
41                 private var _dispatcher:IEventDispatcher;
42                 private var _listeners:Object;
43                 private var _useCapture:Boolean = false;
44                 private var _priority:int = 0;
45                 private var _useWeakReference:Boolean = false;
46                
47                 public function FAdapter( dispatcher_:IEventDispatcher=null )
48                 {
49                         _dispatcher = (dispatcher_) ? dispatcher_ : new EventDispatcher();
50                         _listeners  = { };
51                 }
52                
53                 public function get dispatcher():IEventDispatcher { return _dispatcher; }
54                 public function set dispatcher(value:IEventDispatcher):void
55                 {
56                         abort();
57                         _dispatcher = value;
58                         resume();
59                 }
60                
61                 public function setDefaultProps( useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false ):void
62                 {
63                         _useCapture = useCapture;
64                         _priority   = priority;
65                         _useWeakReference = useWeakReference;
66                 }
67                
68                 public function addEventListener( type:String, handler:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false ):void
69                 {
70                         this[type] = new $listener( this, type, handler, useCapture, priority, useWeakReference );
71                 }
72                
73                 public function removeEventListener( type:String ):void
74                 {
75                         delete this[type];
76                 }
77                
78                 public function dispatchEvent( e:Event ):Boolean
79                 {
80                         return _dispatcher.dispatchEvent( e );
81                 }
82                
83                 //------------------------------------------------------------------------------------UTIL
84                
85                 /**
86                  * @param       eventType
87                  * @return      result code.
88                  * @see FAdapterCheckResult
89                  */
90                 public function check( eventType:String ):int
91                 {
92                         if ( _listeners[eventType] )
93                                 if ( _dispatcher.hasEventListener(eventType) )
94                                         if ( _listeners[eventType].active )
95                                                 return FAdapterCheckResult.ACTIVE;
96                                         else
97                                                 return FAdapterCheckResult.HAS_BUT_NOT_ACTIVE;
98                                 else
99                                         if( !_listeners[eventType].active )
100                                                 return FAdapterCheckResult.NOT_ACTIVE;
101                                         else
102                                                 return FAdapterCheckResult.NOT_HAS_BUT_ACTIVE;
103                         else if ( _dispatcher.hasEventListener(eventType) )
104                                 return FAdapterCheckResult.HAS_UNKNOWN;
105                         else
106                                 return FAdapterCheckResult.NOT_EXISTS;
107                 }
108                
109                 /**
110                  * @param       eventType       default:abort all
111                  */
112                 public function abort( eventType:String=null ):void
113                 {
114                         if ( eventType==null )
115                         {
116                                 for each ( var obj:$listener in _listeners )
117                                         _remove( obj );
118                         }
119                         else if( check(eventType)==FAdapterCheckResult.ACTIVE )
120                         {
121                                 _remove( _listeners[eventType] );
122                         }
123                 }
124                
125                 /**
126                  * @param       eventType       default:resume all
127                  */
128                 public function resume( eventType:String=null ):void
129                 {
130                         if ( eventType==null )
131                         {
132                                 for each ( var obj:$listener in _listeners )
133                                         _add( obj );
134                         }
135                         else if( check(eventType)==FAdapterCheckResult.NOT_ACTIVE )
136                         {
137                                 _add( _listeners[eventType] );
138                         }
139                 }
140                
141                 /**
142                  * @param       active_kind 1:active, 0:not active, default:all
143                  * @return      String[]
144                  */
145                 public function getTypes( active_kind:int=-1 ):Array
146                 {
147                         var res:Array = [];
148                         var obj:$listener;
149                         if ( active_kind == 1 )
150                         {
151                                 for each ( obj in _listeners )
152                                         if( obj.active )
153                                                 res.push( obj.type );
154                         }
155                         else if ( active_kind == 0 )
156                         {
157                                 for each ( obj in _listeners )
158                                         if( !obj.active )
159                                                 res.push( obj.type );
160                         }
161                         else
162                         {
163                                 for each ( obj in _listeners )
164                                         res.push( obj.type );
165                         }
166                         return res;
167                 }
168                
169                 public function removeAll():void
170                 {
171                         for ( var eventType in _listeners )
172                                 delete this[eventType];
173                 }
174                
175                 //------------------------------------------------------------------------------------ filter
176                
177                 /**
178                  * イベント送出後に listener を remove します。
179                  */
180                 public static function oneTime( lo:* ):Boolean
181                 {
182                         if ( lo is $listener )
183                         {
184                                 var active_listener:Boolean = lo._active;
185                                 if( active_listener ) lo._ref._remove( lo );
186                                 lo._handler = function( e:* ):void
187                                 {
188                                         lo._targetHandler.apply( null, [e] );
189                                         delete lo._ref[lo._type];
190                                 };
191                                 if( active_listener ) lo._ref._add( lo );
192                                 return true;
193                         }
194                         else
195                         {
196                                 return false;
197                         }
198                 }
199                        
200                 /**
201                  * filterfunc が true を返すときに、イベントが送出されます.
202                  * @param       lo                      adapter[eventType]
203                  * @param       filterfunc      filter function
204                  * @param       remove         
205                  */
206                 public static function filter( lo:*, filterfunc:Function, remove:Boolean=false ):Boolean
207                 {
208                         if ( lo is $listener )
209                         {
210                                 var active_listener:Boolean = lo._active;
211                                 if ( active_listener ) lo._ref._remove( lo );
212                                 if ( remove )
213                                 {
214                                         lo._handler = function( e:* ):void
215                                         {
216                                                 if ( filterfunc( e ) )
217                                                         lo._targetHandler.apply( null, [e] );
218                                                 else
219                                                         delete lo._ref[lo._type];
220                                         };
221                                 }
222                                 else
223                                 {
224                                         lo._handler = function( e:* ):void
225                                         {
226                                                 if( filterfunc( e ) )
227                                                         lo._targetHandler.apply( null, [e] );
228                                         };
229                                 }
230                                 if( active_listener ) lo._ref._add( lo );
231                                 return true;
232                         }
233                         else
234                         {
235                                 return false;
236                         }
237                 }
238                
239                 /**
240                  * onTime() filter() の設定を解除します.
241                  */
242                 public static function clearFilter( lo:* ):Boolean
243                 {
244                         if ( lo is $listener )
245                         {
246                                 var active_listener:Boolean = lo._active;
247                                 if( active_listener ) lo._ref._remove( lo );
248                                 lo._handler = lo._targetHandler;
249                                 if( active_listener ) lo._ref._add( lo );
250                                 return true;
251                         }
252                         else
253                         {
254                                 return false;
255                         }
256                 }
257                
258                 //------------------------------------------------------------------------------------ADD_REMOVE
259                
260                 private function _add( lo:$listener ):void
261                 {
262                         if ( !lo.active )
263                         {
264                                 _dispatcher.addEventListener( lo._type, lo._handler, lo._useCapture, lo._priority, lo._useWeakReference );
265                                 lo._active = true;
266                         }
267                 }
268                
269                 private function _remove( lo:$listener ):void
270                 {
271                         if ( _dispatcher.hasEventListener( lo._type ) )
272                         {
273                                 _dispatcher.removeEventListener( lo._type, lo._handler, lo._useCapture );
274                                 lo._active = false;
275                         }
276                 }
277                
278                 //------------------------------------------------------------------------------------PROXY
279                
280                 override flash_proxy function callProperty(name:*, ... args):*
281                 {
282                         var err:Boolean = false;
283                         if ( args.length == 0 || args.length > 4 ) err = true;
284                         if ( !( args[0] is Function ) ) err = true;
285                         if ( args.length > 1 && !(args[1] is Boolean ) ) err = true;
286                         if ( args.length > 2 && !(args[2] is int ) ) err = true;
287                         if ( args.length == 4 && !(args[3] is Boolean ) ) err = true;
288                         if( err )
289                         {
290                                 throw new Error( "usage: eventName(handler:Function, useCapture:Boolean=false, priority:int=0, useWeakReference:Boolean=false)" );
291                         }
292                         args.unshift( String(name) );
293                         addEventListener.apply( this, args );
294                 }
295                
296                 override flash_proxy function hasProperty(name:*):Boolean
297                 {
298                         if ( _listeners[name] )
299                                 return true;
300                         else
301                                 return false;
302                 }
303                    
304                 override  flash_proxy function deleteProperty( name:* ):Boolean
305                 {
306                         if ( !_listeners[name] )
307                                 return false;
308                        
309                         _remove( _listeners[name] );
310                         return delete _listeners[name];
311                 }
312                
313         override flash_proxy function getProperty( name:* ):*
314         {
315                         if ( _listeners[name] )
316                                 return _listeners[name];
317                         else
318                                 return undefined;
319         }
320        
321         override flash_proxy function setProperty( name:*, value:* ):void
322         {
323                         if ( value is Function )
324                         {
325                                 delete this[name];
326                                 _listeners[name] = new $listener( this, name, value, _useCapture, _priority, _useWeakReference );
327                         }
328                         else if ( value is $listener )
329                         {
330                                 delete this[name];
331                                 _listeners[name] = new $listener( this, name, value._targetHandler, value._useCapture, value._priority, value._useWeakReference );
332                         }
333                         else if ( value is Boolean )
334                         {
335                                 if ( value )
336                                         resume( name );
337                                 else
338                                         abort( name );
339                                 return;
340                         }
341                         else if ( value == null || value==undefined )
342                         {
343                                 delete this[name];
344                                 return;
345                         }
346                         else
347                         {
348                                 throw new TypeError("FAdapter:type error." );
349                         }
350                         _add( _listeners[name] );
351         }
352                
353         }       
354 }
355
356 class $listener
357 {
358         internal var _ref:*;
359         internal var _type:String;
360         internal var _handler:Function;
361         internal var _useCapture:Boolean;
362         internal var _priority:int;
363         internal var _useWeakReference:Boolean;
364         internal var _active:Boolean;
365        
366         internal var _targetHandler:Function = null;
367        
368         public function $listener( ref_:*, type_:String, handler_:Function, useCapture_:Boolean, priority_:int, useWeakReference_:Boolean )
369         {
370                 _ref              = ref_;
371                 _type             = type_;
372                 _handler          = handler_;
373                 _targetHandler    = handler_;
374                 _useCapture       = useCapture_;
375                 _priority         = priority_;
376                 _useWeakReference = useWeakReference_;
377                 _active           = false;
378         }
379         public function get type():String { return _type; }
380         public function get handler():Function { return _targetHandler; }
381         public function get useCapture():Boolean { return _useCapture; }
382         public function get priority():int { return _priority; }       
383         public function get useWeakReference():Boolean { return _useWeakReference; }
384         public function get active():Boolean { return _active; }
385        
386         public function toString():String
387         {
388                 return "[$listener active=" + String(_active) +
389                                                   " type="   + _type +
390                                                   " handler=" + String(_targetHandler) +
391                                                   " useCapture=" + String(_useCapture) +
392                                                   " priority=" + String(_priority) +
393                                                   " useWeakReference=" + String(_useWeakReference) + " ]";
394         }
395 }
Note: リポジトリブラウザについてのヘルプは TracBrowser を参照してください。