Index: ash/common/system/tray/size_range_layout.cc |
diff --git a/ash/common/system/tray/size_range_layout.cc b/ash/common/system/tray/size_range_layout.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b4142df1a11965288c86dba099af24daa4270963 |
--- /dev/null |
+++ b/ash/common/system/tray/size_range_layout.cc |
@@ -0,0 +1,102 @@ |
+// 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/size_range_layout.h" |
+ |
+#include "base/logging.h" |
+#include "ui/views/layout/fill_layout.h" |
+ |
+namespace ash { |
+ |
+// static |
+ |
+const int SizeRangeLayout::kMinSize = 0; |
+ |
+const int SizeRangeLayout::kMaxSize = std::numeric_limits<int>::max(); |
+ |
+gfx::Size SizeRangeLayout::MinSize() { |
+ return gfx::Size(kMinSize, kMinSize); |
+} |
+ |
+gfx::Size SizeRangeLayout::MaxSize() { |
+ return gfx::Size(kMaxSize, kMaxSize); |
+} |
+ |
+SizeRangeLayout::SizeRangeLayout() : SizeRangeLayout(MinSize(), MaxSize()) {} |
+ |
+SizeRangeLayout::SizeRangeLayout(const gfx::Size& min_size, |
+ const gfx::Size& max_size) |
+ : layout_manager_(new views::FillLayout()), |
+ min_size_(min_size), |
+ max_size_(max_size) {} |
+ |
+SizeRangeLayout::~SizeRangeLayout() {} |
+ |
+void SizeRangeLayout::SetSize(const gfx::Size& size) { |
+ set_min_size(size); |
+ set_max_size(size); |
+} |
+ |
+void SizeRangeLayout::SetLayoutManager( |
+ std::unique_ptr<LayoutManager> layout_manager) { |
+ if (layout_manager_) |
+ layout_manager_->Uninstalled(host_); |
+ layout_manager_ = std::move(layout_manager); |
+ if (layout_manager_) |
+ layout_manager_->Installed(host_); |
+} |
+ |
+void SizeRangeLayout::Installed(views::View* host) { |
+ DCHECK(!host_); |
+ host_ = host; |
+ if (layout_manager_) |
+ layout_manager_->Installed(host); |
+} |
+ |
+void SizeRangeLayout::Uninstalled(views::View* host) { |
+ DCHECK_EQ(host_, host); |
+ layout_manager_->Uninstalled(host); |
+ host_ = nullptr; |
+} |
+ |
+void SizeRangeLayout::Layout(views::View* host) { |
+ if (layout_manager_) |
+ layout_manager_->Layout(host); |
+} |
+ |
+gfx::Size SizeRangeLayout::GetPreferredSize(const views::View* host) const { |
+ // TODO(bruthig): Handle Views that override GetPreferredSize(). |
+ gfx::Size preferred_size = |
+ layout_manager_ ? layout_manager_->GetPreferredSize(host) : gfx::Size(); |
+ ClampSizeToRange(&preferred_size); |
+ return preferred_size; |
+} |
+ |
+int SizeRangeLayout::GetPreferredHeightForWidth(const views::View* host, |
+ int width) const { |
+ // TODO(bruthig): Handle Views that override GetPreferredSize(). |
+ const int height = |
+ layout_manager_ ? layout_manager_->GetPreferredHeightForWidth(host, width) |
+ : 0; |
+ gfx::Size size(0, height); |
+ ClampSizeToRange(&size); |
+ return size.height(); |
+} |
+ |
+void SizeRangeLayout::ViewAdded(views::View* host, views::View* view) { |
+ if (layout_manager_) |
+ layout_manager_->ViewAdded(host, view); |
+} |
+ |
+void SizeRangeLayout::ViewRemoved(views::View* host, views::View* view) { |
+ if (layout_manager_) |
+ layout_manager_->ViewRemoved(host, view); |
+} |
+ |
+void SizeRangeLayout::ClampSizeToRange(gfx::Size* size) const { |
+ size->SetToMax(min_size_); |
+ size->SetToMin(max_size_); |
+} |
+ |
+} // namespace ash |