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 clear_bookmark_bar()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. node()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 set_observer(BookmarkMenuControllerObserver * observer)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