import {Listeners} from '../../common/lang/Listeners';
import {ObjectUtil} from '../../common/lang/ObjectUtil';
import {Linker} from '../../common/reflect/Linker';
import {Service} from '../../core/Service';
import {EventEnum} from '../EventEnum';
import {KeyStatusEnum} from '../KeyStatusEnum';
import {KeyboardEvent} from '../event/KeyboardEvent';
import {DeviceService} from './DeviceService';
//===========================================================
// 键盘管理器。
//===========================================================
export class KeyboardService extends Service {
// 状态集合
protected _status: Array;
// 监听器集合
protected _eventKey: KeyboardEvent;
protected _keyDownListeners: Listeners;
protected _keyUpListeners: Listeners;
protected _keyPressListeners: Listeners;
// 设备控制台
@Linker(DeviceService)
protected _deviceConsole: DeviceService;
//===========================================================
// 构造处理。
//
// @enum
// @author maocy
// @version 150203
//===========================================================
public constructor() {
super();
// 设置属性
this._status = new Array();
this._eventKey = new KeyboardEvent();
this._keyDownListeners = new Listeners();
this._keyUpListeners = new Listeners();
this._keyPressListeners = new Listeners();
// 设置状态
var status = this._status = new Array();
for (var i: number = 0; i < 256; i++) {
status[i] = KeyStatusEnum.Normal;
}
}
//===========================================================
// 获得按键落下监听器。
//
// @return 监听器
//===========================================================
public get keyDownListeners(): Listeners {
return this._keyDownListeners;
}
//===========================================================
// 获得按键抬起监听器。
//
// @return 监听器
//===========================================================
public get keyUpListeners(): Listeners {
return this._keyUpListeners;
}
//===========================================================
// 获得按键监听器。
//
// @return 监听器
//===========================================================
public get keyPressListeners(): Listeners {
return this._keyPressListeners;
}
//==========================================================
// 初始化处理。
//==========================================================
public initialize() {
var deviceConsole = this._deviceConsole;
var hContainer = deviceConsole.htmlContainer;
hContainer._keyboardConsole = this;
// 关联键盘事件
var supportHtml5 = deviceConsole.supportHtml5();
if (supportHtml5) {
hContainer.addEventListener('keydown', this.ohKeyDown, true);
hContainer.addEventListener('keyup', this.ohKeyUp, true);
hContainer.addEventListener('keypress', this.ohKeyPress, true);
} else {
hContainer.onkeydown = this.ohKeyDown;
hContainer.onkeyup = this.ohKeyUp;
hContainer.onkeypress = this.ohKeyPress;
}
}
//==========================================================
// 键盘按下处理。
//
// @param hEvent 事件
//==========================================================
public ohKeyDown(hEvent) {
var linker: KeyboardService = (this as any)._keyboardConsole;
// 获得事件
var hFindEvent = null;
if (!hEvent) {
hFindEvent = linker._deviceConsole.findEvent(hEvent);
} else {
hFindEvent = hEvent;
}
// 事件处理
var event = linker._eventKey;
event.code = EventEnum.KeyDown;
event.attachEvent(hEvent);
linker.onKeyDown(linker, event);
}
//==========================================================
// 键盘抬起处理。
//
// @param hEvent 事件
//==========================================================
public ohKeyUp(hEvent) {
var linker: KeyboardService = (this as any)._keyboardConsole;
// 获得事件
var hFindEvent = null;
if (!hEvent) {
hFindEvent = linker._deviceConsole.findEvent(hEvent);
} else {
hFindEvent = hEvent;
}
// 事件处理
var event = linker._eventKey;
event.code = EventEnum.KeyUp;
event.attachEvent(hEvent);
linker.onKeyUp(linker, event);
}
//==========================================================
// 键盘点击处理。
//
// @param hEvent 事件
//==========================================================
public ohKeyPress(hEvent) {
var linker: KeyboardService = (this as any)._keyboardConsole;
// 获得事件
var hFindEvent = null;
if (!hEvent) {
hFindEvent = linker._deviceConsole.findEvent(hEvent);
} else {
hFindEvent = hEvent;
}
// 事件处理
var event = linker._eventKey;
event.code = EventEnum.KeyPress;
event.attachEvent(hEvent);
linker.onKeyPress(linker, event);
}
//===========================================================
// 按键落下处理。
//
// @param event 事件
//===========================================================
public onKeyDown(sender, event) {
// 设置状态
var keyCode = event.keyCode;
this._status[keyCode] = KeyStatusEnum.Press;
// 处理事件
this._keyDownListeners.process(event);
}
//===========================================================
// 按键抬起处理。
//
// @param event 事件
//===========================================================
public onKeyUp(sender, event) {
// 设置状态
var keyCode = event.keyCode;
this._status[keyCode] = KeyStatusEnum.Normal;
// 处理事件
this._keyUpListeners.process(event);
}
//===========================================================
// 按键抬起处理。
//
// @param event 事件
//===========================================================
public onKeyPress(sender, event) {
// 处理事件
this._keyPressListeners.process(event);
}
//===========================================================
// 判断按键是否按下。
//
// @method
// @param keyCode:Integer 按键代码
// @return Boolean 是否按下
//===========================================================
public isKeyPress(keyCode:number): boolean {
var status = this._status[keyCode];
return status == KeyStatusEnum.Press;
}
// //===========================================================
// // 判断按键是否控制键。
// //
// // @method
// // @param p:keyCode:Integer 按键代码
// // @return Boolean 是否
// //===========================================================
// public isControlKey(p) {
// var s = EKeyCode.ControlKeys;
// for (var i = s.length - 1; i >= 0; i--) {
// if (s[i] == p) {
// return true;
// }
// }
// return false;
// }
// //===========================================================
// // 判断按键是否整数键。
// //
// // @method
// // @param p:keyCode:Integer 按键代码
// // @return Boolean 是否
// //===========================================================
// public isIntegerKey(c) {
// return EKeyCode.integerCodes[c];
// }
// //===========================================================
// // 判断按键是否浮点数键。
// //
// // @method
// // @param p:keyCode:Integer 按键代码
// // @return Boolean 是否
// //===========================================================
// public isFloatKey(c) {
// return EKeyCode.floatCodes[c];
// }
// //===========================================================
// // 判断按键是否数字键。
// //
// // @method
// // @param p:keyCode:Integer 按键代码
// // @return Boolean 是否
// //===========================================================
// public isNumKey(c) {
// if (p >= 96 && p <= 105) {
// return true;
// }
// return false;
// }
// //===========================================================
// // 修正按键字符大小写。
// //
// // @method
// // @param e:event:SEvent 事件
// // @param c:case:ECharCase 大小写类型
// // @return String 修正后的字符
// //===========================================================
// public fixCase(e, c) {
// if (e && c) {
// var k = e.keyCode;
// if (ECase.Upper == c) {
// k = String.fromCharCode(k).toUpperCase().charCodeAt(0)
// } else if (ECase.Lower == c) {
// k = String.fromCharCode(k).toLowerCase().charCodeAt(0)
// }
// e.keyCode = k;
// }
// }
// //===========================================================
// // 修正按键字符在样式内。
// //
// // @method
// // @param e:event:SEvent 事件
// // @param c:case:ECharCase 大小写类型
// // @return String 修正后的字符
// //===========================================================
// public fixPattern(e, p) {
// if (p) {
// var k = e.keyCode;
// if (!this.isControlKeyPress(k)) {
// if (!MO.Lang.String.isPattern(String.fromCharCode(k), p)) {
// e.keyCode = 0;
// return false;
// }
// }
// }
// return true;
// }
// //===========================================================
// // 修正按键字符在样式内。
// //
// // @method
// // @param e:event:SEvent 事件
// // @param c:case:ECharCase 大小写类型
// // @return String 修正后的字符
// //===========================================================
// public fixChars(e, p) {
// if (p) {
// var k = e.keyCode;
// if (this.isNumKey(k)) {
// k = e.keyCode = e.keyCode - 48;
// }
// if (!this.isControlKeyPress(k)) {
// if (!MO.Lang.String.inChars(String.fromCharCode(k), p)) {
// e.keyCode = 0;
// e.returnValue = false;
// return false;
// }
// }
// }
// return true;
// }
//==========================================================
// 释放处理。
//==========================================================
public dispose() {
// 释放属性
this._keyDownListeners = ObjectUtil.dispose(this._keyDownListeners);
this._keyUpListeners = ObjectUtil.dispose(this._keyUpListeners);
this._keyPressListeners = ObjectUtil.dispose(this._keyPressListeners);
// 父处理
super.dispose();
}
}