first_run_bubble.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "chrome/browser/ui/gtk/first_run_bubble.h" 6 7#include <gtk/gtk.h> 8 9#include "base/i18n/rtl.h" 10#include "base/utf_string_conversions.h" 11#include "chrome/browser/first_run/first_run.h" 12#include "chrome/browser/search_engines/util.h" 13#include "chrome/browser/ui/browser.h" 14#include "chrome/browser/ui/browser_finder.h" 15#include "chrome/browser/ui/chrome_pages.h" 16#include "chrome/browser/ui/gtk/gtk_theme_service.h" 17#include "grit/generated_resources.h" 18#include "ui/base/gtk/gtk_hig_constants.h" 19#include "ui/base/l10n/l10n_util.h" 20 21namespace { 22 23// Markup for the text of the Omnibox search label 24const char kSearchLabelMarkup[] = "<big><b>%s</b></big>"; 25 26} // namespace 27 28// static 29void FirstRunBubble::Show(Browser* browser, 30 GtkWidget* anchor, 31 const gfx::Rect& rect) { 32 first_run::LogFirstRunMetric(first_run::FIRST_RUN_BUBBLE_SHOWN); 33 34 new FirstRunBubble(browser, anchor, rect); 35} 36 37void FirstRunBubble::BubbleClosing(BubbleGtk* bubble, bool closed_by_escape) { 38 // TODO(port): Enable parent window 39} 40 41FirstRunBubble::FirstRunBubble(Browser* browser, 42 GtkWidget* anchor, 43 const gfx::Rect& rect) 44 : browser_(browser), 45 bubble_(NULL) { 46 GtkThemeService* theme_service = GtkThemeService::GetFrom(browser->profile()); 47 GtkWidget* title = theme_service->BuildLabel("", ui::kGdkBlack); 48 char* markup = g_markup_printf_escaped(kSearchLabelMarkup, 49 l10n_util::GetStringFUTF8(IDS_FR_BUBBLE_TITLE, 50 GetDefaultSearchEngineName(browser->profile())).c_str()); 51 gtk_label_set_markup(GTK_LABEL(title), markup); 52 g_free(markup); 53 54 GtkWidget* change = theme_service->BuildChromeLinkButton( 55 l10n_util::GetStringUTF8(IDS_FR_BUBBLE_CHANGE)); 56 g_signal_connect(change, "clicked", G_CALLBACK(&HandleChangeLinkThunk), this); 57 58 GtkWidget* subtext = theme_service->BuildLabel( 59 l10n_util::GetStringUTF8(IDS_FR_BUBBLE_SUBTEXT), ui::kGdkBlack); 60 61 GtkWidget* top_line = gtk_hbox_new(FALSE, ui::kControlSpacing); 62 gtk_box_pack_start(GTK_BOX(top_line), title, FALSE, FALSE, 0); 63 gtk_box_pack_start(GTK_BOX(top_line), change, FALSE, FALSE, 0); 64 65 GtkWidget* content = gtk_vbox_new(FALSE, ui::kControlSpacing); 66 gtk_container_set_border_width(GTK_CONTAINER(content), 67 ui::kContentAreaBorder); 68 g_signal_connect(content, "destroy", G_CALLBACK(&HandleDestroyThunk), this); 69 gtk_box_pack_start(GTK_BOX(content), top_line, FALSE, FALSE, 0); 70 gtk_box_pack_start(GTK_BOX(content), subtext, FALSE, FALSE, 0); 71 72 bubble_ = BubbleGtk::Show(anchor, 73 &rect, 74 content, 75 BubbleGtk::ANCHOR_TOP_LEFT, 76 BubbleGtk::MATCH_SYSTEM_THEME | 77 BubbleGtk::POPUP_WINDOW | 78 BubbleGtk::GRAB_INPUT, 79 theme_service, 80 this); 81 DCHECK(bubble_); 82} 83 84FirstRunBubble::~FirstRunBubble() { 85} 86 87void FirstRunBubble::HandleDestroy(GtkWidget* sender) { 88 delete this; 89} 90 91void FirstRunBubble::HandleChangeLink(GtkWidget* sender) { 92 first_run::LogFirstRunMetric(first_run::FIRST_RUN_BUBBLE_CHANGE_INVOKED); 93 94 // Cache browser_ before closing the bubble, which deletes |this|. 95 Browser* browser = browser_; 96 bubble_->Close(); 97 if (browser) 98 chrome::ShowSearchEngineSettings(browser); 99} 100