172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#ifndef CHROME_BROWSER_UI_GTK_BOOKMARKS_BOOKMARK_BAR_GTK_H_
6dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#define CHROME_BROWSER_UI_GTK_BOOKMARKS_BOOKMARK_BAR_GTK_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <gtk/gtk.h>
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector>
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/gtest_prod_util.h"
14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/bookmarks/bookmark_context_menu_controller.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/bookmarks/bookmark_model_observer.h"
17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/prefs/pref_member.h"
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/profile_sync_service.h"
19dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/gtk/bookmarks/bookmark_bar_instructions_gtk.h"
2072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/gtk/menu_bar_helper.h"
2172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/gtk/owned_widget_gtk.h"
2272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/gtk/view_id_util.h"
23dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/common/notification_observer.h"
24dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/common/notification_registrar.h"
25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "ui/base/animation/animation.h"
263f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "ui/base/animation/animation_delegate.h"
27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "ui/base/animation/slide_animation.h"
2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/gtk/gtk_signal.h"
2972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/point.h"
3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/size.h"
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass BookmarkMenuController;
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Browser;
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass BrowserWindowGtk;
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass CustomContainerButton;
36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass GtkThemeService;
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass MenuGtk;
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass PageNavigator;
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Profile;
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass TabstripOriginProvider;
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
423f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsenclass BookmarkBarGtk : public ui::AnimationDelegate,
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       public ProfileSyncServiceObserver,
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       public BookmarkModelObserver,
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       public MenuBarHelper::Delegate,
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       public NotificationObserver,
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       public BookmarkBarInstructionsGtk::Delegate,
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       public BookmarkContextMenuControllerDelegate {
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
503f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  BookmarkBarGtk(BrowserWindowGtk* window,
513f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen                 Profile* profile,
523f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen                 Browser* browser,
533f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen                 TabstripOriginProvider* tabstrip_origin_provider);
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~BookmarkBarGtk();
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Resets the profile. This removes any buttons for the current profile and
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // recreates the models.
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetProfile(Profile* profile);
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the current profile.
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Profile* GetProfile() { return profile_; }
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the current browser.
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Browser* browser() const { return browser_; }
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the top level widget.
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GtkWidget* widget() const { return event_box_.get(); }
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Sets the PageNavigator that is used when the user selects an entry on
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the bookmark bar.
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetPageNavigator(PageNavigator* navigator);
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Create the contents of the bookmark bar.
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Init(Profile* profile);
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Whether the current page is the New Tag Page (which requires different
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // rendering).
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool OnNewTabPage();
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Change the visibility of the bookmarks bar. (Starts out hidden, per GTK's
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // default behaviour). There are three visiblity states:
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //   Showing    - bookmark bar is fully visible.
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //   Hidden     - bookmark bar is hidden except for a few pixels that give
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //                extra padding to the bottom of the toolbar. Buttons are not
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //                clickable.
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //   Fullscreen - bookmark bar is fully hidden.
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Show(bool animate);
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Hide(bool animate);
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void EnterFullscreen();
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Get the current height of the bookmark bar.
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int GetHeight();
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns true if the bookmark bar is showing an animation.
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool IsAnimating();
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns true if the bookmarks bar preference is set to 'always show'.
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool IsAlwaysShown();
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1013f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // ui::AnimationDelegate implementation --------------------------------------
1023f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  virtual void AnimationProgressed(const ui::Animation* animation);
1033f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  virtual void AnimationEnded(const ui::Animation* animation);
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // MenuBarHelper::Delegate implementation ------------------------------------
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void PopupForButton(GtkWidget* button);
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void PopupForButtonNextTo(GtkWidget* button,
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                    GtkMenuDirectionType dir);
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The NTP needs to have access to this.
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static const int kBookmarkBarNTPHeight;
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // BookmarkContextMenuController::Delegate implementation --------------------
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void CloseMenu();
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const ui::Animation* animation() { return &slide_animation_; }
117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
1193f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  FRIEND_TEST_ALL_PREFIXES(BookmarkBarGtkUnittest, DisplaysHelpMessageOnEmpty);
1203f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  FRIEND_TEST_ALL_PREFIXES(BookmarkBarGtkUnittest,
1213f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen                           HidesHelpMessageWithBookmark);
1223f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  FRIEND_TEST_ALL_PREFIXES(BookmarkBarGtkUnittest, BuildsButtons);
1233f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Helper function which generates GtkToolItems for |bookmark_toolbar_|.
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void CreateAllBookmarkButtons();
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Sets the visibility of the instructional text based on whether there are
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // any bookmarks in the bookmark bar node.
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetInstructionState();
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Sets the visibility of the overflow chevron.
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetChevronState();
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Helper function which destroys all the bookmark buttons in the GtkToolbar.
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void RemoveAllBookmarkButtons();
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Returns the number of buttons corresponding to starred urls/folders. This
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // is equivalent to the number of children the bookmark bar node from the
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // bookmark bar model has.
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int GetBookmarkButtonCount();
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Set the appearance of the overflow button appropriately (either chromium
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // style or GTK style).
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetOverflowButtonAppearance();
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the index of the first bookmark that is not visible on the bar.
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns -1 if they are all visible.
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |extra_space| is how much extra space to give the toolbar during the
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // calculation (for the purposes of determining if ditching the chevron
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // would be a good idea).
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // If non-NULL, |showing_folders| will be packed with all the folders that are
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // showing on the bar.
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int GetFirstHiddenBookmark(int extra_space,
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             std::vector<GtkWidget*>* showing_folders);
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns true if the bookmark bar should be floating on the page (for
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // NTP).
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool ShouldBeFloating();
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Update the floating state (either enable or disable it, or do nothing).
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void UpdateFloatingState();
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Turns on or off the app_paintable flag on |event_box_|, depending on our
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // state.
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void UpdateEventBoxPaintability();
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Queue a paint on the event box.
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void PaintEventBox();
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Finds the size of the current tab contents, if it exists and sets |size|
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // to the correct value. Returns false if there isn't a TabContents, a
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // condition that can happen during testing.
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool GetTabContentsSize(gfx::Size* size);
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
17472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Connects to the "size-allocate" signal on the given widget, and causes it
17572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // to throb after allocation. This is called when a new item is added to the
17672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // bar. We can't call StartThrobbing directly because we don't know if it's
17772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // visible or not until after the widget is allocated.
17872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void StartThrobbingAfterAllocation(GtkWidget* item);
17972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
18072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Used by StartThrobbingAfterAllocation.
18172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  CHROMEGTK_CALLBACK_1(BookmarkBarGtk, void, OnItemAllocate, GtkAllocation*);
18272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Makes the appropriate widget on the bookmark bar stop throbbing
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // (a folder, the overflow chevron, or nothing).
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void StartThrobbing(const BookmarkNode* node);
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Set |throbbing_widget_| to |widget|. Also makes sure that
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |throbbing_widget_| doesn't become stale.
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetThrobbingWidget(GtkWidget* widget);
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // An item has been dragged over the toolbar, update the drag context
1923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // and toolbar UI appropriately.
1933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  gboolean ItemDraggedOverToolbar(
1943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      GdkDragContext* context, int index, guint time);
1953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // When dragging in the middle of a folder, assume the user wants to drop
1973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // on the folder. Towards the edges, assume the user wants to drop on the
1983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // toolbar. This makes it possible to drop between two folders. This function
1993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // returns the index on the toolbar the drag should target, or -1 if the
2003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // drag should hit the folder.
2013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int GetToolbarIndexForDragOverFolder(GtkWidget* button, gint x);
2023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void ClearToolbarDropHighlighting();
2043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Overridden from BookmarkModelObserver:
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Invoked when the bookmark model has finished loading. Creates a button
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // for each of the children of the root node from the model.
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Loaded(BookmarkModel* model);
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Invoked when the model is being deleted.
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void BookmarkModelBeingDeleted(BookmarkModel* model);
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Invoked when a node has moved.
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void BookmarkNodeMoved(BookmarkModel* model,
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 const BookmarkNode* old_parent,
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 int old_index,
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 const BookmarkNode* new_parent,
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 int new_index);
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void BookmarkNodeAdded(BookmarkModel* model,
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 const BookmarkNode* parent,
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 int index);
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void BookmarkNodeRemoved(BookmarkModel* model,
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   const BookmarkNode* parent,
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   int old_index,
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   const BookmarkNode* node);
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void BookmarkNodeChanged(BookmarkModel* model,
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   const BookmarkNode* node);
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Invoked when a favicon has finished loading.
230ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void BookmarkNodeFaviconLoaded(BookmarkModel* model,
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                         const BookmarkNode* node);
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void BookmarkNodeChildrenReordered(BookmarkModel* model,
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                             const BookmarkNode* node);
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Overridden from NotificationObserver:
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Observe(NotificationType type,
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationSource& source,
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationDetails& details);
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GtkWidget* CreateBookmarkButton(const BookmarkNode* node);
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GtkToolItem* CreateBookmarkToolItem(const BookmarkNode* node);
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void ConnectFolderButtonEvents(GtkWidget* widget, bool is_tool_item);
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Finds the BookmarkNode from the model associated with |button|.
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const BookmarkNode* GetNodeForToolButton(GtkWidget* button);
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Creates and displays a popup menu for BookmarkNode |node|.
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void PopupMenuForNode(GtkWidget* sender, const BookmarkNode* node,
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        GdkEventButton* event);
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // GtkButton callbacks.
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CHROMEGTK_CALLBACK_1(BookmarkBarGtk, gboolean, OnButtonPressed,
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       GdkEventButton*);
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CHROMEGTK_CALLBACK_1(BookmarkBarGtk, gboolean, OnSyncErrorButtonPressed,
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       GdkEventButton*);
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CHROMEGTK_CALLBACK_0(BookmarkBarGtk, void, OnClicked);
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CHROMEGTK_CALLBACK_1(BookmarkBarGtk, void, OnButtonDragBegin,
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       GdkDragContext*);
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CHROMEGTK_CALLBACK_1(BookmarkBarGtk, void, OnButtonDragEnd, GdkDragContext*);
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CHROMEGTK_CALLBACK_4(BookmarkBarGtk, void, OnButtonDragGet,
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       GdkDragContext*, GtkSelectionData*, guint, guint);
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // GtkButton callbacks for folder buttons.
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CHROMEGTK_CALLBACK_0(BookmarkBarGtk, void, OnFolderClicked);
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // GtkToolbar callbacks.
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CHROMEGTK_CALLBACK_4(BookmarkBarGtk, gboolean, OnToolbarDragMotion,
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       GdkDragContext*, gint, gint, guint);
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CHROMEGTK_CALLBACK_1(BookmarkBarGtk, void, OnToolbarSizeAllocate,
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       GtkAllocation*);
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Used for both folder buttons and the toolbar.
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CHROMEGTK_CALLBACK_6(BookmarkBarGtk, void, OnDragReceived,
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       GdkDragContext*, gint, gint, GtkSelectionData*,
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       guint, guint);
2773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  CHROMEGTK_CALLBACK_2(BookmarkBarGtk, void, OnDragLeave,
2783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                       GdkDragContext*, guint);
2793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Used for folder buttons.
2813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  CHROMEGTK_CALLBACK_4(BookmarkBarGtk, gboolean, OnFolderDragMotion,
2823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                       GdkDragContext*, gint, gint, guint);
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // GtkEventBox callbacks.
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CHROMEGTK_CALLBACK_1(BookmarkBarGtk, gboolean, OnEventBoxExpose,
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       GdkEventExpose*);
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CHROMEGTK_CALLBACK_0(BookmarkBarGtk, void, OnEventBoxDestroy);
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Callbacks on our parent widget.
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CHROMEGTK_CALLBACK_1(BookmarkBarGtk, void, OnParentSizeAllocate,
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       GtkAllocation*);
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |throbbing_widget_| callback.
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CHROMEGTK_CALLBACK_0(BookmarkBarGtk, void, OnThrobbingWidgetDestroy);
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // ProfileSyncServiceObserver method.
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void OnStateChanged();
298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Overriden from BookmarkBarInstructionsGtk::Delegate.
300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void ShowImportDialog();
301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
302ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Updates the drag&drop state when |edit_bookmarks_enabled_| changes.
303ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void OnEditBookmarksEnabledChanged();
304ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Profile* profile_;
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Used for opening urls.
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  PageNavigator* page_navigator_;
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Browser* browser_;
311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BrowserWindowGtk* window_;
312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Provides us with the offset into the background theme image.
314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TabstripOriginProvider* tabstrip_origin_provider_;
315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
316ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Model providing details as to the starred entries/folders that should be
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // shown. This is owned by the Profile.
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BookmarkModel* model_;
319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Contains |bookmark_hbox_|. Event box exists to prevent leakage of
321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // background color from the toplevel application window's GDK window.
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  OwnedWidgetGtk event_box_;
323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Used to float the bookmark bar when on the NTP.
325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GtkWidget* ntp_padding_box_;
326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Used to paint the background of the bookmark bar when in floating mode.
328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GtkWidget* paint_box_;
329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Used to position all children.
331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GtkWidget* bookmark_hbox_;
332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Alignment widget that is visible if there are no bookmarks on
334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the bookmar bar.
335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GtkWidget* instructions_;
336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // BookmarkBarInstructionsGtk that holds the label and the link for importing
338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // bookmarks when there are no bookmarks on the bookmark bar.
339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<BookmarkBarInstructionsGtk> instructions_gtk_;
340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // GtkToolbar which contains all the bookmark buttons.
342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  OwnedWidgetGtk bookmark_toolbar_;
343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The button that shows extra bookmarks that don't fit on the bookmark
345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // bar.
346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GtkWidget* overflow_button_;
347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The other bookmarks button.
349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GtkWidget* other_bookmarks_button_;
350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The sync error button.
352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GtkWidget* sync_error_button_;
353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // A pointer to the ProfileSyncService instance if one exists.
355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ProfileSyncService* sync_service_;
356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The BookmarkNode from the model being dragged. NULL when we aren't
358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // dragging.
359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const BookmarkNode* dragged_node_;
360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The visual representation that follows the cursor during drags.
362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GtkWidget* drag_icon_;
363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We create a GtkToolbarItem from |dragged_node_| ;or display.
365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GtkToolItem* toolbar_drop_item_;
366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Theme provider for building buttons.
368ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  GtkThemeService* theme_service_;
369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Whether we should show the instructional text in the bookmark bar.
371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool show_instructions_;
372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MenuBarHelper menu_bar_helper_;
374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The last displayed right click menu, or NULL if no menus have been
376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // displayed yet.
377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The controller.
378c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<BookmarkContextMenuController> current_context_menu_controller_;
379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The view.
380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<MenuGtk> current_context_menu_;
381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The last displayed left click menu, or NULL if no menus have been
383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // displayed yet.
384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<BookmarkMenuController> current_menu_;
385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
386ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ui::SlideAnimation slide_animation_;
387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Whether we are currently configured as floating (detached from the
389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // toolbar). This reflects our actual state, and can be out of sync with
390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // what ShouldShowFloating() returns.
391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool floating_;
392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Used to optimize out |bookmark_toolbar_| size-allocate events we don't
394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // need to respond to.
395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int last_allocation_width_;
396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NotificationRegistrar registrar_;
398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The size of the tab contents last time we forced a paint. We keep track
400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // of this so we don't force too many paints.
401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Size last_tab_contents_size_;
402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The last coordinates recorded by OnButtonPress; used to line up the
404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // drag icon during bookmark drags.
405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Point last_pressed_coordinates_;
406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The currently throbbing widget. This is NULL if no widget is throbbing.
408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We track it because we only want to allow one widget to throb at a time.
409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GtkWidget* throbbing_widget_;
410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
411ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Tracks whether bookmarks can be modified.
412ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  BooleanPrefMember edit_bookmarks_enabled_;
413ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ScopedRunnableMethodFactory<BookmarkBarGtk> method_factory_;
415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
417dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#endif  // CHROME_BROWSER_UI_GTK_BOOKMARKS_BOOKMARK_BAR_GTK_H_
418