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 UI_VIEWS_CONTROLS_MENU_MENU_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define UI_VIEWS_CONTROLS_MENU_MENU_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
115e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string16.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/native_widget_types.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/views_export.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ImageSkia;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Point;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Accelerator;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class VIEWS_EXPORT Menu {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /////////////////////////////////////////////////////////////////////////////
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Delegate Interface
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //  Classes implement this interface to tell the menu system more about each
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //  item as it is created.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /////////////////////////////////////////////////////////////////////////////
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class VIEWS_EXPORT Delegate {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~Delegate() {}
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Whether or not an item should be shown as checked.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool IsItemChecked(int id) const;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Whether or not an item should be shown as the default (using bold).
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // There can only be one default menu item.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool IsItemDefault(int id) const;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The string shown for the menu item.
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    virtual base::string16 GetLabel(int id) const;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The delegate needs to implement this function if it wants to display
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the shortcut text next to each menu item. If there is an accelerator
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // for a given item id, the implementor must return it.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool GetAcceleratorInfo(int id, ui::Accelerator* accel);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The icon shown for the menu item.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual const gfx::ImageSkia& GetIcon(int id) const;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The number of items to show in the menu
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual int GetItemCount() const;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Whether or not an item is a separator.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool IsItemSeparator(int id) const;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Shows the context menu with the specified id. This is invoked when the
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // user does the appropriate gesture to show a context menu. The id
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // identifies the id of the menu to show the context menu for.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // is_mouse_gesture is true if this is the result of a mouse gesture.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If this is not the result of a mouse gesture |p| is the recommended
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // location to display the content menu at. In either case, |p| is in
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // screen coordinates.
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void ShowContextMenu(Menu* source,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 int id,
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const gfx::Point& p,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 bool is_mouse_gesture) {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Whether an item has an icon.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool HasIcon(int id) const;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Notification that the menu is about to be popped up.
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void MenuWillShow() {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Whether to create a right-to-left menu. The default implementation
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // returns true if the locale's language is a right-to-left language (such
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // as Hebrew) and false otherwise. This is generally the right behavior
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // since there is no reason to show left-to-right menus for right-to-left
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // locales. However, subclasses can override this behavior so that the menu
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // is a right-to-left menu only if the view's layout is right-to-left
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // (since the view can use a different layout than the locale's language
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // layout).
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool IsRightToLeftUILayout() const;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Controller
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool SupportsCommand(int id) const;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool IsCommandEnabled(int id) const;
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    virtual bool GetContextualLabel(int id, base::string16* out) const;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void ExecuteCommand(int id) {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   protected:
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Returns an empty icon.
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::ImageSkia& GetEmptyIcon() const;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // How this popup should align itself relative to the point it is run at.
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum AnchorPoint {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TOPLEFT,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TOPRIGHT
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Different types of menu items
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum MenuItemType {
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NORMAL,
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CHECKBOX,
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RADIO,
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SEPARATOR
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Construct a Menu using the specified controller to determine command
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // state.
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // delegate     A Menu::Delegate implementation that provides more
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //              information about the Menu presentation.
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // anchor       An alignment hint for the popup menu.
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // owner        The window that the menu is being brought up relative
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //              to. Not actually used for anything but must not be
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //              NULL.
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Menu(Delegate* delegate, AnchorPoint anchor);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Menu();
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~Menu();
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static Menu* Create(Delegate* delegate,
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      AnchorPoint anchor,
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      gfx::NativeView parent);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a new menu with the contents of the system menu for the given
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // parent window. The caller owns the returned pointer.
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static Menu* GetSystemMenu(gfx::NativeWindow parent);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_delegate(Delegate* delegate) { delegate_ = delegate; }
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Delegate* delegate() const { return delegate_; }
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AnchorPoint anchor() const { return anchor_; }
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds an item to this menu.
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // item_id    The id of the item, used to identify it in delegate callbacks
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //            or (if delegate is NULL) to identify the command associated
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //            with this item with the controller specified in the ctor. Note
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //            that this value should not be 0 as this has a special meaning
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //            ("NULL command, no item selected")
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // label      The text label shown.
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // type       The type of item.
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AppendMenuItem(int item_id,
1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      const base::string16& label,
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      MenuItemType type);
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddMenuItem(int index,
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   int item_id,
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                   const base::string16& label,
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   MenuItemType type);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Append a submenu to this menu.
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The returned pointer is owned by this menu.
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Menu* AppendSubMenu(int item_id,
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      const base::string16& label);
1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Menu* AddSubMenu(int index, int item_id, const base::string16& label);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Append a submenu with an icon to this menu
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The returned pointer is owned by this menu.
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unless the icon is empty, calling this function forces the Menu class
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to draw the menu, instead of relying on Windows.
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Menu* AppendSubMenuWithIcon(int item_id,
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                              const base::string16& label,
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const gfx::ImageSkia& icon);
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual Menu* AddSubMenuWithIcon(int index,
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   int item_id,
1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   const base::string16& label,
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const gfx::ImageSkia& icon) = 0;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is a convenience for standard text label menu items where the label
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is provided with this call.
1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void AppendMenuItemWithLabel(int item_id, const base::string16& label);
1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void AddMenuItemWithLabel(int index,
1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            int item_id,
1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            const base::string16& label);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is a convenience for text label menu items where the label is
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // provided by the delegate.
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AppendDelegateMenuItem(int item_id);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddDelegateMenuItem(int index, int item_id);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds a separator to this menu
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AppendSeparator();
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AddSeparator(int index) = 0;
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Appends a menu item with an icon. This is for the menu item which
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // needs an icon. Calling this function forces the Menu class to draw
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the menu, instead of relying on Windows.
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AppendMenuItemWithIcon(int item_id,
1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                              const base::string16& label,
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const gfx::ImageSkia& icon);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AddMenuItemWithIcon(int index,
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   int item_id,
2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   const base::string16& label,
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const gfx::ImageSkia& icon);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Enables or disables the item with the specified id.
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void EnableMenuItemByID(int item_id, bool enabled) = 0;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void EnableMenuItemAt(int index, bool enabled) = 0;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets menu label at specified index.
2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void SetMenuLabel(int item_id, const base::string16& label) = 0;
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets an icon for an item with a given item_id. Calling this function
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // also forces the Menu class to draw the menu, instead of relying on Windows.
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns false if the item with |item_id| is not found.
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool SetIcon(const gfx::ImageSkia& icon, int item_id) = 0;
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Shows the menu, blocks until the user dismisses the menu or selects an
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // item, and executes the command for the selected item (if any).
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Warning: Blocking call. Will implicitly run a message loop.
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void RunMenuAt(int x, int y) = 0;
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cancels the menu.
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Cancel() = 0;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the number of menu items.
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int ItemCount() = 0;
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the underlying menu handle
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual HMENU GetMenuHandle() const = 0;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_WIN)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit Menu(Menu* parent);
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AddMenuItemInternal(int index,
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   int item_id,
2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   const base::string16& label,
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const gfx::ImageSkia& icon,
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   MenuItemType type) = 0;
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The delegate that is being used to get information about the presentation.
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Delegate* delegate_;
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // How this popup menu should be aligned relative to the point it is run at.
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AnchorPoint anchor_;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(Menu);
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace views
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // UI_VIEWS_CONTROLS_MENU_MENU_H_
256