| Index: chrome/browser/gtk/extension_install_prompt_gtk.cc
|
| diff --git a/chrome/browser/gtk/extension_install_prompt_gtk.cc b/chrome/browser/gtk/extension_install_prompt_gtk.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..a195cff2c3b99c961130efb35da742bb520d3319
|
| --- /dev/null
|
| +++ b/chrome/browser/gtk/extension_install_prompt_gtk.cc
|
| @@ -0,0 +1,147 @@
|
| +// Copyright (c) 2009 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include <gtk/gtk.h>
|
| +
|
| +#include "app/l10n_util.h"
|
| +#include "base/gfx/gtk_util.h"
|
| +#include "base/rand_util.h"
|
| +#include "base/string_util.h"
|
| +#include "chrome/browser/browser_list.h"
|
| +#include "chrome/browser/browser_window.h"
|
| +#include "chrome/browser/gtk/browser_window_gtk.h"
|
| +#include "chrome/browser/extensions/extension_install_ui.h"
|
| +#include "chrome/common/gtk_util.h"
|
| +#include "chrome/common/extensions/extension.h"
|
| +#include "grit/generated_resources.h"
|
| +
|
| +class Profile;
|
| +
|
| +namespace {
|
| +
|
| +const int kRightColumnWidth = 290;
|
| +
|
| +// Left or right margin.
|
| +const int kPanelHorizMargin = 13;
|
| +
|
| +GtkWidget* MakeMarkupLabel(const char* format, const std::string& str) {
|
| + GtkWidget* label = gtk_label_new(NULL);
|
| + char* markup = g_markup_printf_escaped(format, str.c_str());
|
| + gtk_label_set_markup(GTK_LABEL(label), markup);
|
| + g_free(markup);
|
| +
|
| + // Left align it.
|
| + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
|
| +
|
| + return label;
|
| +}
|
| +
|
| +void OnDialogResponse(GtkDialog* dialog, int response_id,
|
| + ExtensionInstallUI::Delegate* delegate) {
|
| + if (response_id == GTK_RESPONSE_ACCEPT) {
|
| + delegate->ContinueInstall();
|
| + } else {
|
| + delegate->AbortInstall();
|
| + }
|
| +
|
| + gtk_widget_destroy(GTK_WIDGET(dialog));
|
| +}
|
| +
|
| +void ShowInstallPromptDialog(GtkWindow* parent, SkBitmap* skia_icon,
|
| + Extension *extension,
|
| + ExtensionInstallUI::Delegate *delegate) {
|
| + // Build the dialog.
|
| + GtkWidget* dialog = gtk_dialog_new_with_buttons(
|
| + l10n_util::GetStringUTF8(IDS_EXTENSION_PROMPT_TITLE).c_str(),
|
| + parent,
|
| + GTK_DIALOG_MODAL,
|
| + GTK_STOCK_CANCEL,
|
| + GTK_RESPONSE_CLOSE,
|
| + "Install",
|
| + GTK_RESPONSE_ACCEPT,
|
| + NULL);
|
| + gtk_dialog_set_has_separator(GTK_DIALOG(dialog), FALSE);
|
| +
|
| + GtkWidget* content_area = GTK_DIALOG(dialog)->vbox;
|
| + gtk_box_set_spacing(GTK_BOX(content_area), gtk_util::kContentAreaSpacing);
|
| +
|
| + GtkWidget* right_column_area;
|
| + if (skia_icon) {
|
| + // Create a two column layout.
|
| + GtkWidget* icon_hbox = gtk_hbox_new(FALSE, gtk_util::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);
|
| + GtkWidget* icon = gtk_image_new_from_pixbuf(pixbuf);
|
| + gtk_box_pack_start(GTK_BOX(icon_hbox), icon, TRUE, TRUE, 0);
|
| +
|
| + // Create a new vbox for the right column.
|
| + right_column_area = gtk_vbox_new(FALSE, 0);
|
| + gtk_box_pack_start(GTK_BOX(icon_hbox), right_column_area, TRUE, TRUE, 0);
|
| + } else {
|
| + right_column_area = content_area;
|
| + }
|
| +
|
| + // Prompt.
|
| + std::string prompt_text = WideToUTF8(l10n_util::GetStringF(
|
| + IDS_EXTENSION_PROMPT_HEADING, UTF8ToWide(extension->name())));
|
| + GtkWidget* prompt_label = MakeMarkupLabel("<span weight=\"bold\">%s</span>",
|
| + prompt_text);
|
| + gtk_misc_set_alignment(GTK_MISC(prompt_label), 0.0, 0.5);
|
| + gtk_label_set_selectable(GTK_LABEL(prompt_label), TRUE);
|
| + gtk_box_pack_start(GTK_BOX(right_column_area), prompt_label, TRUE, TRUE, 0);
|
| +
|
| + // Pick a random warning.
|
| + std::string warnings[] = {
|
| + l10n_util::GetStringUTF8(IDS_EXTENSION_PROMPT_WARNING_1),
|
| + l10n_util::GetStringUTF8(IDS_EXTENSION_PROMPT_WARNING_2),
|
| + l10n_util::GetStringUTF8(IDS_EXTENSION_PROMPT_WARNING_3)
|
| + };
|
| + std::string warning_text = warnings[
|
| + base::RandInt(0, arraysize(warnings) - 1)];
|
| + GtkWidget* warning_label = gtk_label_new(warning_text.c_str());
|
| + gtk_label_set_line_wrap(GTK_LABEL(warning_label), TRUE);
|
| + gtk_widget_set_size_request(warning_label, kRightColumnWidth, -1);
|
| + gtk_misc_set_alignment(GTK_MISC(warning_label), 0.0, 0.5);
|
| + gtk_label_set_selectable(GTK_LABEL(warning_label), TRUE);
|
| + gtk_box_pack_start(GTK_BOX(right_column_area), warning_label, TRUE, TRUE, 0);
|
| +
|
| + // Severe label
|
| + std::string severe_text = l10n_util::GetStringUTF8(
|
| + IDS_EXTENSION_PROMPT_WARNING_SEVERE);
|
| + GtkWidget* severe_label = MakeMarkupLabel("<span weight=\"bold\">%s</span>",
|
| + severe_text);
|
| + GdkColor red = GDK_COLOR_RGB(0xff, 0x00, 0x00);
|
| + gtk_widget_modify_fg(severe_label, GTK_STATE_NORMAL, &red);
|
| + gtk_misc_set_alignment(GTK_MISC(severe_label), 0.0, 0.5);
|
| + gtk_label_set_selectable(GTK_LABEL(severe_label), TRUE);
|
| + gtk_box_pack_start(GTK_BOX(right_column_area), severe_label, TRUE, TRUE, 0);
|
| +
|
| + g_signal_connect(dialog, "response", G_CALLBACK(OnDialogResponse), delegate);
|
| + gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE);
|
| + gtk_widget_show_all(dialog);
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +void ExtensionInstallUI::ShowExtensionInstallPrompt(Profile* profile,
|
| + Delegate* delegate,
|
| + Extension* extension,
|
| + SkBitmap* icon) {
|
| + Browser* browser = BrowserList::GetLastActiveWithProfile(profile);
|
| + if (!browser) {
|
| + delegate->ContinueInstall();
|
| + return;
|
| + }
|
| +
|
| + BrowserWindowGtk* browser_window = static_cast<BrowserWindowGtk*>(
|
| + browser->window());
|
| + if (!browser_window) {
|
| + delegate->AbortInstall();
|
| + return;
|
| + }
|
| +
|
| + ShowInstallPromptDialog(browser_window->window(), icon, extension, delegate);
|
| +}
|
|
|