Index: third_party/google_input_tools/src/chrome/os/inputview/elements/content/menuview.js |
diff --git a/third_party/google_input_tools/src/chrome/os/inputview/elements/content/menuview.js b/third_party/google_input_tools/src/chrome/os/inputview/elements/content/menuview.js |
index 101fe0c7b58119ab53c4b2db90c327d2edeb0f29..6cecdaae5d53bf4cef657573bf4e75ca902e42f3 100644 |
--- a/third_party/google_input_tools/src/chrome/os/inputview/elements/content/menuview.js |
+++ b/third_party/google_input_tools/src/chrome/os/inputview/elements/content/menuview.js |
@@ -20,7 +20,6 @@ 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.GlobalFlags'); |
goog.require('i18n.input.chrome.inputview.elements.Element'); |
goog.require('i18n.input.chrome.inputview.elements.ElementType'); |
goog.require('i18n.input.chrome.inputview.elements.content.MenuItem'); |
@@ -35,13 +34,13 @@ var Css = i18n.input.chrome.inputview.Css; |
/** |
- * The view for IME switcher, layout switcher and settings menu popup.. |
+ * The view for IME switcher, layout switcher and settings menu popup. |
* |
* @param {goog.events.EventTarget=} opt_eventTarget The parent event target. |
* @constructor |
* @extends {i18n.input.chrome.inputview.elements.Element} |
*/ |
-// TODO: MenuView could extend from AltDataView after some refactor. |
+// TODO: Refactor MenuView to extend AltDataView. |
i18n.input.chrome.inputview.elements.content.MenuView = function( |
opt_eventTarget) { |
goog.base(this, '', ElementType.MENU_VIEW, opt_eventTarget); |
@@ -55,7 +54,7 @@ var MenuView = i18n.input.chrome.inputview.elements.content.MenuView; |
/** |
- * The supported command. |
+ * The commands which items in MenuView may send to inputview/controller.js. |
* |
* @enum {number} |
*/ |
@@ -64,45 +63,53 @@ MenuView.Command = { |
SWITCH_KEYSET: 1, |
OPEN_EMOJI: 2, |
OPEN_HANDWRITING: 3, |
- OPEN_SETTING: 4 |
+ OPEN_SETTING: 4, |
+ FLOATING: 5, |
+ DOCKING: 6 |
}; |
/** |
* The maximal number of visible input methods in the view. If more than 3 input |
* methods are enabled, only 3 of them will show and others can be scrolled into |
- * view. The reason we have this limiation is because menu view can not be |
+ * view. The reason we have this limitation is because menu view can not be |
* higher than the keyboard view. |
* |
- * @type {number} |
- * @private |
+ * @private {number} |
*/ |
-MenuView.prototype.visibleItems_ = 4; |
+MenuView.VISIBLE_ITEMS_ = 4; |
/** |
- * The width of the popup menu. |
- * The total width include padding is 300px, the padding left is 41px. |
+ * Same as VISIBLE_ITEM_ but for a11y keyboard. A11y virtual keyboard is shorter |
+ * than normal keyboard so 3 is used. |
* |
- * @type {number} |
- * @private |
+ * @private {number} |
*/ |
-MenuView.width_ = 300; |
+MenuView.VISIBLE_ITEMS_A11Y_ = 3; |
/** |
- * The padding-left of the menu item. |
+ * The width in px of the popup menu. |
+ * The total width including padding is 300px, the left padding is 41px. |
* |
* @private {number} |
*/ |
-MenuView.paddingLeft_ = 0; |
+MenuView.WIDTH_ = 275; |
/** |
- * The height of the popup menu item. |
+ * The left padding in px of the menu item. |
* |
- * @type {number} |
- * @private |
+ * @private {number} |
+ */ |
+MenuView.PADDING_LEFT_ = 25; |
+ |
+ |
+/** |
+ * The height in px of the popup menu item. |
+ * |
+ * @private {number} |
*/ |
MenuView.LIST_ITEM_HEIGHT_ = 45; |
@@ -112,8 +119,7 @@ MenuView.LIST_ITEM_HEIGHT_ = 45; |
* Note: The reason we use a separate cover element instead of the view is |
* because of the opacity. We can not reassign the opacity in child element. |
* |
- * @type {!Element} |
- * @private |
+ * @private {!Element} |
*/ |
MenuView.prototype.coverElement_; |
@@ -146,55 +152,55 @@ MenuView.prototype.enterDocument = function() { |
/** |
* Shows the menu view. |
* @param {!i18n.input.chrome.inputview.elements.content.SoftKey} key The key |
- * triggerred this altdata view. |
+ * triggerred this menu view. |
* @param {!string} currentKeysetId The keyset ID that this menu key belongs to. |
* @param {boolean} isCompact True if the keyset that owns the menu key is a |
* compact layout. |
* @param {boolean} enableCompactLayout True if the keyset that owns the menu |
* key enabled compact layout. |
* @param {!string} currentInputMethod The current input method ID. |
- * @param {?Array.<Object>} inputMethods The list of activated input methods. |
+ * @param {?Array.<Object<string, string, string>>} inputMethods The list of |
+ * activated input methods. |
* @param {boolean} hasHwt Whether to add handwriting button. |
* @param {boolean} enableSettings Whether to add a link to settings page. |
* @param {boolean} hasEmoji Whether to enable emoji. |
- * @param {boolean} isA11y . |
+ * @param {boolean} isA11y Whether the current keyboard is a11y-optimized. |
+ * @param {boolean} enableFVK Whether to enable floating virtual keyboard. |
+ * @param {boolean} isFloating Whether the virtual keyboard is floating. |
*/ |
MenuView.prototype.show = function(key, currentKeysetId, isCompact, |
enableCompactLayout, currentInputMethod, inputMethods, hasHwt, |
- enableSettings, hasEmoji, isA11y) { |
- if (i18n.input.chrome.inputview.GlobalFlags.isQPInputView) { |
- // Temporary overwrites the value for material design. |
- MenuView.width_ = 259; |
- MenuView.paddingLeft_ = 41; |
- } |
- this.visibleItems_ = isA11y ? 3 : 4; |
+ enableSettings, hasEmoji, isA11y, enableFVK, isFloating) { |
var ElementType = i18n.input.chrome.inputview.elements.ElementType; |
var dom = this.getDomHelper(); |
if (key.type != ElementType.MENU_KEY) { |
- console.error('Only menu key should trigger menu view to show'); |
+ console.error('Unexpected key triggered the menu view. Key type = ' + |
+ key.type + '.'); |
return; |
} |
this.triggeredBy = key; |
var coordinate = goog.style.getClientPosition(key.getElement()); |
var x = coordinate.x; |
- // y is the maximual height that menu view can have. |
+ // y is the maximal height that menu view can have. |
var y = coordinate.y; |
goog.style.setElementShown(this.getElement(), true); |
- // may not need to remove child. |
+ // TODO: May not need to remove child. |
dom.removeChildren(this.getElement()); |
var totalHeight = 0; |
- totalHeight += this.addInputMethodItems_(currentInputMethod, inputMethods); |
+ totalHeight += this.addInputMethodItems_(currentInputMethod, inputMethods, |
+ isA11y); |
totalHeight += this.addLayoutSwitcherItem_(key, currentKeysetId, isCompact, |
enableCompactLayout); |
if (hasHwt || enableSettings || hasEmoji) { |
- totalHeight += this.addFooterItems_(hasHwt, enableSettings, hasEmoji); |
+ totalHeight += this.addFooterItems_(hasHwt, enableSettings, hasEmoji, |
+ enableFVK, isFloating); |
} |
var left = x; |
- //TODO: take care of elemTop < 0. A scrollable view is probably needed. |
+ // TODO: Take care of elemTop < 0. A scrollable view is probably needed. |
var elemTop = y - totalHeight; |
goog.style.setPosition(this.getElement(), left, elemTop); |
@@ -219,15 +225,19 @@ MenuView.prototype.hide = function() { |
* Adds the list of activated input methods. |
* |
* @param {!string} currentInputMethod The current input method ID. |
- * @param {?Array.<Object>} inputMethods The list of activated input methods. |
+ * @param {?Array.<Object<string, string, string>>} inputMethods The list of |
+ * activated input methods. |
+ * @param {boolean} isA11y Whether the current keyboard is a11y-optimized. |
* @return {number} The height of the ime list container. |
* @private |
*/ |
MenuView.prototype.addInputMethodItems_ = function(currentInputMethod, |
- inputMethods) { |
+ inputMethods, isA11y) { |
var dom = this.getDomHelper(); |
var container = dom.createDom(goog.dom.TagName.DIV, |
Css.IME_LIST_CONTAINER); |
+ var visibleItems = isA11y ? |
+ MenuView.VISIBLE_ITEMS_A11Y_ : MenuView.VISIBLE_ITEMS_; |
for (var i = 0; i < inputMethods.length; i++) { |
var inputMethod = inputMethods[i]; |
@@ -249,14 +259,14 @@ MenuView.prototype.addInputMethodItems_ = function(currentInputMethod, |
imeItem.check(); |
} |
goog.style.setSize(imeItem.getElement(), |
- (MenuView.width_ + MenuView.paddingLeft_), |
+ (MenuView.WIDTH_ + MenuView.PADDING_LEFT_), |
MenuView.LIST_ITEM_HEIGHT_); |
} |
- var containerHeight = inputMethods.length > this.visibleItems_ ? |
- MenuView.LIST_ITEM_HEIGHT_ * this.visibleItems_ : |
+ var containerHeight = inputMethods.length > visibleItems ? |
+ MenuView.LIST_ITEM_HEIGHT_ * visibleItems : |
MenuView.LIST_ITEM_HEIGHT_ * inputMethods.length; |
- goog.style.setSize(container, MenuView.width_ + MenuView.paddingLeft_, |
+ goog.style.setSize(container, MenuView.WIDTH_ + MenuView.PADDING_LEFT_, |
containerHeight); |
dom.appendChild(this.getElement(), container); |
@@ -269,7 +279,7 @@ MenuView.prototype.addInputMethodItems_ = function(currentInputMethod, |
* disabled compact layout, this is a noop. |
* |
* @param {!i18n.input.chrome.inputview.elements.content.SoftKey} key The key |
- * triggerred this altdata view. |
+ * triggerred this menu view. |
* @param {!string} currentKeysetId The keyset ID that this menu key belongs to. |
* @param {boolean} isCompact True if the keyset that owns the menu key is a |
* compact layout. |
@@ -312,7 +322,7 @@ MenuView.prototype.addLayoutSwitcherItem_ = function(key, currentKeysetId, |
chrome.i18n.getMessage('SWITCH_TO_COMPACT_LAYOUT')); |
} |
layoutSwitcherItem.render(this.getElement()); |
- goog.style.setSize(layoutSwitcherItem.getElement(), MenuView.width_, |
+ goog.style.setSize(layoutSwitcherItem.getElement(), MenuView.WIDTH_, |
MenuView.LIST_ITEM_HEIGHT_); |
return MenuView.LIST_ITEM_HEIGHT_; |
@@ -326,11 +336,13 @@ MenuView.prototype.addLayoutSwitcherItem_ = function(key, currentKeysetId, |
* @param {boolean} hasHwt Whether to add handwriting button. |
* @param {boolean} enableSettings Whether to add settings button. |
* @param {boolean} hasEmoji Whether to add emoji button. |
+ * @param {boolean} enableFVK Whether to add floating virtual keyboard button. |
+ * @param {boolean} isFloating Whether the virtual keyboard is floating. |
* @return {number} The height of the footer. |
* @private |
*/ |
MenuView.prototype.addFooterItems_ = function(hasHwt, enableSettings, |
- hasEmoji) { |
+ hasEmoji, enableFVK, isFloating) { |
var dom = this.getDomHelper(); |
var footer = dom.createDom(goog.dom.TagName.DIV, Css.MENU_FOOTER); |
if (hasEmoji) { |
@@ -363,19 +375,38 @@ MenuView.prototype.addFooterItems_ = function(hasHwt, enableSettings, |
settingFooter.render(footer); |
} |
+ if (enableFVK) { |
+ var floating = {}; |
+ if (isFloating) { |
+ floating['iconCssClass'] = Css.MENU_FOOTER_DOCKING_BUTTON; |
+ floating['command'] = [MenuView.Command.DOCKING]; |
+ var floatingFooter = new MenuItem('dock', floating, |
+ MenuItem.Type.FOOTER_ITEM, |
+ chrome.i18n.getMessage('FOOTER_DOCKING_BUTTON')); |
+ floatingFooter.render(footer); |
+ } else { |
+ floating['iconCssClass'] = Css.MENU_FOOTER_FLOATING_BUTTON; |
+ floating['command'] = [MenuView.Command.FLOATING]; |
+ var floatingFooter = new MenuItem('floating', floating, |
+ MenuItem.Type.FOOTER_ITEM, |
+ chrome.i18n.getMessage('FOOTER_FLOATING_BUTTON')); |
+ floatingFooter.render(footer); |
+ } |
+ } |
+ |
// Sets footer itmes' width. |
var elems = dom.getChildren(footer); |
var len = elems.length; |
- var subWidth = Math.ceil((MenuView.width_ + MenuView.paddingLeft_) / len); |
+ var subWidth = Math.ceil((MenuView.WIDTH_ + MenuView.PADDING_LEFT_) / len); |
var i = 0; |
for (; i < len - 1; i++) { |
elems[i].style.width = subWidth + 'px'; |
} |
- elems[i].style.width = (MenuView.width_ + MenuView.paddingLeft_ - |
+ elems[i].style.width = (MenuView.WIDTH_ + MenuView.PADDING_LEFT_ - |
subWidth * (len - 1)) + 'px'; |
dom.appendChild(this.getElement(), footer); |
- goog.style.setSize(footer, (MenuView.width_ + MenuView.paddingLeft_), |
+ goog.style.setSize(footer, (MenuView.WIDTH_ + MenuView.PADDING_LEFT_), |
MenuView.LIST_ITEM_HEIGHT_); |
return MenuView.LIST_ITEM_HEIGHT_; |
@@ -410,3 +441,4 @@ MenuView.prototype.disposeInternal = function() { |
}; |
}); // goog.scope |
+ |