devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
250 lines (247 loc) • 10.1 kB
JavaScript
/**
* DevExtreme (cjs/__internal/events/core/m_emitter_registrator.js)
* Version: 24.2.6
* Build date: Mon Mar 17 2025
*
* Copyright (c) 2012 - 2025 Developer Express Inc. ALL RIGHTS RESERVED
* Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
*/
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _event_registrator = _interopRequireDefault(require("../../../common/core/events/core/event_registrator"));
var _events_engine = _interopRequireDefault(require("../../../common/core/events/core/events_engine"));
var _wheel = require("../../../common/core/events/core/wheel");
var _pointer = _interopRequireDefault(require("../../../common/core/events/pointer"));
var _index = require("../../../common/core/events/utils/index");
var _class = _interopRequireDefault(require("../../../core/class"));
var _dom_adapter = _interopRequireDefault(require("../../../core/dom_adapter"));
var _element_data = require("../../../core/element_data");
var _renderer = _interopRequireDefault(require("../../../core/renderer"));
var _extend = require("../../../core/utils/extend");
var _iterator = require("../../../core/utils/iterator");
var _ready_callbacks = _interopRequireDefault(require("../../../core/utils/ready_callbacks"));
function _interopRequireDefault(e) {
return e && e.__esModule ? e : {
default: e
}
}
const MANAGER_EVENT = "dxEventManager";
const EMITTER_DATA = "dxEmitter";
const EventManager = _class.default.inherit({
ctor() {
this._attachHandlers();
this.reset();
this._proxiedCancelHandler = this._cancelHandler.bind(this);
this._proxiedAcceptHandler = this._acceptHandler.bind(this)
},
_attachHandlers() {
_ready_callbacks.default.add((() => {
const document = _dom_adapter.default.getDocument();
_events_engine.default.subscribeGlobal(document, (0, _index.addNamespace)(_pointer.default.down, MANAGER_EVENT), this._pointerDownHandler.bind(this));
_events_engine.default.subscribeGlobal(document, (0, _index.addNamespace)(_pointer.default.move, MANAGER_EVENT), this._pointerMoveHandler.bind(this));
_events_engine.default.subscribeGlobal(document, (0, _index.addNamespace)([_pointer.default.up, _pointer.default.cancel].join(" "), MANAGER_EVENT), this._pointerUpHandler.bind(this));
_events_engine.default.subscribeGlobal(document, (0, _index.addNamespace)(_wheel.name, MANAGER_EVENT), this._mouseWheelHandler.bind(this))
}))
},
_eachEmitter(callback) {
const activeEmitters = this._activeEmitters || [];
let i = 0;
while (activeEmitters.length > i) {
const emitter = activeEmitters[i];
if (false === callback(emitter)) {
break
}
if (activeEmitters[i] === emitter) {
i++
}
}
},
_applyToEmitters(method, arg) {
this._eachEmitter((emitter => {
emitter[method].call(emitter, arg)
}))
},
reset() {
this._eachEmitter(this._proxiedCancelHandler);
this._activeEmitters = []
},
resetEmitter(emitter) {
this._proxiedCancelHandler(emitter)
},
_pointerDownHandler(e) {
if ((0, _index.isMouseEvent)(e) && e.which > 1) {
return
}
this._updateEmitters(e)
},
_updateEmitters(e) {
if (!this._isSetChanged(e)) {
return
}
this._cleanEmitters(e);
this._fetchEmitters(e)
},
_isSetChanged(e) {
const currentSet = this._closestEmitter(e);
const previousSet = this._emittersSet || [];
let setChanged = currentSet.length !== previousSet.length;
(0, _iterator.each)(currentSet, ((index, emitter) => {
setChanged = setChanged || previousSet[index] !== emitter;
return !setChanged
}));
this._emittersSet = currentSet;
return setChanged
},
_closestEmitter(e) {
const that = this;
const result = [];
let $element = (0, _renderer.default)(e.target);
function handleEmitter(_, emitter) {
if (!!emitter && emitter.validatePointers(e) && emitter.validate(e)) {
emitter.addCancelCallback(that._proxiedCancelHandler);
emitter.addAcceptCallback(that._proxiedAcceptHandler);
result.push(emitter)
}
}
while ($element.length) {
const emitters = (0, _element_data.data)($element.get(0), "dxEmitter") || [];
(0, _iterator.each)(emitters, handleEmitter);
$element = $element.parent()
}
return result
},
_acceptHandler(acceptedEmitter, e) {
this._eachEmitter((emitter => {
if (emitter !== acceptedEmitter) {
this._cancelEmitter(emitter, e)
}
}))
},
_cancelHandler(canceledEmitter, e) {
this._cancelEmitter(canceledEmitter, e)
},
_cancelEmitter(emitter, e) {
const activeEmitters = this._activeEmitters;
if (e) {
emitter.cancel(e)
} else {
emitter.reset()
}
emitter.removeCancelCallback();
emitter.removeAcceptCallback();
const emitterIndex = activeEmitters.indexOf(emitter);
if (emitterIndex > -1) {
activeEmitters.splice(emitterIndex, 1)
}
},
_cleanEmitters(e) {
this._applyToEmitters("end", e);
this.reset(e)
},
_fetchEmitters(e) {
this._activeEmitters = this._emittersSet.slice();
this._applyToEmitters("start", e)
},
_pointerMoveHandler(e) {
this._applyToEmitters("move", e)
},
_pointerUpHandler(e) {
this._updateEmitters(e)
},
_mouseWheelHandler(e) {
if (!this._allowInterruptionByMouseWheel()) {
return
}
e.pointers = [null];
this._pointerDownHandler(e);
this._adjustWheelEvent(e);
this._pointerMoveHandler(e);
e.pointers = [];
this._pointerUpHandler(e)
},
_allowInterruptionByMouseWheel() {
let allowInterruption = true;
this._eachEmitter((emitter => {
allowInterruption = emitter.allowInterruptionByMouseWheel() && allowInterruption;
return allowInterruption
}));
return allowInterruption
},
_adjustWheelEvent(e) {
let closestGestureEmitter = null;
this._eachEmitter((emitter => {
if (!emitter.gesture) {
return
}
const direction = emitter.getDirection(e);
if ("horizontal" !== direction && !e.shiftKey || "vertical" !== direction && e.shiftKey) {
closestGestureEmitter = emitter;
return false
}
}));
if (!closestGestureEmitter) {
return
}
const direction = closestGestureEmitter.getDirection(e);
const verticalGestureDirection = "both" === direction && !e.shiftKey || "vertical" === direction;
const prop = verticalGestureDirection ? "pageY" : "pageX";
e[prop] += e.delta
},
isActive(element) {
let result = false;
this._eachEmitter((emitter => {
result = result || emitter.getElement().is(element)
}));
return result
}
});
const eventManager = new EventManager;
const EMITTER_SUBSCRIPTION_DATA = "dxEmitterSubscription";
const registerEmitter = function(emitterConfig) {
const EmitterClass = emitterConfig.emitter;
const emitterName = emitterConfig.events[0];
const emitterEvents = emitterConfig.events;
(0, _iterator.each)(emitterEvents, ((_, eventName) => {
(0, _event_registrator.default)(eventName, {
noBubble: !emitterConfig.bubble,
setup(element) {
const subscriptions = (0, _element_data.data)(element, "dxEmitterSubscription") || {};
const emitters = (0, _element_data.data)(element, "dxEmitter") || {};
const emitter = emitters[emitterName] || new EmitterClass(element);
subscriptions[eventName] = true;
emitters[emitterName] = emitter;
(0, _element_data.data)(element, "dxEmitter", emitters);
(0, _element_data.data)(element, "dxEmitterSubscription", subscriptions)
},
add(element, handleObj) {
const emitters = (0, _element_data.data)(element, "dxEmitter");
const emitter = emitters[emitterName];
emitter.configure((0, _extend.extend)({
delegateSelector: handleObj.selector
}, handleObj.data), handleObj.type)
},
teardown(element) {
const subscriptions = (0, _element_data.data)(element, "dxEmitterSubscription");
const emitters = (0, _element_data.data)(element, "dxEmitter");
const emitter = emitters[emitterName];
delete subscriptions[eventName];
let disposeEmitter = true;
(0, _iterator.each)(emitterEvents, ((_, eventName) => {
disposeEmitter = disposeEmitter && !subscriptions[eventName];
return disposeEmitter
}));
if (disposeEmitter) {
if (eventManager.isActive(element)) {
eventManager.resetEmitter(emitter)
}
emitter && emitter.dispose();
delete emitters[emitterName]
}
}
})
}))
};
var _default = exports.default = registerEmitter;