ChildAccountService[Java] delegates everything to native side.
[chromium-blink-merge.git] / third_party / google_input_tools / src / chrome / os / inputview / config / util.js
blob928fd8cf1ed24edd73fa68ab1a0990c6ad047f55
1 // Copyright 2014 The ChromeOS IME Authors. All Rights Reserved.
2 // limitations under the License.
3 // See the License for the specific language governing permissions and
4 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
5 // distributed under the License is distributed on an "AS-IS" BASIS,
6 // Unless required by applicable law or agreed to in writing, software
7 //
8 //      http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // You may obtain a copy of the License at
11 // you may not use this file except in compliance with the License.
12 // Licensed under the Apache License, Version 2.0 (the "License");
14 goog.provide('i18n.input.chrome.inputview.content.util');
16 goog.require('goog.array');
17 goog.require('i18n.input.chrome.inputview.Css');
18 goog.require('i18n.input.chrome.inputview.Direction');
19 goog.require('i18n.input.chrome.inputview.SpecNodeName');
20 goog.require('i18n.input.chrome.inputview.StateType');
21 goog.require('i18n.input.chrome.inputview.elements.ElementType');
23 goog.scope(function() {
24 var ElementType = i18n.input.chrome.inputview.elements.ElementType;
25 var SpecNodeName = i18n.input.chrome.inputview.SpecNodeName;
28 /**
29  * The prefix of the key id.
30  *
31  * @type {string}
32  * @private
33  */
34 i18n.input.chrome.inputview.content.util.keyIdPrefix_ = 'sk-';
37 /**
38  * Creates the hide keyboard key.
39  *
40  * @return {!Object} The hide keyboard key.
41  */
42 i18n.input.chrome.inputview.content.util.createHideKeyboardKey = function() {
43   var spec = {};
44   spec[SpecNodeName.ICON_CSS_CLASS] =
45       i18n.input.chrome.inputview.Css.HIDE_KEYBOARD_ICON;
46   spec[SpecNodeName.TYPE] = ElementType.HIDE_KEYBOARD_KEY;
47   spec[SpecNodeName.ID] = 'HideKeyboard';
48   return i18n.input.chrome.inputview.content.util.createKey(spec);
52 /**
53  * Creates a shift key.
54  *
55  * @param {boolean} isLeft True if this is the left shift key.
56  * @param {boolean=} opt_supportSticky True if support sticky shift key.
57  * @return {!Object} The shift key.
58  */
59 i18n.input.chrome.inputview.content.util.createShiftKey = function(isLeft,
60     opt_supportSticky) {
61   var spec = {};
62   spec[SpecNodeName.TO_STATE] = i18n.input.chrome.inputview.StateType.SHIFT;
63   spec[SpecNodeName.ICON_CSS_CLASS] =
64       i18n.input.chrome.inputview.Css.SHIFT_ICON;
65   spec[SpecNodeName.TYPE] = ElementType.MODIFIER_KEY;
66   spec[SpecNodeName.ID] = isLeft ? 'ShiftLeft' : 'ShiftRight';
67   spec[SpecNodeName.SUPPORT_STICKY] = !!opt_supportSticky;
68   return i18n.input.chrome.inputview.content.util.createKey(spec);
72 /**
73  * Creates a globe key.
74  *
75  * @return {!Object} The globe key.
76  */
77 i18n.input.chrome.inputview.content.util.createGlobeKey = function() {
78   var spec = {};
79   spec[SpecNodeName.ICON_CSS_CLASS] =
80       i18n.input.chrome.inputview.Css.GLOBE_ICON;
81   spec[SpecNodeName.TYPE] = ElementType.GLOBE_KEY;
82   spec[SpecNodeName.ID] = 'Globe';
83   return i18n.input.chrome.inputview.content.util.createKey(spec);
87 /**
88  * Creates a menu key.
89  *
90  * @param {string=} opt_toKeyset The compact keyboard id.
91  * @return {!Object} The menu key.
92  */
93 i18n.input.chrome.inputview.content.util.createMenuKey = function(
94     opt_toKeyset) {
95   var spec = {};
96   spec[SpecNodeName.ICON_CSS_CLASS] =
97       i18n.input.chrome.inputview.Css.MENU_ICON;
98   spec[SpecNodeName.TO_KEYSET] = opt_toKeyset;
99   spec[SpecNodeName.TYPE] = ElementType.MENU_KEY;
100   spec[SpecNodeName.ID] = 'Menu';
101   return i18n.input.chrome.inputview.content.util.createKey(spec);
106  * Create the  Emoji switch key.
108  * @param {string} id The emoji key id.
109  * @param {number} toKeyset The keyset that the tabbar represents.
110  * @param {i18n.input.chrome.inputview.Css}
111  *     iconCssClass The icon css for the tabbar.
112  * @return {!Object} The emoji key.
113  */
114 i18n.input.chrome.inputview.content.util.createTabBarKey =
115     function(id, toKeyset, iconCssClass) {
116   var spec = {};
117   spec[SpecNodeName.ICON_CSS_CLASS] = iconCssClass;
118   spec[SpecNodeName.TYPE] = ElementType.TAB_BAR_KEY;
119   spec[SpecNodeName.ID] = id;
120   spec[SpecNodeName.TO_KEYSET] = toKeyset;
121   return i18n.input.chrome.inputview.content.util.createKey(spec);
126  * Create the indicator
128  * @param {string} id The indicator id.
129  * @return {!Object} The indicator.
130  */
131 i18n.input.chrome.inputview.content.util.createPageIndicator =
132     function(id) {
133   var spec = {};
134   spec[SpecNodeName.TYPE] = ElementType.PAGE_INDICATOR;
135   spec[SpecNodeName.ID] = id;
136   return i18n.input.chrome.inputview.content.util.createKey(spec);
141  * Create the back key for emoji
143  * @return {!Object} The back key.
144  */
145 i18n.input.chrome.inputview.content.util.createBackKey = function() {
146   var spec = {};
147   spec[SpecNodeName.ICON_CSS_CLASS] =
148       i18n.input.chrome.inputview.Css.EMOJI_BACK;
149   spec[SpecNodeName.TYPE] = ElementType.BACK_BUTTON;
150   spec[SpecNodeName.ID] = 'backkey';
151   return i18n.input.chrome.inputview.content.util.createKey(spec);
156  * Create the key which leads to keyboard from emoji/hwt.
158  * @return {!Object} The back key.
159  */
160 i18n.input.chrome.inputview.content.util.createBackToKeyboardKey = function() {
161   var spec = {};
162   spec[SpecNodeName.ICON_CSS_CLASS] =
163       i18n.input.chrome.inputview.Css.BACK_TO_KEYBOARD_ICON;
164   spec[SpecNodeName.TYPE] = ElementType.BACK_TO_KEYBOARD;
165   spec[SpecNodeName.ID] = 'backToKeyboard';
166   return i18n.input.chrome.inputview.content.util.createKey(spec);
171  * Creates a ctrl key.
173  * @return {!Object} The ctrl key.
174  */
175 i18n.input.chrome.inputview.content.util.createCtrlKey = function() {
176   var spec = {};
177   spec[SpecNodeName.TO_STATE] = i18n.input.chrome.inputview.StateType.CTRL;
178   spec[SpecNodeName.NAME] = 'ctrl';
179   spec[SpecNodeName.TYPE] = ElementType.MODIFIER_KEY;
180   spec[SpecNodeName.ID] = 'ControlLeft';
181   return i18n.input.chrome.inputview.content.util.createKey(spec);
186  * Creates a alt key.
188  * @return {!Object} The alt key.
189  */
190 i18n.input.chrome.inputview.content.util.createAltKey = function() {
191   var spec = {};
192   spec[SpecNodeName.TO_STATE] = i18n.input.chrome.inputview.StateType.ALT;
193   spec[SpecNodeName.NAME] = 'alt';
194   spec[SpecNodeName.TYPE] = ElementType.MODIFIER_KEY;
195   spec[SpecNodeName.ID] = 'AltLeft';
196   return i18n.input.chrome.inputview.content.util.createKey(spec);
201  * Creates a altgr key.
203  * @return {!Object} The altgr key.
204  */
205 i18n.input.chrome.inputview.content.util.createAltgrKey = function() {
206   var spec = {};
207   spec[SpecNodeName.TO_STATE] = i18n.input.chrome.inputview.StateType.ALTGR;
208   spec[SpecNodeName.NAME] = 'alt gr';
209   spec[SpecNodeName.TYPE] = ElementType.MODIFIER_KEY;
210   spec[SpecNodeName.ID] = 'AltRight';
211   return i18n.input.chrome.inputview.content.util.createKey(spec);
216  * Creates a key used to switch to english.
218  * @return {!Object} The enSwitcher key.
219  */
220 i18n.input.chrome.inputview.content.util.createEnSwitcherKey =
221     function() {
222   var spec = {};
223   spec[SpecNodeName.TYPE] = ElementType.EN_SWITCHER;
224   spec[SpecNodeName.ID] = 'enSwitcher';
225   return i18n.input.chrome.inputview.content.util.createKey(spec);
230  * Creates a capslock key.
232  * @return {!Object} The capslock key.
233  */
234 i18n.input.chrome.inputview.content.util.createCapslockKey = function() {
235   var spec = {};
236   spec[SpecNodeName.TO_STATE] = i18n.input.chrome.inputview.StateType.CAPSLOCK;
237   spec[SpecNodeName.NAME] = 'caps lock';
238   spec[SpecNodeName.TYPE] = ElementType.MODIFIER_KEY;
239   spec[SpecNodeName.ID] = 'OsLeft';
240   return i18n.input.chrome.inputview.content.util.createKey(spec);
245  * Creates a enter key.
247  * @return {!Object} The enter key.
248  */
249 i18n.input.chrome.inputview.content.util.createEnterKey = function() {
250   var spec = {};
251   spec[SpecNodeName.ICON_CSS_CLASS] =
252       i18n.input.chrome.inputview.Css.ENTER_ICON;
253   spec[SpecNodeName.TYPE] = ElementType.ENTER_KEY;
254   spec[SpecNodeName.ID] = 'Enter';
255   return i18n.input.chrome.inputview.content.util.createKey(spec);
260  * Creates a tab key.
262  * @return {!Object} The tab key.
263  */
264 i18n.input.chrome.inputview.content.util.createTabKey = function() {
265   var spec = {};
266   spec[SpecNodeName.ICON_CSS_CLASS] = i18n.input.chrome.inputview.Css.TAB_ICON;
267   spec[SpecNodeName.TYPE] = ElementType.TAB_KEY;
268   spec[SpecNodeName.ID] = 'Tab';
269   return i18n.input.chrome.inputview.content.util.createKey(spec);
274  * Creates a backspace key.
276  * @return {!Object} The backspace key.
277  */
278 i18n.input.chrome.inputview.content.util.createBackspaceKey = function() {
279   var spec = {};
280   spec[SpecNodeName.ICON_CSS_CLASS] =
281       i18n.input.chrome.inputview.Css.BACKSPACE_ICON;
282   spec[SpecNodeName.TYPE] = ElementType.BACKSPACE_KEY;
283   spec[SpecNodeName.ID] = 'Backspace';
284   return i18n.input.chrome.inputview.content.util.createKey(spec);
289  * Creates a space key.
291  * @return {!Object} The space key.
292  */
293 i18n.input.chrome.inputview.content.util.createSpaceKey = function() {
294   var spec = {};
295   spec[SpecNodeName.NAME] = ' ';
296   spec[SpecNodeName.TYPE] = ElementType.SPACE_KEY;
297   spec[SpecNodeName.ID] = 'Space';
298   return i18n.input.chrome.inputview.content.util.createKey(spec);
303  * Create an IME switch key.
305  * @param {string} id .
306  * @param {string} name .
307  * @param {string} css .
308  * @return {!Object} The JP IME switch key.
309  */
310 i18n.input.chrome.inputview.content.util.createIMESwitchKey =
311     function(id, name, css) {
312   var spec = {};
313   spec[SpecNodeName.NAME] = name;
314   spec[SpecNodeName.TYPE] = ElementType.IME_SWITCH;
315   spec[SpecNodeName.ID] = id;
316   spec[SpecNodeName.TEXT_CSS_CLASS] = css;
317   return i18n.input.chrome.inputview.content.util.createKey(spec);
322  * Creates a normal key.
324  * @param {!Object} spec The specification.
325  * @return {!Object} The normal key.
326  */
327 i18n.input.chrome.inputview.content.util.createNormalKey = function(spec) {
328   spec[SpecNodeName.TYPE] = ElementType.CHARACTER_KEY;
329   return i18n.input.chrome.inputview.content.util.createKey(spec);
334  * Creates an arrow key.
336  * @param {!i18n.input.chrome.inputview.Direction} direction The direction.
337  * @return {!Object} The arrow key.
338  */
339 i18n.input.chrome.inputview.content.util.createArrowKey = function(direction) {
340   var spec = {};
341   spec[SpecNodeName.ICON_CSS_CLASS] =
342       i18n.input.chrome.inputview.Css.ARROW_KEY + ' ';
343   if (direction == i18n.input.chrome.inputview.Direction.UP) {
344     spec[SpecNodeName.ID] = 'ArrowUp';
345     spec[SpecNodeName.ICON_CSS_CLASS] += i18n.input.chrome.inputview.Css.UP_KEY;
346     spec[SpecNodeName.TYPE] = ElementType.ARROW_UP;
347   } else if (direction == i18n.input.chrome.inputview.Direction.DOWN) {
348     spec[SpecNodeName.ID] = 'ArrowDown';
349     spec[SpecNodeName.ICON_CSS_CLASS] +=
350         i18n.input.chrome.inputview.Css.DOWN_KEY;
351     spec[SpecNodeName.TYPE] = ElementType.ARROW_DOWN;
352   } else if (direction == i18n.input.chrome.inputview.Direction.LEFT) {
353     spec[SpecNodeName.ID] = 'ArrowLeft';
354     spec[SpecNodeName.ICON_CSS_CLASS] +=
355         i18n.input.chrome.inputview.Css.LEFT_KEY;
356     spec[SpecNodeName.TYPE] = ElementType.ARROW_LEFT;
357   } else if (direction == i18n.input.chrome.inputview.Direction.RIGHT) {
358     spec[SpecNodeName.ID] = 'ArrowRight';
359     spec[SpecNodeName.ICON_CSS_CLASS] +=
360         i18n.input.chrome.inputview.Css.RIGHT_KEY;
361     spec[SpecNodeName.TYPE] = ElementType.ARROW_RIGHT;
362   }
363   return i18n.input.chrome.inputview.content.util.createKey(spec);
368  * Creates a soft key.
370  * @param {!Object} spec The specification.
371  * @return {!Object} The soft key.
372  */
373 i18n.input.chrome.inputview.content.util.createKey = function(spec) {
374   var newSpec = {};
375   for (var key in spec) {
376     newSpec[key] = spec[key];
377   }
378   return {
379     'spec': newSpec
380   };
385  * The physical key codes.
387  * @type {!Array.<string>}
388  */
389 i18n.input.chrome.inputview.content.util.KEY_CODES_101 = [
390   'Backquote',
391   'Digit1',
392   'Digit2',
393   'Digit3',
394   'Digit4',
395   'Digit5',
396   'Digit6',
397   'Digit7',
398   'Digit8',
399   'Digit9',
400   'Digit0',
401   'Minus',
402   'Equal',
403   'KeyQ',
404   'KeyW',
405   'KeyE',
406   'KeyR',
407   'KeyT',
408   'KeyY',
409   'KeyU',
410   'KeyI',
411   'KeyO',
412   'KeyP',
413   'BracketLeft',
414   'BracketRight',
415   'Backslash',
416   'KeyA',
417   'KeyS',
418   'KeyD',
419   'KeyF',
420   'KeyG',
421   'KeyH',
422   'KeyJ',
423   'KeyK',
424   'KeyL',
425   'Semicolon',
426   'Quote',
427   'KeyZ',
428   'KeyX',
429   'KeyC',
430   'KeyV',
431   'KeyB',
432   'KeyN',
433   'KeyM',
434   'Comma',
435   'Period',
436   'Slash'
441  * The physical key codes for 102 keyboard.
443  * @type {!Array.<string>}
444  */
445 i18n.input.chrome.inputview.content.util.KEY_CODES_102 = [
446   'Backquote',
447   'Digit1',
448   'Digit2',
449   'Digit3',
450   'Digit4',
451   'Digit5',
452   'Digit6',
453   'Digit7',
454   'Digit8',
455   'Digit9',
456   'Digit0',
457   'Minus',
458   'Equal',
459   'KeyQ',
460   'KeyW',
461   'KeyE',
462   'KeyR',
463   'KeyT',
464   'KeyY',
465   'KeyU',
466   'KeyI',
467   'KeyO',
468   'KeyP',
469   'BracketLeft',
470   'BracketRight',
471   'KeyA',
472   'KeyS',
473   'KeyD',
474   'KeyF',
475   'KeyG',
476   'KeyH',
477   'KeyJ',
478   'KeyK',
479   'KeyL',
480   'Semicolon',
481   'Quote',
482   'Backslash',
483   'IntlBackslash',
484   'KeyZ',
485   'KeyX',
486   'KeyC',
487   'KeyV',
488   'KeyB',
489   'KeyN',
490   'KeyM',
491   'Comma',
492   'Period',
493   'Slash'
498  * Creates the key data.
500  * @param {!Array.<!Array.<string>>} keyCharacters The key characters.
501  * @param {string} viewIdPrefix The prefix of the view.
502  * @param {boolean} is102 True if it is a 102 keyboard.
503  * @param {boolean} hasAltGrKey True if there is altgr key.
504  * @param {!Array.<!Array.<number>>=} opt_keyCodes The key codes.
505  * @param {string=} opt_compactKeyboardId The compact keyboard id.
506  * @return {!Object} The key data.
507  */
508 i18n.input.chrome.inputview.content.util.createData = function(keyCharacters,
509     viewIdPrefix, is102, hasAltGrKey, opt_keyCodes, opt_compactKeyboardId) {
510   var keyList = [];
511   var mapping = {};
512   var keyCodes = opt_keyCodes || [];
513   var keyIds = is102 ? i18n.input.chrome.inputview.content.util.KEY_CODES_102 :
514       i18n.input.chrome.inputview.content.util.KEY_CODES_101;
515   // The keys shows the shift character in Default state. In material design,
516   // Only the first 11 keys will show shift character.
517   var keysShowShift = 11;
518   for (var i = 0; i < keyCharacters.length - 1; i++) {
519     var spec = {};
520     spec[SpecNodeName.ID] = keyIds[i];
521     spec[SpecNodeName.TYPE] = ElementType.CHARACTER_KEY;
522     spec[SpecNodeName.CHARACTERS] = keyCharacters[i];
523     spec[SpecNodeName.KEY_CODE] = keyCodes[i];
524     if (i < keysShowShift) {
525       spec[SpecNodeName.ENABLE_SHIFT_RENDERING] = true;
526     }
527     var key = i18n.input.chrome.inputview.content.util.createKey(spec);
528     keyList.push(key);
529   }
531   i18n.input.chrome.inputview.content.util.insertModifierKeys_(keyList,
532       is102, opt_compactKeyboardId);
533   for (var i = 0; i < keyList.length; i++) {
534     var key = keyList[i];
535     mapping[key['spec'][SpecNodeName.ID]] = viewIdPrefix + i;
536   }
537   var layout = is102 ? '102kbd' : '101kbd';
538   var result = [];
539   result[SpecNodeName.KEY_LIST] = keyList;
540   result[SpecNodeName.MAPPING] = mapping;
541   result[SpecNodeName.LAYOUT] = layout;
542   result[SpecNodeName.HAS_ALTGR_KEY] = hasAltGrKey;
543   result[SpecNodeName.SHOW_MENU_KEY] = true;
544   return result;
549  * Creates a switcher key which will switch between keyboards.
551  * @param {string} id The id.
552  * @param {string} name The name.
553  * @param {string|undefined} toKeyset The id of keyset this swicher key should
554  *     switch to.
555  * @param {string} toKeysetName The name of the keyset.
556  * @param {string=} opt_iconCssClass The css class for the icon.
557  * @param {boolean=} opt_record True to record and next time the keyset will
558  *     be recalled.
559  * @return {!Object} The switcher key.
560  */
561 i18n.input.chrome.inputview.content.util.createSwitcherKey = function(
562     id, name, toKeyset, toKeysetName, opt_iconCssClass, opt_record) {
563   var spec = {};
564   spec[SpecNodeName.ID] = id;
565   spec[SpecNodeName.NAME] = name;
566   spec[SpecNodeName.TO_KEYSET] = toKeyset;
567   spec[SpecNodeName.TO_KEYSET_NAME] = toKeysetName;
568   spec[SpecNodeName.ICON_CSS_CLASS] = opt_iconCssClass;
569   spec[SpecNodeName.TYPE] = ElementType.SWITCHER_KEY;
570   spec[SpecNodeName.RECORD] = !!opt_record;
571   return i18n.input.chrome.inputview.content.util.createKey(spec);
576  * Inserts modifier keys into the key list.
578  * @param {!Array.<!Object>} keyList The key list.
579  * @param {boolean} is102 True if it is a 102 keyboard.
580  * @param {string=} opt_compactKeyboardId The compact keyboard id.
581  * @private
582  */
583 i18n.input.chrome.inputview.content.util.insertModifierKeys_ = function(
584     keyList, is102, opt_compactKeyboardId) {
585   goog.array.insertAt(keyList, i18n.input.chrome.inputview.content.util.
586       createBackspaceKey(), 13);
587   goog.array.insertAt(keyList, i18n.input.chrome.inputview.content.util.
588       createTabKey(), 14);
589   goog.array.insertAt(keyList, i18n.input.chrome.inputview.content.util.
590       createCapslockKey(), is102 ? 27 : 28);
591   goog.array.insertAt(keyList, i18n.input.chrome.inputview.content.util.
592       createEnterKey(), 40);
593   goog.array.insertAt(keyList, i18n.input.chrome.inputview.content.util.
594       createShiftKey(true), 41);
595   keyList.push(i18n.input.chrome.inputview.content.util.createShiftKey(false));
596   i18n.input.chrome.inputview.content.util.addLastRowKeys(
597       keyList, is102, opt_compactKeyboardId);
602  * Inserts modifier keys into the key list.
604  * @param {!Array.<!Object>} keyList The key list.
605  * @param {boolean} is102 True if it is a 102 keyboard.
606  * @param {string=} opt_compactKeyboardId The compact keyboard id.
607  */
608 i18n.input.chrome.inputview.content.util.addLastRowKeys =
609     function(keyList, is102, opt_compactKeyboardId) {
610   keyList.push(i18n.input.chrome.inputview.content.util.createGlobeKey());
611   keyList.push(i18n.input.chrome.inputview.content.util.createMenuKey(
612       opt_compactKeyboardId));
613   keyList.push(i18n.input.chrome.inputview.content.util.createCtrlKey());
614   keyList.push(i18n.input.chrome.inputview.content.util.createAltKey());
615   keyList.push(i18n.input.chrome.inputview.content.util.createSpaceKey());
616   keyList.push(i18n.input.chrome.inputview.content.util.createEnSwitcherKey());
617   keyList.push(i18n.input.chrome.inputview.content.util.createAltgrKey());
618   keyList.push(i18n.input.chrome.inputview.content.util.createArrowKey(
619       i18n.input.chrome.inputview.Direction.LEFT));
620   keyList.push(i18n.input.chrome.inputview.content.util.createArrowKey(
621       i18n.input.chrome.inputview.Direction.RIGHT));
622   keyList.push(i18n.input.chrome.inputview.content.util.
623       createHideKeyboardKey());
625 });  // goog.scope