| Index: chrome/browser/ui/gtk/bookmark_bar_gtk.h
|
| diff --git a/chrome/browser/ui/gtk/bookmark_bar_gtk.h b/chrome/browser/ui/gtk/bookmark_bar_gtk.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..8e4c24809eb032636c8ffaabc1b260bd9989c5fa
|
| --- /dev/null
|
| +++ b/chrome/browser/ui/gtk/bookmark_bar_gtk.h
|
| @@ -0,0 +1,401 @@
|
| +// Copyright (c) 2010 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_UI_GTK_BOOKMARK_BAR_GTK_H_
|
| +#define CHROME_BROWSER_UI_GTK_BOOKMARK_BAR_GTK_H_
|
| +#pragma once
|
| +
|
| +#include <gtk/gtk.h>
|
| +
|
| +#include <vector>
|
| +
|
| +#include "app/gtk_signal.h"
|
| +#include "base/gtest_prod_util.h"
|
| +#include "base/scoped_ptr.h"
|
| +#include "chrome/browser/bookmarks/bookmark_context_menu_controller.h"
|
| +#include "chrome/browser/bookmarks/bookmark_model_observer.h"
|
| +#include "chrome/browser/gtk/bookmark_bar_instructions_gtk.h"
|
| +#include "chrome/browser/gtk/menu_bar_helper.h"
|
| +#include "chrome/browser/gtk/owned_widget_gtk.h"
|
| +#include "chrome/browser/gtk/view_id_util.h"
|
| +#include "chrome/browser/sync/profile_sync_service.h"
|
| +#include "chrome/common/notification_observer.h"
|
| +#include "chrome/common/notification_registrar.h"
|
| +#include "gfx/point.h"
|
| +#include "gfx/size.h"
|
| +#include "ui/base/animation/animation_delegate.h"
|
| +
|
| +class BookmarkMenuController;
|
| +class Browser;
|
| +class BrowserWindowGtk;
|
| +class CustomContainerButton;
|
| +class GtkThemeProvider;
|
| +class MenuGtk;
|
| +class PageNavigator;
|
| +class Profile;
|
| +class TabstripOriginProvider;
|
| +
|
| +namespace ui {
|
| +class SlideAnimation;
|
| +}
|
| +
|
| +class BookmarkBarGtk : public ui::AnimationDelegate,
|
| + public ProfileSyncServiceObserver,
|
| + public BookmarkModelObserver,
|
| + public MenuBarHelper::Delegate,
|
| + public NotificationObserver,
|
| + public BookmarkBarInstructionsGtk::Delegate,
|
| + public BookmarkContextMenuControllerDelegate {
|
| + public:
|
| + BookmarkBarGtk(BrowserWindowGtk* window,
|
| + Profile* profile,
|
| + Browser* browser,
|
| + TabstripOriginProvider* tabstrip_origin_provider);
|
| + virtual ~BookmarkBarGtk();
|
| +
|
| + // Resets the profile. This removes any buttons for the current profile and
|
| + // recreates the models.
|
| + void SetProfile(Profile* profile);
|
| +
|
| + // Returns the current profile.
|
| + Profile* GetProfile() { return profile_; }
|
| +
|
| + // Returns the current browser.
|
| + Browser* browser() const { return browser_; }
|
| +
|
| + // Returns the top level widget.
|
| + GtkWidget* widget() const { return event_box_.get(); }
|
| +
|
| + // Sets the PageNavigator that is used when the user selects an entry on
|
| + // the bookmark bar.
|
| + void SetPageNavigator(PageNavigator* navigator);
|
| +
|
| + // Create the contents of the bookmark bar.
|
| + void Init(Profile* profile);
|
| +
|
| + // Whether the current page is the New Tag Page (which requires different
|
| + // rendering).
|
| + bool OnNewTabPage();
|
| +
|
| + // Change the visibility of the bookmarks bar. (Starts out hidden, per GTK's
|
| + // default behaviour). There are three visiblity states:
|
| + //
|
| + // Showing - bookmark bar is fully visible.
|
| + // Hidden - bookmark bar is hidden except for a few pixels that give
|
| + // extra padding to the bottom of the toolbar. Buttons are not
|
| + // clickable.
|
| + // Fullscreen - bookmark bar is fully hidden.
|
| + void Show(bool animate);
|
| + void Hide(bool animate);
|
| + void EnterFullscreen();
|
| +
|
| + // Get the current height of the bookmark bar.
|
| + int GetHeight();
|
| +
|
| + // Returns true if the bookmark bar is showing an animation.
|
| + bool IsAnimating();
|
| +
|
| + // Returns true if the bookmarks bar preference is set to 'always show'.
|
| + bool IsAlwaysShown();
|
| +
|
| + // ui::AnimationDelegate implementation --------------------------------------
|
| + virtual void AnimationProgressed(const ui::Animation* animation);
|
| + virtual void AnimationEnded(const ui::Animation* animation);
|
| +
|
| + // MenuBarHelper::Delegate implementation ------------------------------------
|
| + virtual void PopupForButton(GtkWidget* button);
|
| + virtual void PopupForButtonNextTo(GtkWidget* button,
|
| + GtkMenuDirectionType dir);
|
| +
|
| + // The NTP needs to have access to this.
|
| + static const int kBookmarkBarNTPHeight;
|
| +
|
| + // BookmarkContextMenuController::Delegate implementation --------------------
|
| + virtual void CloseMenu();
|
| +
|
| + private:
|
| + FRIEND_TEST_ALL_PREFIXES(BookmarkBarGtkUnittest, DisplaysHelpMessageOnEmpty);
|
| + FRIEND_TEST_ALL_PREFIXES(BookmarkBarGtkUnittest,
|
| + HidesHelpMessageWithBookmark);
|
| + FRIEND_TEST_ALL_PREFIXES(BookmarkBarGtkUnittest, BuildsButtons);
|
| +
|
| + // Helper function which generates GtkToolItems for |bookmark_toolbar_|.
|
| + void CreateAllBookmarkButtons();
|
| +
|
| + // Sets the visibility of the instructional text based on whether there are
|
| + // any bookmarks in the bookmark bar node.
|
| + void SetInstructionState();
|
| +
|
| + // Sets the visibility of the overflow chevron.
|
| + void SetChevronState();
|
| +
|
| + // Helper function which destroys all the bookmark buttons in the GtkToolbar.
|
| + void RemoveAllBookmarkButtons();
|
| +
|
| + // Returns the number of buttons corresponding to starred urls/groups. This
|
| + // is equivalent to the number of children the bookmark bar node from the
|
| + // bookmark bar model has.
|
| + int GetBookmarkButtonCount();
|
| +
|
| + // Set the appearance of the overflow button appropriately (either chromium
|
| + // style or GTK style).
|
| + void SetOverflowButtonAppearance();
|
| +
|
| + // Returns the index of the first bookmark that is not visible on the bar.
|
| + // Returns -1 if they are all visible.
|
| + // |extra_space| is how much extra space to give the toolbar during the
|
| + // calculation (for the purposes of determining if ditching the chevron
|
| + // would be a good idea).
|
| + // If non-NULL, |showing_folders| will be packed with all the folders that are
|
| + // showing on the bar.
|
| + int GetFirstHiddenBookmark(int extra_space,
|
| + std::vector<GtkWidget*>* showing_folders);
|
| +
|
| + // Returns true if the bookmark bar should be floating on the page (for
|
| + // NTP).
|
| + bool ShouldBeFloating();
|
| + // Update the floating state (either enable or disable it, or do nothing).
|
| + void UpdateFloatingState();
|
| +
|
| + // Turns on or off the app_paintable flag on |event_box_|, depending on our
|
| + // state.
|
| + void UpdateEventBoxPaintability();
|
| +
|
| + // Queue a paint on the event box.
|
| + void PaintEventBox();
|
| +
|
| + // Finds the size of the current tab contents, if it exists and sets |size|
|
| + // to the correct value. Returns false if there isn't a TabContents, a
|
| + // condition that can happen during testing.
|
| + bool GetTabContentsSize(gfx::Size* size);
|
| +
|
| + // Makes the appropriate widget on the bookmark bar stop throbbing
|
| + // (a folder, the overflow chevron, or nothing).
|
| + void StartThrobbing(const BookmarkNode* node);
|
| +
|
| + // Set |throbbing_widget_| to |widget|. Also makes sure that
|
| + // |throbbing_widget_| doesn't become stale.
|
| + void SetThrobbingWidget(GtkWidget* widget);
|
| +
|
| + // An item has been dragged over the toolbar, update the drag context
|
| + // and toolbar UI appropriately.
|
| + gboolean ItemDraggedOverToolbar(
|
| + GdkDragContext* context, int index, guint time);
|
| +
|
| + // When dragging in the middle of a folder, assume the user wants to drop
|
| + // on the folder. Towards the edges, assume the user wants to drop on the
|
| + // toolbar. This makes it possible to drop between two folders. This function
|
| + // returns the index on the toolbar the drag should target, or -1 if the
|
| + // drag should hit the folder.
|
| + int GetToolbarIndexForDragOverFolder(GtkWidget* button, gint x);
|
| +
|
| + void ClearToolbarDropHighlighting();
|
| +
|
| + // Overridden from BookmarkModelObserver:
|
| +
|
| + // Invoked when the bookmark model has finished loading. Creates a button
|
| + // for each of the children of the root node from the model.
|
| + virtual void Loaded(BookmarkModel* model);
|
| +
|
| + // Invoked when the model is being deleted.
|
| + virtual void BookmarkModelBeingDeleted(BookmarkModel* model);
|
| +
|
| + // Invoked when a node has moved.
|
| + virtual void BookmarkNodeMoved(BookmarkModel* model,
|
| + const BookmarkNode* old_parent,
|
| + int old_index,
|
| + const BookmarkNode* new_parent,
|
| + int new_index);
|
| + virtual void BookmarkNodeAdded(BookmarkModel* model,
|
| + const BookmarkNode* parent,
|
| + int index);
|
| + virtual void BookmarkNodeRemoved(BookmarkModel* model,
|
| + const BookmarkNode* parent,
|
| + int old_index,
|
| + const BookmarkNode* node);
|
| + virtual void BookmarkNodeChanged(BookmarkModel* model,
|
| + const BookmarkNode* node);
|
| + // Invoked when a favicon has finished loading.
|
| + virtual void BookmarkNodeFavIconLoaded(BookmarkModel* model,
|
| + const BookmarkNode* node);
|
| + virtual void BookmarkNodeChildrenReordered(BookmarkModel* model,
|
| + const BookmarkNode* node);
|
| +
|
| + // Overridden from NotificationObserver:
|
| + virtual void Observe(NotificationType type,
|
| + const NotificationSource& source,
|
| + const NotificationDetails& details);
|
| +
|
| + GtkWidget* CreateBookmarkButton(const BookmarkNode* node);
|
| + GtkToolItem* CreateBookmarkToolItem(const BookmarkNode* node);
|
| +
|
| + void ConnectFolderButtonEvents(GtkWidget* widget, bool is_tool_item);
|
| +
|
| + // Finds the BookmarkNode from the model associated with |button|.
|
| + const BookmarkNode* GetNodeForToolButton(GtkWidget* button);
|
| +
|
| + // Creates and displays a popup menu for BookmarkNode |node|.
|
| + void PopupMenuForNode(GtkWidget* sender, const BookmarkNode* node,
|
| + GdkEventButton* event);
|
| +
|
| + // GtkButton callbacks.
|
| + CHROMEGTK_CALLBACK_1(BookmarkBarGtk, gboolean, OnButtonPressed,
|
| + GdkEventButton*);
|
| + CHROMEGTK_CALLBACK_1(BookmarkBarGtk, gboolean, OnSyncErrorButtonPressed,
|
| + GdkEventButton*);
|
| + CHROMEGTK_CALLBACK_0(BookmarkBarGtk, void, OnClicked);
|
| + CHROMEGTK_CALLBACK_1(BookmarkBarGtk, void, OnButtonDragBegin,
|
| + GdkDragContext*);
|
| + CHROMEGTK_CALLBACK_1(BookmarkBarGtk, void, OnButtonDragEnd, GdkDragContext*);
|
| + CHROMEGTK_CALLBACK_4(BookmarkBarGtk, void, OnButtonDragGet,
|
| + GdkDragContext*, GtkSelectionData*, guint, guint);
|
| +
|
| + // GtkButton callbacks for folder buttons.
|
| + CHROMEGTK_CALLBACK_0(BookmarkBarGtk, void, OnFolderClicked);
|
| +
|
| + // GtkToolbar callbacks.
|
| + CHROMEGTK_CALLBACK_4(BookmarkBarGtk, gboolean, OnToolbarDragMotion,
|
| + GdkDragContext*, gint, gint, guint);
|
| + CHROMEGTK_CALLBACK_1(BookmarkBarGtk, void, OnToolbarSizeAllocate,
|
| + GtkAllocation*);
|
| +
|
| + // Used for both folder buttons and the toolbar.
|
| + CHROMEGTK_CALLBACK_6(BookmarkBarGtk, void, OnDragReceived,
|
| + GdkDragContext*, gint, gint, GtkSelectionData*,
|
| + guint, guint);
|
| + CHROMEGTK_CALLBACK_2(BookmarkBarGtk, void, OnDragLeave,
|
| + GdkDragContext*, guint);
|
| +
|
| + // Used for folder buttons.
|
| + CHROMEGTK_CALLBACK_4(BookmarkBarGtk, gboolean, OnFolderDragMotion,
|
| + GdkDragContext*, gint, gint, guint);
|
| +
|
| + // GtkEventBox callbacks.
|
| + CHROMEGTK_CALLBACK_1(BookmarkBarGtk, gboolean, OnEventBoxExpose,
|
| + GdkEventExpose*);
|
| + CHROMEGTK_CALLBACK_0(BookmarkBarGtk, void, OnEventBoxDestroy);
|
| +
|
| + // Callbacks on our parent widget.
|
| + CHROMEGTK_CALLBACK_1(BookmarkBarGtk, void, OnParentSizeAllocate,
|
| + GtkAllocation*);
|
| +
|
| + // |throbbing_widget_| callback.
|
| + CHROMEGTK_CALLBACK_0(BookmarkBarGtk, void, OnThrobbingWidgetDestroy);
|
| +
|
| + // ProfileSyncServiceObserver method.
|
| + virtual void OnStateChanged();
|
| +
|
| + // Overriden from BookmarkBarInstructionsGtk::Delegate.
|
| + virtual void ShowImportDialog();
|
| +
|
| + Profile* profile_;
|
| +
|
| + // Used for opening urls.
|
| + PageNavigator* page_navigator_;
|
| +
|
| + Browser* browser_;
|
| + BrowserWindowGtk* window_;
|
| +
|
| + // Provides us with the offset into the background theme image.
|
| + TabstripOriginProvider* tabstrip_origin_provider_;
|
| +
|
| + // Model providing details as to the starred entries/groups that should be
|
| + // shown. This is owned by the Profile.
|
| + BookmarkModel* model_;
|
| +
|
| + // Contains |bookmark_hbox_|. Event box exists to prevent leakage of
|
| + // background color from the toplevel application window's GDK window.
|
| + OwnedWidgetGtk event_box_;
|
| +
|
| + // Used to float the bookmark bar when on the NTP.
|
| + GtkWidget* ntp_padding_box_;
|
| +
|
| + // Used to paint the background of the bookmark bar when in floating mode.
|
| + GtkWidget* paint_box_;
|
| +
|
| + // Used to position all children.
|
| + GtkWidget* bookmark_hbox_;
|
| +
|
| + // Alignment widget that is visible if there are no bookmarks on
|
| + // the bookmar bar.
|
| + GtkWidget* instructions_;
|
| +
|
| + // BookmarkBarInstructionsGtk that holds the label and the link for importing
|
| + // bookmarks when there are no bookmarks on the bookmark bar.
|
| + scoped_ptr<BookmarkBarInstructionsGtk> instructions_gtk_;
|
| +
|
| + // GtkToolbar which contains all the bookmark buttons.
|
| + OwnedWidgetGtk bookmark_toolbar_;
|
| +
|
| + // The button that shows extra bookmarks that don't fit on the bookmark
|
| + // bar.
|
| + GtkWidget* overflow_button_;
|
| +
|
| + // The other bookmarks button.
|
| + GtkWidget* other_bookmarks_button_;
|
| +
|
| + // The sync error button.
|
| + GtkWidget* sync_error_button_;
|
| +
|
| + // A pointer to the ProfileSyncService instance if one exists.
|
| + ProfileSyncService* sync_service_;
|
| +
|
| + // The BookmarkNode from the model being dragged. NULL when we aren't
|
| + // dragging.
|
| + const BookmarkNode* dragged_node_;
|
| +
|
| + // The visual representation that follows the cursor during drags.
|
| + GtkWidget* drag_icon_;
|
| +
|
| + // We create a GtkToolbarItem from |dragged_node_| ;or display.
|
| + GtkToolItem* toolbar_drop_item_;
|
| +
|
| + // Theme provider for building buttons.
|
| + GtkThemeProvider* theme_provider_;
|
| +
|
| + // Whether we should show the instructional text in the bookmark bar.
|
| + bool show_instructions_;
|
| +
|
| + MenuBarHelper menu_bar_helper_;
|
| +
|
| + // The last displayed right click menu, or NULL if no menus have been
|
| + // displayed yet.
|
| + // The controller.
|
| + scoped_ptr<BookmarkContextMenuController> current_context_menu_controller_;
|
| + // The view.
|
| + scoped_ptr<MenuGtk> current_context_menu_;
|
| +
|
| + // The last displayed left click menu, or NULL if no menus have been
|
| + // displayed yet.
|
| + scoped_ptr<BookmarkMenuController> current_menu_;
|
| +
|
| + scoped_ptr<ui::SlideAnimation> slide_animation_;
|
| +
|
| + // Whether we are currently configured as floating (detached from the
|
| + // toolbar). This reflects our actual state, and can be out of sync with
|
| + // what ShouldShowFloating() returns.
|
| + bool floating_;
|
| +
|
| + // Used to optimize out |bookmark_toolbar_| size-allocate events we don't
|
| + // need to respond to.
|
| + int last_allocation_width_;
|
| +
|
| + NotificationRegistrar registrar_;
|
| +
|
| + // The size of the tab contents last time we forced a paint. We keep track
|
| + // of this so we don't force too many paints.
|
| + gfx::Size last_tab_contents_size_;
|
| +
|
| + // The last coordinates recorded by OnButtonPress; used to line up the
|
| + // drag icon during bookmark drags.
|
| + gfx::Point last_pressed_coordinates_;
|
| +
|
| + // The currently throbbing widget. This is NULL if no widget is throbbing.
|
| + // We track it because we only want to allow one widget to throb at a time.
|
| + GtkWidget* throbbing_widget_;
|
| +
|
| + ScopedRunnableMethodFactory<BookmarkBarGtk> method_factory_;
|
| +};
|
| +
|
| +#endif // CHROME_BROWSER_UI_GTK_BOOKMARK_BAR_GTK_H_
|
|
|