diff options
author | glotov@google.com <glotov@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-04-21 09:39:54 +0000 |
---|---|---|
committer | glotov@google.com <glotov@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-04-21 09:39:54 +0000 |
commit | 9dc43cd47ddbda46518f6a94d9286fb79fd06755 (patch) | |
tree | b4e539877dfa20dc7836695627b10ac81a2089d9 /chrome | |
parent | 5aa306363795ac82639aa25e3dfc5f181e3a1993 (diff) | |
download | chromium_src-9dc43cd47ddbda46518f6a94d9286fb79fd06755.zip chromium_src-9dc43cd47ddbda46518f6a94d9286fb79fd06755.tar.gz chromium_src-9dc43cd47ddbda46518f6a94d9286fb79fd06755.tar.bz2 |
Implementation details of 1596023 (UI Language switch implemented).
DEPENDS_ON=1648004 (http://codereview.chromium.org/1648004/show)
DEPENDS_ON=1596023 (http://codereview.chromium.org/1596023/show)
DEPENDS_ON=1568033 (http://codereview.chromium.org/1568033/show)
BUG=none
TEST=none
Review URL: http://codereview.chromium.org/1551029
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@45172 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
12 files changed, 72 insertions, 116 deletions
diff --git a/chrome/browser/chromeos/login/background_view.cc b/chrome/browser/chromeos/login/background_view.cc index d5d9c3a..2c2afe8 100644 --- a/chrome/browser/chromeos/login/background_view.cc +++ b/chrome/browser/chromeos/login/background_view.cc @@ -30,17 +30,6 @@ BackgroundView::BackgroundView() : status_area_(NULL), did_paint_(false) { InitStatusArea(); } -void BackgroundView::Init() { - InitStatusArea(); - Layout(); - status_area_->SchedulePaint(); -} - -void BackgroundView::Teardown() { - RemoveAllChildViews(true); - status_area_ = NULL; -} - static void ResetXCursor() { // TODO(sky): nuke this once new window manager is in place. // This gets rid of the ugly X default cursor. @@ -120,6 +109,11 @@ bool BackgroundView::IsButtonVisible(const views::View* button_view) const { return true; } +void BackgroundView::LocaleChanged() { + Layout(); + SchedulePaint(); +} + void BackgroundView::InitStatusArea() { DCHECK(status_area_ == NULL); status_area_ = new StatusAreaView(this); diff --git a/chrome/browser/chromeos/login/background_view.h b/chrome/browser/chromeos/login/background_view.h index 27dacd7..ca2d340 100644 --- a/chrome/browser/chromeos/login/background_view.h +++ b/chrome/browser/chromeos/login/background_view.h @@ -24,21 +24,18 @@ class BackgroundView : public views::View, public StatusAreaHost { public: BackgroundView(); - // Initializes child views of background view. - void Init(); - // Deletes child views of background view. - void Teardown(); - // Creates a window containing an instance of WizardContentsView as the root // view. The caller is responsible for showing (and closing) the returned // widget. The BackgroundView is set in |view|. static views::Widget* CreateWindowContainingView(const gfx::Rect& bounds, BackgroundView** view); + protected: // Overridden from views::View: virtual void Paint(gfx::Canvas* canvas); virtual void Layout(); virtual void ChildPreferredSizeChanged(View* child); + virtual void LocaleChanged(); // Overridden from StatusAreaHost: virtual Profile* GetProfile() const { return NULL; } diff --git a/chrome/browser/chromeos/login/language_switch_model.cc b/chrome/browser/chromeos/login/language_switch_model.cc index 2033346..4a2c29c 100644 --- a/chrome/browser/chromeos/login/language_switch_model.cc +++ b/chrome/browser/chromeos/login/language_switch_model.cc @@ -5,43 +5,51 @@ #include "chrome/browser/chromeos/login/language_switch_model.h" #include "app/l10n_util.h" +#include "app/resource_bundle.h" #include "base/utf_string_conversions.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/chromeos/login/screen_observer.h" #include "chrome/browser/pref_service.h" #include "chrome/common/pref_names.h" #include "grit/generated_resources.h" +#include "views/widget/widget_gtk.h" namespace { + const int kLanguageMainMenuSize = 5; +// TODO(glotov): need to specify the list as a part of the image customization. +const char kLanguagesTopped[] = "es,it,de,fr,en-US"; + } // namespace namespace chromeos { -LanguageSwitchModel::LanguageSwitchModel(ScreenObserver* observer, - ScreenObserver::ExitCodes new_state) +LanguageSwitchModel::LanguageSwitchModel() : ALLOW_THIS_IN_INITIALIZER_LIST(menu_model_(this)), - ALLOW_THIS_IN_INITIALIZER_LIST(menu_model_submenu_(this)), - menu_(NULL), - observer_(observer), - new_state_(new_state) { - // TODO(glotov): need to specify the following list as a part of the - // image customization. - language_list_.CopySpecifiedLanguagesUp("es,it,de,fr,en-US"); + ALLOW_THIS_IN_INITIALIZER_LIST(menu_model_submenu_(this)) { } void LanguageSwitchModel::InitLanguageMenu() { + // Update LanguageList to contain entries in current locale. + language_list_.reset(new LanguageList); + language_list_->CopySpecifiedLanguagesUp(kLanguagesTopped); + + // Clear older menu items. + menu_model_.Clear(); + menu_model_submenu_.Clear(); + + // Fill menu items with updated items. for (int line = 0; line != kLanguageMainMenuSize; line++) { menu_model_.AddItem( - line, WideToUTF16(language_list_.GetLanguageNameAt(line))); + line, WideToUTF16(language_list_->GetLanguageNameAt(line))); } menu_model_.AddSeparator(); menu_model_.AddSubMenu(WideToUTF16(l10n_util::GetString(IDS_LANGUAGES_MORE)), &menu_model_submenu_); for (int line = kLanguageMainMenuSize; - line != language_list_.get_languages_count(); line++) { + line != language_list_->get_languages_count(); line++) { menu_model_submenu_.AddItem( - line, WideToUTF16(language_list_.GetLanguageNameAt(line))); + line, WideToUTF16(language_list_->GetLanguageNameAt(line))); } // Initialize menu here so it appears fast when called. @@ -51,8 +59,8 @@ void LanguageSwitchModel::InitLanguageMenu() { std::wstring LanguageSwitchModel::GetCurrentLocaleName() const { DCHECK(g_browser_process); const std::string locale = g_browser_process->GetApplicationLocale(); - return language_list_.GetLanguageNameAt( - language_list_.GetIndexFromLocale(locale)); + return language_list_->GetLanguageNameAt( + language_list_->GetIndexFromLocale(locale)); }; //////////////////////////////////////////////////////////////////////////////// @@ -80,14 +88,30 @@ bool LanguageSwitchModel::GetAcceleratorForCommandId( } void LanguageSwitchModel::ExecuteCommand(int command_id) { - const std::string locale = language_list_.GetLocaleFromIndex(command_id); + const std::string locale = language_list_->GetLocaleFromIndex(command_id); + SwitchLanguage(locale); + InitLanguageMenu(); + + // Update all view hierarchies that the locale has changed. + views::Widget::NotifyLocaleChanged(); +} + +//////////////////////////////////////////////////////////////////////////////// +// Private implementation. + +// static +void LanguageSwitchModel::SwitchLanguage(const std::string& locale) { + // Save new locale. DCHECK(g_browser_process); PrefService* prefs = g_browser_process->local_state(); prefs->SetString(prefs::kApplicationLocale, UTF8ToWide(locale)); prefs->SavePersistentPrefs(); - observer_->OnSwitchLanguage(locale, new_state_); - // Don't do anything here because |this| has just been deleted in order - // to force releasing all locale-specific data. + + // Switch the locale. + ResourceBundle::ReloadSharedInstance(UTF8ToWide(locale)); + + // The following line does not seem to affect locale anyhow. Maybe in future.. + g_browser_process->SetApplicationLocale(locale); } } // namespace chromeos diff --git a/chrome/browser/chromeos/login/language_switch_model.h b/chrome/browser/chromeos/login/language_switch_model.h index 1d46bec..09155c5 100644 --- a/chrome/browser/chromeos/login/language_switch_model.h +++ b/chrome/browser/chromeos/login/language_switch_model.h @@ -8,11 +8,14 @@ #include <string> #include "app/menus/simple_menu_model.h" -#include "chrome/browser/chromeos/login/screen_observer.h" +#include "base/scoped_ptr.h" #include "chrome/browser/language_combobox_model.h" #include "views/controls/menu/menu_2.h" #include "views/controls/menu/view_menu_delegate.h" #include "views/view.h" +#include "testing/gtest/include/gtest/gtest_prod.h" + +class WizardControllerTest_SwitchLanguage_Test; namespace chromeos { @@ -21,8 +24,7 @@ class ScreenObserver; class LanguageSwitchModel : public views::ViewMenuDelegate, public menus::SimpleMenuModel::Delegate { public: - LanguageSwitchModel(ScreenObserver* observer, - ScreenObserver::ExitCodes new_state); + LanguageSwitchModel(); // Initializes language selection menu contents. void InitLanguageMenu(); @@ -41,19 +43,18 @@ class LanguageSwitchModel : public views::ViewMenuDelegate, menus::Accelerator* accelerator); virtual void ExecuteCommand(int command_id); + // Switches the current locale, saves the new locale in preferences. + static void SwitchLanguage(const std::string& locale); + // Dialog controls that we own ourselves. menus::SimpleMenuModel menu_model_; menus::SimpleMenuModel menu_model_submenu_; scoped_ptr<views::Menu2> menu_; - // Notifications receiver. - ScreenObserver* observer_; - // Language locale name storage. - LanguageList language_list_; - - ScreenObserver::ExitCodes new_state_; + scoped_ptr<LanguageList> language_list_; + FRIEND_TEST(::WizardControllerTest, SwitchLanguage); DISALLOW_COPY_AND_ASSIGN(LanguageSwitchModel); }; diff --git a/chrome/browser/chromeos/login/login_manager_view.cc b/chrome/browser/chromeos/login/login_manager_view.cc index 67fbf99..eb365e7 100644 --- a/chrome/browser/chromeos/login/login_manager_view.cc +++ b/chrome/browser/chromeos/login/login_manager_view.cc @@ -83,9 +83,7 @@ LoginManagerView::LoginManagerView(ScreenObserver* observer) observer_(observer), error_id_(-1), ALLOW_THIS_IN_INITIALIZER_LIST(focus_grabber_factory_(this)), - focus_delayed_(false), - language_switch_model_(observer, - ScreenObserver::LANGUAGE_CHANGED_ON_LOGIN) { + focus_delayed_(false) { // Create login observer to record time of login when successful. LogLoginSuccessObserver::Get(); if (kStubOutLogin) @@ -205,6 +203,12 @@ void LoginManagerView::UpdateLocalizedStrings() { languages_menubutton_->SetText(language_switch_model_.GetCurrentLocaleName()); } +void LoginManagerView::LocaleChanged() { + UpdateLocalizedStrings(); + Layout(); + SchedulePaint(); +} + void LoginManagerView::RequestFocus() { MessageLoop::current()->PostTask(FROM_HERE, focus_grabber_factory_.NewRunnableMethod( diff --git a/chrome/browser/chromeos/login/login_manager_view.h b/chrome/browser/chromeos/login/login_manager_view.h index 812699c..540262a 100644 --- a/chrome/browser/chromeos/login/login_manager_view.h +++ b/chrome/browser/chromeos/login/login_manager_view.h @@ -98,6 +98,7 @@ class LoginManagerView : public views::View, virtual void NativeViewHierarchyChanged(bool attached, gfx::NativeView native_view, views::RootView* root_view); + virtual void LocaleChanged(); private: // Given a |username| and |password|, this method attempts to authenticate to diff --git a/chrome/browser/chromeos/login/mock_screen_observer.h b/chrome/browser/chromeos/login/mock_screen_observer.h index a092ad1..1df4106 100644 --- a/chrome/browser/chromeos/login/mock_screen_observer.h +++ b/chrome/browser/chromeos/login/mock_screen_observer.h @@ -19,8 +19,6 @@ class MockScreenObserver : public ScreenObserver { MockScreenObserver() {} virtual ~MockScreenObserver() {} MOCK_METHOD1(OnExit, void(ExitCodes)); - MOCK_METHOD2(OnSwitchLanguage, void(const std::string&, - ScreenObserver::ExitCodes)); MOCK_METHOD2(OnSetUserNamePassword, void(const std::string&, const std::string&)); }; diff --git a/chrome/browser/chromeos/login/network_screen.cc b/chrome/browser/chromeos/login/network_screen.cc index 5ebc2d1c..7468e70 100644 --- a/chrome/browser/chromeos/login/network_screen.cc +++ b/chrome/browser/chromeos/login/network_screen.cc @@ -24,9 +24,7 @@ NetworkScreen::NetworkScreen(WizardScreenDelegate* delegate, bool is_out_of_box) : ViewScreen<NetworkSelectionView>(delegate), is_network_subscribed_(false), is_out_of_box_(is_out_of_box), - ALLOW_THIS_IN_INITIALIZER_LIST(task_factory_(this)), - language_switch_model_(delegate->GetObserver(this), - ScreenObserver::LANGUAGE_CHANGED_ON_NETWORK) { + ALLOW_THIS_IN_INITIALIZER_LIST(task_factory_(this)) { } NetworkScreen::~NetworkScreen() { diff --git a/chrome/browser/chromeos/login/screen_observer.h b/chrome/browser/chromeos/login/screen_observer.h index 4bd34fb..8c1f6e3 100644 --- a/chrome/browser/chromeos/login/screen_observer.h +++ b/chrome/browser/chromeos/login/screen_observer.h @@ -26,8 +26,6 @@ class ScreenObserver { ACCOUNT_CREATE_BACK, ACCOUNT_CREATED, CONNECTION_FAILED, - LANGUAGE_CHANGED_ON_LOGIN, - LANGUAGE_CHANGED_ON_NETWORK, UPDATE_INSTALLED, UPDATE_NOUPDATE, UPDATE_NETWORK_ERROR, @@ -38,12 +36,6 @@ class ScreenObserver { // Method called by a screen when user's done with it. virtual void OnExit(ExitCodes exit_code) = 0; - // Switch to the new language. |lang| specifies new language locale code. - // Caution: this callback resets (deletes and re-creates) all views - // (including *this), so do not access it after you call this! - virtual void OnSwitchLanguage(const std::string& lang, - ScreenObserver::ExitCodes new_state) = 0; - // Notify about new user names and password. It is used to autologin // just created user without asking the same info once again. virtual void OnSetUserNamePassword(const std::string& username, diff --git a/chrome/browser/chromeos/login/wizard_controller.cc b/chrome/browser/chromeos/login/wizard_controller.cc index 810e60f1..7748e5c 100644 --- a/chrome/browser/chromeos/login/wizard_controller.cc +++ b/chrome/browser/chromeos/login/wizard_controller.cc @@ -11,11 +11,9 @@ #include <string> #include <vector> -#include "app/resource_bundle.h" #include "app/l10n_util.h" #include "base/command_line.h" #include "base/logging.h" // For NOTREACHED. -#include "chrome/browser/browser_process.h" #include "chrome/browser/chromeos/cros/cros_library.h" #include "chrome/browser/chromeos/cros/login_library.h" #include "chrome/browser/chromeos/login/account_screen.h" @@ -316,31 +314,6 @@ void WizardController::OnUpdateNetworkError() { /////////////////////////////////////////////////////////////////////////////// // WizardController, private: -void WizardController::OnSwitchLanguage(const std::string& lang, - ScreenObserver::ExitCodes new_state) { - // Delete all views that may reference locale-specific data. - SetCurrentScreen(NULL); - network_screen_.reset(); - login_screen_.reset(); - account_screen_.reset(); - update_screen_.reset(); - contents_->RemoveAllChildViews(true); - // Can't delete background view since we don't know how to recreate it. - if (background_view_) - background_view_->Teardown(); - - // Switch the locale. - ResourceBundle::CleanupSharedInstance(); - ResourceBundle::InitSharedInstance(UTF8ToWide(lang)); - - // The following line does not seem to affect locale anyhow. Maybe in future.. - g_browser_process->SetApplicationLocale(lang); - - // Recreate view hierarchy and return to the wizard screen. - if (background_view_) - background_view_->Init(); - OnExit(new_state); -} void WizardController::OnSetUserNamePassword(const std::string& username, const std::string& password) { @@ -392,12 +365,6 @@ void WizardController::OnExit(ExitCodes exit_code) { case CONNECTION_FAILED: OnConnectionFailed(); break; - case LANGUAGE_CHANGED_ON_NETWORK: - SetCurrentScreen(GetNetworkScreen()); - break; - case LANGUAGE_CHANGED_ON_LOGIN: - SetCurrentScreen(GetLoginScreen()); - break; case UPDATE_INSTALLED: case UPDATE_NOUPDATE: OnUpdateCompleted(); diff --git a/chrome/browser/chromeos/login/wizard_controller.h b/chrome/browser/chromeos/login/wizard_controller.h index ecf8d01..d40e453 100644 --- a/chrome/browser/chromeos/login/wizard_controller.h +++ b/chrome/browser/chromeos/login/wizard_controller.h @@ -102,8 +102,6 @@ class WizardController : public chromeos::ScreenObserver, // Overridden from chromeos::ScreenObserver: virtual void OnExit(ExitCodes exit_code); - virtual void OnSwitchLanguage(const std::string& lang, - ScreenObserver::ExitCodes new_state); virtual void OnSetUserNamePassword(const std::string& username, const std::string& password); diff --git a/chrome/browser/chromeos/login/wizard_controller_browsertest.cc b/chrome/browser/chromeos/login/wizard_controller_browsertest.cc index ec3f266..01e530c 100644 --- a/chrome/browser/chromeos/login/wizard_controller_browsertest.cc +++ b/chrome/browser/chromeos/login/wizard_controller_browsertest.cc @@ -5,10 +5,10 @@ #include "app/l10n_util.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/chromeos/login/account_screen.h" +#include "chrome/browser/chromeos/login/language_switch_model.h" #include "chrome/browser/chromeos/login/mock_update_screen.h" #include "chrome/browser/chromeos/login/network_screen.h" #include "chrome/browser/chromeos/login/network_selection_view.h" -#include "chrome/browser/chromeos/login/update_screen.h" #include "chrome/browser/chromeos/login/wizard_controller.h" #include "chrome/browser/chromeos/login/wizard_in_process_browser_test.h" #include "chrome/common/chrome_switches.h" @@ -77,8 +77,7 @@ IN_PROC_BROWSER_TEST_F(WizardControllerTest, SwitchLanguage) { EXPECT_FALSE(current_screen->UILayoutIsRightToLeft()); const std::wstring en_str = l10n_util::GetString(IDS_NETWORK_SELECTION_TITLE); - wizard->OnSwitchLanguage( - "fr", chromeos::ScreenObserver::LANGUAGE_CHANGED_ON_NETWORK); + chromeos::LanguageSwitchModel::SwitchLanguage("fr"); EXPECT_EQ("fr", g_browser_process->GetApplicationLocale()); EXPECT_STREQ("fr", icu::Locale::getDefault().getLanguage()); EXPECT_FALSE(current_screen->UILayoutIsRightToLeft()); @@ -86,8 +85,7 @@ IN_PROC_BROWSER_TEST_F(WizardControllerTest, SwitchLanguage) { EXPECT_NE(en_str, fr_str); - wizard->OnSwitchLanguage( - "ar", chromeos::ScreenObserver::LANGUAGE_CHANGED_ON_NETWORK); + chromeos::LanguageSwitchModel::SwitchLanguage("ar"); EXPECT_EQ("ar", g_browser_process->GetApplicationLocale()); EXPECT_STREQ("ar", icu::Locale::getDefault().getLanguage()); EXPECT_TRUE(current_screen->UILayoutIsRightToLeft()); @@ -152,22 +150,6 @@ IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowMain) { EXPECT_EQ(controller()->GetLoginScreen(), controller()->current_screen()); } -IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowLanguageOnNetwork) { - EXPECT_EQ(controller()->GetNetworkScreen(), controller()->current_screen()); - EXPECT_CALL(*mock_network_screen_, Show()).Times(1); - EXPECT_CALL(*mock_network_screen_, Hide()).Times(1); - controller()->OnExit(chromeos::ScreenObserver::LANGUAGE_CHANGED_ON_NETWORK); - EXPECT_EQ(controller()->GetNetworkScreen(), controller()->current_screen()); -} - -IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowLanguageOnLogin) { - EXPECT_EQ(controller()->GetNetworkScreen(), controller()->current_screen()); - EXPECT_CALL(*mock_login_screen_, Show()).Times(1); - EXPECT_CALL(*mock_network_screen_, Hide()).Times(1); - controller()->OnExit(chromeos::ScreenObserver::LANGUAGE_CHANGED_ON_LOGIN); - EXPECT_EQ(controller()->GetLoginScreen(), controller()->current_screen()); -} - IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowErrorUpdate) { EXPECT_EQ(controller()->GetNetworkScreen(), controller()->current_screen()); EXPECT_CALL(*mock_update_screen_, StartUpdate()).Times(1); @@ -192,5 +174,5 @@ IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowErrorNetwork) { EXPECT_EQ(controller()->GetLoginScreen(), controller()->current_screen()); } -COMPILE_ASSERT(chromeos::ScreenObserver::EXIT_CODES_COUNT == 13, +COMPILE_ASSERT(chromeos::ScreenObserver::EXIT_CODES_COUNT == 11, add_tests_for_new_control_flow_you_just_introduced); |