diff options
Diffstat (limited to 'chrome/browser/views/options/advanced_contents_view.cc')
-rw-r--r-- | chrome/browser/views/options/advanced_contents_view.cc | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/chrome/browser/views/options/advanced_contents_view.cc b/chrome/browser/views/options/advanced_contents_view.cc index 6270e4f..3200494 100644 --- a/chrome/browser/views/options/advanced_contents_view.cc +++ b/chrome/browser/views/options/advanced_contents_view.cc @@ -19,6 +19,7 @@ #include "base/i18n/rtl.h" #include "base/message_loop.h" #include "base/path_service.h" +#include "base/scoped_callback_factory.h" #include "base/thread.h" #include "base/utf_string_conversions.h" #include "chrome/browser/browser.h" @@ -32,6 +33,7 @@ #include "chrome/browser/prefs/pref_member.h" #include "chrome/browser/prefs/pref_service.h" #include "chrome/browser/prefs/pref_set_observer.h" +#include "chrome/browser/printing/cloud_print/cloud_print_setup_flow.h" #include "chrome/browser/profile.h" #include "chrome/browser/renderer_host/resource_dispatcher_host.h" #include "chrome/browser/safe_browsing/safe_browsing_service.h" @@ -1365,6 +1367,161 @@ void ChromeAppsSection::NotifyPrefChanged(const std::string* pref_name) { } //////////////////////////////////////////////////////////////////////////////// +// CloudPrintProxySection + +class CloudPrintProxySection : public AdvancedSection, + public views::ButtonListener { + public: + explicit CloudPrintProxySection(Profile* profile); + virtual ~CloudPrintProxySection() {} + + // Overridden from views::ButtonListener: + virtual void ButtonPressed(views::Button* sender, const views::Event& event); + + // Callback that gets the cloud print proxy status. + void StatusCallback(bool enabled, std::string email); + + protected: + // OptionsPageView overrides: + virtual void InitControlLayout(); + virtual void NotifyPrefChanged(const std::string* pref_name); + + private: + bool Enabled() const; + + // Controls for this section: + views::Label* section_description_label_; + views::NativeButton* enable_disable_button_; + views::NativeButton* manage_printer_button_; + + // Preferences we tie things to. + StringPrefMember cloud_print_proxy_email_; + + base::ScopedCallbackFactory<CloudPrintProxySection> factory_; + + DISALLOW_COPY_AND_ASSIGN(CloudPrintProxySection); +}; + +CloudPrintProxySection::CloudPrintProxySection(Profile* profile) + : section_description_label_(NULL), + enable_disable_button_(NULL), + manage_printer_button_(NULL), + factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), + AdvancedSection(profile, + l10n_util::GetString( + IDS_OPTIONS_ADVANCED_SECTION_TITLE_CLOUD_PRINT)) { +} + +void CloudPrintProxySection::ButtonPressed(views::Button* sender, + const views::Event& event) { + if (sender == enable_disable_button_) { + if (Enabled()) { + // Enabled, we must be the disable button. + UserMetricsRecordAction( + UserMetricsAction("Options_DisableCloudPrintProxy"), NULL); + CloudPrintSetupFlow::DisableCloudPrintProxy(profile()); + } else { + UserMetricsRecordAction( + UserMetricsAction("Options_EnableCloudPrintProxy"), NULL); + // We open a new browser window so the Options dialog doesn't + // get lost behind other windows. + CloudPrintSetupFlow::OpenDialog(profile()); + } + } else if (sender == manage_printer_button_) { + // Open a new browser window for the management tab. The browser + // will go away when the user closes that tab. + Browser* browser = Browser::Create(profile()); + // FIXME(scottbyer): Refactor Cloud Print URL creation. + // http://code.google.com/p/chromium/issues/detail?id=56850 + browser->OpenURL(GURL("https://www.google.com/cloudprint/manage.html"), + GURL(), NEW_WINDOW, PageTransition::LINK); + } +} + +void CloudPrintProxySection::StatusCallback(bool enabled, std::string email) { + profile()->GetPrefs()->SetString(prefs::kCloudPrintEmail, + enabled ? email : std::string()); +} + +void CloudPrintProxySection::InitControlLayout() { + AdvancedSection::InitControlLayout(); + + section_description_label_ = new views::Label( + l10n_util::GetString(IDS_OPTIONS_CLOUD_PRINT_PROXY_DISABLED_LABEL)); + enable_disable_button_ = new views::NativeButton(this, + l10n_util::GetString(IDS_OPTIONS_CLOUD_PRINT_PROXY_DISABLED_BUTTON)); + manage_printer_button_ = new views::NativeButton(this, + l10n_util::GetString( + IDS_OPTIONS_CLOUD_PRINT_PROXY_ENABLED_MANAGE_BUTTON)); + + GridLayout* layout = new GridLayout(contents_); + contents_->SetLayoutManager(layout); + + const int single_column_view_set_id = 0; + AddWrappingColumnSet(layout, single_column_view_set_id); + const int control_view_set_id = 1; + AddDependentTwoColumnSet(layout, control_view_set_id); + + // The description label at the top and label. + section_description_label_->SetMultiLine(true); + AddWrappingLabelRow(layout, section_description_label_, + single_column_view_set_id, true); + + // The enable / disable button and manage button. + AddTwoColumnRow(layout, enable_disable_button_, manage_printer_button_, false, + control_view_set_id, kRelatedControlVerticalSpacing); + + // Attach the preferences so we can flip things appropriately. + cloud_print_proxy_email_.Init(prefs::kCloudPrintEmail, + profile()->GetPrefs(), this); + + // Start the UI off in the state we think it should be in. + std::string pref_string(prefs::kCloudPrintEmail); + NotifyPrefChanged(&pref_string); + + // Kick off a task to ask the background service what the real + // answer is. + CloudPrintSetupFlow::RefreshPreferencesFromService( + profile(), + factory_.NewCallback(&CloudPrintProxySection::StatusCallback)); +} + +void CloudPrintProxySection::NotifyPrefChanged(const std::string* pref_name) { + if (pref_name == NULL) + return; + + if (*pref_name == prefs::kCloudPrintEmail) { + if (Enabled()) { + std::string email; + if (profile()->GetPrefs()->HasPrefPath(prefs::kCloudPrintEmail)) + email = profile()->GetPrefs()->GetString(prefs::kCloudPrintEmail); + + section_description_label_->SetText( + l10n_util::GetStringF(IDS_OPTIONS_CLOUD_PRINT_PROXY_ENABLED_LABEL, + UTF8ToWide(email))); + enable_disable_button_->SetLabel( + l10n_util::GetString(IDS_OPTIONS_CLOUD_PRINT_PROXY_ENABLED_BUTTON)); + enable_disable_button_->InvalidateLayout(); + manage_printer_button_->SetVisible(true); + manage_printer_button_->InvalidateLayout(); + } else { + section_description_label_->SetText( + l10n_util::GetString(IDS_OPTIONS_CLOUD_PRINT_PROXY_DISABLED_LABEL)); + enable_disable_button_->SetLabel( + l10n_util::GetString(IDS_OPTIONS_CLOUD_PRINT_PROXY_DISABLED_BUTTON)); + enable_disable_button_->InvalidateLayout(); + manage_printer_button_->SetVisible(false); + } + Layout(); + } +} + +bool CloudPrintProxySection::Enabled() const { + return profile()->GetPrefs()->HasPrefPath(prefs::kCloudPrintEmail) && + !profile()->GetPrefs()->GetString(prefs::kCloudPrintEmail).empty(); +} + +//////////////////////////////////////////////////////////////////////////////// // AdvancedContentsView class AdvancedContentsView : public OptionsPageView { @@ -1462,6 +1619,11 @@ void AdvancedContentsView::InitControlLayout() { layout->StartRow(0, single_column_view_set_id); layout->AddView(new SecuritySection(profile())); if (CommandLine::ForCurrentProcess()->HasSwitch( + switches::kEnableCloudPrintProxy)) { + layout->StartRow(0, single_column_view_set_id); + layout->AddView(new CloudPrintProxySection(profile())); + } + if (CommandLine::ForCurrentProcess()->HasSwitch( switches::kEnableBackgroundMode)) { layout->StartRow(0, single_column_view_set_id); layout->AddView(new ChromeAppsSection(profile())); |