/Objective-J/EventDispatcher.js

http://github.com/cacaodev/cappuccino · JavaScript · 84 lines · 48 code · 15 blank · 21 comment · 10 complexity · e461ffb4ef20f0f601053f715b42a0d1 MD5 · raw file

  1. /*
  2. * EventDispatcher.js
  3. * Objective-J
  4. *
  5. * Created by Francisco Tolmasky.
  6. * Copyright 2008-2010, 280 North, Inc.
  7. *
  8. * This library is free software; you can redistribute it and/or
  9. * modify it under the terms of the GNU Lesser General Public
  10. * License as published by the Free Software Foundation; either
  11. * version 2.1 of the License, or (at your option) any later version.
  12. *
  13. * This library is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  16. * Lesser General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU Lesser General Public
  19. * License along with this library; if not, write to the Free Software
  20. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  21. */
  22. function EventDispatcher(/*Object*/ anOwner)
  23. {
  24. this._eventListenersForEventNames = { };
  25. this._owner = anOwner;
  26. }
  27. EventDispatcher.prototype.addEventListener = function(/*String*/ anEventName, /*Function*/ anEventListener)
  28. {
  29. var eventListenersForEventNames = this._eventListenersForEventNames;
  30. if (!hasOwnProperty.call(eventListenersForEventNames, anEventName))
  31. {
  32. var eventListenersForEventName = [];
  33. eventListenersForEventNames[anEventName] = eventListenersForEventName;
  34. }
  35. else
  36. var eventListenersForEventName = eventListenersForEventNames[anEventName];
  37. var index = eventListenersForEventName.length;
  38. while (index--)
  39. if (eventListenersForEventName[index] === anEventListener)
  40. return;
  41. eventListenersForEventName.push(anEventListener);
  42. }
  43. EventDispatcher.prototype.removeEventListener = function(/*String*/ anEventName, /*Function*/ anEventListener)
  44. {
  45. var eventListenersForEventNames = this._eventListenersForEventNames;
  46. if (!hasOwnProperty.call(eventListenersForEventNames, anEventName))
  47. return;
  48. var eventListenersForEventName = eventListenersForEventNames[anEventName],
  49. index = eventListenersForEventName.length;
  50. while (index--)
  51. if (eventListenersForEventName[index] === anEventListener)
  52. return eventListenersForEventName.splice(index, 1);
  53. }
  54. EventDispatcher.prototype.dispatchEvent = function(/*Event*/ anEvent)
  55. {
  56. var type = anEvent.type,
  57. eventListenersForEventNames = this._eventListenersForEventNames;
  58. if (hasOwnProperty.call(eventListenersForEventNames, type))
  59. {
  60. var eventListenersForEventName = this._eventListenersForEventNames[type],
  61. index = 0,
  62. count = eventListenersForEventName.length;
  63. for (; index < count; ++index)
  64. eventListenersForEventName[index](anEvent);
  65. }
  66. var manual = (this._owner || this)["on" + type];
  67. if (manual)
  68. manual(anEvent);
  69. }