Index: chrome/browser/gtk/create_application_shortcuts_dialog_gtk.cc |
=================================================================== |
--- chrome/browser/gtk/create_application_shortcuts_dialog_gtk.cc (revision 71352) |
+++ chrome/browser/gtk/create_application_shortcuts_dialog_gtk.cc (working copy) |
@@ -1,330 +0,0 @@ |
-// Copyright (c) 2010 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 "chrome/browser/gtk/create_application_shortcuts_dialog_gtk.h" |
- |
-#include <string> |
- |
-#include "app/l10n_util.h" |
-#include "base/environment.h" |
-#include "base/utf_string_conversions.h" |
-#include "chrome/browser/browser_thread.h" |
-#include "chrome/browser/gtk/gtk_util.h" |
-#include "chrome/browser/shell_integration.h" |
-#include "chrome/browser/tab_contents/tab_contents.h" |
-#include "chrome/browser/tab_contents/tab_contents_delegate.h" |
-#include "chrome/browser/web_applications/web_app.h" |
-#include "chrome/common/extensions/extension.h" |
-#include "chrome/common/extensions/extension_resource.h" |
-#include "gfx/gtk_util.h" |
-#include "grit/chromium_strings.h" |
-#include "grit/generated_resources.h" |
-#include "grit/locale_settings.h" |
- |
-namespace { |
- |
-// Size (in pixels) of the icon preview. |
-const int kIconPreviewSizePixels = 32; |
- |
-// Height (in lines) of the shortcut description label. |
-const int kDescriptionLabelHeightLines = 3; |
- |
-} // namespace |
- |
-// static |
-void CreateWebApplicationShortcutsDialogGtk::Show(GtkWindow* parent, |
- TabContents* tab_contents) { |
- new CreateWebApplicationShortcutsDialogGtk(parent, tab_contents); |
-} |
- |
-void CreateChromeApplicationShortcutsDialogGtk::Show(GtkWindow* parent, |
- const Extension* app) { |
- new CreateChromeApplicationShortcutsDialogGtk(parent, app); |
-} |
- |
- |
-CreateApplicationShortcutsDialogGtk::CreateApplicationShortcutsDialogGtk( |
- GtkWindow* parent) |
- : parent_(parent), |
- error_dialog_(NULL) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- |
- // Will be balanced by Release later. |
- AddRef(); |
-} |
- |
-void CreateApplicationShortcutsDialogGtk::CreateIconPixBuf( |
- const SkBitmap& bitmap) { |
- // Prepare the icon. Try to scale it if it's too small, otherwise it would |
- // look weird. |
- GdkPixbuf* pixbuf = gfx::GdkPixbufFromSkBitmap(&shortcut_info_.favicon); |
- int pixbuf_width = gdk_pixbuf_get_width(pixbuf); |
- int pixbuf_height = gdk_pixbuf_get_height(pixbuf); |
- if (pixbuf_width == pixbuf_height && pixbuf_width < kIconPreviewSizePixels) { |
- // Only scale the pixbuf if it's a square (for simplicity). |
- // Generally it should be square, if it's a favicon or app icon. |
- // Use the highest quality interpolation. The scaling is |
- // going to have low quality anyway, because the initial image |
- // is likely small. |
- favicon_pixbuf_ = gdk_pixbuf_scale_simple(pixbuf, |
- kIconPreviewSizePixels, |
- kIconPreviewSizePixels, |
- GDK_INTERP_HYPER); |
- g_object_unref(pixbuf); |
- } else { |
- favicon_pixbuf_ = pixbuf; |
- } |
-} |
- |
-void CreateApplicationShortcutsDialogGtk::CreateDialogBox(GtkWindow* parent) { |
- // Build the dialog. |
- create_dialog_ = gtk_dialog_new_with_buttons( |
- l10n_util::GetStringUTF8(IDS_CREATE_SHORTCUTS_TITLE).c_str(), |
- parent, |
- (GtkDialogFlags) (GTK_DIALOG_MODAL | GTK_DIALOG_NO_SEPARATOR), |
- GTK_STOCK_CANCEL, |
- GTK_RESPONSE_REJECT, |
- NULL); |
- gtk_widget_realize(create_dialog_); |
- gtk_window_set_resizable(GTK_WINDOW(create_dialog_), false); |
- gtk_util::AddButtonToDialog(create_dialog_, |
- l10n_util::GetStringUTF8(IDS_CREATE_SHORTCUTS_COMMIT).c_str(), |
- GTK_STOCK_APPLY, GTK_RESPONSE_ACCEPT); |
- |
- GtkWidget* content_area = GTK_DIALOG(create_dialog_)->vbox; |
- gtk_box_set_spacing(GTK_BOX(content_area), gtk_util::kContentAreaSpacing); |
- |
- GtkWidget* vbox = gtk_vbox_new(FALSE, gtk_util::kControlSpacing); |
- gtk_container_add(GTK_CONTAINER(content_area), vbox); |
- |
- // Create a box containing basic information about the new shortcut: an image |
- // on the left, and a description on the right. |
- GtkWidget* hbox = gtk_hbox_new(FALSE, gtk_util::kControlSpacing); |
- gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); |
- gtk_container_set_border_width(GTK_CONTAINER(hbox), |
- gtk_util::kControlSpacing); |
- |
- // Put the icon preview in place. |
- GtkWidget* favicon_image = gtk_image_new_from_pixbuf(favicon_pixbuf_); |
- gtk_box_pack_start(GTK_BOX(hbox), favicon_image, FALSE, FALSE, 0); |
- |
- // Create the label with application shortcut description. |
- GtkWidget* description_label = gtk_label_new(NULL); |
- gtk_box_pack_start(GTK_BOX(hbox), description_label, FALSE, FALSE, 0); |
- gtk_label_set_line_wrap(GTK_LABEL(description_label), TRUE); |
- gtk_widget_realize(description_label); |
- |
- // Set the size request on the label so it knows where to line wrap. The width |
- // is the desired size of the dialog less the space reserved for padding and |
- // the image. |
- int label_width, label_height; |
- gtk_util::GetWidgetSizeFromResources( |
- description_label, |
- IDS_CREATE_SHORTCUTS_DIALOG_WIDTH_CHARS, -1, &label_width, NULL); |
- label_width -= gtk_util::kControlSpacing * 3 + |
- gdk_pixbuf_get_width(favicon_pixbuf_); |
- gtk_util::GetWidgetSizeFromCharacters( |
- description_label, -1, kDescriptionLabelHeightLines, NULL, &label_height); |
- gtk_widget_set_size_request(description_label, label_width, label_height); |
- gtk_misc_set_alignment(GTK_MISC(description_label), 0, 0.5); |
- std::string description(UTF16ToUTF8(shortcut_info_.description)); |
- std::string title(UTF16ToUTF8(shortcut_info_.title)); |
- gtk_label_set_text(GTK_LABEL(description_label), |
- (description.empty() ? title : description).c_str()); |
- |
- // Label on top of the checkboxes. |
- GtkWidget* checkboxes_label = gtk_label_new( |
- l10n_util::GetStringUTF8(IDS_CREATE_SHORTCUTS_LABEL).c_str()); |
- gtk_misc_set_alignment(GTK_MISC(checkboxes_label), 0, 0); |
- gtk_box_pack_start(GTK_BOX(vbox), checkboxes_label, FALSE, FALSE, 0); |
- |
- // Desktop checkbox. |
- desktop_checkbox_ = gtk_check_button_new_with_label( |
- l10n_util::GetStringUTF8(IDS_CREATE_SHORTCUTS_DESKTOP_CHKBOX).c_str()); |
- gtk_box_pack_start(GTK_BOX(vbox), desktop_checkbox_, FALSE, FALSE, 0); |
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(desktop_checkbox_), true); |
- g_signal_connect(desktop_checkbox_, "toggled", |
- G_CALLBACK(OnToggleCheckboxThunk), this); |
- |
- // Menu checkbox. |
- menu_checkbox_ = gtk_check_button_new_with_label( |
- l10n_util::GetStringUTF8(IDS_CREATE_SHORTCUTS_MENU_CHKBOX).c_str()); |
- gtk_box_pack_start(GTK_BOX(vbox), menu_checkbox_, FALSE, FALSE, 0); |
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(menu_checkbox_), false); |
- g_signal_connect(menu_checkbox_, "toggled", |
- G_CALLBACK(OnToggleCheckboxThunk), this); |
- |
- g_signal_connect(create_dialog_, "response", |
- G_CALLBACK(OnCreateDialogResponseThunk), this); |
- gtk_widget_show_all(create_dialog_); |
-} |
- |
-CreateApplicationShortcutsDialogGtk::~CreateApplicationShortcutsDialogGtk() { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- |
- gtk_widget_destroy(create_dialog_); |
- |
- if (error_dialog_) |
- gtk_widget_destroy(error_dialog_); |
- |
- g_object_unref(favicon_pixbuf_); |
-} |
- |
-void CreateApplicationShortcutsDialogGtk::OnCreateDialogResponse( |
- GtkWidget* widget, int response) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- |
- if (response == GTK_RESPONSE_ACCEPT) { |
- shortcut_info_.create_on_desktop = |
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(desktop_checkbox_)); |
- shortcut_info_.create_in_applications_menu = |
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(menu_checkbox_)); |
- BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, |
- NewRunnableMethod(this, |
- &CreateApplicationShortcutsDialogGtk::CreateDesktopShortcut, |
- shortcut_info_)); |
- |
- OnCreatedShortcut(); |
- } else { |
- Release(); |
- } |
-} |
- |
-void CreateApplicationShortcutsDialogGtk::OnErrorDialogResponse( |
- GtkWidget* widget, int response) { |
- Release(); |
-} |
- |
-void CreateApplicationShortcutsDialogGtk::CreateDesktopShortcut( |
- const ShellIntegration::ShortcutInfo& shortcut_info) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
- |
- scoped_ptr<base::Environment> env(base::Environment::Create()); |
- |
- std::string shortcut_template; |
- if (ShellIntegration::GetDesktopShortcutTemplate(env.get(), |
- &shortcut_template)) { |
- ShellIntegration::CreateDesktopShortcut(shortcut_info, |
- shortcut_template); |
- Release(); |
- } else { |
- BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
- NewRunnableMethod(this, |
- &CreateApplicationShortcutsDialogGtk::ShowErrorDialog)); |
- } |
-} |
- |
-void CreateApplicationShortcutsDialogGtk::ShowErrorDialog() { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- |
- // Hide the create dialog so that the user can no longer interact with it. |
- gtk_widget_hide(create_dialog_); |
- |
- error_dialog_ = gtk_dialog_new_with_buttons( |
- l10n_util::GetStringUTF8(IDS_CREATE_SHORTCUTS_ERROR_TITLE).c_str(), |
- NULL, |
- (GtkDialogFlags) (GTK_DIALOG_NO_SEPARATOR), |
- GTK_STOCK_OK, |
- GTK_RESPONSE_ACCEPT, |
- NULL); |
- gtk_widget_realize(error_dialog_); |
- gtk_util::SetWindowSizeFromResources( |
- GTK_WINDOW(error_dialog_), |
- IDS_CREATE_SHORTCUTS_ERROR_DIALOG_WIDTH_CHARS, |
- IDS_CREATE_SHORTCUTS_ERROR_DIALOG_HEIGHT_LINES, |
- false); // resizable |
- GtkWidget* content_area = GTK_DIALOG(error_dialog_)->vbox; |
- gtk_box_set_spacing(GTK_BOX(content_area), gtk_util::kContentAreaSpacing); |
- |
- GtkWidget* vbox = gtk_vbox_new(FALSE, gtk_util::kControlSpacing); |
- gtk_container_add(GTK_CONTAINER(content_area), vbox); |
- |
- // Label on top of the checkboxes. |
- GtkWidget* description = gtk_label_new( |
- l10n_util::GetStringFUTF8( |
- IDS_CREATE_SHORTCUTS_ERROR_LABEL, |
- l10n_util::GetStringUTF16(IDS_PRODUCT_NAME)).c_str()); |
- gtk_label_set_line_wrap(GTK_LABEL(description), TRUE); |
- gtk_misc_set_alignment(GTK_MISC(description), 0, 0); |
- gtk_box_pack_start(GTK_BOX(vbox), description, FALSE, FALSE, 0); |
- |
- g_signal_connect(error_dialog_, "response", |
- G_CALLBACK(OnErrorDialogResponseThunk), this); |
- gtk_widget_show_all(error_dialog_); |
-} |
- |
-void CreateApplicationShortcutsDialogGtk::OnToggleCheckbox(GtkWidget* sender) { |
- gboolean can_accept = FALSE; |
- |
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(desktop_checkbox_)) || |
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(menu_checkbox_))) { |
- can_accept = TRUE; |
- } |
- |
- gtk_dialog_set_response_sensitive(GTK_DIALOG(create_dialog_), |
- GTK_RESPONSE_ACCEPT, |
- can_accept); |
-} |
- |
-CreateWebApplicationShortcutsDialogGtk::CreateWebApplicationShortcutsDialogGtk( |
- GtkWindow* parent, |
- TabContents* tab_contents) |
- : CreateApplicationShortcutsDialogGtk(parent), |
- tab_contents_(tab_contents) { |
- |
- // Get shortcut information now, it's needed for our UI. |
- web_app::GetShortcutInfoForTab(tab_contents_, &shortcut_info_); |
- CreateIconPixBuf(shortcut_info_.favicon); |
- |
- CreateDialogBox(parent); |
-} |
- |
-void CreateWebApplicationShortcutsDialogGtk::OnCreatedShortcut() { |
- if (tab_contents_->delegate()) |
- tab_contents_->delegate()->ConvertContentsToApplication(tab_contents_); |
-} |
- |
-CreateChromeApplicationShortcutsDialogGtk:: |
- CreateChromeApplicationShortcutsDialogGtk( |
- GtkWindow* parent, |
- const Extension* app) |
- : CreateApplicationShortcutsDialogGtk(parent), |
- app_(app), |
- ALLOW_THIS_IN_INITIALIZER_LIST(tracker_(this)) { |
- |
- // Get shortcut information now, it's needed for our UI. |
- shortcut_info_.extension_id = UTF8ToUTF16(app_->id()); |
- shortcut_info_.url = GURL(app_->launch_web_url()); |
- shortcut_info_.title = UTF8ToUTF16(app_->name()); |
- shortcut_info_.description = UTF8ToUTF16(app_->description()); |
- |
- // Get the icon. |
- const gfx::Size max_size(kIconPreviewSizePixels, kIconPreviewSizePixels); |
- ExtensionResource icon_resource = app_->GetIconResource( |
- kIconPreviewSizePixels, ExtensionIconSet::MATCH_BIGGER); |
- |
- // If no icon exists that is the desired size or larger, get the |
- // largest icon available: |
- if (icon_resource.empty()) |
- icon_resource = app_->GetIconResource( |
- kIconPreviewSizePixels, ExtensionIconSet::MATCH_SMALLER); |
- |
- tracker_.LoadImage(app_, |
- icon_resource, |
- max_size, |
- ImageLoadingTracker::DONT_CACHE); |
-} |
- |
-// Called by tracker_ when the app's icon is loaded. |
-void CreateChromeApplicationShortcutsDialogGtk::OnImageLoaded( |
- SkBitmap* image, ExtensionResource resource, int index) { |
- if (image->isNull()) { |
- NOTREACHED() << "Corrupt image in profile?"; |
- return; |
- } |
- shortcut_info_.favicon = *image; |
- |
- CreateIconPixBuf(*image); |
- CreateDialogBox(parent_); |
-} |