"use strict";
/**
 * 浏览器按键处理
 * howay
 * 20200421
 * 1.0
 */
const KeyScaner = /** @class */ (function () {
    function KeyScaner(_dom) {
        this.keybufs = [];
        this.altBuf = [];
        this.isShift = false;
        this.lastTime = 0;
        /**
         * 在收集到文本输入时触发
         * @param text 收集到的连续文本
         */
        this.onInput = function (text) {
        };
        this.dom = _dom;
        _dom.addEventListener('keydown', this.onKeyDown.bind(this));
        _dom.addEventListener('keyup', this.onKeyUp.bind(this));
        this.interval = setInterval(this.onTick.bind(this), 100);
    }

    KeyScaner.prototype.appendChar = function (c) {
        this.keybufs.push(c);
    };
    KeyScaner.prototype.onKeyDown = function (ev) {
        this.lastTime = new Date().getTime();
        if (ev.key == "Alt") {
            if (ev.shiftKey || ev.ctrlKey || ev.metaKey) {
                return;
            }
        } else if (ev.key == "Shift") {
            if (ev.altKey || ev.ctrlKey || ev.metaKey) {
                return;
            }
            this.isShift = true;
        } else if (ev.key == "Enter") {
            if (ev.shiftKey || ev.altKey || ev.ctrlKey || ev.metaKey) {
                return;
            }
            this.appendChar("\r");
            this.completeInput(); //立即完成输入
        } else if (ev.key == "Delete" || ev.key == "Backspace") {
            this.dom.innerTex = "";
            this.appendChar("delete");
            this.completeInput(); //立即完成输入
        } else {
            if (ev.key.length == 1) {
                var charCode = ev.key.charCodeAt(0);
                console.log("key="+charCode);
                if (charCode >= 48 && charCode <= 57) {
                    if (ev.altKey) {
                        this.altBuf.push(ev.key);
                    } else {
                        this.appendChar(ev.key);
                    }
                } else if ((charCode >= 65 && charCode <= 90) || (charCode >= 97 && charCode <= 122)) {
                    //忽略大小写锁定键，直接通过SHIFT键判断大小写
                    if (ev.shiftKey) {
                        this.appendChar(ev.key.toUpperCase());
                    } else {
                        this.appendChar(ev.key.toLowerCase());
                    }
                } else {
                    this.appendChar(ev.key);
                }
            }
            //忽略其他控制键
        }
    };
    KeyScaner.prototype.onKeyUp = function (ev) {
        this.lastTime = new Date().getTime();
        if (ev.key == "Alt") {
            if (this.altBuf && this.altBuf.length > 0) {
                var str = this.altBuf.join("");
                var num = parseInt(str);
                var c = String.fromCharCode(num);
                this.appendChar(c);
                this.altBuf = [];
            }
        } else if (ev.key == "Shift") {
            this.isShift = false;
        }
    };
    KeyScaner.prototype.completeInput = function () {
        var text = this.keybufs.join("");
        this.keybufs = [];
        if (this.onInput) {
            this.onInput.bind(this)(text);
        }
    };
    KeyScaner.prototype.onTick = function () {
        if (this.keybufs && this.keybufs.length > 0 && (!this.altBuf || this.altBuf.length == 0) && new Date().getTime() - this.lastTime > 500) {
            //有缓存的字符，且没有缓存的alt字符 且 与上次按键时间超过500毫秒。 收集输入
            // this.completeInput();
        }
    };
    /**
     * 释放资源
     */
    KeyScaner.prototype.dispose = function () {
        this.dom.removeEventListener('keydown', this.onKeyDown);
        this.dom.removeEventListener('keyup', this.onKeyUp);
        clearInterval(this.interval);
    };
    return KeyScaner;
}());

export default {
    KeyScaner
}

