UNPKG

c8y-openlayer

Version:

This module is designed to help integrate Openlayer with Cumulocity IoT

158 lines (138 loc) 4.47 kB
import _ol_ from '../index.js'; import _ol_Disposable_ from '../disposable.js'; import _ol_events_ from '../events.js'; import _ol_events_Event_ from '../events/event.js'; /** * @classdesc * A simplified implementation of the W3C DOM Level 2 EventTarget interface. * @see {@link https://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113/events.html#Events-EventTarget} * * There are two important simplifications compared to the specification: * * 1. The handling of `useCapture` in `addEventListener` and * `removeEventListener`. There is no real capture model. * 2. The handling of `stopPropagation` and `preventDefault` on `dispatchEvent`. * There is no event target hierarchy. When a listener calls * `stopPropagation` or `preventDefault` on an event object, it means that no * more listeners after this one will be called. Same as when the listener * returns false. * * @constructor * @extends {ol.Disposable} */ var _ol_events_EventTarget_ = function() { _ol_Disposable_.call(this); /** * @private * @type {!Object.<string, number>} */ this.pendingRemovals_ = {}; /** * @private * @type {!Object.<string, number>} */ this.dispatching_ = {}; /** * @private * @type {!Object.<string, Array.<ol.EventsListenerFunctionType>>} */ this.listeners_ = {}; }; _ol_.inherits(_ol_events_EventTarget_, _ol_Disposable_); /** * @param {string} type Type. * @param {ol.EventsListenerFunctionType} listener Listener. */ _ol_events_EventTarget_.prototype.addEventListener = function(type, listener) { var listeners = this.listeners_[type]; if (!listeners) { listeners = this.listeners_[type] = []; } if (listeners.indexOf(listener) === -1) { listeners.push(listener); } }; /** * @param {{type: string, * target: (EventTarget|ol.events.EventTarget|undefined)}|ol.events.Event| * string} event Event or event type. * @return {boolean|undefined} `false` if anyone called preventDefault on the * event object or if any of the listeners returned false. */ _ol_events_EventTarget_.prototype.dispatchEvent = function(event) { var evt = typeof event === 'string' ? new _ol_events_Event_(event) : event; var type = evt.type; evt.target = this; var listeners = this.listeners_[type]; var propagate; if (listeners) { if (!(type in this.dispatching_)) { this.dispatching_[type] = 0; this.pendingRemovals_[type] = 0; } ++this.dispatching_[type]; for (var i = 0, ii = listeners.length; i < ii; ++i) { if (listeners[i].call(this, evt) === false || evt.propagationStopped) { propagate = false; break; } } --this.dispatching_[type]; if (this.dispatching_[type] === 0) { var pendingRemovals = this.pendingRemovals_[type]; delete this.pendingRemovals_[type]; while (pendingRemovals--) { this.removeEventListener(type, _ol_.nullFunction); } delete this.dispatching_[type]; } return propagate; } }; /** * @inheritDoc */ _ol_events_EventTarget_.prototype.disposeInternal = function() { _ol_events_.unlistenAll(this); }; /** * Get the listeners for a specified event type. Listeners are returned in the * order that they will be called in. * * @param {string} type Type. * @return {Array.<ol.EventsListenerFunctionType>} Listeners. */ _ol_events_EventTarget_.prototype.getListeners = function(type) { return this.listeners_[type]; }; /** * @param {string=} opt_type Type. If not provided, * `true` will be returned if this EventTarget has any listeners. * @return {boolean} Has listeners. */ _ol_events_EventTarget_.prototype.hasListener = function(opt_type) { return opt_type ? opt_type in this.listeners_ : Object.keys(this.listeners_).length > 0; }; /** * @param {string} type Type. * @param {ol.EventsListenerFunctionType} listener Listener. */ _ol_events_EventTarget_.prototype.removeEventListener = function(type, listener) { var listeners = this.listeners_[type]; if (listeners) { var index = listeners.indexOf(listener); if (type in this.pendingRemovals_) { // make listener a no-op, and remove later in #dispatchEvent() listeners[index] = _ol_.nullFunction; ++this.pendingRemovals_[type]; } else { listeners.splice(index, 1); if (listeners.length === 0) { delete this.listeners_[type]; } } } }; export default _ol_events_EventTarget_;