Chromium Code Reviews| Index: chrome/browser/autofill/autofill_cc_infobar_win.cc |
| =================================================================== |
| --- chrome/browser/autofill/autofill_cc_infobar_win.cc (revision 0) |
| +++ chrome/browser/autofill/autofill_cc_infobar_win.cc (revision 0) |
| @@ -0,0 +1,195 @@ |
| +// Copyright (c) 2010 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/autofill/autofill_cc_infobar.h" |
| + |
| +#include "app/l10n_util.h" |
| +#include "app/resource_bundle.h" |
| +#include "chrome/browser/views/event_utils.h" |
| +#include "chrome/browser/views/infobars/infobar_button_border.h" |
| +#include "chrome/browser/views/infobars/infobars.h" |
| +#include "chrome/common/pref_names.h" |
| +#include "grit/chromium_strings.h" |
| +#include "grit/generated_resources.h" |
| +#include "grit/theme_resources.h" |
| +#include "third_party/skia/include/core/SkBitmap.h" |
| +#include "views/controls/button/text_button.h" |
| +#include "views/controls/link.h" |
| + |
| +class SaveCCInfoConfirmInfoBar : public AlertInfoBar, |
| + public views::LinkController { |
| + public: |
| + explicit SaveCCInfoConfirmInfoBar(ConfirmInfoBarDelegate* delegate); |
| + virtual ~SaveCCInfoConfirmInfoBar(); |
| + |
| + // Overridden from views::View: |
| + virtual void Layout(); |
| + |
| + // Overridden from views::LinkController: |
| + virtual void LinkActivated(views::Link* source, int event_flags); |
| + |
| + protected: |
| + // Overridden from views::View: |
| + virtual void ViewHierarchyChanged(bool is_add, |
| + views::View* parent, |
| + views::View* child); |
| + |
| + // Overridden from views::ButtonListener: |
| + virtual void ButtonPressed(views::Button* sender, const views::Event& event); |
| + |
| + // Overridden from InfoBar: |
| + virtual int GetAvailableWidth() const; |
| + |
| + private: |
| + void Init(); |
| + views::TextButton* CreateTextButton(const std::wstring& text); |
| + |
| + ConfirmInfoBarDelegate* GetDelegate(); |
| + |
| + // The buttons are owned by InfoBar view from the moment they added to its |
|
James Hawkins
2010/07/16 22:18:30
they are added*
GeorgeY
2010/07/16 22:37:05
Done.
|
| + // hierarchy (Init() called), but we still need pointers to them to process |
| + // messages from them. |
| + views::TextButton* save_button_; |
| + views::TextButton* dont_save_button_; |
| + views::Link* link_; |
| + bool initialized_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(SaveCCInfoConfirmInfoBar); |
| +}; |
| + |
| +SaveCCInfoConfirmInfoBar::SaveCCInfoConfirmInfoBar( |
| + ConfirmInfoBarDelegate* delegate) |
| + : AlertInfoBar(delegate), |
| + initialized_(false) { |
| + save_button_ = CreateTextButton(delegate->GetButtonLabel( |
| + ConfirmInfoBarDelegate::BUTTON_OK)); |
| + dont_save_button_ = CreateTextButton(delegate->GetButtonLabel( |
| + ConfirmInfoBarDelegate::BUTTON_CANCEL)); |
| + // Set up the link. |
| + link_ = new views::Link; |
| + link_->SetText(delegate->GetLinkText()); |
| + ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
| + link_->SetFont(rb.GetFont(ResourceBundle::MediumFont)); |
| + link_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); |
| + link_->SetController(this); |
| + link_->MakeReadableOverBackgroundColor(background()->get_color()); |
| +} |
| + |
| +SaveCCInfoConfirmInfoBar::~SaveCCInfoConfirmInfoBar() { |
| + if (!initialized_) { |
| + delete save_button_; |
| + delete dont_save_button_; |
| + delete link_; |
| + } |
| +} |
| + |
| +void SaveCCInfoConfirmInfoBar::Layout() { |
| + // Layout the close button. |
| + InfoBar::Layout(); |
| + |
| + int available_width = AlertInfoBar::GetAvailableWidth(); |
| + |
| + // Now append the link to the label's right edge. |
| + link_->SetVisible(!link_->GetText().empty()); |
| + gfx::Size link_ps = link_->GetPreferredSize(); |
| + int link_x = available_width - kButtonButtonSpacing - link_ps.width(); |
| + link_->SetBounds(link_x, OffsetY(this, link_ps), link_ps.width(), |
| + link_ps.height()); |
| + available_width = link_x; |
| + |
| + // Layout the cancel and OK buttons. |
| + gfx::Size save_ps = save_button_->GetPreferredSize(); |
| + gfx::Size dont_save_ps = dont_save_button_->GetPreferredSize(); |
| + |
| + // Layout the icon and label. |
| + AlertInfoBar::Layout(); |
| + |
| + int save_x = label()->bounds().right() + kEndOfLabelSpacing; |
| + save_x = std::max(0, std::min(save_x, available_width - (save_ps.width() + |
| + dont_save_ps.width() + kButtonButtonSpacing))); |
| + |
| + save_button_->SetVisible(true); |
| + dont_save_button_->SetVisible(true); |
| + |
| + save_button_->SetBounds(save_x, OffsetY(this, save_ps), save_ps.width(), |
| + save_ps.height()); |
| + int dont_save_x = save_x + save_ps.width() + kButtonButtonSpacing; |
| + dont_save_button_->SetBounds(dont_save_x, OffsetY(this, dont_save_ps), |
| + dont_save_ps.width(), dont_save_ps.height()); |
| +} |
| + |
| +void SaveCCInfoConfirmInfoBar::LinkActivated(views::Link* source, |
| + int event_flags) { |
| + DCHECK(source == link_); |
| + DCHECK(link_->IsVisible()); |
| + DCHECK(!link_->GetText().empty()); |
| + GetDelegate()->LinkClicked( |
| + event_utils::DispositionFromEventFlags(event_flags)); |
| +} |
| + |
| +void SaveCCInfoConfirmInfoBar::ViewHierarchyChanged(bool is_add, |
| + views::View* parent, |
| + views::View* child) { |
| + InfoBar::ViewHierarchyChanged(is_add, parent, child); |
| + if (is_add && child == this && !initialized_) { |
| + Init(); |
| + initialized_ = true; |
| + } |
| +} |
| + |
| +void SaveCCInfoConfirmInfoBar::ButtonPressed(views::Button* sender, |
| + const views::Event& event) { |
| + InfoBar::ButtonPressed(sender, event); |
| + if (sender == save_button_) { |
| + if (GetDelegate()->Accept()) |
| + RemoveInfoBar(); |
| + } else if (sender == dont_save_button_) { |
| + if (GetDelegate()->Cancel()) |
| + RemoveInfoBar(); |
| + } |
| +} |
| + |
| +int SaveCCInfoConfirmInfoBar::GetAvailableWidth() const { |
| + int buttons_area_size = save_button_->GetPreferredSize().width() + |
| + dont_save_button_->GetPreferredSize().width() + kButtonButtonSpacing + |
| + kEndOfLabelSpacing; |
| + return std::max(0, link_->x() - buttons_area_size); |
| +} |
| + |
| +void SaveCCInfoConfirmInfoBar::Init() { |
| + AddChildView(save_button_); |
| + AddChildView(dont_save_button_); |
| + AddChildView(link_); |
| +} |
| + |
| +views::TextButton* SaveCCInfoConfirmInfoBar::CreateTextButton( |
| + const std::wstring& text) { |
| + views::TextButton* text_button = new views::TextButton(this, std::wstring()); |
| + text_button->set_border(new InfoBarButtonBorder); |
| + |
| + // Set font colors for different states. |
| + text_button->SetEnabledColor(SK_ColorBLACK); |
| + text_button->SetHighlightColor(SK_ColorBLACK); |
| + text_button->SetHoverColor(SK_ColorBLACK); |
| + text_button->SetNormalHasBorder(true); |
| + text_button->SetShowHighlighted(true); |
| + |
| + // Set font then text, then size button to fit text. |
| + text_button->SetFont(ResourceBundle::GetSharedInstance().GetFont( |
| + ResourceBundle::MediumFont)); |
| + text_button->SetText(text); |
| + text_button->ClearMaxTextSize(); |
| + text_button->SizeToPreferredSize(); |
| + return text_button; |
| +} |
| + |
| +ConfirmInfoBarDelegate* SaveCCInfoConfirmInfoBar::GetDelegate() { |
| + return delegate()->AsConfirmInfoBarDelegate(); |
| +} |
| + |
| +InfoBar* CreateAutofillCcInfoBar(ConfirmInfoBarDelegate* delegate) { |
| + DCHECK(delegate); |
| + return new SaveCCInfoConfirmInfoBar(delegate); |
| +} |
| + |
| Property changes on: chrome\browser\autofill\autofill_cc_infobar_win.cc |
| ___________________________________________________________________ |
| Added: svn:eol-style |
| + LF |