| 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/strings/utf_string_conversions.h" | 10 #include "base/strings/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/autofill/autofill_dialog_sign_in_delegate.h" | 13 #include "chrome/browser/ui/autofill/autofill_dialog_sign_in_delegate.h" |
| 14 #include "chrome/browser/ui/views/constrained_window_views.h" | 14 #include "chrome/browser/ui/views/constrained_window_views.h" |
| 15 #include "components/autofill/content/browser/wallet/wallet_service_url.h" | 15 #include "components/autofill/content/browser/wallet/wallet_service_url.h" |
| 16 #include "components/autofill/core/browser/autofill_type.h" | 16 #include "components/autofill/core/browser/autofill_type.h" |
| 17 #include "components/web_modal/web_contents_modal_dialog_manager.h" | 17 #include "components/web_modal/web_contents_modal_dialog_manager.h" |
| 18 #include "components/web_modal/web_contents_modal_dialog_manager_delegate.h" | 18 #include "components/web_modal/web_contents_modal_dialog_manager_delegate.h" |
| 19 #include "content/public/browser/native_web_keyboard_event.h" | 19 #include "content/public/browser/native_web_keyboard_event.h" |
| 20 #include "content/public/browser/navigation_controller.h" | 20 #include "content/public/browser/navigation_controller.h" |
| 21 #include "content/public/browser/web_contents.h" | 21 #include "content/public/browser/web_contents.h" |
| 22 #include "content/public/browser/web_contents_view.h" | 22 #include "content/public/browser/web_contents_view.h" |
| 23 #include "grit/theme_resources.h" | 23 #include "grit/theme_resources.h" |
| 24 #include "grit/ui_resources.h" | 24 #include "grit/ui_resources.h" |
| 25 #include "third_party/skia/include/core/SkColor.h" | 25 #include "third_party/skia/include/core/SkColor.h" |
| 26 #include "ui/base/animation/animation_delegate.h" | |
| 27 #include "ui/base/animation/multi_animation.h" | 26 #include "ui/base/animation/multi_animation.h" |
| 28 #include "ui/base/l10n/l10n_util.h" | 27 #include "ui/base/l10n/l10n_util.h" |
| 29 #include "ui/base/models/combobox_model.h" | 28 #include "ui/base/models/combobox_model.h" |
| 30 #include "ui/base/models/menu_model.h" | 29 #include "ui/base/models/menu_model.h" |
| 31 #include "ui/base/resource/resource_bundle.h" | 30 #include "ui/base/resource/resource_bundle.h" |
| 32 #include "ui/gfx/canvas.h" | 31 #include "ui/gfx/canvas.h" |
| 33 #include "ui/gfx/path.h" | 32 #include "ui/gfx/path.h" |
| 34 #include "ui/gfx/skia_util.h" | 33 #include "ui/gfx/skia_util.h" |
| 35 #include "ui/views/background.h" | 34 #include "ui/views/background.h" |
| 36 #include "ui/views/border.h" | 35 #include "ui/views/border.h" |
| (...skipping 24 matching lines...) Expand all Loading... |
| 61 | 60 |
| 62 namespace { | 61 namespace { |
| 63 | 62 |
| 64 // The minimum useful height of the contents area of the dialog. | 63 // The minimum useful height of the contents area of the dialog. |
| 65 const int kMinimumContentsHeight = 100; | 64 const int kMinimumContentsHeight = 100; |
| 66 | 65 |
| 67 // Horizontal padding between text and other elements (in pixels). | 66 // Horizontal padding between text and other elements (in pixels). |
| 68 const int kAroundTextPadding = 4; | 67 const int kAroundTextPadding = 4; |
| 69 | 68 |
| 70 // Padding around icons inside DecoratedTextfields. | 69 // Padding around icons inside DecoratedTextfields. |
| 71 const size_t kTextfieldIconPadding = 3; | 70 const int kTextfieldIconPadding = 3; |
| 72 | 71 |
| 73 // Size of the triangular mark that indicates an invalid textfield (in pixels). | 72 // Size of the triangular mark that indicates an invalid textfield (in pixels). |
| 74 const size_t kDogEarSize = 10; | 73 const int kDogEarSize = 10; |
| 75 | 74 |
| 76 // The space between the edges of a notification bar and the text within (in | 75 // The space between the edges of a notification bar and the text within (in |
| 77 // pixels). | 76 // pixels). |
| 78 const size_t kNotificationPadding = 14; | 77 const int kNotificationPadding = 14; |
| 79 | 78 |
| 80 // Vertical padding above and below each detail section (in pixels). | 79 // Vertical padding above and below each detail section (in pixels). |
| 81 const size_t kDetailSectionInset = 10; | 80 const int kDetailSectionInset = 10; |
| 82 | 81 |
| 83 const size_t kAutocheckoutStepsAreaPadding = 28; | 82 const int kAutocheckoutStepsAreaPadding = 28; |
| 84 const size_t kAutocheckoutStepInset = 20; | 83 const int kAutocheckoutStepInset = 20; |
| 85 | 84 |
| 86 const size_t kAutocheckoutProgressBarWidth = 375; | 85 const int kAutocheckoutProgressBarWidth = 375; |
| 87 const size_t kAutocheckoutProgressBarHeight = 15; | 86 const int kAutocheckoutProgressBarHeight = 15; |
| 88 | 87 |
| 89 const size_t kArrowHeight = 7; | 88 const int kArrowHeight = 7; |
| 90 const size_t kArrowWidth = 2 * kArrowHeight; | 89 const int kArrowWidth = 2 * kArrowHeight; |
| 91 | 90 |
| 92 // The padding around the edges of the legal documents text, in pixels. | 91 // The padding around the edges of the legal documents text, in pixels. |
| 93 const size_t kLegalDocPadding = 20; | 92 const int kLegalDocPadding = 20; |
| 94 | 93 |
| 95 // Slight shading for mouse hover and legal document background. | 94 // Slight shading for mouse hover and legal document background. |
| 96 SkColor kShadingColor = SkColorSetARGB(7, 0, 0, 0); | 95 SkColor kShadingColor = SkColorSetARGB(7, 0, 0, 0); |
| 97 | 96 |
| 98 // A border color for the legal document view. | 97 // A border color for the legal document view. |
| 99 SkColor kSubtleBorderColor = SkColorSetARGB(10, 0, 0, 0); | 98 SkColor kSubtleBorderColor = SkColorSetARGB(10, 0, 0, 0); |
| 100 | 99 |
| 101 // The top padding, in pixels, for the suggestions menu dropdown arrows. | 100 // The top padding, in pixels, for the suggestions menu dropdown arrows. |
| 102 const size_t kMenuButtonTopOffset = 5; | 101 const int kMenuButtonTopOffset = 5; |
| 103 | 102 |
| 104 // The side padding, in pixels, for the suggestions menu dropdown arrows. | 103 // The side padding, in pixels, for the suggestions menu dropdown arrows. |
| 105 const size_t kMenuButtonHorizontalPadding = 20; | 104 const int kMenuButtonHorizontalPadding = 20; |
| 105 |
| 106 // The padding around text in the overlay view. |
| 107 const int kOverlayTextPadding = 20; |
| 108 |
| 109 // Spacing between lines of text in the overlay view. |
| 110 const int kOverlayTextInterlineSpacing = 10; |
| 106 | 111 |
| 107 const char kDecoratedTextfieldClassName[] = "autofill/DecoratedTextfield"; | 112 const char kDecoratedTextfieldClassName[] = "autofill/DecoratedTextfield"; |
| 108 const char kNotificationAreaClassName[] = "autofill/NotificationArea"; | 113 const char kNotificationAreaClassName[] = "autofill/NotificationArea"; |
| 114 const char kOverlayViewClassName[] = "autofill/OverlayView"; |
| 115 |
| 116 typedef ui::MultiAnimation::Part Part; |
| 117 typedef ui::MultiAnimation::Parts Parts; |
| 109 | 118 |
| 110 views::Border* CreateLabelAlignmentBorder() { | 119 views::Border* CreateLabelAlignmentBorder() { |
| 111 // TODO(estade): this should be made to match the native textfield top | 120 // TODO(estade): this should be made to match the native textfield top |
| 112 // inset. It's hard to get at, so for now it's hard-coded. | 121 // inset. It's hard to get at, so for now it's hard-coded. |
| 113 return views::Border::CreateEmptyBorder(4, 0, 0, 0); | 122 return views::Border::CreateEmptyBorder(4, 0, 0, 0); |
| 114 } | 123 } |
| 115 | 124 |
| 116 // Returns a label that describes a details section. | 125 // Returns a label that describes a details section. |
| 117 views::Label* CreateDetailsSectionLabel(const string16& text) { | 126 views::Label* CreateDetailsSectionLabel(const string16& text) { |
| 118 views::Label* label = new views::Label(text); | 127 views::Label* label = new views::Label(text); |
| 119 label->SetHorizontalAlignment(gfx::ALIGN_RIGHT); | 128 label->SetHorizontalAlignment(gfx::ALIGN_RIGHT); |
| 120 label->SetFont(label->font().DeriveFont(0, gfx::Font::BOLD)); | 129 label->SetFont(label->font().DeriveFont(0, gfx::Font::BOLD)); |
| 121 label->set_border(CreateLabelAlignmentBorder()); | 130 label->set_border(CreateLabelAlignmentBorder()); |
| 122 return label; | 131 return label; |
| 123 } | 132 } |
| 124 | 133 |
| 125 // Draws an arrow at the top of |canvas| pointing to |tip_x|. | 134 // Draws an arrow at the top of |canvas| pointing to |tip_x|. |
| 126 void DrawArrow(gfx::Canvas* canvas, int tip_x, const SkColor& color) { | 135 void DrawArrow(gfx::Canvas* canvas, int tip_x, const SkColor& color) { |
| 127 const int arrow_half_width = kArrowWidth / 2.0f; | 136 const int arrow_half_width = kArrowWidth / 2.0f; |
| 128 const int arrow_middle = tip_x - arrow_half_width; | |
| 129 | 137 |
| 130 SkPath arrow; | 138 SkPath arrow; |
| 131 arrow.moveTo(arrow_middle - arrow_half_width, kArrowHeight); | 139 arrow.moveTo(tip_x, 0); |
| 132 arrow.lineTo(arrow_middle + arrow_half_width, kArrowHeight); | 140 arrow.rLineTo(arrow_half_width, kArrowHeight); |
| 133 arrow.lineTo(arrow_middle, 0); | 141 arrow.rLineTo(-kArrowWidth, 0); |
| 134 arrow.close(); | 142 arrow.close(); |
| 135 canvas->ClipPath(arrow); | 143 SkPaint paint; |
| 136 canvas->DrawColor(color); | 144 paint.setColor(color); |
| 145 canvas->DrawPath(arrow, paint); |
| 137 } | 146 } |
| 138 | 147 |
| 139 typedef ui::MultiAnimation::Part Part; | |
| 140 typedef ui::MultiAnimation::Parts Parts; | |
| 141 | |
| 142 class OverlayView : public views::View, | |
| 143 public ui::AnimationDelegate { | |
| 144 public: | |
| 145 OverlayView() { | |
| 146 SetLayoutManager(new views::FillLayout()); | |
| 147 | |
| 148 set_background(views::Background::CreateSolidBackground(GetNativeTheme()-> | |
| 149 GetSystemColor(ui::NativeTheme::kColorId_DialogBackground))); | |
| 150 | |
| 151 Parts parts; | |
| 152 // For this part of the animation, simply show the splash image. | |
| 153 parts.push_back(Part(kSplashDisplayDurationMs, ui::Tween::ZERO)); | |
| 154 // For this part of the animation, fade out the splash image. | |
| 155 parts.push_back(Part(kSplashFadeOutDurationMs, ui::Tween::EASE_IN)); | |
| 156 // For this part of the animation, fade out |this| (fade in the dialog). | |
| 157 parts.push_back(Part(kSplashFadeInDialogDurationMs, ui::Tween::EASE_OUT)); | |
| 158 fade_out_.reset( | |
| 159 new ui::MultiAnimation(parts, | |
| 160 ui::MultiAnimation::GetDefaultTimerInterval())); | |
| 161 fade_out_->set_delegate(this); | |
| 162 fade_out_->set_continuous(false); | |
| 163 fade_out_->Start(); | |
| 164 } | |
| 165 | |
| 166 virtual ~OverlayView() {} | |
| 167 | |
| 168 // ui::AnimationDelegate implementation: | |
| 169 virtual void AnimationProgressed(const ui::Animation* animation) OVERRIDE { | |
| 170 DCHECK_EQ(animation, fade_out_.get()); | |
| 171 if (fade_out_->current_part_index() != 0) | |
| 172 SchedulePaint(); | |
| 173 } | |
| 174 | |
| 175 virtual void AnimationEnded(const ui::Animation* animation) OVERRIDE { | |
| 176 DCHECK_EQ(animation, fade_out_.get()); | |
| 177 SetVisible(false); | |
| 178 } | |
| 179 | |
| 180 // views::View implementation: | |
| 181 virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE { | |
| 182 // BubbleFrameView doesn't mask the window, it just draws the border via | |
| 183 // image assets. Match that rounding here. | |
| 184 static const SkScalar kCornerRadius = SkIntToScalar(2); | |
| 185 gfx::Rect rect = | |
| 186 GetWidget()->non_client_view()->frame_view()->GetLocalBounds(); | |
| 187 rect.Inset(12, 12, 12, 12); | |
| 188 gfx::Path window_mask; | |
| 189 window_mask.addRoundRect(gfx::RectToSkRect(rect), | |
| 190 kCornerRadius, kCornerRadius); | |
| 191 canvas->ClipPath(window_mask); | |
| 192 | |
| 193 if (fade_out_->current_part_index() == 2) { | |
| 194 canvas->SaveLayerAlpha((1 - fade_out_->GetCurrentValue()) * 255); | |
| 195 views::View::OnPaint(canvas); | |
| 196 canvas->Restore(); | |
| 197 } else { | |
| 198 views::View::OnPaint(canvas); | |
| 199 } | |
| 200 } | |
| 201 | |
| 202 virtual void PaintChildren(gfx::Canvas* canvas) OVERRIDE { | |
| 203 if (fade_out_->current_part_index() == 0) { | |
| 204 views::View::PaintChildren(canvas); | |
| 205 } else if (fade_out_->current_part_index() == 1) { | |
| 206 canvas->SaveLayerAlpha((1 - fade_out_->GetCurrentValue()) * 255); | |
| 207 views::View::PaintChildren(canvas); | |
| 208 canvas->Restore(); | |
| 209 } | |
| 210 } | |
| 211 | |
| 212 private: | |
| 213 // This MultiAnimation is used to first fade out the contents of the overlay, | |
| 214 // then fade out the background of the overlay (revealing the dialog behind | |
| 215 // the overlay). This avoids cross-fade. | |
| 216 scoped_ptr<ui::MultiAnimation> fade_out_; | |
| 217 | |
| 218 DISALLOW_COPY_AND_ASSIGN(OverlayView); | |
| 219 }; | |
| 220 | |
| 221 // This class handles layout for the first row of a SuggestionView. | 148 // This class handles layout for the first row of a SuggestionView. |
| 222 // It exists to circumvent shortcomings of GridLayout and BoxLayout (namely that | 149 // It exists to circumvent shortcomings of GridLayout and BoxLayout (namely that |
| 223 // the former doesn't fully respect child visibility, and that the latter won't | 150 // the former doesn't fully respect child visibility, and that the latter won't |
| 224 // expand a single child). | 151 // expand a single child). |
| 225 class SectionRowView : public views::View { | 152 class SectionRowView : public views::View { |
| 226 public: | 153 public: |
| 227 SectionRowView() {} | 154 SectionRowView() {} |
| 228 virtual ~SectionRowView() {} | 155 virtual ~SectionRowView() {} |
| 229 | 156 |
| 230 // views::View implementation: | 157 // views::View implementation: |
| (...skipping 371 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 602 views::MenuItemView::TOPRIGHT, | 529 views::MenuItemView::TOPRIGHT, |
| 603 ui::MENU_SOURCE_MOUSE, | 530 ui::MENU_SOURCE_MOUSE, |
| 604 0)); | 531 0)); |
| 605 } | 532 } |
| 606 | 533 |
| 607 void AutofillDialogViews::AccountChooser::LinkClicked(views::Link* source, | 534 void AutofillDialogViews::AccountChooser::LinkClicked(views::Link* source, |
| 608 int event_flags) { | 535 int event_flags) { |
| 609 controller_->SignInLinkClicked(); | 536 controller_->SignInLinkClicked(); |
| 610 } | 537 } |
| 611 | 538 |
| 539 // AutofillDialogViews::OverlayView -------------------------------------------- |
| 540 |
| 541 AutofillDialogViews::OverlayView::OverlayView(views::ButtonListener* listener) |
| 542 : image_view_(new views::ImageView()), |
| 543 message_stack_(new views::View()), |
| 544 button_(new views::LabelButton(listener, string16())) { |
| 545 set_border(views::Border::CreateEmptyBorder(12, 12, 12, 12)); |
| 546 set_background(views::Background::CreateSolidBackground(GetNativeTheme()-> |
| 547 GetSystemColor(ui::NativeTheme::kColorId_DialogBackground))); |
| 548 |
| 549 AddChildView(image_view_); |
| 550 |
| 551 AddChildView(message_stack_); |
| 552 message_stack_->SetLayoutManager( |
| 553 new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, |
| 554 kOverlayTextInterlineSpacing)); |
| 555 message_stack_->set_border(views::Border::CreateEmptyBorder( |
| 556 kOverlayTextPadding, kOverlayTextPadding, 0, kOverlayTextPadding)); |
| 557 |
| 558 AddChildView(button_); |
| 559 button_->SetStyle(views::Button::STYLE_NATIVE_TEXTBUTTON); |
| 560 button_->set_focusable(true); |
| 561 } |
| 562 |
| 563 AutofillDialogViews::OverlayView::~OverlayView() {} |
| 564 |
| 565 void AutofillDialogViews::OverlayView::SetState( |
| 566 const DialogOverlayState& state, |
| 567 views::ButtonListener* listener) { |
| 568 // Don't update anything if we're still fading out the old state. |
| 569 if (fade_out_) |
| 570 return; |
| 571 |
| 572 if (state.image.IsEmpty()) { |
| 573 SetVisible(false); |
| 574 return; |
| 575 } |
| 576 |
| 577 image_view_->SetImage(state.image.ToImageSkia()); |
| 578 |
| 579 message_stack_->RemoveAllChildViews(true); |
| 580 for (size_t i = 0; i < state.strings.size(); ++i) { |
| 581 views::Label* label = new views::Label(); |
| 582 label->SetMultiLine(true); |
| 583 label->SetText(state.strings[i].text); |
| 584 label->SetFont(state.strings[i].font); |
| 585 label->SetHorizontalAlignment(state.strings[i].alignment); |
| 586 message_stack_->AddChildView(label); |
| 587 } |
| 588 message_stack_->SetVisible(message_stack_->child_count() > 0); |
| 589 |
| 590 button_->SetVisible(!state.button_text.empty()); |
| 591 if (!state.button_text.empty()) |
| 592 button_->SetText(state.button_text); |
| 593 |
| 594 SetVisible(true); |
| 595 if (parent()) |
| 596 parent()->Layout(); |
| 597 } |
| 598 |
| 599 void AutofillDialogViews::OverlayView::BeginFadeOut() { |
| 600 Parts parts; |
| 601 // For this part of the animation, simply show the splash image. |
| 602 parts.push_back(Part(kSplashDisplayDurationMs, ui::Tween::ZERO)); |
| 603 // For this part of the animation, fade out the splash image. |
| 604 parts.push_back(Part(kSplashFadeOutDurationMs, ui::Tween::EASE_IN)); |
| 605 // For this part of the animation, fade out |this| (fade in the dialog). |
| 606 parts.push_back(Part(kSplashFadeInDialogDurationMs, ui::Tween::EASE_OUT)); |
| 607 fade_out_.reset( |
| 608 new ui::MultiAnimation(parts, |
| 609 ui::MultiAnimation::GetDefaultTimerInterval())); |
| 610 fade_out_->set_delegate(this); |
| 611 fade_out_->set_continuous(false); |
| 612 fade_out_->Start(); |
| 613 } |
| 614 |
| 615 void AutofillDialogViews::OverlayView::AnimationProgressed( |
| 616 const ui::Animation* animation) { |
| 617 DCHECK_EQ(animation, fade_out_.get()); |
| 618 if (fade_out_->current_part_index() != 0) |
| 619 SchedulePaint(); |
| 620 } |
| 621 |
| 622 void AutofillDialogViews::OverlayView::AnimationEnded( |
| 623 const ui::Animation* animation) { |
| 624 DCHECK_EQ(animation, fade_out_.get()); |
| 625 SetVisible(false); |
| 626 fade_out_.reset(); |
| 627 } |
| 628 |
| 629 void AutofillDialogViews::OverlayView::Layout() { |
| 630 gfx::Rect bounds = GetContentsBounds(); |
| 631 if (!message_stack_->visible()) { |
| 632 image_view_->SetBoundsRect(bounds); |
| 633 return; |
| 634 } |
| 635 |
| 636 int y = bounds.bottom() - views::kButtonVEdgeMarginNew; |
| 637 if (button_->visible()) { |
| 638 button_->SizeToPreferredSize(); |
| 639 y -= button_->height(); |
| 640 button_->SetPosition(gfx::Point( |
| 641 bounds.width() - button_->width() - |
| 642 views::kButtonHEdgeMarginNew, |
| 643 y)); |
| 644 y -= views::kButtonVEdgeMarginNew; |
| 645 } |
| 646 |
| 647 int message_height = message_stack_->GetHeightForWidth(bounds.width()); |
| 648 y -= message_height; |
| 649 message_stack_->SetBounds(bounds.x(), y, bounds.width(), message_height); |
| 650 |
| 651 gfx::Size image_size = image_view_->GetPreferredSize(); |
| 652 const int kImageBottomMargin = 40; |
| 653 y -= image_size.height() + kImageBottomMargin; |
| 654 image_view_->SetBounds(bounds.x(), y, bounds.width(), image_size.height()); |
| 655 } |
| 656 |
| 657 const char* AutofillDialogViews::OverlayView::GetClassName() const { |
| 658 return kOverlayViewClassName; |
| 659 } |
| 660 |
| 661 void AutofillDialogViews::OverlayView::OnPaint(gfx::Canvas* canvas) { |
| 662 // BubbleFrameView doesn't mask the window, it just draws the border via |
| 663 // image assets. Match that rounding here. |
| 664 static const SkScalar kCornerRadius = SkIntToScalar(2); |
| 665 gfx::Rect rect = GetContentsBounds(); |
| 666 gfx::Path window_mask; |
| 667 window_mask.addRoundRect(gfx::RectToSkRect(rect), |
| 668 kCornerRadius, kCornerRadius); |
| 669 canvas->ClipPath(window_mask); |
| 670 |
| 671 // Fade out background (i.e. fade in what's behind |this|). |
| 672 if (fade_out_ && fade_out_->current_part_index() == 2) |
| 673 canvas->SaveLayerAlpha((1 - fade_out_->GetCurrentValue()) * 255); |
| 674 |
| 675 OnPaintBackground(canvas); |
| 676 |
| 677 // Draw the arrow, border, and fill for the bottom area. |
| 678 if (message_stack_->visible()) { |
| 679 const int arrow_half_width = kArrowWidth / 2.0f; |
| 680 SkPath arrow; |
| 681 int y = message_stack_->y() - 1; |
| 682 // Note that we purposely draw slightly outside of |rect| so that the |
| 683 // stroke is hidden on the sides. |
| 684 arrow.moveTo(rect.x() - 1, y); |
| 685 arrow.rLineTo(rect.width() / 2 - arrow_half_width, 0); |
| 686 arrow.rLineTo(arrow_half_width, -kArrowHeight); |
| 687 arrow.rLineTo(arrow_half_width, kArrowHeight); |
| 688 arrow.lineTo(rect.right() + 1, y); |
| 689 arrow.lineTo(rect.right() + 1, rect.bottom() + 1); |
| 690 arrow.lineTo(rect.x() - 1, rect.bottom() + 1); |
| 691 arrow.close(); |
| 692 |
| 693 SkPaint paint; |
| 694 paint.setColor(kShadingColor); |
| 695 paint.setStyle(SkPaint::kFill_Style); |
| 696 canvas->DrawPath(arrow, paint); |
| 697 paint.setColor(kSubtleBorderColor); |
| 698 paint.setStyle(SkPaint::kStroke_Style); |
| 699 canvas->DrawPath(arrow, paint); |
| 700 } |
| 701 |
| 702 PaintChildren(canvas); |
| 703 } |
| 704 |
| 705 void AutofillDialogViews::OverlayView::PaintChildren(gfx::Canvas* canvas) { |
| 706 // Don't draw children. |
| 707 if (fade_out_ && fade_out_->current_part_index() == 2) |
| 708 return; |
| 709 |
| 710 // Fade out children. |
| 711 if (fade_out_ && fade_out_->current_part_index() == 1) |
| 712 canvas->SaveLayerAlpha((1 - fade_out_->GetCurrentValue()) * 255); |
| 713 |
| 714 views::View::PaintChildren(canvas); |
| 715 } |
| 716 |
| 612 // AutofillDialogViews::NotificationArea --------------------------------------- | 717 // AutofillDialogViews::NotificationArea --------------------------------------- |
| 613 | 718 |
| 614 AutofillDialogViews::NotificationArea::NotificationArea( | 719 AutofillDialogViews::NotificationArea::NotificationArea( |
| 615 AutofillDialogController* controller) | 720 AutofillDialogController* controller) |
| 616 : controller_(controller), | 721 : controller_(controller), |
| 617 checkbox_(NULL) { | 722 checkbox_(NULL) { |
| 618 // Reserve vertical space for the arrow (regardless of whether one exists). | 723 // Reserve vertical space for the arrow (regardless of whether one exists). |
| 619 set_border(views::Border::CreateEmptyBorder(kArrowHeight, 0, 0, 0)); | 724 set_border(views::Border::CreateEmptyBorder(kArrowHeight, 0, 0, 0)); |
| 620 | 725 |
| 621 views::BoxLayout* box_layout = | 726 views::BoxLayout* box_layout = |
| (...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1011 ui::Accelerator backspace(ui::VKEY_BACK, ui::EF_NONE); | 1116 ui::Accelerator backspace(ui::VKEY_BACK, ui::EF_NONE); |
| 1012 focus_manager_->RegisterAccelerator( | 1117 focus_manager_->RegisterAccelerator( |
| 1013 backspace, ui::AcceleratorManager::kNormalPriority, this); | 1118 backspace, ui::AcceleratorManager::kNormalPriority, this); |
| 1014 #endif | 1119 #endif |
| 1015 | 1120 |
| 1016 // Listen for size changes on the browser. | 1121 // Listen for size changes on the browser. |
| 1017 views::Widget* browser_widget = | 1122 views::Widget* browser_widget = |
| 1018 views::Widget::GetTopLevelWidgetForNativeView( | 1123 views::Widget::GetTopLevelWidgetForNativeView( |
| 1019 controller_->web_contents()->GetView()->GetNativeView()); | 1124 controller_->web_contents()->GetView()->GetNativeView()); |
| 1020 observer_.Add(browser_widget); | 1125 observer_.Add(browser_widget); |
| 1126 |
| 1127 gfx::Image splash_image = controller_->SplashPageImage(); |
| 1128 if (!splash_image.IsEmpty()) { |
| 1129 DialogOverlayState state; |
| 1130 state.image = splash_image; |
| 1131 overlay_view_->SetState(state, NULL); |
| 1132 overlay_view_->BeginFadeOut(); |
| 1133 } |
| 1021 } | 1134 } |
| 1022 | 1135 |
| 1023 void AutofillDialogViews::Hide() { | 1136 void AutofillDialogViews::Hide() { |
| 1024 if (window_) | 1137 if (window_) |
| 1025 window_->Close(); | 1138 window_->Close(); |
| 1026 } | 1139 } |
| 1027 | 1140 |
| 1028 void AutofillDialogViews::UpdateAccountChooser() { | 1141 void AutofillDialogViews::UpdateAccountChooser() { |
| 1029 account_chooser_->Update(); | 1142 account_chooser_->Update(); |
| 1030 // TODO(estade): replace this with a better loading image/animation. | 1143 // TODO(estade): replace this with a better loading image/animation. |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1062 ContentsPreferredSizeChanged(); | 1175 ContentsPreferredSizeChanged(); |
| 1063 } | 1176 } |
| 1064 | 1177 |
| 1065 void AutofillDialogViews::UpdateButtonStrip() { | 1178 void AutofillDialogViews::UpdateButtonStrip() { |
| 1066 button_strip_extra_view_->SetVisible( | 1179 button_strip_extra_view_->SetVisible( |
| 1067 GetDialogButtons() != ui::DIALOG_BUTTON_NONE); | 1180 GetDialogButtons() != ui::DIALOG_BUTTON_NONE); |
| 1068 UpdateSaveInChromeCheckbox(); | 1181 UpdateSaveInChromeCheckbox(); |
| 1069 autocheckout_progress_bar_view_->SetVisible( | 1182 autocheckout_progress_bar_view_->SetVisible( |
| 1070 controller_->ShouldShowProgressBar()); | 1183 controller_->ShouldShowProgressBar()); |
| 1071 GetDialogClientView()->UpdateDialogButtons(); | 1184 GetDialogClientView()->UpdateDialogButtons(); |
| 1185 |
| 1186 overlay_view_->SetState(controller_->GetDialogOverlay(), this); |
| 1187 |
| 1072 ContentsPreferredSizeChanged(); | 1188 ContentsPreferredSizeChanged(); |
| 1073 } | 1189 } |
| 1074 | 1190 |
| 1075 void AutofillDialogViews::UpdateDetailArea() { | 1191 void AutofillDialogViews::UpdateDetailArea() { |
| 1076 scrollable_area_->SetVisible(controller_->ShouldShowDetailArea()); | 1192 scrollable_area_->SetVisible(controller_->ShouldShowDetailArea()); |
| 1077 ContentsPreferredSizeChanged(); | 1193 ContentsPreferredSizeChanged(); |
| 1078 } | 1194 } |
| 1079 | 1195 |
| 1080 void AutofillDialogViews::UpdateForErrors() { | 1196 void AutofillDialogViews::UpdateForErrors() { |
| 1081 ValidateForm(); | 1197 ValidateForm(); |
| (...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1394 views::Background::CreateSolidBackground(kShadingColor)); | 1510 views::Background::CreateSolidBackground(kShadingColor)); |
| 1395 | 1511 |
| 1396 legal_document_view_ = new views::StyledLabel(string16(), this); | 1512 legal_document_view_ = new views::StyledLabel(string16(), this); |
| 1397 footnote_view_->AddChildView(legal_document_view_); | 1513 footnote_view_->AddChildView(legal_document_view_); |
| 1398 footnote_view_->SetVisible(false); | 1514 footnote_view_->SetVisible(false); |
| 1399 | 1515 |
| 1400 return footnote_view_; | 1516 return footnote_view_; |
| 1401 } | 1517 } |
| 1402 | 1518 |
| 1403 views::View* AutofillDialogViews::CreateOverlayView() { | 1519 views::View* AutofillDialogViews::CreateOverlayView() { |
| 1404 gfx::Image splash_image = controller_->SplashPageImage(); | |
| 1405 if (splash_image.IsEmpty()) | |
| 1406 return NULL; | |
| 1407 | |
| 1408 overlay_view_ = new OverlayView(); | |
| 1409 views::ImageView* image = new views::ImageView(); | |
| 1410 image->SetImage(splash_image.ToImageSkia()); | |
| 1411 overlay_view_->AddChildView(image); | |
| 1412 | |
| 1413 return overlay_view_; | 1520 return overlay_view_; |
| 1414 } | 1521 } |
| 1415 | 1522 |
| 1416 bool AutofillDialogViews::Cancel() { | 1523 bool AutofillDialogViews::Cancel() { |
| 1417 controller_->OnCancel(); | 1524 controller_->OnCancel(); |
| 1418 return true; | 1525 return true; |
| 1419 } | 1526 } |
| 1420 | 1527 |
| 1421 bool AutofillDialogViews::Accept() { | 1528 bool AutofillDialogViews::Accept() { |
| 1422 if (ValidateForm()) | 1529 if (ValidateForm()) |
| 1423 controller_->OnAccept(); | 1530 controller_->OnAccept(); |
| 1424 else if (!validity_map_.empty()) | 1531 else if (!validity_map_.empty()) |
| 1425 validity_map_.begin()->first->RequestFocus(); | 1532 validity_map_.begin()->first->RequestFocus(); |
| 1426 | 1533 |
| 1427 // |controller_| decides when to hide the dialog. | 1534 // |controller_| decides when to hide the dialog. |
| 1428 return false; | 1535 return false; |
| 1429 } | 1536 } |
| 1430 | 1537 |
| 1431 // TODO(wittman): Remove this override once we move to the new style frame view | 1538 // TODO(wittman): Remove this override once we move to the new style frame view |
| 1432 // on all dialogs. | 1539 // on all dialogs. |
| 1433 views::NonClientFrameView* AutofillDialogViews::CreateNonClientFrameView( | 1540 views::NonClientFrameView* AutofillDialogViews::CreateNonClientFrameView( |
| 1434 views::Widget* widget) { | 1541 views::Widget* widget) { |
| 1435 return CreateConstrainedStyleNonClientFrameView( | 1542 return CreateConstrainedStyleNonClientFrameView( |
| 1436 widget, | 1543 widget, |
| 1437 controller_->web_contents()->GetBrowserContext()); | 1544 controller_->web_contents()->GetBrowserContext()); |
| 1438 } | 1545 } |
| 1439 | 1546 |
| 1440 void AutofillDialogViews::ButtonPressed(views::Button* sender, | 1547 void AutofillDialogViews::ButtonPressed(views::Button* sender, |
| 1441 const ui::Event& event) { | 1548 const ui::Event& event) { |
| 1549 if (sender->GetAncestorWithClassName(kOverlayViewClassName)) { |
| 1550 controller_->OverlayButtonPressed(); |
| 1551 return; |
| 1552 } |
| 1553 |
| 1442 // TODO(estade): Should the menu be shown on mouse down? | 1554 // TODO(estade): Should the menu be shown on mouse down? |
| 1443 DetailsGroup* group = NULL; | 1555 DetailsGroup* group = NULL; |
| 1444 for (DetailGroupMap::iterator iter = detail_groups_.begin(); | 1556 for (DetailGroupMap::iterator iter = detail_groups_.begin(); |
| 1445 iter != detail_groups_.end(); ++iter) { | 1557 iter != detail_groups_.end(); ++iter) { |
| 1446 if (sender == iter->second.suggested_button) { | 1558 if (sender == iter->second.suggested_button) { |
| 1447 group = &iter->second; | 1559 group = &iter->second; |
| 1448 break; | 1560 break; |
| 1449 } | 1561 } |
| 1450 } | 1562 } |
| 1451 DCHECK(group); | 1563 DCHECK(group); |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1574 loading_shield_->SetFont(ui::ResourceBundle::GetSharedInstance().GetFont( | 1686 loading_shield_->SetFont(ui::ResourceBundle::GetSharedInstance().GetFont( |
| 1575 ui::ResourceBundle::BaseFont).DeriveFont(15)); | 1687 ui::ResourceBundle::BaseFont).DeriveFont(15)); |
| 1576 AddChildView(loading_shield_); | 1688 AddChildView(loading_shield_); |
| 1577 | 1689 |
| 1578 sign_in_webview_ = new views::WebView(controller_->profile()); | 1690 sign_in_webview_ = new views::WebView(controller_->profile()); |
| 1579 sign_in_webview_->SetVisible(false); | 1691 sign_in_webview_->SetVisible(false); |
| 1580 AddChildView(sign_in_webview_); | 1692 AddChildView(sign_in_webview_); |
| 1581 sign_in_delegate_.reset( | 1693 sign_in_delegate_.reset( |
| 1582 new AutofillDialogSignInDelegate(this, | 1694 new AutofillDialogSignInDelegate(this, |
| 1583 sign_in_webview_->GetWebContents())); | 1695 sign_in_webview_->GetWebContents())); |
| 1696 |
| 1697 overlay_view_ = new OverlayView(this); |
| 1698 overlay_view_->SetVisible(false); |
| 1584 } | 1699 } |
| 1585 | 1700 |
| 1586 views::View* AutofillDialogViews::CreateDetailsContainer() { | 1701 views::View* AutofillDialogViews::CreateDetailsContainer() { |
| 1587 details_container_ = new DetailsContainerView( | 1702 details_container_ = new DetailsContainerView( |
| 1588 base::Bind(&AutofillDialogViews::DetailsContainerBoundsChanged, | 1703 base::Bind(&AutofillDialogViews::DetailsContainerBoundsChanged, |
| 1589 base::Unretained(this))); | 1704 base::Unretained(this))); |
| 1590 // A box layout is used because it respects widget visibility. | 1705 // A box layout is used because it respects widget visibility. |
| 1591 details_container_->SetLayoutManager( | 1706 details_container_->SetLayoutManager( |
| 1592 new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 0)); | 1707 new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 0)); |
| 1593 for (DetailGroupMap::iterator iter = detail_groups_.begin(); | 1708 for (DetailGroupMap::iterator iter = detail_groups_.begin(); |
| (...skipping 511 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2105 AutofillDialogViews::DetailsGroup::DetailsGroup(DialogSection section) | 2220 AutofillDialogViews::DetailsGroup::DetailsGroup(DialogSection section) |
| 2106 : section(section), | 2221 : section(section), |
| 2107 container(NULL), | 2222 container(NULL), |
| 2108 manual_input(NULL), | 2223 manual_input(NULL), |
| 2109 suggested_info(NULL), | 2224 suggested_info(NULL), |
| 2110 suggested_button(NULL) {} | 2225 suggested_button(NULL) {} |
| 2111 | 2226 |
| 2112 AutofillDialogViews::DetailsGroup::~DetailsGroup() {} | 2227 AutofillDialogViews::DetailsGroup::~DetailsGroup() {} |
| 2113 | 2228 |
| 2114 } // namespace autofill | 2229 } // namespace autofill |
| OLD | NEW |