| // 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. |
| |
| #include "libcef/browser/views/box_layout_impl.h" |
| |
| #include "libcef/browser/thread_util.h" |
| #include "libcef/browser/views/view_util.h" |
| |
| // static |
| CefRefPtr<CefBoxLayoutImpl> CefBoxLayoutImpl::Create( |
| const CefBoxLayoutSettings& settings, |
| views::View* owner_view) { |
| CEF_REQUIRE_UIT_RETURN(nullptr); |
| CefRefPtr<CefBoxLayoutImpl> impl = new CefBoxLayoutImpl(settings); |
| impl->Initialize(owner_view); |
| return impl; |
| } |
| |
| void CefBoxLayoutImpl::SetFlexForView(CefRefPtr<CefView> view, int flex) { |
| CEF_REQUIRE_VALID_RETURN_VOID(); |
| DCHECK_GE(flex, 0); |
| if (flex < 0) |
| return; |
| |
| DCHECK(view && view->IsValid() && view->IsAttached()); |
| if (!view || !view->IsValid() || !view->IsAttached()) |
| return; |
| |
| views::View* view_ptr = view_util::GetFor(view); |
| DCHECK_EQ(view_ptr->parent(), owner_view()); |
| if (view_ptr->parent() != owner_view()) |
| return; |
| |
| layout()->SetFlexForView(view_ptr, flex); |
| } |
| |
| void CefBoxLayoutImpl::ClearFlexForView(CefRefPtr<CefView> view) { |
| CEF_REQUIRE_VALID_RETURN_VOID(); |
| DCHECK(view && view->IsValid() && view->IsAttached()); |
| if (!view || !view->IsValid() || !view->IsAttached()) |
| return; |
| |
| views::View* view_ptr = view_util::GetFor(view); |
| DCHECK_EQ(view_ptr->parent(), owner_view()); |
| if (view_ptr->parent() != owner_view()) |
| return; |
| |
| layout()->ClearFlexForView(view_ptr); |
| } |
| |
| CefBoxLayoutImpl::CefBoxLayoutImpl(const CefBoxLayoutSettings& settings) |
| : settings_(settings) {} |
| |
| views::BoxLayout* CefBoxLayoutImpl::CreateLayout() { |
| views::BoxLayout* layout = new views::BoxLayout( |
| settings_.horizontal ? views::BoxLayout::Orientation::kHorizontal |
| : views::BoxLayout::Orientation::kVertical, |
| gfx::Insets(settings_.inside_border_vertical_spacing, |
| settings_.inside_border_horizontal_spacing), |
| settings_.between_child_spacing); |
| layout->set_main_axis_alignment( |
| static_cast<views::BoxLayout::MainAxisAlignment>( |
| settings_.main_axis_alignment)); |
| layout->set_cross_axis_alignment( |
| static_cast<views::BoxLayout::CrossAxisAlignment>( |
| settings_.cross_axis_alignment)); |
| layout->set_inside_border_insets(gfx::Insets( |
| settings_.inside_border_insets.top, settings_.inside_border_insets.left, |
| settings_.inside_border_insets.bottom, |
| settings_.inside_border_insets.right)); |
| layout->set_minimum_cross_axis_size(settings_.minimum_cross_axis_size); |
| if (settings_.default_flex > 0) |
| layout->SetDefaultFlex(settings_.default_flex); |
| return layout; |
| } |