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" 135e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/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" 185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ui/views/controls/menu/menu_types.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/view.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <windows.h> 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/native_theme/native_theme.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx { 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class FontList; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MenuRunnerImpl; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MenuController; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MenuDelegate; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SubmenuView; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MenuItemView -------------------------------------------------------------- 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MenuItemView represents a single menu item with a label and optional icon. 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Each MenuItemView may also contain a submenu, which in turn may contain 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// any number of child MenuItemViews. 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// To use a menu create an initial MenuItemView using the constructor that 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// takes a MenuDelegate, then create any number of child menu items by way 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of the various AddXXX methods. 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MenuItemView is itself a View, which means you can add Views to each 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MenuItemView. This is normally NOT want you want, rather add other child 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Views to the submenu of the MenuItemView. Any child views of the MenuItemView 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that are focusable can be navigated to by way of the up/down arrow and can be 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// activated by way of space/return keys. Activating a focusable child results 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in |AcceleratorPressed| being invoked. Note, that as menus try not to steal 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// focus from the hosting window child views do not actually get focus. Instead 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |SetHotTracked| is used as the user navigates around. 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// To show the menu use MenuRunner. See MenuRunner for details on how to run 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (show) the menu as well as for details on the life time of the menu. 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class VIEWS_EXPORT MenuItemView : public View { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class MenuController; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The menu item view's class name. 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char kViewClassName[]; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ID used to identify menu items. 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kMenuItemViewID; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ID used to identify empty menu items. 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kEmptyMenuItemViewID; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Different types of menu items. EMPTY is a special type for empty 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // menus that is only used internally. 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum Type { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NORMAL, 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SUBMENU, 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECKBOX, 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RADIO, 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SEPARATOR, 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EMPTY 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Where the menu should be drawn, above or below the bounds (when 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the bounds is non-empty). POSITION_BEST_FIT (default) positions 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the menu below the bounds unless the menu does not fit on the 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // screen and the re is more space above. 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum MenuPosition { 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) POSITION_BEST_FIT, 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) POSITION_ABOVE_BOUNDS, 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) POSITION_BELOW_BOUNDS 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The data structure which is used for the menu size 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct MenuItemDimensions { 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MenuItemDimensions() 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : standard_width(0), 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) children_width(0), 1027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch minor_text_width(0), 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) height(0) {} 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Width of everything except the accelerator and children views. 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int standard_width; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The width of all contained views of the item. 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int children_width; 1097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // The amount of space needed to accommodate the subtext. 1107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int minor_text_width; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The height of the menu item. 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int height; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Constructor for use with the top level menu item. This menu is never 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // shown to the user, rather its use as the parent for all menu items. 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit MenuItemView(MenuDelegate* delegate); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from View: 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool GetTooltipText(const gfx::Point& p, 1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16* tooltip) const OVERRIDE; 122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void GetAccessibleState(ui::AXViewState* state) OVERRIDE; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the preferred height of menu items. This is only valid when the 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // menu is about to be shown. 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static int pref_menu_height() { return pref_menu_height_; } 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // X-coordinate of where the label starts. 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static int label_start() { return label_start_; } 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns if a given |anchor| is a bubble or not. 1325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu static bool IsBubble(MenuAnchorPosition anchor); 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the accessible name to be used with screen readers. Mnemonics are 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // removed and the menu item accelerator text is appended. 1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static base::string16 GetAccessibleNameForMenuItem( 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& item_text, const base::string16& accelerator_text); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Hides and cancels the menu. This does nothing if the menu is not open. 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Cancel(); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add an item to the menu at a specified index. ChildrenChanged() should 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // called after adding menu items if the menu may be active. 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuItemView* AddMenuItemAt(int index, 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int item_id, 1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& label, 1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& sublabel, 1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& minor_text, 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::ImageSkia& icon, 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Type type, 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MenuSeparatorType separator_style); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 153868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Remove an item from the menu at a specified index. The removed MenuItemView 154868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // is deleted when ChildrenChanged() is invoked. 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RemoveMenuItemAt(int index); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Appends an item to this menu. 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // item_id The id of the item, used to identify it in delegate callbacks 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // or (if delegate is NULL) to identify the command associated 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // with this item with the controller specified in the ctor. Note 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that this value should not be 0 as this has a special meaning 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ("NULL command, no item selected") 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // label The text label shown. 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // type The type of item. 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuItemView* AppendMenuItem(int item_id, 1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& label, 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Type type); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Append a submenu to this menu. 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The returned pointer is owned by this menu. 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuItemView* AppendSubMenu(int item_id, 1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& label); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Append a submenu with an icon to this menu. 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The returned pointer is owned by this menu. 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuItemView* AppendSubMenuWithIcon(int item_id, 1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& label, 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::ImageSkia& icon); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is a convenience for standard text label menu items where the label 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is provided with this call. 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuItemView* AppendMenuItemWithLabel(int item_id, 1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& label); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is a convenience for text label menu items where the label is 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // provided by the delegate. 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuItemView* AppendDelegateMenuItem(int item_id); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds a separator to this menu 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AppendSeparator(); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Appends a menu item with an icon. This is for the menu item which 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // needs an icon. Calling this function forces the Menu class to draw 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the menu, instead of relying on Windows. 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuItemView* AppendMenuItemWithIcon(int item_id, 1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& label, 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::ImageSkia& icon); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // All the AppendXXX methods funnel into this. 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuItemView* AppendMenuItemImpl(int item_id, 2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& label, 2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& sublabel, 2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& minor_text, 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::ImageSkia& icon, 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Type type, 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MenuSeparatorType separator_style); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the view that contains child menu items. If the submenu has 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // not been creates, this creates it. 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual SubmenuView* CreateSubmenu(); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if this menu item has a submenu. 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool HasSubmenu() const; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the view containing child menu items. 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual SubmenuView* GetSubmenu() const; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the parent menu item. 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuItemView* GetParentMenuItem() { return parent_menu_item_; } 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MenuItemView* GetParentMenuItem() const { return parent_menu_item_; } 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets/Gets the title. 2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void SetTitle(const base::string16& title); 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& title() const { return title_; } 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Sets the subtitle. 2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void SetSubtitle(const base::string16& subtitle); 2287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 22958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Sets the minor text. 2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void SetMinorText(const base::string16& minor_text); 23158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the type of this menu. 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Type& GetType() const { return type_; } 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets whether this item is selected. This is invoked as the user moves 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the mouse around the menu while open. 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetSelected(bool selected); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if the item is selected. 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsSelected() const { return selected_; } 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the |tooltip| for a menu item view with |item_id| identifier. 2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void SetTooltip(const base::string16& tooltip, int item_id); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the icon for the descendant identified by item_id. 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetIcon(const gfx::ImageSkia& icon, int item_id); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the icon of this menu item. 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetIcon(const gfx::ImageSkia& icon); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the view used to render the icon. This clobbers any icon set via 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SetIcon(). MenuItemView takes ownership of |icon_view|. 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetIconView(View* icon_view); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* icon_view() { return icon_view_; } 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the command id of this menu item. 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetCommand(int command) { command_ = command; } 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the command id of this item. 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int GetCommand() const { return command_; } 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Paints the menu item. 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the preferred size of this item. 266cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual gfx::Size GetPreferredSize() const OVERRIDE; 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Gets the preferred height for the given |width|. This is only different 2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // from GetPreferredSize().width() if the item has a child view with flexible 2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // dimensions. 2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual int GetHeightForWidth(int width) const OVERRIDE; 2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return the preferred dimensions of the item in pixel. 274cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const MenuItemDimensions& GetDimensions() const; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the object responsible for controlling showing the menu. 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuController* GetMenuController(); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MenuController* GetMenuController() const; 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the delegate. This returns the delegate of the root menu item. 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuDelegate* GetDelegate(); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MenuDelegate* GetDelegate() const; 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_delegate(MenuDelegate* delegate) { delegate_ = delegate; } 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the root parent, or this if this has no parent. 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuItemView* GetRootMenuItem(); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MenuItemView* GetRootMenuItem() const; 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the mnemonic for this MenuItemView, or 0 if this MenuItemView 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // doesn't have a mnemonic. 2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::char16 GetMnemonic(); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do we have icons? This only has effect on the top menu. Turning this on 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // makes the menus slightly wider and taller. 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_has_icons(bool has_icons) { 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) has_icons_ = has_icons; 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool has_icons() const { return has_icons_; } 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the descendant with the specified command. 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuItemView* GetMenuItemByID(int id); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Invoke if you remove/add children to the menu while it's showing. This 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // recalculates the bounds. 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ChildrenChanged(); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sizes any child views. 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Layout() OVERRIDE; 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if the menu has mnemonics. This only useful on the root menu 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // item. 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_mnemonics() const { return has_mnemonics_; } 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set top and bottom margins in pixels. If no margin is set or a 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // negative margin is specified then MenuConfig values are used. 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetMargins(int top_margin, int bottom_margin); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Suppress the right margin if this is set to false. 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_use_right_margin(bool use_right_margin) { 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) use_right_margin_ = use_right_margin; 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a reference to MenuConfig to be used with this menu. 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MenuConfig& GetMenuConfig() const; 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates a MenuItemView. This is used by the various AddXXX methods. 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuItemView(MenuItemView* parent, int command, Type type); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // MenuRunner owns MenuItemView and should be the only one deleting it. 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~MenuItemView(); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ChildPreferredSizeChanged(View* child) OVERRIDE; 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual const char* GetClassName() const OVERRIDE; 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the preferred size (and padding) of any children. 338cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual gfx::Size GetChildPreferredSize() const; 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the various margins. 341cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int GetTopMargin() const; 342cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int GetBottomMargin() const; 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class internal::MenuRunnerImpl; // For access to ~MenuItemView. 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum PaintButtonMode { PB_NORMAL, PB_FOR_DRAG }; 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calculates all sizes that we can from the OS. 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is invoked prior to Running a menu. 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UpdateMenuPartSizes(); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called by the two constructors to initialize this menu item. 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Init(MenuItemView* parent, 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int command, 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuItemView::Type type, 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuDelegate* delegate); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The RunXXX methods call into this to set up the necessary state before 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // running. |is_first_menu| is true if no menus are currently showing. 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PrepareForRun(bool is_first_menu, 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_mnemonics, 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool show_mnemonics); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Returns the flags passed to DrawStringRect. 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int GetDrawStringFlags(); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Returns the font list to use for menu text. 370cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const gfx::FontList& GetFontList() const; 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If this menu item has no children a child is added showing it has no 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // children. Otherwise AddEmtpyMenus is recursively invoked on child menu 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // items that have children. 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddEmptyMenus(); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Undoes the work of AddEmptyMenus. 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RemoveEmptyMenus(); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Given bounds within our View, this helper routine mirrors the bounds if 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // necessary. 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AdjustBoundsForRTLUI(gfx::Rect* rect) const; 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Actual paint implementation. If mode is PB_FOR_DRAG, portions of the menu 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // are not rendered. 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PaintButton(gfx::Canvas* canvas, PaintButtonMode mode); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Paints the right-side text. 3897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void PaintMinorText(gfx::Canvas* canvas, bool render_selection); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Destroys the window used to display this menu and recursively destroys 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the windows used to display all descendants. 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DestroyAllMenuHosts(); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Returns the text that should be displayed on the end (right) of the menu 3967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // item. This will be the accelerator (if one exists), otherwise |subtitle_|. 397cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::string16 GetMinorText() const; 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Calculates and returns the MenuItemDimensions. 400cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) MenuItemDimensions CalculateDimensions() const; 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Get the horizontal position at which to draw the menu item's label. 403cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int GetLabelStartForThisItem() const; 404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used by MenuController to cache the menu position in use by the 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // active menu. 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuPosition actual_menu_position() const { return actual_menu_position_; } 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_actual_menu_position(MenuPosition actual_menu_position) { 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actual_menu_position_ = actual_menu_position; 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_controller(MenuController* controller) { controller_ = controller; } 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if this MenuItemView contains a single child 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that is responsible for rendering the content. 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsContainer() const; 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns number of child views excluding icon_view. 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int NonIconChildViewsCount() const; 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the max icon width; recurses over submenus. 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int GetMaxIconViewWidth() const; 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns true if the menu has items with a checkbox or a radio button. 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool HasChecksOrRadioButtons() const; 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void invalidate_dimensions() { dimensions_.height = 0; } 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_dimensions_valid() const { return dimensions_.height > 0; } 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The delegate. This is only valid for the root menu item. You shouldn't 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // use this directly, instead use GetDelegate() which walks the tree as 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // as necessary. 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuDelegate* delegate_; 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The controller for the run operation, or NULL if the menu isn't showing. 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuController* controller_; 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used to detect when Cancel was invoked. 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool canceled_; 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Our parent. 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuItemView* parent_menu_item_; 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Type of menu. NOTE: MenuItemView doesn't itself represent SEPARATOR, 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that is handled by an entirely different view class. 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Type type_; 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether we're selected. 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool selected_; 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Command id. 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int command_; 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Submenu, created via CreateSubmenu. 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SubmenuView* submenu_; 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Title. 4585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 title_; 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Subtitle/sublabel. 4615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 subtitle_; 4627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 46358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Minor text. 4645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 minor_text_; 46558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Does the title have a mnemonic? Only useful on the root menu item. 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_mnemonics_; 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should we show the mnemonic? Mnemonics are shown if this is true or 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // MenuConfig says mnemonics should be shown. Only used on the root menu item. 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool show_mnemonics_; 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set if menu has icons or icon_views (applies to root menu item only). 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_icons_; 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pointer to a view with a menu icon. 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* icon_view_; 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The tooltip to show on hover for this menu item. 4805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 tooltip_; 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Width of a menu icon area. 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static int icon_area_width_; 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // X-coordinate of where the label starts. 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static int label_start_; 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Margins between the right of the item and the label. 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static int item_right_margin_; 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Preferred height of menu items. Reset every time a menu is run. 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static int pref_menu_height_; 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Cached dimensions. This is cached as text sizing calculations are quite 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // costly. 496cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) mutable MenuItemDimensions dimensions_; 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Removed items to be deleted in ChildrenChanged(). 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<View*> removed_items_; 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Margins in pixels. 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int top_margin_; 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int bottom_margin_; 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Horizontal icon margins in pixels, which can differ between MenuItems. 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // These values will be set in the layout process. 507cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) mutable int left_icon_margin_; 508cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) mutable int right_icon_margin_; 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |menu_position_| is the requested position with respect to the bounds. 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |actual_menu_position_| is used by the controller to cache the 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // position of the menu being shown. 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuPosition requested_menu_position_; 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuPosition actual_menu_position_; 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If set to false, the right margin will be removed for menu lines 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // containing other elements. 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool use_right_margin_; 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MenuItemView); 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace views 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // UI_VIEWS_CONTROLS_MENU_MENU_ITEM_VIEW_H_ 526