15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Currently this file is only used for the uninstall prompt. The install prompt
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// code is in extension_install_prompt2_gtk.cc.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_uninstall_dialog.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <gtk/gtk.h>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/gtk/browser_window_gtk.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/gtk/gtk_hig_constants.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/gtk_util.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Left or right margin.
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kPanelHorizMargin = 13;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// GTK implementation of the uninstall dialog.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionUninstallDialogGtk : public ExtensionUninstallDialog {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionUninstallDialogGtk(Profile* profile,
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              Browser* browser,
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              Delegate* delegate);
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ExtensionUninstallDialogGtk() OVERRIDE;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Show() OVERRIDE;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHROMEGTK_CALLBACK_1(ExtensionUninstallDialogGtk, void, OnResponse, int);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GtkWidget* dialog_;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionUninstallDialogGtk::ExtensionUninstallDialogGtk(
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Profile* profile,
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Browser* browser,
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ExtensionUninstallDialog::Delegate* delegate)
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : ExtensionUninstallDialog(profile, browser, delegate),
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dialog_(NULL) {}
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionUninstallDialogGtk::Show() {
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!browser_) {
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    delegate_->ExtensionUninstallCanceled();
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserWindow* browser_window = browser_->window();
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!browser_window) {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->ExtensionUninstallCanceled();
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Build the dialog.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dialog_ = gtk_dialog_new_with_buttons(
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF8(IDS_EXTENSION_UNINSTALL_PROMPT_TITLE).c_str(),
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser_window->GetNativeWindow(),
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GTK_DIALOG_MODAL,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GTK_STOCK_CANCEL,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GTK_RESPONSE_CLOSE,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF8(IDS_EXTENSION_PROMPT_UNINSTALL_BUTTON).c_str(),
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GTK_RESPONSE_ACCEPT,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NULL);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !GTK_CHECK_VERSION(2, 22, 0)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gtk_dialog_set_has_separator(GTK_DIALOG(dialog_), FALSE);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a two column layout.
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GtkWidget* content_area = gtk_dialog_get_content_area(GTK_DIALOG(dialog_));
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gtk_box_set_spacing(GTK_BOX(content_area), ui::kContentAreaSpacing);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GtkWidget* icon_hbox = gtk_hbox_new(FALSE, ui::kContentAreaSpacing);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gtk_box_pack_start(GTK_BOX(content_area), icon_hbox, TRUE, TRUE, 0);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Put Icon in the left column.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GdkPixbuf* pixbuf = gfx::GdkPixbufFromSkBitmap(*icon_.bitmap());
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GtkWidget* icon = gtk_image_new_from_pixbuf(pixbuf);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  g_object_unref(pixbuf);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gtk_box_pack_start(GTK_BOX(icon_hbox), icon, TRUE, TRUE, 0);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a new vbox for the right column.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GtkWidget* right_column_area = gtk_vbox_new(FALSE, 0);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gtk_box_pack_start(GTK_BOX(icon_hbox), right_column_area, TRUE, TRUE, 0);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string heading_text = l10n_util::GetStringFUTF8(
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDS_EXTENSION_UNINSTALL_PROMPT_HEADING, UTF8ToUTF16(extension_->name()));
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GtkWidget* heading_label = gtk_label_new(heading_text.c_str());
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gtk_misc_set_alignment(GTK_MISC(heading_label), 0.0, 0.5);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gtk_box_pack_start(GTK_BOX(right_column_area), heading_label, TRUE, TRUE, 0);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  g_signal_connect(dialog_, "response", G_CALLBACK(OnResponseThunk), this);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gtk_window_set_resizable(GTK_WINDOW(dialog_), FALSE);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gtk_widget_show_all(dialog_);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionUninstallDialogGtk::~ExtensionUninstallDialogGtk() {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_ = NULL;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (dialog_) {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gtk_widget_destroy(dialog_);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dialog_ = NULL;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionUninstallDialogGtk::OnResponse(
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GtkWidget* dialog, int response_id) {
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK_EQ(dialog_, dialog);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gtk_widget_destroy(dialog_);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dialog_ = NULL;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_) {
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (response_id == GTK_RESPONSE_ACCEPT)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delegate_->ExtensionUninstallAccepted();
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delegate_->ExtensionUninstallCanceled();
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Platform specific implementation of the uninstall dialog show method.
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionUninstallDialog* ExtensionUninstallDialog::Create(
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Profile* profile, Browser* browser, Delegate* delegate) {
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return new ExtensionUninstallDialogGtk(profile, browser, delegate);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
135