/src/org/osflash/signals/natives/sets/NativeSignalSet.as

http://github.com/robertpenner/as3-signals · ActionScript · 111 lines · 48 code · 9 blank · 54 comment · 6 complexity · 48497acb2fdd728827e016abd473b3d0 MD5 · raw file

  1. package org.osflash.signals.natives.sets
  2. {
  3. import org.osflash.signals.natives.INativeDispatcher;
  4. import org.osflash.signals.natives.NativeSignal;
  5. import flash.events.Event;
  6. import flash.events.IEventDispatcher;
  7. import flash.utils.Dictionary;
  8. /**
  9. * A convenient way to access a logical set of signals.
  10. *
  11. * @author Jon Adams
  12. *
  13. * @example SignalSets allow you to get predefined signals for many built in events
  14. * <listing version="3.0" >
  15. package {
  16. import org.osflash.signals.natives.sets.InteractiveObjectSignalSet;
  17. import flash.display.Sprite;
  18. import flash.events.Event;
  19. public class Example extends Sprite {
  20. private var button:Sprite;
  21. private var buttonSignals:InteractiveObjectSignalSet;
  22. public function Main() {
  23. button = new Sprite();
  24. button.graphics.beginFill(0xff0000);
  25. button.graphics.drawRect(0, 0, 100, 100);
  26. button.graphics.endFill();
  27. buttonSignals = new InteractiveObjectSignalSet(button);
  28. buttonSignals.click.add(handler);
  29. buttonSignals.addedToStage.add(handler);
  30. buttonSignals.enterFrame.addOnce(handler);
  31. addChild(button);
  32. }
  33. private function handler(event:Event):void {
  34. trace(event.target, "fired", event.type);
  35. }
  36. }
  37. }
  38. * </listing>
  39. */
  40. public class NativeSignalSet
  41. {
  42. protected var target:IEventDispatcher;
  43. protected const _signals:Dictionary = new Dictionary();
  44. public function NativeSignalSet(target:IEventDispatcher)
  45. {
  46. this.target = target;
  47. }
  48. /**
  49. * Lazily instantiates a NativeSignal
  50. * @throws ArgumentError <code>ArgumentError</code>: eventType must not be null.
  51. */
  52. public function getNativeSignal(eventType:String, eventClass:Class = null):NativeSignal
  53. {
  54. if(null == eventType) throw new ArgumentError('eventType must not be null.');
  55. return _signals[eventType] ||= new NativeSignal(target, eventType, eventClass || Event);
  56. }
  57. /**
  58. * The current number of listeners for the signal.
  59. */
  60. public function get numListeners():int
  61. {
  62. // TODO : This is horrid, it's very expensive to call this if there is a lot of signals.
  63. var count:int = 0;
  64. for each (var signal:INativeDispatcher in _signals)
  65. {
  66. count += signal.numListeners;
  67. }
  68. return count;
  69. }
  70. /**
  71. * The signals in the SignalSet as an Array.
  72. */
  73. public function get signals():Array
  74. {
  75. // TODO : This is horrid, it's very expensive to call this if there is a lot of signals.
  76. var result:Array = [];
  77. for each (var signal:INativeDispatcher in _signals)
  78. {
  79. result[result.length] = signal;
  80. }
  81. return result;
  82. }
  83. /**
  84. * Unsubscribes all listeners from all signals in the set.
  85. */
  86. public function removeAll():void
  87. {
  88. for each (var signal:INativeDispatcher in _signals)
  89. {
  90. signal.removeAll();
  91. delete _signals[signal.eventType];
  92. }
  93. }
  94. }
  95. }