172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
43345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick//
53345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Currently this file is only used for the uninstall prompt. The install prompt
63345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// code is in extension_install_prompt2_gtk.cc.
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <gtk/gtk.h>
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_util.h"
113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/utf_string_conversions.h"
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/extensions/extension_uninstall_dialog.h"
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/browser_list.h"
14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/browser_window.h"
1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/gtk/browser_window_gtk.h"
1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/gtk/gtk_util.h"
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/extensions/extension.h"
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/generated_resources.h"
1972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util.h"
2072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/gtk_util.h"
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Profile;
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace {
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Left or right margin.
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst int kPanelHorizMargin = 13;
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
29dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid OnResponse(GtkWidget* dialog, int response_id,
30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                ExtensionUninstallDialog::Delegate* delegate) {
31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (response_id == GTK_RESPONSE_ACCEPT)
32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    delegate->ExtensionDialogAccepted();
33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  else
34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    delegate->ExtensionDialogCanceled();
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
36dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  gtk_widget_destroy(dialog);
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid ShowUninstallDialogGtk(GtkWindow* parent,
40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                            SkBitmap* skia_icon,
41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                            const Extension* extension,
42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                            ExtensionUninstallDialog::Delegate *delegate) {
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Build the dialog.
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GtkWidget* dialog = gtk_dialog_new_with_buttons(
45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      l10n_util::GetStringUTF8(IDS_EXTENSION_UNINSTALL_PROMPT_TITLE).c_str(),
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      parent,
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GTK_DIALOG_MODAL,
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GTK_STOCK_CANCEL,
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GTK_RESPONSE_CLOSE,
50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      l10n_util::GetStringUTF8(IDS_EXTENSION_PROMPT_UNINSTALL_BUTTON).c_str(),
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GTK_RESPONSE_ACCEPT,
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NULL);
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_dialog_set_has_separator(GTK_DIALOG(dialog), FALSE);
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Create a two column layout.
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GtkWidget* content_area = GTK_DIALOG(dialog)->vbox;
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_box_set_spacing(GTK_BOX(content_area), gtk_util::kContentAreaSpacing);
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GtkWidget* icon_hbox = gtk_hbox_new(FALSE, gtk_util::kContentAreaSpacing);
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_box_pack_start(GTK_BOX(content_area), icon_hbox, TRUE, TRUE, 0);
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Put Icon in the left column.
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GdkPixbuf* pixbuf = gfx::GdkPixbufFromSkBitmap(skia_icon);
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GtkWidget* icon = gtk_image_new_from_pixbuf(pixbuf);
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  g_object_unref(pixbuf);
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_box_pack_start(GTK_BOX(icon_hbox), icon, TRUE, TRUE, 0);
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Create a new vbox for the right column.
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GtkWidget* right_column_area = gtk_vbox_new(FALSE, 0);
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_box_pack_start(GTK_BOX(icon_hbox), right_column_area, TRUE, TRUE, 0);
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::string heading_text = l10n_util::GetStringFUTF8(
73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      IDS_EXTENSION_UNINSTALL_PROMPT_HEADING, UTF8ToUTF16(extension->name()));
743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GtkWidget* heading_label = gtk_label_new(heading_text.c_str());
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_misc_set_alignment(GTK_MISC(heading_label), 0.0, 0.5);
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_box_pack_start(GTK_BOX(right_column_area), heading_label, TRUE, TRUE, 0);
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
78dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  g_signal_connect(dialog, "response", G_CALLBACK(OnResponse), delegate);
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE);
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_widget_show_all(dialog);
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// static
86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid ExtensionUninstallDialog::Show(
87513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    Profile* profile,
88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ExtensionUninstallDialog::Delegate* delegate,
89513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    const Extension* extension,
90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    SkBitmap* icon) {
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Browser* browser = BrowserList::GetLastActiveWithProfile(profile);
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!browser) {
93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    delegate->ExtensionDialogCanceled();
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BrowserWindowGtk* browser_window = static_cast<BrowserWindowGtk*>(
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      browser->window());
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!browser_window) {
100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    delegate->ExtensionDialogCanceled();
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ShowUninstallDialogGtk(browser_window->window(), icon, extension, delegate);
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
106