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