diff options
author | satorux@chromium.org <satorux@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-07-28 06:40:32 +0000 |
---|---|---|
committer | satorux@chromium.org <satorux@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-07-28 06:40:32 +0000 |
commit | 6bef62500d72324cc06201adf4d7058555e57371 (patch) | |
tree | 765a67a7fee8fec7eb9ed98412e3eb554f588e42 | |
parent | 5c738341ccfbdde425a2893f0dd5d4b26f3b3bf3 (diff) | |
download | chromium_src-6bef62500d72324cc06201adf4d7058555e57371.zip chromium_src-6bef62500d72324cc06201adf4d7058555e57371.tar.gz chromium_src-6bef62500d72324cc06201adf4d7058555e57371.tar.bz2 |
Add logic to save input method preference based on user clicks.
Along the way, add some sanity check code in language_options_list.js
to filter bad language codes, just in case.
TEST=manually
BUG=chromium-os:4573
Review URL: http://codereview.chromium.org/3051013
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@53915 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/resources/options/chromeos_language_list.js | 28 | ||||
-rw-r--r-- | chrome/browser/resources/options/chromeos_language_options.js | 91 |
2 files changed, 114 insertions, 5 deletions
diff --git a/chrome/browser/resources/options/chromeos_language_list.js b/chrome/browser/resources/options/chromeos_language_list.js index e78e029..a4f7972 100644 --- a/chrome/browser/resources/options/chromeos_language_list.js +++ b/chrome/browser/resources/options/chromeos_language_list.js @@ -43,16 +43,18 @@ cr.define('options.language', function() { * @private */ handlePrefChange_: function(e) { - this.load_(e.value); + var languageCodesInCsv = e.value; + var languageCodes = this.filterBadLanguageCodes_( + languageCodesInCsv.split(',')); + this.load_(languageCodes); }, /** * Loads given language list. - * @param {string} languageCodesInCsv A CSV string of language codes. + * @param {Array} languageCodes List of language codes. * @private */ - load_: function(languageCodesInCsv) { - var languageCodes = languageCodesInCsv.split(','); + load_: function(languageCodes) { this.dataModel = new ArrayDataModel(languageCodes); // Select the first item if it's not empty. // TODO(satorux): Switch to a single item selection model that does @@ -68,6 +70,24 @@ cr.define('options.language', function() { // Encode the language codes into a CSV string. Preferences.setStringPref(this.pref, this.dataModel.slice().join(',')); }, + + /** + * Filters bad language codes in case bad language codes are + * stored in the preference. + * @param {Array} languageCodes List of language codes. + * @private + */ + filterBadLanguageCodes_: function(languageCodes) { + var filteredLanguageCodes = []; + for (var i = 0; i < languageCodes.length; i++) { + // Check if the translation for the language code is + // present. Otherwise, skip it. + if (localStrings.getString(languageCodes[i])) { + filteredLanguageCodes.push(languageCodes[i]); + } + } + return filteredLanguageCodes; + }, }; return { diff --git a/chrome/browser/resources/options/chromeos_language_options.js b/chrome/browser/resources/options/chromeos_language_options.js index a746ffe..372a546 100644 --- a/chrome/browser/resources/options/chromeos_language_options.js +++ b/chrome/browser/resources/options/chromeos_language_options.js @@ -40,6 +40,10 @@ LanguageOptions.prototype = { }, languageListInitalized_: false, + // The preference is a CSV string that describes preload engines + // (i.e. active input methods). + preloadEnginesPref: 'settings.language.preload_engines', + preloadEngines_: [], /** * Initializes the input method list. @@ -57,7 +61,9 @@ LanguageOptions.prototype = { var input = document.createElement('input'); input.type = 'checkbox'; input.inputMethodId = inputMethod.id; - + // Listen to user clicks. + input.addEventListener('click', + cr.bind(this.handleCheckboxClick_, this)); var label = document.createElement('label'); label.appendChild(input); label.appendChild(document.createTextNode(inputMethod.displayName)); @@ -66,6 +72,9 @@ LanguageOptions.prototype = { inputMethodList.appendChild(label); } + // Listen to pref change once the input method list is initialized. + Preferences.getInstance().addEventListener(this.preloadEnginesPref, + cr.bind(this.handlePreloadEnginesPrefChange_, this)); }, /** @@ -112,5 +121,85 @@ LanguageOptions.prototype = { labels[i].style.display = 'none'; } } + }, + + /** + * Handles preloadEnginesPref change. + * @param {Event} e Change event. + * @private + */ + handlePreloadEnginesPrefChange_: function(e) { + this.preloadEngines_ = this.filterBadPreloadEngines_(e.value.split(',')); + this.updateCheckboxesFromPreloadEngines_(); + }, + + /** + * Handles input method checkbox's click event. + * @param {Event} e Click event. + * @private + */ + handleCheckboxClick_ : function(e) { + this.updatePreloadEnginesFromCheckboxes_(); + Preferences.setStringPref(this.preloadEnginesPref, + this.preloadEngines_.join(',')); + }, + + /** + * Updates the checkboxes in the input method list from the preload + * engines preference. + * @private + */ + updateCheckboxesFromPreloadEngines_: function() { + // Convert the list into a dictonary for simpler lookup. + var dictionary = {}; + for (var i = 0; i < this.preloadEngines_.length; i++) { + dictionary[this.preloadEngines_[i]] = true; + } + + var inputMethodList = $('language-options-input-method-list'); + var checkboxes = inputMethodList.querySelectorAll('input'); + for (var i = 0; i < checkboxes.length; i++) { + checkboxes[i].checked = (checkboxes[i].inputMethodId in dictionary); + } + }, + + /** + * Updates the preload engines preference from the checkboxes in the + * input method list. + * @private + */ + updatePreloadEnginesFromCheckboxes_: function() { + this.preloadEngines_ = []; + var inputMethodList = $('language-options-input-method-list'); + var checkboxes = inputMethodList.querySelectorAll('input'); + for (var i = 0; i < checkboxes.length; i++) { + if (checkboxes[i].checked) { + this.preloadEngines_.push(checkboxes[i].inputMethodId); + } + } + }, + + /** + * Filters bad preload engines in case bad preload engines are + * stored in the preference. + * @param {Array} preloadEngines List of preload engines. + * @private + */ + filterBadPreloadEngines_: function(preloadEngines) { + // Convert the list into a dictonary for simpler lookup. + var dictionary = {}; + for (var i = 0; i < templateData.inputMethodList.length; i++) { + dictionary[templateData.inputMethodList[i].id] = true; + } + + var filteredPreloadEngines = []; + for (var i = 0; i < preloadEngines.length; i++) { + // Check if the preload engine is present in the + // dictionary. Otherwise, skip it. + if (preloadEngines[i] in dictionary) { + filteredPreloadEngines.push(preloadEngines[i]); + } + } + return filteredPreloadEngines; } }; |