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