1/*
2 * Copyright 2011, Haiku, Inc.
3 * All rights reserved. Distributed under the terms of the MIT License.
4 */
5#ifndef COLLAPSING_LAYOUTER_H
6#define COLLAPSING_LAYOUTER_H
7
8#include "Layouter.h"
9
10
11namespace BPrivate {
12namespace Layout {
13
14
15/* This layouter wraps either a Compound, Simple or OneElement layouter, and
16 * removes elements which have no constraints, or min/max constraints of
17 * B_SIZE_UNSET. The child layouter is given only the constraints for the
18 * remaining elements. When using the LayoutInfo of this layouter,
19 * collapsed (removed) elements are given no space on screen.
20 */
21class CollapsingLayouter : public Layouter {
22public:
23								CollapsingLayouter(int32 elementCount,
24									float spacing);
25	virtual						~CollapsingLayouter();
26
27	virtual	void				AddConstraints(int32 element, int32 length,
28									float min, float max, float preferred);
29	virtual	void				SetWeight(int32 element, float weight);
30
31	virtual	float				MinSize();
32	virtual	float				MaxSize();
33	virtual	float				PreferredSize();
34
35	virtual	LayoutInfo*			CreateLayoutInfo();
36
37	virtual	void				Layout(LayoutInfo* layoutInfo, float size);
38
39	virtual	Layouter*			CloneLayouter();
40
41
42private:
43	class	ProxyLayoutInfo;
44	struct	Constraint;
45	struct	ElementInfo;
46
47			void				_ValidateLayouter();
48			Layouter*			_CreateLayouter();
49			void				_DoCollapse();
50			void				_AddConstraints();
51			void				_AddConstraints(int32 position,
52									const Constraint* c);
53			void				_SetWeights();
54
55			int32				fElementCount;
56			ElementInfo*		fElements;
57			int32				fValidElementCount;
58			bool				fHaveMultiElementConstraints;
59			float				fSpacing;
60			Layouter*			fLayouter;
61};
62
63} // namespace Layout
64} // namespace BPrivate
65
66using BPrivate::Layout::CollapsingLayouter;
67
68#endif // COLLAPSING_LAYOUTER_H
69