| 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
|
| index 6671b00cd0aa00fb8a2c8ffcac6ee16bee4fe006..e0e525fe928ce2d2edb4dac59bd7ed501dd59462 100644
|
| --- a/chrome/browser/ui/gtk/web_intent_picker_gtk.cc
|
| +++ b/chrome/browser/ui/gtk/web_intent_picker_gtk.cc
|
| @@ -8,6 +8,7 @@
|
|
|
| #include "base/bind.h"
|
| #include "base/callback.h"
|
| +#include "base/utf_string_conversions.h"
|
| #include "chrome/browser/favicon/favicon_service.h"
|
| #include "chrome/browser/profiles/profile.h"
|
| #include "chrome/browser/ui/browser.h"
|
| @@ -21,6 +22,7 @@
|
| #include "chrome/browser/ui/gtk/tab_contents_container_gtk.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/intents/web_intent_picker_model.h"
|
| #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
|
| #include "content/browser/renderer_host/render_view_host.h"
|
| #include "content/browser/renderer_host/render_widget_host_view_gtk.h"
|
| @@ -31,9 +33,6 @@
|
| #include "content/public/browser/web_contents_view.h"
|
| #include "googleurl/src/gurl.h"
|
| #include "grit/generated_resources.h"
|
| -#include "grit/theme_resources.h"
|
| -#include "grit/theme_resources_standard.h"
|
| -#include "grit/ui_resources.h"
|
| #include "ui/base/gtk/gtk_hig_constants.h"
|
| #include "ui/base/l10n/l10n_util.h"
|
| #include "ui/base/resource/resource_bundle.h"
|
| @@ -55,23 +54,14 @@ const int kWebStoreLabelLength = 300;
|
| // The pixel size of the label at the bottom of the picker.
|
| const int kWebStoreLabelPixelSize = 11;
|
|
|
| -// How much to scale the the buttons up from their favicon size.
|
| -const int kServiceButtonScale = 3;
|
| -
|
| GtkThemeService *GetThemeService(TabContentsWrapper* wrapper) {
|
| return GtkThemeService::GetFrom(wrapper->profile());
|
| }
|
|
|
| -// Set the image of |button| to |pixbuf|, and scale the button up by
|
| -// |kServiceButtonScale|.
|
| +// Set the image of |button| to |pixbuf|.
|
| void SetServiceButtonImage(GtkWidget* button, GdkPixbuf* pixbuf) {
|
| - int width = gdk_pixbuf_get_width(pixbuf);
|
| - int height = gdk_pixbuf_get_height(pixbuf);
|
| - gtk_button_set_image(GTK_BUTTON(button),
|
| - gtk_image_new_from_pixbuf(pixbuf));
|
| - gtk_widget_set_size_request(button,
|
| - width * kServiceButtonScale,
|
| - height * kServiceButtonScale);
|
| + gtk_button_set_image(GTK_BUTTON(button), gtk_image_new_from_pixbuf(pixbuf));
|
| + gtk_button_set_image_position(GTK_BUTTON(button), GTK_POS_LEFT);
|
| }
|
|
|
| } // namespace
|
| @@ -79,22 +69,28 @@ void SetServiceButtonImage(GtkWidget* button, GdkPixbuf* pixbuf) {
|
| // static
|
| WebIntentPicker* WebIntentPicker::Create(Browser* browser,
|
| TabContentsWrapper* wrapper,
|
| - WebIntentPickerDelegate* delegate) {
|
| - return new WebIntentPickerGtk(browser, wrapper, delegate);
|
| + WebIntentPickerDelegate* delegate,
|
| + WebIntentPickerModel* model) {
|
| + return new WebIntentPickerGtk(browser, wrapper, delegate, model);
|
| }
|
|
|
| WebIntentPickerGtk::WebIntentPickerGtk(Browser* browser,
|
| TabContentsWrapper* wrapper,
|
| - WebIntentPickerDelegate* delegate)
|
| + WebIntentPickerDelegate* delegate,
|
| + WebIntentPickerModel* model)
|
| : wrapper_(wrapper),
|
| delegate_(delegate),
|
| + model_(model),
|
| contents_(NULL),
|
| - button_hbox_(NULL),
|
| + button_vbox_(NULL),
|
| bubble_(NULL),
|
| browser_(browser) {
|
| DCHECK(delegate_ != NULL);
|
| DCHECK(browser);
|
| DCHECK(browser->window());
|
| +
|
| + model_->set_observer(this);
|
| +
|
| BrowserWindowGtk* browser_window =
|
| BrowserWindowGtk::GetBrowserWindowForNativeWindow(
|
| browser->window()->GetNativeHandle());
|
| @@ -121,132 +117,42 @@ WebIntentPickerGtk::~WebIntentPickerGtk() {
|
| DCHECK(bubble_ == NULL) << "Should have closed window before destroying.";
|
| }
|
|
|
| -void WebIntentPickerGtk::SetServiceURLs(const std::vector<GURL>& urls) {
|
| - for (size_t i = 0; i < urls.size(); ++i) {
|
| +void WebIntentPickerGtk::OnModelChanged(WebIntentPickerModel* model) {
|
| + gtk_util::RemoveAllChildren(button_vbox_);
|
| +
|
| + for (size_t i = 0; i < model->GetItemCount(); ++i) {
|
| + const WebIntentPickerModel::Item& item = model->GetItemAt(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);
|
| +
|
| + gtk_widget_set_tooltip_text(button, item.url.spec().c_str());
|
| + gtk_button_set_label(GTK_BUTTON(button), UTF16ToUTF8(item.title).c_str());
|
| +
|
| + gtk_box_pack_start(GTK_BOX(button_vbox_), button, FALSE, FALSE, 0);
|
| g_signal_connect(button,
|
| "clicked",
|
| G_CALLBACK(OnServiceButtonClickThunk),
|
| this);
|
| - }
|
| -
|
| - // Add the '+' button, to use the Chrome Web Store.
|
| - GtkWidget* plus_button = gtk_button_new();
|
| - gtk_widget_set_tooltip_text(
|
| - plus_button,
|
| - l10n_util::GetStringUTF8(IDS_FIND_MORE_INTENT_HANDLER_TOOLTIP).c_str());
|
| - gtk_box_pack_start(GTK_BOX(button_hbox_), plus_button, FALSE, FALSE, 0);
|
|
|
| - ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
|
| - GdkPixbuf* icon_pixbuf = rb.GetNativeImageNamed(IDR_SIDETABS_NEW_TAB);
|
| - SetServiceButtonImage(plus_button, icon_pixbuf);
|
| -
|
| - gtk_widget_show_all(button_hbox_);
|
| -}
|
| -
|
| -void WebIntentPickerGtk::SetServiceIcon(size_t index, const SkBitmap& icon) {
|
| - if (icon.empty())
|
| - return;
|
| -
|
| - GtkWidget* button = GetServiceButton(index);
|
| + SetServiceButtonImage(button, item.favicon.ToGdkPixbuf());
|
| + }
|
|
|
| - GdkPixbuf* icon_pixbuf = gfx::GdkPixbufFromSkBitmap(&icon);
|
| - SetServiceButtonImage(button, icon_pixbuf);
|
| - g_object_unref(icon_pixbuf);
|
| + gtk_widget_show_all(button_vbox_);
|
| }
|
|
|
| -void WebIntentPickerGtk::SetDefaultServiceIcon(size_t index) {
|
| +void WebIntentPickerGtk::OnFaviconChanged(WebIntentPickerModel* model,
|
| + size_t index) {
|
| + const WebIntentPickerModel::Item& item = model->GetItemAt(index);
|
| GtkWidget* button = GetServiceButton(index);
|
| -
|
| - ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
|
| - GdkPixbuf* icon_pixbuf = rb.GetNativeImageNamed(IDR_DEFAULT_FAVICON);
|
| - SetServiceButtonImage(button, icon_pixbuf);
|
| -}
|
| -
|
| -void WebIntentPickerGtk::Close() {
|
| - bubble_->Close();
|
| - bubble_ = NULL;
|
| - if (inline_disposition_tab_contents_.get())
|
| - inline_disposition_tab_contents_->web_contents()->OnCloseStarted();
|
| -}
|
| -
|
| -void WebIntentPickerGtk::BubbleClosing(BubbleGtk* bubble,
|
| - bool closed_by_escape) {
|
| - delegate_->OnClosing();
|
| -}
|
| -
|
| -void WebIntentPickerGtk::OnCloseButtonClick(GtkWidget* button) {
|
| - delegate_->OnCancelled();
|
| - delegate_->OnClosing();
|
| -}
|
| -
|
| -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));
|
| -}
|
| -
|
| -void WebIntentPickerGtk::InitContents() {
|
| - GtkThemeService* theme_service = GetThemeService(wrapper_);
|
| -
|
| - contents_ = gtk_hbox_new(FALSE, ui::kContentAreaSpacing);
|
| - gtk_container_set_border_width(GTK_CONTAINER(contents_),
|
| - ui::kContentAreaBorder);
|
| -
|
| - ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
|
| - GdkPixbuf* image_pixbuf = rb.GetNativeImageNamed(IDR_PAGEINFO_INFO);
|
| - GtkWidget* image = gtk_image_new_from_pixbuf(image_pixbuf);
|
| - gtk_box_pack_start(GTK_BOX(contents_), image, FALSE, FALSE, 0);
|
| - gtk_misc_set_alignment(GTK_MISC(image), 0, 0);
|
| -
|
| - GtkWidget* vbox = gtk_vbox_new(FALSE, ui::kContentAreaSpacing);
|
| -
|
| - GtkWidget* label = theme_service->BuildLabel(
|
| - l10n_util::GetStringUTF8(IDS_CHOOSE_INTENT_HANDLER_MESSAGE).c_str(),
|
| - ui::kGdkBlack);
|
| - gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0);
|
| - gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
|
| -
|
| - gtk_widget_set_size_request(vbox, kMainContentWidth, -1);
|
| -
|
| - button_hbox_ = gtk_hbox_new(FALSE, ui::kControlSpacing);
|
| - gtk_box_pack_start(GTK_BOX(vbox), button_hbox_, TRUE, TRUE, 0);
|
| -
|
| - GtkWidget* cws_label = theme_service->BuildLabel(
|
| - l10n_util::GetStringUTF8(IDS_FIND_MORE_INTENT_HANDLER_MESSAGE).c_str(),
|
| - ui::kGdkBlack);
|
| - gtk_box_pack_start(GTK_BOX(vbox), cws_label, TRUE, TRUE, 0);
|
| - gtk_misc_set_alignment(GTK_MISC(cws_label), 0, 0);
|
| - gtk_util::SetLabelWidth(cws_label, kWebStoreLabelLength);
|
| - gtk_util::ForceFontSizePixels(cws_label, kWebStoreLabelPixelSize);
|
| -
|
| - gtk_box_pack_start(GTK_BOX(contents_), vbox, TRUE, TRUE, 0);
|
| -
|
| - close_button_.reset(
|
| - CustomDrawButton::CloseButton(GetThemeService(wrapper_)));
|
| - g_signal_connect(close_button_->widget(),
|
| - "clicked",
|
| - G_CALLBACK(OnCloseButtonClickThunk),
|
| - this);
|
| - gtk_widget_set_can_focus(close_button_->widget(), FALSE);
|
| -
|
| - GtkWidget* close_vbox = gtk_vbox_new(FALSE, 0);
|
| - gtk_box_pack_start(GTK_BOX(close_vbox), close_button_->widget(), FALSE, FALSE,
|
| - 0);
|
| - gtk_box_pack_end(GTK_BOX(contents_), close_vbox, FALSE, FALSE, 0);
|
| + SetServiceButtonImage(button, item.favicon.ToGdkPixbuf());
|
| }
|
|
|
| -void RemoveAllHelper(GtkWidget* widget, gpointer data) {
|
| - GtkWidget* parent = gtk_widget_get_parent(widget);
|
| - gtk_container_remove(GTK_CONTAINER(parent), widget);
|
| -}
|
| +void WebIntentPickerGtk::OnInlineDisposition(WebIntentPickerModel* model) {
|
| + const WebIntentPickerModel::Item& item = model->GetItemAt(
|
| + model->inline_disposition_index());
|
| + const GURL& url = item.url;
|
|
|
| -WebContents* WebIntentPickerGtk::SetInlineDisposition(const GURL& url) {
|
| - WebContents* web_contents = WebContents::Create(
|
| + content::WebContents* web_contents = content::WebContents::Create(
|
| browser_->profile(), NULL, MSG_ROUTING_NONE, NULL, NULL);
|
| inline_disposition_tab_contents_.reset(new TabContentsWrapper(web_contents));
|
| inline_disposition_delegate_.reset(new InlineDispositionDelegate);
|
| @@ -260,7 +166,7 @@ WebContents* WebIntentPickerGtk::SetInlineDisposition(const GURL& url) {
|
|
|
| // Replace the bubble picker contents with the inline disposition.
|
|
|
| - gtk_container_foreach(GTK_CONTAINER(contents_), RemoveAllHelper, NULL);
|
| + gtk_util::RemoveAllChildren(contents_);
|
|
|
| GtkWidget* service_hbox = gtk_hbox_new(FALSE, ui::kControlSpacing);
|
| // TODO(gbillock): Eventually get the service icon button here.
|
| @@ -297,11 +203,90 @@ WebContents* WebIntentPickerGtk::SetInlineDisposition(const GURL& url) {
|
| width, height);
|
| gtk_widget_show_all(contents_);
|
|
|
| - return inline_disposition_tab_contents_->web_contents();
|
| + delegate_->OnInlineDispositionWebContentsCreated(web_contents);
|
| +}
|
| +
|
| +void WebIntentPickerGtk::Close() {
|
| + bubble_->Close();
|
| + if (inline_disposition_tab_contents_.get())
|
| + inline_disposition_tab_contents_->web_contents()->OnCloseStarted();
|
| +}
|
| +
|
| +void WebIntentPickerGtk::BubbleClosing(BubbleGtk* bubble,
|
| + bool closed_by_escape) {
|
| + delegate_->OnClosing();
|
| +}
|
| +
|
| +void WebIntentPickerGtk::OnCloseButtonClick(GtkWidget* button) {
|
| + delegate_->OnCancelled();
|
| + delegate_->OnClosing();
|
| +}
|
| +
|
| +void WebIntentPickerGtk::OnDestroy(GtkWidget* button) {
|
| + // Destroy this object when the BubbleGtk is destroyed. It can't be "delete
|
| + // this" because this function happens in a callback.
|
| + MessageLoop::current()->DeleteSoon(FROM_HERE, this);
|
| + model_->set_observer(NULL);
|
| + bubble_ = NULL;
|
| +}
|
| +
|
| +void WebIntentPickerGtk::OnServiceButtonClick(GtkWidget* button) {
|
| + GList* button_list = gtk_container_get_children(GTK_CONTAINER(button_vbox_));
|
| + gint index = g_list_index(button_list, button);
|
| + DCHECK(index != -1);
|
| +
|
| + const WebIntentPickerModel::Item& item = model_->GetItemAt(index);
|
| +
|
| + delegate_->OnServiceChosen(static_cast<size_t>(index), item.disposition);
|
| +}
|
| +
|
| +void WebIntentPickerGtk::InitContents() {
|
| + GtkThemeService* theme_service = GetThemeService(wrapper_);
|
| +
|
| + // Main contents vbox.
|
| + contents_ = gtk_vbox_new(FALSE, ui::kContentAreaSpacing);
|
| + gtk_container_set_border_width(GTK_CONTAINER(contents_),
|
| + ui::kContentAreaBorder);
|
| + gtk_widget_set_size_request(contents_, kMainContentWidth, -1);
|
| +
|
| + // Hbox containing label and close button.
|
| + GtkWidget* header_hbox = gtk_hbox_new(FALSE, ui::kControlSpacing);
|
| + gtk_box_pack_start(GTK_BOX(contents_), header_hbox, TRUE, TRUE, 0);
|
| +
|
| + GtkWidget* label = theme_service->BuildLabel(
|
| + l10n_util::GetStringUTF8(IDS_CHOOSE_INTENT_HANDLER_MESSAGE).c_str(),
|
| + ui::kGdkBlack);
|
| + gtk_box_pack_start(GTK_BOX(header_hbox), label, TRUE, TRUE, 0);
|
| + gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
|
| +
|
| + close_button_.reset(
|
| + CustomDrawButton::CloseButton(GetThemeService(wrapper_)));
|
| + 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(header_hbox), close_button_->widget(),
|
| + FALSE, FALSE, 0);
|
| +
|
| + // Vbox containing all service buttons.
|
| + button_vbox_ = gtk_vbox_new(FALSE, ui::kControlSpacing);
|
| + gtk_box_pack_start(GTK_BOX(contents_), button_vbox_, TRUE, TRUE, 0);
|
| +
|
| + // Chrome Web Store label.
|
| + GtkWidget* cws_label = theme_service->BuildLabel(
|
| + l10n_util::GetStringUTF8(IDS_FIND_MORE_INTENT_HANDLER_MESSAGE).c_str(),
|
| + ui::kGdkBlack);
|
| + gtk_box_pack_start(GTK_BOX(contents_), cws_label, TRUE, TRUE, 0);
|
| + gtk_misc_set_alignment(GTK_MISC(cws_label), 0, 0);
|
| + gtk_util::SetLabelWidth(cws_label, kWebStoreLabelLength);
|
| + gtk_util::ForceFontSizePixels(cws_label, kWebStoreLabelPixelSize);
|
| +
|
| + g_signal_connect(contents_, "destroy", G_CALLBACK(&OnDestroyThunk), this);
|
| }
|
|
|
| GtkWidget* WebIntentPickerGtk::GetServiceButton(size_t index) {
|
| - GList* button_list = gtk_container_get_children(GTK_CONTAINER(button_hbox_));
|
| + GList* button_list = gtk_container_get_children(GTK_CONTAINER(button_vbox_));
|
| GtkWidget* button = GTK_WIDGET(g_list_nth_data(button_list, index));
|
| DCHECK(button != NULL);
|
|
|
| @@ -313,7 +298,6 @@ GtkWidget* WebIntentPickerGtk::GetServiceButton(size_t index) {
|
| WebIntentPickerGtk::InlineDispositionDelegate::InlineDispositionDelegate() {}
|
| WebIntentPickerGtk::InlineDispositionDelegate::~InlineDispositionDelegate() {}
|
|
|
| -
|
| bool WebIntentPickerGtk::InlineDispositionDelegate::IsPopupOrPanel(
|
| const WebContents* source) const {
|
| return true;
|
|
|