| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/ui/views/autofill/autofill_dialog_views.h" | 5 #include "chrome/browser/ui/views/autofill/autofill_dialog_views.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/utf_string_conversions.h" | 10 #include "base/utf_string_conversions.h" |
| 11 #include "chrome/browser/profiles/profile.h" | 11 #include "chrome/browser/profiles/profile.h" |
| 12 #include "chrome/browser/ui/autofill/autofill_dialog_controller.h" | 12 #include "chrome/browser/ui/autofill/autofill_dialog_controller.h" |
| 13 #include "chrome/browser/ui/views/constrained_window_views.h" | 13 #include "chrome/browser/ui/views/constrained_window_views.h" |
| 14 #include "chrome/browser/ui/web_contents_modal_dialog_manager.h" | 14 #include "chrome/browser/ui/web_contents_modal_dialog_manager.h" |
| 15 #include "components/autofill/browser/wallet/wallet_service_url.h" | 15 #include "components/autofill/browser/wallet/wallet_service_url.h" |
| 16 #include "content/public/browser/native_web_keyboard_event.h" | 16 #include "content/public/browser/native_web_keyboard_event.h" |
| 17 #include "content/public/browser/navigation_controller.h" | 17 #include "content/public/browser/navigation_controller.h" |
| 18 #include "content/public/browser/web_contents.h" | 18 #include "content/public/browser/web_contents.h" |
| 19 #include "content/public/browser/web_contents_view.h" | 19 #include "content/public/browser/web_contents_view.h" |
| 20 #include "grit/theme_resources.h" | 20 #include "grit/theme_resources.h" |
| 21 #include "grit/ui_resources.h" | 21 #include "grit/ui_resources.h" |
| 22 #include "third_party/skia/include/core/SkColor.h" | 22 #include "third_party/skia/include/core/SkColor.h" |
| 23 #include "ui/base/l10n/l10n_util.h" | 23 #include "ui/base/l10n/l10n_util.h" |
| 24 #include "ui/base/models/combobox_model.h" | 24 #include "ui/base/models/combobox_model.h" |
| 25 #include "ui/base/models/menu_model.h" |
| 25 #include "ui/base/resource/resource_bundle.h" | 26 #include "ui/base/resource/resource_bundle.h" |
| 26 #include "ui/gfx/canvas.h" | 27 #include "ui/gfx/canvas.h" |
| 27 #include "ui/views/background.h" | 28 #include "ui/views/background.h" |
| 28 #include "ui/views/border.h" | 29 #include "ui/views/border.h" |
| 29 #include "ui/views/controls/button/checkbox.h" | 30 #include "ui/views/controls/button/checkbox.h" |
| 30 #include "ui/views/controls/button/image_button.h" | 31 #include "ui/views/controls/button/image_button.h" |
| 31 #include "ui/views/controls/combobox/combobox.h" | 32 #include "ui/views/controls/combobox/combobox.h" |
| 32 #include "ui/views/controls/image_view.h" | 33 #include "ui/views/controls/image_view.h" |
| 33 #include "ui/views/controls/label.h" | 34 #include "ui/views/controls/label.h" |
| 34 #include "ui/views/controls/link.h" | 35 #include "ui/views/controls/link.h" |
| (...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 340 0); | 341 0); |
| 341 | 342 |
| 342 layout->StartRow(0, kColumnSetId); | 343 layout->StartRow(0, kColumnSetId); |
| 343 layout->AddView(CreateDetailsSectionLabel(label)); | 344 layout->AddView(CreateDetailsSectionLabel(label)); |
| 344 layout->AddView(controls); | 345 layout->AddView(controls); |
| 345 } | 346 } |
| 346 | 347 |
| 347 AutofillDialogViews::SectionContainer::~SectionContainer() {} | 348 AutofillDialogViews::SectionContainer::~SectionContainer() {} |
| 348 | 349 |
| 349 void AutofillDialogViews::SectionContainer::SetActive(bool active) { | 350 void AutofillDialogViews::SectionContainer::SetActive(bool active) { |
| 350 if (active == !!background()) | 351 bool is_active = active && proxy_button_->visible(); |
| 352 if (is_active == !!background()) |
| 351 return; | 353 return; |
| 352 | 354 |
| 353 set_background(active ? | 355 set_background(is_active ? |
| 354 views::Background::CreateSolidBackground(SkColorSetARGB(9, 0, 0, 0)): | 356 views::Background::CreateSolidBackground(SkColorSetARGB(9, 0, 0, 0)): |
| 355 NULL); | 357 NULL); |
| 356 SchedulePaint(); | 358 SchedulePaint(); |
| 357 } | 359 } |
| 358 | 360 |
| 359 void AutofillDialogViews::SectionContainer::SetForwardMouseEvents( | 361 void AutofillDialogViews::SectionContainer::SetForwardMouseEvents( |
| 360 bool forward) { | 362 bool forward) { |
| 361 forward_mouse_events_ = forward; | 363 forward_mouse_events_ = forward; |
| 362 if (!forward) | 364 if (!forward) |
| 363 set_background(NULL); | 365 set_background(NULL); |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 418 // AutofilDialogViews::SuggestionView ------------------------------------------ | 420 // AutofilDialogViews::SuggestionView ------------------------------------------ |
| 419 | 421 |
| 420 AutofillDialogViews::SuggestionView::SuggestionView( | 422 AutofillDialogViews::SuggestionView::SuggestionView( |
| 421 const string16& edit_label, | 423 const string16& edit_label, |
| 422 AutofillDialogViews* autofill_dialog) | 424 AutofillDialogViews* autofill_dialog) |
| 423 : label_(new views::Label()), | 425 : label_(new views::Label()), |
| 424 label_line_2_(new views::Label()), | 426 label_line_2_(new views::Label()), |
| 425 icon_(new views::ImageView()), | 427 icon_(new views::ImageView()), |
| 426 label_container_(new views::View()), | 428 label_container_(new views::View()), |
| 427 decorated_( | 429 decorated_( |
| 428 new DecoratedTextfield(string16(), string16(), autofill_dialog)) { | 430 new DecoratedTextfield(string16(), string16(), autofill_dialog)), |
| 431 edit_link_(new views::Link(edit_label)) { |
| 429 // Label and icon. | 432 // Label and icon. |
| 430 label_container_->SetLayoutManager( | 433 label_container_->SetLayoutManager( |
| 431 new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, | 434 new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, |
| 432 kAroundTextPadding)); | 435 kAroundTextPadding)); |
| 433 label_container_->AddChildView(icon_); | 436 label_container_->AddChildView(icon_); |
| 434 label_container_->AddChildView(label_); | 437 label_container_->AddChildView(label_); |
| 435 label_container_->AddChildView(decorated_); | 438 label_container_->AddChildView(decorated_); |
| 436 decorated_->SetVisible(false); | 439 decorated_->SetVisible(false); |
| 437 // TODO(estade): get the sizing and spacing right on this textfield. | 440 // TODO(estade): get the sizing and spacing right on this textfield. |
| 438 decorated_->textfield()->set_default_width_in_chars(10); | 441 decorated_->textfield()->set_default_width_in_chars(10); |
| 439 AddChildView(label_container_); | 442 AddChildView(label_container_); |
| 440 | 443 |
| 441 label_line_2_->SetHorizontalAlignment(gfx::ALIGN_LEFT); | 444 label_line_2_->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
| 442 label_line_2_->SetVisible(false); | 445 label_line_2_->SetVisible(false); |
| 443 AddChildView(label_line_2_); | 446 AddChildView(label_line_2_); |
| 444 | 447 |
| 445 // TODO(estade): The link needs to have a different color when hovered. | 448 // TODO(estade): The link needs to have a different color when hovered. |
| 446 views::Link* edit_link = new views::Link(edit_label); | 449 edit_link_->set_listener(autofill_dialog); |
| 447 edit_link->set_listener(autofill_dialog); | 450 edit_link_->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
| 448 edit_link->SetHorizontalAlignment(gfx::ALIGN_LEFT); | 451 edit_link_->SetUnderline(false); |
| 449 edit_link->SetUnderline(false); | |
| 450 | 452 |
| 451 // This container prevents the edit link from being horizontally stretched. | 453 // This container prevents the edit link from being horizontally stretched. |
| 452 views::View* link_container = new views::View(); | 454 views::View* link_container = new views::View(); |
| 453 link_container->SetLayoutManager( | 455 link_container->SetLayoutManager( |
| 454 new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, 0)); | 456 new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, 0)); |
| 455 link_container->AddChildView(edit_link); | 457 link_container->AddChildView(edit_link_); |
| 456 AddChildView(link_container); | 458 AddChildView(link_container); |
| 457 | 459 |
| 458 SetLayoutManager(new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 0)); | 460 SetLayoutManager(new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 0)); |
| 459 } | 461 } |
| 460 | 462 |
| 461 AutofillDialogViews::SuggestionView::~SuggestionView() {} | 463 AutofillDialogViews::SuggestionView::~SuggestionView() {} |
| 462 | 464 |
| 465 void AutofillDialogViews::SuggestionView::SetEditable(bool editable) { |
| 466 edit_link_->SetVisible(editable); |
| 467 } |
| 468 |
| 463 void AutofillDialogViews::SuggestionView::SetSuggestionText( | 469 void AutofillDialogViews::SuggestionView::SetSuggestionText( |
| 464 const string16& text) { | 470 const string16& text) { |
| 465 // TODO(estade): does this localize well? | 471 // TODO(estade): does this localize well? |
| 466 string16 line_return(ASCIIToUTF16("\n")); | 472 string16 line_return(ASCIIToUTF16("\n")); |
| 467 size_t position = text.find(line_return); | 473 size_t position = text.find(line_return); |
| 468 if (position == string16::npos) { | 474 if (position == string16::npos) { |
| 469 label_->SetText(text); | 475 label_->SetText(text); |
| 470 label_line_2_->SetVisible(false); | 476 label_line_2_->SetVisible(false); |
| 471 } else { | 477 } else { |
| 472 label_->SetText(text.substr(0, position)); | 478 label_->SetText(text.substr(0, position)); |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 636 output->insert(std::make_pair(it->first, it->second->textfield()->text())); | 642 output->insert(std::make_pair(it->first, it->second->textfield()->text())); |
| 637 } | 643 } |
| 638 for (ComboboxMap::const_iterator it = group->comboboxes.begin(); | 644 for (ComboboxMap::const_iterator it = group->comboboxes.begin(); |
| 639 it != group->comboboxes.end(); ++it) { | 645 it != group->comboboxes.end(); ++it) { |
| 640 output->insert(std::make_pair(it->first, | 646 output->insert(std::make_pair(it->first, |
| 641 it->second->model()->GetItemAt(it->second->selected_index()))); | 647 it->second->model()->GetItemAt(it->second->selected_index()))); |
| 642 } | 648 } |
| 643 } | 649 } |
| 644 | 650 |
| 645 string16 AutofillDialogViews::GetCvc() { | 651 string16 AutofillDialogViews::GetCvc() { |
| 646 return GroupForSection(SECTION_CC)->suggested_info->decorated_textfield()-> | 652 DialogSection billing_section = controller_->SectionIsActive(SECTION_CC) ? |
| 647 textfield()->text(); | 653 SECTION_CC : SECTION_CC_BILLING; |
| 654 return GroupForSection(billing_section)->suggested_info-> |
| 655 decorated_textfield()->textfield()->text(); |
| 648 } | 656 } |
| 649 | 657 |
| 650 bool AutofillDialogViews::UseBillingForShipping() { | 658 bool AutofillDialogViews::UseBillingForShipping() { |
| 651 return use_billing_for_shipping_->checked(); | 659 return use_billing_for_shipping_->checked(); |
| 652 } | 660 } |
| 653 | 661 |
| 654 bool AutofillDialogViews::SaveDetailsInWallet() { | 662 bool AutofillDialogViews::SaveDetailsInWallet() { |
| 655 return notification_area_->CheckboxIsChecked(); | 663 return notification_area_->CheckboxIsChecked(); |
| 656 } | 664 } |
| 657 | 665 |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 750 footnote_view_ = new views::StyledLabel(string16(), this); | 758 footnote_view_ = new views::StyledLabel(string16(), this); |
| 751 return footnote_view_; | 759 return footnote_view_; |
| 752 } | 760 } |
| 753 | 761 |
| 754 bool AutofillDialogViews::Cancel() { | 762 bool AutofillDialogViews::Cancel() { |
| 755 controller_->OnCancel(); | 763 controller_->OnCancel(); |
| 756 return true; | 764 return true; |
| 757 } | 765 } |
| 758 | 766 |
| 759 bool AutofillDialogViews::Accept() { | 767 bool AutofillDialogViews::Accept() { |
| 760 if (!ValidateForm()) | 768 if (ValidateForm()) |
| 761 return false; | 769 controller_->OnAccept(); |
| 762 | 770 |
| 763 controller_->OnSubmit(); | 771 // |controller_| decides when to hide the dialog. |
| 764 | |
| 765 // Let |controller_| decide when to hide the dialog. | |
| 766 return false; | 772 return false; |
| 767 } | 773 } |
| 768 | 774 |
| 769 // TODO(wittman): Remove this override once we move to the new style frame view | 775 // TODO(wittman): Remove this override once we move to the new style frame view |
| 770 // on all dialogs. | 776 // on all dialogs. |
| 771 views::NonClientFrameView* AutofillDialogViews::CreateNonClientFrameView( | 777 views::NonClientFrameView* AutofillDialogViews::CreateNonClientFrameView( |
| 772 views::Widget* widget) { | 778 views::Widget* widget) { |
| 773 return CreateConstrainedStyleNonClientFrameView( | 779 return CreateConstrainedStyleNonClientFrameView( |
| 774 widget, | 780 widget, |
| 775 controller_->web_contents()->GetBrowserContext()); | 781 controller_->web_contents()->GetBrowserContext()); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 786 DetailsGroup* group = NULL; | 792 DetailsGroup* group = NULL; |
| 787 for (DetailGroupMap::iterator iter = detail_groups_.begin(); | 793 for (DetailGroupMap::iterator iter = detail_groups_.begin(); |
| 788 iter != detail_groups_.end(); ++iter) { | 794 iter != detail_groups_.end(); ++iter) { |
| 789 if (sender == iter->second.suggested_button) { | 795 if (sender == iter->second.suggested_button) { |
| 790 group = &iter->second; | 796 group = &iter->second; |
| 791 break; | 797 break; |
| 792 } | 798 } |
| 793 } | 799 } |
| 794 DCHECK(group); | 800 DCHECK(group); |
| 795 | 801 |
| 802 if (!group->suggested_button->visible()) |
| 803 return; |
| 804 |
| 796 menu_runner_.reset(new views::MenuRunner( | 805 menu_runner_.reset(new views::MenuRunner( |
| 797 controller_->MenuModelForSection(group->section))); | 806 controller_->MenuModelForSection(group->section))); |
| 798 | 807 |
| 799 group->container->SetActive(true); | 808 group->container->SetActive(true); |
| 800 // Ignore the result since we don't need to handle a deleted menu specially. | 809 // Ignore the result since we don't need to handle a deleted menu specially. |
| 801 ignore_result( | 810 ignore_result( |
| 802 menu_runner_->RunMenuAt(sender->GetWidget(), | 811 menu_runner_->RunMenuAt(sender->GetWidget(), |
| 803 NULL, | 812 NULL, |
| 804 group->suggested_button->GetBoundsInScreen(), | 813 group->suggested_button->GetBoundsInScreen(), |
| 805 views::MenuItemView::TOPRIGHT, | 814 views::MenuItemView::TOPRIGHT, |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 838 } | 847 } |
| 839 | 848 |
| 840 void AutofillDialogViews::OnDidChangeFocus( | 849 void AutofillDialogViews::OnDidChangeFocus( |
| 841 views::View* focused_before, | 850 views::View* focused_before, |
| 842 views::View* focused_now) { | 851 views::View* focused_now) { |
| 843 if (!focused_before) | 852 if (!focused_before) |
| 844 return; | 853 return; |
| 845 | 854 |
| 846 // If user leaves an edit-field, revalidate the group it belongs to. | 855 // If user leaves an edit-field, revalidate the group it belongs to. |
| 847 DetailsGroup* group = GroupForView(focused_before); | 856 DetailsGroup* group = GroupForView(focused_before); |
| 848 if (group) | 857 if (group && group->container->visible()) |
| 849 ValidateGroup(group, AutofillDialogController::VALIDATE_EDIT); | 858 ValidateGroup(group, AutofillDialogController::VALIDATE_EDIT); |
| 850 } | 859 } |
| 851 | 860 |
| 852 void AutofillDialogViews::LinkClicked(views::Link* source, int event_flags) { | 861 void AutofillDialogViews::LinkClicked(views::Link* source, int event_flags) { |
| 853 // Edit links. | 862 // Edit links. |
| 854 for (DetailGroupMap::iterator iter = detail_groups_.begin(); | 863 for (DetailGroupMap::iterator iter = detail_groups_.begin(); |
| 855 iter != detail_groups_.end(); ++iter) { | 864 iter != detail_groups_.end(); ++iter) { |
| 856 if (iter->second.suggested_info->Contains(source)) { | 865 if (iter->second.suggested_info->Contains(source)) { |
| 857 controller_->EditClickedForSection(iter->first); | 866 controller_->EditClickedForSection(iter->first); |
| 858 return; | 867 return; |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 975 0); | 984 0); |
| 976 column_set->AddColumn(views::GridLayout::CENTER, | 985 column_set->AddColumn(views::GridLayout::CENTER, |
| 977 views::GridLayout::LEADING, | 986 views::GridLayout::LEADING, |
| 978 0, | 987 0, |
| 979 views::GridLayout::USE_PREF, | 988 views::GridLayout::USE_PREF, |
| 980 0, | 989 0, |
| 981 0); | 990 0); |
| 982 layout->StartRow(0, kColumnSetId); | 991 layout->StartRow(0, kColumnSetId); |
| 983 | 992 |
| 984 // The |info_view| holds |manual_inputs| and |suggested_info|, allowing the | 993 // The |info_view| holds |manual_inputs| and |suggested_info|, allowing the |
| 985 // dialog toggle which is shown. | 994 // dialog to toggle which is shown. |
| 986 views::View* info_view = new views::View(); | 995 views::View* info_view = new views::View(); |
| 987 info_view->SetLayoutManager( | 996 info_view->SetLayoutManager( |
| 988 new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 0)); | 997 new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 0)); |
| 989 | 998 |
| 990 if (section == SECTION_SHIPPING) { | 999 if (section == SECTION_SHIPPING) { |
| 991 use_billing_for_shipping_ = | 1000 use_billing_for_shipping_ = |
| 992 new views::Checkbox(controller_->UseBillingForShippingText()); | 1001 new views::Checkbox(controller_->UseBillingForShippingText()); |
| 993 use_billing_for_shipping_->SetChecked(true); | 1002 use_billing_for_shipping_->SetChecked(true); |
| 994 use_billing_for_shipping_->set_listener(this); | 1003 use_billing_for_shipping_->set_listener(this); |
| 995 info_view->AddChildView(use_billing_for_shipping_); | 1004 info_view->AddChildView(use_billing_for_shipping_); |
| 996 } | 1005 } |
| 997 | 1006 |
| 998 views::View* manual_inputs = InitInputsView(section); | 1007 views::View* manual_inputs = InitInputsView(section); |
| 999 info_view->AddChildView(manual_inputs); | 1008 info_view->AddChildView(manual_inputs); |
| 1000 SuggestionView* suggested_info = | 1009 SuggestionView* suggested_info = |
| 1001 new SuggestionView(controller_->EditSuggestionText(), this); | 1010 new SuggestionView(controller_->EditSuggestionText(), this); |
| 1002 info_view->AddChildView(suggested_info); | 1011 info_view->AddChildView(suggested_info); |
| 1003 layout->AddView(info_view); | 1012 layout->AddView(info_view); |
| 1004 | 1013 |
| 1005 if (section == SECTION_CC) { | |
| 1006 // TODO(estade): don't hardcode this string. | |
| 1007 suggested_info->ShowTextfield( | |
| 1008 ASCIIToUTF16("CVC"), | |
| 1009 controller_->IconForField(CREDIT_CARD_VERIFICATION_CODE, | |
| 1010 string16()).AsImageSkia()); | |
| 1011 } | |
| 1012 | |
| 1013 // TODO(estade): Fix the appearance of this button. | 1014 // TODO(estade): Fix the appearance of this button. |
| 1014 views::ImageButton* menu_button = new views::ImageButton(this); | 1015 views::ImageButton* menu_button = new views::ImageButton(this); |
| 1015 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); | 1016 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); |
| 1016 menu_button->SetImage(views::CustomButton::STATE_NORMAL, | 1017 menu_button->SetImage(views::CustomButton::STATE_NORMAL, |
| 1017 rb.GetImageSkiaNamed(IDR_AUTOFILL_DIALOG_MENU_BUTTON)); | 1018 rb.GetImageSkiaNamed(IDR_AUTOFILL_DIALOG_MENU_BUTTON)); |
| 1018 menu_button->SetImage(views::CustomButton::STATE_PRESSED, | 1019 menu_button->SetImage(views::CustomButton::STATE_PRESSED, |
| 1019 rb.GetImageSkiaNamed(IDR_AUTOFILL_DIALOG_MENU_BUTTON_P)); | 1020 rb.GetImageSkiaNamed(IDR_AUTOFILL_DIALOG_MENU_BUTTON_P)); |
| 1020 layout->AddView(menu_button); | 1021 layout->AddView(menu_button); |
| 1021 | 1022 |
| 1022 DetailsGroup* group = GroupForSection(section); | 1023 DetailsGroup* group = GroupForSection(section); |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1090 | 1091 |
| 1091 textfields->insert(std::make_pair(&input, field)); | 1092 textfields->insert(std::make_pair(&input, field)); |
| 1092 layout->AddView(field); | 1093 layout->AddView(field); |
| 1093 } | 1094 } |
| 1094 } | 1095 } |
| 1095 | 1096 |
| 1096 return view; | 1097 return view; |
| 1097 } | 1098 } |
| 1098 | 1099 |
| 1099 void AutofillDialogViews::UpdateDetailsGroupState(const DetailsGroup& group) { | 1100 void AutofillDialogViews::UpdateDetailsGroupState(const DetailsGroup& group) { |
| 1100 string16 suggestion_text = | 1101 const SuggestionState& suggestion_state = |
| 1101 controller_->SuggestionTextForSection(group.section); | 1102 controller_->SuggestionStateForSection(group.section); |
| 1102 bool show_suggestions = !suggestion_text.empty(); | 1103 bool show_suggestions = !suggestion_state.text.empty(); |
| 1103 group.suggested_info->SetVisible(show_suggestions); | 1104 group.suggested_info->SetVisible(show_suggestions); |
| 1104 group.suggested_info->SetSuggestionText(suggestion_text); | 1105 group.suggested_info->SetSuggestionText(suggestion_state.text); |
| 1105 gfx::Image icon = controller_->SuggestionIconForSection(group.section); | 1106 group.suggested_info->SetSuggestionIcon(suggestion_state.icon); |
| 1106 group.suggested_info->SetSuggestionIcon(icon); | 1107 group.suggested_info->SetEditable(suggestion_state.editable); |
| 1108 |
| 1109 if (!suggestion_state.extra_text.empty()) { |
| 1110 group.suggested_info->ShowTextfield( |
| 1111 suggestion_state.extra_text, |
| 1112 suggestion_state.extra_icon.AsImageSkia()); |
| 1113 } |
| 1107 | 1114 |
| 1108 if (group.section == SECTION_SHIPPING) { | 1115 if (group.section == SECTION_SHIPPING) { |
| 1109 bool show_checkbox = !show_suggestions; | 1116 bool show_checkbox = !show_suggestions; |
| 1110 // When the checkbox is going from hidden to visible, it's because the | 1117 // When the checkbox is going from hidden to visible, it's because the |
| 1111 // user clicked "Enter new address". Reset the checkbox to unchecked in this | 1118 // user clicked "Enter new address". Reset the checkbox to unchecked in this |
| 1112 // case. | 1119 // case. |
| 1113 if (show_checkbox && !use_billing_for_shipping_->visible()) | 1120 if (show_checkbox && !use_billing_for_shipping_->visible()) |
| 1114 use_billing_for_shipping_->SetChecked(false); | 1121 use_billing_for_shipping_->SetChecked(false); |
| 1115 | 1122 |
| 1116 use_billing_for_shipping_->SetVisible(show_checkbox); | 1123 use_billing_for_shipping_->SetVisible(show_checkbox); |
| 1117 group.manual_input->SetVisible( | 1124 group.manual_input->SetVisible( |
| 1118 show_checkbox && !use_billing_for_shipping_->checked()); | 1125 show_checkbox && !use_billing_for_shipping_->checked()); |
| 1119 } else { | 1126 } else { |
| 1120 group.manual_input->SetVisible(!show_suggestions); | 1127 group.manual_input->SetVisible(!show_suggestions); |
| 1121 } | 1128 } |
| 1122 | 1129 |
| 1123 // Show or hide the "Save in chrome" checkbox. If nothing is in editing mode, | 1130 // Show or hide the "Save in chrome" checkbox. If nothing is in editing mode, |
| 1124 // hide. If the controller tells us not to show it, likewise hide. | 1131 // hide. If the controller tells us not to show it, likewise hide. |
| 1125 save_in_chrome_checkbox_->SetVisible( | 1132 save_in_chrome_checkbox_->SetVisible( |
| 1126 controller_->ShouldOfferToSaveInChrome() && AtLeastOneSectionIsEditing()); | 1133 controller_->ShouldOfferToSaveInChrome() && AtLeastOneSectionIsEditing()); |
| 1127 | 1134 |
| 1135 const bool has_suggestions = |
| 1136 controller_->MenuModelForSection(group.section)->GetItemCount() > 0; |
| 1137 |
| 1138 if (group.suggested_button) |
| 1139 group.suggested_button->SetVisible(has_suggestions); |
| 1140 |
| 1128 if (group.container) { | 1141 if (group.container) { |
| 1129 group.container->SetForwardMouseEvents(show_suggestions); | 1142 group.container->SetForwardMouseEvents(has_suggestions && show_suggestions); |
| 1130 group.container->SetVisible(controller_->SectionIsActive(group.section)); | 1143 group.container->SetVisible(controller_->SectionIsActive(group.section)); |
| 1131 } | 1144 } |
| 1132 | 1145 |
| 1133 ContentsPreferredSizeChanged(); | 1146 ContentsPreferredSizeChanged(); |
| 1134 } | 1147 } |
| 1135 | 1148 |
| 1136 bool AutofillDialogViews::AtLeastOneSectionIsEditing() { | 1149 bool AutofillDialogViews::AtLeastOneSectionIsEditing() { |
| 1137 for (DetailGroupMap::iterator iter = detail_groups_.begin(); | 1150 for (DetailGroupMap::iterator iter = detail_groups_.begin(); |
| 1138 iter != detail_groups_.end(); ++iter) { | 1151 iter != detail_groups_.end(); ++iter) { |
| 1139 if (iter->second.manual_input && iter->second.manual_input->visible()) | 1152 if (iter->second.manual_input && iter->second.manual_input->visible()) |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1200 } | 1213 } |
| 1201 | 1214 |
| 1202 bool AutofillDialogViews::ValidateForm() { | 1215 bool AutofillDialogViews::ValidateForm() { |
| 1203 bool all_valid = true; | 1216 bool all_valid = true; |
| 1204 for (DetailGroupMap::iterator iter = detail_groups_.begin(); | 1217 for (DetailGroupMap::iterator iter = detail_groups_.begin(); |
| 1205 iter != detail_groups_.end(); ++iter) { | 1218 iter != detail_groups_.end(); ++iter) { |
| 1206 DetailsGroup* group = &iter->second; | 1219 DetailsGroup* group = &iter->second; |
| 1207 if (!group->container->visible()) | 1220 if (!group->container->visible()) |
| 1208 continue; | 1221 continue; |
| 1209 | 1222 |
| 1210 if (!ValidateGroup(group, AutofillDialogController::VALIDATE_FINAL)) | 1223 if (!ValidateGroup(group, AutofillDialogController::VALIDATE_FINAL)) |
| 1211 all_valid = false; | 1224 all_valid = false; |
| 1212 } | 1225 } |
| 1213 | 1226 |
| 1214 return all_valid; | 1227 return all_valid; |
| 1215 } | 1228 } |
| 1216 | 1229 |
| 1217 void AutofillDialogViews::TextfieldEditedOrActivated( | 1230 void AutofillDialogViews::TextfieldEditedOrActivated( |
| 1218 views::Textfield* textfield, | 1231 views::Textfield* textfield, |
| 1219 bool was_edit) { | 1232 bool was_edit) { |
| 1220 DetailsGroup* group = GroupForView(textfield); | 1233 DetailsGroup* group = GroupForView(textfield); |
| 1221 DCHECK(group); | 1234 DCHECK(group); |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1305 AutofillDialogViews::DetailsGroup::DetailsGroup(DialogSection section) | 1318 AutofillDialogViews::DetailsGroup::DetailsGroup(DialogSection section) |
| 1306 : section(section), | 1319 : section(section), |
| 1307 container(NULL), | 1320 container(NULL), |
| 1308 manual_input(NULL), | 1321 manual_input(NULL), |
| 1309 suggested_info(NULL), | 1322 suggested_info(NULL), |
| 1310 suggested_button(NULL) {} | 1323 suggested_button(NULL) {} |
| 1311 | 1324 |
| 1312 AutofillDialogViews::DetailsGroup::~DetailsGroup() {} | 1325 AutofillDialogViews::DetailsGroup::~DetailsGroup() {} |
| 1313 | 1326 |
| 1314 } // namespace autofill | 1327 } // namespace autofill |
| OLD | NEW |