// Copyright (c) 2010 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 "views/box_layout.h" namespace views { BoxLayout::BoxLayout(BoxLayout::Orientation orientation, int inside_border_horizontal_spacing, int inside_border_vertical_spacing, int between_child_spacing) : orientation_(orientation), inside_border_horizontal_spacing_(inside_border_horizontal_spacing), inside_border_vertical_spacing_(inside_border_vertical_spacing), between_child_spacing_(between_child_spacing) { } void BoxLayout::Layout(View* host) { gfx::Rect childArea(gfx::Rect(host->size())); childArea.Inset(host->GetInsets()); childArea.Inset(inside_border_horizontal_spacing_, inside_border_vertical_spacing_); int x = childArea.x(); int y = childArea.y(); for (int i = 0; i < host->GetChildViewCount(); ++i) { View* child = host->GetChildViewAt(i); if (child->IsVisible()) { gfx::Rect bounds(x, y, childArea.width(), childArea.height()); gfx::Size size(child->GetPreferredSize()); if (orientation_ == kHorizontal) { bounds.set_width(size.width()); x += size.width() + between_child_spacing_; } else { bounds.set_height(size.height()); y += size.height() + between_child_spacing_; } // Clamp child view bounds to |childArea|. child->SetBounds(bounds.Intersect(childArea)); } } } gfx::Size BoxLayout::GetPreferredSize(View* host) { gfx::Rect bounds; int position = 0; for (int i = 0; i < host->GetChildViewCount(); ++i) { View* child = host->GetChildViewAt(i); if (child->IsVisible()) { gfx::Size size(child->GetPreferredSize()); if (orientation_ == kHorizontal) { gfx::Rect child_bounds(position, 0, size.width(), size.height()); bounds = bounds.Union(child_bounds); position += size.width(); } else { gfx::Rect child_bounds(0, position, size.width(), size.height()); bounds = bounds.Union(child_bounds); position += size.height(); } position += between_child_spacing_; } } gfx::Insets insets(host->GetInsets()); return gfx::Size( bounds.width() + insets.width() + 2 * inside_border_horizontal_spacing_, bounds.height() + insets.height() + 2 * inside_border_vertical_spacing_); } } // namespace views