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

Side by Side Diff: chrome/browser/gtk/browser_toolbar_view_gtk.cc

Issue 20245: Port the Menu class to GTK. (Closed)
Patch Set: Fixes for evanm Created 11 years, 10 months 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
OLDNEW
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/gtk/browser_toolbar_view_gtk.h" 5 #include "chrome/browser/gtk/browser_toolbar_view_gtk.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/base_paths_linux.h" 8 #include "base/base_paths_linux.h"
9 #include "base/path_service.h" 9 #include "base/path_service.h"
10 #include "chrome/app/chrome_dll_resource.h" 10 #include "chrome/app/chrome_dll_resource.h"
11 #include "chrome/browser/browser.h" 11 #include "chrome/browser/browser.h"
12 #include "chrome/browser/gtk/menu_gtk.h"
13 #include "chrome/browser/gtk/standard_menus.h"
12 #include "chrome/common/l10n_util.h" 14 #include "chrome/common/l10n_util.h"
13 15
14 #include "chromium_strings.h" 16 #include "chromium_strings.h"
15 #include "generated_resources.h" 17 #include "generated_resources.h"
16 18
17 // CustomDrawButton manages the lifetimes of some resources used to make a 19 // CustomDrawButton manages the lifetimes of some resources used to make a
18 // custom-drawn Gtk button. We use them on the toolbar. 20 // custom-drawn Gtk button. We use them on the toolbar.
19 class BrowserToolbarGtk::CustomDrawButton { 21 class BrowserToolbarGtk::CustomDrawButton {
20 public: 22 public:
21 // The constructor takes a filename, which is used as the base filename 23 // The constructor takes a filename, which is used as the base filename
22 // in loading the theme graphics pngs. This will be replaced by the 24 // in loading the theme graphics pngs. This will be replaced by the
23 // ResourceBundle graphics soon. 25 // ResourceBundle graphics soon.
24 CustomDrawButton(const std::string& filename); 26 explicit CustomDrawButton(const std::string& filename);
25 ~CustomDrawButton(); 27 ~CustomDrawButton();
26 28
27 GtkWidget* widget() const { return widget_; } 29 GtkWidget* widget() const { return widget_; }
28 30
29 private: 31 private:
30 // Load an image from a path. 32 // Load an image from a path.
31 // TODO(port): Temporary until ResourceBundle works. 33 // TODO(port): Temporary until ResourceBundle works.
32 GdkPixbuf* LoadImage(const std::string& filename); 34 GdkPixbuf* LoadImage(const std::string& filename);
33 35
34 // Load all the button images from a base theme filename. 36 // Load all the button images from a base theme filename.
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
133 BrowserToolbarGtk::~BrowserToolbarGtk() { 135 BrowserToolbarGtk::~BrowserToolbarGtk() {
134 } 136 }
135 137
136 void BrowserToolbarGtk::Init(Profile* profile) { 138 void BrowserToolbarGtk::Init(Profile* profile) {
137 toolbar_ = gtk_hbox_new(FALSE, 0); 139 toolbar_ = gtk_hbox_new(FALSE, 0);
138 gtk_container_set_border_width(GTK_CONTAINER(toolbar_), 6); 140 gtk_container_set_border_width(GTK_CONTAINER(toolbar_), 6);
139 141
140 toolbar_tooltips_ = gtk_tooltips_new(); 142 toolbar_tooltips_ = gtk_tooltips_new();
141 143
142 back_.reset(BuildToolbarButton("back", 144 back_.reset(BuildToolbarButton("back",
143 l10n_util::GetString(IDS_TOOLTIP_BACK))); 145 l10n_util::GetString(IDS_TOOLTIP_BACK),
146 false));
144 forward_.reset(BuildToolbarButton("forward", 147 forward_.reset(BuildToolbarButton("forward",
145 l10n_util::GetString(IDS_TOOLTIP_FORWARD))); 148 l10n_util::GetString(IDS_TOOLTIP_FORWARD),
149 false));
146 150
147 gtk_box_pack_start(GTK_BOX(toolbar_), gtk_label_new(" "), FALSE, FALSE, 0); 151 gtk_box_pack_start(GTK_BOX(toolbar_), gtk_label_new(" "), FALSE, FALSE, 0);
148 152
149 reload_.reset(BuildToolbarButton("reload", 153 reload_.reset(BuildToolbarButton("reload",
150 l10n_util::GetString(IDS_TOOLTIP_RELOAD))); 154 l10n_util::GetString(IDS_TOOLTIP_RELOAD),
155 false));
151 home_.reset(BuildToolbarButton("home", 156 home_.reset(BuildToolbarButton("home",
152 l10n_util::GetString(IDS_TOOLTIP_HOME))); 157 l10n_util::GetString(IDS_TOOLTIP_HOME),
158 false));
153 159
154 gtk_box_pack_start(GTK_BOX(toolbar_), gtk_label_new(" "), FALSE, FALSE, 0); 160 gtk_box_pack_start(GTK_BOX(toolbar_), gtk_label_new(" "), FALSE, FALSE, 0);
155 161
156 star_.reset(BuildToolbarButton("star", 162 star_.reset(BuildToolbarButton("star",
157 l10n_util::GetString(IDS_TOOLTIP_STAR))); 163 l10n_util::GetString(IDS_TOOLTIP_STAR),
164 false));
158 165
159 GtkWidget* entry = gtk_entry_new(); 166 GtkWidget* entry = gtk_entry_new();
160 gtk_widget_set_size_request(entry, 0, 27); 167 gtk_widget_set_size_request(entry, 0, 27);
161 gtk_box_pack_start(GTK_BOX(toolbar_), entry, TRUE, TRUE, 0); 168 gtk_box_pack_start(GTK_BOX(toolbar_), entry, TRUE, TRUE, 0);
162 169
163 go_.reset(BuildToolbarButton("go", L"")); 170 go_.reset(BuildToolbarButton("go", L"", false));
164 171
165 // TODO(port): these buttons need even stranger drawing than the others. 172 // TODO(port): these buttons need even stranger drawing than the others.
166 page_menu_.reset(BuildToolbarButton("menu_page", 173 page_menu_button_.reset(BuildToolbarButton("menu_page",
167 l10n_util::GetString(IDS_PAGEMENU_TOOLTIP))); 174 l10n_util::GetString(IDS_PAGEMENU_TOOLTIP), true));
168 175
169 // TODO(port): Need to get l10n_util::GetStringF working under linux to get 176 // TODO(port): Need to get l10n_util::GetStringF working under linux to get
170 // the correct string here. 177 // the correct string here.
171 app_menu_.reset(BuildToolbarButton("menu_chrome", 178 app_menu_button_.reset(BuildToolbarButton("menu_chrome",
172 l10n_util::GetString(IDS_APPMENU_TOOLTIP))); 179 l10n_util::GetString(IDS_APPMENU_TOOLTIP), true));
173 180
174 // TODO(erg): wchar_t mismatch on linux. Fix later. 181 // TODO(erg): wchar_t mismatch on linux. Fix later.
175 // show_home_button_.Init(prefs::kShowHomeButton, profile->GetPrefs(), this); 182 // show_home_button_.Init(prefs::kShowHomeButton, profile->GetPrefs(), this);
176 183
177 SetProfile(profile); 184 SetProfile(profile);
178 } 185 }
179 186
180 void BrowserToolbarGtk::AddToolbarToBox(GtkWidget* box) { 187 void BrowserToolbarGtk::AddToolbarToBox(GtkWidget* box) {
181 gtk_box_pack_start(GTK_BOX(box), toolbar_, FALSE, FALSE, 0); 188 gtk_box_pack_start(GTK_BOX(box), toolbar_, FALSE, FALSE, 0);
182 } 189 }
(...skipping 14 matching lines...) Expand all
197 widget = home_->widget(); 204 widget = home_->widget();
198 break; 205 break;
199 case IDC_STAR: 206 case IDC_STAR:
200 widget = star_->widget(); 207 widget = star_->widget();
201 break; 208 break;
202 } 209 }
203 if (widget) 210 if (widget)
204 gtk_widget_set_sensitive(widget, enabled); 211 gtk_widget_set_sensitive(widget, enabled);
205 } 212 }
206 213
214 bool BrowserToolbarGtk::IsCommandEnabled(int command_id) const {
215 return browser_->command_updater()->IsCommandEnabled(command_id);
216 }
217
218 bool BrowserToolbarGtk::IsItemChecked(int id) const {
219 if (!profile_)
220 return false;
221 if (id == IDC_SHOW_BOOKMARK_BAR)
222 return profile_->GetPrefs()->GetBoolean(prefs::kShowBookmarkBar);
223 // TODO(port): Fix this when we get some items that want checking!
224 return false;
225 }
226
227 void BrowserToolbarGtk::ExecuteCommand(int id) {
228 browser_->ExecuteCommand(id);
229 }
230
207 void BrowserToolbarGtk::SetProfile(Profile* profile) { 231 void BrowserToolbarGtk::SetProfile(Profile* profile) {
208 if (profile == profile_) 232 if (profile == profile_)
209 return; 233 return;
210 234
211 profile_ = profile; 235 profile_ = profile;
212 // TODO(erg): location_bar_ is a normal gtk text box right now. Change this 236 // TODO(erg): location_bar_ is a normal gtk text box right now. Change this
213 // when we get omnibox support. 237 // when we get omnibox support.
214 // location_bar_->SetProfile(profile); 238 // location_bar_->SetProfile(profile);
215 } 239 }
216 240
217 // TODO(port): This needs to deal with our styled pixmaps. 241 // TODO(port): This needs to deal with our styled pixmaps.
218 BrowserToolbarGtk::CustomDrawButton* BrowserToolbarGtk::BuildToolbarButton( 242 BrowserToolbarGtk::CustomDrawButton* BrowserToolbarGtk::BuildToolbarButton(
219 const std::string& filename, 243 const std::string& filename,
220 const std::wstring& localized_tooltip) { 244 const std::wstring& localized_tooltip,
245 bool menu_button) {
221 CustomDrawButton* button = new CustomDrawButton(filename); 246 CustomDrawButton* button = new CustomDrawButton(filename);
222 247
223 // TODO(erg): Mismatch between wstring and string. 248 // TODO(erg): Mismatch between wstring and string.
224 // gtk_tooltips_set_tip(GTK_TOOLTIPS(toolbar_tooltips_), 249 // gtk_tooltips_set_tip(GTK_TOOLTIPS(toolbar_tooltips_),
225 // GTK_WIDGET(back_), 250 // GTK_WIDGET(back_),
226 // localized_tooltip, localized_tooltip); 251 // localized_tooltip, localized_tooltip);
227 g_signal_connect(G_OBJECT(button->widget()), "clicked", 252 if (menu_button) {
228 G_CALLBACK(ButtonClickCallback), this); 253 g_signal_connect(G_OBJECT(button->widget()), "button_press_event",
254 G_CALLBACK(OnMenuButtonPressEvent), this);
255 } else {
256 g_signal_connect(G_OBJECT(button->widget()), "clicked",
257 G_CALLBACK(OnButtonClick), this);
258 }
259
229 gtk_box_pack_start(GTK_BOX(toolbar_), button->widget(), FALSE, FALSE, 0); 260 gtk_box_pack_start(GTK_BOX(toolbar_), button->widget(), FALSE, FALSE, 0);
230
231 return button; 261 return button;
232 } 262 }
233 263
234 /* static */ 264 /* static */
235 void BrowserToolbarGtk::ButtonClickCallback(GtkWidget* button, 265 void BrowserToolbarGtk::OnButtonClick(GtkWidget* button,
236 BrowserToolbarGtk* toolbar) { 266 BrowserToolbarGtk* toolbar) {
237 int tag = -1; 267 int tag = -1;
238 if (button == toolbar->back_->widget()) 268 if (button == toolbar->back_->widget())
239 tag = IDC_BACK; 269 tag = IDC_BACK;
240 else if (button == toolbar->forward_->widget()) 270 else if (button == toolbar->forward_->widget())
241 tag = IDC_FORWARD; 271 tag = IDC_FORWARD;
242 else if (button == toolbar->reload_->widget()) 272 else if (button == toolbar->reload_->widget())
243 tag = IDC_RELOAD; 273 tag = IDC_RELOAD;
244 else if (button == toolbar->home_->widget()) 274 else if (button == toolbar->home_->widget())
245 tag = IDC_HOME; 275 tag = IDC_HOME;
246 else if (button == toolbar->star_->widget()) 276 else if (button == toolbar->star_->widget())
247 tag = IDC_STAR; 277 tag = IDC_STAR;
248 278
249 if (tag != -1) { 279 DCHECK(tag != -1) << "Impossible button click callback";
250 toolbar->browser_->ExecuteCommand(tag); 280 toolbar->browser_->ExecuteCommand(tag);
251 } else { 281 }
252 // TODO(erg): The menu buttons are special; they need to spawn menus. 282
283 /* static */
284 gint BrowserToolbarGtk::OnMenuButtonPressEvent(GtkWidget* button,
285 GdkEvent* event,
286 BrowserToolbarGtk* toolbar) {
287 if (event->type == GDK_BUTTON_PRESS) {
288 GdkEventButton* event_button = reinterpret_cast<GdkEventButton*>(event);
289 if (event_button->button == 1) {
290 // We have a button press we should respond to.
291 if (button == toolbar->page_menu_button_->widget()) {
292 toolbar->RunPageMenu(event);
293 return TRUE;
294 } else if (button == toolbar->app_menu_button_->widget()) {
295 toolbar->RunAppMenu(event);
296 return TRUE;
297 }
298 }
253 } 299 }
300
301 return FALSE;
254 } 302 }
303
304 void BrowserToolbarGtk::RunPageMenu(GdkEvent* button_press_event) {
305 if (page_menu_ == NULL) {
306 page_menu_.reset(new MenuGtk(this, GetStandardPageMenu()));
307 }
308
309 page_menu_->Popup(page_menu_button_->widget(), button_press_event);
310 }
311
312 void BrowserToolbarGtk::RunAppMenu(GdkEvent* button_press_event) {
313 if (app_menu_ == NULL) {
314 app_menu_.reset(new MenuGtk(this, GetStandardAppMenu()));
315 }
316
317 app_menu_->Popup(app_menu_button_->widget(), button_press_event);
318 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698