xref: /haiku/src/libs/alm/ALMLayoutBuilder.cpp (revision 02354704729d38c3b078c696adc1bbbd33cbcf72)
1 /*
2  * Copyright 2012, Haiku, Inc. All rights reserved.
3  * Distributed under the terms of the MIT License.
4  */
5 
6 
7 #include "ALMLayoutBuilder.h"
8 
9 
10 #include <Window.h>
11 
12 #include "Area.h"
13 
14 
15 namespace BALM {
16 
17 
18 BALMLayoutBuilder::BALMLayoutBuilder(BView* view, float hSpacing,
19 	float vSpacing, BALMLayout* friendLayout)
20 {
21 	fLayout = new BALMLayout(hSpacing, vSpacing, friendLayout);
22 	view->SetLayout(fLayout);
23 }
24 
25 
26 BALMLayoutBuilder::BALMLayoutBuilder(BView* view, BALMLayout* layout)
27 {
28 	fLayout = layout;
29 	view->SetLayout(layout);
30 }
31 
32 
33 BALMLayoutBuilder::BALMLayoutBuilder(BWindow* window, float hSpacing,
34 	float vSpacing, BALMLayout* friendLayout)
35 {
36 	fLayout = new BALMLayout(hSpacing, vSpacing, friendLayout);
37 	window->SetLayout(fLayout);
38 
39 	fLayout->Owner()->SetViewUIColor(B_PANEL_BACKGROUND_COLOR);
40 		// TODO: we get a white background if we don't do this
41 }
42 
43 
44 BALMLayoutBuilder::BALMLayoutBuilder(BWindow* window, BALMLayout* layout)
45 {
46 	fLayout = layout;
47 	window->SetLayout(fLayout);
48 
49 	fLayout->Owner()->SetViewUIColor(B_PANEL_BACKGROUND_COLOR);
50 		// TODO: we get a white background if we don't do this
51 }
52 
53 
54 BALMLayoutBuilder::BALMLayoutBuilder(BALMLayout* layout)
55 {
56 	fLayout = layout;
57 }
58 
59 
60 BALMLayoutBuilder&
61 BALMLayoutBuilder::Add(BView* view, XTab* left, YTab* top,
62 	XTab* right, YTab* bottom)
63 {
64 	Area* a = (fLayout->AddView(view, left, top, right, bottom));
65 	_SetCurrentArea(a);
66 	return *this;
67 }
68 
69 
70 BALMLayoutBuilder&
71 BALMLayoutBuilder::Add(BView* view, Row* row, Column* column)
72 {
73 	_SetCurrentArea(fLayout->AddView(view, row, column));
74 	return *this;
75 }
76 
77 
78 BALMLayoutBuilder&
79 BALMLayoutBuilder::Add(BLayoutItem* item, XTab* left, YTab* top,
80 	XTab* right, YTab* bottom)
81 {
82 	_SetCurrentArea(fLayout->AddItem(item, left, top, right, bottom));
83 	return *this;
84 }
85 
86 
87 BALMLayoutBuilder&
88 BALMLayoutBuilder::Add(BLayoutItem* item, Row* row, Column* column)
89 {
90 	fLayout->AddItem(item, row, column);
91 	return *this;
92 }
93 
94 
95 
96 BALMLayoutBuilder&
97 BALMLayoutBuilder::SetInsets(float insets)
98 {
99 	fLayout->SetInsets(insets);
100 	return *this;
101 }
102 
103 
104 BALMLayoutBuilder&
105 BALMLayoutBuilder::SetInsets(float horizontal, float vertical)
106 {
107 	fLayout->SetInsets(horizontal, vertical);
108 	return *this;
109 }
110 
111 
112 BALMLayoutBuilder&
113 BALMLayoutBuilder::SetInsets(float left, float top, float right,
114 									float bottom)
115 {
116 	fLayout->SetInsets(left, top, right, bottom);
117 	return *this;
118 }
119 
120 
121 BALMLayoutBuilder&
122 BALMLayoutBuilder::SetSpacing(float horizontal, float vertical)
123 {
124 	fLayout->SetSpacing(horizontal, vertical);
125 	return *this;
126 }
127 
128 
129 BALMLayoutBuilder&
130 BALMLayoutBuilder::StartingAt(BView* view)
131 {
132 	fAreaStack.MakeEmpty();
133 	fAreaStack.AddItem(fLayout->AreaFor(view));
134 	return *this;
135 }
136 
137 
138 BALMLayoutBuilder&
139 BALMLayoutBuilder::StartingAt(BLayoutItem* item)
140 {
141 	fAreaStack.MakeEmpty();
142 	fAreaStack.AddItem(fLayout->AreaFor(item));
143 	return *this;
144 }
145 
146 
147 BALMLayoutBuilder&
148 BALMLayoutBuilder::AddToLeft(BView* view, XTab* _left, YTab* top, YTab* bottom)
149 {
150 	Area* currentArea = _CurrentArea();
151 	BReference<XTab> left = _left;
152 	if (_left == NULL)
153 		left = fLayout->AddXTab();
154 	XTab* right = currentArea->Left();
155 	if (!top)
156 		top = currentArea->Top();
157 	if (!bottom)
158 		bottom = currentArea->Bottom();
159 
160 	return Add(view, left, top, right, bottom);
161 }
162 
163 
164 BALMLayoutBuilder&
165 BALMLayoutBuilder::AddToRight(BView* view, XTab* _right, YTab* top,
166 	YTab* bottom)
167 {
168 	Area* currentArea = _CurrentArea();
169 	XTab* left = currentArea->Right();
170 	BReference<XTab> right = _right;
171 	if (_right == NULL)
172 		right = fLayout->AddXTab();
173 	if (!top)
174 		top = currentArea->Top();
175 	if (!bottom)
176 		bottom = currentArea->Bottom();
177 
178 	return Add(view, left, top, right, bottom);
179 }
180 
181 
182 BALMLayoutBuilder&
183 BALMLayoutBuilder::AddAbove(BView* view, YTab* _top, XTab* left,
184 	XTab* right)
185 {
186 	Area* currentArea = _CurrentArea();
187 	if (!left)
188 		left = currentArea->Left();
189 	if (!right)
190 		right = currentArea->Right();
191 	BReference<YTab> top = _top;
192 	if (_top == NULL)
193 		top = fLayout->AddYTab();
194 	YTab* bottom = currentArea->Top();
195 
196 	return Add(view, left, top, right, bottom);
197 }
198 
199 
200 BALMLayoutBuilder&
201 BALMLayoutBuilder::AddBelow(BView* view, YTab* _bottom, XTab* left,
202 	XTab* right)
203 {
204 	Area* currentArea = _CurrentArea();
205 	if (!left)
206 		left = currentArea->Left();
207 	if (!right)
208 		right = currentArea->Right();
209 	YTab* top = currentArea->Bottom();
210 	BReference<YTab> bottom = _bottom;
211 	if (_bottom == NULL)
212 		bottom = fLayout->AddYTab();
213 
214 	return Add(view, left, top, right, bottom);
215 }
216 
217 
218 BALMLayoutBuilder&
219 BALMLayoutBuilder::AddToLeft(BLayoutItem* item, XTab* _left, YTab* top,
220 	YTab* bottom)
221 {
222 	Area* currentArea = _CurrentArea();
223 	BReference<XTab> left = _left;
224 	if (_left == NULL)
225 		left = fLayout->AddXTab();
226 	XTab* right = currentArea->Left();
227 	if (!top)
228 		top = currentArea->Top();
229 	if (!bottom)
230 		bottom = currentArea->Bottom();
231 
232 	return Add(item, left, top, right, bottom);
233 }
234 
235 
236 BALMLayoutBuilder&
237 BALMLayoutBuilder::AddToRight(BLayoutItem* item, XTab* _right, YTab* top,
238 	YTab* bottom)
239 {
240 	Area* currentArea = _CurrentArea();
241 	XTab* left = currentArea->Right();
242 	BReference<XTab> right = _right;
243 	if (_right == NULL)
244 		right = fLayout->AddXTab();
245 	if (!top)
246 		top = currentArea->Top();
247 	if (!bottom)
248 		bottom = currentArea->Bottom();
249 
250 	return Add(item, left, top, right, bottom);
251 }
252 
253 
254 BALMLayoutBuilder&
255 BALMLayoutBuilder::AddAbove(BLayoutItem* item, YTab* _top, XTab* left,
256 	XTab* right)
257 {
258 	Area* currentArea = _CurrentArea();
259 	if (!left)
260 		left = currentArea->Left();
261 	if (!right)
262 		right = currentArea->Right();
263 	BReference<YTab> top = _top;
264 	if (_top == NULL)
265 		top = fLayout->AddYTab();
266 	YTab* bottom = currentArea->Top();
267 
268 	return Add(item, left, top, right, bottom);
269 }
270 
271 
272 BALMLayoutBuilder&
273 BALMLayoutBuilder::AddBelow(BLayoutItem* item, YTab* _bottom, XTab* left,
274 	XTab* right)
275 {
276 	Area* currentArea = _CurrentArea();
277 	if (!left)
278 		left = currentArea->Left();
279 	if (!right)
280 		right = currentArea->Right();
281 	YTab* top = currentArea->Bottom();
282 	BReference<YTab> bottom = _bottom;
283 	if (_bottom == NULL)
284 		bottom = fLayout->AddYTab();
285 
286 	return Add(item, left, top, right, bottom);
287 }
288 
289 
290 BALMLayoutBuilder&
291 BALMLayoutBuilder::Push()
292 {
293 	fAreaStack.AddItem(_CurrentArea());
294 	return *this;
295 }
296 
297 
298 BALMLayoutBuilder&
299 BALMLayoutBuilder::Pop()
300 {
301 	if (fAreaStack.CountItems() > 0)
302 		fAreaStack.RemoveItemAt(fAreaStack.CountItems() - 1);
303 	return *this;
304 }
305 
306 
307 void
308 BALMLayoutBuilder::_SetCurrentArea(Area* area)
309 {
310 	if (fAreaStack.CountItems() > 0)
311 		fAreaStack.ReplaceItem(fAreaStack.CountItems() - 1, area);
312 	else
313 		fAreaStack.AddItem(area);
314 }
315 
316 
317 Area*
318 BALMLayoutBuilder::_CurrentArea() const
319 {
320 	return fAreaStack.ItemAt(fAreaStack.CountItems() - 1);
321 }
322 
323 
324 };
325