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