Index: chrome/browser/ui/gtk/first_run_bubble.cc |
diff --git a/chrome/browser/ui/gtk/first_run_bubble.cc b/chrome/browser/ui/gtk/first_run_bubble.cc |
index aacc0fe65dc2c3564c6159b1df63cc1159f0e805..021b6c1b13cb346478bbe45298806f9c0064e302 100644 |
--- a/chrome/browser/ui/gtk/first_run_bubble.cc |
+++ b/chrome/browser/ui/gtk/first_run_bubble.cc |
@@ -1,4 +1,4 @@ |
-// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
+// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
@@ -6,17 +6,12 @@ |
#include <gtk/gtk.h> |
-#include "base/command_line.h" |
#include "base/i18n/rtl.h" |
#include "base/utf_string_conversions.h" |
#include "chrome/browser/search_engines/util.h" |
-#include "chrome/browser/ui/browser.h" |
#include "chrome/browser/ui/browser_list.h" |
#include "chrome/browser/ui/gtk/gtk_theme_service.h" |
-#include "chrome/browser/ui/gtk/gtk_util.h" |
-#include "grit/chromium_strings.h" |
#include "grit/generated_resources.h" |
-#include "grit/locale_settings.h" |
#include "ui/base/gtk/gtk_hig_constants.h" |
#include "ui/base/l10n/l10n_util.h" |
@@ -24,9 +19,6 @@ namespace { |
// Markup for the text of the Omnibox search label |
const char kSearchLabelMarkup[] = "<big><b>%s</b></big>"; |
-// Padding for the buttons on first run bubble. |
-const int kButtonPadding = 4; |
- |
// Padding between content and edge of bubble. |
const int kContentBorder = 7; |
@@ -38,167 +30,62 @@ const int kInterLineSpacing = 5; |
// static |
void FirstRunBubble::Show(Profile* profile, |
GtkWidget* anchor, |
- const gfx::Rect& rect, |
- FirstRun::BubbleType bubble_type) { |
- new FirstRunBubble(profile, anchor, rect, bubble_type); |
+ const gfx::Rect& rect) { |
+ new FirstRunBubble(profile, anchor, rect); |
} |
-void FirstRunBubble::BubbleClosing(BubbleGtk* bubble, |
- bool closed_by_escape) { |
+void FirstRunBubble::BubbleClosing(BubbleGtk* bubble, bool closed_by_escape) { |
// TODO(port): Enable parent window |
} |
FirstRunBubble::FirstRunBubble(Profile* profile, |
GtkWidget* anchor, |
- const gfx::Rect& rect, |
- FirstRun::BubbleType bubble_type) |
+ const gfx::Rect& rect) |
: profile_(profile), |
- theme_service_(GtkThemeService::GetFrom(profile_)), |
- anchor_(anchor), |
- content_(NULL), |
bubble_(NULL) { |
- content_ = gtk_vbox_new(FALSE, kInterLineSpacing); |
- gtk_container_set_border_width(GTK_CONTAINER(content_), kContentBorder); |
- g_signal_connect(content_, "destroy", |
- G_CALLBACK(&HandleDestroyThunk), this); |
- |
- int width_resource = 0; |
- std::vector<GtkWidget*> labels; |
- if (bubble_type == FirstRun::LARGE_BUBBLE) { |
- width_resource = IDS_FIRSTRUNBUBBLE_DIALOG_WIDTH_CHARS; |
- InitializeContentForLarge(&labels); |
- } else if (bubble_type == FirstRun::OEM_BUBBLE) { |
- width_resource = IDS_FIRSTRUNOEMBUBBLE_DIALOG_WIDTH_CHARS; |
- InitializeContentForOEM(&labels); |
- } else if (bubble_type == FirstRun::MINIMAL_BUBBLE) { |
- width_resource = IDS_FIRSTRUN_MINIMAL_BUBBLE_DIALOG_WIDTH_CHARS; |
- InitializeContentForMinimal(&labels); |
- } else { |
- NOTREACHED(); |
- } |
- |
- InitializeLabels(width_resource, &labels); |
- |
- BubbleGtk::ArrowLocationGtk arrow_location = |
- !base::i18n::IsRTL() ? |
- BubbleGtk::ARROW_LOCATION_TOP_LEFT : |
- BubbleGtk::ARROW_LOCATION_TOP_RIGHT; |
- bubble_ = BubbleGtk::Show(anchor_, |
- &rect, |
- content_, |
- arrow_location, |
- true, // match_system_theme |
- true, // grab_input |
- theme_service_, |
- this); // delegate |
- if (!bubble_) { |
- NOTREACHED(); |
- return; |
- } |
-} |
- |
-FirstRunBubble::~FirstRunBubble() { |
-} |
- |
-void FirstRunBubble::InitializeContentForLarge( |
- std::vector<GtkWidget*>* labels) { |
- GtkWidget* label1 = theme_service_->BuildLabel("", ui::kGdkBlack); |
- labels->push_back(label1); |
+ GtkThemeService* theme_service = GtkThemeService::GetFrom(profile_); |
+ GtkWidget* title = theme_service->BuildLabel("", ui::kGdkBlack); |
char* markup = g_markup_printf_escaped(kSearchLabelMarkup, |
- l10n_util::GetStringUTF8(IDS_FR_BUBBLE_TITLE).c_str()); |
- gtk_label_set_markup(GTK_LABEL(label1), markup); |
- g_free(markup); |
- |
- GtkWidget* label2 = theme_service_->BuildLabel( |
- l10n_util::GetStringUTF8(IDS_FR_BUBBLE_SUBTEXT), ui::kGdkBlack); |
- labels->push_back(label2); |
- |
- string16 search_engine = GetDefaultSearchEngineName(profile_); |
- GtkWidget* label3 = theme_service_->BuildLabel( |
- l10n_util::GetStringFUTF8(IDS_FR_BUBBLE_QUESTION, search_engine), |
- ui::kGdkBlack); |
- labels->push_back(label3); |
- |
- GtkWidget* keep_button = gtk_button_new_with_label( |
- l10n_util::GetStringFUTF8(IDS_FR_BUBBLE_OK, search_engine).c_str()); |
- GtkWidget* change_button = gtk_button_new_with_label( |
- l10n_util::GetStringUTF8(IDS_FR_BUBBLE_CHANGE).c_str()); |
- |
- gtk_box_pack_start(GTK_BOX(content_), label1, FALSE, FALSE, 0); |
- gtk_box_pack_start(GTK_BOX(content_), label2, FALSE, FALSE, 0); |
- // Leave an empty line. |
- gtk_box_pack_start(GTK_BOX(content_), gtk_label_new(NULL), FALSE, FALSE, 0); |
- gtk_box_pack_start(GTK_BOX(content_), label3, FALSE, FALSE, 0); |
- |
- GtkWidget* bottom = gtk_hbox_new(FALSE, 0); |
- // We want the buttons on the right, so just use an expanding label to fill |
- // all of the extra space on the left. |
- gtk_box_pack_start(GTK_BOX(bottom), gtk_label_new(NULL), TRUE, TRUE, 0); |
- gtk_box_pack_start(GTK_BOX(bottom), keep_button, FALSE, FALSE, |
- kButtonPadding); |
- gtk_box_pack_start(GTK_BOX(bottom), change_button, FALSE, FALSE, 0); |
- |
- gtk_box_pack_start(GTK_BOX(content_), bottom, FALSE, FALSE, 0); |
- // We want the focus to start on the keep entry, not on the change button. |
- gtk_widget_grab_focus(keep_button); |
- |
- g_signal_connect(keep_button, "clicked", |
- G_CALLBACK(&HandleKeepButtonThunk), this); |
- g_signal_connect(change_button, "clicked", |
- G_CALLBACK(&HandleChangeButtonThunk), this); |
-} |
- |
-void FirstRunBubble::InitializeContentForOEM(std::vector<GtkWidget*>* labels) { |
- NOTIMPLEMENTED() << "Falling back to minimal bubble"; |
- InitializeContentForMinimal(labels); |
-} |
- |
-void FirstRunBubble::InitializeContentForMinimal( |
- std::vector<GtkWidget*>* labels) { |
- GtkWidget* label1 = theme_service_->BuildLabel("", ui::kGdkBlack); |
- labels->push_back(label1); |
- char* markup = g_markup_printf_escaped(kSearchLabelMarkup, |
- l10n_util::GetStringFUTF8( |
- IDS_FR_SE_BUBBLE_TITLE, |
+ l10n_util::GetStringFUTF8(IDS_FR_BUBBLE_TITLE, |
GetDefaultSearchEngineName(profile_)).c_str()); |
- gtk_label_set_markup(GTK_LABEL(label1), markup); |
+ gtk_label_set_markup(GTK_LABEL(title), markup); |
g_free(markup); |
- GtkWidget* label2 = theme_service_->BuildLabel( |
+ GtkWidget* change = theme_service->BuildChromeLinkButton( |
+ l10n_util::GetStringUTF8(IDS_FR_BUBBLE_CHANGE)); |
+ g_signal_connect(change, "clicked", G_CALLBACK(&HandleChangeLinkThunk), this); |
+ |
+ GtkWidget* subtext = theme_service->BuildLabel( |
l10n_util::GetStringUTF8(IDS_FR_BUBBLE_SUBTEXT), ui::kGdkBlack); |
- labels->push_back(label2); |
- gtk_box_pack_start(GTK_BOX(content_), label1, FALSE, FALSE, 0); |
- gtk_box_pack_start(GTK_BOX(content_), label2, FALSE, FALSE, 0); |
+ GtkWidget* top_line = gtk_hbox_new(FALSE, kContentBorder); |
+ gtk_box_pack_start(GTK_BOX(top_line), title, FALSE, FALSE, 0); |
+ gtk_box_pack_start(GTK_BOX(top_line), change, FALSE, FALSE, 0); |
+ |
+ GtkWidget* content = gtk_vbox_new(FALSE, kInterLineSpacing); |
+ gtk_container_set_border_width(GTK_CONTAINER(content), kContentBorder); |
+ g_signal_connect(content, "destroy", G_CALLBACK(&HandleDestroyThunk), this); |
+ gtk_box_pack_start(GTK_BOX(content), top_line, FALSE, FALSE, 0); |
+ gtk_box_pack_start(GTK_BOX(content), subtext, FALSE, FALSE, 0); |
+ |
+ BubbleGtk::ArrowLocationGtk arrow_location = !base::i18n::IsRTL() ? |
+ BubbleGtk::ARROW_LOCATION_TOP_LEFT : BubbleGtk::ARROW_LOCATION_TOP_RIGHT; |
+ bubble_ = BubbleGtk::Show(anchor, &rect, content, arrow_location, |
+ true /*match_system_theme*/, true /*grab_input*/, theme_service, this); |
+ DCHECK(bubble_); |
} |
-void FirstRunBubble::InitializeLabels(int width_resource, |
- std::vector<GtkWidget*>* labels) { |
- int width = -1; |
- |
- gtk_util::GetWidgetSizeFromResources( |
- anchor_, width_resource, 0, &width, NULL); |
- |
- for (size_t i = 0; i < labels->size(); ++i) { |
- // Resize the labels so that they don't wrap more than necessary. We leave |
- // |content_| unsized so that it'll expand as needed to hold the other |
- // widgets -- the buttons may be wider than |width| on high-DPI displays. |
- gtk_util::SetLabelWidth((*labels)[i], width); |
- } |
+FirstRunBubble::~FirstRunBubble() { |
} |
void FirstRunBubble::HandleDestroy(GtkWidget* sender) { |
- content_ = NULL; |
delete this; |
} |
-void FirstRunBubble::HandleKeepButton(GtkWidget* sender) { |
- bubble_->Close(); |
-} |
- |
-void FirstRunBubble::HandleChangeButton(GtkWidget* sender) { |
- bubble_->Close(); |
+void FirstRunBubble::HandleChangeLink(GtkWidget* sender) { |
+ // Get |profile_|'s browser before closing the bubble, which deletes |this|. |
Browser* browser = BrowserList::GetLastActiveWithProfile(profile_); |
- DCHECK(browser); |
- browser->OpenSearchEngineOptionsDialog(); |
+ bubble_->Close(); |
+ if (browser) |
+ browser->OpenSearchEngineOptionsDialog(); |
} |