import_progress_dialog_gtk.cc revision dc0f95d653279beabeb9817299e2902918ba123e
1// Copyright (c) 2011 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/importer/import_progress_dialog_gtk.h" 6 7#include <gtk/gtk.h> 8 9#include <string> 10 11#include "base/utf_string_conversions.h" 12#include "chrome/browser/importer/importer_observer.h" 13#include "chrome/browser/ui/gtk/gtk_util.h" 14#include "grit/chromium_strings.h" 15#include "grit/generated_resources.h" 16#include "ui/base/l10n/l10n_util.h" 17 18namespace { 19 20void SetItemImportStatus(GtkWidget* label, int res_id, bool is_done) { 21 std::string status = l10n_util::GetStringUTF8(res_id); 22 // Windows version of this has fancy throbbers to indicate progress. Here 23 // we rely on text until we can have something equivalent on Linux. 24 if (is_done) 25 status = "\xE2\x9C\x94 " + status; // U+2714 HEAVY CHECK MARK 26 else 27 status.append(" ..."); 28 gtk_label_set_text(GTK_LABEL(label), status.c_str()); 29} 30 31} // namespace 32 33// static 34void ImportProgressDialogGtk::StartImport( 35 GtkWindow* parent, 36 uint16 items, 37 ImporterHost* importer_host, 38 ImporterObserver* importer_observer, 39 const importer::ProfileInfo& browser_profile, 40 Profile* profile, 41 bool first_run) { 42 ImportProgressDialogGtk* dialog = new ImportProgressDialogGtk( 43 parent, 44 items, 45 importer_host, 46 importer_observer, 47 WideToUTF16(browser_profile.description), 48 browser_profile.browser_type == importer::BOOKMARKS_HTML); 49 50 // In headless mode it means that we don't show the progress window, but it 51 // still need it to exist. No user interaction will be required. 52 if (!importer_host->is_headless()) 53 dialog->ShowDialog(); 54 55 importer_host->StartImportSettings( 56 browser_profile, profile, items, new ProfileWriter(profile), first_run); 57} 58 59ImportProgressDialogGtk::ImportProgressDialogGtk( 60 GtkWindow* parent, 61 uint16 items, 62 ImporterHost* importer_host, 63 ImporterObserver* importer_observer, 64 const string16& source_profile, 65 bool bookmarks_import) 66 : parent_(parent), 67 items_(items), 68 importer_host_(importer_host), 69 importer_observer_(importer_observer), 70 importing_(true) { 71 importer_host_->SetObserver(this); 72 73 // Build the dialog. 74 dialog_ = gtk_dialog_new_with_buttons( 75 l10n_util::GetStringUTF8(IDS_IMPORT_PROGRESS_TITLE).c_str(), 76 parent_, 77 (GtkDialogFlags) (GTK_DIALOG_MODAL | GTK_DIALOG_NO_SEPARATOR), 78 GTK_STOCK_CANCEL, 79 GTK_RESPONSE_REJECT, 80 NULL); 81 importer_host_->set_parent_window(GTK_WINDOW(dialog_)); 82 83 GtkWidget* content_area = GTK_DIALOG(dialog_)->vbox; 84 gtk_box_set_spacing(GTK_BOX(content_area), gtk_util::kContentAreaSpacing); 85 86 GtkWidget* control_group = gtk_vbox_new(FALSE, gtk_util::kControlSpacing); 87 88 GtkWidget* import_info = gtk_label_new( 89 l10n_util::GetStringFUTF8(IDS_IMPORT_PROGRESS_INFO, 90 source_profile).c_str()); 91 gtk_util::SetLabelWidth(import_info, 400); 92 gtk_box_pack_start(GTK_BOX(control_group), import_info, FALSE, FALSE, 0); 93 94 GtkWidget* item_box = gtk_vbox_new(FALSE, gtk_util::kControlSpacing); 95 96 if (items_ & importer::HISTORY) { 97 history_ = gtk_label_new( 98 l10n_util::GetStringUTF8(IDS_IMPORT_PROGRESS_STATUS_HISTORY).c_str()); 99 gtk_misc_set_alignment(GTK_MISC(history_), 0, 0.5); 100 gtk_box_pack_start(GTK_BOX(item_box), history_, FALSE, FALSE, 0); 101 } 102 103 if (items_ & importer::FAVORITES) { 104 bookmarks_ = gtk_label_new( 105 l10n_util::GetStringUTF8(IDS_IMPORT_PROGRESS_STATUS_BOOKMARKS).c_str()); 106 gtk_misc_set_alignment(GTK_MISC(bookmarks_), 0, 0.5); 107 gtk_box_pack_start(GTK_BOX(item_box), bookmarks_, FALSE, FALSE, 0); 108 } 109 110 if (items_ & importer::SEARCH_ENGINES) { 111 search_engines_ = gtk_label_new( 112 l10n_util::GetStringUTF8(IDS_IMPORT_PROGRESS_STATUS_SEARCH).c_str()); 113 gtk_misc_set_alignment(GTK_MISC(search_engines_), 0, 0.5); 114 gtk_box_pack_start(GTK_BOX(item_box), search_engines_, FALSE, FALSE, 0); 115 } 116 117 if (items_ & importer::PASSWORDS) { 118 passwords_ = gtk_label_new( 119 l10n_util::GetStringUTF8(IDS_IMPORT_PROGRESS_STATUS_PASSWORDS).c_str()); 120 gtk_misc_set_alignment(GTK_MISC(passwords_), 0, 0.5); 121 gtk_box_pack_start(GTK_BOX(item_box), passwords_, FALSE, FALSE, 0); 122 } 123 124 gtk_box_pack_start(GTK_BOX(control_group), gtk_util::IndentWidget(item_box), 125 FALSE, FALSE, 0); 126 gtk_box_pack_start(GTK_BOX(content_area), control_group, FALSE, FALSE, 0); 127 128 g_signal_connect(dialog_, "response", 129 G_CALLBACK(OnResponseThunk), this); 130 gtk_window_set_resizable(GTK_WINDOW(dialog_), FALSE); 131} 132 133ImportProgressDialogGtk::~ImportProgressDialogGtk() {} 134 135void ImportProgressDialogGtk::OnResponse(GtkWidget* dialog, int response_id) { 136 if (!importing_) { 137 CloseDialog(); 138 return; 139 } 140 141 // Only response to the dialog is to close it so we hide immediately. 142 gtk_widget_hide_all(dialog_); 143 if (response_id == GTK_RESPONSE_REJECT) 144 importer_host_->Cancel(); 145} 146 147void ImportProgressDialogGtk::ShowDialog() { 148 gtk_widget_show_all(dialog_); 149} 150 151void ImportProgressDialogGtk::CloseDialog() { 152 gtk_widget_destroy(dialog_); 153 dialog_ = NULL; 154 delete this; 155} 156 157void ImportProgressDialogGtk::ImportItemStarted(importer::ImportItem item) { 158 DCHECK(items_ & item); 159 switch (item) { 160 case importer::FAVORITES: 161 SetItemImportStatus(bookmarks_, 162 IDS_IMPORT_PROGRESS_STATUS_BOOKMARKS, false); 163 break; 164 case importer::SEARCH_ENGINES: 165 SetItemImportStatus(search_engines_, 166 IDS_IMPORT_PROGRESS_STATUS_SEARCH, false); 167 break; 168 case importer::PASSWORDS: 169 SetItemImportStatus(passwords_, 170 IDS_IMPORT_PROGRESS_STATUS_PASSWORDS, false); 171 break; 172 case importer::HISTORY: 173 SetItemImportStatus(history_, 174 IDS_IMPORT_PROGRESS_STATUS_HISTORY, false); 175 break; 176 default: 177 break; 178 } 179} 180 181void ImportProgressDialogGtk::ImportItemEnded(importer::ImportItem item) { 182 DCHECK(items_ & item); 183 switch (item) { 184 case importer::FAVORITES: 185 SetItemImportStatus(bookmarks_, 186 IDS_IMPORT_PROGRESS_STATUS_BOOKMARKS, true); 187 break; 188 case importer::SEARCH_ENGINES: 189 SetItemImportStatus(search_engines_, 190 IDS_IMPORT_PROGRESS_STATUS_SEARCH, true); 191 break; 192 case importer::PASSWORDS: 193 SetItemImportStatus(passwords_, 194 IDS_IMPORT_PROGRESS_STATUS_PASSWORDS, true); 195 break; 196 case importer::HISTORY: 197 SetItemImportStatus(history_, 198 IDS_IMPORT_PROGRESS_STATUS_HISTORY, true); 199 break; 200 default: 201 break; 202 } 203} 204 205void ImportProgressDialogGtk::ImportStarted() { 206 importing_ = true; 207} 208 209void ImportProgressDialogGtk::ImportEnded() { 210 importing_ = false; 211 importer_host_->SetObserver(NULL); 212 if (importer_observer_) 213 importer_observer_->ImportCompleted(); 214 CloseDialog(); 215} 216 217namespace importer { 218 219void ShowImportProgressDialog(GtkWindow* parent, 220 uint16 items, 221 ImporterHost* importer_host, 222 ImporterObserver* importer_observer, 223 const ProfileInfo& browser_profile, 224 Profile* profile, 225 bool first_run) { 226 DCHECK_NE(0, items); 227 ImportProgressDialogGtk::StartImport( 228 parent, items, importer_host, importer_observer, browser_profile, profile, 229 first_run); 230} 231 232} // namespace importer 233