Index: chrome/browser/ui/views/autofill/autofill_dialog_views.cc |
diff --git a/chrome/browser/ui/views/autofill/autofill_dialog_views.cc b/chrome/browser/ui/views/autofill/autofill_dialog_views.cc |
index 5c9bade41701c349b1152310ddfedfd76da4b9f0..967645a97c52159a6db7ef7c4025443c45323e63 100644 |
--- a/chrome/browser/ui/views/autofill/autofill_dialog_views.cc |
+++ b/chrome/browser/ui/views/autofill/autofill_dialog_views.cc |
@@ -9,10 +9,12 @@ |
#include "base/utf_string_conversions.h" |
#include "chrome/browser/ui/autofill/autofill_dialog_controller.h" |
#include "chrome/browser/ui/views/constrained_window_views.h" |
+#include "grit/theme_resources.h" |
#include "third_party/skia/include/core/SkColor.h" |
+#include "ui/base/resource/resource_bundle.h" |
#include "ui/views/border.h" |
#include "ui/views/controls/button/checkbox.h" |
-#include "ui/views/controls/button/menu_button.h" |
+#include "ui/views/controls/button/image_button.h" |
#include "ui/views/controls/combobox/combobox.h" |
#include "ui/views/controls/label.h" |
#include "ui/views/controls/menu/menu_model_adapter.h" |
@@ -38,13 +40,20 @@ views::Label* CreateDetailsSectionLabel(const string16& text) { |
return label; |
} |
-// Creates a view that packs a label on the left and some related controls |
-// on the right. |
-views::View* CreateSectionContainer(const string16& label, |
- views::View* controls) { |
- views::View* container = new views::View(); |
- views::GridLayout* layout = new views::GridLayout(container); |
- container->SetLayoutManager(layout); |
+} // namespace |
+ |
+// AutofillDialogViews::SectionContainer --------------------------------------- |
+ |
+AutofillDialogViews::SectionContainer::SectionContainer( |
+ const string16& label, |
+ views::View* controls, |
+ views::Button* proxy_button) |
+ : proxy_button_(proxy_button), |
+ forward_mouse_events_(false) { |
+ set_notify_enter_exit_on_child(true); |
+ |
+ views::GridLayout* layout = new views::GridLayout(this); |
+ SetLayoutManager(layout); |
const int kColumnSetId = 0; |
views::ColumnSet* column_set = layout->AddColumnSet(kColumnSetId); |
@@ -67,10 +76,63 @@ views::View* CreateSectionContainer(const string16& label, |
layout->StartRow(0, kColumnSetId); |
layout->AddView(CreateDetailsSectionLabel(label)); |
layout->AddView(controls); |
- return container; |
} |
-} // namespace |
+AutofillDialogViews::SectionContainer::~SectionContainer() {} |
+ |
+void AutofillDialogViews::SectionContainer::SetForwardMouseEvents( |
+ bool forward) { |
+ forward_mouse_events_ = forward; |
+ if (!forward) |
+ set_background(NULL); |
+} |
+ |
+void AutofillDialogViews::SectionContainer::OnMouseEntered( |
+ const ui::MouseEvent& event) { |
+ if (!forward_mouse_events_) |
+ return; |
+ |
+ // TODO(estade): use the correct color. |
+ set_background(views::Background::CreateSolidBackground(SK_ColorLTGRAY)); |
+ proxy_button_->OnMouseEntered(ProxyEvent(event)); |
+ SchedulePaint(); |
+} |
+ |
+void AutofillDialogViews::SectionContainer::OnMouseExited( |
+ const ui::MouseEvent& event) { |
+ if (!forward_mouse_events_) |
+ return; |
+ |
+ set_background(NULL); |
+ proxy_button_->OnMouseExited(ProxyEvent(event)); |
+ SchedulePaint(); |
+} |
+ |
+bool AutofillDialogViews::SectionContainer::OnMousePressed( |
+ const ui::MouseEvent& event) { |
+ if (!forward_mouse_events_) |
+ return false; |
+ |
+ return proxy_button_->OnMousePressed(ProxyEvent(event)); |
+} |
+ |
+void AutofillDialogViews::SectionContainer::OnMouseReleased( |
+ const ui::MouseEvent& event) { |
+ if (!forward_mouse_events_) |
+ return; |
+ |
+ proxy_button_->OnMouseReleased(ProxyEvent(event)); |
+} |
+ |
+// static |
+ui::MouseEvent AutofillDialogViews::SectionContainer::ProxyEvent( |
+ const ui::MouseEvent& event) { |
+ ui::MouseEvent event_copy = event; |
+ event_copy.set_location(gfx::Point()); |
+ return event_copy; |
+} |
+ |
+// AutofillDialogView ---------------------------------------------------------- |
// static |
AutofillDialogView* AutofillDialogView::Create( |
@@ -78,6 +140,8 @@ AutofillDialogView* AutofillDialogView::Create( |
return new AutofillDialogViews(controller); |
} |
+// AutofillDialogViews --------------------------------------------------------- |
+ |
AutofillDialogViews::AutofillDialogViews(AutofillDialogController* controller) |
: controller_(controller), |
did_submit_(false), |
@@ -182,30 +246,30 @@ bool AutofillDialogViews::Accept() { |
void AutofillDialogViews::ButtonPressed(views::Button* sender, |
const ui::Event& event) { |
- DCHECK_EQ(sender, use_billing_for_shipping_); |
- shipping_.container->SetVisible(!use_billing_for_shipping_->checked()); |
- GetWidget()->SetSize(GetWidget()->non_client_view()->GetPreferredSize()); |
-} |
- |
-void AutofillDialogViews::OnMenuButtonClicked(views::View* source, |
- const gfx::Point& point) { |
- DetailsGroup* group = |
- source == email_.suggested_button ? &email_ : |
- source == cc_.suggested_button ? &cc_ : |
- source == billing_.suggested_button ? &billing_ : |
- source == shipping_.suggested_button ? &shipping_ : NULL; |
- DCHECK(group); |
- views::MenuModelAdapter adapter( |
- controller_->MenuModelForSection(group->section)); |
- menu_runner_.reset(new views::MenuRunner(adapter.CreateMenu())); |
- |
- // Ignore the result since we don't need to handle a deleted menu specially. |
- ignore_result( |
- menu_runner_->RunMenuAt(source->GetWidget(), |
- group->suggested_button, |
- gfx::Rect(point, gfx::Size()), |
- views::MenuItemView::TOPRIGHT, |
- 0)); |
+ if (sender == use_billing_for_shipping_) { |
+ shipping_.container->SetVisible(!use_billing_for_shipping_->checked()); |
+ GetWidget()->SetSize(GetWidget()->non_client_view()->GetPreferredSize()); |
+ } else { |
+ // TODO(estade): Should the menu be shown on mouse down? |
+ DetailsGroup* group = |
+ sender == email_.suggested_button ? &email_ : |
+ sender == cc_.suggested_button ? &cc_ : |
+ sender == billing_.suggested_button ? &billing_ : |
+ sender == shipping_.suggested_button ? &shipping_ : NULL; |
+ DCHECK(group); |
+ |
+ views::MenuModelAdapter adapter( |
+ controller_->MenuModelForSection(group->section)); |
+ menu_runner_.reset(new views::MenuRunner(adapter.CreateMenu())); |
+ |
+ // Ignore the result since we don't need to handle a deleted menu specially. |
+ ignore_result( |
+ menu_runner_->RunMenuAt(sender->GetWidget(), |
+ NULL, |
+ group->suggested_button->GetBoundsInScreen(), |
+ views::MenuItemView::TOPRIGHT, |
+ 0)); |
+ } |
} |
void AutofillDialogViews::ContentsChanged(views::Textfield* sender, |
@@ -277,16 +341,6 @@ void AutofillDialogViews::InitChildViews() { |
layout->StartRowWithPadding(0, single_column_set, |
0, views::kUnrelatedControlVerticalSpacing); |
layout->AddView(CreateDetailsContainer()); |
- |
- // Separator. |
- layout->StartRowWithPadding(0, single_column_set, |
- 0, views::kUnrelatedControlVerticalSpacing); |
- layout->AddView(new views::Separator()); |
- |
- // Wallet checkbox. |
- layout->StartRowWithPadding(0, single_column_set, |
- 0, views::kRelatedControlVerticalSpacing); |
- layout->AddView(new views::Checkbox(controller_->WalletOptionText())); |
} |
views::View* AutofillDialogViews::CreateIntroContainer() { |
@@ -335,12 +389,14 @@ void AutofillDialogViews::CreateDetailsSection(DialogSection section) { |
// Inputs container (manual inputs + combobox). |
views::View* inputs_container = CreateInputsContainer(section); |
- // Container (holds label + inputs). |
- views::View* container = CreateSectionContainer( |
- controller_->LabelForSection(section), inputs_container); |
DetailsGroup* group = GroupForSection(section); |
- group->container = container; |
+ // Container (holds label + inputs). |
+ group->container = new SectionContainer( |
+ controller_->LabelForSection(section), |
+ inputs_container, |
+ group->suggested_button); |
+ UpdateDetailsGroupState(*group); |
} |
void AutofillDialogViews::CreateBillingSection() { |
@@ -363,9 +419,12 @@ void AutofillDialogViews::CreateBillingSection() { |
billing->AddChildView(use_billing_for_shipping_); |
// Container (holds label + inputs). |
- views::View* container = CreateSectionContainer( |
- controller_->LabelForSection(SECTION_BILLING), billing); |
- billing_.container = container; |
+ billing_.container = new SectionContainer( |
+ controller_->LabelForSection(SECTION_BILLING), |
+ billing, |
+ billing_.suggested_button); |
+ UpdateDetailsGroupState(billing_); |
+ UpdateDetailsGroupState(cc_); |
} |
views::View* AutofillDialogViews::CreateInputsContainer(DialogSection section) { |
@@ -402,15 +461,18 @@ views::View* AutofillDialogViews::CreateInputsContainer(DialogSection section) { |
layout->AddView(info_view); |
// TODO(estade): Fix the appearance of this button. |
- views::MenuButton* menu_button = |
- new views::MenuButton(NULL, string16(), this, true); |
+ views::ImageButton* menu_button = new views::ImageButton(this); |
+ ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); |
+ menu_button->SetImage(views::CustomButton::STATE_NORMAL, |
+ rb.GetImageSkiaNamed(IDR_AUTOFILL_DIALOG_MENU_BUTTON)); |
+ menu_button->SetImage(views::CustomButton::STATE_PRESSED, |
+ rb.GetImageSkiaNamed(IDR_AUTOFILL_DIALOG_MENU_BUTTON_P)); |
layout->AddView(menu_button); |
DetailsGroup* group = GroupForSection(section); |
group->suggested_button = menu_button; |
group->manual_input = manual_inputs; |
group->suggested_info = suggested_info; |
- UpdateDetailsGroupState(*group); |
return inputs_container; |
} |
@@ -482,9 +544,14 @@ views::View* AutofillDialogViews::InitInputsView(DialogSection section) { |
void AutofillDialogViews::UpdateDetailsGroupState(const DetailsGroup& group) { |
string16 suggestion_text = |
controller_->SuggestionTextForSection(group.section); |
- group.manual_input->SetVisible(suggestion_text.empty()); |
- group.suggested_info->SetVisible(!suggestion_text.empty()); |
+ bool show_suggestions = !suggestion_text.empty(); |
+ group.manual_input->SetVisible(!show_suggestions); |
+ group.suggested_info->SetVisible(show_suggestions); |
group.suggested_info->SetText(suggestion_text); |
+ |
+ if (group.container) |
+ group.container->SetForwardMouseEvents(show_suggestions); |
+ |
if (GetWidget()) |
GetWidget()->SetSize(GetWidget()->non_client_view()->GetPreferredSize()); |
} |