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_EXTENSIONS_BROWSER_ACTION_OVERFLOW_MENU_CONTROLLER_H_ 6 #define CHROME_BROWSER_UI_VIEWS_EXTENSIONS_BROWSER_ACTION_OVERFLOW_MENU_CONTROLLER_H_ 7 8 #include <set> 9 #include <vector> 10 11 #include "base/compiler_specific.h" 12 #include "base/memory/scoped_ptr.h" 13 #include "base/memory/scoped_vector.h" 14 #include "base/sequenced_task_runner_helpers.h" 15 #include "ui/views/controls/menu/menu_delegate.h" 16 17 class Browser; 18 class BrowserActionsContainer; 19 class BrowserActionView; 20 class IconUpdater; 21 22 namespace views { 23 class MenuRunner; 24 class Widget; 25 } 26 27 // This class handles the overflow menu for browser actions (showing the menu, 28 // drag and drop, etc). This class manages its own lifetime. 29 class BrowserActionOverflowMenuController : public views::MenuDelegate { 30 public: 31 // The observer is notified prior to the menu being deleted. 32 class Observer { 33 public: 34 virtual void NotifyMenuDeleted( 35 BrowserActionOverflowMenuController* controller) = 0; 36 }; 37 38 BrowserActionOverflowMenuController( 39 BrowserActionsContainer* owner, 40 Browser* browser, 41 views::MenuButton* menu_button, 42 const std::vector<BrowserActionView*>& views, 43 int start_index, 44 bool for_drop); 45 46 void set_observer(Observer* observer) { observer_ = observer; } 47 48 // Shows the overflow menu. 49 bool RunMenu(views::Widget* widget); 50 51 // Closes the overflow menu (and its context menu if open as well). 52 void CancelMenu(); 53 54 // Notify the menu that the associated BrowserActionViews have been deleted. 55 void NotifyBrowserActionViewsDeleting(); 56 57 // Overridden from views::MenuDelegate: 58 virtual bool IsCommandEnabled(int id) const OVERRIDE; 59 virtual void ExecuteCommand(int id) OVERRIDE; 60 virtual bool ShowContextMenu(views::MenuItemView* source, 61 int id, 62 const gfx::Point& p, 63 ui::MenuSourceType source_type) OVERRIDE; 64 virtual void DropMenuClosed(views::MenuItemView* menu) OVERRIDE; 65 // These drag functions offer support for dragging icons into the overflow 66 // menu. 67 virtual bool GetDropFormats( 68 views::MenuItemView* menu, 69 int* formats, 70 std::set<ui::OSExchangeData::CustomFormat>* custom_formats) OVERRIDE; 71 virtual bool AreDropTypesRequired(views::MenuItemView* menu) OVERRIDE; 72 virtual bool CanDrop(views::MenuItemView* menu, 73 const ui::OSExchangeData& data) OVERRIDE; 74 virtual int GetDropOperation(views::MenuItemView* item, 75 const ui::DropTargetEvent& event, 76 DropPosition* position) OVERRIDE; 77 virtual int OnPerformDrop(views::MenuItemView* menu, 78 DropPosition position, 79 const ui::DropTargetEvent& event) OVERRIDE; 80 // These three drag functions offer support for dragging icons out of the 81 // overflow menu. 82 virtual bool CanDrag(views::MenuItemView* menu) OVERRIDE; 83 virtual void WriteDragData(views::MenuItemView* sender, 84 ui::OSExchangeData* data) OVERRIDE; 85 virtual int GetDragOperations(views::MenuItemView* sender) OVERRIDE; 86 87 private: 88 // This class manages its own lifetime. 89 virtual ~BrowserActionOverflowMenuController(); 90 91 // Returns the offset into |views_| for the given |id|. 92 size_t IndexForId(int id) const; 93 94 // A pointer to the browser action container that owns the overflow menu. 95 BrowserActionsContainer* owner_; 96 97 Browser* browser_; 98 99 // The observer, may be null. 100 Observer* observer_; 101 102 // A pointer to the overflow menu button that we are showing the menu for. 103 views::MenuButton* menu_button_; 104 105 // The overflow menu for the menu button. Owned by |menu_runner_|. 106 views::MenuItemView* menu_; 107 108 // Resposible for running the menu. 109 scoped_ptr<views::MenuRunner> menu_runner_; 110 111 // The views vector of all the browser actions the container knows about. We 112 // won't show all items, just the one starting at |start_index| and above. 113 // Owned by |owner_|. 114 const std::vector<BrowserActionView*>& views_; 115 116 // The index into the BrowserActionView vector, indicating where to start 117 // picking browser actions to draw. 118 int start_index_; 119 120 // Whether this controller is being used for drop. 121 bool for_drop_; 122 123 // The vector keeps all icon updaters associated with menu item views in the 124 // controller. The icon updater will update the menu item view's icon when 125 // the browser action view's icon has been updated. 126 ScopedVector<IconUpdater> icon_updaters_; 127 128 friend class base::DeleteHelper<BrowserActionOverflowMenuController>; 129 130 DISALLOW_COPY_AND_ASSIGN(BrowserActionOverflowMenuController); 131 }; 132 133 #endif // CHROME_BROWSER_UI_VIEWS_EXTENSIONS_BROWSER_ACTION_OVERFLOW_MENU_CONTROLLER_H_ 134