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