| Index: chrome/browser/gtk/page_info_bubble_gtk.cc
|
| ===================================================================
|
| --- chrome/browser/gtk/page_info_bubble_gtk.cc (revision 71352)
|
| +++ chrome/browser/gtk/page_info_bubble_gtk.cc (working copy)
|
| @@ -1,294 +0,0 @@
|
| -// Copyright (c) 2010 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include <gtk/gtk.h>
|
| -
|
| -#include "build/build_config.h"
|
| -
|
| -#include "app/l10n_util.h"
|
| -#include "base/i18n/rtl.h"
|
| -#include "base/utf_string_conversions.h"
|
| -#include "chrome/browser/browser_list.h"
|
| -#include "chrome/browser/certificate_viewer.h"
|
| -#include "chrome/browser/google/google_util.h"
|
| -#include "chrome/browser/gtk/browser_toolbar_gtk.h"
|
| -#include "chrome/browser/gtk/browser_window_gtk.h"
|
| -#include "chrome/browser/gtk/gtk_chrome_link_button.h"
|
| -#include "chrome/browser/gtk/gtk_theme_provider.h"
|
| -#include "chrome/browser/gtk/gtk_util.h"
|
| -#include "chrome/browser/gtk/info_bubble_gtk.h"
|
| -#include "chrome/browser/gtk/location_bar_view_gtk.h"
|
| -#include "chrome/browser/page_info_model.h"
|
| -#include "chrome/browser/page_info_window.h"
|
| -#include "chrome/common/notification_observer.h"
|
| -#include "chrome/common/notification_registrar.h"
|
| -#include "chrome/common/notification_service.h"
|
| -#include "chrome/common/url_constants.h"
|
| -#include "googleurl/src/gurl.h"
|
| -#include "grit/generated_resources.h"
|
| -#include "grit/locale_settings.h"
|
| -
|
| -class Profile;
|
| -
|
| -namespace {
|
| -
|
| -class PageInfoBubbleGtk : public PageInfoModel::PageInfoModelObserver,
|
| - public InfoBubbleGtkDelegate,
|
| - public NotificationObserver {
|
| - public:
|
| - PageInfoBubbleGtk(gfx::NativeWindow parent,
|
| - Profile* profile,
|
| - const GURL& url,
|
| - const NavigationEntry::SSLStatus& ssl,
|
| - bool show_history);
|
| - virtual ~PageInfoBubbleGtk();
|
| -
|
| - // PageInfoModelObserver implementation:
|
| - virtual void ModelChanged();
|
| -
|
| - // NotificationObserver implementation:
|
| - virtual void Observe(NotificationType type,
|
| - const NotificationSource& source,
|
| - const NotificationDetails& details);
|
| -
|
| - // InfoBubbleGtkDelegate implementation:
|
| - virtual void InfoBubbleClosing(InfoBubbleGtk* info_bubble,
|
| - bool closed_by_escape);
|
| -
|
| - private:
|
| - // Layouts the different sections retrieved from the model.
|
| - void InitContents();
|
| -
|
| - // Returns a widget that contains the UI for the passed |section|.
|
| - GtkWidget* CreateSection(const PageInfoModel::SectionInfo& section);
|
| -
|
| - // Link button callbacks.
|
| - CHROMEGTK_CALLBACK_0(PageInfoBubbleGtk, void, OnViewCertLinkClicked);
|
| - CHROMEGTK_CALLBACK_0(PageInfoBubbleGtk, void, OnHelpLinkClicked);
|
| -
|
| - // The model containing the different sections to display.
|
| - PageInfoModel model_;
|
| -
|
| - // The url for this dialog. Should be unique among active dialogs.
|
| - GURL url_;
|
| -
|
| - // The id of the certificate for this page.
|
| - int cert_id_;
|
| -
|
| - // Parent window.
|
| - GtkWindow* parent_;
|
| -
|
| - // The virtual box containing the sections.
|
| - GtkWidget* contents_;
|
| -
|
| - // The widget relative to which we are positioned.
|
| - GtkWidget* anchor_;
|
| -
|
| - // Provides colors and stuff.
|
| - GtkThemeProvider* theme_provider_;
|
| -
|
| - // The various elements in the interface we keep track of for theme changes.
|
| - std::vector<GtkWidget*> labels_;
|
| - std::vector<GtkWidget*> links_;
|
| -
|
| - InfoBubbleGtk* bubble_;
|
| -
|
| - NotificationRegistrar registrar_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(PageInfoBubbleGtk);
|
| -};
|
| -
|
| -PageInfoBubbleGtk::PageInfoBubbleGtk(gfx::NativeWindow parent,
|
| - Profile* profile,
|
| - const GURL& url,
|
| - const NavigationEntry::SSLStatus& ssl,
|
| - bool show_history)
|
| - : ALLOW_THIS_IN_INITIALIZER_LIST(model_(profile, url, ssl,
|
| - show_history, this)),
|
| - url_(url),
|
| - cert_id_(ssl.cert_id()),
|
| - parent_(parent),
|
| - contents_(NULL),
|
| - theme_provider_(GtkThemeProvider::GetFrom(profile)) {
|
| - BrowserWindowGtk* browser_window =
|
| - BrowserWindowGtk::GetBrowserWindowForNativeWindow(parent);
|
| -
|
| - anchor_ = browser_window->
|
| - GetToolbar()->GetLocationBarView()->location_icon_widget();
|
| -
|
| - registrar_.Add(this, NotificationType::BROWSER_THEME_CHANGED,
|
| - NotificationService::AllSources());
|
| -
|
| - InitContents();
|
| -
|
| - InfoBubbleGtk::ArrowLocationGtk arrow_location = base::i18n::IsRTL() ?
|
| - InfoBubbleGtk::ARROW_LOCATION_TOP_RIGHT :
|
| - InfoBubbleGtk::ARROW_LOCATION_TOP_LEFT;
|
| - bubble_ = InfoBubbleGtk::Show(anchor_,
|
| - NULL, // |rect|
|
| - contents_,
|
| - arrow_location,
|
| - true, // |match_system_theme|
|
| - true, // |grab_input|
|
| - theme_provider_,
|
| - this); // |delegate|
|
| - if (!bubble_) {
|
| - NOTREACHED();
|
| - return;
|
| - }
|
| -}
|
| -
|
| -PageInfoBubbleGtk::~PageInfoBubbleGtk() {
|
| -}
|
| -
|
| -void PageInfoBubbleGtk::ModelChanged() {
|
| - InitContents();
|
| -}
|
| -
|
| -void PageInfoBubbleGtk::Observe(NotificationType type,
|
| - const NotificationSource& source,
|
| - const NotificationDetails& details) {
|
| - DCHECK(type == NotificationType::BROWSER_THEME_CHANGED);
|
| -
|
| - for (std::vector<GtkWidget*>::iterator it = links_.begin();
|
| - it != links_.end(); ++it) {
|
| - gtk_chrome_link_button_set_use_gtk_theme(
|
| - GTK_CHROME_LINK_BUTTON(*it),
|
| - theme_provider_->UseGtkTheme());
|
| - }
|
| -
|
| - if (theme_provider_->UseGtkTheme()) {
|
| - for (std::vector<GtkWidget*>::iterator it = labels_.begin();
|
| - it != labels_.end(); ++it) {
|
| - gtk_widget_modify_fg(*it, GTK_STATE_NORMAL, NULL);
|
| - }
|
| - } else {
|
| - for (std::vector<GtkWidget*>::iterator it = labels_.begin();
|
| - it != labels_.end(); ++it) {
|
| - gtk_widget_modify_fg(*it, GTK_STATE_NORMAL, >k_util::kGdkBlack);
|
| - }
|
| - }
|
| -}
|
| -
|
| -void PageInfoBubbleGtk::InfoBubbleClosing(InfoBubbleGtk* info_bubble,
|
| - bool closed_by_escape) {
|
| - delete this;
|
| -}
|
| -
|
| -void PageInfoBubbleGtk::InitContents() {
|
| - if (!contents_) {
|
| - contents_ = gtk_vbox_new(FALSE, gtk_util::kContentAreaSpacing);
|
| - gtk_container_set_border_width(GTK_CONTAINER(contents_),
|
| - gtk_util::kContentAreaBorder);
|
| - } else {
|
| - labels_.clear();
|
| - links_.clear();
|
| - gtk_util::RemoveAllChildren(contents_);
|
| - }
|
| -
|
| - for (int i = 0; i < model_.GetSectionCount(); i++) {
|
| - gtk_box_pack_start(GTK_BOX(contents_),
|
| - CreateSection(model_.GetSectionInfo(i)),
|
| - FALSE, FALSE, 0);
|
| - gtk_box_pack_start(GTK_BOX(contents_),
|
| - gtk_hseparator_new(),
|
| - FALSE, FALSE, 0);
|
| - }
|
| -
|
| - GtkWidget* help_link = gtk_chrome_link_button_new(
|
| - l10n_util::GetStringUTF8(IDS_PAGE_INFO_HELP_CENTER_LINK).c_str());
|
| - links_.push_back(help_link);
|
| - GtkWidget* help_link_hbox = gtk_hbox_new(FALSE, 0);
|
| - // Stick it in an hbox so it doesn't expand to the whole width.
|
| - gtk_box_pack_start(GTK_BOX(help_link_hbox), help_link, FALSE, FALSE, 0);
|
| - gtk_box_pack_start(GTK_BOX(contents_), help_link_hbox, FALSE, FALSE, 0);
|
| - g_signal_connect(help_link, "clicked",
|
| - G_CALLBACK(OnHelpLinkClickedThunk), this);
|
| -
|
| - theme_provider_->InitThemesFor(this);
|
| - gtk_widget_show_all(contents_);
|
| -}
|
| -
|
| -GtkWidget* PageInfoBubbleGtk::CreateSection(
|
| - const PageInfoModel::SectionInfo& section) {
|
| - GtkWidget* section_box = gtk_hbox_new(FALSE, gtk_util::kControlSpacing);
|
| -
|
| - GdkPixbuf* pixbuf = model_.GetIconImage(section.icon_id);
|
| - if (pixbuf) {
|
| - GtkWidget* image = gtk_image_new_from_pixbuf(pixbuf);
|
| - gtk_box_pack_start(GTK_BOX(section_box), image, FALSE, FALSE, 0);
|
| - gtk_misc_set_alignment(GTK_MISC(image), 0, 0);
|
| - }
|
| -
|
| - GtkWidget* vbox = gtk_vbox_new(FALSE, gtk_util::kControlSpacing);
|
| - gtk_box_pack_start(GTK_BOX(section_box), vbox, TRUE, TRUE, 0);
|
| -
|
| - if (!section.headline.empty()) {
|
| - GtkWidget* label = gtk_label_new(UTF16ToUTF8(section.headline).c_str());
|
| - labels_.push_back(label);
|
| - PangoAttrList* attributes = pango_attr_list_new();
|
| - pango_attr_list_insert(attributes,
|
| - pango_attr_weight_new(PANGO_WEIGHT_BOLD));
|
| - gtk_label_set_attributes(GTK_LABEL(label), attributes);
|
| - pango_attr_list_unref(attributes);
|
| - gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
|
| - // Allow linebreaking in the middle of words if necessary, so that extremely
|
| - // long hostnames (longer than one line) will still be completely shown.
|
| - gtk_label_set_line_wrap_mode(GTK_LABEL(label), PANGO_WRAP_WORD_CHAR);
|
| - gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
|
| - gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
|
| - gtk_widget_set_size_request(label, 400, -1);
|
| - }
|
| - GtkWidget* label = gtk_label_new(UTF16ToUTF8(section.description).c_str());
|
| - labels_.push_back(label);
|
| - gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
|
| - gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
|
| - // Allow linebreaking in the middle of words if necessary, so that extremely
|
| - // long hostnames (longer than one line) will still be completely shown.
|
| - gtk_label_set_line_wrap_mode(GTK_LABEL(label), PANGO_WRAP_WORD_CHAR);
|
| - gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
|
| - gtk_widget_set_size_request(label, 400, -1);
|
| -
|
| - if (section.type == PageInfoModel::SECTION_INFO_IDENTITY && cert_id_ > 0) {
|
| - GtkWidget* view_cert_link = gtk_chrome_link_button_new(
|
| - l10n_util::GetStringUTF8(IDS_PAGEINFO_CERT_INFO_BUTTON).c_str());
|
| - links_.push_back(view_cert_link);
|
| - GtkWidget* cert_link_hbox = gtk_hbox_new(FALSE, 0);
|
| - // Stick it in an hbox so it doesn't expand to the whole width.
|
| - gtk_box_pack_start(GTK_BOX(cert_link_hbox), view_cert_link,
|
| - FALSE, FALSE, 0);
|
| - gtk_box_pack_start(GTK_BOX(vbox), cert_link_hbox, FALSE, FALSE, 0);
|
| - g_signal_connect(view_cert_link, "clicked",
|
| - G_CALLBACK(OnViewCertLinkClickedThunk), this);
|
| - }
|
| -
|
| - return section_box;
|
| -}
|
| -
|
| -void PageInfoBubbleGtk::OnViewCertLinkClicked(GtkWidget* widget) {
|
| - ShowCertificateViewerByID(GTK_WINDOW(parent_), cert_id_);
|
| - bubble_->Close();
|
| -}
|
| -
|
| -void PageInfoBubbleGtk::OnHelpLinkClicked(GtkWidget* widget) {
|
| - GURL url = google_util::AppendGoogleLocaleParam(
|
| - GURL(chrome::kPageInfoHelpCenterURL));
|
| - Browser* browser = BrowserList::GetLastActive();
|
| - browser->OpenURL(url, GURL(), NEW_FOREGROUND_TAB, PageTransition::LINK);
|
| - bubble_->Close();
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -namespace browser {
|
| -
|
| -void ShowPageInfoBubble(gfx::NativeWindow parent,
|
| - Profile* profile,
|
| - const GURL& url,
|
| - const NavigationEntry::SSLStatus& ssl,
|
| - bool show_history) {
|
| - new PageInfoBubbleGtk(parent, profile, url, ssl, show_history);
|
| -}
|
| -
|
| -} // namespace browser
|
|
|