diff options
-rw-r--r-- | chrome/app/generated_resources.grd | 14 | ||||
-rw-r--r-- | chrome/browser/views/options/advanced_contents_view.cc | 409 | ||||
-rw-r--r-- | chrome/browser/views/options/content_page_view.cc | 406 | ||||
-rw-r--r-- | chrome/browser/views/options/content_page_view.h | 52 |
4 files changed, 494 insertions, 387 deletions
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index a317bad..ae9d389 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd @@ -2985,16 +2985,16 @@ each locale. --> <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> Options </message> <message name="IDS_OPTIONS_GENERAL_TAB_LABEL" desc="The title of the General tab"> - Basics + General </message> - <message name="IDS_OPTIONS_CONTENT_TAB_LABEL" desc="The title of the Tweaks tab"> - Minor Tweaks + <message name="IDS_OPTIONS_CONTENT_TAB_LABEL" desc="The title of the User Data tab"> + User Data </message> <message name="IDS_OPTIONS_USER_DATA_TAB_LABEL" desc="The title of the User Data tab"> User Data </message> <message name="IDS_OPTIONS_ADVANCED_TAB_LABEL" desc="The title of the Advanced tab"> - Under the Hood + Advanced </message> <message name="IDS_OPTIONS_LEARN_MORE_LABEL" desc="In the options dialog, we have links to the support web pages where the user can learn more about a feature."> Learn more @@ -3063,7 +3063,7 @@ each locale. --> </message> <message name="IDS_OPTIONS_DOWNLOADLOCATION_GROUP_NAME" desc="The title of the download location group"> - Download location: + Downloads </message> <message name="IDS_OPTIONS_DOWNLOADLOCATION_BROWSE_BUTTON" desc="The label of the 'Browse...' button"> Br&owse... @@ -3127,10 +3127,6 @@ each locale. --> Reset to default theme </message> - <message name="IDS_OPTIONS_FONTSANDLANGUAGES_GROUP_NAME" desc="The label of the 'Fonts and Languages' group"> - Fonts and Languages: - </message> - <message name="IDS_OPTIONS_PROXIES_LABEL" desc="The info label for the 'Proxy settings' button"> Set up a proxy to connect to the network. </message> diff --git a/chrome/browser/views/options/advanced_contents_view.cc b/chrome/browser/views/options/advanced_contents_view.cc index 97a917c..3d750ee 100644 --- a/chrome/browser/views/options/advanced_contents_view.cc +++ b/chrome/browser/views/options/advanced_contents_view.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. +// 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. @@ -25,22 +25,29 @@ #include "chrome/browser/metrics/metrics_service.h" #include "chrome/browser/net/dns_global.h" #include "chrome/browser/safe_browsing/safe_browsing_service.h" +#include "chrome/browser/shell_dialogs.h" #include "chrome/browser/views/options/cookies_view.h" +#include "chrome/browser/views/options/fonts_languages_window_view.h" #include "chrome/browser/views/options/language_combobox_model.h" #include "chrome/browser/views/restart_message_box.h" #include "chrome/common/filter_policy.h" #include "chrome/common/pref_member.h" #include "chrome/common/pref_names.h" +#include "chrome/common/pref_service.h" #include "chrome/installer/util/google_update_settings.h" +#include "grit/app_resources.h" #include "grit/chromium_strings.h" #include "grit/generated_resources.h" #include "grit/locale_settings.h" #include "net/base/ssl_config_service.h" #include "net/base/cookie_policy.h" +#include "skia/ext/skia_utils_win.h" +#include "third_party/skia/include/core/SkBitmap.h" #include "views/background.h" #include "views/controls/button/checkbox.h" #include "views/controls/combo_box.h" #include "views/controls/scroll_view.h" +#include "views/controls/textfield/textfield.h" #include "views/grid_layout.h" #include "views/standard_layout.h" #include "views/widget/widget.h" @@ -50,6 +57,15 @@ using views::ColumnSet; namespace { +const int kFileIconSize = 16; +const int kFileIconVerticalSpacing = 3; +const int kFileIconHorizontalSpacing = 3; +const int kFileIconTextFieldSpacing = 3; + +} + +namespace { + // A background object that paints the scrollable list background, // which may be rendered by the system visual styles system. class ListBackground : public views::Background { @@ -73,6 +89,133 @@ class ListBackground : public views::Background { DISALLOW_COPY_AND_ASSIGN(ListBackground); }; + + +//////////////////////////////////////////////////////////////////////////////// +// FileDisplayArea + +class FileDisplayArea : public views::View { + public: + FileDisplayArea(); + virtual ~FileDisplayArea(); + + void SetFile(const FilePath& file_path); + + // views::View overrides: + virtual void Paint(gfx::Canvas* canvas); + virtual void Layout(); + virtual gfx::Size GetPreferredSize(); + + protected: + // views::View overrides: + virtual void ViewHierarchyChanged(bool is_add, + views::View* parent, + views::View* child); + + private: + void Init(); + + views::Textfield* text_field_; + SkColor text_field_background_color_; + + gfx::Rect icon_bounds_; + + bool initialized_; + + static void InitClass(); + static SkBitmap default_folder_icon_; + + DISALLOW_EVIL_CONSTRUCTORS(FileDisplayArea); +}; + +// static +SkBitmap FileDisplayArea::default_folder_icon_; + +FileDisplayArea::FileDisplayArea() + : text_field_(new views::Textfield), + text_field_background_color_(0), + initialized_(false) { + InitClass(); +} + +FileDisplayArea::~FileDisplayArea() { +} + +void FileDisplayArea::SetFile(const FilePath& file_path) { + // Force file path to have LTR directionality. + if (l10n_util::GetTextDirection() == l10n_util::RIGHT_TO_LEFT) { + string16 localized_file_path; + l10n_util::WrapPathWithLTRFormatting(file_path, &localized_file_path); + text_field_->SetText(UTF16ToWide(localized_file_path)); + } else { + text_field_->SetText(file_path.ToWStringHack()); + } +} + +void FileDisplayArea::Paint(gfx::Canvas* canvas) { + HDC dc = canvas->beginPlatformPaint(); + RECT rect = { 0, 0, width(), height() }; + gfx::NativeTheme::instance()->PaintTextField( + dc, EP_EDITTEXT, ETS_READONLY, 0, &rect, + skia::SkColorToCOLORREF(text_field_background_color_), true, true); + canvas->endPlatformPaint(); + // Mirror left point for icon_bounds_ to draw icon in RTL locales correctly. + canvas->DrawBitmapInt(default_folder_icon_, + MirroredLeftPointForRect(icon_bounds_), + icon_bounds_.y()); +} + +void FileDisplayArea::Layout() { + icon_bounds_.SetRect(kFileIconHorizontalSpacing, kFileIconVerticalSpacing, + kFileIconSize, kFileIconSize); + gfx::Size ps = text_field_->GetPreferredSize(); + text_field_->SetBounds(icon_bounds_.right() + kFileIconTextFieldSpacing, + (height() - ps.height()) / 2, + width() - icon_bounds_.right() - + kFileIconHorizontalSpacing - + kFileIconTextFieldSpacing, ps.height()); +} + +gfx::Size FileDisplayArea::GetPreferredSize() { + return gfx::Size(kFileIconSize + 2 * kFileIconVerticalSpacing, + kFileIconSize + 2 * kFileIconHorizontalSpacing); +} + +void FileDisplayArea::ViewHierarchyChanged(bool is_add, + views::View* parent, + views::View* child) { + if (!initialized_ && is_add && GetWidget()) + Init(); +} + +void FileDisplayArea::Init() { + initialized_ = true; + AddChildView(text_field_); + text_field_background_color_ = + gfx::NativeTheme::instance()->GetThemeColorWithDefault( + gfx::NativeTheme::TEXTFIELD, EP_EDITTEXT, ETS_READONLY, + TMT_FILLCOLOR, COLOR_3DFACE); + text_field_->SetReadOnly(true); + text_field_->RemoveBorder(); + text_field_->SetBackgroundColor(text_field_background_color_); +} + +// static +void FileDisplayArea::InitClass() { + static bool initialized = false; + if (!initialized) { + // We'd prefer to use UILayoutIsRightToLeft() to perform the RTL + // environment check, but it's nonstatic, so, instead, we check whether the + // locale is RTL. + bool ui_is_rtl = l10n_util::GetTextDirection() == l10n_util::RIGHT_TO_LEFT; + ResourceBundle& rb = ResourceBundle::GetSharedInstance(); + default_folder_icon_ = *rb.GetBitmapNamed(ui_is_rtl ? + IDR_FOLDER_CLOSED_RTL : + IDR_FOLDER_CLOSED); + initialized = true; + } +} + //////////////////////////////////////////////////////////////////////////////// // AdvancedSection // A convenience view for grouping advanced options together into related @@ -646,6 +789,8 @@ class WebContentSection : public AdvancedSection, private: // Controls for this section: + views::Label* fonts_and_languages_label_; + views::NativeButton* change_content_fonts_button_; views::Label* gears_label_; views::NativeButton* gears_settings_button_; @@ -653,7 +798,9 @@ class WebContentSection : public AdvancedSection, }; WebContentSection::WebContentSection(Profile* profile) - : gears_label_(NULL), + : fonts_and_languages_label_(NULL), + change_content_fonts_button_(NULL), + gears_label_(NULL), gears_settings_button_(NULL), AdvancedSection(profile, l10n_util::GetString(IDS_OPTIONS_ADVANCED_SECTION_TITLE_CONTENT)) { @@ -663,6 +810,11 @@ void WebContentSection::ButtonPressed(views::Button* sender) { if (sender == gears_settings_button_) { UserMetricsRecordAction(L"Options_GearsSettings", NULL); GearsSettingsPressed(GetAncestor(GetWidget()->GetNativeView(), GA_ROOT)); + } else if (sender == change_content_fonts_button_) { + views::Window::CreateChromeWindow( + GetWindow()->GetNativeWindow(), + gfx::Rect(), + new FontsLanguagesWindowView(profile()))->Show(); } } @@ -684,15 +836,34 @@ void WebContentSection::InitControlLayout() { gears_settings_button_ = new views::NativeButton( this, l10n_util::GetString(IDS_OPTIONS_GEARSSETTINGS_CONFIGUREGEARS_BUTTON)); + fonts_and_languages_label_ = new views::Label( + l10n_util::GetString(IDS_OPTIONS_FONTSETTINGS_INFO)); + + change_content_fonts_button_ = new views::NativeButton( + this, + l10n_util::GetString(IDS_OPTIONS_FONTSETTINGS_CONFIGUREFONTS_BUTTON)); GridLayout* layout = new GridLayout(contents_); contents_->SetLayoutManager(layout); - const int col_id = 0; - AddTwoColumnSet(layout, col_id); + const int single_column_view_set_id = 0; + AddWrappingColumnSet(layout, single_column_view_set_id); + const int indented_column_set_id = 1; + AddIndentedColumnSet(layout, indented_column_set_id); + const int single_double_column_set = 2; + AddTwoColumnSet(layout, single_double_column_set); + // Fonts and Languages. + AddWrappingLabelRow(layout, fonts_and_languages_label_, + single_column_view_set_id, + true); + AddLeadingControl(layout, change_content_fonts_button_, + indented_column_set_id, + false); + + // Gears. AddTwoColumnRow(layout, gears_label_, gears_settings_button_, false, - col_id, false); + single_double_column_set, false); } //////////////////////////////////////////////////////////////////////////////// @@ -758,8 +929,6 @@ class SecuritySection : public AdvancedSection, private: // Controls for this section: - views::Label* reset_file_handlers_label_; - views::NativeButton* reset_file_handlers_button_; views::Label* ssl_info_label_; views::Checkbox* enable_ssl2_checkbox_; views::Checkbox* check_for_cert_revocation_checkbox_; @@ -771,16 +940,13 @@ class SecuritySection : public AdvancedSection, // The contents of the mixed content combobox. scoped_ptr<MixedContentComboModel> mixed_content_model_; - StringPrefMember auto_open_files_; IntegerPrefMember filter_mixed_content_; DISALLOW_COPY_AND_ASSIGN(SecuritySection); }; SecuritySection::SecuritySection(Profile* profile) - : reset_file_handlers_label_(NULL), - reset_file_handlers_button_(NULL), - ssl_info_label_(NULL), + : ssl_info_label_(NULL), enable_ssl2_checkbox_(NULL), check_for_cert_revocation_checkbox_(NULL), mixed_content_info_label_(NULL), @@ -792,11 +958,7 @@ SecuritySection::SecuritySection(Profile* profile) } void SecuritySection::ButtonPressed(views::Button* sender) { - if (sender == reset_file_handlers_button_) { - profile()->GetDownloadManager()->ResetAutoOpenFiles(); - UserMetricsRecordAction(L"Options_ResetAutoOpenFiles", - profile()->GetPrefs()); - } else if (sender == enable_ssl2_checkbox_) { + if (sender == enable_ssl2_checkbox_) { bool enabled = enable_ssl2_checkbox_->checked(); if (enabled) { UserMetricsRecordAction(L"Options_SSL2_Enable", NULL); @@ -843,10 +1005,6 @@ void SecuritySection::ItemChanged(views::ComboBox* sender, void SecuritySection::InitControlLayout() { AdvancedSection::InitControlLayout(); - reset_file_handlers_label_ = new views::Label( - l10n_util::GetString(IDS_OPTIONS_AUTOOPENFILETYPES_INFO)); - reset_file_handlers_button_ = new views::NativeButton( - this, l10n_util::GetString(IDS_OPTIONS_AUTOOPENFILETYPES_RESETTODEFAULT)); ssl_info_label_ = new views::Label( l10n_util::GetString(IDS_OPTIONS_SSL_GROUP_DESCRIPTION)); enable_ssl2_checkbox_ = new views::Checkbox( @@ -880,12 +1038,6 @@ void SecuritySection::InitControlLayout() { const int indented_view_set_id = 4; AddIndentedColumnSet(layout, indented_view_set_id); - // File Handlers. - AddWrappingLabelRow(layout, reset_file_handlers_label_, - single_column_view_set_id, true); - AddLeadingControl(layout, reset_file_handlers_button_, indented_view_set_id, - false); - // SSL connection controls and Certificates. AddWrappingLabelRow(layout, manage_certificates_label_, single_column_view_set_id, true); @@ -905,20 +1057,12 @@ void SecuritySection::InitControlLayout() { indented_column_set_id, false); // Init member prefs so we can update the controls if prefs change. - auto_open_files_.Init(prefs::kDownloadExtensionsToOpen, profile()->GetPrefs(), - this); filter_mixed_content_.Init(prefs::kMixedContentFiltering, profile()->GetPrefs(), this); } // This method is called with a null pref_name when the dialog is initialized. void SecuritySection::NotifyPrefChanged(const std::wstring* pref_name) { - if (!pref_name || *pref_name == prefs::kDownloadExtensionsToOpen) { - bool enabled = - profile()->GetDownloadManager()->HasAutoOpenFileTypesRegistered(); - reset_file_handlers_label_->SetEnabled(enabled); - reset_file_handlers_button_->SetEnabled(enabled); - } if (!pref_name || *pref_name == prefs::kMixedContentFiltering) { mixed_content_combobox_->SetSelectedItem( MixedContentComboModel::FilterPolicyToIndex( @@ -1046,6 +1190,199 @@ void NetworkSection::NotifyPrefChanged(const std::wstring* pref_name) { } // namespace //////////////////////////////////////////////////////////////////////////////// +// DownloadSection + +class DownloadSection : public AdvancedSection, + public views::ButtonListener, + public SelectFileDialog::Listener { + public: + explicit DownloadSection(Profile* profile); + virtual ~DownloadSection() { + select_file_dialog_->ListenerDestroyed(); + } + + // Overridden from views::ButtonListener. + virtual void ButtonPressed(views::Button* sender); + + // SelectFileDialog::Listener implementation. + virtual void FileSelected(const FilePath& path, int index, void* params); + + // OptionsPageView implementation. + virtual bool CanClose() const; + + protected: + // OptionsPageView overrides. + virtual void InitControlLayout(); + virtual void NotifyPrefChanged(const std::wstring* pref_name); + + private: + // Controls for this section. + views::Label* download_file_location_label_; + FileDisplayArea* download_default_download_location_display_; + views::NativeButton* download_browse_button_; + views::Checkbox* download_ask_for_save_location_checkbox_; + scoped_refptr<SelectFileDialog> select_file_dialog_; + views::Label* reset_file_handlers_label_; + views::NativeButton* reset_file_handlers_button_; + + // Pref members. + StringPrefMember default_download_location_; + BooleanPrefMember ask_for_save_location_; + + // Updates the directory displayed in the default download location view with + // the current value of the pref. + void UpdateDownloadDirectoryDisplay(); + + StringPrefMember auto_open_files_; + + DISALLOW_COPY_AND_ASSIGN(DownloadSection); +}; + +DownloadSection::DownloadSection(Profile* profile) + : download_file_location_label_(NULL), + download_default_download_location_display_(NULL), + download_browse_button_(NULL), + download_ask_for_save_location_checkbox_(NULL), + ALLOW_THIS_IN_INITIALIZER_LIST( + select_file_dialog_(SelectFileDialog::Create(this))), + reset_file_handlers_label_(NULL), + reset_file_handlers_button_(NULL), + AdvancedSection(profile, + l10n_util::GetString(IDS_OPTIONS_DOWNLOADLOCATION_GROUP_NAME)) { +} + +void DownloadSection::ButtonPressed(views::Button* sender) { + if (sender == download_browse_button_) { + const std::wstring dialog_title = + l10n_util::GetString(IDS_OPTIONS_DOWNLOADLOCATION_BROWSE_TITLE); + select_file_dialog_->SelectFile(SelectFileDialog::SELECT_FOLDER, + dialog_title, + FilePath::FromWStringHack( + profile()->GetPrefs()->GetString( + prefs::kDownloadDefaultDirectory)), + NULL, 0, std::wstring(), + GetWindow()->GetNativeWindow(), + NULL); + } else if (sender == download_ask_for_save_location_checkbox_) { + bool enabled = download_ask_for_save_location_checkbox_->checked(); + if (enabled) { + UserMetricsRecordAction(L"Options_AskForSaveLocation_Enable", + profile()->GetPrefs()); + } else { + UserMetricsRecordAction(L"Options_AskForSaveLocation_Disable", + profile()->GetPrefs()); + } + ask_for_save_location_.SetValue(enabled); + } else if (sender == reset_file_handlers_button_) { + profile()->GetDownloadManager()->ResetAutoOpenFiles(); + UserMetricsRecordAction(L"Options_ResetAutoOpenFiles", + profile()->GetPrefs()); + } +} + +void DownloadSection::FileSelected(const FilePath& path, + int index, void* params) { + UserMetricsRecordAction(L"Options_SetDownloadDirectory", + profile()->GetPrefs()); + default_download_location_.SetValue(path.ToWStringHack()); + // We need to call this manually here since because we're setting the value + // through the pref member which avoids notifying the listener that set the + // value. + UpdateDownloadDirectoryDisplay(); +} + +bool DownloadSection::CanClose() const { + return !select_file_dialog_->IsRunning(GetWindow()->GetNativeWindow()); +} + +void DownloadSection::InitControlLayout() { + AdvancedSection::InitControlLayout(); + + // Layout the download components. + download_file_location_label_ = new views::Label( + l10n_util::GetString(IDS_OPTIONS_DOWNLOADLOCATION_BROWSE_TITLE)); + download_default_download_location_display_ = new FileDisplayArea; + download_browse_button_ = new views::NativeButton( + this, l10n_util::GetString(IDS_OPTIONS_DOWNLOADLOCATION_BROWSE_BUTTON)); + + download_ask_for_save_location_checkbox_ = new views::Checkbox( + l10n_util::GetString(IDS_OPTIONS_DOWNLOADLOCATION_ASKFORSAVELOCATION)); + download_ask_for_save_location_checkbox_->set_listener(this); + download_ask_for_save_location_checkbox_->SetMultiLine(true); + reset_file_handlers_label_ = new views::Label( + l10n_util::GetString(IDS_OPTIONS_AUTOOPENFILETYPES_INFO)); + reset_file_handlers_button_ = new views::NativeButton( + this, l10n_util::GetString(IDS_OPTIONS_AUTOOPENFILETYPES_RESETTODEFAULT)); + + GridLayout* layout = new GridLayout(contents_); + contents_->SetLayoutManager(layout); + + // Download location label. + const int single_column_view_set_id = 0; + AddWrappingColumnSet(layout, single_column_view_set_id); + AddWrappingLabelRow(layout, download_file_location_label_, + single_column_view_set_id, true); + + // Download location control. + const int double_column_view_set_id = 1; + ColumnSet* column_set = layout->AddColumnSet(double_column_view_set_id); + column_set->AddColumn(GridLayout::FILL, GridLayout::CENTER, 1, + GridLayout::USE_PREF, 0, 0); + column_set->AddPaddingColumn(0, kRelatedControlHorizontalSpacing); + column_set->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 0, + GridLayout::USE_PREF, 0, 0); + column_set->AddPaddingColumn(0, kUnrelatedControlHorizontalSpacing); + layout->StartRow(0, double_column_view_set_id); + layout->AddView(download_default_download_location_display_, 1, 1, + GridLayout::FILL, GridLayout::CENTER); + layout->AddView(download_browse_button_); + AddSpacing(layout, true); + + // Save location checkbox layout. + const int indented_view_set_id = 2; + AddIndentedColumnSet(layout, indented_view_set_id); + AddWrappingCheckboxRow(layout, download_ask_for_save_location_checkbox_, + indented_view_set_id, false); + + // Reset file handlers layout. + AddWrappingLabelRow(layout, reset_file_handlers_label_, + single_column_view_set_id, true); + AddLeadingControl(layout, reset_file_handlers_button_, + indented_view_set_id, + false); + + // Init member prefs so we can update the controls if prefs change. + default_download_location_.Init(prefs::kDownloadDefaultDirectory, + profile()->GetPrefs(), this); + ask_for_save_location_.Init(prefs::kPromptForDownload, + profile()->GetPrefs(), this); + auto_open_files_.Init(prefs::kDownloadExtensionsToOpen, profile()->GetPrefs(), + this); +} + +void DownloadSection::NotifyPrefChanged(const std::wstring* pref_name) { + if (!pref_name || *pref_name == prefs::kDownloadDefaultDirectory) + UpdateDownloadDirectoryDisplay(); + + if (!pref_name || *pref_name == prefs::kPromptForDownload) { + download_ask_for_save_location_checkbox_->SetChecked( + ask_for_save_location_.GetValue()); + } + + if (!pref_name || *pref_name == prefs::kDownloadExtensionsToOpen) { + bool enabled = + profile()->GetDownloadManager()->HasAutoOpenFileTypesRegistered(); + reset_file_handlers_label_->SetEnabled(enabled); + reset_file_handlers_button_->SetEnabled(enabled); + } +} + +void DownloadSection::UpdateDownloadDirectoryDisplay() { + download_default_download_location_display_->SetFile( + FilePath::FromWStringHack(default_download_location_.GetValue())); +} + +//////////////////////////////////////////////////////////////////////////////// // AdvancedContentsView class AdvancedContentsView : public OptionsPageView { @@ -1131,9 +1468,11 @@ void AdvancedContentsView::InitControlLayout() { GridLayout::USE_PREF, 0, 0); layout->StartRow(0, single_column_view_set_id); + layout->AddView(new NetworkSection(profile())); + layout->StartRow(0, single_column_view_set_id); layout->AddView(new PrivacySection(profile())); layout->StartRow(0, single_column_view_set_id); - layout->AddView(new NetworkSection(profile())); + layout->AddView(new DownloadSection(profile())); layout->StartRow(0, single_column_view_set_id); layout->AddView(new WebContentSection(profile())); layout->StartRow(0, single_column_view_set_id); diff --git a/chrome/browser/views/options/content_page_view.cc b/chrome/browser/views/options/content_page_view.cc index 639e0e7..adbd1d7 100644 --- a/chrome/browser/views/options/content_page_view.cc +++ b/chrome/browser/views/options/content_page_view.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. +// 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. @@ -13,228 +13,51 @@ #include "app/l10n_util.h" #include "app/resource_bundle.h" #include "base/command_line.h" -#include "base/file_util.h" #include "base/gfx/native_theme.h" #include "chrome/browser/browser_process.h" -#include "chrome/browser/shell_dialogs.h" -#include "chrome/browser/views/options/fonts_languages_window_view.h" +#include "chrome/browser/views/clear_browsing_data.h" +#include "chrome/browser/views/importer_view.h" #include "chrome/browser/views/options/options_group_view.h" #include "chrome/browser/views/options/passwords_exceptions_window_view.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/pref_names.h" -#include "chrome/common/pref_service.h" -#include "grit/app_resources.h" #include "grit/generated_resources.h" -#include "skia/ext/skia_utils_win.h" -#include "third_party/skia/include/core/SkBitmap.h" #include "views/controls/button/radio_button.h" -#include "views/controls/textfield/textfield.h" #include "views/grid_layout.h" #include "views/standard_layout.h" #include "views/widget/widget.h" namespace { -static const int kPopupBlockingRadioGroup = 1; -static const int kPasswordSavingRadioGroup = 2; -static const int kFileIconSize = 16; -static const int kFileIconVerticalSpacing = 3; -static const int kFileIconHorizontalSpacing = 3; -static const int kFileIconTextfieldSpacing = 3; +const int kPopupBlockingRadioGroup = 1; +const int kPasswordSavingRadioGroup = 2; } // namespace -//////////////////////////////////////////////////////////////////////////////// -// FileDisplayArea - -class FileDisplayArea : public views::View { - public: - FileDisplayArea(); - virtual ~FileDisplayArea(); - - void SetFile(const FilePath& file_path); - - // views::View overrides: - virtual void Paint(gfx::Canvas* canvas); - virtual void Layout(); - virtual gfx::Size GetPreferredSize(); - - protected: - // views::View overrides: - virtual void ViewHierarchyChanged(bool is_add, - views::View* parent, - views::View* child); - - private: - void Init(); - - views::Textfield* text_field_; - SkColor text_field_background_color_; - - gfx::Rect icon_bounds_; - - bool initialized_; - - static void InitClass(); - static SkBitmap default_folder_icon_; - - DISALLOW_EVIL_CONSTRUCTORS(FileDisplayArea); -}; - -// static -SkBitmap FileDisplayArea::default_folder_icon_; - -FileDisplayArea::FileDisplayArea() - : text_field_(new views::Textfield), - text_field_background_color_(0), - initialized_(false) { - InitClass(); -} - -FileDisplayArea::~FileDisplayArea() { -} - -void FileDisplayArea::SetFile(const FilePath& file_path) { - // Force file path to have LTR directionality. - if (l10n_util::GetTextDirection() == l10n_util::RIGHT_TO_LEFT) { - string16 localized_file_path; - l10n_util::WrapPathWithLTRFormatting(file_path, &localized_file_path); - text_field_->SetText(UTF16ToWide(localized_file_path)); - } else { - text_field_->SetText(file_path.ToWStringHack()); - } -} - -void FileDisplayArea::Paint(gfx::Canvas* canvas) { - HDC dc = canvas->beginPlatformPaint(); - RECT rect = { 0, 0, width(), height() }; - gfx::NativeTheme::instance()->PaintTextField( - dc, EP_EDITTEXT, ETS_READONLY, 0, &rect, - skia::SkColorToCOLORREF(text_field_background_color_), true, true); - canvas->endPlatformPaint(); - // Mirror left point for icon_bounds_ to draw icon in RTL locales correctly. - canvas->DrawBitmapInt(default_folder_icon_, - MirroredLeftPointForRect(icon_bounds_), - icon_bounds_.y()); -} - -void FileDisplayArea::Layout() { - icon_bounds_.SetRect(kFileIconHorizontalSpacing, kFileIconVerticalSpacing, - kFileIconSize, kFileIconSize); - gfx::Size ps = text_field_->GetPreferredSize(); - text_field_->SetBounds(icon_bounds_.right() + kFileIconTextfieldSpacing, - (height() - ps.height()) / 2, - width() - icon_bounds_.right() - - kFileIconHorizontalSpacing - - kFileIconTextfieldSpacing, ps.height()); -} - -gfx::Size FileDisplayArea::GetPreferredSize() { - return gfx::Size(kFileIconSize + 2 * kFileIconVerticalSpacing, - kFileIconSize + 2 * kFileIconHorizontalSpacing); -} - -void FileDisplayArea::ViewHierarchyChanged(bool is_add, - views::View* parent, - views::View* child) { - if (!initialized_ && is_add && GetWidget()) - Init(); -} - -void FileDisplayArea::Init() { - initialized_ = true; - AddChildView(text_field_); - text_field_background_color_ = - gfx::NativeTheme::instance()->GetThemeColorWithDefault( - gfx::NativeTheme::TEXTFIELD, EP_EDITTEXT, ETS_READONLY, - TMT_FILLCOLOR, COLOR_3DFACE); - text_field_->SetReadOnly(true); - text_field_->RemoveBorder(); - text_field_->SetBackgroundColor(text_field_background_color_); -} - -// static -void FileDisplayArea::InitClass() { - static bool initialized = false; - if (!initialized) { - // We'd prefer to use UILayoutIsRightToLeft() to perform the RTL - // environment check, but it's nonstatic, so, instead, we check whether the - // locale is RTL. - bool ui_is_rtl = l10n_util::GetTextDirection() == l10n_util::RIGHT_TO_LEFT; - ResourceBundle& rb = ResourceBundle::GetSharedInstance(); - default_folder_icon_ = *rb.GetBitmapNamed(ui_is_rtl ? - IDR_FOLDER_CLOSED_RTL : - IDR_FOLDER_CLOSED); - initialized = true; - } -} - -//////////////////////////////////////////////////////////////////////////////// -// ContentPageView, public: - ContentPageView::ContentPageView(Profile* profile) - : download_location_group_(NULL), - download_default_download_location_display_(NULL), - download_browse_button_(NULL), - download_ask_for_save_location_checkbox_(NULL), - ALLOW_THIS_IN_INITIALIZER_LIST( - select_file_dialog_(SelectFileDialog::Create(this))), - passwords_exceptions_button_(NULL), + : passwords_exceptions_button_(NULL), passwords_group_(NULL), passwords_asktosave_radio_(NULL), passwords_neversave_radio_(NULL), - fonts_lang_group_(NULL), - fonts_and_languages_label_(NULL), themes_group_(NULL), themes_reset_button_(NULL), - change_content_fonts_button_(NULL), + import_group_(NULL), + import_label_(NULL), + import_button_(NULL), + clear_data_group_(NULL), + clear_data_label_(NULL), + clear_data_button_(NULL), OptionsPageView(profile) { } ContentPageView::~ContentPageView() { - select_file_dialog_->ListenerDestroyed(); -} - -//////////////////////////////////////////////////////////////////////////////// -// ContentPageView, SelectFileDialog::Listener implementation: - -void ContentPageView::FileSelected(const FilePath& path, - int index, void* params) { - UserMetricsRecordAction(L"Options_SetDownloadDirectory", - profile()->GetPrefs()); - default_download_location_.SetValue(path.ToWStringHack()); - // We need to call this manually here since because we're setting the value - // through the pref member which avoids notifying the listener that set the - // value. - UpdateDownloadDirectoryDisplay(); } /////////////////////////////////////////////////////////////////////////////// // ContentPageView, views::ButtonListener implementation: void ContentPageView::ButtonPressed(views::Button* sender) { - if (sender == download_browse_button_) { - const std::wstring dialog_title = - l10n_util::GetString(IDS_OPTIONS_DOWNLOADLOCATION_BROWSE_TITLE); - select_file_dialog_->SelectFile(SelectFileDialog::SELECT_FOLDER, - dialog_title, - FilePath::FromWStringHack( - profile()->GetPrefs()->GetString( - prefs::kDownloadDefaultDirectory)), - NULL, 0, std::wstring(), - GetWindow()->GetNativeWindow(), - NULL); - } else if (sender == download_ask_for_save_location_checkbox_) { - bool enabled = download_ask_for_save_location_checkbox_->checked(); - if (enabled) { - UserMetricsRecordAction(L"Options_AskForSaveLocation_Enable", - profile()->GetPrefs()); - } else { - UserMetricsRecordAction(L"Options_AskForSaveLocation_Disable", - profile()->GetPrefs()); - } - ask_for_save_location_.SetValue(enabled); - } else if (sender == passwords_asktosave_radio_ || - sender == passwords_neversave_radio_) { + if (sender == passwords_asktosave_radio_ || + sender == passwords_neversave_radio_) { bool enabled = passwords_asktosave_radio_->checked(); if (enabled) { UserMetricsRecordAction(L"Options_PasswordManager_Enable", @@ -257,24 +80,25 @@ void ContentPageView::ButtonPressed(views::Button* sender) { profile()->GetPrefs()); } form_autofill_.SetValue(enabled); - } else if (sender == change_content_fonts_button_) { - views::Window::CreateChromeWindow( - GetWindow()->GetNativeWindow(), - gfx::Rect(), - new FontsLanguagesWindowView(profile()))->Show(); } else if (sender == themes_reset_button_) { UserMetricsRecordAction(L"Options_ThemesReset", profile()->GetPrefs()); profile()->ClearTheme(); + } else if (sender == import_button_) { + views::Window::CreateChromeWindow( + GetWindow()->GetNativeWindow(), + gfx::Rect(), + new ImporterView(profile()))->Show(); + } else if (sender == clear_data_button_) { + views::Window::CreateChromeWindow( + GetWindow()->GetNativeWindow(), + gfx::Rect(), + new ClearBrowsingDataView(profile()))->Show(); } } //////////////////////////////////////////////////////////////////////////////// // ContentPageView, OptionsPageView implementation: -bool ContentPageView::CanClose() const { - return !select_file_dialog_->IsRunning(GetWindow()->GetNativeWindow()); -} - void ContentPageView::InitControlLayout() { using views::GridLayout; using views::ColumnSet; @@ -288,23 +112,23 @@ void ContentPageView::InitControlLayout() { column_set->AddColumn(GridLayout::FILL, GridLayout::FILL, 1, GridLayout::USE_PREF, 0, 0); layout->StartRow(0, single_column_view_set_id); - InitDownloadLocation(); - layout->AddView(download_location_group_); + InitPasswordSavingGroup(); + layout->AddView(passwords_group_); layout->AddPaddingRow(0, kRelatedControlVerticalSpacing); layout->StartRow(0, single_column_view_set_id); - InitPasswordSavingGroup(); - layout->AddView(passwords_group_); + InitFormAutofillGroup(); + layout->AddView(form_autofill_group_); layout->AddPaddingRow(0, kRelatedControlVerticalSpacing); layout->StartRow(0, single_column_view_set_id); - InitFontsLangGroup(); - layout->AddView(fonts_lang_group_); + InitImportGroup(); + layout->AddView(import_group_); layout->AddPaddingRow(0, kRelatedControlVerticalSpacing); layout->StartRow(0, single_column_view_set_id); - InitFormAutofillGroup(); - layout->AddView(form_autofill_group_); + InitClearDataGroup(); + layout->AddView(clear_data_group_); layout->AddPaddingRow(0, kRelatedControlVerticalSpacing); if (CommandLine::ForCurrentProcess()-> @@ -316,23 +140,12 @@ void ContentPageView::InitControlLayout() { } // Init member prefs so we can update the controls if prefs change. - default_download_location_.Init(prefs::kDownloadDefaultDirectory, - profile()->GetPrefs(), this); - ask_for_save_location_.Init(prefs::kPromptForDownload, - profile()->GetPrefs(), this); ask_to_save_passwords_.Init(prefs::kPasswordManagerEnabled, profile()->GetPrefs(), this); form_autofill_.Init(prefs::kFormAutofillEnabled, profile()->GetPrefs(), this); } void ContentPageView::NotifyPrefChanged(const std::wstring* pref_name) { - if (!pref_name || *pref_name == prefs::kDownloadDefaultDirectory) - UpdateDownloadDirectoryDisplay(); - - if (!pref_name || *pref_name == prefs::kPromptForDownload) { - download_ask_for_save_location_checkbox_->SetChecked( - ask_for_save_location_.GetValue()); - } if (!pref_name || *pref_name == prefs::kPasswordManagerEnabled) { if (ask_to_save_passwords_.GetValue()) { passwords_asktosave_radio_->SetChecked(true); @@ -351,14 +164,12 @@ void ContentPageView::NotifyPrefChanged(const std::wstring* pref_name) { void ContentPageView::Layout() { // We need to Layout twice - once to get the width of the contents box... View::Layout(); - download_ask_for_save_location_checkbox_->SetBounds( - 0, 0, download_location_group_->GetContentsWidth(), 0); passwords_asktosave_radio_->SetBounds( 0, 0, passwords_group_->GetContentsWidth(), 0); passwords_neversave_radio_->SetBounds( 0, 0, passwords_group_->GetContentsWidth(), 0); - fonts_and_languages_label_->SetBounds( - 0, 0, fonts_lang_group_->GetContentsWidth(), 0); + import_label_->SetBounds(0, 0, import_group_->GetContentsWidth(), 0); + clear_data_label_->SetBounds(0, 0, clear_data_group_->GetContentsWidth(), 0); // ... and twice to get the height of multi-line items correct. View::Layout(); } @@ -366,53 +177,6 @@ void ContentPageView::Layout() { /////////////////////////////////////////////////////////////////////////////// // ContentPageView, private: -void ContentPageView::InitDownloadLocation() { - download_default_download_location_display_ = new FileDisplayArea; - download_browse_button_ = new views::NativeButton( - this, l10n_util::GetString(IDS_OPTIONS_DOWNLOADLOCATION_BROWSE_BUTTON)); - - download_ask_for_save_location_checkbox_ = new views::Checkbox( - l10n_util::GetString(IDS_OPTIONS_DOWNLOADLOCATION_ASKFORSAVELOCATION)); - download_ask_for_save_location_checkbox_->set_listener(this); - download_ask_for_save_location_checkbox_->SetMultiLine(true); - - using views::GridLayout; - using views::ColumnSet; - - views::View* contents = new views::View; - GridLayout* layout = new GridLayout(contents); - contents->SetLayoutManager(layout); - - const int double_column_view_set_id = 0; - ColumnSet* column_set = layout->AddColumnSet(double_column_view_set_id); - column_set->AddColumn(GridLayout::FILL, GridLayout::CENTER, 1, - GridLayout::USE_PREF, 0, 0); - column_set->AddPaddingColumn(0, kRelatedControlHorizontalSpacing); - column_set->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 0, - GridLayout::USE_PREF, 0, 0); - column_set->AddPaddingColumn(0, kUnrelatedControlHorizontalSpacing); - - layout->StartRow(0, double_column_view_set_id); - layout->AddView(download_default_download_location_display_, 1, 1, - GridLayout::FILL, GridLayout::CENTER); - layout->AddView(download_browse_button_); - - layout->AddPaddingRow(0, kUnrelatedControlVerticalSpacing); - - const int single_column_view_set_id = 1; - 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(download_ask_for_save_location_checkbox_); - - download_location_group_ = new OptionsGroupView( - contents, l10n_util::GetString(IDS_OPTIONS_DOWNLOADLOCATION_GROUP_NAME), - std::wstring(), - true); -} - void ContentPageView::InitPasswordSavingGroup() { passwords_asktosave_radio_ = new views::RadioButton( l10n_util::GetString(IDS_OPTIONS_PASSWORDS_ASKTOSAVE), @@ -461,39 +225,6 @@ void ContentPageView::InitPasswordSavingGroup() { true); } -void ContentPageView::InitFontsLangGroup() { - fonts_and_languages_label_ = new views::Label( - l10n_util::GetString(IDS_OPTIONS_FONTSETTINGS_INFO)); - fonts_and_languages_label_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); - fonts_and_languages_label_->SetMultiLine(true); - change_content_fonts_button_ = new views::NativeButton( - this, - l10n_util::GetString(IDS_OPTIONS_FONTSETTINGS_CONFIGUREFONTS_BUTTON)); - - using views::GridLayout; - using views::ColumnSet; - - views::View* contents = new views::View; - GridLayout* layout = new GridLayout(contents); - contents->SetLayoutManager(layout); - - const int single_column_view_set_id = 1; - ColumnSet* column_set = layout->AddColumnSet(single_column_view_set_id); - column_set->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 1, - GridLayout::USE_PREF, 0, 0); - - layout->StartRow(0, single_column_view_set_id); - layout->AddView(fonts_and_languages_label_); - layout->AddPaddingRow(0, kRelatedControlVerticalSpacing); - layout->StartRow(0, single_column_view_set_id); - layout->AddView(change_content_fonts_button_); - - fonts_lang_group_ = new OptionsGroupView( - contents, - l10n_util::GetString(IDS_OPTIONS_FONTSANDLANGUAGES_GROUP_NAME), - L"", true); -} - void ContentPageView::InitFormAutofillGroup() { form_autofill_checkbox_ = new views::Checkbox( l10n_util::GetString(IDS_AUTOFILL_SAVEFORMS)); @@ -534,17 +265,74 @@ void ContentPageView::InitThemesGroup() { const int single_column_view_set_id = 1; ColumnSet* column_set = layout->AddColumnSet(single_column_view_set_id); column_set->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 1, - GridLayout::USE_PREF, 0, 0); + GridLayout::USE_PREF, 0, 0); layout->StartRow(0, single_column_view_set_id); layout->AddView(themes_reset_button_); themes_group_ = new OptionsGroupView( - contents, l10n_util::GetString(IDS_THEMES_GROUP_NAME), - L"", false); + contents, l10n_util::GetString(IDS_THEMES_GROUP_NAME), + L"", false); +} + +void ContentPageView::InitClearDataGroup() { + clear_data_button_ = new views::NativeButton(this, + l10n_util::GetString(IDS_OPTIONS_CLEAR_DATA_BUTTON)); + clear_data_label_ = new views::Label( + l10n_util::GetString(IDS_OPTIONS_CLEAR_DATA_INFO)); + clear_data_label_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); + clear_data_label_->SetMultiLine(true); + + using views::GridLayout; + using views::ColumnSet; + + views::View* contents = new views::View; + GridLayout* layout = new GridLayout(contents); + contents->SetLayoutManager(layout); + + const int single_column_view_set_id = 1; + ColumnSet* column_set = layout->AddColumnSet(single_column_view_set_id); + column_set->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 1, + GridLayout::USE_PREF, 0, 0); + + layout->StartRow(0, single_column_view_set_id); + layout->AddView(clear_data_label_); + layout->AddPaddingRow(0, kRelatedControlVerticalSpacing); + layout->StartRow(0, single_column_view_set_id); + layout->AddView(clear_data_button_); + + clear_data_group_ = new OptionsGroupView( + contents, l10n_util::GetString(IDS_OPTIONS_CLEAR_DATA_GROUP_NAME), + L"", true); } -void ContentPageView::UpdateDownloadDirectoryDisplay() { - download_default_download_location_display_->SetFile( - FilePath::FromWStringHack(default_download_location_.GetValue())); +void ContentPageView::InitImportGroup() { + import_button_ = new views::NativeButton(this, + l10n_util::GetString(IDS_OPTIONS_IMPORT_DATA_BUTTON)); + import_label_ = new views::Label( + l10n_util::GetString(IDS_OPTIONS_IMPORT_DATA_INFO)); + import_label_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); + import_label_->SetMultiLine(true); + + using views::GridLayout; + using views::ColumnSet; + + views::View* contents = new views::View; + GridLayout* layout = new GridLayout(contents); + contents->SetLayoutManager(layout); + + const int single_column_view_set_id = 1; + ColumnSet* column_set = layout->AddColumnSet(single_column_view_set_id); + column_set->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 1, + GridLayout::USE_PREF, 0, 0); + + layout->StartRow(0, single_column_view_set_id); + layout->AddView(import_label_); + layout->AddPaddingRow(0, kRelatedControlVerticalSpacing); + layout->StartRow(0, single_column_view_set_id); + layout->AddView(import_button_); + + import_group_ = new OptionsGroupView( + contents, l10n_util::GetString(IDS_OPTIONS_IMPORT_DATA_GROUP_NAME), + L"", true); } diff --git a/chrome/browser/views/options/content_page_view.h b/chrome/browser/views/options/content_page_view.h index ff133e3..af5dc4a 100644 --- a/chrome/browser/views/options/content_page_view.h +++ b/chrome/browser/views/options/content_page_view.h @@ -1,12 +1,11 @@ -// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. +// 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. -#ifndef CHROME_BROWSER_VIEWS_OPTIONS_CONTENT_PAGE_VIEW_H__ -#define CHROME_BROWSER_VIEWS_OPTIONS_CONTENT_PAGE_VIEW_H__ +#ifndef CHROME_BROWSER_VIEWS_OPTIONS_CONTENT_PAGE_VIEW_H_ +#define CHROME_BROWSER_VIEWS_OPTIONS_CONTENT_PAGE_VIEW_H_ #include "chrome/browser/views/options/options_page_view.h" -#include "chrome/browser/shell_dialogs.h" #include "chrome/common/pref_member.h" #include "views/controls/button/button.h" #include "views/view.h" @@ -24,8 +23,7 @@ class PrefService; // ContentPageView class ContentPageView : public OptionsPageView, - public views::ButtonListener, - public SelectFileDialog::Listener { + public views::ButtonListener { public: explicit ContentPageView(Profile* profile); virtual ~ContentPageView(); @@ -33,12 +31,6 @@ class ContentPageView : public OptionsPageView, // views::ButtonListener implementation: virtual void ButtonPressed(views::Button* sender); - // SelectFileDialog::Listener implementation: - virtual void FileSelected(const FilePath& path, int index, void* params); - - // OptionsPageView implementation: - virtual bool CanClose() const; - protected: // OptionsPageView implementation: virtual void InitControlLayout(); @@ -49,34 +41,18 @@ class ContentPageView : public OptionsPageView, private: // Init all the dialog controls. - void InitDownloadLocation(); void InitPasswordSavingGroup(); - void InitFontsLangGroup(); void InitFormAutofillGroup(); + void InitImportGroup(); + void InitClearDataGroup(); void InitThemesGroup(); - // Updates the directory displayed in the default download location view with - // the current value of the pref. - void UpdateDownloadDirectoryDisplay(); - - // Controls for the Download Location group. - OptionsGroupView* download_location_group_; - FileDisplayArea* download_default_download_location_display_; - views::NativeButton* download_browse_button_; - views::Checkbox* download_ask_for_save_location_checkbox_; - scoped_refptr<SelectFileDialog> select_file_dialog_; - // Controls for the Password Saving group views::NativeButton* passwords_exceptions_button_; OptionsGroupView* passwords_group_; views::RadioButton* passwords_asktosave_radio_; views::RadioButton* passwords_neversave_radio_; - // Controls for the Fonts and Languages group. - OptionsGroupView* fonts_lang_group_; - views::Label* fonts_and_languages_label_; - views::NativeButton* change_content_fonts_button_; - // Controls for the Form Autofill group OptionsGroupView* form_autofill_group_; views::Checkbox* form_autofill_checkbox_; @@ -90,12 +66,20 @@ class ContentPageView : public OptionsPageView, views::RadioButton* popups_show_minimized_radio_; views::RadioButton* popups_block_all_radio_; - StringPrefMember default_download_location_; - BooleanPrefMember ask_for_save_location_; + // Controls for the Import bookmarks and settings group. + OptionsGroupView* import_group_; + views::Label* import_label_; + views::NativeButton* import_button_; + + // Controls for Clear browsing data group. + OptionsGroupView* clear_data_group_; + views::Label* clear_data_label_; + views::NativeButton* clear_data_button_; + BooleanPrefMember ask_to_save_passwords_; BooleanPrefMember form_autofill_; - DISALLOW_EVIL_CONSTRUCTORS(ContentPageView); + DISALLOW_COPY_AND_ASSIGN(ContentPageView); }; -#endif // #ifndef CHROME_BROWSER_VIEWS_OPTIONS_CONTENT_PAGE_VIEW_H__ +#endif // CHROME_BROWSER_VIEWS_OPTIONS_CONTENT_PAGE_VIEW_H_ |