import {Listeners} from '../../common/lang/Listeners';
import {ObjectUtil} from '../../common/lang/ObjectUtil';
import {ScopeEnum} from '../../common/lang/ScopeEnum';
import {Linker} from '../../common/reflect/Linker';
import {Service} from '../../core/Service';
import {EventEnum} from '../EventEnum';
import {MouseEvent} from '../event/MouseEvent';
import {DeviceService} from './DeviceService';
/**
* 鼠标服务。
*
* @author maocy
* @version 150203
*/
export class MouseService extends Service {
/** 鼠标事件 */
protected _eventMouse: MouseEvent;
/** 鼠标单击监听器 */
protected _clickListeners: Listeners;
/** 鼠标双击监听器 */
protected _doubleClickListeners: Listeners;
/** 鼠标落下监听器 */
protected _mouseDownListeners: Listeners;
/** 鼠标移动监听器 */
protected _mouseMoveListeners: Listeners;
/** 鼠标抬起监听器 */
protected _mouseUpListeners: Listeners;
/** 鼠标进入监听器 */
protected _mouseEnterListeners: Listeners;
/** 鼠标离开监听器 */
protected _mouseLeaveListeners: Listeners;
/** 鼠标滚动监听器 */
protected _mouseWheelListeners: Listeners;
/** 设备服务 */
@Linker(DeviceService)
protected _deviceConsole: DeviceService;
//protected _activeCapture = null;
//protected _captures = null;
/**
* 构造处理。
*/
public constructor() {
super();
// 设置属性
this._scopeCd = ScopeEnum.Local;
// 设置属性
this._eventMouse = new MouseEvent();
this._clickListeners = new Listeners();
this._doubleClickListeners = new Listeners();
this._mouseDownListeners = new Listeners();
this._mouseMoveListeners = new Listeners();
this._mouseUpListeners = new Listeners();
this._mouseEnterListeners = new Listeners();
this._mouseLeaveListeners = new Listeners();
this._mouseWheelListeners = new Listeners();
//o._captures = new TObjects();
// 注册事件
//RWindow.lsnsMouseDown.register(o, o.onMouseDown);
//RWindow.lsnsMouseMove.register(o, o.onMouseMove);
//RWindow.lsnsMouseUp.register(o, o.onMouseUp);
}
/**
* 获得鼠标单击监听器。
*
* @return 监听器
*/
public get clickListeners(): Listeners {
return this._clickListeners;
}
/**
* 获得鼠标双击监听器。
*
* @return 监听器
*/
public get doubleClickListeners(): Listeners {
return this._doubleClickListeners;
}
/**
* 获得鼠标落下监听器。
*
* @return 监听器
*/
public get mouseDownListeners(): Listeners {
return this._mouseDownListeners;
}
/**
* 获得鼠标移动监听器。
*
* @return 监听器
*/
public get mouseMoveListeners(): Listeners {
return this._mouseMoveListeners;
}
/**
* 获得鼠标抬起监听器。
*
* @return 监听器
*/
public get mouseUpListeners(): Listeners {
return this._mouseUpListeners;
}
/**
* 获得鼠标进入监听器。
*
* @return 监听器
*/
public get mouseEnterListeners(): Listeners {
return this._mouseEnterListeners;
}
/**
* 获得鼠标离开监听器。
*
* @return 监听器
*/
public get mouseLeaveListeners(): Listeners {
return this._mouseLeaveListeners;
}
/**
* 获得鼠标滚动监听器。
*
* @return 监听器
*/
public get mouseWheelListeners(): Listeners {
return this._mouseWheelListeners;
}
/**
* 初始化处理。
*/
public initialize() {
var deviceConsole = this._deviceConsole;
var hContainer = deviceConsole.htmlContainer;
hContainer._mouseConsole = this;
// 关联鼠标事件
var supportHtml5 = deviceConsole.supportHtml5();
if (supportHtml5) {
hContainer.addEventListener('click', this.ohClick, true);
hContainer.addEventListener('dblclick', this.ohDoubleClick, true);
hContainer.addEventListener('mousedown', this.ohMouseDown, true);
hContainer.addEventListener('mousemove', this.ohMouseMove, true);
hContainer.addEventListener('mouseup', this.ohMouseUp, true);
hContainer.addEventListener('mouseenter', this.ohMouseEnter, true);
hContainer.addEventListener('mouseleave', this.ohMouseLeave, true);
hContainer.addEventListener('mousewheel', this.ohMouseWheel, true);
} else {
hContainer.onclick = this.ohClick;
hContainer.ondblclick = this.ohDoubleClick;
hContainer.onmousedown = this.ohMouseDown;
hContainer.onmousemove = this.ohMouseMove;
hContainer.onmouseup = this.ohMouseUp;
hContainer.onmouseenter = this.ohMouseEnter;
hContainer.onmouseleave = this.ohMouseLeave;
hContainer.onmousewheel = this.ohMouseWheel;
}
}
/**
* 鼠标单击处理。
*
* @param hEvent 事件
*/
public ohClick(hEvent) {
var linker: MouseService = (this as any)._mouseConsole;
// 获得事件
var hFindEvent = null;
if (!hEvent) {
hFindEvent = linker._deviceConsole.findEvent(hEvent);
} else {
hFindEvent = hEvent;
}
// 事件处理
var event = linker._eventMouse;
event.code = EventEnum.Click;
event.attachEvent(hEvent);
linker.onClick(linker, event);
}
/**
* 鼠标双击处理。
*
* @param hEvent 事件
*/
public ohDoubleClick(hEvent) {
var linker: MouseService = (this as any)._mouseConsole;
// 获得事件
var hFindEvent = null;
if (!hEvent) {
hFindEvent = linker._deviceConsole.findEvent(hEvent);
} else {
hFindEvent = hEvent;
}
// 事件处理
var event = linker._eventMouse;
event.code = EventEnum.DoubleClick;
event.attachEvent(hEvent);
linker.onDoubleClick(linker, event);
}
/**
* 鼠标按下处理。
*
* @param hEvent 事件
*/
public ohMouseDown(hEvent) {
var linker: MouseService = (this as any)._mouseConsole;
// 获得事件
var hFindEvent = null;
if (!hEvent) {
hFindEvent = linker._deviceConsole.findEvent(hEvent);
} else {
hFindEvent = hEvent;
}
// 事件处理
var event = linker._eventMouse;
event.code = EventEnum.MouseDown;
event.attachEvent(hEvent);
linker.onMouseDown(linker, event);
}
/**
* 鼠标移动处理。
*
* @param hEvent 事件
*/
public ohMouseMove(hEvent) {
var linker: MouseService = (this as any)._mouseConsole;
// 获得事件
var hFindEvent = null;
if (!hEvent) {
hFindEvent = linker._deviceConsole.findEvent(hEvent);
} else {
hFindEvent = hEvent;
}
// 事件处理
var event = linker._eventMouse;
event.code = EventEnum.MouseMove;
event.attachEvent(hEvent);
linker.onMouseMove(linker, event);
}
/**
* 鼠标抬起处理。
*
* @param hEvent 事件
*/
public ohMouseUp(hEvent) {
var linker: MouseService = (this as any)._mouseConsole;
// 获得事件
var hFindEvent = null;
if (!hEvent) {
hFindEvent = linker._deviceConsole.findEvent(hEvent);
} else {
hFindEvent = hEvent;
}
// 事件处理
var event = linker._eventMouse;
event.code = EventEnum.MouseUp;
event.attachEvent(hEvent);
linker.onMouseUp(linker, event);
}
/**
* 鼠标进入处理。
*
* @param hEvent 事件
*/
public ohMouseEnter(hEvent) {
var linker: MouseService = (this as any)._mouseConsole;
// 获得事件
var hFindEvent = null;
if (!hEvent) {
hFindEvent = linker._deviceConsole.findEvent(hEvent);
} else {
hFindEvent = hEvent;
}
// 事件处理
var event = linker._eventMouse;
event.code = EventEnum.MouseEnter;
event.attachEvent(hEvent);
linker.onMouseEnter(linker, event);
}
/**
* 鼠标离开处理。
*
* @param hEvent 事件
*/
public ohMouseLeave(hEvent) {
var linker: MouseService = (this as any)._mouseConsole;
// 获得事件
var hFindEvent = null;
if (!hEvent) {
hFindEvent = linker._deviceConsole.findEvent(hEvent);
} else {
hFindEvent = hEvent;
}
// 事件处理
var event = linker._eventMouse;
event.code = EventEnum.MouseLeave;
event.attachEvent(hEvent);
linker.onMouseLeave(linker, event);
}
/**
* 鼠标滚动处理。
*
* @param hEvent 事件
*/
public ohMouseWheel(hEvent) {
var linker: MouseService = (this as any)._mouseConsole;
// 获得事件
var hFindEvent = null;
if (!hEvent) {
hFindEvent = linker._deviceConsole.findEvent(hEvent);
} else {
hFindEvent = hEvent;
}
// 事件处理
var event = linker._eventMouse;
event.code = EventEnum.MouseWheel;
event.attachEvent(hEvent);
linker.onMouseWheel(linker, event);
}
/**
* 鼠标单击处理。
*
* @param sender 发送者
* @param event 事件信息
*/
public onClick(sender: any, event: MouseEvent) {
this._clickListeners.process(event);
}
/**
* 鼠标双击处理。
*
* @param sender 发送者
* @param event 事件信息
*/
public onDoubleClick(sender: any, event: MouseEvent) {
this._doubleClickListeners.process(event);
}
/**
* 鼠标按下处理。
*
* @param sender 发送者
* @param event 事件信息
*/
public onMouseDown(sender: any, event: MouseEvent) {
// 检查来源
//var linker = RHtml.searchLinker(event.hSource, MO.MMouseCapture);
//var linker = null;
//if (!linker) {
// return;
//}
// 检查测试
//if (!linker.testMouseCapture()) {
// return;
//}
// 捕捉开始处理
//this._activeCapture = linker;
//this.captureStart(event);
// 处理事件
this._mouseDownListeners.process(event);
}
/**
* 鼠标移动处理。
*
* @param sender 发送者
* @param event 事件信息
*/
public onMouseMove(sender: any, event: MouseEvent) {
// 检查拖拽处理
//if (!this._activeCapture) {
// return;
//}
// 拖拽处理
//this.capture(event);
// 处理事件
this._mouseMoveListeners.process(event);
}
/**
* 鼠标抬起处理。
*
* @param sender 发送者
* @param event 事件信息
*/
public onMouseUp(sender: any, event: MouseEvent) {
// 检查拖拽处理
//if (!this._activeCapture) {
// return;
//}
// 捕捉结束处理
//this.captureStop(event);
// 处理事件
this._mouseUpListeners.process(event);
}
/**
* 鼠标进入处理。
*
* @param sender 发送者
* @param event 事件信息
*/
public onMouseEnter(sender: any, event: MouseEvent) {
this._mouseEnterListeners.process(event);
}
/**
* 鼠标离开处理。
*
* @param sender 发送者
* @param event 事件信息
*/
public onMouseLeave(sender: any, event: MouseEvent) {
this._mouseLeaveListeners.process(event);
}
/**
* 鼠标抬起处理。
*
* @param sender 发送者
* @param event 事件信息
*/
public onMouseWheel(sender: any, event: MouseEvent) {
// 检查拖拽处理
// if (!this._activeCapture) {
// return;
// }
// 捕捉结束处理
// this.captureStop(p);
// 处理事件
this._mouseWheelListeners.process(event);
}
/**
* 禁止菜单处理。
*
* @param hEvent 事件信息
*/
public onDisableContextMenu(hEvent: any) {
var event = hEvent || window.event;
event.cancelBubble = true;
event.returnvalue = false;
return false;
}
protected _contextMenuStatus: boolean = true;
protected _contextMenu: any;
/**
* 设置环境菜单属性。
*
* @param sender 发送者
* @param event 事件信息
*/
public setContextMenuEnable(value: boolean) {
if (this._contextMenuStatus == value) {
if (value) {
document.oncontextmenu = this._contextMenu;
this._contextMenu = null;
} else {
this._contextMenu = document.oncontextmenu;
document.oncontextmenu = this.onDisableContextMenu;
}
}
this._contextMenuStatus = value;
}
// //==========================================================
// // 捕捉开始处理。
// //
// // @method
// // @param p:event:htmlEvent 事件
// //==========================================================
// public captureStart(p) {
// var capture = this._activeCapture;
// if (capture) {
// // RWindow.setOptionSelect(false);
// capture.onMouseCaptureStart(p);
// }
// }
// //==========================================================
// // 捕捉处理。
// //
// // @method
// // @param p:event:htmlEvent 事件
// //==========================================================
// public capture(p) {
// var capture = this._activeCapture;
// if (capture) {
// if (capture.testMouseCapture()) {
// capture.onMouseCapture(p);
// } else {
// this.captureStop(p)
// }
// }
// }
// //==========================================================
// // 捕捉结束处理。
// //
// // @method
// // @param p:event:htmlEvent 事件
// //==========================================================
// public captureStop(p) {
// var capture = this._activeCapture;
// if (capture) {
// capture.onMouseCaptureStop(p);
// this._activeCapture = null;
// }
// // RWindow.setOptionSelect(true);
// }
//==========================================================
// 注册一个鼠标捕捉对象。
//
// @method
// @param p:capture:MMouseCapture 鼠标捕捉
//==========================================================
// public register(p) {
// //this._captures.push(p);
// }
// //==========================================================
// // 注销一个鼠标捕捉对象。
// //
// // @method
// // @param p:capture:MMouseCapture 鼠标捕捉
// //==========================================================
// public unregister(p) {
// //this._captures.remove(p);
// }
//==========================================================
// 清空处理。
//
// @method
//==========================================================
// public clear() {
// //this._captures.clear();
// }
/**
* 释放处理。
*/
public dispose() {
// 释放属性
this._eventMouse = ObjectUtil.dispose(this._eventMouse);
this._clickListeners = ObjectUtil.dispose(this._clickListeners);
this._doubleClickListeners = ObjectUtil.dispose(this._doubleClickListeners);
this._mouseDownListeners = ObjectUtil.dispose(this._mouseDownListeners);
this._mouseMoveListeners = ObjectUtil.dispose(this._mouseMoveListeners);
this._mouseUpListeners = ObjectUtil.dispose(this._mouseUpListeners);
this._mouseEnterListeners = ObjectUtil.dispose(this._mouseEnterListeners);
this._mouseLeaveListeners = ObjectUtil.dispose(this._mouseLeaveListeners);
this._mouseWheelListeners = ObjectUtil.dispose(this._mouseWheelListeners);
// 父处理
super.dispose();
}
}