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