| Index: chrome/browser/resources/keyboard/common.js
|
| diff --git a/chrome/browser/resources/keyboard/common.js b/chrome/browser/resources/keyboard/common.js
|
| deleted file mode 100644
|
| index df085929b3c830e9c712446910dcfd5d859c5e9a..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/resources/keyboard/common.js
|
| +++ /dev/null
|
| @@ -1,972 +0,0 @@
|
| -// Copyright (c) 2011 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.
|
| -
|
| -/**
|
| - * @fileoverview A simple virtual keyboard implementation.
|
| - */
|
| -
|
| -var KEY_MODE = 'key';
|
| -var SHIFT_MODE = 'shift';
|
| -var NUMBER_MODE = 'number';
|
| -var SYMBOL_MODE = 'symbol';
|
| -var MODES = [ KEY_MODE, SHIFT_MODE, NUMBER_MODE, SYMBOL_MODE ];
|
| -var currentMode = SHIFT_MODE;
|
| -var enterShiftModeOnSpace = false;
|
| -var MODE_TRANSITIONS = {};
|
| -
|
| -MODE_TRANSITIONS[KEY_MODE + SHIFT_MODE] = SHIFT_MODE;
|
| -MODE_TRANSITIONS[KEY_MODE + NUMBER_MODE] = NUMBER_MODE;
|
| -MODE_TRANSITIONS[SHIFT_MODE + SHIFT_MODE] = KEY_MODE;
|
| -MODE_TRANSITIONS[SHIFT_MODE + NUMBER_MODE] = NUMBER_MODE;
|
| -MODE_TRANSITIONS[NUMBER_MODE + SHIFT_MODE] = SYMBOL_MODE;
|
| -MODE_TRANSITIONS[NUMBER_MODE + NUMBER_MODE] = KEY_MODE;
|
| -MODE_TRANSITIONS[SYMBOL_MODE + SHIFT_MODE] = NUMBER_MODE;
|
| -MODE_TRANSITIONS[SYMBOL_MODE + NUMBER_MODE] = KEY_MODE;
|
| -
|
| -var KEYBOARDS = {};
|
| -
|
| -/**
|
| - * The long-press delay in milliseconds before long-press handler is invoked.
|
| - * @type {number}
|
| - */
|
| -var LONGPRESS_DELAY_MSEC = 500;
|
| -
|
| -/**
|
| - * The repeat delay in milliseconds before a key starts repeating. Use the same
|
| - * rate as Chromebook. (See chrome/browser/chromeos/language_preferences.cc)
|
| - * @type {number}
|
| - */
|
| -var REPEAT_DELAY_MSEC = 500;
|
| -
|
| -/**
|
| - * The repeat interval or number of milliseconds between subsequent keypresses.
|
| - * Use the same rate as Chromebook.
|
| - * @type {number}
|
| - */
|
| -var REPEAT_INTERVAL_MSEC = 50;
|
| -
|
| -/**
|
| - * The keyboard layout name currently in use.
|
| - * @type {string}
|
| - */
|
| -var currentKeyboardLayout = 'us';
|
| -
|
| -/**
|
| - * The popup keyboard layout name currently in use.
|
| - * @type {string}
|
| - */
|
| -var currentPopupName = '';
|
| -
|
| -/**
|
| - * A structure to track the currently repeating key on the keyboard.
|
| - */
|
| -var repeatKey = {
|
| - /**
|
| - * The timer for the delay before repeating behaviour begins.
|
| - * @type {number|undefined}
|
| - */
|
| - timer: undefined,
|
| -
|
| - /**
|
| - * The interval timer for issuing keypresses of a repeating key.
|
| - * @type {number|undefined}
|
| - */
|
| - interval: undefined,
|
| -
|
| - /**
|
| - * The key which is currently repeating.
|
| - * @type {BaseKey|undefined}
|
| - */
|
| - key: undefined,
|
| -
|
| - /**
|
| - * Cancel the repeat timers of the currently active key.
|
| - */
|
| - cancel: function() {
|
| - clearTimeout(this.timer);
|
| - clearInterval(this.interval);
|
| - this.timer = undefined;
|
| - this.interval = undefined;
|
| - this.key = undefined;
|
| - }
|
| -};
|
| -
|
| -/**
|
| - * An array to track the currently touched keys on the popup keyboard.
|
| - */
|
| -var touchedKeys = [];
|
| -
|
| -/**
|
| - * Set the keyboard mode.
|
| - * @param {string} mode The new mode.
|
| - * @return {void}
|
| - */
|
| -function setMode(mode) {
|
| - currentMode = mode;
|
| -
|
| - var rows = KEYBOARDS[currentKeyboardLayout]['rows'];
|
| - for (var i = 0; i < rows.length; ++i) {
|
| - rows[i].showMode(currentMode);
|
| - }
|
| -
|
| - if (!currentPopupName) {
|
| - return;
|
| - }
|
| - var popupRows = KEYBOARDS[currentPopupName]['rows'];
|
| - for (var i = 0; i < popupRows.length; ++i) {
|
| - popupRows[i].showMode(currentMode);
|
| - }
|
| -}
|
| -
|
| -/**
|
| - * Transition the mode according to the given transition.
|
| - * @param {string} transition The transition to take.
|
| - * @return {void}
|
| - */
|
| -function transitionMode(transition) {
|
| - setMode(MODE_TRANSITIONS[currentMode + transition]);
|
| -}
|
| -
|
| -/**
|
| - * Send the given key to chrome, via the experimental extension API.
|
| - * @param {string} key The key to send.
|
| - * @return {void}
|
| - */
|
| -function sendKey(key) {
|
| - var keyEvent = {'keyIdentifier': key};
|
| - // A keypress event is automatically generated for printable characters
|
| - // immediately following the keydown event.
|
| - if (chrome.experimental) {
|
| - keyEvent.type = 'keydown';
|
| - chrome.experimental.input.virtualKeyboard.sendKeyboardEvent(keyEvent);
|
| - keyEvent.type = 'keyup';
|
| - chrome.experimental.input.virtualKeyboard.sendKeyboardEvent(keyEvent);
|
| - }
|
| - // Exit shift mode after pressing any key but space.
|
| - if (currentMode == SHIFT_MODE && key != 'Spacebar') {
|
| - transitionMode(SHIFT_MODE);
|
| - }
|
| - // Enter shift mode after typing a closing punctuation and then a space for a
|
| - // new sentence.
|
| - if (enterShiftModeOnSpace) {
|
| - enterShiftModeOnSpace = false;
|
| - if (currentMode != SHIFT_MODE && key == 'Spacebar') {
|
| - setMode(SHIFT_MODE);
|
| - }
|
| - }
|
| - if (currentMode != SHIFT_MODE && (key == '.' || key == '?' || key == '!')) {
|
| - enterShiftModeOnSpace = true;
|
| - }
|
| -}
|
| -
|
| -/**
|
| - * Add a child div element that represents the content of the given element.
|
| - * A child div element that represents a text content is added if
|
| - * opt_textContent is given. Otherwise a child element that represents an image
|
| - * content is added. If the given element already has a child, the child element
|
| - * is modified.
|
| - * @param {Element} element The DOM Element to which the content is added.
|
| - * @param {string} opt_textContent The text to be inserted.
|
| - * @return {void}
|
| - */
|
| -function addContent(element, opt_textContent) {
|
| - if (element.childNodes.length > 0) {
|
| - var content = element.childNodes[0];
|
| - if (opt_textContent) {
|
| - content.textContent = opt_textContent;
|
| - }
|
| - return;
|
| - }
|
| -
|
| - var content = document.createElement('div');
|
| - if (opt_textContent) {
|
| - content.textContent = opt_textContent;
|
| - content.className = 'text-key';
|
| - } else {
|
| - content.className = 'image-key';
|
| - }
|
| - element.appendChild(content);
|
| -}
|
| -
|
| -/**
|
| - * Set up the event handlers necessary to respond to mouse and touch events on
|
| - * the virtual keyboard.
|
| - * @param {BaseKey} key The BaseKey object corresponding to this key.
|
| - * @param {Element} element The top-level DOM Element to set event handlers on.
|
| - * @param {Object.<string, function()>} handlers The object that contains key
|
| - * event handlers in the following form.
|
| - *
|
| - * { 'up': keyUpHandler,
|
| - * 'down': keyDownHandler,
|
| - * 'long': keyLongHandler }
|
| - *
|
| - * keyUpHandler: Called when the key is pressed. This will be called
|
| - * repeatedly when holding a repeating key.
|
| - * keyDownHandler: Called when the keyis released. This is only called
|
| - * once per actual key press.
|
| - * keyLongHandler: Called when the key is long-pressed for
|
| - * |LONGPRESS_DELAY_MSEC| milliseconds.
|
| - *
|
| - * The object does not necessarily contain all the handlers above, but
|
| - * needs to contain at least one of them.
|
| - */
|
| -function setupKeyEventHandlers(key, element, handlers) {
|
| - var keyDownHandler = handlers['down'];
|
| - var keyUpHandler = handlers['up'];
|
| - var keyLongHandler = handlers['long'];
|
| - if (!(keyDownHandler || keyUpHandler || keyLongPressHandler)) {
|
| - throw new Error('Invalid handlers passed to setupKeyEventHandlers');
|
| - }
|
| -
|
| - /**
|
| - * Handle a key down event on the virtual key.
|
| - * @param {UIEvent} evt The UI event which triggered the key down.
|
| - */
|
| - var downHandler = function(evt) {
|
| - // Prevent any of the system gestures from happening.
|
| - evt.preventDefault();
|
| -
|
| - // Don't process a key down if the key is already down.
|
| - if (key.pressed) {
|
| - return;
|
| - }
|
| - key.pressed = true;
|
| - if (keyDownHandler) {
|
| - keyDownHandler();
|
| - }
|
| - repeatKey.cancel();
|
| -
|
| - // Start a repeating timer if there is a repeat interval and a function to
|
| - // process key down events.
|
| - if (key.repeat && keyDownHandler) {
|
| - repeatKey.key = key;
|
| - // The timeout for the repeating timer occurs at
|
| - // REPEAT_DELAY_MSEC - REPEAT_INTERVAL_MSEC so that the interval
|
| - // function can handle all repeat keypresses and will get the first one
|
| - // at the correct time.
|
| - repeatKey.timer = setTimeout(function() {
|
| - repeatKey.timer = undefined;
|
| - repeatKey.interval = setInterval(function() {
|
| - keyDownHandler();
|
| - }, REPEAT_INTERVAL_MSEC);
|
| - }, Math.max(0, REPEAT_DELAY_MSEC - REPEAT_INTERVAL_MSEC));
|
| - }
|
| -
|
| - if (keyLongHandler) {
|
| - // Copy the currentTarget of event, which is neccessary in
|
| - // showPopupKeyboard, because |evt| can be modified before
|
| - // |keyLongHandler| is called.
|
| - var evtCopy = {};
|
| - evtCopy.currentTarget = evt.currentTarget;
|
| - key.longPressTimer = setTimeout(function() {
|
| - keyLongHandler(evtCopy),
|
| - clearTimeout(key.longPressTimer);
|
| - delete key.longPressTimer;
|
| - key.pressed = false;
|
| - }, LONGPRESS_DELAY_MSEC);
|
| - }
|
| - };
|
| -
|
| - /**
|
| - * Handle a key up event on the virtual key.
|
| - * @param {UIEvent} evt The UI event which triggered the key up.
|
| - */
|
| - var upHandler = function(evt) {
|
| - // Prevent any of the system gestures from happening.
|
| - evt.preventDefault();
|
| -
|
| - // Reset long-press timer.
|
| - if (key.longPressTimer) {
|
| - clearTimeout(key.longPressTimer);
|
| - delete key.longPressTimer
|
| - }
|
| -
|
| - // If they key was not actually pressed do not send a key up event.
|
| - if (!key.pressed) {
|
| - return;
|
| - }
|
| - key.pressed = false;
|
| -
|
| - // Cancel running repeat timer for the released key only.
|
| - if (repeatKey.key == key) {
|
| - repeatKey.cancel();
|
| - }
|
| -
|
| - if (keyUpHandler) {
|
| - keyUpHandler();
|
| - }
|
| - };
|
| -
|
| - var outHandler = function(evt) {
|
| - // Key element contains a div that holds text like this.
|
| - //
|
| - // <div class="key r1">
|
| - // <div class="text-key">a</div>
|
| - // </div>
|
| - //
|
| - // We are interested in mouseout event sent when mouse cursor moves out of
|
| - // the external div, but mouseout event is sent when mouse cursor moves out
|
| - // of the internal div or moves into the internal div, too.
|
| - // Filter out the last two cases here.
|
| - if (evt.target != evt.currentTarget ||
|
| - evt.toElement.parentNode == evt.fromElement) {
|
| - return;
|
| - }
|
| - // Reset key press state if the point goes out of the element.
|
| - key.pressed = false;
|
| - // Reset long-press timer.
|
| - if (key.longPressTimer) {
|
| - clearTimeout(key.longPressTimer);
|
| - delete key.longPressTimer
|
| - }
|
| - }
|
| -
|
| - // Setup mouse event handlers.
|
| - element.addEventListener('mousedown', downHandler);
|
| - element.addEventListener('mouseup', upHandler);
|
| - element.addEventListener('mouseout', outHandler);
|
| -
|
| - // Setup touch handlers.
|
| - element.addEventListener('touchstart', downHandler);
|
| - element.addEventListener('touchend', upHandler);
|
| - // TODO(mazda): Add a handler for touchleave once Webkit supports it.
|
| - // element.addEventListener('touchleave', outHandler);
|
| -}
|
| -
|
| -/**
|
| - * Create closure for the sendKey function.
|
| - * @param {string} key The key paramater to sendKey.
|
| - * @return {function()} A function which calls sendKey(key).
|
| - */
|
| -function sendKeyFunction(key) {
|
| - return function() {
|
| - sendKey(key);
|
| - };
|
| -}
|
| -
|
| -/**
|
| - * Dispatch custom events to the elements at the touch points.
|
| - * touchmove_popup events are dispatched responding to a touchmove and
|
| - * touchend_popup events responding to a touchend event respectively.
|
| - * @param {UIEvent} evt The touch event that contains touch points information.
|
| - * @return {void}
|
| - */
|
| -function dispatchCustomPopupEvents(evt) {
|
| - var type = null;
|
| - var touches = null;
|
| - if (evt.type == 'touchmove') {
|
| - type = 'touchmove_popup';
|
| - touches = evt.touches;
|
| - } else if (evt.type == 'touchend') {
|
| - type = 'touchend_popup';
|
| - touches = evt.changedTouches;
|
| - } else {
|
| - return;
|
| - }
|
| -
|
| - for (var i = 0; i < touches.length; ++i) {
|
| - var dispatchedEvent = document.createEvent('Event');
|
| - dispatchedEvent.initEvent(type, true, false);
|
| - var touch = touches[i];
|
| - var key = document.elementFromPoint(touch.screenX, touch.screenY);
|
| - if (key) {
|
| - key.dispatchEvent(dispatchedEvent);
|
| - }
|
| - }
|
| -}
|
| -
|
| -/**
|
| - * Handle a touch move event on the key to make changes to the popup keyboard.
|
| - * @param {UIEvent} evt The UI event which triggered the touch move.
|
| - * @return {void}
|
| -*/
|
| -function trackTouchMoveForPopup(evt) {
|
| - var previous = touchedKeys;
|
| - touchedKeys = [];
|
| - dispatchCustomPopupEvents(evt);
|
| - for (var i = 0; i < previous.length; ++i) {
|
| - if (touchedKeys.indexOf(previous[i]) == -1) {
|
| - previous[i].classList.remove('highlighted');
|
| - }
|
| - }
|
| - for (var i = 0; i < touchedKeys.length; ++i) {
|
| - touchedKeys[i].classList.add('highlighted');
|
| - }
|
| -}
|
| -
|
| -/**
|
| - * Handle a touch end event on the key to make changes to the popup keyboard.
|
| - * @param {UIEvent} evt The UI event which triggered the touch end.
|
| - * @return {void}
|
| -*/
|
| -function trackTouchEndForPopup(evt) {
|
| - for (var i = 0; i < touchedKeys.length; ++i) {
|
| - touchedKeys[i].classList.remove('highlighted');
|
| - }
|
| - dispatchCustomPopupEvents(evt);
|
| - hidePopupKeyboard();
|
| -
|
| - touchedKeys = [];
|
| - evt.target.removeEventListener('touchmove', trackTouchMoveForPopup);
|
| - evt.target.removeEventListener('touchend', trackTouchEndForPopup);
|
| -}
|
| -
|
| -/**
|
| - * Show the popup keyboard.
|
| - * @param {string} name The name of the popup keyboard.
|
| - * @param {UIEvent} evt The UI event which triggered the touch start.
|
| - * @return {void}
|
| - */
|
| -function showPopupKeyboard(name, evt) {
|
| - var popupDiv = document.getElementById('popup');
|
| - if (popupDiv.style.visibility == 'visible') {
|
| - return;
|
| - }
|
| -
|
| - // Iitialize the rows of the popup keyboard
|
| - initRows(name, popupDiv, true);
|
| - currentPopupName = name;
|
| -
|
| - // Set the mode of the popup keyboard
|
| - var popupRows = KEYBOARDS[name]['rows'];
|
| - for (var i = 0; i < popupRows.length; ++i) {
|
| - popupRows[i].showMode(currentMode);
|
| - }
|
| -
|
| - // Calculate the size of popup keyboard based on the size of the key.
|
| - var keyElement = evt.currentTarget;
|
| - var keyboard = KEYBOARDS[name];
|
| - var rows = keyboard['definition'];
|
| - var height = keyElement.offsetHeight * rows.length;
|
| - var aspect = keyboard['aspect'];
|
| - var width = aspect * height;
|
| - popupDiv.style.width = width + 'px';
|
| - popupDiv.style.height = height + 'px';
|
| -
|
| - // Place the popup keyboard above the key
|
| - var rect = keyElement.getBoundingClientRect();
|
| - var left = (rect.left + rect.right) / 2 - width / 2;
|
| - left = Math.min(Math.max(left, 0), window.innerWidth - width);
|
| - var top = rect.top - height;
|
| - top = Math.min(Math.max(top, 0), window.innerHeight - height);
|
| - popupDiv.style.left = left + 'px';
|
| - popupDiv.style.top = top + 'px';
|
| - popupDiv.style.visibility = 'visible';
|
| -
|
| - keyElement.addEventListener('touchmove', trackTouchMoveForPopup);
|
| - keyElement.addEventListener('touchend', trackTouchEndForPopup);
|
| -}
|
| -
|
| -/**
|
| - * Create closure for the showPopupKeyboard function.
|
| - * @param {string} name The name paramater to showPopupKeyboard.
|
| - * @return {function()} A function which calls showPopupKeyboard(name, evt).
|
| - */
|
| -function showPopupKeyboardFunction(name) {
|
| - return function (evt) {
|
| - showPopupKeyboard(name, evt);
|
| - };
|
| -}
|
| -
|
| -/**
|
| - * Hide the popup keyboard.
|
| - * @return {void}
|
| - */
|
| -function hidePopupKeyboard() {
|
| - // Clean up the popup keyboard
|
| - var popupDiv = document.getElementById('popup');
|
| - popupDiv.style.visibility = 'hidden';
|
| - while (popupDiv.firstChild) {
|
| - popupDiv.removeChild(popupDiv.firstChild);
|
| - }
|
| - if (currentPopupName in KEYBOARDS) {
|
| - delete KEYBOARDS[currentPopupName].rows;
|
| - }
|
| - currentPopupName = '';
|
| -}
|
| -
|
| -/**
|
| - * Plain-old-data class to represent a character.
|
| - * @param {string} display The HTML to be displayed.
|
| - * @param {string} id The key identifier for this Character.
|
| - * @constructor
|
| - */
|
| -function Character(display, id) {
|
| - this.display = display;
|
| - this.keyIdentifier = id;
|
| -}
|
| -
|
| -/**
|
| - * Convenience function to make the keyboard data more readable.
|
| - * @param {string} display The display for the created Character.
|
| - * @param {string} opt_id The id for the created Character.
|
| - * @return {Character} A character that contains display and opt_id. If
|
| - * opt_id is omitted, display is used as the id.
|
| - */
|
| -function C(display, opt_id) {
|
| - var id = opt_id || display;
|
| - return new Character(display, id);
|
| -}
|
| -
|
| -/**
|
| - * Convenience function to make the keyboard data more readable.
|
| - * @param {string} display The display for the created Character.
|
| - * @param {string} opt_id The id for the created Character.
|
| - * @param {string} opt_popupName The popup keyboard name for this character.
|
| - * @return {Object} An object that contains a Character and the popup keyboard
|
| - * name.
|
| - */
|
| -function CP(display, opt_id, opt_popupName) {
|
| - var result = { character: C(display, opt_id) };
|
| - if (opt_popupName) {
|
| - result['popupName'] = opt_popupName;
|
| - }
|
| - return result;
|
| -}
|
| -
|
| -/**
|
| - * An abstract base-class for all keys on the keyboard.
|
| - * @constructor
|
| - */
|
| -function BaseKey() {}
|
| -
|
| -BaseKey.prototype = {
|
| - /**
|
| - * The cell type of this key. Determines the background colour.
|
| - * @type {string}
|
| - */
|
| - cellType_: '',
|
| -
|
| - /**
|
| - * If true, holding this key will issue repeat keypresses.
|
| - * @type {boolean}
|
| - */
|
| - repeat_: false,
|
| -
|
| - /**
|
| - * Track the pressed state of the key. This is true if currently pressed.
|
| - * @type {boolean}
|
| - */
|
| - pressed_: false,
|
| -
|
| - /**
|
| - * Get the repeat behaviour of the key.
|
| - * @return {boolean} True if the key will repeat.
|
| - */
|
| - get repeat() {
|
| - return this.repeat_;
|
| - },
|
| -
|
| - /**
|
| - * Set the repeat behaviour of the key
|
| - * @param {boolean} repeat True if the key should repeat.
|
| - */
|
| - set repeat(repeat) {
|
| - this.repeat_ = repeat;
|
| - },
|
| -
|
| - /**
|
| - * Get the pressed state of the key.
|
| - * @return {boolean} True if the key is currently pressed.
|
| - */
|
| - get pressed() {
|
| - return this.pressed_;
|
| - },
|
| -
|
| - /**
|
| - * Set the pressed state of the key.
|
| - * @param {boolean} pressed True if the key is currently pressed.
|
| - */
|
| - set pressed(pressed) {
|
| - this.pressed_ = pressed;
|
| - },
|
| -
|
| - /**
|
| - * Create the DOM elements for the given keyboard mode. Must be overridden.
|
| - * @param {string} mode The keyboard mode to create elements for.
|
| - * @return {Element} The top-level DOM Element for the key.
|
| - */
|
| - makeDOM: function(mode) {
|
| - throw new Error('makeDOM not implemented in BaseKey');
|
| - },
|
| -};
|
| -
|
| -/**
|
| - * A simple key which displays Characters.
|
| - * @param {Object} key The Character and the popup name for KEY_MODE.
|
| - * @param {Object} shift The Character and the popup name for SHIFT_MODE.
|
| - * @param {Object} num The Character and the popup name for NUMBER_MODE.
|
| - * @param {Object} symbol The Character and the popup name for SYMBOL_MODE.
|
| - * @constructor
|
| - * @extends {BaseKey}
|
| - */
|
| -function Key(key, shift, num, symbol) {
|
| - this.modeElements_ = {};
|
| - this.cellType_ = '';
|
| -
|
| - this.modes_ = {};
|
| - this.modes_[KEY_MODE] = key ? key.character : null;
|
| - this.modes_[SHIFT_MODE] = shift ? shift.character : null;
|
| - this.modes_[NUMBER_MODE] = num ? num.character : null;
|
| - this.modes_[SYMBOL_MODE] = symbol ? symbol.character : null;
|
| -
|
| - this.popupNames_ = {};
|
| - this.popupNames_[KEY_MODE] = key ? key.popupName : null;
|
| - this.popupNames_[SHIFT_MODE] = shift ? shift.popupName : null;
|
| - this.popupNames_[NUMBER_MODE] = num ? num.popupName : null;
|
| - this.popupNames_[SYMBOL_MODE] = symbol ? symbol.popupName : null;
|
| -}
|
| -
|
| -Key.prototype = {
|
| - __proto__: BaseKey.prototype,
|
| -
|
| - /** @inheritDoc */
|
| - makeDOM: function(mode) {
|
| - if (!this.modes_[mode]) {
|
| - return null;
|
| - }
|
| -
|
| - this.modeElements_[mode] = document.createElement('div');
|
| - var element = this.modeElements_[mode];
|
| - element.className = 'key';
|
| -
|
| - addContent(element, this.modes_[mode].display);
|
| -
|
| - var longHandler = this.popupNames_[mode] ?
|
| - showPopupKeyboardFunction(this.popupNames_[mode]) : null;
|
| - setupKeyEventHandlers(this, element,
|
| - { 'up': sendKeyFunction(this.modes_[mode].keyIdentifier),
|
| - 'long': longHandler });
|
| - return element;
|
| - }
|
| -};
|
| -
|
| -/**
|
| - * A simple key which displays Characters on the popup keyboard.
|
| - * @param {Character} key The Character for KEY_MODE.
|
| - * @param {Character} shift The Character for SHIFT_MODE.
|
| - * @param {Character} num The Character for NUMBER_MODE.
|
| - * @param {Character} symbol The Character for SYMBOL_MODE.
|
| - * @constructor
|
| - * @extends {BaseKey}
|
| - */
|
| -function PopupKey(key, shift, num, symbol) {
|
| - this.modeElements_ = {};
|
| - this.cellType_ = '';
|
| -
|
| - this.modes_ = {};
|
| - this.modes_[KEY_MODE] = key;
|
| - this.modes_[SHIFT_MODE] = shift;
|
| - this.modes_[NUMBER_MODE] = num;
|
| - this.modes_[SYMBOL_MODE] = symbol;
|
| -}
|
| -
|
| -PopupKey.prototype = {
|
| - __proto__: BaseKey.prototype,
|
| -
|
| - /** @inheritDoc */
|
| - makeDOM: function(mode) {
|
| - if (!this.modes_[mode]) {
|
| - return null;
|
| - }
|
| -
|
| - this.modeElements_[mode] = document.createElement('div');
|
| - var element = this.modeElements_[mode];
|
| - element.className = 'key popupkey';
|
| -
|
| - addContent(element, this.modes_[mode].display);
|
| -
|
| - var upHandler = sendKeyFunction(this.modes_[mode].keyIdentifier);
|
| - element.addEventListener('touchmove_popup', function(evt) {
|
| - touchedKeys.push(element);
|
| - });
|
| - element.addEventListener('touchend_popup', upHandler);
|
| - element.addEventListener('mouseup', upHandler);
|
| - element.addEventListener('mouseover', function(evt) {
|
| - element.classList.add('highlighted');
|
| - });
|
| - element.addEventListener('mouseout', function(evt) {
|
| - element.classList.remove('highlighted');
|
| - });
|
| - return element;
|
| - }
|
| -};
|
| -
|
| -/**
|
| - * A key which displays an SVG image.
|
| - * @param {string} className The class that provides the image.
|
| - * @param {string} keyId The key identifier for the key.
|
| - * @param {boolean} opt_repeat True if the key should repeat.
|
| - * @constructor
|
| - * @extends {BaseKey}
|
| - */
|
| -function SvgKey(className, keyId, opt_repeat) {
|
| - this.modeElements_ = {};
|
| - this.cellType_ = 'nc';
|
| - this.className_ = className;
|
| - this.keyId_ = keyId;
|
| - this.repeat_ = opt_repeat || false;
|
| -}
|
| -
|
| -SvgKey.prototype = {
|
| - __proto__: BaseKey.prototype,
|
| -
|
| - /** @inheritDoc */
|
| - makeDOM: function(mode) {
|
| - this.modeElements_[mode] = document.createElement('div');
|
| - this.modeElements_[mode].className = 'key';
|
| - this.modeElements_[mode].classList.add(this.className_);
|
| - addContent(this.modeElements_[mode]);
|
| -
|
| - // send the key event on key down if key repeat is enabled
|
| - var handler = this.repeat_ ? { 'down' : sendKeyFunction(this.keyId_) } :
|
| - { 'up' : sendKeyFunction(this.keyId_) };
|
| - setupKeyEventHandlers(this, this.modeElements_[mode], handler);
|
| -
|
| - return this.modeElements_[mode];
|
| - }
|
| -};
|
| -
|
| -/**
|
| - * A Key that remains the same through all modes.
|
| - * @param {string} content The display text for the key.
|
| - * @param {string} keyId The key identifier for the key.
|
| - * @constructor
|
| - * @extends {BaseKey}
|
| - */
|
| -function SpecialKey(className, content, keyId) {
|
| - this.modeElements_ = {};
|
| - this.cellType_ = 'nc';
|
| - this.content_ = content;
|
| - this.keyId_ = keyId;
|
| - this.className_ = className;
|
| -}
|
| -
|
| -SpecialKey.prototype = {
|
| - __proto__: BaseKey.prototype,
|
| -
|
| - /** @inheritDoc */
|
| - makeDOM: function(mode) {
|
| - this.modeElements_[mode] = document.createElement('div');
|
| - this.modeElements_[mode].className = 'key';
|
| - this.modeElements_[mode].classList.add(this.className_);
|
| - addContent(this.modeElements_[mode], this.content_);
|
| -
|
| - setupKeyEventHandlers(this, this.modeElements_[mode],
|
| - { 'up': sendKeyFunction(this.keyId_) });
|
| -
|
| - return this.modeElements_[mode];
|
| - }
|
| -};
|
| -
|
| -/**
|
| - * A shift key.
|
| - * @constructor
|
| - * @extends {BaseKey}
|
| - */
|
| -function ShiftKey(className) {
|
| - this.modeElements_ = {};
|
| - this.cellType_ = 'nc';
|
| - this.className_ = className;
|
| -}
|
| -
|
| -ShiftKey.prototype = {
|
| - __proto__: BaseKey.prototype,
|
| -
|
| - /** @inheritDoc */
|
| - makeDOM: function(mode) {
|
| - this.modeElements_[mode] = document.createElement('div');
|
| - this.modeElements_[mode].className = 'key shift';
|
| - this.modeElements_[mode].classList.add(this.className_);
|
| -
|
| - if (mode == KEY_MODE || mode == SHIFT_MODE) {
|
| - addContent(this.modeElements_[mode]);
|
| - } else if (mode == NUMBER_MODE) {
|
| - addContent(this.modeElements_[mode], 'more');
|
| - } else if (mode == SYMBOL_MODE) {
|
| - addContent(this.modeElements_[mode], '#123');
|
| - }
|
| -
|
| - if (mode == SHIFT_MODE || mode == SYMBOL_MODE) {
|
| - this.modeElements_[mode].classList.add('moddown');
|
| - } else {
|
| - this.modeElements_[mode].classList.remove('moddown');
|
| - }
|
| -
|
| - setupKeyEventHandlers(this, this.modeElements_[mode],
|
| - { 'down': function() {
|
| - transitionMode(SHIFT_MODE);
|
| - }});
|
| -
|
| - return this.modeElements_[mode];
|
| - },
|
| -};
|
| -
|
| -/**
|
| - * The symbol key: switches the keyboard into symbol mode.
|
| - * @constructor
|
| - * @extends {BaseKey}
|
| - */
|
| -function SymbolKey() {
|
| - this.modeElements_ = {}
|
| - this.cellType_ = 'nc';
|
| -}
|
| -
|
| -SymbolKey.prototype = {
|
| - __proto__: BaseKey.prototype,
|
| -
|
| - /** @inheritDoc */
|
| - makeDOM: function(mode, height) {
|
| - this.modeElements_[mode] = document.createElement('div');
|
| - this.modeElements_[mode].className = 'key symbol';
|
| -
|
| - if (mode == KEY_MODE || mode == SHIFT_MODE) {
|
| - addContent(this.modeElements_[mode], '#123');
|
| - } else if (mode == NUMBER_MODE || mode == SYMBOL_MODE) {
|
| - addContent(this.modeElements_[mode], 'abc');
|
| - }
|
| -
|
| - if (mode == NUMBER_MODE || mode == SYMBOL_MODE) {
|
| - this.modeElements_[mode].classList.add('moddown');
|
| - } else {
|
| - this.modeElements_[mode].classList.remove('moddown');
|
| - }
|
| -
|
| - setupKeyEventHandlers(this, this.modeElements_[mode],
|
| - { 'down': function() {
|
| - transitionMode(NUMBER_MODE);
|
| - }});
|
| -
|
| - return this.modeElements_[mode];
|
| - }
|
| -};
|
| -
|
| -/**
|
| - * The ".com" key.
|
| - * @constructor
|
| - * @extends {BaseKey}
|
| - */
|
| -function DotComKey() {
|
| - this.modeElements_ = {}
|
| - this.cellType_ = 'nc';
|
| -}
|
| -
|
| -DotComKey.prototype = {
|
| - __proto__: BaseKey.prototype,
|
| -
|
| - /** @inheritDoc */
|
| - makeDOM: function(mode) {
|
| - this.modeElements_[mode] = document.createElement('div');
|
| - this.modeElements_[mode].className = 'key com';
|
| - addContent(this.modeElements_[mode], '.com');
|
| -
|
| - setupKeyEventHandlers(this, this.modeElements_[mode],
|
| - { 'up': function() {
|
| - sendKey('.');
|
| - sendKey('c');
|
| - sendKey('o');
|
| - sendKey('m');
|
| - }});
|
| -
|
| - return this.modeElements_[mode];
|
| - }
|
| -};
|
| -
|
| -/**
|
| - * The key that hides the keyboard.
|
| - * @constructor
|
| - * @extends {BaseKey}
|
| - */
|
| -function HideKeyboardKey() {
|
| - this.modeElements_ = {}
|
| - this.cellType_ = 'nc';
|
| -}
|
| -
|
| -HideKeyboardKey.prototype = {
|
| - __proto__: BaseKey.prototype,
|
| -
|
| - /** @inheritDoc */
|
| - makeDOM: function(mode) {
|
| - this.modeElements_[mode] = document.createElement('div');
|
| - this.modeElements_[mode].className = 'key hide';
|
| - addContent(this.modeElements_[mode]);
|
| -
|
| - setupKeyEventHandlers(this, this.modeElements_[mode],
|
| - { 'down': function() {
|
| - if (chrome.experimental) {
|
| - chrome.experimental.input.virtualKeyboard.hideKeyboard();
|
| - }
|
| - }});
|
| -
|
| - return this.modeElements_[mode];
|
| - }
|
| -};
|
| -
|
| -/**
|
| - * A container for keys.
|
| - * @param {number} position The position of the row (0-3).
|
| - * @param {Array.<BaseKey>} keys The keys in the row.
|
| - * @constructor
|
| - */
|
| -function Row(position, keys) {
|
| - this.position_ = position;
|
| - this.keys_ = keys;
|
| - this.element_ = null;
|
| - this.modeElements_ = {};
|
| -}
|
| -
|
| -Row.prototype = {
|
| - /**
|
| - * Create the DOM elements for the row.
|
| - * @return {Element} The top-level DOM Element for the row.
|
| - */
|
| - makeDOM: function() {
|
| - this.element_ = document.createElement('div');
|
| - this.element_.className = 'row';
|
| - for (var i = 0; i < MODES.length; ++i) {
|
| - var mode = MODES[i];
|
| - this.modeElements_[mode] = document.createElement('div');
|
| - this.modeElements_[mode].style.display = 'none';
|
| - this.element_.appendChild(this.modeElements_[mode]);
|
| - }
|
| -
|
| - for (var j = 0; j < this.keys_.length; ++j) {
|
| - var key = this.keys_[j];
|
| - for (var i = 0; i < MODES.length; ++i) {
|
| - var keyDom = key.makeDOM(MODES[i]);
|
| - if (keyDom) {
|
| - this.modeElements_[MODES[i]].appendChild(keyDom);
|
| - }
|
| - }
|
| - }
|
| -
|
| - for (var i = 0; i < MODES.length; ++i) {
|
| - var clearingDiv = document.createElement('div');
|
| - clearingDiv.style.clear = 'both';
|
| - this.modeElements_[MODES[i]].appendChild(clearingDiv);
|
| - }
|
| -
|
| - return this.element_;
|
| - },
|
| -
|
| - /**
|
| - * Shows the given mode.
|
| - * @param {string} mode The mode to show.
|
| - * @return {void}
|
| - */
|
| - showMode: function(mode) {
|
| - for (var i = 0; i < MODES.length; ++i) {
|
| - this.modeElements_[MODES[i]].style.display = 'none';
|
| - }
|
| - this.modeElements_[mode].style.display = '-webkit-box';
|
| - },
|
| -
|
| - /**
|
| - * Returns the size of keys this row contains.
|
| - * @return {number} The size of keys.
|
| - */
|
| - get length() {
|
| - return this.keys_.length;
|
| - }
|
| -};
|
|
|