Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(94)

Side by Side Diff: chrome/browser/ui/gtk/script_bubble_gtk.cc

Issue 11348304: Implement script bubble for GTK. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2012 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/script_bubble_gtk.h"
6
7 #include <string>
8 #include <vector>
9
10 #include "base/i18n/rtl.h"
11 #include "base/string_number_conversions.h"
12 #include "chrome/browser/extensions/extension_service.h"
13 #include "chrome/browser/extensions/extension_system.h"
14 #include "chrome/browser/extensions/image_loader.h"
15 #include "chrome/browser/extensions/script_bubble_controller.h"
16 #include "chrome/browser/extensions/tab_helper.h"
17 #include "chrome/browser/profiles/profile.h"
18 #include "chrome/browser/ui/gtk/gtk_theme_service.h"
19 #include "chrome/common/extensions/extension.h"
20 #include "chrome/common/extensions/extension_set.h"
21 #include "chrome/common/url_constants.h"
22 #include "content/public/browser/web_contents.h"
23 #include "grit/generated_resources.h"
24 #include "grit/theme_resources.h"
25 #include "grit/ui_resources.h"
26 #include "ui/base/gtk/gtk_hig_constants.h"
27 #include "ui/base/l10n/l10n_util.h"
28
29 using content::WebContents;
30 using content::OpenURLParams;
31 using content::Referrer;
32 using extensions::Extension;
33 using extensions::ExtensionSystem;
34 using extensions::TabHelper;
35 using extensions::ImageLoader;
36
37 namespace {
38
39 // The currently open app-modal bubble singleton, or NULL if none is open.
40 ScriptBubbleGtk* g_bubble = NULL;
41
42 } // namespace
43
44
45 // static
46 void ScriptBubbleGtk::Show(GtkWidget* anchor, WebContents* web_contents) {
47 if (!g_bubble)
48 g_bubble = new ScriptBubbleGtk(anchor, web_contents);
49 }
50
51 // static
52 void ScriptBubbleGtk::OnItemLinkClickedThunk(GtkWidget* sender, void* user_data) {
Finnur 2012/11/29 22:00:16 nit: 80 cols
Aaron Boodman 2012/11/29 22:29:11 Done.
53 g_bubble->OnItemLinkClicked(sender);
54 }
55
56 ScriptBubbleGtk::ScriptBubbleGtk(GtkWidget* anchor, WebContents* web_contents)
57 : anchor_(anchor),
58 web_contents_(web_contents),
59 profile_(Profile::FromBrowserContext(web_contents_->GetBrowserContext())),
60 ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)) {
61 BuildBubble();
62 }
63
64 ScriptBubbleGtk::~ScriptBubbleGtk() {
65 }
66
67 void ScriptBubbleGtk::Close() {
68 if (bubble_)
69 bubble_->Close();
70 }
71
72 void ScriptBubbleGtk::BubbleClosing(BubbleGtk* bubble,
73 bool closed_by_escape) {
74 g_bubble = NULL;
75 delete this;
76 }
77
78 void ScriptBubbleGtk::BuildBubble() {
79 GtkThemeService* theme_provider = GtkThemeService::GetFrom(profile_);
80
81 GtkWidget* bubble_content = gtk_vbox_new(FALSE, ui::kControlSpacing);
82 gtk_container_set_border_width(GTK_CONTAINER(bubble_content),
83 ui::kContentAreaBorder);
84
85 extensions::TabHelper* tab_helper =
86 extensions::TabHelper::FromWebContents(web_contents_);
87 const std::set<std::string>& extensions_running_scripts =
88 tab_helper->script_bubble_controller()->extensions_running_scripts();
89 const ExtensionSet* loaded_extensions =
90 ExtensionSystem::Get(profile_)->extension_service()->extensions();
91
92 std::string heading_string =
93 l10n_util::GetStringUTF8(IDS_SCRIPT_BUBBLE_HEADLINE);
94 GtkWidget* heading = gtk_label_new(heading_string.c_str());
95 gtk_misc_set_alignment(GTK_MISC(heading), 0, 0);
96 gtk_box_pack_start(GTK_BOX(bubble_content), heading, FALSE, FALSE, 0);
97
98 for (std::set<std::string>::const_iterator iter =
99 extensions_running_scripts.begin();
100 iter != extensions_running_scripts.end(); ++iter) {
101 const Extension* extension = loaded_extensions->GetByID(*iter);
102 if (!extension)
103 continue;
104
105 GtkWidget* item = gtk_hbox_new(FALSE, ui::kControlSpacing);
106 gtk_box_pack_start(GTK_BOX(bubble_content), item, FALSE, FALSE, 0);
107
108 GtkWidget* image = gtk_image_new();
109 gtk_widget_set_usize(image, 16, 16);
110 gtk_box_pack_start(GTK_BOX(item), image, FALSE, FALSE, 0);
111
112 // Load the image asynchronously.
113 icon_controls_[extension->id()] = GTK_IMAGE(image);
114 ImageLoader::Get(profile_)->LoadImageAsync(
115 extension,
116 extension->GetIconResource(extension_misc::EXTENSION_ICON_BITTY,
117 ExtensionIconSet::MATCH_EXACTLY),
118 gfx::Size(extension_misc::EXTENSION_ICON_BITTY,
119 extension_misc::EXTENSION_ICON_BITTY),
120 base::Bind(&ScriptBubbleGtk::OnIconLoaded,
121 weak_ptr_factory_.GetWeakPtr(),
122 extension->id()));
123
124 GtkWidget* link = theme_provider->BuildChromeLinkButton(
125 extension->name().c_str());
126 gtk_box_pack_start(GTK_BOX(item), link, FALSE, FALSE, 0);
127 link_controls_[GTK_WIDGET(link)] = extension->id();
128 g_signal_connect(link, "button-press-event",
129 G_CALLBACK(&OnItemLinkClickedThunk), this);
130 }
131
132 BubbleGtk::ArrowLocationGtk arrow_location =
133 !base::i18n::IsRTL() ?
134 BubbleGtk::ARROW_LOCATION_TOP_RIGHT :
135 BubbleGtk::ARROW_LOCATION_TOP_LEFT;
136 bubble_ = BubbleGtk::Show(anchor_,
137 NULL,
138 bubble_content,
139 arrow_location,
140 BubbleGtk::MATCH_SYSTEM_THEME |
141 BubbleGtk::POPUP_WINDOW |
142 BubbleGtk::GRAB_INPUT,
143 theme_provider,
144 this);
145 }
146
147 void ScriptBubbleGtk::OnIconLoaded(const std::string& extension_id,
148 const gfx::Image& icon) {
149 gtk_image_set_from_pixbuf(
150 icon_controls_[extension_id],
151 (!icon.IsEmpty() ? icon :
152 GtkThemeService::GetFrom(profile_)->GetImageNamed(
153 IDR_EXTENSIONS_FAVICON)).ToGdkPixbuf());
154 }
155
156 void ScriptBubbleGtk::OnItemLinkClicked(GtkWidget* button) {
157 std::string link(chrome::kChromeUIExtensionsURL);
158 link += "?id=" + link_controls_[button];
159 web_contents_->OpenURL(OpenURLParams(GURL(link),
160 Referrer(),
161 NEW_FOREGROUND_TAB,
162 content::PAGE_TRANSITION_LINK,
163 false));
164 Close();
165 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698