summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorerg@google.com <erg@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-04-06 20:30:40 +0000
committererg@google.com <erg@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-04-06 20:30:40 +0000
commit5af45c4304f4cec5c68d151f7973181e8dcd73c7 (patch)
treea9cf0d336dfc63fab5273f4f45aecf18d263fa8c
parent7ea066a9c3e54b7a2fd0c2ac30c8f4a64cf8eb90 (diff)
downloadchromium_src-5af45c4304f4cec5c68d151f7973181e8dcd73c7.zip
chromium_src-5af45c4304f4cec5c68d151f7973181e8dcd73c7.tar.gz
chromium_src-5af45c4304f4cec5c68d151f7973181e8dcd73c7.tar.bz2
Write the star toggle button. Clicking it will bookmark the page.
(Clicking it a second time won't remove the bookmark; need to write the infobubble next...) Review URL: http://codereview.chromium.org/63020 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@13182 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/gtk/browser_toolbar_gtk.cc18
-rw-r--r--chrome/browser/gtk/browser_toolbar_gtk.h8
-rw-r--r--chrome/browser/gtk/browser_window_gtk.cc11
-rw-r--r--chrome/browser/gtk/toolbar_star_toggle_gtk.cc77
-rw-r--r--chrome/browser/gtk/toolbar_star_toggle_gtk.h47
-rw-r--r--chrome/chrome.gyp2
6 files changed, 154 insertions, 9 deletions
diff --git a/chrome/browser/gtk/browser_toolbar_gtk.cc b/chrome/browser/gtk/browser_toolbar_gtk.cc
index a3b587c..0eca5b5 100644
--- a/chrome/browser/gtk/browser_toolbar_gtk.cc
+++ b/chrome/browser/gtk/browser_toolbar_gtk.cc
@@ -16,6 +16,7 @@
#include "chrome/browser/gtk/location_bar_view_gtk.h"
#include "chrome/browser/gtk/nine_box.h"
#include "chrome/browser/gtk/standard_menus.h"
+#include "chrome/browser/gtk/toolbar_star_toggle_gtk.h"
#include "chrome/browser/net/url_fixer_upper.h"
#include "chrome/browser/profile.h"
#include "chrome/common/l10n_util.h"
@@ -115,8 +116,7 @@ void BrowserToolbarGtk::Init(Profile* profile,
gtk_box_pack_start(GTK_BOX(toolbar_), gtk_label_new(" "), FALSE, FALSE, 0);
- star_.reset(BuildToolbarButton(IDR_STAR, IDR_STAR_P, IDR_STAR_H, IDR_STAR_D,
- l10n_util::GetString(IDS_TOOLTIP_STAR)));
+ star_.reset(BuildStarButton(l10n_util::GetString(IDS_TOOLTIP_STAR)));
location_bar_->Init();
gtk_box_pack_start(GTK_BOX(toolbar_), location_bar_->widget(), TRUE, TRUE, 0);
@@ -230,6 +230,20 @@ CustomDrawButton* BrowserToolbarGtk::BuildToolbarButton(
return button;
}
+ToolbarStarToggleGtk* BrowserToolbarGtk::BuildStarButton(
+ const std::wstring& localized_tooltip) {
+ ToolbarStarToggleGtk* button = new ToolbarStarToggleGtk;
+
+ gtk_widget_set_tooltip_text(button->widget(),
+ WideToUTF8(localized_tooltip).c_str());
+ g_signal_connect(G_OBJECT(button->widget()), "clicked",
+ G_CALLBACK(OnButtonClick), this);
+ GTK_WIDGET_UNSET_FLAGS(button->widget(), GTK_CAN_FOCUS);
+
+ gtk_box_pack_start(GTK_BOX(toolbar_), button->widget(), FALSE, FALSE, 0);
+ return button;
+}
+
CustomContainerButton* BrowserToolbarGtk::BuildToolbarMenuButton(
int icon_id,
const std::wstring& localized_tooltip) {
diff --git a/chrome/browser/gtk/browser_toolbar_gtk.h b/chrome/browser/gtk/browser_toolbar_gtk.h
index d4134ba9..1223061 100644
--- a/chrome/browser/gtk/browser_toolbar_gtk.h
+++ b/chrome/browser/gtk/browser_toolbar_gtk.h
@@ -24,6 +24,7 @@ class NineBox;
class Profile;
class TabContents;
class ToolbarModel;
+class ToolbarStarToggleGtk;
// View class that displays the GTK version of the toolbar and routes gtk
// events back to the Browser.
@@ -64,6 +65,8 @@ class BrowserToolbarGtk : public CommandUpdater::CommandObserver,
// Message that we should react to a state change.
void UpdateTabContents(TabContents* contents, bool should_restore_state);
+ ToolbarStarToggleGtk* star() { return star_.get(); }
+
private:
// Builds a toolbar button with all the properties set.
CustomDrawButton* BuildToolbarButton(int normal_id,
@@ -72,6 +75,8 @@ class BrowserToolbarGtk : public CommandUpdater::CommandObserver,
int depressed_id,
const std::wstring& localized_tooltip);
+ ToolbarStarToggleGtk* BuildStarButton(const std::wstring& localized_tooltip);
+
CustomContainerButton* BuildToolbarMenuButton(
int icon_id,
const std::wstring& localized_tooltip);
@@ -124,7 +129,8 @@ class BrowserToolbarGtk : public CommandUpdater::CommandObserver,
scoped_ptr<CustomDrawButton> back_, forward_;
scoped_ptr<CustomDrawButton> reload_;
scoped_ptr<CustomDrawButton> home_; // May be NULL.
- scoped_ptr<CustomDrawButton> star_, go_;
+ scoped_ptr<ToolbarStarToggleGtk> star_;
+ scoped_ptr<CustomDrawButton> go_;
scoped_ptr<CustomContainerButton> page_menu_button_, app_menu_button_;
// The model that contains the security level, text, icon to display...
diff --git a/chrome/browser/gtk/browser_window_gtk.cc b/chrome/browser/gtk/browser_window_gtk.cc
index 6bd4367..e8887a6 100644
--- a/chrome/browser/gtk/browser_window_gtk.cc
+++ b/chrome/browser/gtk/browser_window_gtk.cc
@@ -22,6 +22,7 @@
#include "chrome/browser/gtk/status_bubble_gtk.h"
#include "chrome/browser/gtk/tab_contents_container_gtk.h"
#include "chrome/browser/gtk/tabs/tab_strip_gtk.h"
+#include "chrome/browser/gtk/toolbar_star_toggle_gtk.h"
#include "chrome/browser/location_bar.h"
#include "chrome/browser/renderer_host/render_widget_host_view_gtk.h"
#include "chrome/browser/tab_contents/web_contents.h"
@@ -278,7 +279,7 @@ void BrowserWindowGtk::Close() {
// TODO(tc): We should store the window position, perhaps using
// gtk_window_set_role.
- //SaveWindowPosition();
+ // SaveWindowPosition();
GtkWidget* window = GTK_WIDGET(window_);
// To help catch bugs in any event handlers that might get fired during the
@@ -333,9 +334,7 @@ void BrowserWindowGtk::UpdateLoadingAnimations(bool should_animate) {
}
void BrowserWindowGtk::SetStarredState(bool is_starred) {
- // Hide our current lack of starring support from NOTIMPLEMENTED spew.
- if (is_starred)
- NOTIMPLEMENTED();
+ toolbar_->star()->SetStarred(is_starred);
}
gfx::Rect BrowserWindowGtk::GetNormalBounds() const {
@@ -509,8 +508,8 @@ bool BrowserWindowGtk::CanClose() const {
// TODO(tc): We don't have tab dragging yet.
// You cannot close a frame for which there is an active originating drag
// session.
- //if (tabstrip_->IsDragSessionActive())
- // return false;
+ // if (tabstrip_->IsDragSessionActive())
+ // return false;
// Give beforeunload handlers the chance to cancel the close before we hide
// the window below.
diff --git a/chrome/browser/gtk/toolbar_star_toggle_gtk.cc b/chrome/browser/gtk/toolbar_star_toggle_gtk.cc
new file mode 100644
index 0000000..26a8561
--- /dev/null
+++ b/chrome/browser/gtk/toolbar_star_toggle_gtk.cc
@@ -0,0 +1,77 @@
+// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/gtk/toolbar_star_toggle_gtk.h"
+#include "chrome/common/resource_bundle.h"
+#include "grit/theme_resources.h"
+
+ToolbarStarToggleGtk::ToolbarStarToggleGtk() {
+ widget_ = gtk_button_new();
+
+ // Load the button images from the resource bundle.
+ ResourceBundle& rb = ResourceBundle::GetSharedInstance();
+ unstarred_pixbuf_[GTK_STATE_NORMAL] = rb.LoadPixbuf(IDR_STAR);
+ unstarred_pixbuf_[GTK_STATE_ACTIVE] = rb.LoadPixbuf(IDR_STAR_P);
+ unstarred_pixbuf_[GTK_STATE_PRELIGHT] = rb.LoadPixbuf(IDR_STAR_H);
+ unstarred_pixbuf_[GTK_STATE_SELECTED] = NULL;
+ unstarred_pixbuf_[GTK_STATE_INSENSITIVE] = rb.LoadPixbuf(IDR_STAR_D);
+
+ starred_pixbuf_[GTK_STATE_NORMAL] = rb.LoadPixbuf(IDR_STARRED);
+ starred_pixbuf_[GTK_STATE_ACTIVE] = rb.LoadPixbuf(IDR_STARRED_P);
+ starred_pixbuf_[GTK_STATE_PRELIGHT] = rb.LoadPixbuf(IDR_STARRED_H);
+ starred_pixbuf_[GTK_STATE_SELECTED] = NULL;
+ starred_pixbuf_[GTK_STATE_INSENSITIVE] = NULL;
+
+ gtk_widget_set_size_request(widget_,
+ gdk_pixbuf_get_width(unstarred_pixbuf_[0]),
+ gdk_pixbuf_get_height(unstarred_pixbuf_[0]));
+
+ gtk_widget_set_app_paintable(widget_, TRUE);
+ // We effectively double-buffer by virtue of having only one image...
+ gtk_widget_set_double_buffered(widget_, FALSE);
+ g_signal_connect(G_OBJECT(widget_), "expose-event",
+ G_CALLBACK(OnExpose), this);
+}
+
+ToolbarStarToggleGtk::~ToolbarStarToggleGtk() {
+ for (size_t i = 0; i < arraysize(unstarred_pixbuf_); ++i) {
+ if (unstarred_pixbuf_[i])
+ gdk_pixbuf_unref(unstarred_pixbuf_[i]);
+ if (starred_pixbuf_[i])
+ gdk_pixbuf_unref(starred_pixbuf_[i]);
+ }
+}
+
+void ToolbarStarToggleGtk::SetStarred(bool starred) {
+ starred_ = starred;
+ gtk_widget_queue_draw(widget_);
+}
+
+// static
+gboolean ToolbarStarToggleGtk::OnExpose(GtkWidget* widget, GdkEventExpose* e,
+ ToolbarStarToggleGtk* button) {
+ GdkPixbuf** pixbuf_bank = NULL;
+ if (button->starred_)
+ pixbuf_bank = button->starred_pixbuf_;
+ else
+ pixbuf_bank = button->unstarred_pixbuf_;
+
+ GdkPixbuf* pixbuf = pixbuf_bank[GTK_WIDGET_STATE(widget)];
+
+ // Fall back to the default image if we don't have one for this state.
+ if (!pixbuf)
+ pixbuf = pixbuf_bank[GTK_STATE_NORMAL];
+
+ if (!pixbuf)
+ return FALSE;
+
+ gdk_draw_pixbuf(widget->window,
+ widget->style->fg_gc[GTK_WIDGET_STATE(widget)],
+ pixbuf,
+ 0, 0,
+ widget->allocation.x, widget->allocation.y, -1, -1,
+ GDK_RGB_DITHER_NONE, 0, 0);
+
+ return TRUE;
+}
diff --git a/chrome/browser/gtk/toolbar_star_toggle_gtk.h b/chrome/browser/gtk/toolbar_star_toggle_gtk.h
new file mode 100644
index 0000000..584d2b6
--- /dev/null
+++ b/chrome/browser/gtk/toolbar_star_toggle_gtk.h
@@ -0,0 +1,47 @@
+// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_GTK_TOOLBAR_STAR_TOGGLE_GTK_H_
+#define CHROME_BROWSER_GTK_TOOLBAR_STAR_TOGGLE_GTK_H_
+
+#include <gtk/gtk.h>
+
+#include "base/basictypes.h"
+
+class GURL;
+
+// Displays the bookmark star button, which toggles between two images.
+class ToolbarStarToggleGtk {
+ public:
+ ToolbarStarToggleGtk();
+ ~ToolbarStarToggleGtk();
+
+ // If the bubble isn't showing, shows it above the star button.
+ void ShowStarBubble(const GURL& url, bool newly_bookmarked);
+
+ void SetStarred(bool starred);
+
+ GtkWidget* widget() const { return widget_; }
+
+ private:
+ // Callback for expose, used to draw the custom graphics.
+ static gboolean OnExpose(GtkWidget* widget, GdkEventExpose* e,
+ ToolbarStarToggleGtk* obj);
+
+ // The actual button widget.
+ GtkWidget* widget_;
+
+ // Whether we show the yellow star.
+ bool starred_;
+
+ // Unstarred images
+ GdkPixbuf* unstarred_pixbuf_[GTK_STATE_INSENSITIVE + 1];
+
+ // Starred images
+ GdkPixbuf* starred_pixbuf_[GTK_STATE_INSENSITIVE + 1];
+
+ DISALLOW_EVIL_CONSTRUCTORS(ToolbarStarToggleGtk);
+};
+
+#endif // CHROME_BROWSER_GTK_TOOLBAR_STAR_TOGGLE_GTK_H_
diff --git a/chrome/chrome.gyp b/chrome/chrome.gyp
index 8a82e3d..14c8601 100644
--- a/chrome/chrome.gyp
+++ b/chrome/chrome.gyp
@@ -703,6 +703,8 @@
'browser/gtk/tabs/tab_renderer_gtk.h',
'browser/gtk/tabs/tab_strip_gtk.cc',
'browser/gtk/tabs/tab_strip_gtk.h',
+ 'browser/gtk/toolbar_star_toggle_gtk.cc',
+ 'browser/gtk/toolbar_star_toggle_gtk.h',
'browser/hang_monitor/hung_plugin_action.cc',
'browser/hang_monitor/hung_plugin_action.h',
'browser/hang_monitor/hung_window_detector.cc',