15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/gtk/first_run_bubble.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <gtk/gtk.h> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/i18n/rtl.h" 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/first_run/first_run.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/search_engines/util.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_finder.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/chrome_pages.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/gtk/gtk_theme_service.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/gtk/gtk_hig_constants.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Markup for the text of the Omnibox search label 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kSearchLabelMarkup[] = "<big><b>%s</b></big>"; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FirstRunBubble::Show(Browser* browser, 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkWidget* anchor, 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& rect) { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_run::LogFirstRunMetric(first_run::FIRST_RUN_BUBBLE_SHOWN); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new FirstRunBubble(browser, anchor, rect); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FirstRunBubble::BubbleClosing(BubbleGtk* bubble, bool closed_by_escape) { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(port): Enable parent window 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FirstRunBubble::FirstRunBubble(Browser* browser, 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkWidget* anchor, 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& rect) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : browser_(browser), 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bubble_(NULL) { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkThemeService* theme_service = GtkThemeService::GetFrom(browser->profile()); 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GtkWidget* title = theme_service->BuildLabel(std::string(), ui::kGdkBlack); 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) char* markup = g_markup_printf_escaped( 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kSearchLabelMarkup, 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l10n_util::GetStringFUTF8(IDS_FR_BUBBLE_TITLE, 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetDefaultSearchEngineName(browser->profile())) 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .c_str()); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_label_set_markup(GTK_LABEL(title), markup); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_free(markup); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkWidget* change = theme_service->BuildChromeLinkButton( 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l10n_util::GetStringUTF8(IDS_FR_BUBBLE_CHANGE)); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_signal_connect(change, "clicked", G_CALLBACK(&HandleChangeLinkThunk), this); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkWidget* subtext = theme_service->BuildLabel( 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l10n_util::GetStringUTF8(IDS_FR_BUBBLE_SUBTEXT), ui::kGdkBlack); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkWidget* top_line = gtk_hbox_new(FALSE, ui::kControlSpacing); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_box_pack_start(GTK_BOX(top_line), title, FALSE, FALSE, 0); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_box_pack_start(GTK_BOX(top_line), change, FALSE, FALSE, 0); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkWidget* content = gtk_vbox_new(FALSE, ui::kControlSpacing); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_container_set_border_width(GTK_CONTAINER(content), 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::kContentAreaBorder); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_signal_connect(content, "destroy", G_CALLBACK(&HandleDestroyThunk), this); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_box_pack_start(GTK_BOX(content), top_line, FALSE, FALSE, 0); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_box_pack_start(GTK_BOX(content), subtext, FALSE, FALSE, 0); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bubble_ = BubbleGtk::Show(anchor, 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &rect, 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content, 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BubbleGtk::ANCHOR_TOP_LEFT, 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BubbleGtk::MATCH_SYSTEM_THEME | 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BubbleGtk::POPUP_WINDOW | 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BubbleGtk::GRAB_INPUT, 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) theme_service, 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(bubble_); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FirstRunBubble::~FirstRunBubble() { 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FirstRunBubble::HandleDestroy(GtkWidget* sender) { 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete this; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FirstRunBubble::HandleChangeLink(GtkWidget* sender) { 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_run::LogFirstRunMetric(first_run::FIRST_RUN_BUBBLE_CHANGE_INVOKED); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Cache browser_ before closing the bubble, which deletes |this|. 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* browser = browser_; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bubble_->Close(); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (browser) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::ShowSearchEngineSettings(browser); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 102