1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef UI_VIEWS_LAYOUT_BOX_LAYOUT_H_
6#define UI_VIEWS_LAYOUT_BOX_LAYOUT_H_
7
8#include "base/basictypes.h"
9#include "base/compiler_specific.h"
10#include "ui/gfx/insets.h"
11#include "ui/views/layout/layout_manager.h"
12
13namespace gfx {
14class Size;
15}
16
17namespace views {
18
19class View;
20
21// A Layout manager that arranges child views vertically or horizontally in a
22// side-by-side fashion with spacing around and between the child views. The
23// child views are always sized according to their preferred size. If the
24// host's bounds provide insufficient space, child views will be clamped.
25// Excess space will not be distributed.
26class VIEWS_EXPORT BoxLayout : public LayoutManager {
27 public:
28  enum Orientation {
29    kHorizontal,
30    kVertical,
31  };
32
33  // Use |inside_border_horizontal_spacing| and
34  // |inside_border_vertical_spacing| to add additional space between the child
35  // view area and the host view border. |between_child_spacing| controls the
36  // space in between child views.
37  BoxLayout(Orientation orientation,
38            int inside_border_horizontal_spacing,
39            int inside_border_vertical_spacing,
40            int between_child_spacing);
41  virtual ~BoxLayout();
42
43  void set_spread_blank_space(bool spread) {
44    spread_blank_space_ = spread;
45  }
46
47  // Overridden from views::LayoutManager:
48  virtual void Layout(View* host) OVERRIDE;
49  virtual gfx::Size GetPreferredSize(View* host) OVERRIDE;
50  virtual int GetPreferredHeightForWidth(View* host, int width) OVERRIDE;
51
52 private:
53  // The preferred size for the dialog given the width of the child area.
54  gfx::Size GetPreferredSizeForChildWidth(View* host, int child_area_width);
55
56  // The amount of space the layout requires in addition to any space for the
57  // child views.
58  gfx::Size NonChildSize(View* host);
59
60  const Orientation orientation_;
61
62  // Spacing between child views and host view border.
63  gfx::Insets inside_border_insets_;
64
65  // Spacing to put in between child views.
66  const int between_child_spacing_;
67
68  // Whether the available extra space should be distributed among the child
69  // views.
70  bool spread_blank_space_;
71
72  DISALLOW_IMPLICIT_CONSTRUCTORS(BoxLayout);
73};
74
75} // namespace views
76
77#endif  // UI_VIEWS_LAYOUT_BOX_LAYOUT_H_
78