1 // Copyright 2016 The Chromium Embedded Framework Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be found 3 // in the LICENSE file. 4 5 #ifndef CEF_LIBCEF_BROWSER_VIEWS_WINDOW_IMPL_H_ 6 #define CEF_LIBCEF_BROWSER_VIEWS_WINDOW_IMPL_H_ 7 #pragma once 8 9 #include <map> 10 11 #include "include/views/cef_window.h" 12 #include "include/views/cef_window_delegate.h" 13 14 #include "libcef/browser/menu_model_impl.h" 15 #include "libcef/browser/views/panel_impl.h" 16 #include "libcef/browser/views/window_view.h" 17 18 #include "ui/base/accelerators/accelerator.h" 19 #include "ui/views/controls/menu/menu_runner.h" 20 #include "ui/views/widget/widget.h" 21 22 namespace views { 23 class MenuButton; 24 } 25 26 class CefWindowImpl 27 : public CefPanelImpl<CefWindowView, CefWindow, CefWindowDelegate>, 28 public CefWindowView::Delegate, 29 public ui::AcceleratorTarget { 30 public: 31 typedef CefPanelImpl<CefWindowView, CefWindow, CefWindowDelegate> ParentClass; 32 33 // Create a new CefWindow instance. |delegate| may be nullptr. 34 static CefRefPtr<CefWindowImpl> Create(CefRefPtr<CefWindowDelegate> delegate); 35 36 // CefWindow methods: 37 void Show() override; 38 void Hide() override; 39 void CenterWindow(const CefSize& size) override; 40 void Close() override; 41 bool IsClosed() override; 42 void Activate() override; 43 void Deactivate() override; 44 bool IsActive() override; 45 void BringToTop() override; 46 void SetAlwaysOnTop(bool on_top) override; 47 bool IsAlwaysOnTop() override; 48 void Maximize() override; 49 void Minimize() override; 50 void Restore() override; 51 void SetFullscreen(bool fullscreen) override; 52 bool IsMaximized() override; 53 bool IsMinimized() override; 54 bool IsFullscreen() override; 55 void SetTitle(const CefString& title) override; 56 CefString GetTitle() override; 57 void SetWindowIcon(CefRefPtr<CefImage> image) override; 58 CefRefPtr<CefImage> GetWindowIcon() override; 59 void SetWindowAppIcon(CefRefPtr<CefImage> image) override; 60 CefRefPtr<CefImage> GetWindowAppIcon() override; 61 void ShowMenu(CefRefPtr<CefMenuModel> menu_model, 62 const CefPoint& screen_point, 63 cef_menu_anchor_position_t anchor_position) override; 64 void CancelMenu() override; 65 CefRefPtr<CefDisplay> GetDisplay() override; 66 CefRect GetClientAreaBoundsInScreen() override; 67 void SetDraggableRegions( 68 const std::vector<CefDraggableRegion>& regions) override; 69 CefWindowHandle GetWindowHandle() override; 70 void SendKeyPress(int key_code, uint32 event_flags) override; 71 void SendMouseMove(int screen_x, int screen_y) override; 72 void SendMouseEvents(cef_mouse_button_type_t button, 73 bool mouse_down, 74 bool mouse_up) override; 75 void SetAccelerator(int command_id, 76 int key_code, 77 bool shift_pressed, 78 bool ctrl_pressed, 79 bool alt_pressed) override; 80 void RemoveAccelerator(int command_id) override; 81 void RemoveAllAccelerators() override; 82 83 // CefViewAdapter methods: 84 void Detach() override; 85 86 // CefPanel methods: AsWindow()87 CefRefPtr<CefWindow> AsWindow() override { return this; } 88 89 // CefView methods: 90 void SetBounds(const CefRect& bounds) override; 91 CefRect GetBounds() override; 92 CefRect GetBoundsInScreen() override; 93 void SetSize(const CefSize& bounds) override; 94 void SetPosition(const CefPoint& position) override; 95 void SizeToPreferredSize() override; 96 void SetVisible(bool visible) override; 97 bool IsVisible() override; 98 bool IsDrawn() override; 99 void SetBackgroundColor(cef_color_t color) override; 100 101 // CefWindowView::Delegate methods: 102 bool CanWidgetClose() override; 103 void OnWindowClosing() override; 104 void OnWindowViewDeleted() override; 105 106 // CefViewAdapter methods: GetDebugType()107 std::string GetDebugType() override { return "Window"; } 108 void GetDebugInfo(base::DictionaryValue* info, 109 bool include_children) override; 110 111 // ui::AcceleratorTarget methods: 112 bool AcceleratorPressed(const ui::Accelerator& accelerator) override; 113 bool CanHandleAccelerators() const override; 114 115 // Called for key events that have not been handled by other controls in the 116 // window. Returns true if the event was handled. 117 bool OnKeyEvent(const CefKeyEvent& event); 118 119 void ShowMenu(views::MenuButton* menu_button, 120 CefRefPtr<CefMenuModel> menu_model, 121 const CefPoint& screen_point, 122 cef_menu_anchor_position_t anchor_position); 123 void MenuClosed(); 124 widget()125 views::Widget* widget() const { return widget_; } 126 127 private: 128 // Create a new implementation object. 129 // Always call Initialize() after creation. 130 // |delegate| may be nullptr. 131 explicit CefWindowImpl(CefRefPtr<CefWindowDelegate> delegate); 132 133 // CefViewImpl methods: 134 CefWindowView* CreateRootView() override; 135 void InitializeRootView() override; 136 137 // Initialize the Widget. 138 void CreateWidget(); 139 140 views::Widget* widget_; 141 142 // True if the window has been destroyed. 143 bool destroyed_; 144 145 // The currently active menu model and runner. 146 CefRefPtr<CefMenuModelImpl> menu_model_; 147 std::unique_ptr<views::MenuRunner> menu_runner_; 148 149 // Map of command_id to accelerator. 150 typedef std::map<int, ui::Accelerator> AcceleratorMap; 151 AcceleratorMap accelerator_map_; 152 153 #if defined(USE_AURA) 154 // Native widget's handler to receive events after the event target. 155 std::unique_ptr<ui::EventHandler> unhandled_key_event_handler_; 156 #endif 157 158 IMPLEMENT_REFCOUNTING_DELETE_ON_UIT(CefWindowImpl); 159 DISALLOW_COPY_AND_ASSIGN(CefWindowImpl); 160 }; 161 162 #endif // CEF_LIBCEF_BROWSER_VIEWS_WINDOW_IMPL_H_ 163