generated_credit_card_bubble_views.cc revision ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16
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  // TODO(dbeam): investigate why this steals focus from the web contents.
38  views::BubbleDelegateView::CreateBubble(this)->Show();
39
40  // This bubble doesn't render correctly on Windows without calling
41  // |SizeToContents()|. This must be called after showing the widget.
42  SizeToContents();
43}
44
45void GeneratedCreditCardBubbleViews::Hide() {
46  GetWidget()->Close();
47}
48
49bool GeneratedCreditCardBubbleViews::IsHiding() const {
50  return GetWidget() && GetWidget()->IsClosed();
51}
52
53gfx::Size GeneratedCreditCardBubbleViews::GetPreferredSize() {
54  return gfx::Size(
55      GeneratedCreditCardBubbleView::kContentsWidth,
56      GetHeightForWidth(GeneratedCreditCardBubbleViews::kContentsWidth));
57}
58
59base::string16 GeneratedCreditCardBubbleViews::GetWindowTitle() const {
60  return controller_ ? controller_->TitleText() : base::string16();
61}
62
63void GeneratedCreditCardBubbleViews::Init() {
64  SetLayoutManager(new views::BoxLayout(views::BoxLayout::kVertical, 0, 0,
65                                        views::kRelatedControlVerticalSpacing));
66
67  const base::string16& contents_text = controller_->ContentsText();
68  views::StyledLabel* contents = new views::StyledLabel(contents_text, this);
69
70  const std::vector<TextRange>& text_ranges = controller_->ContentsTextRanges();
71  for (size_t i = 0; i < text_ranges.size(); ++i) {
72    views::StyledLabel::RangeStyleInfo style;
73
74    if (text_ranges[i].is_link)
75      style = views::StyledLabel::RangeStyleInfo::CreateForLink();
76    else
77      style.font_style = gfx::Font::BOLD;
78
79    contents->AddStyleRange(text_ranges[i].range, style);
80  }
81
82  AddChildView(contents);
83}
84
85void GeneratedCreditCardBubbleViews::StyledLabelLinkClicked(const ui::Range& r,
86                                                            int event_flags) {
87  if (controller_)
88    controller_->OnLinkClicked();
89}
90
91// static
92base::WeakPtr<GeneratedCreditCardBubbleView>
93    GeneratedCreditCardBubbleView::Create(
94        const base::WeakPtr<GeneratedCreditCardBubbleController>& controller) {
95  return (new GeneratedCreditCardBubbleViews(controller))->weak_ptr_factory_.
96      GetWeakPtr();
97}
98
99GeneratedCreditCardBubbleViews::GeneratedCreditCardBubbleViews(
100    const base::WeakPtr<GeneratedCreditCardBubbleController>& controller)
101    : BubbleDelegateView(GetAnchor(controller), views::BubbleBorder::TOP_RIGHT),
102      controller_(controller),
103      weak_ptr_factory_(this) {
104  gfx::Insets insets = views::BubbleFrameView::GetTitleInsets();
105  set_margins(gfx::Insets(0, insets.left(), insets.top(), insets.left()));
106}
107
108}  // namespace autofill
109