OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 /** | 5 /** |
6 * @fileoverview | 6 * @fileoverview |
7 * Class managing the host's available keyboard layouts, allowing the user to | 7 * Class managing the host's available keyboard layouts, allowing the user to |
8 * select one that matches the local layout, or auto-selecting based on the | 8 * select one that matches the local layout, or auto-selecting based on the |
9 * current locale. | 9 * current locale. |
10 */ | 10 */ |
(...skipping 24 matching lines...) Expand all Loading... |
35 /** | 35 /** |
36 * @type {string} | 36 * @type {string} |
37 * @private | 37 * @private |
38 */ | 38 */ |
39 this.currentLayout_ = ''; | 39 this.currentLayout_ = ''; |
40 | 40 |
41 adapter.addListener(this.onContextMenu_.bind(this)); | 41 adapter.addListener(this.onContextMenu_.bind(this)); |
42 }; | 42 }; |
43 | 43 |
44 /** | 44 /** |
45 * @param {Array.<string>} layouts The keyboard layouts available on the host, | 45 * @param {Array<string>} layouts The keyboard layouts available on the host, |
46 * for example en-US, de-DE | 46 * for example en-US, de-DE |
47 * @param {string} currentLayout The layout currently active on the host. | 47 * @param {string} currentLayout The layout currently active on the host. |
48 */ | 48 */ |
49 remoting.KeyboardLayoutsMenu.prototype.setLayouts = | 49 remoting.KeyboardLayoutsMenu.prototype.setLayouts = |
50 function(layouts, currentLayout) { | 50 function(layouts, currentLayout) { |
51 this.submenuManager_.removeAll(); | 51 this.submenuManager_.removeAll(); |
52 this.currentLayout_ = ''; | 52 this.currentLayout_ = ''; |
53 for (var i = 0; i < layouts.length; ++i) { | 53 for (var i = 0; i < layouts.length; ++i) { |
54 this.submenuManager_.add(this.makeMenuId_(layouts[i]), layouts[i]); | 54 this.submenuManager_.add(this.makeMenuId_(layouts[i]), layouts[i]); |
55 } | 55 } |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
91 * algorithm: | 91 * algorithm: |
92 * - Search local storage by for a preferred keyboard layout for the app; | 92 * - Search local storage by for a preferred keyboard layout for the app; |
93 * if it is found, prefer it over the current locale, falling back on the | 93 * if it is found, prefer it over the current locale, falling back on the |
94 * latter only if no match is found. | 94 * latter only if no match is found. |
95 * - If the candidate layout matches one of the supported layouts, use it. | 95 * - If the candidate layout matches one of the supported layouts, use it. |
96 * - Otherwise, if the language portion of the candidate matches that of | 96 * - Otherwise, if the language portion of the candidate matches that of |
97 * any of the supported layouts, use the first such layout (e.g, en-AU | 97 * any of the supported layouts, use the first such layout (e.g, en-AU |
98 * will match either en-US or en-GB, whichever appears first). | 98 * will match either en-US or en-GB, whichever appears first). |
99 * - Otherwise, use the host's current layout. | 99 * - Otherwise, use the host's current layout. |
100 * | 100 * |
101 * @param {Array.<string>} layouts | 101 * @param {Array<string>} layouts |
102 * @param {string} currentHostLayout | 102 * @param {string} currentHostLayout |
103 * @param {function(string):void} onDone | 103 * @param {function(string):void} onDone |
104 * @private | 104 * @private |
105 */ | 105 */ |
106 remoting.KeyboardLayoutsMenu.prototype.getBestLayout_ = | 106 remoting.KeyboardLayoutsMenu.prototype.getBestLayout_ = |
107 function(layouts, currentHostLayout, onDone) { | 107 function(layouts, currentHostLayout, onDone) { |
108 /** | 108 /** |
109 * Extract the language id from a string that is either "language" (e.g. | 109 * Extract the language id from a string that is either "language" (e.g. |
110 * "de") or "language-region" (e.g. "en-US"). | 110 * "de") or "language-region" (e.g. "en-US"). |
111 * | 111 * |
112 * @param {string} layout | 112 * @param {string} layout |
113 * @return {string} | 113 * @return {string} |
114 */ | 114 */ |
115 var getLanguage = function(layout) { | 115 var getLanguage = function(layout) { |
116 var languageAndRegion = layout.split('-'); | 116 var languageAndRegion = layout.split('-'); |
117 switch (languageAndRegion.length) { | 117 switch (languageAndRegion.length) { |
118 case 1: | 118 case 1: |
119 case 2: | 119 case 2: |
120 return languageAndRegion[0]; | 120 return languageAndRegion[0]; |
121 default: | 121 default: |
122 return ''; | 122 return ''; |
123 } | 123 } |
124 }; | 124 }; |
125 | 125 |
126 /** @param {Object.<string>} storage */ | 126 /** @param {Object<string>} storage */ |
127 var chooseLayout = function(storage) { | 127 var chooseLayout = function(storage) { |
128 var configuredLayout = storage[remoting.KeyboardLayoutsMenu.KEY_]; | 128 var configuredLayout = storage[remoting.KeyboardLayoutsMenu.KEY_]; |
129 var tryLayouts = [ chrome.i18n.getUILanguage() ]; | 129 var tryLayouts = [ chrome.i18n.getUILanguage() ]; |
130 if (configuredLayout && typeof(configuredLayout) == 'string') { | 130 if (configuredLayout && typeof(configuredLayout) == 'string') { |
131 tryLayouts.unshift(configuredLayout); | 131 tryLayouts.unshift(configuredLayout); |
132 } | 132 } |
133 for (var i = 0; i < tryLayouts.length; ++i) { | 133 for (var i = 0; i < tryLayouts.length; ++i) { |
134 if (layouts.indexOf(tryLayouts[i]) != -1) { | 134 if (layouts.indexOf(tryLayouts[i]) != -1) { |
135 onDone(tryLayouts[i]); | 135 onDone(tryLayouts[i]); |
136 return; | 136 return; |
(...skipping 26 matching lines...) Expand all Loading... |
163 return 'layout@' + layout; | 163 return 'layout@' + layout; |
164 }; | 164 }; |
165 | 165 |
166 /** | 166 /** |
167 * Handle a click on the application's context menu. | 167 * Handle a click on the application's context menu. |
168 * | 168 * |
169 * @param {OnClickData=} info | 169 * @param {OnClickData=} info |
170 * @private | 170 * @private |
171 */ | 171 */ |
172 remoting.KeyboardLayoutsMenu.prototype.onContextMenu_ = function(info) { | 172 remoting.KeyboardLayoutsMenu.prototype.onContextMenu_ = function(info) { |
173 /** @type {Array.<string>} */ | 173 /** @type {Array<string>} */ |
174 var components = info.menuItemId.split('@'); | 174 var components = info.menuItemId.split('@'); |
175 if (components.length == 2 && | 175 if (components.length == 2 && |
176 this.makeMenuId_(components[1]) == info.menuItemId) { | 176 this.makeMenuId_(components[1]) == info.menuItemId) { |
177 this.setLayout_(true, components[1]); | 177 this.setLayout_(true, components[1]); |
178 } | 178 } |
179 }; | 179 }; |
180 | 180 |
181 /** | 181 /** |
182 * @type {string} | 182 * @type {string} |
183 * @private | 183 * @private |
184 */ | 184 */ |
185 remoting.KeyboardLayoutsMenu.KEY_ = 'preferred-keyboard-layout'; | 185 remoting.KeyboardLayoutsMenu.KEY_ = 'preferred-keyboard-layout'; |
OLD | NEW |