| 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 |