page_info_bubble_view.cc revision 21d179b334e59e9a3bfcaed4c4430bef1bc5759d
1bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Use of this source code is governed by a BSD-style license that can be
3bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// found in the LICENSE file.
4bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
5bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/views/page_info_bubble_view.h"
6bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
7bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "app/l10n_util.h"
8bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/utf_string_conversions.h"
9bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/browser_list.h"
10731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/cert_store.h"
11bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/certificate_viewer.h"
124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/google/google_util.h"
13bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/views/frame/browser_view.h"
14bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/views/info_bubble.h"
15bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/views/toolbar_view.h"
164a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/common/url_constants.h"
17bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "grit/generated_resources.h"
18bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "grit/locale_settings.h"
19bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "views/controls/image_view.h"
20bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "views/controls/label.h"
21bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "views/controls/separator.h"
22bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "views/grid_layout.h"
23bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "views/widget/widget.h"
24bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "views/window/window.h"
25bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
26bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsennamespace {
27bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
28bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Layout constants.
29bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst int kHGapToBorder = 11;
30bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst int kVGapToImage = 10;
31bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst int kVGapToHeadline = 7;
32bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst int kHGapImageToDescription = 6;
33bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst int kTextPaddingRight = 10;
34bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst int kPaddingBelowSeparator = 4;
35bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst int kPaddingAboveSeparator = 13;
36731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickconst int kIconHorizontalOffset = 27;
37731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickconst int kIconVerticalOffset = -7;
38731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
39731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// The duration of the animation that resizes the bubble once the async
40731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// information is provided through the ModelChanged event.
41731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickconst int kPageInfoSlideDuration = 300;
42bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
43bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// A section contains an image that shows a status (good or bad), a title, an
44bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// optional head-line (in bold) and a description.
45bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass Section : public views::View,
46bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                public views::LinkController {
47bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen public:
48bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  Section(PageInfoBubbleView* owner,
49bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          const PageInfoModel::SectionInfo& section_info,
50731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          const SkBitmap* status_icon,
51bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          bool show_cert);
52bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual ~Section();
53bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
54bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // views::View methods:
55bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual int GetHeightForWidth(int w);
56bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void Layout();
57bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
58bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // views::LinkController methods:
59bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void LinkActivated(views::Link* source, int event_flags);
60bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
61bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen private:
62bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Calculate the layout if |compute_bounds_only|, otherwise does Layout also.
63bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  gfx::Size LayoutItems(bool compute_bounds_only, int width);
64bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
65bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // The view that owns this Section object.
66bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  PageInfoBubbleView* owner_;
67bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
68bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // The information this view represents.
69bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  PageInfoModel::SectionInfo info_;
70bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
71bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  views::ImageView* status_image_;
72bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  views::Label* headline_label_;
73bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  views::Label* description_label_;
74bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  views::Link* link_;
75bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
76bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(Section);
77bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen};
78bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
79bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}  // namespace
80bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
81bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen////////////////////////////////////////////////////////////////////////////////
82bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// PageInfoBubbleView
83bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
84bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenPageInfoBubbleView::PageInfoBubbleView(gfx::NativeWindow parent_window,
85bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                       Profile* profile,
86bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                       const GURL& url,
87bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                       const NavigationEntry::SSLStatus& ssl,
88bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                       bool show_history)
89bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    : ALLOW_THIS_IN_INITIALIZER_LIST(model_(profile, url, ssl,
90bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                            show_history, this)),
91bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      parent_window_(parent_window),
92bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      cert_id_(ssl.cert_id()),
93bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      info_bubble_(NULL),
94731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      help_center_link_(NULL),
95731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      ALLOW_THIS_IN_INITIALIZER_LIST(resize_animation_(this)),
96731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      animation_start_height_(0) {
97731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (cert_id_ > 0) {
98731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    scoped_refptr<net::X509Certificate> cert;
9921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    CertStore::GetInstance()->RetrieveCert(cert_id_, &cert);
100731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // When running with fake certificate (Chrome Frame) or Gears in offline
101731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // mode, we have no os certificate, so there is no cert to show. Don't
102731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // bother showing the cert info link in that case.
103731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (!cert.get() || !cert->os_cert_handle())
104731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      cert_id_ = 0;
105731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
106bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  LayoutSections();
107bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
108bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
109bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenPageInfoBubbleView::~PageInfoBubbleView() {
110bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
111bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
112bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid PageInfoBubbleView::ShowCertDialog() {
113bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ShowCertificateViewerByID(parent_window_, cert_id_);
114bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
115bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
116bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid PageInfoBubbleView::LayoutSections() {
117bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Remove all the existing sections.
118bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  RemoveAllChildViews(true);
119bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
120bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  views::GridLayout* layout = new views::GridLayout(this);
121bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  SetLayoutManager(layout);
122bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  views::ColumnSet* columns = layout->AddColumnSet(0);
123bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  columns->AddColumn(views::GridLayout::FILL,  // Horizontal resize.
124bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                     views::GridLayout::FILL,  // Vertical resize.
125bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                     1,   // Resize weight.
126bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                     views::GridLayout::USE_PREF,  // Size type.
127bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                     0,   // Ignored for USE_PREF.
128bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                     0);  // Minimum size.
129731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Add a column set for aligning the text when it has no icons (such as the
130731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // help center link).
131731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  columns = layout->AddColumnSet(1);
132731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  columns->AddPaddingColumn(
133731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      0, kHGapToBorder + kIconHorizontalOffset + kHGapImageToDescription);
134731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  columns->AddColumn(views::GridLayout::LEADING,  // Horizontal resize.
135731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                     views::GridLayout::FILL,     // Vertical resize.
136731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                     1,   // Resize weight.
137731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                     views::GridLayout::USE_PREF,  // Size type.
138731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                     0,   // Ignored for USE_PREF.
139731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                     0);  // Minimum size.
140bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
141bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  int count = model_.GetSectionCount();
142bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  for (int i = 0; i < count; ++i) {
143bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    PageInfoModel::SectionInfo info = model_.GetSectionInfo(i);
144bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    layout->StartRow(0, 0);
145731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    const SkBitmap* icon = model_.GetIconImage(info.icon_id);
146731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    layout->AddView(new Section(this, info, icon, cert_id_ > 0));
147bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
148bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // Add separator after all sections.
149bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    layout->AddPaddingRow(0, kPaddingAboveSeparator);
150bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    layout->StartRow(0, 0);
151bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    layout->AddView(new views::Separator());
152bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    layout->AddPaddingRow(0, kPaddingBelowSeparator);
153bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
154bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
155bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Then add the help center link at the bottom.
156731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  layout->StartRow(0, 1);
157bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  help_center_link_ =
158bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      new views::Link(l10n_util::GetString(IDS_PAGE_INFO_HELP_CENTER_LINK));
159bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  help_center_link_->SetController(this);
160bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  layout->AddView(help_center_link_);
161bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
162bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
163bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsengfx::Size PageInfoBubbleView::GetPreferredSize() {
164bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  gfx::Size size(views::Window::GetLocalizedContentsSize(
165bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      IDS_PAGEINFOBUBBLE_WIDTH_CHARS, IDS_PAGEINFOBUBBLE_HEIGHT_LINES));
166bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  size.set_height(0);
167bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
168bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  int count = model_.GetSectionCount();
169bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  for (int i = 0; i < count; ++i) {
170bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    PageInfoModel::SectionInfo info = model_.GetSectionInfo(i);
171731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    const SkBitmap* icon = model_.GetIconImage(info.icon_id);
172731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    Section section(this, info, icon, cert_id_ > 0);
173bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    size.Enlarge(0, section.GetHeightForWidth(size.width()));
174bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
175bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
176bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Calculate how much space the separators take up (with padding).
177bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  views::Separator separator;
178bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  gfx::Size separator_size = separator.GetPreferredSize();
179bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  gfx::Size separator_plus_padding(0, separator_size.height() +
180bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                      kPaddingAboveSeparator +
181bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                      kPaddingBelowSeparator);
182bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
183bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Account for the separators and padding within sections.
184bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  size.Enlarge(0, (count - 1) * separator_plus_padding.height());
185bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
186bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Account for the Help Center link and the separator above it.
187bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  gfx::Size link_size = help_center_link_->GetPreferredSize();
188bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  size.Enlarge(0, separator_plus_padding.height() +
189bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                  link_size.height());
190bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
191731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!resize_animation_.is_animating())
192731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return size;
193731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
194731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // We are animating from animation_start_height_ to size.
195731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  int target_height = animation_start_height_ + static_cast<int>(
196731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      (size.height() - animation_start_height_) *
197731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      resize_animation_.GetCurrentValue());
198731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  size.set_height(target_height);
199bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return size;
200bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
201bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
202bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid PageInfoBubbleView::ModelChanged() {
203731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  animation_start_height_ = bounds().height();
204bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  LayoutSections();
205731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  resize_animation_.SetSlideDuration(kPageInfoSlideDuration);
206731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  resize_animation_.Show();
207bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
208bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
209bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid PageInfoBubbleView::LinkActivated(views::Link* source, int event_flags) {
2104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  GURL url = google_util::AppendGoogleLocaleParam(
2114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      GURL(chrome::kPageInfoHelpCenterURL));
212bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  Browser* browser = BrowserList::GetLastActive();
213bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  browser->OpenURL(url, GURL(), NEW_FOREGROUND_TAB, PageTransition::LINK);
214bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
215bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
216731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid PageInfoBubbleView::AnimationEnded(const Animation* animation) {
217731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  info_bubble_->SizeToContents();
218731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
219731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
220731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid PageInfoBubbleView::AnimationProgressed(const Animation* animation) {
221731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  info_bubble_->SizeToContents();
222731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
223731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
224bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen////////////////////////////////////////////////////////////////////////////////
225bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Section
226bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
227bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenSection::Section(PageInfoBubbleView* owner,
228bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                 const PageInfoModel::SectionInfo& section_info,
229731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                 const SkBitmap* state_icon,
230bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                 bool show_cert)
231bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    : owner_(owner),
232bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      info_(section_info),
233bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      status_image_(NULL),
234bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      link_(NULL) {
235731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (state_icon) {
236bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    status_image_ = new views::ImageView();
237731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    status_image_->SetImage(*state_icon);
238bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    AddChildView(status_image_);
239bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
240bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
241bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  headline_label_ = new views::Label(UTF16ToWideHack(info_.headline));
242bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  headline_label_->SetFont(
243bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      headline_label_->font().DeriveFont(0, gfx::Font::BOLD));
244bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  headline_label_->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
245bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AddChildView(headline_label_);
246bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
247bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  description_label_ = new views::Label(UTF16ToWideHack(info_.description));
248bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  description_label_->SetMultiLine(true);
249bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  description_label_->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
250bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Allow linebreaking in the middle of words if necessary, so that extremely
251bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // long hostnames (longer than one line) will still be completely shown.
252bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  description_label_->SetAllowCharacterBreak(true);
253bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AddChildView(description_label_);
254bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
255bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (info_.type == PageInfoModel::SECTION_INFO_IDENTITY && show_cert) {
256bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    link_ = new views::Link(
257bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        l10n_util::GetString(IDS_PAGEINFO_CERT_INFO_BUTTON));
258bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    link_->SetController(this);
259bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    AddChildView(link_);
260bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
261bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
262bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
263bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenSection::~Section() {
264bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
265bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
266bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenint Section::GetHeightForWidth(int width) {
267bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return LayoutItems(true, width).height();
268bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
269bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
270bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid Section::Layout() {
271bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  LayoutItems(false, width());
272bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
273bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
274bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid Section::LinkActivated(views::Link* source, int event_flags) {
275bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  owner_->ShowCertDialog();
276bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
277bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
278bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsengfx::Size Section::LayoutItems(bool compute_bounds_only, int width) {
279bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  int x = kHGapToBorder;
280bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  int y = kVGapToImage;
281bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
282bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Layout the image, head-line and description.
283bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  gfx::Size size;
284bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (status_image_) {
285bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      size = status_image_->GetPreferredSize();
286bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (!compute_bounds_only)
287bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      status_image_->SetBounds(x, y, size.width(), size.height());
288bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
289bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  int image_height = y + size.height();
290bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  x += size.width() + kHGapImageToDescription;
291bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  int w = width - x - kTextPaddingRight;
292bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  y = kVGapToHeadline;
293bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!headline_label_->GetText().empty()) {
294bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    size = headline_label_->GetPreferredSize();
295bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (!compute_bounds_only)
296bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      headline_label_->SetBounds(x, y, w > 0 ? w : 0, size.height());
297bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    y += size.height();
298bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  } else {
299bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (!compute_bounds_only)
300bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      headline_label_->SetBounds(x, y, 0, 0);
301bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
302bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (w > 0) {
303bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int height = description_label_->GetHeightForWidth(w);
304bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (!compute_bounds_only)
305bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      description_label_->SetBounds(x, y, w, height);
306bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    y += height;
307bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  } else {
308bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (!compute_bounds_only)
309bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      description_label_->SetBounds(x, y, 0, 0);
310bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
311bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (info_.type == PageInfoModel::SECTION_INFO_IDENTITY && link_) {
312bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    size = link_->GetPreferredSize();
313bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (!compute_bounds_only)
314bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      link_->SetBounds(x, y, size.width(), size.height());
315bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    y += size.height();
316bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
317bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
318bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Make sure the image is not truncated if the text doesn't contain much.
319bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  y = std::max(y, image_height);
320bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return gfx::Size(width, y);
321bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
322bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
323bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsennamespace browser {
324bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
325bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid ShowPageInfoBubble(gfx::NativeWindow parent,
326bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        Profile* profile,
327bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        const GURL& url,
328bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        const NavigationEntry::SSLStatus& ssl,
329bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        bool show_history) {
330bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Find where to point the bubble at.
331bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  BrowserView* browser_view =
332bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      BrowserView::GetBrowserViewForNativeWindow(parent);
333bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  gfx::Point point;
334bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (base::i18n::IsRTL()) {
335bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int width = browser_view->toolbar()->location_bar()->width();
336731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    point = gfx::Point(width - kIconHorizontalOffset, 0);
337bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
338731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  point.Offset(0, kIconVerticalOffset);
339bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  views::View::ConvertPointToScreen(browser_view->toolbar()->location_bar(),
340bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                    &point);
341bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  gfx::Rect bounds = browser_view->toolbar()->location_bar()->bounds();
342bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  bounds.set_origin(point);
343731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  bounds.set_width(kIconHorizontalOffset);
344bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
345bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Show the bubble.
346bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  PageInfoBubbleView* page_info_bubble =
347bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      new PageInfoBubbleView(parent, profile, url, ssl, show_history);
348bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  InfoBubble* info_bubble =
349bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      InfoBubble::Show(browser_view->GetWidget(), bounds,
350bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                       BubbleBorder::TOP_LEFT,
351bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                       page_info_bubble, page_info_bubble);
352bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  page_info_bubble->set_info_bubble(info_bubble);
353bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
354bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
355bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
356