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