diff options
Diffstat (limited to 'chrome/browser/gtk/import_dialog_gtk.cc')
-rw-r--r-- | chrome/browser/gtk/import_dialog_gtk.cc | 202 |
1 files changed, 202 insertions, 0 deletions
diff --git a/chrome/browser/gtk/import_dialog_gtk.cc b/chrome/browser/gtk/import_dialog_gtk.cc new file mode 100644 index 0000000..5af8aec --- /dev/null +++ b/chrome/browser/gtk/import_dialog_gtk.cc @@ -0,0 +1,202 @@ +// Copyright (c) 2010 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/import_dialog_gtk.h" + +#include <string> + +#include "app/l10n_util.h" +#include "app/resource_bundle.h" +#include "base/utf_string_conversions.h" +#include "chrome/browser/gtk/accessible_widget_helper_gtk.h" +#include "chrome/browser/gtk/gtk_util.h" +#include "chrome/browser/importer/importer_data_types.h" +#include "grit/generated_resources.h" +#include "grit/locale_settings.h" + +namespace { + +// Returns true if the checkbox is checked. +gboolean IsChecked(GtkWidget* widget) { + return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); +} + +} // namespace + +// static +void ImportDialogGtk::Show(GtkWindow* parent, Profile* profile, + int initial_state) { + new ImportDialogGtk(parent, profile, initial_state); +} + +//////////////////////////////////////////////////////////////////////////////// +// ImportObserver implementation: +void ImportDialogGtk::ImportCanceled() { + ImportComplete(); +} + +void ImportDialogGtk::ImportComplete() { + gtk_widget_destroy(dialog_); + delete this; +} + +ImportDialogGtk::ImportDialogGtk(GtkWindow* parent, Profile* profile, + int initial_state) + : parent_(parent), + profile_(profile), + importer_host_(new ImporterHost()), + initial_state_(initial_state) { + // Build the dialog. + std::string dialog_name = l10n_util::GetStringUTF8( + IDS_IMPORT_SETTINGS_TITLE); + dialog_ = gtk_dialog_new_with_buttons( + dialog_name.c_str(), + parent, + (GtkDialogFlags) (GTK_DIALOG_MODAL | GTK_DIALOG_NO_SEPARATOR), + GTK_STOCK_CANCEL, + GTK_RESPONSE_REJECT, + NULL); + + accessible_widget_helper_.reset(new AccessibleWidgetHelper( + dialog_, profile)); + accessible_widget_helper_->SendOpenWindowNotification(dialog_name); + + importer_host_->set_parent_window(GTK_WINDOW(dialog_)); + + // Add import button separately as we might need to disable it, if + // no supported browsers found. + GtkWidget* import_button = gtk_util::AddButtonToDialog(dialog_, + l10n_util::GetStringUTF8(IDS_IMPORT_COMMIT).c_str(), + GTK_STOCK_APPLY, GTK_RESPONSE_ACCEPT); + GTK_WIDGET_SET_FLAGS(import_button, GTK_CAN_DEFAULT); + gtk_dialog_set_default_response(GTK_DIALOG(dialog_), GTK_RESPONSE_ACCEPT); + + GtkWidget* content_area = GTK_DIALOG(dialog_)->vbox; + gtk_box_set_spacing(GTK_BOX(content_area), gtk_util::kContentAreaSpacing); + + GtkWidget* combo_hbox = gtk_hbox_new(FALSE, gtk_util::kLabelSpacing); + GtkWidget* from = gtk_label_new( + l10n_util::GetStringUTF8(IDS_IMPORT_FROM_LABEL).c_str()); + gtk_box_pack_start(GTK_BOX(combo_hbox), from, FALSE, FALSE, 0); + + combo_ = gtk_combo_box_new_text(); + gtk_box_pack_start(GTK_BOX(combo_hbox), combo_, TRUE, TRUE, 0); + + gtk_box_pack_start(GTK_BOX(content_area), combo_hbox, FALSE, FALSE, 0); + + GtkWidget* vbox = gtk_vbox_new(FALSE, gtk_util::kControlSpacing); + + GtkWidget* description = gtk_label_new( + l10n_util::GetStringUTF8(IDS_IMPORT_ITEMS_LABEL).c_str()); + gtk_misc_set_alignment(GTK_MISC(description), 0, 0); + gtk_box_pack_start(GTK_BOX(vbox), description, FALSE, FALSE, 0); + + bookmarks_ = gtk_check_button_new_with_label( + l10n_util::GetStringUTF8(IDS_IMPORT_FAVORITES_CHKBOX).c_str()); + gtk_box_pack_start(GTK_BOX(vbox), bookmarks_, FALSE, FALSE, 0); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(bookmarks_), + (initial_state_ & importer::FAVORITES) != 0); + g_signal_connect(bookmarks_, "toggled", + G_CALLBACK(OnDialogWidgetClickedThunk), this); + + search_engines_ = gtk_check_button_new_with_label( + l10n_util::GetStringUTF8(IDS_IMPORT_SEARCH_ENGINES_CHKBOX).c_str()); + gtk_box_pack_start(GTK_BOX(vbox), search_engines_, FALSE, FALSE, 0); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(search_engines_), + (initial_state_ & importer::SEARCH_ENGINES) != 0); + g_signal_connect(search_engines_, "toggled", + G_CALLBACK(OnDialogWidgetClickedThunk), this); + + passwords_ = gtk_check_button_new_with_label( + l10n_util::GetStringUTF8(IDS_IMPORT_PASSWORDS_CHKBOX).c_str()); + gtk_box_pack_start(GTK_BOX(vbox), passwords_, FALSE, FALSE, 0); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(passwords_), + (initial_state_ & importer::PASSWORDS) != 0); + g_signal_connect(passwords_, "toggled", + G_CALLBACK(OnDialogWidgetClickedThunk), this); + + history_ = gtk_check_button_new_with_label( + l10n_util::GetStringUTF8(IDS_IMPORT_HISTORY_CHKBOX).c_str()); + gtk_box_pack_start(GTK_BOX(vbox), history_, FALSE, FALSE, 0); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(history_), + (initial_state_ & importer::HISTORY) !=0); + g_signal_connect(history_, "toggled", + G_CALLBACK(OnDialogWidgetClickedThunk), this); + + gtk_box_pack_start(GTK_BOX(content_area), vbox, FALSE, FALSE, 0); + + // Detect any supported browsers that we can import from and fill + // up the combo box. If none found, disable all controls except cancel. + 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(combo_), + WideToUTF8(profile).c_str()); + } + gtk_widget_grab_focus(import_button); + } else { + gtk_combo_box_append_text(GTK_COMBO_BOX(combo_), + l10n_util::GetStringUTF8(IDS_IMPORT_NO_PROFILE_FOUND).c_str()); + gtk_widget_set_sensitive(bookmarks_, FALSE); + gtk_widget_set_sensitive(search_engines_, FALSE); + gtk_widget_set_sensitive(passwords_, FALSE); + gtk_widget_set_sensitive(history_, FALSE); + gtk_widget_set_sensitive(import_button, FALSE); + } + gtk_combo_box_set_active(GTK_COMBO_BOX(combo_), 0); + + g_signal_connect(dialog_, "response", + G_CALLBACK(OnDialogResponseThunk), this); + + UpdateDialogButtons(); + + gtk_util::ShowDialogWithLocalizedSize(dialog_, + IDS_IMPORT_DIALOG_WIDTH_CHARS, + -1, // height + false); // resizable +} + +ImportDialogGtk::~ImportDialogGtk() { +} + +void ImportDialogGtk::OnDialogResponse(GtkWidget* widget, int response) { + gtk_widget_hide_all(dialog_); + if (response == GTK_RESPONSE_ACCEPT) { + uint16 items = GetCheckedItems(); + if (items == 0) { + ImportComplete(); + } else { + const ProfileInfo& source_profile = + importer_host_->GetSourceProfileInfoAt( + gtk_combo_box_get_active(GTK_COMBO_BOX(combo_))); + StartImportingWithUI(parent_, items, importer_host_.get(), + source_profile, profile_, this, false); + } + } else { + ImportCanceled(); + } +} + +void ImportDialogGtk::OnDialogWidgetClicked(GtkWidget* widget) { + UpdateDialogButtons(); +} + +void ImportDialogGtk::UpdateDialogButtons() { + gtk_dialog_set_response_sensitive(GTK_DIALOG(dialog_), GTK_RESPONSE_ACCEPT, + GetCheckedItems() != 0); +} + +uint16 ImportDialogGtk::GetCheckedItems() { + uint16 items = importer::NONE; + if (IsChecked(bookmarks_)) + items |= importer::FAVORITES; + if (IsChecked(search_engines_)) + items |= importer::SEARCH_ENGINES; + if (IsChecked(passwords_)) + items |= importer::PASSWORDS; + if (IsChecked(history_)) + items |= importer::HISTORY; + return items; +} |