webgme-engine
Version:
WebGME server and Client API without a GUI
111 lines (94 loc) • 3.43 kB
JavaScript
/*globals define*/
/*eslint-env node, browser*/
/**
* @author rkereskenyi / https://github.com/rkereskenyi
*/
define([], function () {
'use strict';
var EventDispatcher = function () {
this._eventList = {};
};
EventDispatcher.prototype = {
_eventList: null,
_getEvent: function (eventName, create) {
// Check if Array of Event Handlers has been created
if (!this._eventList[eventName]) {
// Check if the calling method wants to create the Array
// if not created. This reduces unneeded memory usage.
if (!create) {
return null;
}
// Create the Array of Event Handlers
this._eventList[eventName] = [];
// new Array
}
// return the Array of Event Handlers already added
return this._eventList[eventName];
},
addEventListener: function (eventName, handler) {
// Get the Array of Event Handlers
var evt = this._getEvent(eventName, true);
// Add the new Event Handler to the Array
evt.push(handler);
},
removeEventListener: function (eventName, handler) {
// Get the Array of Event Handlers
var evt = this._getEvent(eventName);
if (!evt) {
return;
}
// Helper Method - an Array.indexOf equivalent
var getArrayIndex = function (array, item) {
for (var i = 0; i < array.length; i++) {
if (array[i] === item) {
return i;
}
}
return -1;
};
// Get the Array index of the Event Handler
var index = getArrayIndex(evt, handler);
if (index > -1) {
// Remove Event Handler from Array
evt.splice(index, 1);
}
},
removeAllEventListeners: function (eventName) {
// Get the Array of Event Handlers
var evt = this._getEvent(eventName);
if (!evt) {
return;
}
evt.splice(0, evt.length);
},
dispatchEvent: function (eventName, eventArgs) {
// Get a function that will call all the Event Handlers internally
var handler = this._getEventHandler(eventName);
if (handler) {
// call the handler function
// Pass in "sender" and "eventArgs" parameters
handler(this, eventArgs);
}
},
clearAllEvents: function () {
this._eventList = {};
},
_getEventHandler: function (eventName) {
// Get Event Handler Array for this Event
var evt = this._getEvent(eventName, false);
if (!evt || evt.length === 0) {
return null;
}
// Create the Handler method that will use currying to
// call all the Events Handlers internally
var h = function (sender, args) {
for (var i = 0; i < evt.length; i++) {
evt[i](sender, args);
}
};
// Return this new Handler method
return h;
}
};
return EventDispatcher;
});