1/*
2 * Copyright 2007, Ingo Weinhold <bonefish@cs.tu-berlin.de>.
3 * All rights reserved. Distributed under the terms of the MIT License.
4 *
5 * Layouter implementation that can handle complex constraints.
6 */
7#ifndef COMPLEX_LAYOUTER_H
8#define COMPLEX_LAYOUTER_H
9
10#include <List.h>
11
12#include "Layouter.h"
13
14
15namespace BPrivate {
16namespace Layout {
17
18class LayoutOptimizer;
19
20class ComplexLayouter : public Layouter {
21public:
22								ComplexLayouter(int32 elementCount,
23									float spacing);
24	virtual						~ComplexLayouter();
25
26	virtual	status_t			InitCheck() const;
27
28	virtual	void				AddConstraints(int32 element, int32 length,
29									float min, float max, float preferred);
30	virtual	void				SetWeight(int32 element, float weight);
31
32	virtual	float				MinSize();
33	virtual	float				MaxSize();
34	virtual	float				PreferredSize();
35
36	virtual	LayoutInfo*			CreateLayoutInfo();
37
38	virtual	void				Layout(LayoutInfo* layoutInfo, float size);
39
40	virtual	Layouter*			CloneLayouter();
41
42private:
43			class MyLayoutInfo;
44			struct Constraint;
45			struct SumItem;
46			struct SumItemBackup;
47
48			bool				_Layout(int32 size, SumItem* sums,
49									int32* sizes);
50			bool				_AddOptimizerConstraints();
51			bool				_SatisfiesConstraints(int32* sizes) const;
52			bool				_SatisfiesConstraintsSums(int32* sums) const;
53
54			void				_ValidateLayout();
55			void				_ApplyMaxConstraint(
56									Constraint* currentConstraint, int32 index);
57			void				_PropagateChanges(SumItem* sums, int32 toIndex,
58									Constraint* lastMaxConstraint);
59			void				_PropagateChangesBack(SumItem* sums,
60									int32 changedIndex,
61									Constraint* lastMaxConstraint);
62
63			void				_BackupValues(int32 maxIndex);
64			void				_RestoreValues(int32 maxIndex);
65
66private:
67			int32				fElementCount;
68			int32				fSpacing;
69			Constraint**		fConstraints;
70			float*				fWeights;
71			SumItem*			fSums;
72			SumItemBackup*		fSumBackups;
73			LayoutOptimizer*	fOptimizer;
74			float				fMin;
75			float				fMax;
76			int32				fUnlimited;
77			bool				fMinMaxValid;
78			bool				fOptimizerConstraintsAdded;
79};
80
81}	// namespace Layout
82}	// namespace BPrivate
83
84using BPrivate::Layout::ComplexLayouter;
85
86
87#endif	// COMPLEX_LAYOUTER_H
88