blob: ebc3448b74c677b956f2b7f5499af11bbdd52f01 [file] [log] [blame]
/* Copyright (c) 2014 The Chromium Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
/**
* @constructor
* @param {Element} parentDiv
*/
var ChordTracker = function(parentDiv) {
/** @type {Element} */
this.parentDiv_ = parentDiv;
/** @type {Element} */
this.currentDiv_ = null;
/** @type {Object<Element>} */
this.pressedKeys_ = {};
};
/**
* @param {string} code The PNaCl "code" string.
* @param {string} title
* @return {void}
*/
ChordTracker.prototype.addKeyUpEvent = function(code, title) {
var span = this.addSpanElement_('key-up', code, title);
delete this.pressedKeys_[code];
if (!this.keysPressed_()) {
this.end_();
}
};
/**
* @param {string} code The PNaCl "code" string.
* @param {string} title
* @return {void}
*/
ChordTracker.prototype.addKeyDownEvent = function(code, title) {
var span = this.addSpanElement_('key-down', code, title);
this.pressedKeys_[code] = span;
};
/**
* @param {string} characterText
* @param {string} title
* @return {void}
*/
ChordTracker.prototype.addCharEvent = function(characterText, title) {
this.addSpanElement_('char-event', characterText, title);
};
/**
* @return {void}
*/
ChordTracker.prototype.releaseAllKeys = function() {
this.end_();
for (var i in this.pressedKeys_) {
this.pressedKeys_[i].classList.add('unreleased');
}
this.pressedKeys_ = {};
}
/**
* @private
* @param {string} className
* @param {string} text
* @param {string} title
* @return {Element}
*/
ChordTracker.prototype.addSpanElement_ = function(className, text, title) {
this.begin_();
var span = /** @type {Element} */ (document.createElement('span'));
span.classList.add(className);
span.classList.add('key-div');
span.innerText = text;
span.title = title;
this.currentDiv_.appendChild(span);
return span;
}
/**
* @private
*/
ChordTracker.prototype.begin_ = function() {
if (this.currentDiv_) {
return;
}
this.currentDiv_ = /** @type {Element} */ (document.createElement('div'));
this.currentDiv_.classList.add('chord-div');
this.parentDiv_.appendChild(this.currentDiv_);
};
/**
* @private
*/
ChordTracker.prototype.end_ = function() {
if (!this.currentDiv_) {
return;
}
if (this.keysPressed_()) {
this.currentDiv_.classList.add('some-keys-still-pressed');
} else {
this.currentDiv_.classList.add('all-keys-released');
}
this.currentDiv_ = null;
};
/**
* @return {boolean} True if there are any keys pressed down.
* @private
*/
ChordTracker.prototype.keysPressed_ = function() {
for (var property in this.pressedKeys_) {
return true;
}
return false;
};