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 0819d36da18845c943d6b5948e36d008225edfdc..5badc6f8793f027ed2248aeecc307c70809a931f 100644 |
--- a/chrome/browser/ui/views/autofill/autofill_dialog_views.cc |
+++ b/chrome/browser/ui/views/autofill/autofill_dialog_views.cc |
@@ -14,6 +14,7 @@ |
#include "chrome/browser/ui/autofill/autofill_dialog_view_delegate.h" |
#include "chrome/browser/ui/autofill/loading_animation.h" |
#include "chrome/browser/ui/views/autofill/decorated_textfield.h" |
+#include "chrome/browser/ui/views/autofill/info_bubble.h" |
#include "chrome/browser/ui/views/autofill/tooltip_icon.h" |
#include "chrome/browser/ui/views/constrained_window_views.h" |
#include "components/autofill/content/browser/wallet/wallet_service_url.h" |
@@ -97,13 +98,6 @@ const int kDialogEdgePadding = 20; |
// The vertical padding between rows of manual inputs (in pixels). |
const int kManualInputRowPadding = 10; |
-// The margin between the content of the error bubble and its border. |
-const int kErrorBubbleHorizontalMargin = 14; |
-const int kErrorBubbleVerticalMargin = 12; |
- |
-// The visible width of bubble borders (differs from the actual width) in px. |
-const int kBubbleBorderVisibleWidth = 1; |
- |
// Slight shading for mouse hover and legal document background. |
SkColor kShadingColor = SkColorSetARGB(7, 0, 0, 0); |
@@ -460,122 +454,6 @@ class LoadingAnimationView : public views::View, |
} // namespace |
-// AutofillDialogViews::ErrorBubble -------------------------------------------- |
- |
-AutofillDialogViews::ErrorBubble::ErrorBubble(views::View* anchor, |
- views::View* anchor_container, |
- const base::string16& message) |
- : anchor_(anchor), |
- anchor_container_(anchor_container), |
- show_above_anchor_( |
- anchor->GetClassName() == views::Combobox::kViewClassName) { |
- DCHECK(anchor_container_->Contains(anchor)); |
- SetAnchorView(anchor_); |
- |
- // TODO(dbeam): currently we assume that combobox menus always show downward |
- // (which isn't true). If the invalid combobox is low enough on the screen, |
- // its menu will actually show upward and obscure the bubble. Figure out when |
- // this might happen and adjust |show_above_anchor_| accordingly. This is not |
- // that big of deal because it rarely happens in practice. |
- if (show_above_anchor_) { |
- set_arrow(ShouldArrowGoOnTheRight() ? views::BubbleBorder::BOTTOM_RIGHT : |
- views::BubbleBorder::BOTTOM_LEFT); |
- } else { |
- set_arrow(ShouldArrowGoOnTheRight() ? views::BubbleBorder::TOP_RIGHT : |
- views::BubbleBorder::TOP_LEFT); |
- } |
- |
- set_margins(gfx::Insets(kErrorBubbleVerticalMargin, |
- kErrorBubbleHorizontalMargin, |
- kErrorBubbleVerticalMargin, |
- kErrorBubbleHorizontalMargin)); |
- set_use_focusless(true); |
- |
- SetLayoutManager(new views::FillLayout); |
- views::Label* label = new views::Label(message); |
- label->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
- label->SetMultiLine(true); |
- AddChildView(label); |
- |
- widget_ = views::BubbleDelegateView::CreateBubble(this); |
- UpdatePosition(); |
-} |
- |
-AutofillDialogViews::ErrorBubble::~ErrorBubble() { |
- DCHECK(!widget_); |
-} |
- |
-void AutofillDialogViews::ErrorBubble::Hide() { |
- views::Widget* widget = GetWidget(); |
- if (widget && !widget->IsClosed()) |
- widget->Close(); |
-} |
- |
-void AutofillDialogViews::ErrorBubble::UpdatePosition() { |
- if (!widget_) |
- return; |
- |
- if (!anchor_->GetVisibleBounds().IsEmpty()) { |
- SizeToContents(); |
- widget_->SetVisibilityChangedAnimationsEnabled(true); |
- widget_->ShowInactive(); |
- } else { |
- widget_->SetVisibilityChangedAnimationsEnabled(false); |
- widget_->Hide(); |
- } |
-} |
- |
-gfx::Size AutofillDialogViews::ErrorBubble::GetPreferredSize() { |
- int pref_width = GetPreferredBubbleWidth(); |
- pref_width -= GetBubbleFrameView()->GetInsets().width(); |
- pref_width -= 2 * kBubbleBorderVisibleWidth; |
- return gfx::Size(pref_width, GetHeightForWidth(pref_width)); |
-} |
- |
-gfx::Rect AutofillDialogViews::ErrorBubble::GetBubbleBounds() { |
- gfx::Rect bounds = views::BubbleDelegateView::GetBubbleBounds(); |
- gfx::Rect anchor_bounds = anchor_->GetBoundsInScreen(); |
- |
- if (show_above_anchor_) |
- bounds.set_y(anchor_bounds.y() - GetBubbleFrameView()->height()); |
- |
- anchor_bounds.Inset(-GetBubbleFrameView()->bubble_border()->GetInsets()); |
- bounds.set_x(ShouldArrowGoOnTheRight() ? |
- anchor_bounds.right() - bounds.width() - kBubbleBorderVisibleWidth : |
- anchor_bounds.x() + kBubbleBorderVisibleWidth); |
- return bounds; |
-} |
- |
-void AutofillDialogViews::ErrorBubble::OnWidgetClosing(views::Widget* widget) { |
- if (widget == widget_) |
- widget_ = NULL; |
-} |
- |
-bool AutofillDialogViews::ErrorBubble::ShouldFlipArrowForRtl() const { |
- return false; |
-} |
- |
-int AutofillDialogViews::ErrorBubble::GetContainerWidth() { |
- return anchor_container_->width() - anchor_container_->GetInsets().width(); |
-} |
- |
-int AutofillDialogViews::ErrorBubble::GetPreferredBubbleWidth() { |
- return (GetContainerWidth() - views::kRelatedControlHorizontalSpacing) / 2; |
-} |
- |
-bool AutofillDialogViews::ErrorBubble::ShouldArrowGoOnTheRight() { |
- gfx::Point anchor_offset; |
- views::View::ConvertPointToTarget(anchor_, anchor_container_, &anchor_offset); |
- anchor_offset.Offset(-anchor_container_->GetInsets().left(), 0); |
- |
- if (base::i18n::IsRTL()) { |
- int anchor_right_x = anchor_offset.x() + anchor_->width(); |
- return anchor_right_x >= GetPreferredBubbleWidth(); |
- } |
- |
- return anchor_offset.x() + GetPreferredBubbleWidth() > GetContainerWidth(); |
-} |
- |
// AutofillDialogViews::AccountChooser ----------------------------------------- |
AutofillDialogViews::AccountChooser::AccountChooser( |
@@ -2256,9 +2134,17 @@ void AutofillDialogViews::ShowErrorBubbleForViewIfNecessary(views::View* view) { |
if (!error_bubble_ || error_bubble_->anchor() != view) { |
HideErrorBubble(); |
- views::View* section = |
- view->GetAncestorWithClassName(kSectionContainerClassName); |
- error_bubble_ = new ErrorBubble(view, section, error_message->second); |
+ error_bubble_ = new InfoBubble(view, error_message->second); |
+ error_bubble_->set_align_to_anchor_edge(true); |
+ error_bubble_->set_container_insets(gfx::Insets(kDialogEdgePadding, |
+ kDialogEdgePadding, |
+ kDialogEdgePadding, |
+ kDialogEdgePadding)); |
+ error_bubble_->set_preferred_width( |
+ (kSectionContainerWidth - views::kRelatedControlVerticalSpacing) / 2); |
+ bool show_above = view->GetClassName() == views::Combobox::kViewClassName; |
+ error_bubble_->set_show_above_anchor(show_above); |
+ error_bubble_->Show(); |
} |
} |
} |