172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
24a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
34a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// found in the LICENSE file.
44a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
5dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#ifndef CHROME_BROWSER_UI_VIEWS_BOOKMARKS_BOOKMARK_BAR_VIEW_H_
6dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#define CHROME_BROWSER_UI_VIEWS_BOOKMARKS_BOOKMARK_BAR_VIEW_H_
74a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#pragma once
84a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
94a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include <set>
104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
11dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "base/compiler_specific.h"
124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/bookmarks/bookmark_model_observer.h"
13dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/bookmarks/bookmark_node_data.h"
144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/sync/profile_sync_service.h"
15dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/views/bookmarks/bookmark_bar_instructions_view.h"
16dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/views/bookmarks/bookmark_menu_controller_views.h"
1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/views/detachable_toolbar_view.h"
18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_registrar.h"
193f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "ui/base/animation/animation_delegate.h"
204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "views/controls/button/button.h"
214a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "views/controls/menu/view_menu_delegate.h"
224a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
234a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass Browser;
244a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass PageNavigator;
254a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass PrefService;
263f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
273f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsennamespace ui {
284a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass SlideAnimation;
293f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen}
304a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
314a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochnamespace views {
324a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass CustomButton;
334a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass MenuButton;
344a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass MenuItemView;
354a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass TextButton;
364a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
374a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
384a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// BookmarkBarView renders the BookmarkModel.  Each starred entry on the
394a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// BookmarkBar is rendered as a MenuButton. An additional MenuButton aligned to
404a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// the right allows the user to quickly see recently starred entries.
414a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch//
424a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// BookmarkBarView shows the bookmarks from a specific Profile. BookmarkBarView
434a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// waits until the HistoryService for the profile has been loaded before
444a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// creating the BookmarkModel.
454a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass BookmarkBarView : public DetachableToolbarView,
464a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                        public ProfileSyncServiceObserver,
474a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                        public BookmarkModelObserver,
484a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                        public views::ViewMenuDelegate,
494a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                        public views::ButtonListener,
504a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                        public NotificationObserver,
514a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                        public views::ContextMenuController,
524a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                        public views::DragController,
533f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen                        public ui::AnimationDelegate,
544a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                        public BookmarkMenuController::Observer,
554a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                        public BookmarkBarInstructionsView::Delegate {
564a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  friend class ShowFolderMenuTask;
574a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
584a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch public:
594a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Constants used in Browser View, as well as here.
604a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // How inset the bookmarks bar is when displayed on the new tab page.
614a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  static const int kNewtabHorizontalPadding;
624a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  static const int kNewtabVerticalPadding;
634a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Maximum size of buttons on the bookmark bar.
654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  static const int kMaxButtonWidth;
664a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Interface implemented by controllers/views that need to be notified any
684a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // time the model changes, typically to cancel an operation that is showing
694a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // data from the model such as a menu. This isn't intended as a general
704a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // way to be notified of changes, rather for cases where a controller/view is
714a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // showing data from the model in a modal like setting and needs to cleanly
724a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // exit the modal loop if the model changes out from under it.
734a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  //
744a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // A controller/view that needs this notification should install itself as the
754a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // ModelChangeListener via the SetModelChangedListener method when shown and
764a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // reset the ModelChangeListener of the BookmarkBarView when it closes by way
774a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // of either the SetModelChangedListener method or the
784a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // ClearModelChangedListenerIfEquals method.
794a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  class ModelChangedListener {
804a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch   public:
814a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    virtual ~ModelChangedListener() {}
824a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
834a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    // Invoked when the model changes. Should cancel the edit and close any
844a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    // dialogs.
854a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    virtual void ModelChanged() = 0;
864a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  };
874a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
884a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  static const int kNewtabBarHeight;
894a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
904a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  BookmarkBarView(Profile* profile, Browser* browser);
914a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  virtual ~BookmarkBarView();
924a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
934a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Resets the profile. This removes any buttons for the current profile and
944a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // recreates the models.
954a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void SetProfile(Profile* profile);
964a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
974a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Returns the current profile.
984a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  Profile* GetProfile() { return profile_; }
994a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1004a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Returns the current browser.
1014a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  Browser* browser() const { return browser_; }
1024a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1034a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Sets the PageNavigator that is used when the user selects an entry on
1044a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // the bookmark bar.
1054a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void SetPageNavigator(PageNavigator* navigator);
1064a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1074a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Sets whether the containing browser is showing an infobar.  This affects
1084a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // layout during animation.
1094a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void set_infobar_visible(bool infobar_visible) {
1104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    infobar_visible_ = infobar_visible;
1114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  }
1124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1134a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  virtual bool IsOnTop() const;
114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // DetachableToolbarView methods:
116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual bool IsDetached() const OVERRIDE;
117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual double GetAnimationValue() const OVERRIDE;
118ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual int GetToolbarOverlap() const OVERRIDE;
1194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // View methods:
121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual gfx::Size GetPreferredSize() OVERRIDE;
122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual gfx::Size GetMinimumSize() OVERRIDE;
123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void Layout() OVERRIDE;
124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ViewHierarchyChanged(bool is_add, View* parent, View* child)
125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      OVERRIDE;
126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void PaintChildren(gfx::Canvas* canvas) OVERRIDE;
1274a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  virtual bool GetDropFormats(
1284a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      int* formats,
129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      std::set<ui::OSExchangeData::CustomFormat>* custom_formats) OVERRIDE;
130ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual bool AreDropTypesRequired() OVERRIDE;
131ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual bool CanDrop(const ui::OSExchangeData& data) OVERRIDE;
132ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void OnDragEntered(const views::DropTargetEvent& event) OVERRIDE;
133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual int OnDragUpdated(const views::DropTargetEvent& event) OVERRIDE;
134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void OnDragExited() OVERRIDE;
135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual int OnPerformDrop(const views::DropTargetEvent& event) OVERRIDE;
136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ShowContextMenu(const gfx::Point& p, bool is_mouse_gesture)
137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      OVERRIDE;
1384a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1394a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // AccessiblePaneView methods:
140ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE;
1414a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1424a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // ProfileSyncServiceObserver method.
1434a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  virtual void OnStateChanged();
1444a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1454a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Called when fullscreen mode toggles on or off; this affects our layout.
1464a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void OnFullscreenToggled(bool fullscreen);
1474a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1484a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Sets the model change listener to listener.
1494a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void SetModelChangedListener(ModelChangedListener* listener) {
1504a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    model_changed_listener_ = listener;
1514a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  }
1524a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1534a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // If the ModelChangedListener is listener, ModelChangeListener is set to
1544a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // NULL.
1554a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void ClearModelChangedListenerIfEquals(ModelChangedListener* listener) {
1564a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    if (model_changed_listener_ == listener)
1574a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      model_changed_listener_ = NULL;
1584a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  }
1594a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1604a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Returns the model change listener.
1614a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  ModelChangedListener* GetModelChangedListener() {
1624a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    return model_changed_listener_;
1634a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  }
1644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Returns the page navigator.
1664a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  PageNavigator* GetPageNavigator() { return page_navigator_; }
1674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1684a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Returns the model.
1694a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  BookmarkModel* GetModel() { return model_; }
1704a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1714a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Returns true if the bookmarks bar preference is set to 'always show'.
1724a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  bool IsAlwaysShown() const;
1734a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1744a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // True if we're on a page where the bookmarks bar is always visible.
1754a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  bool OnNewTabPage() const;
1764a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1774a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // How much we want the bookmark bar to overlap the toolbar.  If |return_max|
1784a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // is true, we return the maximum overlap rather than the current overlap.
1794a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  int GetToolbarOverlap(bool return_max) const;
1804a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1814a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Whether or not we are animating.
1824a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  bool is_animating();
1834a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1844a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // SlideAnimationDelegate implementation.
185dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void AnimationProgressed(const ui::Animation* animation);
186dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void AnimationEnded(const ui::Animation* animation);
1874a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1884a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // BookmarkMenuController::Observer
1894a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  virtual void BookmarkMenuDeleted(BookmarkMenuController* controller);
1904a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1914a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Returns the button at the specified index.
1924a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  views::TextButton* GetBookmarkButton(int index);
1934a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1944a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Returns the button responsible for showing bookmarks in the other bookmark
1954a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // folder.
1964a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  views::MenuButton* other_bookmarked_button() const {
1974a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    return other_bookmarked_button_;
1984a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  }
1994a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
2004a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Returns the active MenuItemView, or NULL if a menu isn't showing.
2014a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  views::MenuItemView* GetMenu();
2024a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
2034a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Returns the drop MenuItemView, or NULL if a menu isn't showing.
2044a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  views::MenuItemView* GetDropMenu();
2054a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
2064a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Returns the context menu, or null if one isn't showing.
2074a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  views::MenuItemView* GetContextMenu();
2084a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
2094a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Returns the button used when not all the items on the bookmark bar fit.
2104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  views::MenuButton* overflow_button() const { return overflow_button_; }
2114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
2124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // If |loc| is over a bookmark button the node is returned corresponding
2134a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // to the button and |start_index| is set to 0. If a overflow button is
2144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // showing and |loc| is over the overflow button, the bookmark bar node is
2154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // returned and |start_index| is set to the index of the first node
2164a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // contained in the overflow menu.
2174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  const BookmarkNode* GetNodeForButtonAt(const gfx::Point& loc,
2184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                                         int* start_index);
2194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
2204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Returns the MenuButton for node.
2214a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  views::MenuButton* GetMenuButtonForNode(const BookmarkNode* node);
2224a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
2234a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Returns the position to anchor the menu for |button| at, the index of the
2244a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // first child of the node to build the menu from.
2254a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void GetAnchorPositionAndStartIndexForButton(
2264a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      views::MenuButton* button,
2274a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      views::MenuItemView::AnchorPosition* anchor,
2284a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      int* start_index);
2294a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
2304a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // BookmarkBarInstructionsView::Delegate.
2314a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  virtual void ShowImportDialog();
2324a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
2334a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // If a button is currently throbbing, it is stopped. If immediate is true
2344a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // the throb stops immediately, otherwise it stops after a couple more
2354a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // throbs.
2364a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void StopThrobbing(bool immediate);
2374a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
238ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Returns the number of buttons corresponding to starred urls/folders. This
2394a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // is equivalent to the number of children the bookmark bar node from the
2404a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // bookmark bar model has.
2414a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  int GetBookmarkButtonCount();
2424a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
24372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Returns the tooltip text for the specified url and title. The returned
24472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // text is clipped to fit within the bounds of the monitor.
24572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  //
24672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Note that we adjust the direction of both the URL and the title based on
24772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // the locale so that pure LTR strings are displayed properly in RTL locales.
24872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  static std::wstring CreateToolTipForURLAndTitle(
24972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      const gfx::Point& screen_loc,
25072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      const GURL& url,
25172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      const std::wstring& title,
25272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      Profile* profile);
25372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
2544a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // If true we're running tests. This short circuits a couple of animations.
2554a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  static bool testing_;
2564a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
2574a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch private:
2584a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  class ButtonSeparatorView;
2594a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  struct DropInfo;
2604a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
2614a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Task that invokes ShowDropFolderForNode when run. ShowFolderDropMenuTask
2624a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // deletes itself once run.
2634a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  class ShowFolderDropMenuTask : public Task {
2644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch   public:
2654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    ShowFolderDropMenuTask(BookmarkBarView* view, const BookmarkNode* node)
2664a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      : view_(view),
2674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch        node_(node) {
2684a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    }
2694a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
2704a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    void Cancel() {
2714a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      view_->show_folder_drop_menu_task_ = NULL;
2724a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      view_ = NULL;
2734a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    }
2744a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
2754a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    virtual void Run() {
2764a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      if (view_) {
2774a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch        view_->show_folder_drop_menu_task_ = NULL;
2784a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch        view_->ShowDropFolderForNode(node_);
2794a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      }
2804a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      // MessageLoop deletes us.
2814a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    }
2824a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
2834a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch   private:
2844a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    BookmarkBarView* view_;
2854a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    const BookmarkNode* node_;
2864a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
2874a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    DISALLOW_COPY_AND_ASSIGN(ShowFolderDropMenuTask);
2884a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  };
2894a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
2904a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Creates recent bookmark button and when visible button as well as
2914a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // calculating the preferred height.
2924a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void Init();
2934a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
2944a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Creates the button showing the other bookmarked items.
2954a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  views::MenuButton* CreateOtherBookmarkedButton();
2964a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
2974a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Creates the button used when not all bookmark buttons fit.
2984a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  views::MenuButton* CreateOverflowButton();
2994a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
3004a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Invoked when the bookmark bar model has finished loading. Creates a button
3014a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // for each of the children of the root node from the model.
3024a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  virtual void Loaded(BookmarkModel* model);
3034a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
3044a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Invoked when the model is being deleted.
3054a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  virtual void BookmarkModelBeingDeleted(BookmarkModel* model);
3064a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
3074a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Invokes added followed by removed.
3084a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  virtual void BookmarkNodeMoved(BookmarkModel* model,
3094a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                                 const BookmarkNode* old_parent,
3104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                                 int old_index,
3114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                                 const BookmarkNode* new_parent,
3124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                                 int new_index);
3134a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
3144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Notifies ModelChangeListener of change.
3154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // If the node was added to the root node, a button is created and added to
3164a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // this bookmark bar view.
3174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  virtual void BookmarkNodeAdded(BookmarkModel* model,
3184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                                 const BookmarkNode* parent,
3194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                                 int index);
3204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
3214a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Implementation for BookmarkNodeAddedImpl.
3224a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void BookmarkNodeAddedImpl(BookmarkModel* model,
3234a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                             const BookmarkNode* parent,
3244a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                             int index);
3254a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
3264a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Notifies ModelChangeListener of change.
3274a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // If the node was a child of the root node, the button corresponding to it
3284a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // is removed.
3294a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  virtual void BookmarkNodeRemoved(BookmarkModel* model,
3304a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                                   const BookmarkNode* parent,
3314a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                                   int old_index,
3324a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                                   const BookmarkNode* node);
3334a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
3344a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Implementation for BookmarkNodeRemoved.
3354a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void BookmarkNodeRemovedImpl(BookmarkModel* model,
3364a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                               const BookmarkNode* parent,
3374a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                               int index);
3384a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
3394a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Notifies ModelChangedListener and invokes BookmarkNodeChangedImpl.
3404a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  virtual void BookmarkNodeChanged(BookmarkModel* model,
3414a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                                   const BookmarkNode* node);
3424a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
3434a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // If the node is a child of the root node, the button is updated
3444a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // appropriately.
3454a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void BookmarkNodeChangedImpl(BookmarkModel* model, const BookmarkNode* node);
3464a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
3474a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  virtual void BookmarkNodeChildrenReordered(BookmarkModel* model,
3484a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                                             const BookmarkNode* node);
3494a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
3504a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Invoked when the favicon is available. If the node is a child of the
3514a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // root node, the appropriate button is updated. If a menu is showing, the
3524a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // call is forwarded to the menu to allow for it to update the icon.
353ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void BookmarkNodeFaviconLoaded(BookmarkModel* model,
3544a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                                         const BookmarkNode* node);
3554a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
3564a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // DragController method. Determines the node representing sender and invokes
3574a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // WriteDragData to write the actual data.
358dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void WriteDragDataForView(views::View* sender,
359dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                    const gfx::Point& press_pt,
360dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                    ui::OSExchangeData* data) OVERRIDE;
3614a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
362dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual int GetDragOperationsForView(views::View* sender,
363dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                       const gfx::Point& p) OVERRIDE;
3644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
365dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual bool CanStartDragForView(views::View* sender,
366dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                   const gfx::Point& press_pt,
367dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                   const gfx::Point& p) OVERRIDE;
3684a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
369201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Writes a BookmarkNodeData for node to data.
370dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void WriteBookmarkDragData(const BookmarkNode* node,
371dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                             ui::OSExchangeData* data);
3724a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
3734a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // ViewMenuDelegate method. Ends up creating a BookmarkMenuController to
3744a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // show the menu.
3754a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  virtual void RunMenu(views::View* view, const gfx::Point& pt);
3764a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
3774a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Invoked when a star entry corresponding to a URL on the bookmark bar is
3784a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // pressed. Forwards to the PageNavigator to open the URL.
3794a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  virtual void ButtonPressed(views::Button* sender, const views::Event& event);
3804a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
3814a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Invoked for this View, one of the buttons or the 'other' button. Shows the
3824a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // appropriate context menu.
383dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void ShowContextMenuForView(views::View* source,
384dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                      const gfx::Point& p,
385dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                      bool is_mouse_gesture);
3864a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
3874a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Creates the button for rendering the specified bookmark node.
3884a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  views::View* CreateBookmarkButton(const BookmarkNode* node);
3894a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
3904a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // COnfigures the button from the specified node. This sets the text,
3914a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // and icon.
3924a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void ConfigureButton(const BookmarkNode* node, views::TextButton* button);
3934a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
3944a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Used when showing the menu allowing the user to choose when the bar is
3954a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // visible. Return value corresponds to the users preference for when the
3964a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // bar is visible.
3974a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  virtual bool IsItemChecked(int id) const;
3984a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
3994a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Used when showing the menu allowing the user to choose when the bar is
4004a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // visible. Updates the preferences to match the users choice as appropriate.
4014a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  virtual void ExecuteCommand(int id);
4024a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
4034a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // NotificationService method.
4044a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  virtual void Observe(NotificationType type,
4054a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                       const NotificationSource& source,
4064a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                       const NotificationDetails& details);
4074a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
4084a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Overridden from views::View.
4094a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  virtual void OnThemeChanged();
4104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
4114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // If the ModelChangedListener is non-null, ModelChanged is invoked on it.
4124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void NotifyModelChanged();
4134a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
4144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Shows the menu used during drag and drop for the specified node.
4154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void ShowDropFolderForNode(const BookmarkNode* node);
4164a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
4174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Cancels the timer used to show a drop menu.
4184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void StopShowFolderDropMenuTimer();
4194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
4204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Stars the timer used to show a drop menu for node.
4214a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void StartShowFolderDropMenuTimer(const BookmarkNode* node);
4224a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
4234a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Returns the drop operation and index for the drop based on the event
42472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // and data. Returns ui::DragDropTypes::DRAG_NONE if not a valid location.
4254a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  int CalculateDropOperation(const views::DropTargetEvent& event,
426201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                             const BookmarkNodeData& data,
4274a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                             int* index,
4284a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                             bool* drop_on,
4294a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                             bool* is_over_overflow,
4304a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                             bool* is_over_other);
4314a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
4324a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Returns the index of the first hidden bookmark button. If all buttons are
4334a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // visible, this returns GetBookmarkButtonCount().
4344a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  int GetFirstHiddenNodeIndex();
4354a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
4364a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // This determines which view should throb and starts it
4374a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // throbbing (e.g when the bookmark bubble is showing).
4384a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // If |overflow_only| is true, start throbbing only if |node| is hidden in
4394a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // the overflow menu.
4404a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void StartThrobbing(const BookmarkNode* node, bool overflow_only);
4414a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
442ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Returns the view to throb when a node is removed. |parent| is the parent of
443ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // the node that was removed, and |old_index| the index of the node that was
444ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // removed.
445ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  views::CustomButton* DetermineViewToThrobFromRemove(
446ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const BookmarkNode* parent,
447ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      int old_index);
448ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
4494a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Updates the colors for all the child objects in the bookmarks bar.
4504a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void UpdateColors();
4514a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
45272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Updates the visibility of |other_bookmarked_button_| and
45372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // |bookmarks_separator_view_|.
45472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void UpdateOtherBookmarksVisibility();
45572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
4564a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // This method computes the bounds for the bookmark bar items. If
4574a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // |compute_bounds_only| = TRUE, the bounds for the items are just computed,
4584a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // but are not set. This mode is used by GetPreferredSize() to obtain the
4594a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // desired bounds. If |compute_bounds_only| = FALSE, the bounds are set.
4604a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  gfx::Size LayoutItems(bool compute_bounds_only);
4614a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
4624a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Creates the sync error button and adds it as a child view.
4634a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  views::TextButton* CreateSyncErrorButton();
4644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
4654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  NotificationRegistrar registrar_;
4664a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
4674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  Profile* profile_;
4684a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
4694a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Used for opening urls.
4704a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  PageNavigator* page_navigator_;
4714a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
472ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Model providing details as to the starred entries/folders that should be
4734a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // shown. This is owned by the Profile.
4744a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  BookmarkModel* model_;
4754a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
4764a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Used to manage showing a Menu, either for the most recently bookmarked
477ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // entries, or for the starred folder.
4784a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  BookmarkMenuController* bookmark_menu_;
4794a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
4804a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Used when showing a menu for drag and drop. That is, if the user drags
481ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // over a folder this becomes non-null and manages the menu showing the
4824a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // contents of the node.
4834a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  BookmarkMenuController* bookmark_drop_menu_;
4844a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
4854a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Shows the other bookmark entries.
4864a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  views::MenuButton* other_bookmarked_button_;
4874a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
4884a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // ModelChangeListener.
4894a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  ModelChangedListener* model_changed_listener_;
4904a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
4914a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Task used to delay showing of the drop menu.
4924a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  ShowFolderDropMenuTask* show_folder_drop_menu_task_;
4934a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
4944a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Used to track drops on the bookmark bar view.
4954a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  scoped_ptr<DropInfo> drop_info_;
4964a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
4974a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // The sync re-login indicator which appears when the user needs to re-enter
4984a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // credentials in order to continue syncing.
4994a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  views::TextButton* sync_error_button_;
5004a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
5014a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // A pointer to the ProfileSyncService instance if one exists.
5024a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  ProfileSyncService* sync_service_;
5034a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
5044a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Visible if not all the bookmark buttons fit.
5054a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  views::MenuButton* overflow_button_;
5064a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
5074a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // BookmarkBarInstructionsView that is visible if there are no bookmarks on
5084a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // the bookmark bar.
5094a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  views::View* instructions_;
5104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
5114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  ButtonSeparatorView* bookmarks_separator_view_;
5124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
5134a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Owning browser. This is NULL during testing.
5144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  Browser* browser_;
5154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
5164a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // True if the owning browser is showing an infobar.
5174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  bool infobar_visible_;
5184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
5194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Animation controlling showing and hiding of the bar.
5203f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  scoped_ptr<ui::SlideAnimation> size_animation_;
5214a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
5224a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // If the bookmark bubble is showing, this is the visible ancestor of the URL.
5234a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // The visible ancestor is either the other_bookmarked_button_,
5244a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // overflow_button_ or a button on the bar.
5254a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  views::CustomButton* throbbing_view_;
5264a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
5274a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Background for extension toolstrips.
5284a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  SkBitmap toolstrip_background_;
5294a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
5304a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(BookmarkBarView);
5314a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch};
5324a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
533dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#endif  // CHROME_BROWSER_UI_VIEWS_BOOKMARKS_BOOKMARK_BAR_VIEW_H_
534