OLD | NEW |
| (Empty) |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "chrome/browser/ui/gtk/web_intent_picker_gtk.h" | |
6 | |
7 #include "chrome/browser/favicon/favicon_service.h" | |
8 #include "chrome/browser/profiles/profile.h" | |
9 #include "chrome/browser/ui/gtk/custom_button.h" | |
10 #include "chrome/browser/ui/gtk/gtk_theme_service.h" | |
11 #include "chrome/browser/ui/gtk/gtk_util.h" | |
12 #include "chrome/browser/ui/intents/web_intent_picker_controller.h" | |
13 #include "chrome/browser/ui/intents/web_intent_picker_delegate.h" | |
14 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" | |
15 #include "content/browser/tab_contents/tab_contents.h" | |
16 #include "content/common/content_notification_types.h" | |
17 #include "googleurl/src/gurl.h" | |
18 #include "grit/generated_resources.h" | |
19 #include "grit/ui_resources.h" | |
20 #include "ui/base/l10n/l10n_util.h" | |
21 #include "ui/base/resource/resource_bundle.h" | |
22 #include "ui/gfx/gtk_util.h" | |
23 #include "ui/gfx/image/image.h" | |
24 | |
25 namespace { | |
26 | |
27 GtkThemeService *GetThemeService(TabContents* tab_contents) { | |
28 Profile* profile = Profile::FromBrowserContext( | |
29 tab_contents->browser_context()); | |
30 return GtkThemeService::GetFrom(profile); | |
31 } | |
32 | |
33 } // namespace | |
34 | |
35 // static | |
36 WebIntentPicker* WebIntentPicker::Create(TabContents* tab_contents, | |
37 WebIntentPickerDelegate* delegate) { | |
38 return new WebIntentPickerGtk(tab_contents, delegate); | |
39 } | |
40 | |
41 WebIntentPickerGtk::WebIntentPickerGtk(TabContents* tab_contents, | |
42 WebIntentPickerDelegate* delegate) | |
43 : tab_contents_(tab_contents), | |
44 delegate_(delegate), | |
45 window_(NULL) { | |
46 DCHECK(delegate_ != NULL); | |
47 root_.Own(gtk_vbox_new(FALSE, gtk_util::kContentAreaBorder)); | |
48 GtkWidget* hbox = gtk_hbox_new(FALSE, 0); | |
49 GtkWidget* label = gtk_label_new( | |
50 l10n_util::GetStringUTF8(IDS_CHOOSE_INTENT_HANDLER_MESSAGE).c_str()); | |
51 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0); | |
52 | |
53 close_button_.reset( | |
54 CustomDrawButton::CloseButton(GetThemeService(tab_contents_))); | |
55 g_signal_connect(close_button_->widget(), | |
56 "clicked", | |
57 G_CALLBACK(OnCloseButtonClickThunk), | |
58 this); | |
59 gtk_widget_set_can_focus(close_button_->widget(), FALSE); | |
60 gtk_box_pack_end(GTK_BOX(hbox), close_button_->widget(), FALSE, FALSE, 0); | |
61 | |
62 gtk_box_pack_start(GTK_BOX(root_.get()), hbox, FALSE, FALSE, 0); | |
63 | |
64 button_hbox_ = gtk_hbox_new(FALSE, gtk_util::kContentAreaBorder); | |
65 gtk_box_pack_start(GTK_BOX(root_.get()), button_hbox_, TRUE, TRUE, 0); | |
66 } | |
67 | |
68 WebIntentPickerGtk::~WebIntentPickerGtk() { | |
69 DCHECK(window_ == NULL) << "Should have closed window before destroying."; | |
70 } | |
71 | |
72 void WebIntentPickerGtk::SetServiceURLs(const std::vector<GURL>& urls) { | |
73 for (size_t i = 0; i < urls.size(); ++i) { | |
74 GtkWidget* button = gtk_button_new(); | |
75 gtk_widget_set_tooltip_text(button, urls[i].spec().c_str()); | |
76 gtk_box_pack_start(GTK_BOX(button_hbox_), button, FALSE, FALSE, 0); | |
77 g_signal_connect(button, | |
78 "clicked", | |
79 G_CALLBACK(OnServiceButtonClickThunk), | |
80 this); | |
81 } | |
82 | |
83 gtk_widget_show_all(button_hbox_); | |
84 } | |
85 | |
86 void WebIntentPickerGtk::SetServiceIcon(size_t index, const SkBitmap& icon) { | |
87 if (icon.empty()) | |
88 return; | |
89 | |
90 GList* button_list = gtk_container_get_children(GTK_CONTAINER(button_hbox_)); | |
91 GtkButton* button = GTK_BUTTON(g_list_nth_data(button_list, index)); | |
92 DCHECK(button != NULL) << "Invalid index."; | |
93 | |
94 GdkPixbuf* icon_pixbuf = gfx::GdkPixbufFromSkBitmap(&icon); | |
95 gtk_button_set_image(button, gtk_image_new_from_pixbuf(icon_pixbuf)); | |
96 g_object_unref(icon_pixbuf); | |
97 } | |
98 | |
99 void WebIntentPickerGtk::SetDefaultServiceIcon(size_t index) { | |
100 GList* button_list = gtk_container_get_children(GTK_CONTAINER(button_hbox_)); | |
101 GtkButton* button = GTK_BUTTON(g_list_nth_data(button_list, index)); | |
102 DCHECK(button != NULL) << "Invalid index."; | |
103 | |
104 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); | |
105 GdkPixbuf* icon_pixbuf = rb.GetNativeImageNamed(IDR_DEFAULT_FAVICON); | |
106 gtk_button_set_image(button, gtk_image_new_from_pixbuf(icon_pixbuf)); | |
107 } | |
108 | |
109 void WebIntentPickerGtk::Show() { | |
110 DCHECK(window_ == NULL) << "Show already called."; | |
111 window_ = new ConstrainedWindowGtk(tab_contents_, this); | |
112 } | |
113 | |
114 void WebIntentPickerGtk::Close() { | |
115 DCHECK(window_ != NULL) << "Show not called."; | |
116 window_->CloseConstrainedWindow(); | |
117 window_ = NULL; | |
118 } | |
119 | |
120 GtkWidget* WebIntentPickerGtk::GetWidgetRoot() { | |
121 return root_.get(); | |
122 } | |
123 | |
124 GtkWidget* WebIntentPickerGtk::GetFocusWidget() { | |
125 return root_.get(); | |
126 } | |
127 | |
128 void WebIntentPickerGtk::DeleteDelegate() { | |
129 MessageLoop::current()->DeleteSoon(FROM_HERE, this); | |
130 } | |
131 | |
132 void WebIntentPickerGtk::OnCloseButtonClick(GtkWidget* button) { | |
133 delegate_->OnCancelled(); | |
134 } | |
135 | |
136 void WebIntentPickerGtk::OnServiceButtonClick(GtkWidget* button) { | |
137 GList* button_list = gtk_container_get_children(GTK_CONTAINER(button_hbox_)); | |
138 gint index = g_list_index(button_list, button); | |
139 DCHECK(index != -1); | |
140 | |
141 delegate_->OnServiceChosen(static_cast<size_t>(index)); | |
142 } | |
OLD | NEW |