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 15class BookmarkBarView; 16class BookmarkMenuControllerObserver; 17class BookmarkMenuDelegate; 18class BookmarkNode; 19class Browser; 20 21namespace content { 22class PageNavigator; 23} 24 25namespace ui { 26class OSExchangeData; 27} 28 29namespace views { 30class MenuButton; 31class MenuItemView; 32class MenuRunner; 33class 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. 40class 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