OLD | NEW |
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/toolbar_star_toggle_gtk.h" | 5 #include "chrome/browser/gtk/toolbar_star_toggle_gtk.h" |
6 | 6 |
7 #include "app/resource_bundle.h" | 7 #include "app/resource_bundle.h" |
8 #include "base/gfx/rect.h" | 8 #include "base/gfx/rect.h" |
9 #include "chrome/browser/gtk/bookmark_bubble_gtk.h" | 9 #include "chrome/browser/gtk/bookmark_bubble_gtk.h" |
10 #include "chrome/browser/gtk/browser_toolbar_gtk.h" | 10 #include "chrome/browser/gtk/browser_toolbar_gtk.h" |
11 #include "chrome/browser/gtk/gtk_theme_provider.h" | 11 #include "chrome/browser/gtk/gtk_theme_provider.h" |
12 #include "chrome/browser/profile.h" | 12 #include "chrome/browser/profile.h" |
| 13 #include "chrome/common/notification_service.h" |
13 #include "grit/theme_resources.h" | 14 #include "grit/theme_resources.h" |
14 | 15 |
15 ToolbarStarToggleGtk::ToolbarStarToggleGtk(BrowserToolbarGtk* host) | 16 ToolbarStarToggleGtk::ToolbarStarToggleGtk(BrowserToolbarGtk* host) |
16 : host_(host), | 17 : host_(host), |
17 widget_(gtk_button_new()), | 18 widget_(gtk_button_new()), |
18 is_starred_(false), | 19 is_starred_(false), |
19 unstarred_(GtkThemeProvider::GetFrom(host->profile()), | 20 theme_provider_(GtkThemeProvider::GetFrom(host->profile())), |
20 IDR_STAR, IDR_STAR_P, IDR_STAR_H, IDR_STAR_D), | 21 unstarred_(theme_provider_, IDR_STAR, IDR_STAR_P, IDR_STAR_H, IDR_STAR_D), |
21 starred_(GtkThemeProvider::GetFrom(host->profile()), | 22 starred_(theme_provider_, IDR_STARRED, IDR_STARRED_P, IDR_STARRED_H, 0) { |
22 IDR_STARRED, IDR_STARRED_P, IDR_STARRED_H, 0) { | |
23 gtk_widget_set_size_request(widget_.get(), | 23 gtk_widget_set_size_request(widget_.get(), |
24 gdk_pixbuf_get_width(unstarred_.pixbufs(0)), | 24 gdk_pixbuf_get_width(unstarred_.pixbufs(0)), |
25 gdk_pixbuf_get_height(unstarred_.pixbufs(0))); | 25 gdk_pixbuf_get_height(unstarred_.pixbufs(0))); |
26 | 26 |
27 gtk_widget_set_app_paintable(widget_.get(), TRUE); | 27 gtk_widget_set_app_paintable(widget_.get(), TRUE); |
28 // We effectively double-buffer by virtue of having only one image... | 28 // We effectively double-buffer by virtue of having only one image... |
29 gtk_widget_set_double_buffered(widget_.get(), FALSE); | 29 gtk_widget_set_double_buffered(widget_.get(), FALSE); |
| 30 |
30 g_signal_connect(G_OBJECT(widget_.get()), "expose-event", | 31 g_signal_connect(G_OBJECT(widget_.get()), "expose-event", |
31 G_CALLBACK(OnExpose), this); | 32 G_CALLBACK(OnExpose), this); |
32 GTK_WIDGET_UNSET_FLAGS(widget_.get(), GTK_CAN_FOCUS); | 33 GTK_WIDGET_UNSET_FLAGS(widget_.get(), GTK_CAN_FOCUS); |
| 34 |
| 35 theme_provider_->InitThemesFor(this); |
| 36 registrar_.Add(this, |
| 37 NotificationType::BROWSER_THEME_CHANGED, |
| 38 NotificationService::AllSources()); |
33 } | 39 } |
34 | 40 |
35 ToolbarStarToggleGtk::~ToolbarStarToggleGtk() { | 41 ToolbarStarToggleGtk::~ToolbarStarToggleGtk() { |
36 widget_.Destroy(); | 42 widget_.Destroy(); |
37 } | 43 } |
38 | 44 |
| 45 void ToolbarStarToggleGtk::Observe(NotificationType type, |
| 46 const NotificationSource& source, const NotificationDetails& details) { |
| 47 DCHECK(NotificationType::BROWSER_THEME_CHANGED == type); |
| 48 |
| 49 GtkThemeProvider* provider = static_cast<GtkThemeProvider*>( |
| 50 Source<GtkThemeProvider>(source).ptr()); |
| 51 DCHECK(provider == theme_provider_); |
| 52 UpdateGTKButton(); |
| 53 } |
| 54 |
39 void ToolbarStarToggleGtk::ShowStarBubble(const GURL& url, | 55 void ToolbarStarToggleGtk::ShowStarBubble(const GURL& url, |
40 bool newly_bookmarked) { | 56 bool newly_bookmarked) { |
41 GtkWidget* widget = widget_.get(); | 57 GtkWidget* widget = widget_.get(); |
42 gint x, y; | 58 gint x, y; |
43 gdk_window_get_origin(widget->window, &x, &y); | 59 gdk_window_get_origin(widget->window, &x, &y); |
44 x += widget->allocation.x; | 60 x += widget->allocation.x; |
45 y += widget->allocation.y; | 61 y += widget->allocation.y; |
46 gint width = widget->allocation.width; | 62 gint width = widget->allocation.width; |
47 gint height = widget->allocation.height; | 63 gint height = widget->allocation.height; |
48 | 64 |
49 BookmarkBubbleGtk::Show(GTK_WINDOW(gtk_widget_get_toplevel(widget)), | 65 BookmarkBubbleGtk::Show(GTK_WINDOW(gtk_widget_get_toplevel(widget)), |
50 gfx::Rect(x, y, width, height), | 66 gfx::Rect(x, y, width, height), |
51 host_->profile(), | 67 host_->profile(), |
52 url, | 68 url, |
53 newly_bookmarked); | 69 newly_bookmarked); |
54 } | 70 } |
55 | 71 |
56 void ToolbarStarToggleGtk::SetStarred(bool starred) { | 72 void ToolbarStarToggleGtk::SetStarred(bool starred) { |
57 is_starred_ = starred; | 73 is_starred_ = starred; |
58 gtk_widget_queue_draw(widget_.get()); | 74 gtk_widget_queue_draw(widget_.get()); |
| 75 UpdateGTKButton(); |
59 } | 76 } |
60 | 77 |
61 // static | 78 // static |
62 gboolean ToolbarStarToggleGtk::OnExpose(GtkWidget* widget, GdkEventExpose* e, | 79 gboolean ToolbarStarToggleGtk::OnExpose(GtkWidget* widget, GdkEventExpose* e, |
63 ToolbarStarToggleGtk* button) { | 80 ToolbarStarToggleGtk* button) { |
64 if (button->is_starred_) { | 81 if (button->theme_provider_->UseGtkTheme()) { |
65 return button->starred_.OnExpose(widget, e); | 82 return FALSE; |
66 } else { | 83 } else { |
67 return button->unstarred_.OnExpose(widget, e); | 84 if (button->is_starred_) { |
| 85 return button->starred_.OnExpose(widget, e); |
| 86 } else { |
| 87 return button->unstarred_.OnExpose(widget, e); |
| 88 } |
68 } | 89 } |
69 } | 90 } |
| 91 |
| 92 void ToolbarStarToggleGtk::UpdateGTKButton() { |
| 93 if (theme_provider_->UseGtkTheme()) { |
| 94 GdkPixbuf* pixbuf = NULL; |
| 95 if (is_starred_) { |
| 96 pixbuf = theme_provider_->GetPixbufNamed(IDR_STARRED_NOBORDER); |
| 97 } else { |
| 98 pixbuf = theme_provider_->GetPixbufNamed(IDR_STAR_NOBORDER); |
| 99 } |
| 100 |
| 101 gtk_button_set_image( |
| 102 GTK_BUTTON(widget_.get()), |
| 103 gtk_image_new_from_pixbuf(pixbuf)); |
| 104 |
| 105 gtk_widget_set_size_request(widget_.get(), -1, -1); |
| 106 gtk_widget_set_app_paintable(widget_.get(), FALSE); |
| 107 gtk_widget_set_double_buffered(widget_.get(), TRUE); |
| 108 } else { |
| 109 gtk_widget_set_size_request(widget_.get(), |
| 110 gdk_pixbuf_get_width(unstarred_.pixbufs(0)), |
| 111 gdk_pixbuf_get_height(unstarred_.pixbufs(0))); |
| 112 |
| 113 gtk_widget_set_app_paintable(widget_.get(), TRUE); |
| 114 // We effectively double-buffer by virtue of having only one image... |
| 115 gtk_widget_set_double_buffered(widget_.get(), FALSE); |
| 116 } |
| 117 } |
OLD | NEW |