| Index: chrome/browser/ui/gtk/extensions/extension_uninstall_dialog_gtk.cc
|
| diff --git a/chrome/browser/ui/gtk/extensions/extension_uninstall_dialog_gtk.cc b/chrome/browser/ui/gtk/extensions/extension_uninstall_dialog_gtk.cc
|
| index 2c3e94c5f1b993fcf9a09e8fe8ded7786e48d74a..1f45a6991e05baf30c6f4f2c422767af084bd926 100644
|
| --- a/chrome/browser/ui/gtk/extensions/extension_uninstall_dialog_gtk.cc
|
| +++ b/chrome/browser/ui/gtk/extensions/extension_uninstall_dialog_gtk.cc
|
| @@ -26,41 +26,59 @@ namespace {
|
| // Left or right margin.
|
| const int kPanelHorizMargin = 13;
|
|
|
| -void OnResponse(GtkWidget* dialog, int response_id,
|
| - ExtensionUninstallDialog::Delegate* delegate) {
|
| - if (response_id == GTK_RESPONSE_ACCEPT)
|
| - delegate->ExtensionDialogAccepted();
|
| - else
|
| - delegate->ExtensionDialogCanceled();
|
| -
|
| - gtk_widget_destroy(dialog);
|
| -}
|
| +// GTK implementation of the uninstall dialog.
|
| +class ExtensionUninstallDialogGtk : public ExtensionUninstallDialog {
|
| + public:
|
| + ExtensionUninstallDialogGtk(Profile* profile, Delegate* delegate);
|
| + virtual ~ExtensionUninstallDialogGtk() OVERRIDE;
|
| +
|
| + private:
|
| + virtual void Show() OVERRIDE;
|
| +
|
| + CHROMEGTK_CALLBACK_1(ExtensionUninstallDialogGtk, void, OnResponse, int);
|
| +
|
| + GtkWidget* dialog_;
|
| +};
|
| +
|
| +ExtensionUninstallDialogGtk::ExtensionUninstallDialogGtk(
|
| + Profile* profile, ExtensionUninstallDialog::Delegate* delegate)
|
| + : ExtensionUninstallDialog(profile, delegate),
|
| + dialog_(NULL) {}
|
| +
|
| +void ExtensionUninstallDialogGtk::Show() {
|
| + Browser* browser = BrowserList::GetLastActiveWithProfile(profile_);
|
| + if (!browser) {
|
| + delegate_->ExtensionUninstallCanceled();
|
| + return;
|
| + }
|
| +
|
| + BrowserWindow* browser_window = browser->window();
|
| + if (!browser_window) {
|
| + delegate_->ExtensionUninstallCanceled();
|
| + return;
|
| + }
|
|
|
| -void ShowUninstallDialogGtk(GtkWindow* parent,
|
| - SkBitmap* skia_icon,
|
| - const Extension* extension,
|
| - ExtensionUninstallDialog::Delegate *delegate) {
|
| // Build the dialog.
|
| - GtkWidget* dialog = gtk_dialog_new_with_buttons(
|
| + dialog_ = gtk_dialog_new_with_buttons(
|
| l10n_util::GetStringUTF8(IDS_EXTENSION_UNINSTALL_PROMPT_TITLE).c_str(),
|
| - parent,
|
| + browser_window->GetNativeHandle(),
|
| GTK_DIALOG_MODAL,
|
| GTK_STOCK_CANCEL,
|
| GTK_RESPONSE_CLOSE,
|
| l10n_util::GetStringUTF8(IDS_EXTENSION_PROMPT_UNINSTALL_BUTTON).c_str(),
|
| GTK_RESPONSE_ACCEPT,
|
| NULL);
|
| - gtk_dialog_set_has_separator(GTK_DIALOG(dialog), FALSE);
|
| + gtk_dialog_set_has_separator(GTK_DIALOG(dialog_), FALSE);
|
|
|
| // Create a two column layout.
|
| - GtkWidget* content_area = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
|
| + GtkWidget* content_area = gtk_dialog_get_content_area(GTK_DIALOG(dialog_));
|
| gtk_box_set_spacing(GTK_BOX(content_area), ui::kContentAreaSpacing);
|
|
|
| GtkWidget* icon_hbox = gtk_hbox_new(FALSE, ui::kContentAreaSpacing);
|
| gtk_box_pack_start(GTK_BOX(content_area), icon_hbox, TRUE, TRUE, 0);
|
|
|
| // Put Icon in the left column.
|
| - GdkPixbuf* pixbuf = gfx::GdkPixbufFromSkBitmap(skia_icon);
|
| + GdkPixbuf* pixbuf = gfx::GdkPixbufFromSkBitmap(&icon_);
|
| GtkWidget* icon = gtk_image_new_from_pixbuf(pixbuf);
|
| g_object_unref(pixbuf);
|
| gtk_box_pack_start(GTK_BOX(icon_hbox), icon, TRUE, TRUE, 0);
|
| @@ -70,36 +88,44 @@ void ShowUninstallDialogGtk(GtkWindow* parent,
|
| gtk_box_pack_start(GTK_BOX(icon_hbox), right_column_area, TRUE, TRUE, 0);
|
|
|
| std::string heading_text = l10n_util::GetStringFUTF8(
|
| - IDS_EXTENSION_UNINSTALL_PROMPT_HEADING, UTF8ToUTF16(extension->name()));
|
| + IDS_EXTENSION_UNINSTALL_PROMPT_HEADING, UTF8ToUTF16(extension_->name()));
|
| GtkWidget* heading_label = gtk_label_new(heading_text.c_str());
|
| gtk_misc_set_alignment(GTK_MISC(heading_label), 0.0, 0.5);
|
| gtk_box_pack_start(GTK_BOX(right_column_area), heading_label, TRUE, TRUE, 0);
|
|
|
| - g_signal_connect(dialog, "response", G_CALLBACK(OnResponse), delegate);
|
| - gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE);
|
| - gtk_widget_show_all(dialog);
|
| + g_signal_connect(dialog_, "response", G_CALLBACK(OnResponseThunk), this);
|
| + gtk_window_set_resizable(GTK_WINDOW(dialog_), FALSE);
|
| + gtk_widget_show_all(dialog_);
|
| }
|
|
|
| -} // namespace
|
| -
|
| -// static
|
| -void ExtensionUninstallDialog::Show(
|
| - Profile* profile,
|
| - ExtensionUninstallDialog::Delegate* delegate,
|
| - const Extension* extension,
|
| - SkBitmap* icon) {
|
| - Browser* browser = BrowserList::GetLastActiveWithProfile(profile);
|
| - if (!browser) {
|
| - delegate->ExtensionDialogCanceled();
|
| - return;
|
| +ExtensionUninstallDialogGtk::~ExtensionUninstallDialogGtk() {
|
| + delegate_ = NULL;
|
| + if (dialog_) {
|
| + gtk_widget_destroy(dialog_);
|
| + dialog_ = NULL;
|
| }
|
| +}
|
|
|
| - BrowserWindow* browser_window = browser->window();
|
| - if (!browser_window) {
|
| - delegate->ExtensionDialogCanceled();
|
| - return;
|
| +void ExtensionUninstallDialogGtk::OnResponse(
|
| + GtkWidget* dialog, int response_id) {
|
| + CHECK_EQ(dialog_, dialog);
|
| +
|
| + gtk_widget_destroy(dialog_);
|
| + dialog_ = NULL;
|
| +
|
| + if (delegate_) {
|
| + if (response_id == GTK_RESPONSE_ACCEPT)
|
| + delegate_->ExtensionUninstallAccepted();
|
| + else
|
| + delegate_->ExtensionUninstallCanceled();
|
| }
|
| +}
|
|
|
| - ShowUninstallDialogGtk(browser_window->GetNativeHandle(),
|
| - icon, extension, delegate);
|
| +} // namespace
|
| +
|
| +// static
|
| +// Platform specific implementation of the uninstall dialog show method.
|
| +ExtensionUninstallDialog* ExtensionUninstallDialog::Create(
|
| + Profile* profile, Delegate* delegate) {
|
| + return new ExtensionUninstallDialogGtk(profile, delegate);
|
| }
|
|
|