import { Utils } from '../common/Utils';
import { AppDelegate } from '../objects/AppDelegate';
import { MouseEventManager } from '../managers/MouseEventManager';
/**
* @class EventCaptureComponent
* 事件捕获组件。
* @memberof THING
* @public
*/
class EventCaptureComponent {
constructor(options = {}) {
this._delegate = options.delegate || AppDelegate.current;
this._object = null;
this._domElement = null;
this._enable = true;
this._enablePropagation = true;
this._mouseEventManager = null;
this._delta = null;
this._onTriggerEvent = null;
}
// #region Private
_unregisterEvents() {
// Dispose previous mouse event manager
if (this._mouseEventManager) {
this._mouseEventManager.dispose();
this._mouseEventManager = null;
}
}
_registerEvents() {
let domElement = this._domElement;
// Create mouse event manager to hook DOM element events
this._mouseEventManager = new MouseEventManager({
domElement,
onTriggerEvent: (ev) => {
if (!this._enable) {
return;
}
let event = Utils.buildMouseEvent(domElement, ev);
let moveDelta = this._mouseEventManager.moveDelta;
event.deltaX = moveDelta[0];
event.deltaY = moveDelta[1];
if (this._onTriggerEvent) {
this._onTriggerEvent(event);
}
if (!this._enablePropagation) {
ev.stopPropagation();
}
}
});
}
// #endregion
// #region Overrides
onAdd(object) {
this._object = object;
}
onRemove() {
this._unregisterEvents();
}
// #endregion
get object() {
return this._object;
}
/**
* 启用/禁用。
* @type {boolean}
* @public
*/
get enable() {
return this._enable;
}
set enable(value) {
this._enable = value;
}
/**
* 启用/禁用事件传播,默认值为 true(启用事件传播)。
* @type {boolean}
* @public
*/
get enablePropagation() {
return this._enablePropagation;
}
set enablePropagation(value) {
this._enablePropagation = value;
}
/**
* 获取/设置 DOM 元素。
* @type {object}
* @public
*/
get domElement() {
return this._domElement;
}
set domElement(value) {
this._unregisterEvents();
this._domElement = value;
// Make cursor as default when hover on it
let style = this._domElement.style;
style.cursor = 'default';
style.pointerEvents = 'all';
this._registerEvents();
}
/**
* 获取/设置触发事件回调函数。
* @type {Function}
* @public
*/
get onTriggerEvent() {
return this._onTriggerEvent;
}
set onTriggerEvent(value) {
this._onTriggerEvent = value;
}
}
export { EventCaptureComponent }