| // Copyright 2016 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_LIBCEF_BROWSER_VIEWS_WINDOW_IMPL_H_ |
| #define CEF_LIBCEF_BROWSER_VIEWS_WINDOW_IMPL_H_ |
| #pragma once |
| |
| #include <map> |
| |
| #include "include/views/cef_window.h" |
| #include "include/views/cef_window_delegate.h" |
| |
| #include "libcef/browser/menu_model_impl.h" |
| #include "libcef/browser/views/panel_impl.h" |
| #include "libcef/browser/views/window_view.h" |
| |
| #include "ui/base/accelerators/accelerator.h" |
| #include "ui/views/controls/menu/menu_runner.h" |
| #include "ui/views/widget/widget.h" |
| |
| namespace views { |
| class MenuButton; |
| } |
| |
| class CefWindowImpl |
| : public CefPanelImpl<CefWindowView, CefWindow, CefWindowDelegate>, |
| public CefWindowView::Delegate, |
| public ui::AcceleratorTarget { |
| public: |
| typedef CefPanelImpl<CefWindowView, CefWindow, CefWindowDelegate> ParentClass; |
| |
| // Create a new CefWindow instance. |delegate| may be nullptr. |
| static CefRefPtr<CefWindowImpl> Create(CefRefPtr<CefWindowDelegate> delegate); |
| |
| // CefWindow methods: |
| void Show() override; |
| void Hide() override; |
| void CenterWindow(const CefSize& size) override; |
| void Close() override; |
| bool IsClosed() override; |
| void Activate() override; |
| void Deactivate() override; |
| bool IsActive() override; |
| void BringToTop() override; |
| void SetAlwaysOnTop(bool on_top) override; |
| bool IsAlwaysOnTop() override; |
| void Maximize() override; |
| void Minimize() override; |
| void Restore() override; |
| void SetFullscreen(bool fullscreen) override; |
| bool IsMaximized() override; |
| bool IsMinimized() override; |
| bool IsFullscreen() override; |
| void SetTitle(const CefString& title) override; |
| CefString GetTitle() override; |
| void SetWindowIcon(CefRefPtr<CefImage> image) override; |
| CefRefPtr<CefImage> GetWindowIcon() override; |
| void SetWindowAppIcon(CefRefPtr<CefImage> image) override; |
| CefRefPtr<CefImage> GetWindowAppIcon() override; |
| void ShowMenu(CefRefPtr<CefMenuModel> menu_model, |
| const CefPoint& screen_point, |
| cef_menu_anchor_position_t anchor_position) override; |
| void CancelMenu() override; |
| CefRefPtr<CefDisplay> GetDisplay() override; |
| CefRect GetClientAreaBoundsInScreen() override; |
| void SetDraggableRegions( |
| const std::vector<CefDraggableRegion>& regions) override; |
| CefWindowHandle GetWindowHandle() override; |
| void SendKeyPress(int key_code, uint32 event_flags) override; |
| void SendMouseMove(int screen_x, int screen_y) override; |
| void SendMouseEvents(cef_mouse_button_type_t button, |
| bool mouse_down, |
| bool mouse_up) override; |
| void SetAccelerator(int command_id, |
| int key_code, |
| bool shift_pressed, |
| bool ctrl_pressed, |
| bool alt_pressed) override; |
| void RemoveAccelerator(int command_id) override; |
| void RemoveAllAccelerators() override; |
| |
| // CefViewAdapter methods: |
| void Detach() override; |
| |
| // CefPanel methods: |
| CefRefPtr<CefWindow> AsWindow() override { return this; } |
| |
| // CefView methods: |
| void SetBounds(const CefRect& bounds) override; |
| CefRect GetBounds() override; |
| CefRect GetBoundsInScreen() override; |
| void SetSize(const CefSize& bounds) override; |
| void SetPosition(const CefPoint& position) override; |
| void SizeToPreferredSize() override; |
| void SetVisible(bool visible) override; |
| bool IsVisible() override; |
| bool IsDrawn() override; |
| void SetBackgroundColor(cef_color_t color) override; |
| |
| // CefWindowView::Delegate methods: |
| bool CanWidgetClose() override; |
| void OnWindowClosing() override; |
| void OnWindowViewDeleted() override; |
| |
| // CefViewAdapter methods: |
| std::string GetDebugType() override { return "Window"; } |
| void GetDebugInfo(base::DictionaryValue* info, |
| bool include_children) override; |
| |
| // ui::AcceleratorTarget methods: |
| bool AcceleratorPressed(const ui::Accelerator& accelerator) override; |
| bool CanHandleAccelerators() const override; |
| |
| // Called for key events that have not been handled by other controls in the |
| // window. Returns true if the event was handled. |
| bool OnKeyEvent(const CefKeyEvent& event); |
| |
| void ShowMenu(views::MenuButton* menu_button, |
| CefRefPtr<CefMenuModel> menu_model, |
| const CefPoint& screen_point, |
| cef_menu_anchor_position_t anchor_position); |
| void MenuClosed(); |
| |
| views::Widget* widget() const { return widget_; } |
| |
| private: |
| // Create a new implementation object. |
| // Always call Initialize() after creation. |
| // |delegate| may be nullptr. |
| explicit CefWindowImpl(CefRefPtr<CefWindowDelegate> delegate); |
| |
| // CefViewImpl methods: |
| CefWindowView* CreateRootView() override; |
| void InitializeRootView() override; |
| |
| // Initialize the Widget. |
| void CreateWidget(); |
| |
| views::Widget* widget_; |
| |
| // True if the window has been destroyed. |
| bool destroyed_; |
| |
| // The currently active menu model and runner. |
| CefRefPtr<CefMenuModelImpl> menu_model_; |
| std::unique_ptr<views::MenuRunner> menu_runner_; |
| |
| // Map of command_id to accelerator. |
| typedef std::map<int, ui::Accelerator> AcceleratorMap; |
| AcceleratorMap accelerator_map_; |
| |
| #if defined(USE_AURA) |
| // Native widget's handler to receive events after the event target. |
| std::unique_ptr<ui::EventHandler> unhandled_key_event_handler_; |
| #endif |
| |
| IMPLEMENT_REFCOUNTING_DELETE_ON_UIT(CefWindowImpl); |
| DISALLOW_COPY_AND_ASSIGN(CefWindowImpl); |
| }; |
| |
| #endif // CEF_LIBCEF_BROWSER_VIEWS_WINDOW_IMPL_H_ |