summaryrefslogtreecommitdiffstats
path: root/views/box_layout.cc
diff options
context:
space:
mode:
Diffstat (limited to 'views/box_layout.cc')
-rw-r--r--views/box_layout.cc66
1 files changed, 66 insertions, 0 deletions
diff --git a/views/box_layout.cc b/views/box_layout.cc
new file mode 100644
index 0000000..84fb096
--- /dev/null
+++ b/views/box_layout.cc
@@ -0,0 +1,66 @@
+// 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_spacing,
+ int between_child_spacing)
+ : orientation_(orientation),
+ inside_border_spacing_(inside_border_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_spacing_, inside_border_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_spacing_,
+ bounds.height() + insets.height() + 2 * inside_border_spacing_);
+}
+
+} // namespace views