15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_UI_VIEWS_EXTENSIONS_BROWSER_ACTION_OVERFLOW_MENU_CONTROLLER_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_UI_VIEWS_EXTENSIONS_BROWSER_ACTION_OVERFLOW_MENU_CONTROLLER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/memory/scoped_vector.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/sequenced_task_runner_helpers.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/menu/menu_delegate.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Browser; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BrowserActionsContainer; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BrowserActionView; 20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class IconUpdater; 21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MenuRunner; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Widget; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class handles the overflow menu for browser actions (showing the menu, 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// drag and drop, etc). This class manages its own lifetime. 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BrowserActionOverflowMenuController : public views::MenuDelegate { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The observer is notified prior to the menu being deleted. 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class Observer { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void NotifyMenuDeleted( 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserActionOverflowMenuController* controller) = 0; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserActionOverflowMenuController( 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserActionsContainer* owner, 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* browser, 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::MenuButton* menu_button, 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<BrowserActionView*>& views, 43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int start_index, 44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool for_drop); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_observer(Observer* observer) { observer_ = observer; } 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Shows the overflow menu. 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool RunMenu(views::Widget* widget); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Closes the overflow menu (and its context menu if open as well). 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CancelMenu(); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Notify the menu that the associated BrowserActionViews have been deleted. 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void NotifyBrowserActionViewsDeleting(); 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from views::MenuDelegate: 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool IsCommandEnabled(int id) const OVERRIDE; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ExecuteCommand(int id) OVERRIDE; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool ShowContextMenu(views::MenuItemView* source, 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int id, 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Point& p, 637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ui::MenuSourceType source_type) OVERRIDE; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void DropMenuClosed(views::MenuItemView* menu) OVERRIDE; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These drag functions offer support for dragging icons into the overflow 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // menu. 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool GetDropFormats( 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::MenuItemView* menu, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int* formats, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<ui::OSExchangeData::CustomFormat>* custom_formats) OVERRIDE; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool AreDropTypesRequired(views::MenuItemView* menu) OVERRIDE; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool CanDrop(views::MenuItemView* menu, 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::OSExchangeData& data) OVERRIDE; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int GetDropOperation(views::MenuItemView* item, 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::DropTargetEvent& event, 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DropPosition* position) OVERRIDE; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int OnPerformDrop(views::MenuItemView* menu, 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DropPosition position, 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::DropTargetEvent& event) OVERRIDE; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These three drag functions offer support for dragging icons out of the 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // overflow menu. 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool CanDrag(views::MenuItemView* menu) OVERRIDE; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void WriteDragData(views::MenuItemView* sender, 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::OSExchangeData* data) OVERRIDE; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int GetDragOperations(views::MenuItemView* sender) OVERRIDE; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This class manages its own lifetime. 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~BrowserActionOverflowMenuController(); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Returns the offset into |views_| for the given |id|. 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t IndexForId(int id) const; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A pointer to the browser action container that owns the overflow menu. 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserActionsContainer* owner_; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* browser_; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The observer, may be null. 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Observer* observer_; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A pointer to the overflow menu button that we are showing the menu for. 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::MenuButton* menu_button_; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The overflow menu for the menu button. Owned by |menu_runner_|. 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::MenuItemView* menu_; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Resposible for running the menu. 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<views::MenuRunner> menu_runner_; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The views vector of all the browser actions the container knows about. We 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // won't show all items, just the one starting at |start_index| and above. 1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Owned by |owner_|. 1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::vector<BrowserActionView*>& views_; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The index into the BrowserActionView vector, indicating where to start 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // picking browser actions to draw. 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int start_index_; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether this controller is being used for drop. 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool for_drop_; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The vector keeps all icon updaters associated with menu item views in the 124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // controller. The icon updater will update the menu item view's icon when 125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // the browser action view's icon has been updated. 126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ScopedVector<IconUpdater> icon_updaters_; 127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class base::DeleteHelper<BrowserActionOverflowMenuController>; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(BrowserActionOverflowMenuController); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_UI_VIEWS_EXTENSIONS_BROWSER_ACTION_OVERFLOW_MENU_CONTROLLER_H_ 134