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 // Currently this file is only used for the uninstall prompt. The install prompt 6 // code is in extension_install_prompt2_gtk.cc. 7 8 #include <gtk/gtk.h> 9 10 #include "base/string_util.h" 11 #include "base/utf_string_conversions.h" 12 #include "chrome/browser/extensions/extension_uninstall_dialog.h" 13 #include "chrome/browser/ui/browser_list.h" 14 #include "chrome/browser/ui/browser_window.h" 15 #include "chrome/browser/ui/gtk/browser_window_gtk.h" 16 #include "chrome/browser/ui/gtk/gtk_util.h" 17 #include "chrome/common/extensions/extension.h" 18 #include "grit/generated_resources.h" 19 #include "ui/base/l10n/l10n_util.h" 20 #include "ui/gfx/gtk_util.h" 21 22 class Profile; 23 24 namespace { 25 26 // Left or right margin. 27 const int kPanelHorizMargin = 13; 28 29 void OnResponse(GtkWidget* dialog, int response_id, 30 ExtensionUninstallDialog::Delegate* delegate) { 31 if (response_id == GTK_RESPONSE_ACCEPT) 32 delegate->ExtensionDialogAccepted(); 33 else 34 delegate->ExtensionDialogCanceled(); 35 36 gtk_widget_destroy(dialog); 37 } 38 39 void ShowUninstallDialogGtk(GtkWindow* parent, 40 SkBitmap* skia_icon, 41 const Extension* extension, 42 ExtensionUninstallDialog::Delegate *delegate) { 43 // Build the dialog. 44 GtkWidget* dialog = gtk_dialog_new_with_buttons( 45 l10n_util::GetStringUTF8(IDS_EXTENSION_UNINSTALL_PROMPT_TITLE).c_str(), 46 parent, 47 GTK_DIALOG_MODAL, 48 GTK_STOCK_CANCEL, 49 GTK_RESPONSE_CLOSE, 50 l10n_util::GetStringUTF8(IDS_EXTENSION_PROMPT_UNINSTALL_BUTTON).c_str(), 51 GTK_RESPONSE_ACCEPT, 52 NULL); 53 gtk_dialog_set_has_separator(GTK_DIALOG(dialog), FALSE); 54 55 // Create a two column layout. 56 GtkWidget* content_area = GTK_DIALOG(dialog)->vbox; 57 gtk_box_set_spacing(GTK_BOX(content_area), gtk_util::kContentAreaSpacing); 58 59 GtkWidget* icon_hbox = gtk_hbox_new(FALSE, gtk_util::kContentAreaSpacing); 60 gtk_box_pack_start(GTK_BOX(content_area), icon_hbox, TRUE, TRUE, 0); 61 62 // Put Icon in the left column. 63 GdkPixbuf* pixbuf = gfx::GdkPixbufFromSkBitmap(skia_icon); 64 GtkWidget* icon = gtk_image_new_from_pixbuf(pixbuf); 65 g_object_unref(pixbuf); 66 gtk_box_pack_start(GTK_BOX(icon_hbox), icon, TRUE, TRUE, 0); 67 68 // Create a new vbox for the right column. 69 GtkWidget* right_column_area = gtk_vbox_new(FALSE, 0); 70 gtk_box_pack_start(GTK_BOX(icon_hbox), right_column_area, TRUE, TRUE, 0); 71 72 std::string heading_text = l10n_util::GetStringFUTF8( 73 IDS_EXTENSION_UNINSTALL_PROMPT_HEADING, UTF8ToUTF16(extension->name())); 74 GtkWidget* heading_label = gtk_label_new(heading_text.c_str()); 75 gtk_misc_set_alignment(GTK_MISC(heading_label), 0.0, 0.5); 76 gtk_box_pack_start(GTK_BOX(right_column_area), heading_label, TRUE, TRUE, 0); 77 78 g_signal_connect(dialog, "response", G_CALLBACK(OnResponse), delegate); 79 gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE); 80 gtk_widget_show_all(dialog); 81 } 82 83 } // namespace 84 85 // static 86 void ExtensionUninstallDialog::Show( 87 Profile* profile, 88 ExtensionUninstallDialog::Delegate* delegate, 89 const Extension* extension, 90 SkBitmap* icon) { 91 Browser* browser = BrowserList::GetLastActiveWithProfile(profile); 92 if (!browser) { 93 delegate->ExtensionDialogCanceled(); 94 return; 95 } 96 97 BrowserWindowGtk* browser_window = static_cast<BrowserWindowGtk*>( 98 browser->window()); 99 if (!browser_window) { 100 delegate->ExtensionDialogCanceled(); 101 return; 102 } 103 104 ShowUninstallDialogGtk(browser_window->window(), icon, extension, delegate); 105 } 106