| Index: third_party/google_input_tools/src/chrome/os/inputview/elements/content/expandedcandidateview.js
|
| diff --git a/third_party/google_input_tools/src/chrome/os/inputview/elements/content/expandedcandidateview.js b/third_party/google_input_tools/src/chrome/os/inputview/elements/content/expandedcandidateview.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..8c56df199bcda3bcfda20cd52ee36ba3154ba847
|
| --- /dev/null
|
| +++ b/third_party/google_input_tools/src/chrome/os/inputview/elements/content/expandedcandidateview.js
|
| @@ -0,0 +1,326 @@
|
| +// Copyright 2014 The ChromeOS IME Authors. All Rights Reserved.
|
| +// limitations under the License.
|
| +// See the License for the specific language governing permissions and
|
| +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| +// distributed under the License is distributed on an "AS-IS" BASIS,
|
| +// Unless required by applicable law or agreed to in writing, software
|
| +//
|
| +// http://www.apache.org/licenses/LICENSE-2.0
|
| +//
|
| +// You may obtain a copy of the License at
|
| +// you may not use this file except in compliance with the License.
|
| +// Licensed under the Apache License, Version 2.0 (the "License");
|
| +//
|
| +goog.provide('i18n.input.chrome.inputview.elements.content.ExpandedCandidateView');
|
| +
|
| +goog.require('goog.dom.TagName');
|
| +goog.require('goog.dom.classlist');
|
| +goog.require('goog.style');
|
| +goog.require('i18n.input.chrome.inputview.Css');
|
| +goog.require('i18n.input.chrome.inputview.elements.Element');
|
| +goog.require('i18n.input.chrome.inputview.elements.ElementType');
|
| +goog.require('i18n.input.chrome.inputview.elements.content.Candidate');
|
| +goog.require('i18n.input.chrome.inputview.elements.content.FunctionalKey');
|
| +
|
| +
|
| +goog.scope(function() {
|
| +
|
| +var Css = i18n.input.chrome.inputview.Css;
|
| +var TagName = goog.dom.TagName;
|
| +var Candidate = i18n.input.chrome.inputview.elements.content.Candidate;
|
| +var Type = i18n.input.chrome.inputview.elements.content.Candidate.Type;
|
| +var ElementType = i18n.input.chrome.inputview.elements.ElementType;
|
| +var FunctionalKey = i18n.input.chrome.inputview.elements.content.FunctionalKey;
|
| +
|
| +
|
| +
|
| +/**
|
| + * The expanded candidate view.
|
| + *
|
| + * @param {!goog.events.EventTarget=} opt_eventTarget .
|
| + * @constructor
|
| + * @extends {i18n.input.chrome.inputview.elements.Element}
|
| + */
|
| +i18n.input.chrome.inputview.elements.content.ExpandedCandidateView = function(
|
| + opt_eventTarget) {
|
| + goog.base(this, 'expandedCandidateView', ElementType.
|
| + EXPANDED_CANDIDATE_VIEW, opt_eventTarget);
|
| +
|
| + /**
|
| + * The four lines.
|
| + *
|
| + * @private {!Array.<!Element>}
|
| + */
|
| + this.lines_ = [];
|
| +
|
| + /**
|
| + * The functional keys at the right.
|
| + *
|
| + * @private {!Array.<FunctionalKey>}
|
| + */
|
| + this.keys_ = [];
|
| +
|
| + /**
|
| + * Key: page index.
|
| + * Value: candidate start index.
|
| + *
|
| + * @private {!Object.<number, number>}
|
| + */
|
| + this.pageIndexMap_ = {};
|
| +};
|
| +var ExpandedCandidateView = i18n.input.chrome.inputview.elements.content.
|
| + ExpandedCandidateView;
|
| +goog.inherits(ExpandedCandidateView,
|
| + i18n.input.chrome.inputview.elements.Element);
|
| +
|
| +
|
| +/**
|
| + * The index of the key.
|
| + *
|
| + * @enum {number}
|
| + */
|
| +ExpandedCandidateView.KeyIndex = {
|
| + BACKSPACE: 0,
|
| + ENTER: 1,
|
| + PAGE_UP: 2,
|
| + PAGE_DOWN: 3
|
| +};
|
| +
|
| +
|
| +/**
|
| + * The state of the expanded candidate view.
|
| + *
|
| + * @enum {number}
|
| + */
|
| +ExpandedCandidateView.State = {
|
| + NONE: 0,
|
| + COMPLETION_CORRECTION: 1,
|
| + PREDICTION: 2
|
| +};
|
| +
|
| +
|
| +/**
|
| + * The state of the expanded candidate view.
|
| + *
|
| + * @type {ExpandedCandidateView.State}
|
| + */
|
| +ExpandedCandidateView.prototype.state = ExpandedCandidateView.State.NONE;
|
| +
|
| +
|
| +/**
|
| + * The current page index.
|
| + *
|
| + * @private {number}
|
| + */
|
| +ExpandedCandidateView.prototype.pageIndex_ = 0;
|
| +
|
| +
|
| +/** @private {number} */
|
| +ExpandedCandidateView.prototype.candidateStartIndex_ = 0;
|
| +
|
| +
|
| +/** @private {!Array.<!Object>} */
|
| +ExpandedCandidateView.prototype.candidates_;
|
| +
|
| +
|
| +/**
|
| + * The padding between candidates.
|
| + *
|
| + * @private {number}
|
| + */
|
| +ExpandedCandidateView.RIGHT_KEY_WIDTH_ = 120;
|
| +
|
| +
|
| +/**
|
| + * How many cells divided in one line.
|
| + *
|
| + * @type {number}
|
| + * @private
|
| + */
|
| +ExpandedCandidateView.CELLS_PER_LINE_ = 10;
|
| +
|
| +
|
| +/** @private {number} */
|
| +ExpandedCandidateView.LINES_ = 4;
|
| +
|
| +
|
| +/** @private {number} */
|
| +ExpandedCandidateView.prototype.widthPerCell_ = 0;
|
| +
|
| +
|
| +/** @private {number} */
|
| +ExpandedCandidateView.prototype.heightPerCell_ = 0;
|
| +
|
| +
|
| +/** @override */
|
| +ExpandedCandidateView.prototype.createDom = function() {
|
| + goog.base(this, 'createDom');
|
| +
|
| + var dom = this.getDomHelper();
|
| + var line = this.createCandidateLine_(true);
|
| + this.createKey_(ElementType.BACKSPACE_KEY, Css.BACKSPACE_ICON);
|
| +
|
| + line = this.createCandidateLine_(false);
|
| + this.createKey_(ElementType.ENTER_KEY, Css.ENTER_ICON);
|
| +
|
| + line = this.createCandidateLine_(false);
|
| + this.createKey_(ElementType.CANDIDATES_PAGE_UP, Css.PAGE_UP_ICON);
|
| +
|
| + line = this.createCandidateLine_(false);
|
| + this.createKey_(ElementType.CANDIDATES_PAGE_DOWN, Css.PAGE_DOWN_ICON);
|
| +};
|
| +
|
| +
|
| +/**
|
| + * Creates a line for the candidates.
|
| + *
|
| + * @param {boolean} isTopLine .
|
| + * @private
|
| + */
|
| +ExpandedCandidateView.prototype.createCandidateLine_ = function(isTopLine) {
|
| + var dom = this.getDomHelper();
|
| + var line = dom.createDom(TagName.DIV, [Css.CANDIDATE_INTER_CONTAINER,
|
| + Css.CANDIDATES_LINE]);
|
| + if (isTopLine) {
|
| + goog.dom.classlist.add(line, Css.CANDIDATES_TOP_LINE);
|
| + }
|
| + dom.appendChild(this.getElement(), line);
|
| + this.lines_.push(line);
|
| +};
|
| +
|
| +
|
| +/**
|
| + * Creates the right functional key.
|
| + *
|
| + * @param {ElementType} type .
|
| + * @param {string} iconCss .
|
| + * @private
|
| + */
|
| +ExpandedCandidateView.prototype.createKey_ = function(type, iconCss) {
|
| + var key = new FunctionalKey('', type, '', iconCss, this);
|
| + key.render(this.getElement());
|
| + goog.dom.classlist.add(key.getElement(), Css.INLINE_DIV);
|
| + this.keys_.push(key);
|
| + return key;
|
| +};
|
| +
|
| +
|
| +/**
|
| + * Pages up to show more candidates.
|
| + */
|
| +ExpandedCandidateView.prototype.pageUp = function() {
|
| + if (this.pageIndex_ > 0) {
|
| + this.pageIndex_--;
|
| + this.showCandidates(this.candidates_, this.pageIndexMap_[this.pageIndex_]);
|
| + }
|
| +};
|
| +
|
| +
|
| +/**
|
| + * Pages down to the previous candidate page.
|
| + */
|
| +ExpandedCandidateView.prototype.pageDown = function() {
|
| + if (this.candidates_.length > this.candidateStartIndex_) {
|
| + this.pageIndex_++;
|
| + this.showCandidates(this.candidates_, this.candidateStartIndex_);
|
| + }
|
| +};
|
| +
|
| +
|
| +/**
|
| + * Closes this view.
|
| + */
|
| +ExpandedCandidateView.prototype.close = function() {
|
| + this.candidates_ = [];
|
| + this.pageIndex_ = 0;
|
| + this.pageIndexMap_ = {};
|
| + this.candidateStartIndex_ = 0;
|
| + this.setVisible(false);
|
| +};
|
| +
|
| +
|
| +/**
|
| + * Shows the candidates in expanded view.
|
| + *
|
| + * @param {!Array.<!Object>} candidates .
|
| + * @param {number} start .
|
| + */
|
| +ExpandedCandidateView.prototype.showCandidates = function(candidates,
|
| + start) {
|
| + this.setVisible(true);
|
| + var dom = this.getDomHelper();
|
| + for (var i = 0; i < this.lines_.length; i++) {
|
| + dom.removeChildren(this.lines_[i]);
|
| + }
|
| +
|
| + this.pageIndexMap_[this.pageIndex_] = start;
|
| + this.candidates_ = candidates;
|
| + var lineIndex = 0;
|
| + var line = this.lines_[lineIndex];
|
| + var cellsInLine = ExpandedCandidateView.CELLS_PER_LINE_;
|
| + var previousCandidate = null;
|
| + var previousCandidateWidth = 0;
|
| + var i;
|
| + for (i = start; i < candidates.length; i++) {
|
| + var candidate = candidates[i];
|
| + var candidateElem = new Candidate(String(i), candidate, Type.CANDIDATE,
|
| + this.heightPerCell_, false, undefined, this);
|
| + candidateElem.render(line);
|
| + var size = goog.style.getSize(candidateElem.getElement());
|
| + var cells = Math.ceil(size.width / this.widthPerCell_);
|
| + if (cellsInLine < cells) {
|
| + // If there is not enough cells, just put this candidate to a new line
|
| + // and give the rest cells to the last candidate.
|
| + line.removeChild(candidateElem.getElement());
|
| + goog.style.setSize(previousCandidate.getElement(), cellsInLine *
|
| + this.widthPerCell_ + previousCandidateWidth, this.heightPerCell_);
|
| + lineIndex++;
|
| + if (lineIndex == ExpandedCandidateView.LINES_) {
|
| + break;
|
| + }
|
| + cellsInLine = ExpandedCandidateView.CELLS_PER_LINE_ - cells;
|
| + line = this.lines_[lineIndex];
|
| + dom.appendChild(line, candidateElem.getElement());
|
| + } else {
|
| + cellsInLine -= cells;
|
| + }
|
| + var width = cells * this.widthPerCell_;
|
| + goog.style.setSize(candidateElem.getElement(), width, this.heightPerCell_);
|
| +
|
| + if (cellsInLine == 0) {
|
| + lineIndex++;
|
| + if (lineIndex == ExpandedCandidateView.LINES_) {
|
| + break;
|
| + }
|
| + cellsInLine = ExpandedCandidateView.CELLS_PER_LINE_;
|
| + line = this.lines_[lineIndex];
|
| + }
|
| +
|
| + candidateElem.setVisible(true);
|
| + previousCandidateWidth = width;
|
| + previousCandidate = candidateElem;
|
| + }
|
| + this.candidateStartIndex_ = i;
|
| +};
|
| +
|
| +
|
| +/** @override */
|
| +ExpandedCandidateView.prototype.resize = function(width, height) {
|
| + goog.base(this, 'resize', width, height);
|
| +
|
| + goog.style.setSize(this.getElement(), width, height);
|
| + this.widthPerCell_ = Math.floor((width - ExpandedCandidateView.
|
| + RIGHT_KEY_WIDTH_) / ExpandedCandidateView.CELLS_PER_LINE_);
|
| + this.heightPerCell_ = height / ExpandedCandidateView.LINES_;
|
| + for (var i = 0; i < this.lines_.length; i++) {
|
| + var line = this.lines_[i];
|
| + goog.style.setSize(line, Math.floor(width -
|
| + ExpandedCandidateView.RIGHT_KEY_WIDTH_), this.heightPerCell_);
|
| + }
|
| + for (var i = 0; i < this.keys_.length; i++) {
|
| + var key = this.keys_[i];
|
| + key.resize(ExpandedCandidateView.RIGHT_KEY_WIDTH_, this.heightPerCell_);
|
| + }
|
| +};
|
| +
|
| +}); // goog.scope
|
|
|