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_SUBMENU_VIEW_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define UI_VIEWS_CONTROLS_MENU_SUBMENU_VIEW_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/animation/scroll_animator.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/menu/menu_delegate.h"
13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/views/controls/prefix_delegate.h"
14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/views/controls/prefix_selector.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/view.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MenuHost;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MenuItemView;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MenuScrollViewContainer;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SubmenuView is the parent of all menu items.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SubmenuView has the following responsibilities:
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// . It positions and sizes all child views (any type of View may be added,
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   not just MenuItemViews).
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// . Forwards the appropriate events to the MenuController. This allows the
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   MenuController to update the selection as the user moves the mouse around.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// . Renders the drop indicator during a drop operation.
31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// . Shows and hides the window (a NativeWidget) when the menu is shown on
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   screen.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SubmenuView is itself contained in a MenuScrollViewContainer.
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MenuScrollViewContainer handles showing as much of the SubmenuView as the
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// screen allows. If the SubmenuView is taller than the screen, scroll buttons
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// are provided that allow the user to see all the menu items.
38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class VIEWS_EXPORT SubmenuView : public PrefixDelegate,
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 public ScrollDelegate {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The submenu's class name.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char kViewClassName[];
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a SubmenuView for the specified menu item.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit SubmenuView(MenuItemView* parent);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SubmenuView();
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the number of child views that are MenuItemViews.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // MenuItemViews are identified by ID.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int GetMenuItemCount();
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the MenuItemView at the specified index.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MenuItemView* GetMenuItemAt(int index);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Positions and sizes the child views. This tiles the views vertically,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // giving each child the available width.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Layout() OVERRIDE;
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual gfx::Size GetPreferredSize() const OVERRIDE;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Override from View.
61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void GetAccessibleState(ui::AXViewState* state) OVERRIDE;
62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual ui::TextInputClient* GetTextInputClient() OVERRIDE;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Painting.
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void PaintChildren(gfx::Canvas* canvas,
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                             const views::CullSet& cull_view) OVERRIDE;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Drag and drop methods. These are forwarded to the MenuController.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool GetDropFormats(
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int* formats,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::set<OSExchangeData::CustomFormat>* custom_formats) OVERRIDE;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool AreDropTypesRequired() OVERRIDE;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool CanDrop(const OSExchangeData& data) OVERRIDE;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnDragEntered(const ui::DropTargetEvent& event) OVERRIDE;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int OnDragUpdated(const ui::DropTargetEvent& event) OVERRIDE;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnDragExited() OVERRIDE;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int OnPerformDrop(const ui::DropTargetEvent& event) OVERRIDE;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Scrolls on menu item boundaries.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnMouseWheel(const ui::MouseWheelEvent& e) OVERRIDE;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from ui::EventHandler.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Scrolls on menu item boundaries.
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Overridden from PrefixDelegate.
87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual int GetRowCount() OVERRIDE;
88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual int GetSelectedRow() OVERRIDE;
89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void SetSelectedRow(int row) OVERRIDE;
90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual base::string16 GetTextForRow(int row) OVERRIDE;
91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the menu is showing.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsShowing();
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Shows the menu at the specified location. Coordinates are in screen
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // coordinates. max_width gives the max width the view should be.
971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void ShowAt(Widget* parent, const gfx::Rect& bounds, bool do_capture);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Resets the bounds of the submenu to |bounds|.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Reposition(const gfx::Rect& bounds);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Closes the menu, destroying the host.
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Close();
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Hides the hosting window.
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The hosting window is hidden first, then deleted (Close) when the menu is
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // done running. This is done to avoid deletion ordering dependencies. In
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // particular, during drag and drop (and when a modal dialog is shown as
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a result of choosing a context menu) it is possible that an event is
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // being processed by the host, so that host is on the stack when we need to
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // close the window. If we closed the window immediately (and deleted it),
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // when control returned back to host we would crash as host was deleted.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Hide();
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If mouse capture was grabbed, it is released. Does nothing if mouse was
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // not captured.
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReleaseCapture();
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overriden from View to prevent tab from doing anything.
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool SkipDefaultKeyEventProcessing(const ui::KeyEvent& e) OVERRIDE;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the parent menu item we're showing children for.
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MenuItemView* GetMenuItem() const;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the drop item and position.
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetDropMenuItem(MenuItemView* item,
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       MenuDelegate::DropPosition position);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns whether the selection should be shown for the specified item.
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The selection is NOT shown during drag and drop when the drop is over
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the menu.
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetShowSelection(MenuItemView* item);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the container for the SubmenuView.
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MenuScrollViewContainer* GetScrollViewContainer();
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Invoked if the menu is prematurely destroyed. This can happen if the window
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // closes while the menu is shown. If invoked the SubmenuView must drop all
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // references to the MenuHost as the MenuHost is about to be deleted.
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void MenuHostDestroyed();
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Max width of minor text (accelerator or subtitle) in child menu items. This
1447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // doesn't include children's children, only direct children.
1457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  int max_minor_text_width() const { return max_minor_text_width_; }
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Minimum width of menu in pixels (default 0).  This becomes the smallest
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // width returned by GetPreferredSize().
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_minimum_preferred_width(int minimum_preferred_width) {
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    minimum_preferred_width_ = minimum_preferred_width;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Automatically resize menu if a subview's preferred size changes.
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool resize_open_menu() const { return resize_open_menu_; }
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_resize_open_menu(bool resize_open_menu) {
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resize_open_menu_ = resize_open_menu;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
160b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Overridden from View:
161b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual const char* GetClassName() const OVERRIDE;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // View method. Overridden to schedule a paint. We do this so that when
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // scrolling occurs, everything is repainted correctly.
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnBoundsChanged(const gfx::Rect& previous_bounds) OVERRIDE;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ChildPreferredSizeChanged(View* child) OVERRIDE;
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Paints the drop indicator. This is only invoked if item is non-NULL and
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // position is not DROP_NONE.
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PaintDropIndicator(gfx::Canvas* canvas,
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          MenuItemView* item,
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          MenuDelegate::DropPosition position);
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SchedulePaintForDropIndicator(MenuItemView* item,
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     MenuDelegate::DropPosition position);
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Calculates the location of th edrop indicator.
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect CalculateDropIndicatorBounds(MenuItemView* item,
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         MenuDelegate::DropPosition position);
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Implementation of ScrollDelegate
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool OnScroll(float dx, float dy) OVERRIDE;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Parent menu item.
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MenuItemView* parent_menu_item_;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Widget subclass used to show the children. This is deleted when we invoke
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |DestroyMenuHost|, or |MenuHostDestroyed| is invoked back on us.
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MenuHost* host_;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If non-null, indicates a drop is in progress and drop_item is the item
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the drop is over.
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MenuItemView* drop_item_;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Position of the drop.
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MenuDelegate::DropPosition drop_position_;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ancestor of the SubmenuView, lazily created.
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MenuScrollViewContainer* scroll_view_container_;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See description above getter.
204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  mutable int max_minor_text_width_;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Minimum width returned in GetPreferredSize().
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int minimum_preferred_width_;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reposition open menu when contained views change size.
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool resize_open_menu_;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The submenu's scroll animator
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ScrollAnimator> scroll_animator_;
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Difference between current position and cumulative deltas passed to
2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // OnScroll.
2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // TODO(tdresser): This should be removed when raw pixel scrolling for views
2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // is enabled. See crbug.com/329354.
2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  float roundoff_error_;
2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
221a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PrefixSelector prefix_selector_;
222a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SubmenuView);
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace views
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // UI_VIEWS_CONTROLS_MENU_SUBMENU_VIEW_H_
229