diff options
author | tfarina@chromium.org <tfarina@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-11-28 15:33:33 +0000 |
---|---|---|
committer | tfarina@chromium.org <tfarina@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-11-28 15:33:33 +0000 |
commit | 5e554e8fbf652534b50c89e2ffafaeb96161cc80 (patch) | |
tree | 26750feec0b3e886ee55f5b8b3eee37414aa1860 /ui/views/controls/menu/submenu_view.h | |
parent | 23b8a3ca4a6f95b5f9e8fd9ae0553ad141b8e991 (diff) | |
download | chromium_src-5e554e8fbf652534b50c89e2ffafaeb96161cc80.zip chromium_src-5e554e8fbf652534b50c89e2ffafaeb96161cc80.tar.gz chromium_src-5e554e8fbf652534b50c89e2ffafaeb96161cc80.tar.bz2 |
views: Move menu directory to ui/views/controls/.
BUG=104039
R=maruel@chromium.org
TBR=ben@chromium.org
Review URL: http://codereview.chromium.org/8718004
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@111701 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui/views/controls/menu/submenu_view.h')
-rw-r--r-- | ui/views/controls/menu/submenu_view.h | 204 |
1 files changed, 204 insertions, 0 deletions
diff --git a/ui/views/controls/menu/submenu_view.h b/ui/views/controls/menu/submenu_view.h new file mode 100644 index 0000000..693a538 --- /dev/null +++ b/ui/views/controls/menu/submenu_view.h @@ -0,0 +1,204 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef UI_VIEWS_CONTROLS_MENU_SUBMENU_VIEW_H_ +#define UI_VIEWS_CONTROLS_MENU_SUBMENU_VIEW_H_ +#pragma once + +#include <string> + +#include "base/compiler_specific.h" +#include "ui/views/controls/menu/menu_delegate.h" +#include "views/view.h" + +namespace views { + +class MenuHost; +class MenuItemView; +class MenuScrollViewContainer; + +// SubmenuView is the parent of all menu items. +// +// SubmenuView has the following responsibilities: +// . It positions and sizes all child views (any type of View may be added, +// not just MenuItemViews). +// . Forwards the appropriate events to the MenuController. This allows the +// MenuController to update the selection as the user moves the mouse around. +// . Renders the drop indicator during a drop operation. +// . Shows and hides the window (a NativeWidgetWin) when the menu is shown on +// screen. +// +// SubmenuView is itself contained in a MenuScrollViewContainer. +// MenuScrollViewContainer handles showing as much of the SubmenuView as the +// screen allows. If the SubmenuView is taller than the screen, scroll buttons +// are provided that allow the user to see all the menu items. +class VIEWS_EXPORT SubmenuView : public View { + public: + // The submenu's class name. + static const char kViewClassName[]; + + // Creates a SubmenuView for the specified menu item. + explicit SubmenuView(MenuItemView* parent); + virtual ~SubmenuView(); + + // Returns the number of child views that are MenuItemViews. + // MenuItemViews are identified by ID. + int GetMenuItemCount(); + + // Returns the MenuItemView at the specified index. + MenuItemView* GetMenuItemAt(int index); + + // Positions and sizes the child views. This tiles the views vertically, + // giving each child the available width. + virtual void Layout() OVERRIDE; + virtual gfx::Size GetPreferredSize() OVERRIDE; + + // Override from View. + virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE; + + // Painting. + virtual void PaintChildren(gfx::Canvas* canvas) OVERRIDE; + + // Drag and drop methods. These are forwarded to the MenuController. + virtual bool GetDropFormats( + int* formats, + std::set<OSExchangeData::CustomFormat>* custom_formats) OVERRIDE; + virtual bool AreDropTypesRequired() OVERRIDE; + virtual bool CanDrop(const OSExchangeData& data) OVERRIDE; + virtual void OnDragEntered(const DropTargetEvent& event) OVERRIDE; + virtual int OnDragUpdated(const DropTargetEvent& event) OVERRIDE; + virtual void OnDragExited() OVERRIDE; + virtual int OnPerformDrop(const DropTargetEvent& event) OVERRIDE; + + // Scrolls on menu item boundaries. + virtual bool OnMouseWheel(const MouseWheelEvent& e) OVERRIDE; + + // Returns true if the menu is showing. + bool IsShowing(); + + // Shows the menu at the specified location. Coordinates are in screen + // coordinates. max_width gives the max width the view should be. + void ShowAt(Widget* parent, + const gfx::Rect& bounds, + bool do_capture); + + // Resets the bounds of the submenu to |bounds|. + void Reposition(const gfx::Rect& bounds); + + // Closes the menu, destroying the host. + void Close(); + + // Hides the hosting window. + // + // The hosting window is hidden first, then deleted (Close) when the menu is + // done running. This is done to avoid deletion ordering dependencies. In + // particular, during drag and drop (and when a modal dialog is shown as + // a result of choosing a context menu) it is possible that an event is + // being processed by the host, so that host is on the stack when we need to + // close the window. If we closed the window immediately (and deleted it), + // when control returned back to host we would crash as host was deleted. + void Hide(); + + // If mouse capture was grabbed, it is released. Does nothing if mouse was + // not captured. + void ReleaseCapture(); + + // Overriden from View to prevent tab from doing anything. + virtual bool SkipDefaultKeyEventProcessing(const KeyEvent& e) OVERRIDE; + + // Returns the parent menu item we're showing children for. + MenuItemView* GetMenuItem() const; + + // Set the drop item and position. + void SetDropMenuItem(MenuItemView* item, + MenuDelegate::DropPosition position); + + // Returns whether the selection should be shown for the specified item. + // The selection is NOT shown during drag and drop when the drop is over + // the menu. + bool GetShowSelection(MenuItemView* item); + + // Returns the container for the SubmenuView. + MenuScrollViewContainer* GetScrollViewContainer(); + + // Invoked if the menu is prematurely destroyed. This can happen if the window + // closes while the menu is shown. If invoked the SubmenuView must drop all + // references to the MenuHost as the MenuHost is about to be deleted. + void MenuHostDestroyed(); + + // Max width of accelerators in child menu items. This doesn't include + // children's children, only direct children. + int max_accelerator_width() const { return max_accelerator_width_; } + + // Minimum width of menu in pixels (default 0). This becomes the smallest + // width returned by GetPreferredSize(). + void set_minimum_preferred_width(int minimum_preferred_width) { + minimum_preferred_width_ = minimum_preferred_width; + } + + // Automatically resize menu if a subview's preferred size changes. + bool resize_open_menu() const { return resize_open_menu_; } + void set_resize_open_menu(bool resize_open_menu) { + resize_open_menu_ = resize_open_menu; + } + + // Padding around the edges of the submenu. + static const int kSubmenuBorderSize; + + protected: + // View override. + virtual std::string GetClassName() const OVERRIDE; + + // View method. Overridden to schedule a paint. We do this so that when + // scrolling occurs, everything is repainted correctly. + virtual void OnBoundsChanged(const gfx::Rect& previous_bounds) OVERRIDE; + + virtual void ChildPreferredSizeChanged(View* child) OVERRIDE; + + private: + // Paints the drop indicator. This is only invoked if item is non-NULL and + // position is not DROP_NONE. + void PaintDropIndicator(gfx::Canvas* canvas, + MenuItemView* item, + MenuDelegate::DropPosition position); + + void SchedulePaintForDropIndicator(MenuItemView* item, + MenuDelegate::DropPosition position); + + // Calculates the location of th edrop indicator. + gfx::Rect CalculateDropIndicatorBounds(MenuItemView* item, + MenuDelegate::DropPosition position); + + // Parent menu item. + MenuItemView* parent_menu_item_; + + // Widget subclass used to show the children. This is deleted when we invoke + // |DestroyMenuHost|, or |MenuHostDestroyed| is invoked back on us. + MenuHost* host_; + + // If non-null, indicates a drop is in progress and drop_item is the item + // the drop is over. + MenuItemView* drop_item_; + + // Position of the drop. + MenuDelegate::DropPosition drop_position_; + + // Ancestor of the SubmenuView, lazily created. + MenuScrollViewContainer* scroll_view_container_; + + // See description above getter. + int max_accelerator_width_; + + // Minimum width returned in GetPreferredSize(). + int minimum_preferred_width_; + + // Reposition open menu when contained views change size. + bool resize_open_menu_; + + DISALLOW_COPY_AND_ASSIGN(SubmenuView); +}; + +} // namespace views + +#endif // UI_VIEWS_CONTROLS_MENU_SUBMENU_VIEW_H_ |