/src/martian/ev3nts/helpers/evnt.as

https://github.com/ynk/io
ActionScript | 146 lines | 119 code | 27 blank | 0 comment | 49 complexity | cf6d5edd8b342f35e6692c0a190716f6 MD5 | raw file
  1. package martian.ev3nts.helpers
  2. {
  3. import flash.display.InteractiveObject;
  4. import flash.display.Sprite;
  5. import flash.events.IEventDispatcher;
  6. import flash.events.MouseEvent;
  7. public class evnt
  8. {
  9. static private var data:Object = new Object();
  10. static public function any(dispatchers:*, event:String, method:Function, ...parameters):Object
  11. {
  12. if (dispatchers is IEventDispatcher) { dispatchers = [dispatchers]; }
  13. for each(var dispatcher:IEventDispatcher in dispatchers)
  14. {
  15. if (!data[dispatcher]) { data[dispatcher] = new Array(); }
  16. var proxy:Proxy = new Proxy();
  17. proxy.parameters = parameters;
  18. proxy.method = method;
  19. proxy.event = event;
  20. proxy.times = -1;
  21. data[dispatcher].push(proxy);
  22. if (dispatcher is Sprite && (event == MouseEvent.CLICK || event == MouseEvent.MOUSE_OVER || event == MouseEvent.ROLL_OVER)) { (dispatcher as Sprite).buttonMode = true; }
  23. dispatcher.addEventListener(event, handler);
  24. }
  25. return dispatchers.length != 1 ? dispatchers : dispatchers[0];
  26. }
  27. static public function once(dispatcher:IEventDispatcher, event:String, method:Function, ...parameters):Object
  28. {
  29. if (!data[dispatcher]) { data[dispatcher] = new Array(); }
  30. var proxy:Proxy = new Proxy();
  31. proxy.parameters = parameters;
  32. proxy.method = method;
  33. proxy.event = event;
  34. proxy.times = 1;
  35. data[dispatcher].push(proxy);
  36. if (dispatcher is Sprite && (event == MouseEvent.CLICK || event == MouseEvent.MOUSE_OVER || event == MouseEvent.ROLL_OVER)) { (dispatcher as Sprite).buttonMode = true; }
  37. dispatcher.addEventListener(event, handler);
  38. return dispatcher as Object;
  39. }
  40. static public function cancel(dispatchers:*, events:* = null, method:Function = null):void
  41. {
  42. if (dispatchers is IEventDispatcher) { dispatchers = [dispatchers]; }
  43. if (!events) { events = new Array(); }
  44. else if (events is String) { events = [events]; }
  45. else if (events is Function)
  46. {
  47. method = events;
  48. events = new Array();
  49. }
  50. var i:int = 0, j:int = events.length, k:int, l:int;
  51. for each(var dispatcher:IEventDispatcher in dispatchers)
  52. {
  53. if (!data[dispatcher]) { continue; }
  54. k = 0; l = data[dispatcher].length;
  55. if (events.length == 0)
  56. {
  57. for (k = 0, l; k < l; k++) { dispatcher.removeEventListener(data[dispatcher][k].event, handler); }
  58. delete data[dispatcher];
  59. return;
  60. }
  61. if (method == null)
  62. {
  63. for (i; i < j; i++)
  64. {
  65. for (k; k < l; k++)
  66. {
  67. if (data[dispatcher][k].event == events[i])
  68. {
  69. data[dispatcher].splice(i, 1);
  70. break;
  71. }
  72. }
  73. }
  74. }
  75. else
  76. {
  77. for (i; i < j; i++)
  78. {
  79. for (k; k < l; k++)
  80. {
  81. if (data[dispatcher][k].event == events[i] && data[dispatcher][k].method == method)
  82. {
  83. data[dispatcher].splice(i, 1);
  84. break;
  85. }
  86. }
  87. }
  88. }
  89. }
  90. }
  91. static private function handler(e:* = null):void
  92. {
  93. var proxies:Array = new Array(), i:int = 0, j:int = data[e.target].length;
  94. for (i; i < j; i++) { if (data[e.target][i].event == e.type) { proxies.push(data[e.target][i]); } }
  95. for each(var proxy:Proxy in proxies)
  96. {
  97. if (proxy.parameters.length > 0)
  98. {
  99. try { proxy.method.apply(null, new Array(e).concat(proxy.parameters)); }
  100. catch (x:Error) { proxy.method.apply(null, proxy.parameters); }
  101. }
  102. else
  103. {
  104. try { proxy.method.call(null, e); }
  105. catch (x:Error) { proxy.method.call(); }
  106. }
  107. if (--proxy.times == 0) { evnt.cancel(e.target, e.type, proxy.method); }
  108. }
  109. }
  110. }
  111. }
  112. internal class Proxy
  113. {
  114. public var event:String;
  115. public var method:Function;
  116. public var parameters:Array;
  117. public var times:int;
  118. public function Proxy() {}
  119. }