1// Copyright (c) 2012 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/download/download_in_progress_dialog_gtk.h"
6
7#include <gtk/gtk.h>
8
9#include "base/strings/string16.h"
10#include "base/strings/string_number_conversions.h"
11#include "chrome/browser/ui/browser.h"
12#include "chrome/browser/ui/gtk/gtk_util.h"
13#include "grit/chromium_strings.h"
14#include "grit/generated_resources.h"
15#include "ui/base/l10n/l10n_util.h"
16
17// static
18void DownloadInProgressDialogGtk::Show(Browser* browser,
19                                       gfx::NativeWindow parent_window) {
20  new DownloadInProgressDialogGtk(browser, parent_window);
21}
22
23DownloadInProgressDialogGtk::DownloadInProgressDialogGtk(
24    Browser* browser,
25    gfx::NativeWindow parent_window)
26    : browser_(browser) {
27  int download_count;
28  Browser::DownloadClosePreventionType dialog_type =
29      browser_->OkToCloseWithInProgressDownloads(&download_count);
30
31  std::string title_text;
32  std::string explanation_text;
33  std::string ok_button_text;
34  switch (dialog_type) {
35    case Browser::DOWNLOAD_CLOSE_BROWSER_SHUTDOWN:
36      if (download_count == 1) {
37        title_text = l10n_util::GetStringUTF8(
38            IDS_SINGLE_DOWNLOAD_REMOVE_CONFIRM_TITLE);
39        explanation_text = l10n_util::GetStringUTF8(
40            IDS_SINGLE_DOWNLOAD_REMOVE_CONFIRM_EXPLANATION);
41      } else {
42        title_text = l10n_util::GetStringUTF8(
43            IDS_MULTIPLE_DOWNLOADS_REMOVE_CONFIRM_TITLE);
44        explanation_text = l10n_util::GetStringUTF8(
45            IDS_MULTIPLE_DOWNLOADS_REMOVE_CONFIRM_EXPLANATION);
46      }
47      ok_button_text = l10n_util::GetStringUTF8(
48          IDS_DOWNLOAD_REMOVE_CONFIRM_OK_BUTTON_LABEL);
49      break;
50    case Browser::DOWNLOAD_CLOSE_LAST_WINDOW_IN_INCOGNITO_PROFILE:
51      if (download_count == 1) {
52        title_text = l10n_util::GetStringUTF8(
53            IDS_SINGLE_INCOGNITO_DOWNLOAD_REMOVE_CONFIRM_TITLE);
54        explanation_text = l10n_util::GetStringUTF8(
55            IDS_SINGLE_INCOGNITO_DOWNLOAD_REMOVE_CONFIRM_EXPLANATION);
56      } else {
57        title_text = l10n_util::GetStringUTF8(
58            IDS_MULTIPLE_INCOGNITO_DOWNLOADS_REMOVE_CONFIRM_TITLE);
59        explanation_text = l10n_util::GetStringUTF8(
60            IDS_MULTIPLE_INCOGNITO_DOWNLOADS_REMOVE_CONFIRM_EXPLANATION);
61      }
62      ok_button_text = l10n_util::GetStringUTF8(
63          IDS_INCOGNITO_DOWNLOAD_REMOVE_CONFIRM_OK_BUTTON_LABEL);
64      break;
65    default:
66      // This dialog should have been created within the same thread invocation
67      // as the original test that lead to us, so it should always not be ok
68      // to close.
69      NOTREACHED();
70  }
71  std::string cancel_button_text = l10n_util::GetStringUTF8(
72      IDS_DOWNLOAD_REMOVE_CONFIRM_CANCEL_BUTTON_LABEL);
73
74  GtkWidget* dialog = gtk_message_dialog_new(
75      parent_window,
76      static_cast<GtkDialogFlags>(GTK_DIALOG_MODAL),
77      GTK_MESSAGE_QUESTION,
78      GTK_BUTTONS_NONE,
79      "%s",
80      title_text.c_str());
81  gtk_dialog_add_button(GTK_DIALOG(dialog),
82                        cancel_button_text.c_str(), GTK_RESPONSE_REJECT);
83  gtk_dialog_add_button(GTK_DIALOG(dialog),
84                        ok_button_text.c_str(), GTK_RESPONSE_ACCEPT);
85
86  gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),
87                                           "%s",
88                                           explanation_text.c_str());
89
90  g_signal_connect(dialog, "response", G_CALLBACK(OnResponseThunk), this);
91
92  gtk_widget_show_all(dialog);
93}
94
95DownloadInProgressDialogGtk::~DownloadInProgressDialogGtk() {
96}
97
98void DownloadInProgressDialogGtk::OnResponse(GtkWidget* dialog,
99                                             int response_id) {
100  gtk_widget_destroy(dialog);
101  browser_->InProgressDownloadResponse(response_id == GTK_RESPONSE_ACCEPT);
102  delete this;
103}
104