// Copyright (c) 2012 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. #ifndef UI_VIEWS_LAYOUT_BOX_LAYOUT_H_ #define UI_VIEWS_LAYOUT_BOX_LAYOUT_H_ #include "base/basictypes.h" #include "base/compiler_specific.h" #include "ui/gfx/insets.h" #include "ui/views/layout/layout_manager.h" namespace gfx { class Rect; class Size; } namespace views { class View; // A Layout manager that arranges child views vertically or horizontally in a // side-by-side fashion with spacing around and between the child views. The // child views are always sized according to their preferred size. If the // host's bounds provide insufficient space, child views will be clamped. // Excess space will not be distributed. class VIEWS_EXPORT BoxLayout : public LayoutManager { public: enum Orientation { kHorizontal, kVertical, }; // This specifies where along the main axis the children should be laid out. // e.g. a horizontal layout of MAIN_AXIS_ALIGNMENT_END will result in the // child views being right-aligned. enum MainAxisAlignment { MAIN_AXIS_ALIGNMENT_START, MAIN_AXIS_ALIGNMENT_CENTER, MAIN_AXIS_ALIGNMENT_END, // This distributes extra space among the child views. This increases the // size of child views along the main axis rather than the space between // them. MAIN_AXIS_ALIGNMENT_FILL, // TODO(calamity): Add MAIN_AXIS_ALIGNMENT_JUSTIFY which spreads blank space // in-between the child views. }; // TODO(calamity): Add CrossAxisAlignment property to allow cross axis // alignment. // Use |inside_border_horizontal_spacing| and // |inside_border_vertical_spacing| to add additional space between the child // view area and the host view border. |between_child_spacing| controls the // space in between child views. BoxLayout(Orientation orientation, int inside_border_horizontal_spacing, int inside_border_vertical_spacing, int between_child_spacing); virtual ~BoxLayout(); void set_main_axis_alignment(MainAxisAlignment main_axis_alignment) { main_axis_alignment_ = main_axis_alignment; } void set_inside_border_insets(const gfx::Insets& insets) { inside_border_insets_ = insets; } // Overridden from views::LayoutManager: virtual void Layout(View* host) OVERRIDE; virtual gfx::Size GetPreferredSize(const View* host) const OVERRIDE; virtual int GetPreferredHeightForWidth(const View* host, int width) const OVERRIDE; private: // Returns the size and position along the main axis of |child_area|. int MainAxisSize(const gfx::Rect& child_area) const; int MainAxisPosition(const gfx::Rect& child_area) const; // Sets the size and position along the main axis of |child_area|. void SetMainAxisSize(int size, gfx::Rect* child_area) const; void SetMainAxisPosition(int position, gfx::Rect* child_area) const; // The preferred size for the dialog given the width of the child area. gfx::Size GetPreferredSizeForChildWidth(const View* host, int child_area_width) const; // The amount of space the layout requires in addition to any space for the // child views. gfx::Size NonChildSize(const View* host) const; const Orientation orientation_; // Spacing between child views and host view border. gfx::Insets inside_border_insets_; // Spacing to put in between child views. const int between_child_spacing_; // The alignment of children in the main axis. This is // MAIN_AXIS_ALIGNMENT_START by default. MainAxisAlignment main_axis_alignment_; DISALLOW_IMPLICIT_CONSTRUCTORS(BoxLayout); }; } // namespace views #endif // UI_VIEWS_LAYOUT_BOX_LAYOUT_H_