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