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