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