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, >k_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