Index: chrome/browser/gtk/first_run_dialog.cc |
diff --git a/chrome/browser/gtk/first_run_dialog.cc b/chrome/browser/gtk/first_run_dialog.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..2646b6ff20c5f76fef769c508b8ab54d32baa845 |
--- /dev/null |
+++ b/chrome/browser/gtk/first_run_dialog.cc |
@@ -0,0 +1,154 @@ |
+// Copyright (c) 2009 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. |
+ |
+#include "chrome/browser/gtk/first_run_dialog.h" |
+ |
+#include "app/l10n_util.h" |
+#include "app/resource_bundle.h" |
+#include "base/message_loop.h" |
+#include "chrome/app/breakpad_linux.h" |
+#include "chrome/browser/shell_integration.h" |
+#include "chrome/common/gtk_util.h" |
+#include "chrome/installer/util/google_update_settings.h" |
+#include "grit/generated_resources.h" |
+#include "grit/google_chrome_strings.h" |
+ |
+// static |
+bool FirstRunDialog::Show(Profile* profile) { |
+ int response = -1; |
+ new FirstRunDialog(profile, response); |
+ return (response == GTK_RESPONSE_ACCEPT); |
+} |
+ |
+FirstRunDialog::FirstRunDialog(Profile* profile, int& response) |
+ : dialog_(NULL), report_crashes_(NULL), make_default_(NULL), |
+ import_data_(NULL), import_profile_(NULL), profile_(profile), |
+ response_(response), importer_host_(new ImporterHost()) { |
+ dialog_ = gtk_dialog_new_with_buttons( |
+ l10n_util::GetStringUTF8(IDS_FIRSTRUN_DLG_TITLE).c_str(), |
+ NULL, // No parent |
+ (GtkDialogFlags) (GTK_DIALOG_MODAL | GTK_DIALOG_NO_SEPARATOR), |
+ l10n_util::GetStringUTF8(IDS_FIRSTRUN_DLG_OK).c_str(), |
+ GTK_RESPONSE_ACCEPT, |
+ l10n_util::GetStringUTF8(IDS_FIRSTRUN_DLG_CANCEL).c_str(), |
+ GTK_RESPONSE_REJECT, |
+ NULL); |
+ gtk_window_set_resizable(GTK_WINDOW(dialog_), FALSE); |
+ g_signal_connect(G_OBJECT(dialog_), "delete-event", |
+ G_CALLBACK(gtk_widget_hide_on_delete), NULL); |
+ |
+ GtkWidget* content_area = GTK_DIALOG(dialog_)->vbox; |
+ gtk_box_set_spacing(GTK_BOX(content_area), 18); |
+ |
+ GtkWidget* vbox = gtk_vbox_new(FALSE, 12); |
+ // Force a size on the vbox so the labels wrap. |
+ gtk_widget_set_size_request(vbox, 350, -1); |
+ |
+#if defined(GOOGLE_CHROME_BUILD) |
+ // TODO(port): remove this warning before beta release when we have all the |
+ // privacy features working. |
+ GtkWidget* privacy_label = gtk_label_new( |
+ "This version of Google Chrome for Linux is not appropriate for " |
+ "general consumer use. Certain privacy features are unavailable " |
+ "at this time as described in our privacy policy at"); |
+ gtk_misc_set_alignment(GTK_MISC(privacy_label), 0, 0); |
+ gtk_label_set_line_wrap(GTK_LABEL(privacy_label), TRUE); |
+ gtk_box_pack_start(GTK_BOX(vbox), privacy_label, FALSE, FALSE, 0); |
+ |
+ GtkWidget* url_label = gtk_label_new(NULL); |
+ gtk_label_set_markup(GTK_LABEL(url_label), |
+ "<tt>http://www.google.com/chrome/intl/en/privacy_linux.html</tt>"); |
+ // Set selectable to allow copy and paste. |
+ gtk_label_set_selectable(GTK_LABEL(url_label), TRUE); |
+ gtk_box_pack_start(GTK_BOX(vbox), url_label, FALSE, FALSE, 0); |
+ |
+ report_crashes_ = gtk_check_button_new(); |
+ GtkWidget* check_label = gtk_label_new( |
+ l10n_util::GetStringUTF8(IDS_OPTIONS_ENABLE_LOGGING).c_str()); |
+ gtk_label_set_line_wrap(GTK_LABEL(check_label), TRUE); |
+ gtk_container_add(GTK_CONTAINER(report_crashes_), check_label); |
+ gtk_box_pack_start(GTK_BOX(vbox), report_crashes_, FALSE, FALSE, 0); |
+#endif |
+ |
+ make_default_ = gtk_check_button_new_with_label( |
+ l10n_util::GetStringUTF8(IDS_FR_CUSTOMIZE_DEFAULT_BROWSER).c_str()); |
+ gtk_box_pack_start(GTK_BOX(vbox), make_default_, FALSE, FALSE, 0); |
+ |
+ GtkWidget* combo_hbox = gtk_hbox_new(FALSE, gtk_util::kLabelSpacing); |
+ import_data_ = gtk_check_button_new_with_label( |
+ l10n_util::GetStringUTF8(IDS_FR_CUSTOMIZE_IMPORT).c_str()); |
+ gtk_box_pack_start(GTK_BOX(combo_hbox), import_data_, FALSE, FALSE, 0); |
+ import_profile_ = gtk_combo_box_new_text(); |
+ gtk_box_pack_start(GTK_BOX(combo_hbox), import_profile_, TRUE, TRUE, 0); |
+ gtk_box_pack_start(GTK_BOX(vbox), combo_hbox, FALSE, FALSE, 0); |
+ |
+ // Detect any supported browsers that we can import from and fill |
+ // up the combo box. If none found, disable import data checkbox. |
+ int profiles_count = importer_host_->GetAvailableProfileCount(); |
+ if (profiles_count > 0) { |
+ for (int i = 0; i < profiles_count; i++) { |
+ std::wstring profile = importer_host_->GetSourceProfileNameAt(i); |
+ gtk_combo_box_append_text(GTK_COMBO_BOX(import_profile_), |
+ WideToUTF8(profile).c_str()); |
+ } |
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(import_data_), TRUE); |
+ gtk_combo_box_set_active(GTK_COMBO_BOX(import_profile_), 0); |
+ } else { |
+ gtk_combo_box_append_text(GTK_COMBO_BOX(import_profile_), |
+ l10n_util::GetStringUTF8(IDS_IMPORT_NO_PROFILE_FOUND).c_str()); |
+ gtk_combo_box_set_active(GTK_COMBO_BOX(import_profile_), 0); |
+ gtk_widget_set_sensitive(import_data_, FALSE); |
+ gtk_widget_set_sensitive(import_profile_, FALSE); |
+ } |
+ |
+ gtk_box_pack_start(GTK_BOX(content_area), vbox, FALSE, FALSE, 0); |
+ |
+ // TODO(port): it should be sufficient to just run the dialog: |
+ // int response = gtk_dialog_run(GTK_DIALOG(dialog)); |
+ // but that spins a nested message loop and hoses us. :( |
+ // http://code.google.com/p/chromium/issues/detail?id=12552 |
+ // Instead, run a loop and extract the response manually. |
+ g_signal_connect(G_OBJECT(dialog_), "response", |
+ G_CALLBACK(HandleOnResponseDialog), this); |
+ gtk_widget_show_all(dialog_); |
+ MessageLoop::current()->Run(); |
+} |
+ |
+void FirstRunDialog::OnDialogResponse(GtkWidget* widget, int response) { |
+ gtk_widget_hide_all(dialog_); |
+ response_ = response; |
+ |
+ if (response == GTK_RESPONSE_ACCEPT) { |
+ // Mark that first run has ran. |
+ FirstRun::CreateSentinel(); |
+ |
+ // Check if user has opted into reporting. |
+ if (report_crashes_ && |
+ gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(report_crashes_))) { |
+ if (GoogleUpdateSettings::SetCollectStatsConsent(true)) |
+ InitCrashReporter(); |
+ } else { |
+ GoogleUpdateSettings::SetCollectStatsConsent(false); |
+ } |
+ |
+ // If selected set as default browser. |
+ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(make_default_))) |
+ ShellIntegration::SetAsDefaultBrowser(); |
+ |
+ // Import data if selected. |
+ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(import_data_))) { |
+ const ProfileInfo& source_profile = |
+ importer_host_->GetSourceProfileInfoAt( |
+ gtk_combo_box_get_active(GTK_COMBO_BOX(import_profile_))); |
+ int items = SEARCH_ENGINES + HISTORY + FAVORITES + HOME_PAGE + PASSWORDS; |
+ // TODO(port): Call StartImportingWithUI here instead and launch |
+ // a new process that does the actual import. |
+ importer_host_->StartImportSettings(source_profile, profile_, items, |
+ new ProfileWriter(profile_), true); |
+ } |
+ } |
+ |
+ gtk_widget_destroy(dialog_); |
+ MessageLoop::current()->Quit(); |
+} |