172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 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 <gtk/gtk.h>
6bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
7bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "build/build_config.h"
8bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
9bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/i18n/rtl.h"
10bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/utf_string_conversions.h"
114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/google/google_util.h"
12bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/page_info_model.h"
13bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/page_info_window.h"
14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/browser_list.h"
1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/gtk/browser_toolbar_gtk.h"
1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/gtk/browser_window_gtk.h"
1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/gtk/gtk_chrome_link_button.h"
18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/gtk/gtk_theme_service.h"
1972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/gtk/gtk_util.h"
2072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/gtk/info_bubble_gtk.h"
2172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/gtk/location_bar_view_gtk.h"
224a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/common/url_constants.h"
23dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/certificate_viewer.h"
24dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/common/notification_observer.h"
25dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/common/notification_registrar.h"
26dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/common/notification_service.h"
27bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "googleurl/src/gurl.h"
28bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "grit/generated_resources.h"
29bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "grit/locale_settings.h"
3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util.h"
31bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
32bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass Profile;
33bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
34bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsennamespace {
35bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
36bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass PageInfoBubbleGtk : public PageInfoModel::PageInfoModelObserver,
37bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                          public InfoBubbleGtkDelegate,
38bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                          public NotificationObserver {
39bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen public:
40bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  PageInfoBubbleGtk(gfx::NativeWindow parent,
41bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                    Profile* profile,
42bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                    const GURL& url,
43bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                    const NavigationEntry::SSLStatus& ssl,
44bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                    bool show_history);
45bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual ~PageInfoBubbleGtk();
46bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
47bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // PageInfoModelObserver implementation:
48bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void ModelChanged();
49bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
50bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // NotificationObserver implementation:
51bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void Observe(NotificationType type,
52bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                       const NotificationSource& source,
53bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                       const NotificationDetails& details);
54bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
55bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // InfoBubbleGtkDelegate implementation:
56bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void InfoBubbleClosing(InfoBubbleGtk* info_bubble,
57bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                 bool closed_by_escape);
58bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
59bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen private:
60bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Layouts the different sections retrieved from the model.
61bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void InitContents();
62bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
63bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Returns a widget that contains the UI for the passed |section|.
64bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  GtkWidget* CreateSection(const PageInfoModel::SectionInfo& section);
65bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
66bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Link button callbacks.
67bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  CHROMEGTK_CALLBACK_0(PageInfoBubbleGtk, void, OnViewCertLinkClicked);
68bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  CHROMEGTK_CALLBACK_0(PageInfoBubbleGtk, void, OnHelpLinkClicked);
69bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
70bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // The model containing the different sections to display.
71bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  PageInfoModel model_;
72bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
73bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // The url for this dialog. Should be unique among active dialogs.
74bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  GURL url_;
75bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
76bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // The id of the certificate for this page.
77bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  int cert_id_;
78bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
79bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Parent window.
80bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  GtkWindow* parent_;
81bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
82bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // The virtual box containing the sections.
83bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  GtkWidget* contents_;
84bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
85bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // The widget relative to which we are positioned.
86bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  GtkWidget* anchor_;
87bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
88bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Provides colors and stuff.
89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  GtkThemeService* theme_service_;
90bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
91bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // The various elements in the interface we keep track of for theme changes.
92bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::vector<GtkWidget*> labels_;
93bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::vector<GtkWidget*> links_;
94bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
95bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  InfoBubbleGtk* bubble_;
96bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
97bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  NotificationRegistrar registrar_;
98bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
99bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(PageInfoBubbleGtk);
100bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen};
101bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
102bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenPageInfoBubbleGtk::PageInfoBubbleGtk(gfx::NativeWindow parent,
103bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                     Profile* profile,
104bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                     const GURL& url,
105bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                     const NavigationEntry::SSLStatus& ssl,
106bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                     bool show_history)
107bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    : ALLOW_THIS_IN_INITIALIZER_LIST(model_(profile, url, ssl,
108bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                            show_history, this)),
109bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      url_(url),
110bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      cert_id_(ssl.cert_id()),
111bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      parent_(parent),
112bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      contents_(NULL),
113ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      theme_service_(GtkThemeService::GetFrom(profile)) {
114bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  BrowserWindowGtk* browser_window =
115bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      BrowserWindowGtk::GetBrowserWindowForNativeWindow(parent);
116bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
117bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  anchor_ = browser_window->
118bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      GetToolbar()->GetLocationBarView()->location_icon_widget();
119bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
120bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  registrar_.Add(this, NotificationType::BROWSER_THEME_CHANGED,
121bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                 NotificationService::AllSources());
122bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
123bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  InitContents();
124bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
125bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  InfoBubbleGtk::ArrowLocationGtk arrow_location = base::i18n::IsRTL() ?
126bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      InfoBubbleGtk::ARROW_LOCATION_TOP_RIGHT :
127bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      InfoBubbleGtk::ARROW_LOCATION_TOP_LEFT;
128bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  bubble_ = InfoBubbleGtk::Show(anchor_,
129bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                NULL,  // |rect|
130bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                contents_,
131bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                arrow_location,
132bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                true,  // |match_system_theme|
133bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                true,  // |grab_input|
134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                theme_service_,
135bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                this);  // |delegate|
136bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!bubble_) {
137bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    NOTREACHED();
138bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
139bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
140bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
141bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
142bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenPageInfoBubbleGtk::~PageInfoBubbleGtk() {
143bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
144bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
145bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid PageInfoBubbleGtk::ModelChanged() {
146bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  InitContents();
147bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
148bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
149bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid PageInfoBubbleGtk::Observe(NotificationType type,
150bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                const NotificationSource& source,
151bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                const NotificationDetails& details) {
152bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DCHECK(type == NotificationType::BROWSER_THEME_CHANGED);
153bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
154bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  for (std::vector<GtkWidget*>::iterator it = links_.begin();
155bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen       it != links_.end(); ++it) {
156bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    gtk_chrome_link_button_set_use_gtk_theme(
157bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        GTK_CHROME_LINK_BUTTON(*it),
158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        theme_service_->UseGtkTheme());
159bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
160bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (theme_service_->UseGtkTheme()) {
162bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    for (std::vector<GtkWidget*>::iterator it = labels_.begin();
163bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen         it != labels_.end(); ++it) {
164bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      gtk_widget_modify_fg(*it, GTK_STATE_NORMAL, NULL);
165bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
166bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  } else {
167bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    for (std::vector<GtkWidget*>::iterator it = labels_.begin();
168bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen         it != labels_.end(); ++it) {
169513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      gtk_widget_modify_fg(*it, GTK_STATE_NORMAL, &gtk_util::kGdkBlack);
170bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
171bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
172bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
173bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
174bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid PageInfoBubbleGtk::InfoBubbleClosing(InfoBubbleGtk* info_bubble,
175bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                          bool closed_by_escape) {
176bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  delete this;
177bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
178bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
179bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid PageInfoBubbleGtk::InitContents() {
180bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!contents_) {
181bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    contents_ = gtk_vbox_new(FALSE, gtk_util::kContentAreaSpacing);
182bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    gtk_container_set_border_width(GTK_CONTAINER(contents_),
183bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                   gtk_util::kContentAreaBorder);
184bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  } else {
185bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    labels_.clear();
186bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    links_.clear();
187bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    gtk_util::RemoveAllChildren(contents_);
188bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
189bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
190bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  for (int i = 0; i < model_.GetSectionCount(); i++) {
191bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    gtk_box_pack_start(GTK_BOX(contents_),
192bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                       CreateSection(model_.GetSectionInfo(i)),
193bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                       FALSE, FALSE, 0);
194bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    gtk_box_pack_start(GTK_BOX(contents_),
195bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                       gtk_hseparator_new(),
196bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                       FALSE, FALSE, 0);
197bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
198bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
199bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  GtkWidget* help_link = gtk_chrome_link_button_new(
200bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      l10n_util::GetStringUTF8(IDS_PAGE_INFO_HELP_CENTER_LINK).c_str());
201bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  links_.push_back(help_link);
202bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  GtkWidget* help_link_hbox = gtk_hbox_new(FALSE, 0);
203bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Stick it in an hbox so it doesn't expand to the whole width.
204731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  gtk_box_pack_start(GTK_BOX(help_link_hbox), help_link, FALSE, FALSE, 0);
205bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  gtk_box_pack_start(GTK_BOX(contents_), help_link_hbox, FALSE, FALSE, 0);
206bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  g_signal_connect(help_link, "clicked",
207bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                   G_CALLBACK(OnHelpLinkClickedThunk), this);
208bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
209ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  theme_service_->InitThemesFor(this);
210bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  gtk_widget_show_all(contents_);
211bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
212bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
213bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenGtkWidget* PageInfoBubbleGtk::CreateSection(
214bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    const PageInfoModel::SectionInfo& section) {
215731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  GtkWidget* section_box = gtk_hbox_new(FALSE, gtk_util::kControlSpacing);
216731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
217dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  GdkPixbuf* pixbuf = *model_.GetIconImage(section.icon_id);
218731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (pixbuf) {
219bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    GtkWidget* image = gtk_image_new_from_pixbuf(pixbuf);
220731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    gtk_box_pack_start(GTK_BOX(section_box), image, FALSE, FALSE, 0);
221bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    gtk_misc_set_alignment(GTK_MISC(image), 0, 0);
222bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
223bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
224bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  GtkWidget* vbox = gtk_vbox_new(FALSE, gtk_util::kControlSpacing);
225bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  gtk_box_pack_start(GTK_BOX(section_box), vbox, TRUE, TRUE, 0);
226bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
227bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!section.headline.empty()) {
228bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    GtkWidget* label = gtk_label_new(UTF16ToUTF8(section.headline).c_str());
229ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    gtk_label_set_selectable(GTK_LABEL(label), TRUE);
230bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    labels_.push_back(label);
231bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    PangoAttrList* attributes = pango_attr_list_new();
232bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    pango_attr_list_insert(attributes,
233bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                           pango_attr_weight_new(PANGO_WEIGHT_BOLD));
234bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    gtk_label_set_attributes(GTK_LABEL(label), attributes);
235bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    pango_attr_list_unref(attributes);
23672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    gtk_util::SetLabelWidth(label, 400);
237bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // Allow linebreaking in the middle of words if necessary, so that extremely
238bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // long hostnames (longer than one line) will still be completely shown.
239bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    gtk_label_set_line_wrap_mode(GTK_LABEL(label), PANGO_WRAP_WORD_CHAR);
240bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
241bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
242bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  GtkWidget* label = gtk_label_new(UTF16ToUTF8(section.description).c_str());
243ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  gtk_label_set_selectable(GTK_LABEL(label), TRUE);
244bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  labels_.push_back(label);
24572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  gtk_util::SetLabelWidth(label, 400);
246bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Allow linebreaking in the middle of words if necessary, so that extremely
247bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // long hostnames (longer than one line) will still be completely shown.
248bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  gtk_label_set_line_wrap_mode(GTK_LABEL(label), PANGO_WRAP_WORD_CHAR);
249bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
250bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
251bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (section.type == PageInfoModel::SECTION_INFO_IDENTITY && cert_id_ > 0) {
252bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    GtkWidget* view_cert_link = gtk_chrome_link_button_new(
253bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        l10n_util::GetStringUTF8(IDS_PAGEINFO_CERT_INFO_BUTTON).c_str());
254bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    links_.push_back(view_cert_link);
255bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    GtkWidget* cert_link_hbox = gtk_hbox_new(FALSE, 0);
256bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // Stick it in an hbox so it doesn't expand to the whole width.
257bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    gtk_box_pack_start(GTK_BOX(cert_link_hbox), view_cert_link,
258bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                       FALSE, FALSE, 0);
259bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    gtk_box_pack_start(GTK_BOX(vbox), cert_link_hbox, FALSE, FALSE, 0);
260bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    g_signal_connect(view_cert_link, "clicked",
261bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                     G_CALLBACK(OnViewCertLinkClickedThunk), this);
262bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
263bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
264bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return section_box;
265bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
266bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
267bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid PageInfoBubbleGtk::OnViewCertLinkClicked(GtkWidget* widget) {
268bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ShowCertificateViewerByID(GTK_WINDOW(parent_), cert_id_);
269bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  bubble_->Close();
270bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
271bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
272bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid PageInfoBubbleGtk::OnHelpLinkClicked(GtkWidget* widget) {
2734a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  GURL url = google_util::AppendGoogleLocaleParam(
2744a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      GURL(chrome::kPageInfoHelpCenterURL));
275bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  Browser* browser = BrowserList::GetLastActive();
276bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  browser->OpenURL(url, GURL(), NEW_FOREGROUND_TAB, PageTransition::LINK);
277bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  bubble_->Close();
278bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
279bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
280bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}  // namespace
281bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
282bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsennamespace browser {
283bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
284bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid ShowPageInfoBubble(gfx::NativeWindow parent,
285bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        Profile* profile,
286bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        const GURL& url,
287bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        const NavigationEntry::SSLStatus& ssl,
288bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        bool show_history) {
289bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  new PageInfoBubbleGtk(parent, profile, url, ssl, show_history);
290bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
291bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
292bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}  // namespace browser
293