| Index: chrome/browser/chromeos/settings_contents_view.cc
|
| ===================================================================
|
| --- chrome/browser/chromeos/settings_contents_view.cc (revision 0)
|
| +++ chrome/browser/chromeos/settings_contents_view.cc (revision 0)
|
| @@ -0,0 +1,507 @@
|
| +// Copyright (c) 2009 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "chrome/browser/chromeos/settings_contents_view.h"
|
| +
|
| +#include <map>
|
| +#include <vector>
|
| +
|
| +#include "app/combobox_model.h"
|
| +#include "app/l10n_util.h"
|
| +#include "app/resource_bundle.h"
|
| +#include "base/basictypes.h"
|
| +#include "base/string_util.h"
|
| +#include "chrome/common/pref_member.h"
|
| +#include "chrome/common/pref_names.h"
|
| +#include "grit/chromium_strings.h"
|
| +#include "grit/generated_resources.h"
|
| +#include "grit/locale_settings.h"
|
| +#include "views/background.h"
|
| +#include "views/controls/button/checkbox.h"
|
| +#include "views/controls/combobox/combobox.h"
|
| +#include "views/controls/textfield/textfield.h"
|
| +#include "views/grid_layout.h"
|
| +#include "views/standard_layout.h"
|
| +#include "views/window/dialog_delegate.h"
|
| +#include "views/window/window.h"
|
| +
|
| +using views::GridLayout;
|
| +using views::ColumnSet;
|
| +
|
| +namespace {
|
| +
|
| +////////////////////////////////////////////////////////////////////////////////
|
| +// WifiSSIDComboModel
|
| +
|
| +// The Combobox model for the list of wifi networks
|
| +class WifiSSIDComboModel : public ComboboxModel {
|
| + public:
|
| + struct NetworkData {
|
| + NetworkData() { }
|
| + NetworkData(const string16& encryption, const int& strength)
|
| + : encryption(encryption),
|
| + strength(strength) { }
|
| +
|
| + string16 encryption;
|
| + int strength;
|
| + };
|
| + typedef std::map<string16, NetworkData> NetworkDataMap;
|
| +
|
| + WifiSSIDComboModel();
|
| +
|
| + virtual int GetItemCount();
|
| + virtual std::wstring GetItemAt(int index);
|
| +
|
| + const string16& GetSSIDAt(int index);
|
| + bool RequiresPassword(const string16& ssid);
|
| +
|
| + private:
|
| + std::vector<string16> ssids_;
|
| +
|
| + // A map of some extra data (NetworkData) keyed off the ssids.
|
| + NetworkDataMap ssids_map_;
|
| +
|
| + void AddWifiNetwork(const string16& ssid,
|
| + const string16& encryption,
|
| + int strength);
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(WifiSSIDComboModel);
|
| +};
|
| +
|
| +WifiSSIDComboModel::WifiSSIDComboModel() {
|
| + // TODO(chocobo): Load wifi info from conman.
|
| + // This is just temporary data until we hook this up to real data.
|
| + AddWifiNetwork(ASCIIToUTF16("Wifi Combobox Mock"), string16(), 80);
|
| + AddWifiNetwork(ASCIIToUTF16("Wifi WPA-PSK Password is chronos"),
|
| + ASCIIToUTF16("WPA-PSK"), 60);
|
| + AddWifiNetwork(ASCIIToUTF16("Wifi No Encryption"), string16(), 90);
|
| +}
|
| +
|
| +int WifiSSIDComboModel::GetItemCount() {
|
| + return static_cast<int>(ssids_.size());
|
| +}
|
| +
|
| +std::wstring WifiSSIDComboModel::GetItemAt(int index) {
|
| + DCHECK(static_cast<int>(ssids_.size()) > index);
|
| +
|
| + NetworkDataMap::const_iterator it = ssids_map_.find(ssids_[index]);
|
| + DCHECK(it != ssids_map_.end());
|
| +
|
| + // TODO(chocobo): Finalize UI, then put strings in resource file.
|
| + std::vector<string16> subst;
|
| + subst.push_back(it->first); // $1
|
| + // The "None" string is just temporary for now. Have not finalized the UI yet.
|
| + if (it->second.encryption.empty())
|
| + subst.push_back(ASCIIToUTF16("None")); // $2
|
| + else
|
| + subst.push_back(it->second.encryption); // $2
|
| + subst.push_back(IntToString16(it->second.strength)); // $3
|
| +
|
| + return UTF16ToWide(
|
| + ReplaceStringPlaceholders(ASCIIToUTF16("$1 ($2, $3)"), subst, NULL));
|
| +}
|
| +
|
| +const string16& WifiSSIDComboModel::GetSSIDAt(int index) {
|
| + DCHECK(static_cast<int>(ssids_.size()) > index);
|
| + return ssids_[index];
|
| +}
|
| +
|
| +bool WifiSSIDComboModel::RequiresPassword(const string16& ssid) {
|
| + NetworkDataMap::const_iterator it = ssids_map_.find(ssid);
|
| + DCHECK(it != ssids_map_.end());
|
| + return !it->second.encryption.empty();
|
| +}
|
| +
|
| +void WifiSSIDComboModel::AddWifiNetwork(const string16& ssid,
|
| + const string16& encryption,
|
| + int strength) {
|
| + ssids_.push_back(ssid);
|
| + ssids_map_[ssid] = NetworkData(encryption, strength);
|
| +}
|
| +
|
| +////////////////////////////////////////////////////////////////////////////////
|
| +// NetworkSection
|
| +
|
| +// Network section for wifi settings
|
| +class NetworkSection : public OptionsPageView,
|
| + public views::Combobox::Listener {
|
| + public:
|
| + explicit NetworkSection(Profile* profile);
|
| + virtual ~NetworkSection() {}
|
| +
|
| + // Overridden from views::Combobox::Listener:
|
| + virtual void ItemChanged(views::Combobox* sender,
|
| + int prev_index,
|
| + int new_index);
|
| +
|
| + bool OnPasswordWindowCancel();
|
| + bool OnPasswordWindowAccept(const string16& password);
|
| + bool ConnectToWifi(const string16& ssid, const string16& password);
|
| +
|
| + protected:
|
| + // OptionsPageView overrides:
|
| + virtual void InitControlLayout();
|
| + virtual void InitContents();
|
| +
|
| + private:
|
| + // The View that contains the contents of the section.
|
| + views::View* contents_;
|
| +
|
| + // Controls for this section:
|
| + views::Combobox* wifi_ssid_combobox_;
|
| +
|
| + // Used to store the index (in combobox) of the currently connected wifi.
|
| + int last_selected_wifi_ssid_index_;
|
| +
|
| + // Dummy for now. Used to populate wifi ssid models.
|
| + WifiSSIDComboModel wifi_ssid_model_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(NetworkSection);
|
| +};
|
| +
|
| +////////////////////////////////////////////////////////////////////////////////
|
| +// PasswordWindowView
|
| +
|
| +static const int kDialogPadding = 7;
|
| +
|
| +// A view for showing a password textfield
|
| +class PasswordWindowView : public views::View,
|
| + public views::DialogDelegate {
|
| + public:
|
| + PasswordWindowView(NetworkSection* network_delegate, Profile* profile);
|
| + views::Window* container() const { return container_; }
|
| + void set_container(views::Window* container) {
|
| + container_ = container;
|
| + }
|
| +
|
| + // views::DialogDelegate methods.
|
| + virtual bool Cancel();
|
| + virtual bool Accept();
|
| + virtual std::wstring GetWindowTitle() const;
|
| +
|
| + // views::WindowDelegate method.
|
| + virtual bool IsModal() const { return true; }
|
| + virtual views::View* GetContentsView() { return this; }
|
| +
|
| + // views::View overrides.
|
| + virtual void Layout();
|
| + virtual gfx::Size GetPreferredSize();
|
| +
|
| + protected:
|
| + virtual void ViewHierarchyChanged(bool is_add, views::View* parent,
|
| + views::View* child);
|
| +
|
| + private:
|
| + void Init();
|
| +
|
| + // The Options dialog window.
|
| + views::Window* container_;
|
| +
|
| + // Used for Call back to NetworkSection that password has been entered.
|
| + NetworkSection* network_delegate_;
|
| +
|
| + // Combobox and its corresponding model.
|
| + views::Textfield* password_textfield_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(PasswordWindowView);
|
| +};
|
| +
|
| +PasswordWindowView::PasswordWindowView(
|
| + NetworkSection* network_delegate,
|
| + Profile* profile)
|
| + : network_delegate_(network_delegate),
|
| + password_textfield_(NULL) {
|
| + Init();
|
| +}
|
| +
|
| +std::wstring PasswordWindowView::GetWindowTitle() const {
|
| + return l10n_util::GetString(IDS_OPTIONS_SETTINGS_SECTION_TITLE_PASSWORD);
|
| +}
|
| +
|
| +bool PasswordWindowView::Cancel() {
|
| + return network_delegate_->OnPasswordWindowCancel();
|
| +}
|
| +
|
| +bool PasswordWindowView::Accept() {
|
| + // TODO(chocobo): we should not need to call SyncText ourself here.
|
| + password_textfield_->SyncText();
|
| + return network_delegate_->OnPasswordWindowAccept(password_textfield_->text());
|
| +}
|
| +
|
| +void PasswordWindowView::Layout() {
|
| + gfx::Size sz = password_textfield_->GetPreferredSize();
|
| + password_textfield_->SetBounds(kDialogPadding, kDialogPadding,
|
| + width() - 2*kDialogPadding,
|
| + sz.height());
|
| +}
|
| +
|
| +gfx::Size PasswordWindowView::GetPreferredSize() {
|
| + // TODO(chocobo): Create our own localized content size once the UI is done.
|
| + return gfx::Size(views::Window::GetLocalizedContentsSize(
|
| + IDS_ABOUT_DIALOG_WIDTH_CHARS,
|
| + IDS_ABOUT_DIALOG_MINIMUM_HEIGHT_LINES));
|
| +}
|
| +
|
| +void PasswordWindowView::ViewHierarchyChanged(bool is_add,
|
| + views::View* parent,
|
| + views::View* child) {
|
| + if (is_add && child == this)
|
| + Init();
|
| +}
|
| +
|
| +void PasswordWindowView::Init() {
|
| + password_textfield_ = new views::Textfield(views::Textfield::STYLE_PASSWORD);
|
| + AddChildView(password_textfield_);
|
| +}
|
| +
|
| +////////////////////////////////////////////////////////////////////////////////
|
| +// NetworkSection
|
| +
|
| +NetworkSection::NetworkSection(Profile* profile)
|
| + : OptionsPageView(profile),
|
| + contents_(NULL),
|
| + wifi_ssid_combobox_(NULL),
|
| + last_selected_wifi_ssid_index_(0) {
|
| +}
|
| +
|
| +void NetworkSection::ItemChanged(views::Combobox* sender,
|
| + int prev_index,
|
| + int new_index) {
|
| + if (new_index == prev_index)
|
| + return;
|
| + if (sender == wifi_ssid_combobox_) {
|
| + last_selected_wifi_ssid_index_ = prev_index;
|
| + string16 ssid = wifi_ssid_model_.GetSSIDAt(new_index);
|
| + // Connect to wifi here. Open password page if appropriate
|
| + if (wifi_ssid_model_.RequiresPassword(ssid)) {
|
| + views::Window* window = views::Window::CreateChromeWindow(
|
| + NULL,
|
| + gfx::Rect(),
|
| + new PasswordWindowView(this, profile()));
|
| + window->Show();
|
| + } else {
|
| + ConnectToWifi(ssid, string16());
|
| + }
|
| + }
|
| +}
|
| +
|
| +bool NetworkSection::OnPasswordWindowCancel() {
|
| + // Change combobox to previous setting
|
| + wifi_ssid_combobox_->SetSelectedItem(last_selected_wifi_ssid_index_);
|
| + return true;
|
| +}
|
| +
|
| +bool NetworkSection::OnPasswordWindowAccept(const string16& password) {
|
| + // Try connecting to wifi
|
| + return ConnectToWifi(wifi_ssid_model_.GetSSIDAt(
|
| + wifi_ssid_combobox_->selected_item()), password);
|
| +}
|
| +
|
| +bool NetworkSection::ConnectToWifi(const string16& ssid,
|
| + const string16& password) {
|
| + // TODO(chocobo): Connect to wifi
|
| + return password == ASCIIToUTF16("chronos");
|
| +}
|
| +
|
| +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);
|
| +
|
| + wifi_ssid_combobox_ = new views::Combobox(&wifi_ssid_model_);
|
| + 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->AddView(wifi_ssid_combobox_);
|
| + layout->AddPaddingRow(0, kRelatedControlVerticalSpacing);
|
| +}
|
| +
|
| +////////////////////////////////////////////////////////////////////////////////
|
| +// TouchpadSection
|
| +
|
| +class TouchpadSection : public OptionsPageView,
|
| + public views::ButtonListener {
|
| + public:
|
| + explicit TouchpadSection(Profile* profile);
|
| + virtual ~TouchpadSection() {}
|
| +
|
| + // Overridden from views::ButtonListener:
|
| + virtual void ButtonPressed(views::Button* sender, const views::Event& event);
|
| +
|
| + protected:
|
| + // OptionsPageView overrides:
|
| + virtual void InitControlLayout();
|
| + virtual void InitContents();
|
| + virtual void NotifyPrefChanged(const std::wstring* pref_name);
|
| +
|
| + private:
|
| + // The View that contains the contents of the section.
|
| + views::View* contents_;
|
| +
|
| + // Controls for this section:
|
| + views::Checkbox* enable_tap_to_click_checkbox_;
|
| + views::Checkbox* enable_vert_edge_scroll_checkbox_;
|
| +
|
| + // Preferences for this section:
|
| + BooleanPrefMember tap_to_click_enabled_;
|
| + BooleanPrefMember vert_edge_scroll_enabled_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(TouchpadSection);
|
| +};
|
| +
|
| +TouchpadSection::TouchpadSection(Profile* profile)
|
| + : OptionsPageView(profile),
|
| + contents_(NULL),
|
| + enable_tap_to_click_checkbox_(NULL),
|
| + enable_vert_edge_scroll_checkbox_(NULL) {
|
| +}
|
| +
|
| +void TouchpadSection::ButtonPressed(
|
| + views::Button* sender, const views::Event& event) {
|
| + if (sender == enable_tap_to_click_checkbox_) {
|
| + bool enabled = enable_tap_to_click_checkbox_->checked();
|
| + UserMetricsRecordAction(enabled ?
|
| + L"Options_TapToClickCheckbox_Enable" :
|
| + L"Options_TapToClickCheckbox_Disable",
|
| + profile()->GetPrefs());
|
| + tap_to_click_enabled_.SetValue(enabled);
|
| + } else if (sender == enable_vert_edge_scroll_checkbox_) {
|
| + bool enabled = enable_vert_edge_scroll_checkbox_->checked();
|
| + UserMetricsRecordAction(enabled ?
|
| + L"Options_VertEdgeScrollCheckbox_Enable" :
|
| + L"Options_VertEdgeScrollCheckbox_Disable",
|
| + profile()->GetPrefs());
|
| + vert_edge_scroll_enabled_.SetValue(enabled);
|
| + }
|
| +}
|
| +
|
| +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);
|
| +
|
| + 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);
|
| + enable_tap_to_click_checkbox_->SetMultiLine(true);
|
| + enable_vert_edge_scroll_checkbox_ = new views::Checkbox(l10n_util::GetString(
|
| + IDS_OPTIONS_SETTINGS_VERT_EDGE_SCROLL_ENABLED_DESCRIPTION));
|
| + enable_vert_edge_scroll_checkbox_->set_listener(this);
|
| + enable_vert_edge_scroll_checkbox_->SetMultiLine(true);
|
| +
|
| + 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->AddView(enable_tap_to_click_checkbox_);
|
| + layout->AddPaddingRow(0, kRelatedControlVerticalSpacing);
|
| + layout->StartRow(0, single_column_view_set_id);
|
| + layout->AddView(enable_vert_edge_scroll_checkbox_);
|
| + layout->AddPaddingRow(0, kUnrelatedControlVerticalSpacing);
|
| +
|
| + // Init member prefs so we can update the controls if prefs change.
|
| + tap_to_click_enabled_.Init(prefs::kTapToClickEnabled,
|
| + profile()->GetPrefs(), this);
|
| + vert_edge_scroll_enabled_.Init(prefs::kVertEdgeScrollEnabled,
|
| + profile()->GetPrefs(), this);
|
| +}
|
| +
|
| +void TouchpadSection::NotifyPrefChanged(const std::wstring* pref_name) {
|
| + if (!pref_name || *pref_name == prefs::kTapToClickEnabled) {
|
| + bool enabled = tap_to_click_enabled_.GetValue();
|
| + enable_tap_to_click_checkbox_->SetChecked(enabled);
|
| + }
|
| + if (!pref_name || *pref_name == prefs::kVertEdgeScrollEnabled) {
|
| + bool enabled = vert_edge_scroll_enabled_.GetValue();
|
| + enable_vert_edge_scroll_checkbox_->SetChecked(enabled);
|
| + }
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +////////////////////////////////////////////////////////////////////////////////
|
| +// SettingsContentsView
|
| +
|
| +////////////////////////////////////////////////////////////////////////////////
|
| +// SettingsContentsView, OptionsPageView implementation:
|
| +
|
| +void SettingsContentsView::InitControlLayout() {
|
| + GridLayout* layout = CreatePanelGridLayout(this);
|
| + SetLayoutManager(layout);
|
| +
|
| + int single_column_view_set_id = 0;
|
| + ColumnSet* column_set = layout->AddColumnSet(single_column_view_set_id);
|
| + column_set->AddColumn(GridLayout::FILL, GridLayout::FILL, 1,
|
| + GridLayout::USE_PREF, 0, 0);
|
| +
|
| + 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);
|
| + layout->AddView(new TouchpadSection(profile()));
|
| + layout->AddPaddingRow(0, kRelatedControlVerticalSpacing);
|
| +}
|
|
|
| Property changes on: chrome/browser/chromeos/settings_contents_view.cc
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|