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