// Copyright (c) 2012 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 "chrome/browser/ui/gtk/first_run_bubble.h" #include #include "base/i18n/rtl.h" #include "base/strings/utf_string_conversions.h" #include "chrome/browser/first_run/first_run.h" #include "chrome/browser/search_engines/util.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_finder.h" #include "chrome/browser/ui/chrome_pages.h" #include "chrome/browser/ui/gtk/gtk_theme_service.h" #include "grit/generated_resources.h" #include "ui/base/gtk/gtk_hig_constants.h" #include "ui/base/l10n/l10n_util.h" namespace { // Markup for the text of the Omnibox search label const char kSearchLabelMarkup[] = "%s"; } // namespace // static void FirstRunBubble::Show(Browser* browser, GtkWidget* anchor, const gfx::Rect& rect) { first_run::LogFirstRunMetric(first_run::FIRST_RUN_BUBBLE_SHOWN); new FirstRunBubble(browser, anchor, rect); } void FirstRunBubble::BubbleClosing(BubbleGtk* bubble, bool closed_by_escape) { // TODO(port): Enable parent window } FirstRunBubble::FirstRunBubble(Browser* browser, GtkWidget* anchor, const gfx::Rect& rect) : browser_(browser), bubble_(NULL) { GtkThemeService* theme_service = GtkThemeService::GetFrom(browser->profile()); GtkWidget* title = theme_service->BuildLabel(std::string(), ui::kGdkBlack); char* markup = g_markup_printf_escaped( kSearchLabelMarkup, l10n_util::GetStringFUTF8(IDS_FR_BUBBLE_TITLE, GetDefaultSearchEngineName(browser->profile())) .c_str()); gtk_label_set_markup(GTK_LABEL(title), markup); g_free(markup); GtkWidget* change = theme_service->BuildChromeLinkButton( l10n_util::GetStringUTF8(IDS_FR_BUBBLE_CHANGE)); g_signal_connect(change, "clicked", G_CALLBACK(&HandleChangeLinkThunk), this); GtkWidget* subtext = theme_service->BuildLabel( l10n_util::GetStringUTF8(IDS_FR_BUBBLE_SUBTEXT), ui::kGdkBlack); GtkWidget* top_line = gtk_hbox_new(FALSE, ui::kControlSpacing); gtk_box_pack_start(GTK_BOX(top_line), title, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(top_line), change, FALSE, FALSE, 0); GtkWidget* content = gtk_vbox_new(FALSE, ui::kControlSpacing); gtk_container_set_border_width(GTK_CONTAINER(content), ui::kContentAreaBorder); g_signal_connect(content, "destroy", G_CALLBACK(&HandleDestroyThunk), this); gtk_box_pack_start(GTK_BOX(content), top_line, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(content), subtext, FALSE, FALSE, 0); bubble_ = BubbleGtk::Show(anchor, &rect, content, BubbleGtk::ANCHOR_TOP_LEFT, BubbleGtk::MATCH_SYSTEM_THEME | BubbleGtk::POPUP_WINDOW | BubbleGtk::GRAB_INPUT, theme_service, this); DCHECK(bubble_); } FirstRunBubble::~FirstRunBubble() { } void FirstRunBubble::HandleDestroy(GtkWidget* sender) { delete this; } void FirstRunBubble::HandleChangeLink(GtkWidget* sender) { first_run::LogFirstRunMetric(first_run::FIRST_RUN_BUBBLE_CHANGE_INVOKED); // Cache browser_ before closing the bubble, which deletes |this|. Browser* browser = browser_; bubble_->Close(); if (browser) chrome::ShowSearchEngineSettings(browser); }