Update mojo sdk to rev 1dc8a9a5db73d3718d99917fadf31f5fb2ebad4f
[chromium-blink-merge.git] / third_party / google_input_tools / src / chrome / os / inputview / m17nmodel.js
blob645a32fe3f1aa087d9c0cbb95d72d0463bbff0fd
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.M17nModel');
16 goog.require('goog.events.EventHandler');
17 goog.require('goog.events.EventTarget');
18 goog.require('i18n.input.chrome.inputview.SpecNodeName');
19 goog.require('i18n.input.chrome.inputview.content.util');
20 goog.require('i18n.input.chrome.inputview.events.ConfigLoadedEvent');
21 goog.require('i18n.input.chrome.vk.KeyCode');
22 goog.require('i18n.input.chrome.vk.Model');
26 /**
27  * The model to legacy cloud vk configuration.
28  *
29  * @constructor
30  * @extends {goog.events.EventTarget}
31  */
32 i18n.input.chrome.inputview.M17nModel = function() {
33   goog.base(this);
35   /**
36    * The event handler.
37    *
38    * @type {!goog.events.EventHandler}
39    * @private
40    */
41   this.handler_ = new goog.events.EventHandler(this);
43   /**
44    * The model for cloud vk.
45    *
46    * @type {!i18n.input.chrome.vk.Model}
47    * @private
48    */
49   this.model_ = new i18n.input.chrome.vk.Model();
50   this.handler_.listen(this.model_,
51       i18n.input.chrome.vk.EventType.LAYOUT_LOADED,
52       this.onLayoutLoaded_);
54 goog.inherits(i18n.input.chrome.inputview.M17nModel,
55     goog.events.EventTarget);
58 /**
59  * The active layout view.
60  *
61  * @type {!i18n.input.chrome.vk.ParsedLayout}
62  * @private
63  */
64 i18n.input.chrome.inputview.M17nModel.prototype.layoutView_;
67 /**
68  * Loads the configuration.
69  *
70  * @param {string} lang The m17n keyboard layout code (with 'm17n:' prefix).
71  */
72 i18n.input.chrome.inputview.M17nModel.prototype.loadConfig = function(lang) {
73   var m17nMatches = lang.match(/^m17n:(.*)/);
74   if (m17nMatches && m17nMatches[1]) {
75     this.model_.loadLayout(m17nMatches[1]);
76   }
80 /**
81  * Callback when legacy model is loaded.
82  *
83  * @param {!i18n.input.chrome.vk.LayoutEvent} e The event.
84  * @private
85  */
86 i18n.input.chrome.inputview.M17nModel.prototype.onLayoutLoaded_ = function(
87     e) {
88   var layoutView = /** @type {!i18n.input.chrome.vk.ParsedLayout} */
89       (e.layoutView);
90   this.layoutView_ = layoutView;
91   var is102 = layoutView.view.is102;
92   var codes = is102 ? i18n.input.chrome.vk.KeyCode.CODES102 :
93       i18n.input.chrome.vk.KeyCode.CODES101;
94   var keyCount = is102 ? 48 : 47;
95   var keyCharacters = [];
96   for (var i = 0; i < keyCount; i++) {
97     var characters = this.findCharacters_(layoutView.view.mappings,
98         codes[i]);
99     keyCharacters.push(characters);
100   }
101   keyCharacters.push(['\u0020', '\u0020']);
102   var hasAltGrKey = !!layoutView.view.mappings['c'] &&
103       layoutView.view.mappings['c'] != layoutView.view.mappings[''];
104   var skvPrefix = is102 ? '102kbd-k-' : '101kbd-k-';
105   var skPrefix = layoutView.view.id + '-k-';
106   var data = i18n.input.chrome.inputview.content.util.createData(keyCharacters,
107       skvPrefix, is102, hasAltGrKey);
108   if (data) {
109     data[i18n.input.chrome.inputview.SpecNodeName.TITLE] =
110         layoutView.view.title;
111     data[i18n.input.chrome.inputview.SpecNodeName.ID] =
112         'm17n:' + e.layoutCode;
113     this.dispatchEvent(new i18n.input.chrome.inputview.events.
114         ConfigLoadedEvent(data));
115   }
120  * Finds out the characters for the key.
122  * @param {!Object} mappings The mappings.
123  * @param {string} code The code.
124  * @return {!Array.<string>} The characters for the code.
125  * @private
126  */
127 i18n.input.chrome.inputview.M17nModel.prototype.findCharacters_ = function(
128     mappings, code) {
129   var characters = [];
130   var states = [
131     '',
132     's',
133     'c',
134     'sc',
135     'l',
136     'sl',
137     'cl',
138     'scl'
139   ];
140   for (var i = 0; i < states.length; i++) {
141     if (mappings[states[i]] && mappings[states[i]][code]) {
142       characters[i] = mappings[states[i]][code][1];
143     } else if (code == '\u0020') {
144       characters[i] = '\u0020';
145     } else {
146       characters[i] = '';
147     }
148   }
149   return characters;
153 /** @override */
154 i18n.input.chrome.inputview.M17nModel.prototype.disposeInternal = function() {
155   goog.dispose(this.handler_);
157   goog.base(this, 'disposeInternal');