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/strings/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 21 namespace { 22 23 // Markup for the text of the Omnibox search label 24 const char kSearchLabelMarkup[] = "<big><b>%s</b></big>"; 25 26 } // namespace 27 28 // static 29 void 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 37 void FirstRunBubble::BubbleClosing(BubbleGtk* bubble, bool closed_by_escape) { 38 // TODO(port): Enable parent window 39 } 40 41 FirstRunBubble::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(std::string(), ui::kGdkBlack); 48 char* markup = g_markup_printf_escaped( 49 kSearchLabelMarkup, 50 l10n_util::GetStringFUTF8(IDS_FR_BUBBLE_TITLE, 51 GetDefaultSearchEngineName(browser->profile())) 52 .c_str()); 53 gtk_label_set_markup(GTK_LABEL(title), markup); 54 g_free(markup); 55 56 GtkWidget* change = theme_service->BuildChromeLinkButton( 57 l10n_util::GetStringUTF8(IDS_FR_BUBBLE_CHANGE)); 58 g_signal_connect(change, "clicked", G_CALLBACK(&HandleChangeLinkThunk), this); 59 60 GtkWidget* subtext = theme_service->BuildLabel( 61 l10n_util::GetStringUTF8(IDS_FR_BUBBLE_SUBTEXT), ui::kGdkBlack); 62 63 GtkWidget* top_line = gtk_hbox_new(FALSE, ui::kControlSpacing); 64 gtk_box_pack_start(GTK_BOX(top_line), title, FALSE, FALSE, 0); 65 gtk_box_pack_start(GTK_BOX(top_line), change, FALSE, FALSE, 0); 66 67 GtkWidget* content = gtk_vbox_new(FALSE, ui::kControlSpacing); 68 gtk_container_set_border_width(GTK_CONTAINER(content), 69 ui::kContentAreaBorder); 70 g_signal_connect(content, "destroy", G_CALLBACK(&HandleDestroyThunk), this); 71 gtk_box_pack_start(GTK_BOX(content), top_line, FALSE, FALSE, 0); 72 gtk_box_pack_start(GTK_BOX(content), subtext, FALSE, FALSE, 0); 73 74 bubble_ = BubbleGtk::Show(anchor, 75 &rect, 76 content, 77 BubbleGtk::ANCHOR_TOP_LEFT, 78 BubbleGtk::MATCH_SYSTEM_THEME | 79 BubbleGtk::POPUP_WINDOW | 80 BubbleGtk::GRAB_INPUT, 81 theme_service, 82 this); 83 DCHECK(bubble_); 84 } 85 86 FirstRunBubble::~FirstRunBubble() { 87 } 88 89 void FirstRunBubble::HandleDestroy(GtkWidget* sender) { 90 delete this; 91 } 92 93 void FirstRunBubble::HandleChangeLink(GtkWidget* sender) { 94 first_run::LogFirstRunMetric(first_run::FIRST_RUN_BUBBLE_CHANGE_INVOKED); 95 96 // Cache browser_ before closing the bubble, which deletes |this|. 97 Browser* browser = browser_; 98 bubble_->Close(); 99 if (browser) 100 chrome::ShowSearchEngineSettings(browser); 101 } 102