menu_item_view.h revision 5821806d5e7f356e8fa4b058a389a808ea183019
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_ITEM_VIEW_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define UI_VIEWS_CONTROLS_MENU_MENU_ITEM_VIEW_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/string16.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/models/menu_separator_types.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image_skia.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/menu/menu_config.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/view.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <windows.h> 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/native_theme/native_theme.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Font; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MenuModel; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NativeTheme; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MenuRunnerImpl; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MenuController; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MenuDelegate; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SubmenuView; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MenuItemView -------------------------------------------------------------- 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MenuItemView represents a single menu item with a label and optional icon. 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Each MenuItemView may also contain a submenu, which in turn may contain 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// any number of child MenuItemViews. 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// To use a menu create an initial MenuItemView using the constructor that 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// takes a MenuDelegate, then create any number of child menu items by way 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of the various AddXXX methods. 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MenuItemView is itself a View, which means you can add Views to each 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MenuItemView. This is normally NOT want you want, rather add other child 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Views to the submenu of the MenuItemView. Any child views of the MenuItemView 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that are focusable can be navigated to by way of the up/down arrow and can be 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// activated by way of space/return keys. Activating a focusable child results 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in |AcceleratorPressed| being invoked. Note, that as menus try not to steal 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// focus from the hosting window child views do not actually get focus. Instead 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |SetHotTracked| is used as the user navigates around. 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// To show the menu use MenuRunner. See MenuRunner for details on how to run 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (show) the menu as well as for details on the life time of the menu. 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class VIEWS_EXPORT MenuItemView : public View { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class MenuController; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The menu item view's class name. 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char kViewClassName[]; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ID used to identify menu items. 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kMenuItemViewID; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ID used to identify empty menu items. 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kEmptyMenuItemViewID; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Different types of menu items. EMPTY is a special type for empty 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // menus that is only used internally. 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum Type { 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NORMAL, 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SUBMENU, 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECKBOX, 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RADIO, 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SEPARATOR, 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EMPTY 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Where the menu should be anchored to for non-RTL languages. The 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // opposite position will be used if base::i18n:IsRTL() is true. 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum AnchorPosition { 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TOPLEFT, 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TOPRIGHT, 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BOTTOMCENTER 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Where the menu should be drawn, above or below the bounds (when 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the bounds is non-empty). POSITION_BEST_FIT (default) positions 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the menu below the bounds unless the menu does not fit on the 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // screen and the re is more space above. 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum MenuPosition { 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) POSITION_BEST_FIT, 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) POSITION_ABOVE_BOUNDS, 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) POSITION_BELOW_BOUNDS 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The data structure which is used for the menu size 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct MenuItemDimensions { 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Width of everything except the accelerator and children views. 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int standard_width; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The width of all contained views of the item. 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int children_width; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The amount of space needed to accommodate the accelerator. 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int accelerator_width; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The height of the menu item. 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int height; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuItemDimensions() 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : standard_width(0), 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) children_width(0), 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accelerator_width(0), 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) height(0) {} 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Constructor for use with the top level menu item. This menu is never 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // shown to the user, rather its use as the parent for all menu items. 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit MenuItemView(MenuDelegate* delegate); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from View: 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool GetTooltipText(const gfx::Point& p, 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16* tooltip) const OVERRIDE; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the preferred height of menu items. This is only valid when the 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // menu is about to be shown. 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static int pref_menu_height() { return pref_menu_height_; } 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // X-coordinate of where the label starts. 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static int label_start() { return label_start_; } 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the accessible name to be used with screen readers. Mnemonics are 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // removed and the menu item accelerator text is appended. 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static string16 GetAccessibleNameForMenuItem( 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& item_text, const string16& accelerator_text); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Hides and cancels the menu. This does nothing if the menu is not open. 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Cancel(); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add an item to the menu at a specified index. ChildrenChanged() should 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // called after adding menu items if the menu may be active. 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuItemView* AddMenuItemAt(int index, 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int item_id, 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& label, 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::ImageSkia& icon, 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Type type, 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MenuSeparatorType separator_style); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove an item from the menu at a specified index. 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ChildrenChanged() should be called after removing menu items (whether 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the menu may be active or not). 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RemoveMenuItemAt(int index); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Appends an item to this menu. 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // item_id The id of the item, used to identify it in delegate callbacks 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // or (if delegate is NULL) to identify the command associated 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // with this item with the controller specified in the ctor. Note 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that this value should not be 0 as this has a special meaning 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ("NULL command, no item selected") 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // label The text label shown. 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // type The type of item. 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuItemView* AppendMenuItem(int item_id, 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& label, 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Type type); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Append a submenu to this menu. 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The returned pointer is owned by this menu. 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuItemView* AppendSubMenu(int item_id, 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& label); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Append a submenu with an icon to this menu. 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The returned pointer is owned by this menu. 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuItemView* AppendSubMenuWithIcon(int item_id, 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& label, 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::ImageSkia& icon); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is a convenience for standard text label menu items where the label 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is provided with this call. 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuItemView* AppendMenuItemWithLabel(int item_id, 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& label); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is a convenience for text label menu items where the label is 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // provided by the delegate. 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuItemView* AppendDelegateMenuItem(int item_id); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds a separator to this menu 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AppendSeparator(); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Appends a menu item with an icon. This is for the menu item which 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // needs an icon. Calling this function forces the Menu class to draw 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the menu, instead of relying on Windows. 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuItemView* AppendMenuItemWithIcon(int item_id, 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& label, 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::ImageSkia& icon); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates a menu item for the specified entry in the model and appends it as 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a child. |index| should be offset by GetFirstItemIndex() before calling 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this function. 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuItemView* AppendMenuItemFromModel(ui::MenuModel* model, 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index, 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int id); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // All the AppendXXX methods funnel into this. 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuItemView* AppendMenuItemImpl(int item_id, 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& label, 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::ImageSkia& icon, 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Type type, 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MenuSeparatorType separator_style); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the view that contains child menu items. If the submenu has 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // not been creates, this creates it. 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual SubmenuView* CreateSubmenu(); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if this menu item has a submenu. 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool HasSubmenu() const; 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the view containing child menu items. 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual SubmenuView* GetSubmenu() const; 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the parent menu item. 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuItemView* GetParentMenuItem() { return parent_menu_item_; } 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MenuItemView* GetParentMenuItem() const { return parent_menu_item_; } 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets/Gets the title. 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetTitle(const string16& title); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& title() const { return title_; } 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the type of this menu. 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Type& GetType() const { return type_; } 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets whether this item is selected. This is invoked as the user moves 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the mouse around the menu while open. 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetSelected(bool selected); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if the item is selected. 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsSelected() const { return selected_; } 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the |tooltip| for a menu item view with |item_id| identifier. 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetTooltip(const string16& tooltip, int item_id); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the icon for the descendant identified by item_id. 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetIcon(const gfx::ImageSkia& icon, int item_id); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the icon of this menu item. 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetIcon(const gfx::ImageSkia& icon); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the view used to render the icon. This clobbers any icon set via 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SetIcon(). MenuItemView takes ownership of |icon_view|. 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetIconView(View* icon_view); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* icon_view() { return icon_view_; } 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the command id of this menu item. 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetCommand(int command) { command_ = command; } 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the command id of this item. 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int GetCommand() const { return command_; } 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Paints the menu item. 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the preferred size of this item. 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual gfx::Size GetPreferredSize() OVERRIDE; 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return the preferred dimensions of the item in pixel. 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuItemDimensions GetPreferredDimensions(); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the object responsible for controlling showing the menu. 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuController* GetMenuController(); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MenuController* GetMenuController() const; 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the delegate. This returns the delegate of the root menu item. 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuDelegate* GetDelegate(); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MenuDelegate* GetDelegate() const; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_delegate(MenuDelegate* delegate) { delegate_ = delegate; } 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the root parent, or this if this has no parent. 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuItemView* GetRootMenuItem(); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MenuItemView* GetRootMenuItem() const; 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the mnemonic for this MenuItemView, or 0 if this MenuItemView 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // doesn't have a mnemonic. 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char16 GetMnemonic(); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do we have icons? This only has effect on the top menu. Turning this on 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // makes the menus slightly wider and taller. 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_has_icons(bool has_icons) { 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) has_icons_ = has_icons; 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the descendant with the specified command. 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuItemView* GetMenuItemByID(int id); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Invoke if you remove/add children to the menu while it's showing. This 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // recalculates the bounds. 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ChildrenChanged(); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sizes any child views. 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Layout() OVERRIDE; 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if the menu has mnemonics. This only useful on the root menu 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // item. 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_mnemonics() const { return has_mnemonics_; } 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set top and bottom margins in pixels. If no margin is set or a 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // negative margin is specified then MenuConfig values are used. 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetMargins(int top_margin, int bottom_margin); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Suppress the right margin if this is set to false. 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_use_right_margin(bool use_right_margin) { 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) use_right_margin_ = use_right_margin; 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a reference to MenuConfig to be used with this menu. 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MenuConfig& GetMenuConfig() const; 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates a MenuItemView. This is used by the various AddXXX methods. 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuItemView(MenuItemView* parent, int command, Type type); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // MenuRunner owns MenuItemView and should be the only one deleting it. 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~MenuItemView(); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ChildPreferredSizeChanged(View* child) OVERRIDE; 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual std::string GetClassName() const OVERRIDE; 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the preferred size (and padding) of any children. 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual gfx::Size GetChildPreferredSize(); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the various margins. 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int GetTopMargin(); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int GetBottomMargin(); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class internal::MenuRunnerImpl; // For access to ~MenuItemView. 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum PaintButtonMode { PB_NORMAL, PB_FOR_DRAG }; 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calculates all sizes that we can from the OS. 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is invoked prior to Running a menu. 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UpdateMenuPartSizes(); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called by the two constructors to initialize this menu item. 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Init(MenuItemView* parent, 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int command, 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuItemView::Type type, 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuDelegate* delegate); 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The RunXXX methods call into this to set up the necessary state before 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // running. |is_first_menu| is true if no menus are currently showing. 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PrepareForRun(bool is_first_menu, 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_mnemonics, 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool show_mnemonics); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the flags passed to DrawStringInt. 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int GetDrawStringFlags(); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the font to use for menu text. 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Font& GetFont(); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If this menu item has no children a child is added showing it has no 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // children. Otherwise AddEmtpyMenus is recursively invoked on child menu 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // items that have children. 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddEmptyMenus(); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Undoes the work of AddEmptyMenus. 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RemoveEmptyMenus(); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Given bounds within our View, this helper routine mirrors the bounds if 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // necessary. 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AdjustBoundsForRTLUI(gfx::Rect* rect) const; 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Actual paint implementation. If mode is PB_FOR_DRAG, portions of the menu 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // are not rendered. 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PaintButton(gfx::Canvas* canvas, PaintButtonMode mode); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum SelectionState { SELECTED, UNSELECTED }; 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Paints the check/radio button indicator. 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PaintCheck(gfx::Canvas* canvas, 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::NativeTheme::State state, 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SelectionState selection_state, 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MenuConfig& config); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA) 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PaintButtonAura(gfx::Canvas* canvas, PaintButtonMode mode); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Paints the accelerator. 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PaintAccelerator(gfx::Canvas* canvas); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Destroys the window used to display this menu and recursively destroys 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the windows used to display all descendants. 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DestroyAllMenuHosts(); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the accelerator text. 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 GetAcceleratorText(); 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calculates the preferred size. 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size CalculatePreferredSize(); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used by MenuController to cache the menu position in use by the 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // active menu. 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuPosition actual_menu_position() const { return actual_menu_position_; } 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_actual_menu_position(MenuPosition actual_menu_position) { 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actual_menu_position_ = actual_menu_position; 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_controller(MenuController* controller) { controller_ = controller; } 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if this MenuItemView contains a single child 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that is responsible for rendering the content. 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsContainer() const; 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns number of child views excluding icon_view. 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int NonIconChildViewsCount() const; 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the max icon width; recurses over submenus. 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int GetMaxIconViewWidth() const; 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The delegate. This is only valid for the root menu item. You shouldn't 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // use this directly, instead use GetDelegate() which walks the tree as 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // as necessary. 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuDelegate* delegate_; 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The controller for the run operation, or NULL if the menu isn't showing. 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuController* controller_; 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used to detect when Cancel was invoked. 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool canceled_; 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Our parent. 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuItemView* parent_menu_item_; 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Type of menu. NOTE: MenuItemView doesn't itself represent SEPARATOR, 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that is handled by an entirely different view class. 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Type type_; 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether we're selected. 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool selected_; 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Command id. 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int command_; 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Submenu, created via CreateSubmenu. 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SubmenuView* submenu_; 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Title. 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 title_; 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Does the title have a mnemonic? Only useful on the root menu item. 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_mnemonics_; 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should we show the mnemonic? Mnemonics are shown if this is true or 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // MenuConfig says mnemonics should be shown. Only used on the root menu item. 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool show_mnemonics_; 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set if menu has icons or icon_views (applies to root menu item only). 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_icons_; 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pointer to a view with a menu icon. 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* icon_view_; 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The tooltip to show on hover for this menu item. 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 tooltip_; 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Width of a menu icon area. 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static int icon_area_width_; 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // X-coordinate of where the label starts. 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static int label_start_; 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Margins between the right of the item and the label. 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static int item_right_margin_; 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Preferred height of menu items. Reset every time a menu is run. 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static int pref_menu_height_; 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Previously calculated preferred size to reduce GetStringWidth calls in 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // GetPreferredSize. 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size pref_size_; 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Removed items to be deleted in ChildrenChanged(). 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<View*> removed_items_; 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Margins in pixels. 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int top_margin_; 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int bottom_margin_; 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |menu_position_| is the requested position with respect to the bounds. 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |actual_menu_position_| is used by the controller to cache the 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // position of the menu being shown. 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuPosition requested_menu_position_; 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuPosition actual_menu_position_; 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If set to false, the right margin will be removed for menu lines 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // containing other elements. 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool use_right_margin_; 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MenuItemView); 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace views 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // UI_VIEWS_CONTROLS_MENU_MENU_ITEM_VIEW_H_ 520