1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "chrome/browser/ui/webui/options/language_dictionary_overlay_handler.h" 6 7#include "base/bind.h" 8#include "base/values.h" 9#include "chrome/browser/profiles/profile.h" 10#include "chrome/browser/spellchecker/spellcheck_factory.h" 11#include "chrome/browser/spellchecker/spellcheck_service.h" 12#include "content/public/browser/web_ui.h" 13#include "grit/generated_resources.h" 14#include "ui/base/l10n/l10n_util.h" 15 16namespace options { 17 18LanguageDictionaryOverlayHandler::LanguageDictionaryOverlayHandler() 19 : overlay_initialized_(false), 20 dictionary_(NULL) { 21} 22 23LanguageDictionaryOverlayHandler::~LanguageDictionaryOverlayHandler() { 24} 25 26void LanguageDictionaryOverlayHandler::GetLocalizedValues( 27 base::DictionaryValue* localized_strings) { 28 RegisterTitle(localized_strings, 29 "languageDictionaryOverlayPage", 30 IDS_LANGUAGE_DICTIONARY_OVERLAY_TITLE); 31 localized_strings->SetString( 32 "languageDictionaryOverlayTitle", 33 l10n_util::GetStringUTF16(IDS_LANGUAGE_DICTIONARY_OVERLAY_TITLE)); 34 localized_strings->SetString( 35 "languageDictionaryOverlayAddWordLabel", 36 l10n_util::GetStringUTF16( 37 IDS_LANGUAGE_DICTIONARY_OVERLAY_ADD_WORD_LABEL)); 38 localized_strings->SetString( 39 "languageDictionaryOverlaySearchPlaceholder", 40 l10n_util::GetStringUTF16( 41 IDS_LANGUAGE_DICTIONARY_OVERLAY_SEARCH_PLACEHOLDER)); 42 localized_strings->SetString( 43 "languageDictionaryOverlayNoMatches", 44 l10n_util::GetStringUTF16(IDS_LANGUAGE_DICTIONARY_OVERLAY_NO_MATCHES)); 45} 46 47void LanguageDictionaryOverlayHandler::RegisterMessages() { 48 web_ui()->RegisterMessageCallback( 49 "addDictionaryWord", 50 base::Bind(&LanguageDictionaryOverlayHandler::AddWord, 51 base::Unretained(this))); 52 web_ui()->RegisterMessageCallback( 53 "removeDictionaryWord", 54 base::Bind(&LanguageDictionaryOverlayHandler::RemoveWord, 55 base::Unretained(this))); 56 web_ui()->RegisterMessageCallback( 57 "refreshDictionaryWords", 58 base::Bind(&LanguageDictionaryOverlayHandler::RefreshWords, 59 base::Unretained(this))); 60} 61 62void LanguageDictionaryOverlayHandler::Uninitialize() { 63 overlay_initialized_ = false; 64 if (dictionary_) 65 dictionary_->RemoveObserver(this); 66} 67 68void LanguageDictionaryOverlayHandler::OnCustomDictionaryLoaded() { 69 ResetDictionaryWords(); 70} 71 72void LanguageDictionaryOverlayHandler::OnCustomDictionaryChanged( 73 const SpellcheckCustomDictionary::Change& dictionary_change) { 74 base::ListValue add_words; 75 base::ListValue remove_words; 76 add_words.AppendStrings(dictionary_change.to_add()); 77 remove_words.AppendStrings(dictionary_change.to_remove()); 78 web_ui()->CallJavascriptFunction("EditDictionaryOverlay.updateWords", 79 add_words, 80 remove_words); 81} 82 83void LanguageDictionaryOverlayHandler::ResetDictionaryWords() { 84 if (!overlay_initialized_) 85 return; 86 87 if (!dictionary_) { 88 SpellcheckService* service = SpellcheckServiceFactory::GetForContext( 89 Profile::FromWebUI(web_ui())); 90 dictionary_ = service->GetCustomDictionary(); 91 dictionary_->AddObserver(this); 92 } 93 94 base::ListValue list_value; 95 const chrome::spellcheck_common::WordSet& words = dictionary_->GetWords(); 96 for (chrome::spellcheck_common::WordSet::const_iterator it = words.begin(); 97 it != words.end(); ++it) { 98 list_value.AppendString(*it); 99 } 100 web_ui()->CallJavascriptFunction("EditDictionaryOverlay.setWordList", 101 list_value); 102} 103 104void LanguageDictionaryOverlayHandler::RefreshWords( 105 const base::ListValue* args) { 106 overlay_initialized_ = true; 107 ResetDictionaryWords(); 108} 109 110void LanguageDictionaryOverlayHandler::AddWord(const base::ListValue* args) { 111 std::string new_word; 112 if (!args->GetString(0, &new_word) || new_word.empty() || !dictionary_) { 113 NOTREACHED(); 114 return; 115 } 116 dictionary_->AddWord(new_word); 117} 118 119void LanguageDictionaryOverlayHandler::RemoveWord(const base::ListValue* args) { 120 std::string old_word; 121 if (!args->GetString(0, &old_word) || old_word.empty() || !dictionary_) { 122 NOTREACHED(); 123 return; 124 } 125 dictionary_->RemoveWord(old_word); 126} 127 128} // namespace options 129