Home | History | Annotate | Download | only in extensions
      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