| // Copyright (c) 2012 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_CONTEXT_MENU_CONTROLLER_H_ |
| #define UI_VIEWS_CONTEXT_MENU_CONTROLLER_H_ |
| |
| #include "ui/base/ui_base_types.h" |
| #include "ui/views/views_export.h" |
| |
| namespace gfx { |
| class Point; |
| } |
| |
| namespace views { |
| class View; |
| |
| // ContextMenuController is responsible for showing the context menu for a |
| // View. To use a ContextMenuController invoke set_context_menu_controller on a |
| // View. When the appropriate user gesture occurs ShowContextMenu is invoked |
| // on the ContextMenuController. |
| // |
| // Setting a ContextMenuController on a view makes the view process mouse |
| // events. |
| // |
| // It is up to subclasses that do their own mouse processing to invoke |
| // the appropriate ContextMenuController method, typically by invoking super's |
| // implementation for mouse processing. |
| class VIEWS_EXPORT ContextMenuController { |
| public: |
| // Invoked to show the context menu for |source|. |point| is in screen |
| // coordinates. This method also prevents reentrant calls. |
| void ShowContextMenuForView(View* source, |
| const gfx::Point& point, |
| ui::MenuSourceType source_type); |
| |
| protected: |
| virtual ~ContextMenuController() = default; |
| |
| private: |
| // Subclasses should override this method. |
| virtual void ShowContextMenuForViewImpl(View* source, |
| const gfx::Point& point, |
| ui::MenuSourceType source_type) = 0; |
| |
| // Used as a flag to prevent a re-entrancy in ShowContextMenuForView(). |
| // This is most relevant to Linux, where spawning the textfield context menu |
| // spins a nested message loop that processes input events, which may attempt |
| // to trigger another context menu. |
| bool is_opening_ = false; |
| }; |
| |
| } // namespace views |
| |
| #endif // UI_VIEWS_CONTEXT_MENU_CONTROLLER_H_ |