summaryrefslogtreecommitdiffstats
path: root/chrome/browser
diff options
context:
space:
mode:
authortc@google.com <tc@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-07-10 19:41:53 +0000
committertc@google.com <tc@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-07-10 19:41:53 +0000
commitaf62bb4afd0dba5e607643f818a08a2aec642a80 (patch)
tree577687d6570ae15b9d23ccf2673eb669a31c4866 /chrome/browser
parentb8da78ad0ca066ada021b02bf4aaf1a686ef5af3 (diff)
downloadchromium_src-af62bb4afd0dba5e607643f818a08a2aec642a80.zip
chromium_src-af62bb4afd0dba5e607643f818a08a2aec642a80.tar.gz
chromium_src-af62bb4afd0dba5e607643f818a08a2aec642a80.tar.bz2
Revert "Revert "Add button tinting to the toolbar buttons.""
This reverts commit r20399 and re-applies the button tinting code. There's a fix for the go button gtk unittest by checking to see if the browser is non-NULL before getting the theme provider. TBR=erg Review URL: http://codereview.chromium.org/155369 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@20402 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser')
-rw-r--r--chrome/browser/gtk/back_forward_button_gtk.cc5
-rw-r--r--chrome/browser/gtk/browser_toolbar_gtk.cc4
-rw-r--r--chrome/browser/gtk/custom_button.cc96
-rw-r--r--chrome/browser/gtk/custom_button.h40
-rw-r--r--chrome/browser/gtk/go_button_gtk.cc7
-rw-r--r--chrome/browser/gtk/toolbar_star_toggle_gtk.cc7
6 files changed, 121 insertions, 38 deletions
diff --git a/chrome/browser/gtk/back_forward_button_gtk.cc b/chrome/browser/gtk/back_forward_button_gtk.cc
index dd35a0b..bc5238e 100644
--- a/chrome/browser/gtk/back_forward_button_gtk.cc
+++ b/chrome/browser/gtk/back_forward_button_gtk.cc
@@ -12,6 +12,7 @@
#include "chrome/browser/browser.h"
#include "chrome/browser/gtk/back_forward_menu_model_gtk.h"
#include "chrome/browser/gtk/menu_gtk.h"
+#include "chrome/browser/profile.h"
#include "chrome/common/gtk_util.h"
#include "grit/generated_resources.h"
#include "grit/theme_resources.h"
@@ -41,8 +42,8 @@ BackForwardButtonGtk::BackForwardButtonGtk(Browser* browser, bool is_forward)
tooltip = IDS_TOOLTIP_BACK;
stock = GTK_STOCK_GO_BACK;
}
- button_.reset(new CustomDrawButton(normal, active, highlight, depressed,
- stock));
+ button_.reset(new CustomDrawButton(browser_->profile()->GetThemeProvider(),
+ normal, active, highlight, depressed, stock));
gtk_widget_set_tooltip_text(widget(),
l10n_util::GetStringUTF8(tooltip).c_str());
menu_model_.reset(new BackForwardMenuModelGtk(browser,
diff --git a/chrome/browser/gtk/browser_toolbar_gtk.cc b/chrome/browser/gtk/browser_toolbar_gtk.cc
index 673e4bf..03639be 100644
--- a/chrome/browser/gtk/browser_toolbar_gtk.cc
+++ b/chrome/browser/gtk/browser_toolbar_gtk.cc
@@ -328,8 +328,8 @@ gfx::Rect BrowserToolbarGtk::GetPopupBounds() const {
CustomDrawButton* BrowserToolbarGtk::BuildToolbarButton(
int normal_id, int active_id, int highlight_id, int depressed_id,
const std::string& localized_tooltip, const char* stock_id) {
- CustomDrawButton* button = new CustomDrawButton(normal_id, active_id,
- highlight_id, depressed_id, stock_id);
+ CustomDrawButton* button = new CustomDrawButton(profile_->GetThemeProvider(),
+ normal_id, active_id, highlight_id, depressed_id, stock_id);
gtk_widget_set_tooltip_text(button->widget(),
localized_tooltip.c_str());
diff --git a/chrome/browser/gtk/custom_button.cc b/chrome/browser/gtk/custom_button.cc
index 6729ee6..cbe0f94 100644
--- a/chrome/browser/gtk/custom_button.cc
+++ b/chrome/browser/gtk/custom_button.cc
@@ -6,28 +6,43 @@
#include "app/l10n_util.h"
#include "app/resource_bundle.h"
+#include "app/theme_provider.h"
#include "base/basictypes.h"
#include "base/gfx/gtk_util.h"
-
+#include "chrome/common/notification_service.h"
#include "grit/theme_resources.h"
-CustomDrawButtonBase::CustomDrawButtonBase(
- int normal_id,
- int active_id,
- int highlight_id,
- int depressed_id)
- : paint_override_(-1) {
- // Load the button images from the resource bundle.
- ResourceBundle& rb = ResourceBundle::GetSharedInstance();
- pixbufs_[GTK_STATE_NORMAL] =
- normal_id ? rb.GetRTLEnabledPixbufNamed(normal_id) : NULL;
- pixbufs_[GTK_STATE_ACTIVE] =
- active_id ? rb.GetRTLEnabledPixbufNamed(active_id) : NULL;
- pixbufs_[GTK_STATE_PRELIGHT] =
- highlight_id ? rb.GetRTLEnabledPixbufNamed(highlight_id) : NULL;
- pixbufs_[GTK_STATE_SELECTED] = NULL;
- pixbufs_[GTK_STATE_INSENSITIVE] =
- depressed_id ? rb.GetRTLEnabledPixbufNamed(depressed_id) : NULL;
+CustomDrawButtonBase::CustomDrawButtonBase(ThemeProvider* theme_provider,
+ int normal_id, int active_id, int highlight_id, int depressed_id)
+ : paint_override_(-1),
+ normal_id_(normal_id),
+ active_id_(active_id),
+ highlight_id_(highlight_id),
+ depressed_id_(depressed_id),
+ theme_provider_(theme_provider) {
+ if (theme_provider) {
+ // Load images by pretending that we got a BROWSER_THEME_CHANGED
+ // notification.
+ Observe(NotificationType::BROWSER_THEME_CHANGED,
+ NotificationService::AllSources(),
+ NotificationService::NoDetails());
+
+ registrar_.Add(this,
+ NotificationType::BROWSER_THEME_CHANGED,
+ NotificationService::AllSources());
+ } else {
+ // Load the button images from the resource bundle.
+ ResourceBundle& rb = ResourceBundle::GetSharedInstance();
+ pixbufs_[GTK_STATE_NORMAL] =
+ normal_id ? rb.GetRTLEnabledPixbufNamed(normal_id) : NULL;
+ pixbufs_[GTK_STATE_ACTIVE] =
+ active_id ? rb.GetRTLEnabledPixbufNamed(active_id) : NULL;
+ pixbufs_[GTK_STATE_PRELIGHT] =
+ highlight_id ? rb.GetRTLEnabledPixbufNamed(highlight_id) : NULL;
+ pixbufs_[GTK_STATE_SELECTED] = NULL;
+ pixbufs_[GTK_STATE_INSENSITIVE] =
+ depressed_id ? rb.GetRTLEnabledPixbufNamed(depressed_id) : NULL;
+ }
}
CustomDrawButtonBase::~CustomDrawButtonBase() {
@@ -61,24 +76,51 @@ gboolean CustomDrawButtonBase::OnExpose(GtkWidget* widget, GdkEventExpose* e) {
return TRUE;
}
-CustomDrawButton::CustomDrawButton(
- int normal_id,
- int active_id,
- int highlight_id,
- int depressed_id,
+void CustomDrawButtonBase::Observe(NotificationType type,
+ const NotificationSource& source, const NotificationDetails& details) {
+ DCHECK(theme_provider_);
+ DCHECK(NotificationType::BROWSER_THEME_CHANGED == type);
+
+ // TODO(tc): Add GetRTLEnabledPixbufNamed to ThemeProviderGtk.
+ pixbufs_[GTK_STATE_NORMAL] =
+ normal_id_ ? theme_provider_->GetPixbufNamed(normal_id_) : NULL;
+ pixbufs_[GTK_STATE_ACTIVE] =
+ active_id_ ? theme_provider_->GetPixbufNamed(active_id_) : NULL;
+ pixbufs_[GTK_STATE_PRELIGHT] =
+ highlight_id_ ? theme_provider_->GetPixbufNamed(highlight_id_) : NULL;
+ pixbufs_[GTK_STATE_SELECTED] = NULL;
+ pixbufs_[GTK_STATE_INSENSITIVE] =
+ depressed_id_ ? theme_provider_->GetPixbufNamed(depressed_id_) : NULL;
+}
+
+CustomDrawButton::CustomDrawButton(int normal_id, int active_id,
+ int highlight_id, int depressed_id, const char* stock_id)
+ : button_base_(NULL, normal_id, active_id, highlight_id, depressed_id),
+ gtk_stock_name_(stock_id),
+ has_expose_signal_handler_(false) {
+ Init();
+}
+
+CustomDrawButton::CustomDrawButton(ThemeProvider* theme_provider,
+ int normal_id, int active_id, int highlight_id, int depressed_id,
const char* stock_id)
- : button_base_(normal_id, active_id, highlight_id, depressed_id),
+ : button_base_(theme_provider, normal_id, active_id, highlight_id,
+ depressed_id),
gtk_stock_name_(stock_id),
has_expose_signal_handler_(false) {
- widget_.Own(gtk_button_new());
- GTK_WIDGET_UNSET_FLAGS(widget_.get(), GTK_CAN_FOCUS);
- SetUseSystemTheme(false);
+ Init();
}
CustomDrawButton::~CustomDrawButton() {
widget_.Destroy();
}
+void CustomDrawButton::Init() {
+ widget_.Own(gtk_button_new());
+ GTK_WIDGET_UNSET_FLAGS(widget_.get(), GTK_CAN_FOCUS);
+ SetUseSystemTheme(false);
+}
+
void CustomDrawButton::SetUseSystemTheme(bool use_gtk) {
if (use_gtk && gtk_stock_name_) {
gtk_button_set_image(
diff --git a/chrome/browser/gtk/custom_button.h b/chrome/browser/gtk/custom_button.h
index 143a090..2c6bc68 100644
--- a/chrome/browser/gtk/custom_button.h
+++ b/chrome/browser/gtk/custom_button.h
@@ -11,20 +11,28 @@
#include "base/gfx/rect.h"
#include "base/scoped_ptr.h"
+#include "chrome/common/notification_observer.h"
+#include "chrome/common/notification_registrar.h"
#include "chrome/common/owned_widget_gtk.h"
+class ThemeProvider;
+
// These classes implement two kinds of custom-drawn buttons. They're
// used on the toolbar and the bookmarks bar.
// CustomDrawButtonBase provides the base for building a custom drawn button.
// It handles managing the pixbufs containing all the static images used to draw
// the button. It also manages painting these pixbufs.
-class CustomDrawButtonBase {
+class CustomDrawButtonBase : public NotificationObserver {
public:
- CustomDrawButtonBase(int normal_id,
+ // If the images come from ResourceBundle rather than the theme provider,
+ // pass in NULL for |theme_provider|.
+ CustomDrawButtonBase(ThemeProvider* theme_provider,
+ int normal_id,
int active_id,
int highlight_id,
int depressed_id);
+
~CustomDrawButtonBase();
GdkPixbuf* pixbufs(int i) const { return pixbufs_[i]; }
@@ -33,6 +41,11 @@ class CustomDrawButtonBase {
void set_paint_override(int state) { paint_override_ = state; }
+ // Provide NotificationObserver implementation.
+ virtual void Observe(NotificationType type,
+ const NotificationSource& source,
+ const NotificationDetails& details);
+
private:
// We store one GdkPixbuf* for each possible state of the button;
// INSENSITIVE is the last available state;
@@ -41,6 +54,17 @@ class CustomDrawButtonBase {
// If non-negative, the state to paint the button.
int paint_override_;
+ // We need to remember the image ids that the user passes in and the theme
+ // provider so we can reload images if the user changes theme.
+ int normal_id_;
+ int active_id_;
+ int highlight_id_;
+ int depressed_id_;
+ ThemeProvider* theme_provider_;
+
+ // Used to listen for theme change notifications.
+ NotificationRegistrar registrar_;
+
DISALLOW_COPY_AND_ASSIGN(CustomDrawButtonBase);
};
@@ -56,9 +80,19 @@ class CustomDrawButton {
int highlight_id,
int depressed_id,
const char* stock_id);
- explicit CustomDrawButton(const std::string& filename);
+
+ // Same as above, but uses themed (and possibly tinted) images.
+ CustomDrawButton(ThemeProvider* theme_provider,
+ int normal_id,
+ int active_id,
+ int highlight_id,
+ int depressed_id,
+ const char* stock_id);
+
~CustomDrawButton();
+ void Init();
+
GtkWidget* widget() const { return widget_.get(); }
gfx::Rect bounds() const {
diff --git a/chrome/browser/gtk/go_button_gtk.cc b/chrome/browser/gtk/go_button_gtk.cc
index ef58f76..799b7e8 100644
--- a/chrome/browser/gtk/go_button_gtk.cc
+++ b/chrome/browser/gtk/go_button_gtk.cc
@@ -10,6 +10,7 @@
#include "chrome/app/chrome_dll_resource.h"
#include "chrome/browser/browser.h"
#include "chrome/browser/gtk/location_bar_view_gtk.h"
+#include "chrome/browser/profile.h"
#include "grit/generated_resources.h"
#include "grit/theme_resources.h"
@@ -21,8 +22,10 @@ GoButtonGtk::GoButtonGtk(LocationBarViewGtk* location_bar, Browser* browser)
intended_mode_(MODE_GO),
visible_mode_(MODE_GO),
state_(BS_NORMAL),
- go_(IDR_GO, IDR_GO_P, IDR_GO_H, 0),
- stop_(IDR_STOP, IDR_STOP_P, IDR_STOP_H, 0),
+ go_(browser ? browser->profile()->GetThemeProvider() : NULL,
+ IDR_GO, IDR_GO_P, IDR_GO_H, 0),
+ stop_(browser ? browser->profile()->GetThemeProvider() : NULL,
+ IDR_STOP, IDR_STOP_P, IDR_STOP_H, 0),
widget_(gtk_button_new()) {
gtk_widget_set_size_request(widget_.get(),
gdk_pixbuf_get_width(go_.pixbufs(0)),
diff --git a/chrome/browser/gtk/toolbar_star_toggle_gtk.cc b/chrome/browser/gtk/toolbar_star_toggle_gtk.cc
index 77c5732..2692df7 100644
--- a/chrome/browser/gtk/toolbar_star_toggle_gtk.cc
+++ b/chrome/browser/gtk/toolbar_star_toggle_gtk.cc
@@ -8,14 +8,17 @@
#include "base/gfx/rect.h"
#include "chrome/browser/gtk/bookmark_bubble_gtk.h"
#include "chrome/browser/gtk/browser_toolbar_gtk.h"
+#include "chrome/browser/profile.h"
#include "grit/theme_resources.h"
ToolbarStarToggleGtk::ToolbarStarToggleGtk(BrowserToolbarGtk* host)
: host_(host),
widget_(gtk_button_new()),
is_starred_(false),
- unstarred_(IDR_STAR, IDR_STAR_P, IDR_STAR_H, IDR_STAR_D),
- starred_(IDR_STARRED, IDR_STARRED_P, IDR_STARRED_H, 0) {
+ unstarred_(host->profile()->GetThemeProvider(), IDR_STAR, IDR_STAR_P,
+ IDR_STAR_H, IDR_STAR_D),
+ starred_(host->profile()->GetThemeProvider(), IDR_STARRED, IDR_STARRED_P,
+ IDR_STARRED_H, 0) {
gtk_widget_set_size_request(widget_.get(),
gdk_pixbuf_get_width(unstarred_.pixbufs(0)),
gdk_pixbuf_get_height(unstarred_.pixbufs(0)));