| // 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_LAYOUT_IMPL_H_ |
| #define CEF_LIBCEF_BROWSER_VIEWS_LAYOUT_IMPL_H_ |
| #pragma once |
| |
| #include "include/views/cef_box_layout.h" |
| #include "include/views/cef_fill_layout.h" |
| #include "include/views/cef_layout.h" |
| |
| #include "libcef/browser/thread_util.h" |
| #include "libcef/browser/views/layout_adapter.h" |
| #include "libcef/browser/views/layout_util.h" |
| |
| #include "base/logging.h" |
| #include "ui/views/layout/layout_manager.h" |
| #include "ui/views/view.h" |
| |
| // Base template for implementing CefLayout-derived classes. See comments in |
| // view_impl.h for a usage overview. |
| template <class ViewsLayoutClass, class CefLayoutClass> |
| class CefLayoutImpl : public CefLayoutAdapter, public CefLayoutClass { |
| public: |
| // Returns the underlying views::LayoutManager object as the derived type. |
| // Does not transfer ownership. |
| ViewsLayoutClass* layout() const { return layout_ref_; } |
| |
| // Returns the views::View that owns this object. |
| views::View* owner_view() const { return owner_view_; } |
| |
| // CefLayoutAdapter methods: |
| views::LayoutManager* Get() const override { return layout(); } |
| void Detach() override { |
| owner_view_ = nullptr; |
| layout_ref_ = nullptr; |
| } |
| |
| // CefLayout methods. When adding new As*() methods make sure to update |
| // CefLayoutAdapter::GetFor() in layout_adapter.cc. |
| CefRefPtr<CefBoxLayout> AsBoxLayout() override { return nullptr; } |
| CefRefPtr<CefFillLayout> AsFillLayout() override { return nullptr; } |
| bool IsValid() override { |
| CEF_REQUIRE_UIT_RETURN(false); |
| return !!layout_ref_; |
| } |
| |
| protected: |
| // Create a new implementation object. |
| // Always call Initialize() after creation. |
| CefLayoutImpl() : layout_ref_(nullptr), owner_view_(nullptr) {} |
| |
| // Initialize this object and assign ownership to |owner_view|. |
| void Initialize(views::View* owner_view) { |
| DCHECK(owner_view); |
| owner_view_ = owner_view; |
| layout_ref_ = CreateLayout(); |
| DCHECK(layout_ref_); |
| owner_view->SetLayoutManager(base::WrapUnique(layout_ref_)); |
| layout_util::Assign(this, owner_view); |
| } |
| |
| // Create the views::LayoutManager object. |
| virtual ViewsLayoutClass* CreateLayout() = 0; |
| |
| private: |
| // Unowned reference to the views::LayoutManager wrapped by this object. Will |
| // be nullptr after the views::LayoutManager is destroyed. |
| ViewsLayoutClass* layout_ref_; |
| |
| // Unowned reference to the views::View that owns this object. Will be nullptr |
| // after the views::LayoutManager is destroyed. |
| views::View* owner_view_; |
| }; |
| |
| #endif // CEF_LIBCEF_BROWSER_VIEWS_LAYOUT_IMPL_H_ |