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