diff options
author | chocobo@google.com <chocobo@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-10-15 21:08:29 +0000 |
---|---|---|
committer | chocobo@google.com <chocobo@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-10-15 21:08:29 +0000 |
commit | fecc1520c83dc037865ba49846f764ce056d4016 (patch) | |
tree | 54be637f39785fda3046ca0a276be1ceba2c9999 /chrome/browser/chromeos/settings_contents_view.cc | |
parent | 40c2a7869363f42ab82b48bd5d4cb1a776cd2809 (diff) | |
download | chromium_src-fecc1520c83dc037865ba49846f764ce056d4016.zip chromium_src-fecc1520c83dc037865ba49846f764ce056d4016.tar.gz chromium_src-fecc1520c83dc037865ba49846f764ce056d4016.tar.bz2 |
Add UI for changing timezones.
BUG=24876
TEST=none
Review URL: http://codereview.chromium.org/267113
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@29183 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/chromeos/settings_contents_view.cc')
-rw-r--r-- | chrome/browser/chromeos/settings_contents_view.cc | 391 |
1 files changed, 254 insertions, 137 deletions
diff --git a/chrome/browser/chromeos/settings_contents_view.cc b/chrome/browser/chromeos/settings_contents_view.cc index 86a229d..e2681a6 100644 --- a/chrome/browser/chromeos/settings_contents_view.cc +++ b/chrome/browser/chromeos/settings_contents_view.cc @@ -12,6 +12,7 @@ #include "app/l10n_util.h" #include "app/resource_bundle.h" #include "base/basictypes.h" +#include "base/stl_util-inl.h" #include "base/string_util.h" #include "chrome/browser/chromeos/cros_network_library.h" #include "chrome/browser/chromeos/password_dialog_view.h" @@ -19,6 +20,8 @@ #include "chrome/common/pref_names.h" #include "grit/chromium_strings.h" #include "grit/generated_resources.h" +#include "unicode/strenum.h" +#include "unicode/timezone.h" #include "views/background.h" #include "views/controls/button/checkbox.h" #include "views/controls/combobox/combobox.h" @@ -33,60 +36,223 @@ using views::ColumnSet; namespace { //////////////////////////////////////////////////////////////////////////////// -// WifiNetworkComboModel +// SettingsContentsSection -// The Combobox model for the list of wifi networks -class WifiNetworkComboModel : public ComboboxModel { +// Base section class settings +class SettingsContentsSection : public OptionsPageView { public: - WifiNetworkComboModel(); + explicit SettingsContentsSection(Profile* profile, int title_msg_id); + virtual ~SettingsContentsSection() {} - virtual int GetItemCount(); - virtual std::wstring GetItemAt(int index); + protected: + // OptionsPageView overrides: + virtual void InitControlLayout(); + virtual void InitContents(GridLayout* layout) = 0; - bool HasWifiNetworks(); - const WifiNetwork& GetWifiNetworkAt(int index); + int single_column_view_set_id() const { return single_column_view_set_id_; } + int double_column_view_set_id() const { return double_column_view_set_id_; } private: - WifiNetworkVector wifi_networks_; + // The message id for the title of this section. + int title_msg_id_; - DISALLOW_COPY_AND_ASSIGN(WifiNetworkComboModel); + int single_column_view_set_id_; + int double_column_view_set_id_; + + DISALLOW_COPY_AND_ASSIGN(SettingsContentsSection); }; -WifiNetworkComboModel::WifiNetworkComboModel() { - wifi_networks_ = CrosNetworkLibrary::Get()->wifi_networks(); +SettingsContentsSection::SettingsContentsSection(Profile* profile, + int title_msg_id) + : OptionsPageView(profile), + title_msg_id_(title_msg_id), + single_column_view_set_id_(0), + double_column_view_set_id_(1) { } -int WifiNetworkComboModel::GetItemCount() { - // Item count is always 1 more than number of networks. - // If there are no networks, then we show a message stating that. - // If there are networks, the first item is empty. - return static_cast<int>(wifi_networks_.size()) + 1; +void SettingsContentsSection::InitControlLayout() { + GridLayout* layout = new GridLayout(this); + SetLayoutManager(layout); + + int single_column_layout_id = 0; + ColumnSet* column_set = layout->AddColumnSet(single_column_layout_id); + column_set->AddColumn(GridLayout::LEADING, GridLayout::LEADING, 0, + GridLayout::USE_PREF, 0, 0); + int inset_column_layout_id = 1; + column_set = layout->AddColumnSet(inset_column_layout_id); + column_set->AddPaddingColumn(0, kUnrelatedControlHorizontalSpacing); + column_set->AddColumn(GridLayout::FILL, GridLayout::LEADING, 1, + GridLayout::USE_PREF, 0, 0); + + layout->StartRow(0, single_column_layout_id); + views::Label* title_label = new views::Label( + l10n_util::GetString(title_msg_id_)); + ResourceBundle& rb = ResourceBundle::GetSharedInstance(); + gfx::Font title_font = + rb.GetFont(ResourceBundle::BaseFont).DeriveFont(0, gfx::Font::BOLD); + title_label->SetFont(title_font); + layout->AddView(title_label); + layout->AddPaddingRow(0, kRelatedControlVerticalSpacing); + layout->StartRow(0, inset_column_layout_id); + + views::View* contents = new views::View; + GridLayout* child_layout = new GridLayout(contents); + contents->SetLayoutManager(child_layout); + + column_set = child_layout->AddColumnSet(single_column_view_set_id_); + column_set->AddColumn(GridLayout::FILL, GridLayout::CENTER, 1, + GridLayout::USE_PREF, 0, 0); + + column_set = child_layout->AddColumnSet(double_column_view_set_id_); + column_set->AddColumn(GridLayout::FILL, GridLayout::CENTER, 0, + GridLayout::USE_PREF, 0, 0); + column_set->AddPaddingColumn(0, kRelatedControlHorizontalSpacing); + column_set->AddColumn(GridLayout::FILL, GridLayout::CENTER, 1, + GridLayout::USE_PREF, 0, 0); + + InitContents(child_layout); + layout->AddView(contents); } -std::wstring WifiNetworkComboModel::GetItemAt(int index) { - if (index == 0) { - return wifi_networks_.empty() ? - l10n_util::GetString(IDS_STATUSBAR_NO_NETWORKS_MESSAGE) : - ASCIIToWide(""); - } - // If index is greater than one, we get the corresponding network, which is - // in the wifi_networks_ list in [index-1] position. - return ASCIIToWide(wifi_networks_[index-1].ssid); +//////////////////////////////////////////////////////////////////////////////// +// DateTimeSection + +// Date/Time section for datetime settings +class DateTimeSection : public SettingsContentsSection, + public views::Combobox::Listener { + public: + explicit DateTimeSection(Profile* profile); + virtual ~DateTimeSection() {} + + // Overridden from views::Combobox::Listener: + virtual void ItemChanged(views::Combobox* sender, + int prev_index, + int new_index); + + protected: + // SettingsContentsSection overrides: + virtual void InitContents(GridLayout* layout); + virtual void NotifyPrefChanged(const std::wstring* pref_name); + + private: + // The combobox model for the list of timezones. + class TimezoneComboboxModel : public ComboboxModel { + public: + TimezoneComboboxModel() { + timezones_.push_back(icu::TimeZone::createTimeZone( + icu::UnicodeString::fromUTF8("US/Pacific"))); + timezones_.push_back(icu::TimeZone::createTimeZone( + icu::UnicodeString::fromUTF8("US/Mountain"))); + timezones_.push_back(icu::TimeZone::createTimeZone( + icu::UnicodeString::fromUTF8("US/Central"))); + timezones_.push_back(icu::TimeZone::createTimeZone( + icu::UnicodeString::fromUTF8("US/Eastern"))); + // For now, add all the GMT timezones. + // We may eventually want to use icu::TimeZone::createEnumeration() + // to list all the timezones and pick the ones we want to show. + for (int i = 11; i >= -12; i--) { + // For positive i's, add the extra '+'. + std::string str = StringPrintf(i > 0 ? "Etc/GMT+%d" : "Etc/GMT%d", i); + icu::TimeZone* timezone = icu::TimeZone::createTimeZone( + icu::UnicodeString::fromUTF8(str.c_str())); + timezones_.push_back(timezone); + } + } + + virtual ~TimezoneComboboxModel() { + STLDeleteElements(&timezones_); + } + + virtual int GetItemCount() { + return static_cast<int>(timezones_.size()); + } + + virtual std::wstring GetItemAt(int index) { + icu::UnicodeString name; + timezones_[index]->getDisplayName(name); + std::wstring output; + UTF16ToWide(name.getBuffer(), name.length(), &output); + return output; + } + + virtual std::wstring GetTimeZoneIDAt(int index) { + icu::UnicodeString id; + timezones_[index]->getID(id); + std::wstring output; + UTF16ToWide(id.getBuffer(), id.length(), &output); + return output; + } + + private: + std::vector<icu::TimeZone*> timezones_; + + DISALLOW_COPY_AND_ASSIGN(TimezoneComboboxModel); + }; + + // Selects the timezone. + void SelectTimeZone(const std::wstring& id); + + // TimeZone combobox model. + views::Combobox* timezone_combobox_; + + // Controls for this section: + TimezoneComboboxModel timezone_combobox_model_; + + // Preferences for this section: + StringPrefMember timezone_; + + DISALLOW_COPY_AND_ASSIGN(DateTimeSection); +}; + +DateTimeSection::DateTimeSection(Profile* profile) + : SettingsContentsSection(profile, + IDS_OPTIONS_SETTINGS_SECTION_TITLE_DATETIME), + timezone_combobox_(NULL) { +} + +void DateTimeSection::ItemChanged(views::Combobox* sender, + int prev_index, + int new_index) { + if (new_index == prev_index) + return; + timezone_.SetValue(timezone_combobox_model_.GetTimeZoneIDAt(new_index)); +} + +void DateTimeSection::InitContents(GridLayout* layout) { + timezone_combobox_ = new views::Combobox(&timezone_combobox_model_); + timezone_combobox_->set_listener(this); + + layout->StartRow(0, double_column_view_set_id()); + layout->AddView(new views::Label( + l10n_util::GetString(IDS_OPTIONS_SETTINGS_TIMEZONE_DESCRIPTION))); + layout->AddView(timezone_combobox_); + layout->AddPaddingRow(0, kRelatedControlVerticalSpacing); + + // Init member prefs so we can update the controls if prefs change. + timezone_.Init(prefs::kTimeZone, profile()->GetPrefs(), this); } -bool WifiNetworkComboModel::HasWifiNetworks() { - return !wifi_networks_.empty(); +void DateTimeSection::NotifyPrefChanged(const std::wstring* pref_name) { + if (!pref_name || *pref_name == prefs::kTimeZone) { + std::wstring timezone = timezone_.GetValue(); + SelectTimeZone(timezone); + } } -const WifiNetwork& WifiNetworkComboModel::GetWifiNetworkAt(int index) { - return wifi_networks_[index-1]; +void DateTimeSection::SelectTimeZone(const std::wstring& id) { + for (int i = 0; i < timezone_combobox_model_.GetItemCount(); i++) { + if (timezone_combobox_model_.GetTimeZoneIDAt(i) == id) { + timezone_combobox_->SetSelectedItem(i); + return; + } + } } //////////////////////////////////////////////////////////////////////////////// // NetworkSection // Network section for wifi settings -class NetworkSection : public OptionsPageView, +class NetworkSection : public SettingsContentsSection, public views::Combobox::Listener, public PasswordDialogDelegate, public CrosNetworkLibrary::Observer { @@ -108,18 +274,52 @@ class NetworkSection : public OptionsPageView, virtual void NetworkChanged(CrosNetworkLibrary* obj); protected: - // OptionsPageView overrides: - virtual void InitControlLayout(); - virtual void InitContents(); + // SettingsContentsSection overrides: + virtual void InitContents(GridLayout* layout); private: + // The Combobox model for the list of wifi networks + class WifiNetworkComboModel : public ComboboxModel { + public: + WifiNetworkComboModel() { + wifi_networks_ = CrosNetworkLibrary::Get()->wifi_networks(); + } + + virtual int GetItemCount() { + // Item count is always 1 more than number of networks. + // If there are no networks, then we show a message stating that. + // If there are networks, the first item is empty. + return static_cast<int>(wifi_networks_.size()) + 1; + } + + virtual std::wstring GetItemAt(int index) { + if (index == 0) { + return wifi_networks_.empty() ? + l10n_util::GetString(IDS_STATUSBAR_NO_NETWORKS_MESSAGE) : + std::wstring(); + } + // If index is greater than one, we get the corresponding network, + // which is in the wifi_networks_ list in [index-1] position. + return ASCIIToWide(wifi_networks_[index-1].ssid); + } + + virtual bool HasWifiNetworks() { + return !wifi_networks_.empty(); + } + + virtual const WifiNetwork& GetWifiNetworkAt(int index) { + return wifi_networks_[index-1]; + } + + private: + WifiNetworkVector wifi_networks_; + + DISALLOW_COPY_AND_ASSIGN(WifiNetworkComboModel); + }; // This method will change the combobox selection to the passed in wifi ssid. void SelectWifi(const std::string& wifi_ssid); - // The View that contains the contents of the section. - views::View* contents_; - // Controls for this section: views::Combobox* wifi_ssid_combobox_; @@ -135,12 +335,9 @@ class NetworkSection : public OptionsPageView, DISALLOW_COPY_AND_ASSIGN(NetworkSection); }; -//////////////////////////////////////////////////////////////////////////////// -// NetworkSection - NetworkSection::NetworkSection(Profile* profile) - : OptionsPageView(profile), - contents_(NULL), + : SettingsContentsSection(profile, + IDS_OPTIONS_SETTINGS_SECTION_TITLE_NETWORK), wifi_ssid_combobox_(NULL), last_selected_wifi_ssid_index_(0) { CrosNetworkLibrary::Get()->AddObserver(this); @@ -198,49 +395,12 @@ void NetworkSection::NetworkChanged(CrosNetworkLibrary* obj) { SelectWifi(obj->wifi_ssid()); } -void NetworkSection::InitControlLayout() { - GridLayout* layout = new GridLayout(this); - SetLayoutManager(layout); - - int single_column_layout_id = 0; - ColumnSet* column_set = layout->AddColumnSet(single_column_layout_id); - column_set->AddColumn(GridLayout::LEADING, GridLayout::LEADING, 0, - GridLayout::USE_PREF, 0, 0); - int inset_column_layout_id = 1; - column_set = layout->AddColumnSet(inset_column_layout_id); - column_set->AddPaddingColumn(0, kUnrelatedControlHorizontalSpacing); - column_set->AddColumn(GridLayout::FILL, GridLayout::LEADING, 1, - GridLayout::USE_PREF, 0, 0); - - layout->StartRow(0, single_column_layout_id); - views::Label* title_label = new views::Label( - l10n_util::GetString(IDS_OPTIONS_SETTINGS_SECTION_TITLE_NETWORK)); - ResourceBundle& rb = ResourceBundle::GetSharedInstance(); - gfx::Font title_font = - rb.GetFont(ResourceBundle::BaseFont).DeriveFont(0, gfx::Font::BOLD); - title_label->SetFont(title_font); - layout->AddView(title_label); - layout->AddPaddingRow(0, kRelatedControlVerticalSpacing); - layout->StartRow(0, inset_column_layout_id); - InitContents(); - layout->AddView(contents_); -} - -void NetworkSection::InitContents() { - contents_ = new views::View; - GridLayout* layout = new GridLayout(contents_); - contents_->SetLayoutManager(layout); - +void NetworkSection::InitContents(GridLayout* layout) { wifi_ssid_combobox_ = new views::Combobox(&wifi_ssid_model_); wifi_ssid_combobox_->SetSelectedItem(last_selected_wifi_ssid_index_); wifi_ssid_combobox_->set_listener(this); - int single_column_view_set_id = 0; - ColumnSet* column_set = layout->AddColumnSet(single_column_view_set_id); - column_set->AddColumn(GridLayout::FILL, GridLayout::CENTER, 1, - GridLayout::USE_PREF, 0, 0); - - layout->StartRow(0, single_column_view_set_id); + layout->StartRow(0, single_column_view_set_id()); layout->AddView(wifi_ssid_combobox_); layout->AddPaddingRow(0, kRelatedControlVerticalSpacing); @@ -270,7 +430,7 @@ void NetworkSection::SelectWifi(const std::string& wifi_ssid) { //////////////////////////////////////////////////////////////////////////////// // TouchpadSection -class TouchpadSection : public OptionsPageView, +class TouchpadSection : public SettingsContentsSection, public views::ButtonListener, public views::SliderListener { public: @@ -284,9 +444,8 @@ class TouchpadSection : public OptionsPageView, virtual void SliderValueChanged(views::Slider* sender); protected: - // OptionsPageView overrides: - virtual void InitControlLayout(); - virtual void InitContents(); + // SettingsContentsSection overrides: + virtual void InitContents(GridLayout* layout); virtual void NotifyPrefChanged(const std::wstring* pref_name); private: @@ -309,8 +468,8 @@ class TouchpadSection : public OptionsPageView, }; TouchpadSection::TouchpadSection(Profile* profile) - : OptionsPageView(profile), - contents_(NULL), + : SettingsContentsSection(profile, + IDS_OPTIONS_SETTINGS_SECTION_TITLE_TOUCHPAD), enable_tap_to_click_checkbox_(NULL), enable_vert_edge_scroll_checkbox_(NULL), speed_factor_slider_(NULL), @@ -350,39 +509,7 @@ void TouchpadSection::SliderValueChanged(views::Slider* sender) { } } -void TouchpadSection::InitControlLayout() { - GridLayout* layout = new GridLayout(this); - SetLayoutManager(layout); - - int single_column_layout_id = 0; - ColumnSet* column_set = layout->AddColumnSet(single_column_layout_id); - column_set->AddColumn(GridLayout::LEADING, GridLayout::LEADING, 0, - GridLayout::USE_PREF, 0, 0); - int inset_column_layout_id = 1; - column_set = layout->AddColumnSet(inset_column_layout_id); - column_set->AddPaddingColumn(0, kUnrelatedControlHorizontalSpacing); - column_set->AddColumn(GridLayout::FILL, GridLayout::LEADING, 1, - GridLayout::USE_PREF, 0, 0); - - layout->StartRow(0, single_column_layout_id); - views::Label* title_label = new views::Label( - l10n_util::GetString(IDS_OPTIONS_SETTINGS_SECTION_TITLE_TOUCHPAD)); - ResourceBundle& rb = ResourceBundle::GetSharedInstance(); - gfx::Font title_font = - rb.GetFont(ResourceBundle::BaseFont).DeriveFont(0, gfx::Font::BOLD); - title_label->SetFont(title_font); - layout->AddView(title_label); - layout->AddPaddingRow(0, kRelatedControlVerticalSpacing); - layout->StartRow(0, inset_column_layout_id); - InitContents(); - layout->AddView(contents_); -} - -void TouchpadSection::InitContents() { - contents_ = new views::View; - GridLayout* layout = new GridLayout(contents_); - contents_->SetLayoutManager(layout); - +void TouchpadSection::InitContents(GridLayout* layout) { enable_tap_to_click_checkbox_ = new views::Checkbox(l10n_util::GetString( IDS_OPTIONS_SETTINGS_TAP_TO_CLICK_ENABLED_DESCRIPTION)); enable_tap_to_click_checkbox_->set_listener(this); @@ -404,33 +531,20 @@ void TouchpadSection::InitContents() { views::Slider::STYLE_UPDATE_ON_RELEASE), this); - int single_column_view_set_id = 0; - ColumnSet* column_set = layout->AddColumnSet(single_column_view_set_id); - column_set->AddColumn(GridLayout::FILL, GridLayout::CENTER, 1, - GridLayout::USE_PREF, 0, 0); - - int double_column_view_set_id = 1; - column_set = layout->AddColumnSet(double_column_view_set_id); - column_set->AddColumn(GridLayout::FILL, GridLayout::CENTER, 0, - GridLayout::USE_PREF, 0, 0); - column_set->AddPaddingColumn(0, kRelatedControlHorizontalSpacing); - column_set->AddColumn(GridLayout::FILL, GridLayout::CENTER, 1, - GridLayout::USE_PREF, 0, 0); - - layout->StartRow(0, double_column_view_set_id); + layout->StartRow(0, double_column_view_set_id()); layout->AddView(new views::Label( l10n_util::GetString(IDS_OPTIONS_SETTINGS_SENSITIVITY_DESCRIPTION))); layout->AddView(sensitivity_slider_); layout->AddPaddingRow(0, kRelatedControlVerticalSpacing); - layout->StartRow(0, double_column_view_set_id); + layout->StartRow(0, double_column_view_set_id()); layout->AddView(new views::Label( l10n_util::GetString(IDS_OPTIONS_SETTINGS_SPEED_FACTOR_DESCRIPTION))); layout->AddView(speed_factor_slider_); layout->AddPaddingRow(0, kRelatedControlVerticalSpacing); - layout->StartRow(0, single_column_view_set_id); + layout->StartRow(0, single_column_view_set_id()); layout->AddView(enable_tap_to_click_checkbox_); layout->AddPaddingRow(0, kRelatedControlVerticalSpacing); - layout->StartRow(0, single_column_view_set_id); + layout->StartRow(0, single_column_view_set_id()); layout->AddView(enable_vert_edge_scroll_checkbox_); layout->AddPaddingRow(0, kUnrelatedControlVerticalSpacing); @@ -482,6 +596,9 @@ void SettingsContentsView::InitControlLayout() { GridLayout::USE_PREF, 0, 0); layout->StartRow(0, single_column_view_set_id); + layout->AddView(new DateTimeSection(profile())); + layout->AddPaddingRow(0, kRelatedControlVerticalSpacing); + layout->StartRow(0, single_column_view_set_id); layout->AddView(new NetworkSection(profile())); layout->AddPaddingRow(0, kRelatedControlVerticalSpacing); layout->StartRow(0, single_column_view_set_id); |