Index: ash/common/system/tray/three_view_layout.cc |
diff --git a/ash/common/system/tray/three_view_layout.cc b/ash/common/system/tray/three_view_layout.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d718c7e46111bb1144f785e9e5e1f8c5b82d600f |
--- /dev/null |
+++ b/ash/common/system/tray/three_view_layout.cc |
@@ -0,0 +1,190 @@ |
+// Copyright 2016 The Chromium 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 "ash/common/system/tray/three_view_layout.h" |
+ |
+#include "ash/common/system/tray/size_range_layout.h" |
+#include "base/logging.h" |
+#include "ui/views/border.h" |
+#include "ui/views/layout/box_layout.h" |
+#include "ui/views/layout/fill_layout.h" |
+ |
+namespace ash { |
+namespace { |
+ |
+// Converts ThreeViewLayout::Orientation values to |
+// views::BoxLayout::Orientation values. |
+views::BoxLayout::Orientation GetOrientation( |
+ ThreeViewLayout::Orientation orientation) { |
+ switch (orientation) { |
+ case ThreeViewLayout::Orientation::HORIZONTAL: |
+ return views::BoxLayout::kHorizontal; |
+ case ThreeViewLayout::Orientation::VERTICAL: |
+ return views::BoxLayout::kVertical; |
+ } |
+ // Required for some compilers. |
+ NOTREACHED(); |
+ return views::BoxLayout::kHorizontal; |
+} |
+ |
+} // namespace |
+ |
+ThreeViewLayout::ThreeViewLayout() : ThreeViewLayout(0) {} |
+ |
+ThreeViewLayout::ThreeViewLayout(int padding_between_containers) |
+ : ThreeViewLayout(Orientation::HORIZONTAL, padding_between_containers) {} |
+ |
+ThreeViewLayout::ThreeViewLayout(Orientation orientation) |
+ : ThreeViewLayout(orientation, 0) {} |
+ |
+ThreeViewLayout::ThreeViewLayout(Orientation orientation, |
+ int padding_between_containers) |
+ : box_layout_(new views::BoxLayout(GetOrientation(orientation), |
+ 0, |
+ 0, |
+ padding_between_containers)), |
+ start_container_(new views::View), |
+ start_container_layout_manager_(new SizeRangeLayout), |
+ center_container_(new views::View), |
+ center_container_layout_manager_(new SizeRangeLayout), |
+ end_container_(new views::View), |
+ end_container_layout_manager_(new SizeRangeLayout) { |
+ start_container_->SetLayoutManager(GetLayoutManager(Container::START)); |
+ center_container_->SetLayoutManager(GetLayoutManager(Container::CENTER)); |
+ end_container_->SetLayoutManager(GetLayoutManager(Container::END)); |
+ GetLayoutManager(Container::START) |
+ ->SetLayoutManager(CreateDefaultLayoutManager(orientation)); |
+ GetLayoutManager(Container::CENTER) |
+ ->SetLayoutManager(CreateDefaultLayoutManager(orientation)); |
+ GetLayoutManager(Container::END) |
+ ->SetLayoutManager(CreateDefaultLayoutManager(orientation)); |
+} |
+ |
+ThreeViewLayout::~ThreeViewLayout() { |
+ if (host_) { |
+ host_->RemoveChildView(GetContainer(Container::START)); |
+ host_->RemoveChildView(GetContainer(Container::CENTER)); |
+ host_->RemoveChildView(GetContainer(Container::END)); |
+ } |
+} |
+ |
+void ThreeViewLayout::SetMinCrossAxisSize(int min_size) { |
+ box_layout_->set_minimum_cross_axis_size(min_size); |
+} |
+ |
+void ThreeViewLayout::SetMinSize(Container container, const gfx::Size& size) { |
+ GetLayoutManager(container)->SetMinSize(size); |
+} |
+ |
+void ThreeViewLayout::SetMaxSize(Container container, const gfx::Size& size) { |
+ GetLayoutManager(container)->SetMaxSize(size); |
+} |
+ |
+void ThreeViewLayout::AddView(Container container, views::View* view) { |
+ GetContainer(container)->AddChildView(view); |
+} |
+ |
+void ThreeViewLayout::SetView(Container container, views::View* view) { |
+ views::View* container_view = GetContainer(container); |
+ container_view->RemoveAllChildViews(true); |
+ container_view->AddChildView(view); |
+} |
+ |
+void ThreeViewLayout::SetInsets(const gfx::Insets& insets) { |
+ box_layout_->set_inside_border_insets(insets); |
+} |
+ |
+void ThreeViewLayout::SetBorder(Container container, |
+ std::unique_ptr<views::Border> border) { |
+ GetContainer(container)->SetBorder(std::move(border)); |
+} |
+ |
+void ThreeViewLayout::SetContainerVisible(Container container, bool visible) { |
+ GetContainer(container)->SetVisible(visible); |
+} |
+ |
+void ThreeViewLayout::SetFlexForContainer(Container container, int flex) { |
+ box_layout_->SetFlexForView(GetContainer(container), flex); |
+} |
+ |
+void ThreeViewLayout::SetLayoutManager( |
+ Container container, |
+ std::unique_ptr<LayoutManager> layout_manager) { |
+ GetLayoutManager(container)->SetLayoutManager(std::move(layout_manager)); |
+ if (GetLayoutManager(container)) |
+ GetLayoutManager(container)->Installed(GetContainer(container)); |
+} |
+ |
+void ThreeViewLayout::Installed(views::View* host) { |
+ DCHECK(!host_); |
+ host_ = host; |
+ if (host_) { |
+ host_->AddChildView(GetContainer(Container::START)); |
+ host_->AddChildView(GetContainer(Container::CENTER)); |
+ host_->AddChildView(GetContainer(Container::END)); |
+ } |
+ box_layout_->Installed(host_); |
+} |
+ |
+void ThreeViewLayout::Layout(views::View* host) { |
+ box_layout_->Layout(host); |
+} |
+ |
+gfx::Size ThreeViewLayout::GetPreferredSize(const views::View* host) const { |
+ return box_layout_->GetPreferredSize(host); |
+} |
+ |
+int ThreeViewLayout::GetPreferredHeightForWidth(const views::View* host, |
+ int width) const { |
+ return box_layout_->GetPreferredHeightForWidth(host, width); |
+} |
+ |
+void ThreeViewLayout::ViewAdded(views::View* host, views::View* view) { |
+ box_layout_->ViewAdded(host, view); |
+} |
+ |
+void ThreeViewLayout::ViewRemoved(views::View* host, views::View* view) { |
+ box_layout_->ViewRemoved(host, view); |
+} |
+ |
+std::unique_ptr<views::LayoutManager> |
+ThreeViewLayout::CreateDefaultLayoutManager(Orientation orientation) const { |
+ views::BoxLayout* box_layout = |
+ new views::BoxLayout(GetOrientation(orientation), 0, 0, 0); |
+ box_layout->set_main_axis_alignment( |
+ views::BoxLayout::MAIN_AXIS_ALIGNMENT_CENTER); |
+ box_layout->set_cross_axis_alignment( |
+ views::BoxLayout::CROSS_AXIS_ALIGNMENT_CENTER); |
+ return std::unique_ptr<views::LayoutManager>(box_layout); |
+} |
+ |
+views::View* ThreeViewLayout::GetContainer(Container container) const { |
+ switch (container) { |
+ case Container::START: |
+ return start_container_; |
+ case Container::CENTER: |
+ return center_container_; |
+ case Container::END: |
+ return end_container_; |
+ } |
+ // Required for some compilers. |
+ NOTREACHED(); |
+ return nullptr; |
+} |
+ |
+SizeRangeLayout* ThreeViewLayout::GetLayoutManager(Container container) const { |
+ switch (container) { |
+ case Container::START: |
+ return start_container_layout_manager_; |
+ case Container::CENTER: |
+ return center_container_layout_manager_; |
+ case Container::END: |
+ return end_container_layout_manager_; |
+ } |
+ // Required for some compilers. |
+ NOTREACHED(); |
+ return nullptr; |
+} |
+ |
+} // namespace ash |