Home | History | Annotate | Download | only in bookmarks
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_BROWSER_UI_VIEWS_BOOKMARKS_BOOKMARK_MENU_CONTROLLER_VIEWS_H_
      6 #define CHROME_BROWSER_UI_VIEWS_BOOKMARKS_BOOKMARK_MENU_CONTROLLER_VIEWS_H_
      7 
      8 #include <set>
      9 
     10 #include "base/compiler_specific.h"
     11 #include "components/bookmarks/browser/base_bookmark_model_observer.h"
     12 #include "components/bookmarks/browser/bookmark_node_data.h"
     13 #include "ui/views/controls/menu/menu_delegate.h"
     14 
     15 class BookmarkBarView;
     16 class BookmarkMenuControllerObserver;
     17 class BookmarkMenuDelegate;
     18 class BookmarkNode;
     19 class Browser;
     20 
     21 namespace content {
     22 class PageNavigator;
     23 }
     24 
     25 namespace ui {
     26 class OSExchangeData;
     27 }
     28 
     29 namespace views {
     30 class MenuButton;
     31 class MenuItemView;
     32 class MenuRunner;
     33 class Widget;
     34 }
     35 
     36 // BookmarkMenuController is responsible for showing a menu of bookmarks,
     37 // each item in the menu represents a bookmark.
     38 // BookmarkMenuController deletes itself as necessary, although the menu can
     39 // be explicitly hidden by way of the Cancel method.
     40 class BookmarkMenuController : public BaseBookmarkModelObserver,
     41                                public views::MenuDelegate {
     42  public:
     43   // Creates a BookmarkMenuController showing the children of |node| starting
     44   // at |start_child_index|.
     45   BookmarkMenuController(Browser* browser,
     46                          content::PageNavigator* page_navigator,
     47                          views::Widget* parent,
     48                          const BookmarkNode* node,
     49                          int start_child_index,
     50                          bool for_drop);
     51 
     52   void RunMenuAt(BookmarkBarView* bookmark_bar);
     53 
     54   void clear_bookmark_bar() {
     55     bookmark_bar_ = NULL;
     56   }
     57 
     58   // Hides the menu.
     59   void Cancel();
     60 
     61   // Returns the node the menu is showing for.
     62   const BookmarkNode* node() const { return node_; }
     63 
     64   // Returns the menu.
     65   views::MenuItemView* menu() const;
     66 
     67   // Returns the context menu, or NULL if the context menu isn't showing.
     68   views::MenuItemView* context_menu() const;
     69 
     70   // Sets the page navigator.
     71   void SetPageNavigator(content::PageNavigator* navigator);
     72 
     73   void set_observer(BookmarkMenuControllerObserver* observer) {
     74     observer_ = observer;
     75   }
     76 
     77   // views::MenuDelegate:
     78   virtual base::string16 GetTooltipText(int id,
     79                                         const gfx::Point& p) const OVERRIDE;
     80   virtual bool IsTriggerableEvent(views::MenuItemView* view,
     81                                   const ui::Event& e) OVERRIDE;
     82   virtual void ExecuteCommand(int id, int mouse_event_flags) OVERRIDE;
     83   virtual bool ShouldExecuteCommandWithoutClosingMenu(
     84       int id,
     85       const ui::Event& e) OVERRIDE;
     86   virtual bool GetDropFormats(
     87       views::MenuItemView* menu,
     88       int* formats,
     89       std::set<ui::OSExchangeData::CustomFormat>* custom_formats) OVERRIDE;
     90   virtual bool AreDropTypesRequired(views::MenuItemView* menu) OVERRIDE;
     91   virtual bool CanDrop(views::MenuItemView* menu,
     92                        const ui::OSExchangeData& data) OVERRIDE;
     93   virtual int GetDropOperation(views::MenuItemView* item,
     94                                const ui::DropTargetEvent& event,
     95                                DropPosition* position) OVERRIDE;
     96   virtual int OnPerformDrop(views::MenuItemView* menu,
     97                             DropPosition position,
     98                             const ui::DropTargetEvent& event) OVERRIDE;
     99   virtual bool ShowContextMenu(views::MenuItemView* source,
    100                                int id,
    101                                const gfx::Point& p,
    102                                ui::MenuSourceType source_type) OVERRIDE;
    103   virtual void DropMenuClosed(views::MenuItemView* menu) OVERRIDE;
    104   virtual bool CanDrag(views::MenuItemView* menu) OVERRIDE;
    105   virtual void WriteDragData(views::MenuItemView* sender,
    106                              ui::OSExchangeData* data) OVERRIDE;
    107   virtual int GetDragOperations(views::MenuItemView* sender) OVERRIDE;
    108   virtual views::MenuItemView* GetSiblingMenu(
    109       views::MenuItemView* menu,
    110       const gfx::Point& screen_point,
    111       views::MenuAnchorPosition* anchor,
    112       bool* has_mnemonics,
    113       views::MenuButton** button) OVERRIDE;
    114   virtual int GetMaxWidthForMenu(views::MenuItemView* view) OVERRIDE;
    115 
    116   // BaseBookmarkModelObserver:
    117   virtual void BookmarkModelChanged() OVERRIDE;
    118 
    119  private:
    120   // BookmarkMenuController deletes itself as necessary.
    121   virtual ~BookmarkMenuController();
    122 
    123   scoped_ptr<views::MenuRunner> menu_runner_;
    124 
    125   scoped_ptr<BookmarkMenuDelegate> menu_delegate_;
    126 
    127   // The node we're showing the contents of.
    128   const BookmarkNode* node_;
    129 
    130   // Data for the drop.
    131   bookmarks::BookmarkNodeData drop_data_;
    132 
    133   // The observer, may be null.
    134   BookmarkMenuControllerObserver* observer_;
    135 
    136   // Is the menu being shown for a drop?
    137   bool for_drop_;
    138 
    139   // The bookmark bar. This is only non-null if we're showing a menu item for a
    140   // folder on the bookmark bar and not for drop, or if the BookmarkBarView has
    141   // been destroyed before the menu.
    142   BookmarkBarView* bookmark_bar_;
    143 
    144   DISALLOW_COPY_AND_ASSIGN(BookmarkMenuController);
    145 };
    146 
    147 #endif  // CHROME_BROWSER_UI_VIEWS_BOOKMARKS_BOOKMARK_MENU_CONTROLLER_VIEWS_H_
    148