xref: /haiku/docs/user/interface/LayoutBuilder.dox (revision f648efd3d411e5d5590b586091e5cb75da896cfd)
1/*
2 * Copyright 2010 Haiku, Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		Alex Wilson, yourpalal2@gmail.com
7 *
8 * Corresponds to:
9 *		headers/os/interface/LayoutBuilder.h	rev 38207
10 *		src/kits/interface/LayoutBuilder.cpp	rev 38207
11 */
12
13
14/*!
15	\file LayoutBuilder.h
16	\ingroup interface
17	\ingroup layout
18	\ingroup libbe
19	\brief Defines the BLayoutBuilder templates.
20*/
21
22
23/*!
24	\class BLayoutBuilder::Base<>
25	\ingroup interface
26	\ingroup layout
27	\brief Base for all other layout builders in the BLayoutBuilder namespace.
28
29	This class provides the stack-like semantics for its subclasses. The
30	BLayoutBuilder::Group, BLayoutBuilder::Grid and BLayoutBuilder::Split all
31	provide methods such as AddGrid() AddGroup() and AddSplit(), which
32	make a new builder, place it on top of your builder stack and return it.
33	Now you are operating on the new builder. When you call	the End() method on
34	the new builder, you are returned the one you had previously been using. At
35	any point, you are calling methods on whatever builder currently resides on
36	the top of the stack. Here's an example of how these classes work.
37
38\code
39BLayoutBuilder::Group<>(B_HORIZONTAL)
40\endcode
41
42	At this point our stack just contains a single builder, it looks like this:
43		\li Group<>
44
45\code
46	.AddGrid()
47\endcode
48
49	Now there is a Grid builder on top of the stack, so it looks like this \li Group<>::GridBuilder
50		\li Group<>
51
52	Notice that the Grid on top of the stack is not a plain Grid<>, but a nested
53	type from the Group<> class. This is an essential part of the builder
54	classes, as this is what allows you to pop builders off the stack and get
55	the correct type in return.
56
57\code
58		.AddSplit()
59\endcode
60
61	Now our stack looks like this:
62		\li Group<>::GridBuilder::SplitBuilder
63		\li Group<>::GridBuilder
64		\li Group<>
65
66	This could continue ad. nauseam, but at some point, you may finish with a
67	builder, and you might want to continue manipulating the builder below it
68	on the stack. To do this, you simply call the End() method like so:
69
70\code
71			.End()
72\endcode
73
74	And now the stack is back to this:
75		\li Group<>::GridBuilder
76		\li Group<>
77
78	So you are again working with the grid builder. You can add more
79	BLayoutItems or BViews, or even more builders. Here's how it will all look
80	together.
81
82\code
83BLayoutBuilder::Group<>(B_HORIZONTAL)
84	// working with the Group builder
85	.AddGrid()
86		// working with the Group<>::GridBuilder
87		.AddSplit()
88			// working with the Group<>::GridBuilder::SplitBuilder
89		.End()
90		// back to the Group<>::GridBuilder
91\endcode
92
93	\since Haiku R1
94*/
95
96
97/*!
98	\fn void BLayoutBuilder::Base<ParentBuilder>::SetParent(ParentBuilder*
99		parent)
100	\brief Internal method for use by BLayoutBuilder::Base subclasses,
101	       this is essential to the builder stack semantics.
102
103	\since Haiku R1
104*/
105
106
107/*!
108	\fn ParentBuilder& BLayoutBuilder::Base<ParentBuilder>::End()
109	\brief Returns this builder's parent.
110
111	\since Haiku R1
112*/
113
114
115
116/*
117
118
119template<typename ParentBuilder>
120class Grid : public Base<ParentBuilder> {
121public:
122	typedef Grid<ParentBuilder>		ThisBuilder;
123	typedef Group<ThisBuilder>		GroupBuilder;
124	typedef Grid<ThisBuilder>		GridBuilder;
125	typedef Split<ThisBuilder>		SplitBuilder;
126
127public:
128	inline						Grid(float horizontalSpacing = 0.0f,
129									float verticalSpacing = 0.0f);
130	inline						Grid(BWindow* window,
131									float horizontalSpacing = 0.0f,
132									float verticalSpacing = 0.0f);
133	inline						Grid(BGridLayout* layout);
134	inline						Grid(BGridView* view);
135
136	inline	BGridLayout*		Layout() const;
137	inline	BView*				View() const;
138	inline	ThisBuilder&		GetLayout(BGridLayout** _layout);
139	inline	ThisBuilder&		GetView(BView** _view);
140
141	inline	ThisBuilder&		Add(BView* view, int32 column, int32 row,
142									int32 columnCount = 1, int32 rowCount = 1);
143	inline	ThisBuilder&		Add(BLayoutItem* item, int32 column, int32 row,
144									int32 columnCount = 1, int32 rowCount = 1);
145	inline	ThisBuilder&		AddMenuField(BMenuField* menuField,
146									int32 column, int32 row,
147									alignment labelAlignment
148										= B_ALIGN_HORIZONTAL_UNSET,
149									int32 columnCount = 1, int32 rowCount = 1);
150	inline	ThisBuilder&		AddTextControl(BTextControl* textControl,
151									int32 column, int32 row,
152									alignment labelAlignment
153										= B_ALIGN_HORIZONTAL_UNSET,
154									int32 columnCount = 1, int32 rowCount = 1);
155
156	inline	GroupBuilder		AddGroup(orientation orientation,
157									float spacing, int32 column, int32 row,
158									int32 columnCount = 1, int32 rowCount = 1);
159	inline	GroupBuilder		AddGroup(BGroupView* groupView,	int32 column,
160									int32 row, int32 columnCount = 1,
161									int32 rowCount = 1);
162	inline	GroupBuilder		AddGroup(BGroupLayout* groupLayout,
163									int32 column, int32 row,
164									int32 columnCount = 1, int32 rowCount = 1);
165
166	inline	GridBuilder			AddGrid(float horizontalSpacing,
167									float verticalSpacing, int32 column,
168									int32 row, int32 columnCount = 1,
169									int32 rowCount = 1);
170	inline	GridBuilder			AddGrid(BGridLayout* gridLayout,
171									int32 column, int32 row,
172									int32 columnCount = 1, int32 rowCount = 1);
173	inline	GridBuilder			AddGrid(BGridView* gridView,
174									int32 column, int32 row,
175									int32 columnCount = 1, int32 rowCount = 1);
176
177	inline	SplitBuilder		AddSplit(orientation orientation,
178									float spacing, int32 column, int32 row,
179									int32 columnCount = 1, int32 rowCount = 1);
180	inline	SplitBuilder		AddSplit(BSplitView* splitView, int32 column,
181									int32 row, int32 columnCount = 1,
182									int32 rowCount = 1);
183
184	inline	ThisBuilder&		SetColumnWeight(int32 column, float weight);
185	inline	ThisBuilder&		SetRowWeight(int32 row, float weight);
186
187	inline	ThisBuilder&		SetInsets(float left, float top, float right,
188									float bottom);
189
190	inline						operator BGridLayout*();
191
192private:
193			BGridLayout*		fLayout;
194};
195
196
197template<typename ParentBuilder>
198class Split : public Base<ParentBuilder> {
199public:
200	typedef Split<ParentBuilder>	ThisBuilder;
201	typedef Group<ThisBuilder>		GroupBuilder;
202	typedef Grid<ThisBuilder>		GridBuilder;
203	typedef Split<ThisBuilder>		SplitBuilder;
204
205public:
206	inline						Split(orientation orientation = B_HORIZONTAL,
207									float spacing = 0.0f);
208	inline						Split(BSplitView* view);
209
210	inline	BSplitView*			View() const;
211	inline	ThisBuilder&		GetView(BView** _view);
212	inline	ThisBuilder&		GetSplitView(BSplitView** _view);
213
214	inline	ThisBuilder&		Add(BView* view);
215	inline	ThisBuilder&		Add(BView* view, float weight);
216	inline	ThisBuilder&		Add(BLayoutItem* item);
217	inline	ThisBuilder&		Add(BLayoutItem* item, float weight);
218
219	inline	GroupBuilder		AddGroup(orientation orientation,
220									float spacing = 0.0f, float weight = 1.0f);
221	inline	GroupBuilder		AddGroup(BGroupView* groupView,
222									float weight = 1.0f);
223	inline	GroupBuilder		AddGroup(BGroupLayout* groupLayout,
224									float weight = 1.0f);
225
226	inline	GridBuilder			AddGrid(float horizontalSpacing = 0.0f,
227									float verticalSpacing = 0.0f,
228									float weight = 1.0f);
229	inline	GridBuilder			AddGrid(BGridView* gridView,
230									float weight = 1.0f);
231	inline	GridBuilder			AddGrid(BGridLayout* gridLayout,
232									float weight = 1.0f);
233
234	inline	SplitBuilder		AddSplit(orientation orientation,
235									float spacing = 0.0f, float weight = 1.0f);
236	inline	SplitBuilder		AddSplit(BSplitView* splitView,
237									float weight = 1.0f);
238
239	inline	ThisBuilder&		SetCollapsible(bool collapsible);
240	inline	ThisBuilder&		SetCollapsible(int32 index, bool collapsible);
241	inline	ThisBuilder&		SetCollapsible(int32 first, int32 last,
242									bool collapsible);
243
244	inline	ThisBuilder&		SetInsets(float left, float top, float right,
245									float bottom);
246
247	inline						operator BSplitView*();
248
249private:
250			BSplitView*			fView;
251};
252