generated_credit_card_bubble_views.cc revision cedac228d2dd51db4b79ea1e72c7f249408ee061
1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/ui/views/autofill/generated_credit_card_bubble_views.h"
6
7#include "chrome/browser/ui/autofill/generated_credit_card_bubble_controller.h"
8#include "chrome/browser/ui/browser_finder.h"
9#include "chrome/browser/ui/views/frame/browser_view.h"
10#include "chrome/browser/ui/views/location_bar/location_bar_view.h"
11#include "ui/gfx/font.h"
12#include "ui/gfx/insets.h"
13#include "ui/gfx/size.h"
14#include "ui/views/bubble/bubble_frame_view.h"
15#include "ui/views/controls/styled_label.h"
16#include "ui/views/layout/box_layout.h"
17#include "ui/views/layout/layout_constants.h"
18#include "ui/views/widget/widget.h"
19
20namespace autofill {
21
22namespace {
23
24// Get the view this bubble will be anchored to via |controller|.
25views::View* GetAnchor(
26    const base::WeakPtr<GeneratedCreditCardBubbleController>& controller) {
27  BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(
28      chrome::FindBrowserWithWebContents(controller->web_contents()));
29  return browser_view->GetLocationBarView()->generated_credit_card_view();
30}
31
32}  // namespace
33
34GeneratedCreditCardBubbleViews::~GeneratedCreditCardBubbleViews() {}
35
36void GeneratedCreditCardBubbleViews::Show() {
37  views::BubbleDelegateView::CreateBubble(this)->Show();
38
39  // This bubble doesn't render correctly on Windows without calling
40  // |SizeToContents()|. This must be called after showing the widget.
41  SizeToContents();
42}
43
44void GeneratedCreditCardBubbleViews::Hide() {
45  GetWidget()->Close();
46}
47
48bool GeneratedCreditCardBubbleViews::IsHiding() const {
49  return GetWidget() && GetWidget()->IsClosed();
50}
51
52gfx::Size GeneratedCreditCardBubbleViews::GetPreferredSize() const {
53  return gfx::Size(
54      GeneratedCreditCardBubbleView::kContentsWidth,
55      GetHeightForWidth(GeneratedCreditCardBubbleViews::kContentsWidth));
56}
57
58base::string16 GeneratedCreditCardBubbleViews::GetWindowTitle() const {
59  return controller_ ? controller_->TitleText() : base::string16();
60}
61
62void GeneratedCreditCardBubbleViews::Init() {
63  SetLayoutManager(new views::BoxLayout(views::BoxLayout::kVertical, 0, 0,
64                                        views::kRelatedControlVerticalSpacing));
65
66  const base::string16& contents_text = controller_->ContentsText();
67  views::StyledLabel* contents = new views::StyledLabel(contents_text, this);
68
69  const std::vector<TextRange>& text_ranges = controller_->ContentsTextRanges();
70  for (size_t i = 0; i < text_ranges.size(); ++i) {
71    views::StyledLabel::RangeStyleInfo style;
72
73    if (text_ranges[i].is_link)
74      style = views::StyledLabel::RangeStyleInfo::CreateForLink();
75    else
76      style.font_style = gfx::Font::BOLD;
77
78    contents->AddStyleRange(text_ranges[i].range, style);
79  }
80
81  AddChildView(contents);
82}
83
84void GeneratedCreditCardBubbleViews::StyledLabelLinkClicked(const gfx::Range& r,
85                                                            int event_flags) {
86  if (controller_)
87    controller_->OnLinkClicked();
88}
89
90// static
91base::WeakPtr<GeneratedCreditCardBubbleView>
92    GeneratedCreditCardBubbleView::Create(
93        const base::WeakPtr<GeneratedCreditCardBubbleController>& controller) {
94  return (new GeneratedCreditCardBubbleViews(controller))->weak_ptr_factory_.
95      GetWeakPtr();
96}
97
98GeneratedCreditCardBubbleViews::GeneratedCreditCardBubbleViews(
99    const base::WeakPtr<GeneratedCreditCardBubbleController>& controller)
100    : BubbleDelegateView(GetAnchor(controller), views::BubbleBorder::TOP_RIGHT),
101      controller_(controller),
102      weak_ptr_factory_(this) {
103  gfx::Insets insets = views::BubbleFrameView::GetTitleInsets();
104  set_margins(gfx::Insets(0, insets.left(), insets.top(), insets.left()));
105}
106
107}  // namespace autofill
108