- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / gtk / first_run_bubble.cc
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 }