| Index: chrome/browser/ui/gtk/web_intent_picker_gtk.cc
|
| diff --git a/chrome/browser/ui/gtk/web_intent_picker_gtk.cc b/chrome/browser/ui/gtk/web_intent_picker_gtk.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..90c790187550ff355a88388998aa1ac37696bbd3
|
| --- /dev/null
|
| +++ b/chrome/browser/ui/gtk/web_intent_picker_gtk.cc
|
| @@ -0,0 +1,142 @@
|
| +// Copyright (c) 2011 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/ui/gtk/web_intent_picker_gtk.h"
|
| +
|
| +#include "chrome/browser/favicon/favicon_service.h"
|
| +#include "chrome/browser/profiles/profile.h"
|
| +#include "chrome/browser/ui/gtk/custom_button.h"
|
| +#include "chrome/browser/ui/gtk/gtk_theme_service.h"
|
| +#include "chrome/browser/ui/gtk/gtk_util.h"
|
| +#include "chrome/browser/ui/intents/web_intent_picker_controller.h"
|
| +#include "chrome/browser/ui/intents/web_intent_picker_delegate.h"
|
| +#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
|
| +#include "content/browser/tab_contents/tab_contents.h"
|
| +#include "content/common/content_notification_types.h"
|
| +#include "googleurl/src/gurl.h"
|
| +#include "grit/generated_resources.h"
|
| +#include "grit/ui_resources.h"
|
| +#include "ui/base/l10n/l10n_util.h"
|
| +#include "ui/base/resource/resource_bundle.h"
|
| +#include "ui/gfx/gtk_util.h"
|
| +#include "ui/gfx/image/image.h"
|
| +
|
| +namespace {
|
| +
|
| +GtkThemeService *GetThemeService(TabContents* tab_contents) {
|
| + Profile* profile = Profile::FromBrowserContext(
|
| + tab_contents->browser_context());
|
| + return GtkThemeService::GetFrom(profile);
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +// static
|
| +WebIntentPicker* WebIntentPicker::Create(TabContents* tab_contents,
|
| + WebIntentPickerDelegate* delegate) {
|
| + return new WebIntentPickerGtk(tab_contents, delegate);
|
| +}
|
| +
|
| +WebIntentPickerGtk::WebIntentPickerGtk(TabContents* tab_contents,
|
| + WebIntentPickerDelegate* delegate)
|
| + : tab_contents_(tab_contents),
|
| + delegate_(delegate),
|
| + window_(NULL) {
|
| + DCHECK(delegate_ != NULL);
|
| + root_.Own(gtk_vbox_new(FALSE, gtk_util::kContentAreaBorder));
|
| + GtkWidget* hbox = gtk_hbox_new(FALSE, 0);
|
| + GtkWidget* label = gtk_label_new(
|
| + l10n_util::GetStringUTF8(IDS_CHOOSE_INTENT_HANDLER_MESSAGE).c_str());
|
| + gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);
|
| +
|
| + close_button_.reset(
|
| + CustomDrawButton::CloseButton(GetThemeService(tab_contents_)));
|
| + g_signal_connect(close_button_->widget(),
|
| + "clicked",
|
| + G_CALLBACK(OnCloseButtonClickThunk),
|
| + this);
|
| + gtk_widget_set_can_focus(close_button_->widget(), FALSE);
|
| + gtk_box_pack_end(GTK_BOX(hbox), close_button_->widget(), FALSE, FALSE, 0);
|
| +
|
| + gtk_box_pack_start(GTK_BOX(root_.get()), hbox, FALSE, FALSE, 0);
|
| +
|
| + button_hbox_ = gtk_hbox_new(FALSE, gtk_util::kContentAreaBorder);
|
| + gtk_box_pack_start(GTK_BOX(root_.get()), button_hbox_, TRUE, TRUE, 0);
|
| +}
|
| +
|
| +WebIntentPickerGtk::~WebIntentPickerGtk() {
|
| + DCHECK(window_ == NULL) << "Should have closed window before destroying.";
|
| +}
|
| +
|
| +void WebIntentPickerGtk::SetServiceURLs(const std::vector<GURL>& urls) {
|
| + for (size_t i = 0; i < urls.size(); ++i) {
|
| + GtkWidget* button = gtk_button_new();
|
| + gtk_widget_set_tooltip_text(button, urls[i].spec().c_str());
|
| + gtk_box_pack_start(GTK_BOX(button_hbox_), button, FALSE, FALSE, 0);
|
| + g_signal_connect(button,
|
| + "clicked",
|
| + G_CALLBACK(OnServiceButtonClickThunk),
|
| + this);
|
| + }
|
| +
|
| + gtk_widget_show_all(button_hbox_);
|
| +}
|
| +
|
| +void WebIntentPickerGtk::SetServiceIcon(size_t index, const SkBitmap& icon) {
|
| + if (icon.empty())
|
| + return;
|
| +
|
| + GList* button_list = gtk_container_get_children(GTK_CONTAINER(button_hbox_));
|
| + GtkButton* button = GTK_BUTTON(g_list_nth_data(button_list, index));
|
| + DCHECK(button != NULL) << "Invalid index.";
|
| +
|
| + GdkPixbuf* icon_pixbuf = gfx::GdkPixbufFromSkBitmap(&icon);
|
| + gtk_button_set_image(button, gtk_image_new_from_pixbuf(icon_pixbuf));
|
| + g_object_unref(icon_pixbuf);
|
| +}
|
| +
|
| +void WebIntentPickerGtk::SetDefaultServiceIcon(size_t index) {
|
| + GList* button_list = gtk_container_get_children(GTK_CONTAINER(button_hbox_));
|
| + GtkButton* button = GTK_BUTTON(g_list_nth_data(button_list, index));
|
| + DCHECK(button != NULL) << "Invalid index.";
|
| +
|
| + ResourceBundle& rb = ResourceBundle::GetSharedInstance();
|
| + GdkPixbuf* icon_pixbuf = rb.GetNativeImageNamed(IDR_DEFAULT_FAVICON);
|
| + gtk_button_set_image(button, gtk_image_new_from_pixbuf(icon_pixbuf));
|
| +}
|
| +
|
| +void WebIntentPickerGtk::Show() {
|
| + DCHECK(window_ == NULL) << "Show already called.";
|
| + window_ = tab_contents_->CreateConstrainedDialog(this);
|
| +}
|
| +
|
| +void WebIntentPickerGtk::Close() {
|
| + DCHECK(window_ != NULL) << "Show not called.";
|
| + window_->CloseConstrainedWindow();
|
| + window_ = NULL;
|
| +}
|
| +
|
| +GtkWidget* WebIntentPickerGtk::GetWidgetRoot() {
|
| + return root_.get();
|
| +}
|
| +
|
| +GtkWidget* WebIntentPickerGtk::GetFocusWidget() {
|
| + return root_.get();
|
| +}
|
| +
|
| +void WebIntentPickerGtk::DeleteDelegate() {
|
| + MessageLoop::current()->DeleteSoon(FROM_HERE, this);
|
| +}
|
| +
|
| +void WebIntentPickerGtk::OnCloseButtonClick(GtkWidget* button) {
|
| + delegate_->OnCancelled();
|
| +}
|
| +
|
| +void WebIntentPickerGtk::OnServiceButtonClick(GtkWidget* button) {
|
| + GList* button_list = gtk_container_get_children(GTK_CONTAINER(button_hbox_));
|
| + gint index = g_list_index(button_list, button);
|
| + DCHECK(index != -1);
|
| +
|
| + delegate_->OnServiceChosen(static_cast<size_t>(index));
|
| +}
|
|
|