| // Copyright (c) 2017 The Chromium Embedded Framework 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 CEF_TESTS_CEFCLIENT_BROWSER_VIEWS_MENU_BAR_H_ |
| #define CEF_TESTS_CEFCLIENT_BROWSER_VIEWS_MENU_BAR_H_ |
| #pragma once |
| |
| #include <map> |
| #include <string> |
| #include <vector> |
| |
| #include "include/cef_menu_model.h" |
| #include "include/cef_menu_model_delegate.h" |
| #include "include/views/cef_menu_button.h" |
| #include "include/views/cef_menu_button_delegate.h" |
| #include "include/views/cef_panel.h" |
| |
| namespace client { |
| |
| // Implements a menu bar which is composed of CefMenuButtons positioned in a |
| // row with automatic switching between them via mouse/keyboard. All methods |
| // must be called on the browser process UI thread. |
| class ViewsMenuBar : public CefMenuButtonDelegate, public CefMenuModelDelegate { |
| public: |
| // Delegate methods will be called on the browser process UI thread. |
| class Delegate { |
| public: |
| // Called when a menu command is selected. |
| virtual void MenuBarExecuteCommand(CefRefPtr<CefMenuModel> menu_model, |
| int command_id, |
| cef_event_flags_t event_flags) = 0; |
| |
| protected: |
| virtual ~Delegate() {} |
| }; |
| |
| // |delegate| must outlive this object. |
| // |menu_id_start| is the ID for the first CefMenuButton in the bar. An ID |
| // range starting with |menu_id_start| and extending for a reasonable distance |
| // should be reserved in the client for MenuBar usage. |
| ViewsMenuBar(Delegate* delegate, int menu_id_start); |
| |
| // Returns true if |menu_id| exists in the menu bar. |
| bool HasMenuId(int menu_id) const; |
| |
| // Returns the CefPanel that represents the menu bar. |
| CefRefPtr<CefPanel> GetMenuPanel(); |
| |
| // Create a new menu with the specified |label|. If |menu_id| is non-NULL it |
| // will be populated with the new menu ID. |
| CefRefPtr<CefMenuModel> CreateMenuModel(const CefString& label, int* menu_id); |
| |
| // Returns the menu with the specified |menu_id|, or NULL if no such menu |
| // exists. |
| CefRefPtr<CefMenuModel> GetMenuModel(int menu_id) const; |
| |
| // Assign or remove focus from the menu bar. |
| // Focus is assigned to the menu bar by ViewsWindow::OnKeyEvent when the ALT |
| // key is pressed. Focus is removed from the menu bar by ViewsWindow::OnFocus |
| // when a control not in the menu bar gains focus. |
| void SetMenuFocusable(bool focusable); |
| |
| // Key events forwarded from ViewsWindow::OnKeyEvent when the menu bar has |
| // focus. |
| bool OnKeyEvent(const CefKeyEvent& event); |
| |
| // Reset menu bar state. |
| void Reset(); |
| |
| protected: |
| // CefButtonDelegate methods: |
| void OnButtonPressed(CefRefPtr<CefButton> button) OVERRIDE {} |
| |
| // CefMenuButtonDelegate methods: |
| void OnMenuButtonPressed( |
| CefRefPtr<CefMenuButton> menu_button, |
| const CefPoint& screen_point, |
| CefRefPtr<CefMenuButtonPressedLock> button_pressed_lock) OVERRIDE; |
| |
| // CefMenuModelDelegate methods: |
| void ExecuteCommand(CefRefPtr<CefMenuModel> menu_model, |
| int command_id, |
| cef_event_flags_t event_flags) OVERRIDE; |
| void MouseOutsideMenu(CefRefPtr<CefMenuModel> menu_model, |
| const CefPoint& screen_point) OVERRIDE; |
| void UnhandledOpenSubmenu(CefRefPtr<CefMenuModel> menu_model, |
| bool is_rtl) OVERRIDE; |
| void UnhandledCloseSubmenu(CefRefPtr<CefMenuModel> menu_model, |
| bool is_rtl) OVERRIDE; |
| void MenuClosed(CefRefPtr<CefMenuModel> menu_model) OVERRIDE; |
| |
| private: |
| // Creates the menu panel if it doesn't already exist. |
| void EnsureMenuPanel(); |
| |
| // Returns the ID for the currently active menu, or -1 if no menu is currently |
| // active. |
| int GetActiveMenuId(); |
| |
| // Triggers the menu at the specified |offset| from the currently active menu. |
| void TriggerNextMenu(int offset); |
| |
| // Triggers the specified MenuButton |button|. |
| void TriggerMenuButton(CefRefPtr<CefView> button); |
| |
| Delegate* delegate_; // Not owned by this object. |
| const int id_start_; |
| int id_next_; |
| CefRefPtr<CefPanel> panel_; |
| std::vector<CefRefPtr<CefMenuModel>> models_; |
| bool last_nav_with_keyboard_; |
| |
| // Map of mnemonic to MenuButton ID. |
| typedef std::map<base::char16, int> MnemonicMap; |
| MnemonicMap mnemonics_; |
| |
| IMPLEMENT_REFCOUNTING(ViewsMenuBar); |
| DISALLOW_COPY_AND_ASSIGN(ViewsMenuBar); |
| }; |
| |
| } // namespace client |
| |
| #endif // CEF_TESTS_CEFCLIENT_BROWSER_VIEWS_MENU_BAR_H_ |