xref: /haiku/src/libs/alm/ALMLayoutBuilder.cpp (revision f0307e765ed63a07ff0ad29df44b8d5d2f354acb)
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()->SetViewColor(ui_color(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()->SetViewColor(ui_color(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 	fLayout->AddView(view, left, top, right, bottom);
65 	return *this;
66 }
67 
68 
69 BALMLayoutBuilder&
70 BALMLayoutBuilder::Add(BView* view, Row* row, Column* column)
71 {
72 	fLayout->AddView(view, row, column);
73 	return *this;
74 }
75 
76 
77 BALMLayoutBuilder&
78 BALMLayoutBuilder::Add(BLayoutItem* item, XTab* left, YTab* top,
79 	XTab* right, YTab* bottom)
80 {
81 	fLayout->AddItem(item, left, top, right, bottom);
82 	return *this;
83 }
84 
85 
86 BALMLayoutBuilder&
87 BALMLayoutBuilder::Add(BLayoutItem* item, Row* row, Column* column)
88 {
89 	fLayout->AddItem(item, row, column);
90 	return *this;
91 }
92 
93 
94 
95 BALMLayoutBuilder&
96 BALMLayoutBuilder::SetInsets(float insets)
97 {
98 	fLayout->SetInsets(insets);
99 	return *this;
100 }
101 
102 
103 BALMLayoutBuilder&
104 BALMLayoutBuilder::SetInsets(float horizontal, float vertical)
105 {
106 	fLayout->SetInsets(horizontal, vertical);
107 	return *this;
108 }
109 
110 
111 BALMLayoutBuilder&
112 BALMLayoutBuilder::SetInsets(float left, float top, float right,
113 									float bottom)
114 {
115 	fLayout->SetInsets(left, top, right, bottom);
116 	return *this;
117 }
118 
119 
120 BALMLayoutBuilder&
121 BALMLayoutBuilder::SetSpacing(float horizontal, float vertical)
122 {
123 	fLayout->SetSpacing(horizontal, vertical);
124 	return *this;
125 }
126 
127 
128 BALMLayoutBuilder::Snake
129 BALMLayoutBuilder::StartingAt(BView* view)
130 {
131 	return Snake(fLayout->AreaFor(view), this);
132 }
133 
134 
135 BALMLayoutBuilder::Snake
136 BALMLayoutBuilder::StartingAt(BLayoutItem* item)
137 {
138 	return Snake(fLayout->AreaFor(item), this);
139 }
140 
141 
142 BALMLayoutBuilder::Snake::Snake(Area* area, BALMLayoutBuilder* root)
143 {
144 	fCurrentArea = area;
145 	fRootBuilder = root;
146 	fPreviousSnake = NULL;
147 }
148 
149 
150 BALMLayoutBuilder::Snake::Snake(Area* area, Snake* previous)
151 {
152 	fCurrentArea = area;
153 	fRootBuilder = previous->fRootBuilder;
154 	fPreviousSnake = previous;
155 }
156 
157 
158 BALMLayoutBuilder::Snake&
159 BALMLayoutBuilder::Snake::AddToLeft(BView* view, XTab* _left, YTab* top,
160 	YTab* bottom)
161 {
162 	BReference<XTab> left = _left;
163 	if (_left == NULL)
164 		left = _Layout()->AddXTab();
165 	XTab* right = fCurrentArea->Left();
166 	if (!top)
167 		top = fCurrentArea->Top();
168 	if (!bottom)
169 		bottom = fCurrentArea->Bottom();
170 
171 	fCurrentArea = _AddToLayout(view, left, top, right, bottom);
172 	return *this;
173 }
174 
175 
176 BALMLayoutBuilder::Snake&
177 BALMLayoutBuilder::Snake::AddToRight(BView* view, XTab* _right, YTab* top,
178 	YTab* bottom)
179 {
180 	XTab* left = fCurrentArea->Right();
181 	BReference<XTab> right = _right;
182 	if (_right == NULL)
183 		right = _Layout()->AddXTab();
184 	if (!top)
185 		top = fCurrentArea->Top();
186 	if (!bottom)
187 		bottom = fCurrentArea->Bottom();
188 
189 	fCurrentArea = _AddToLayout(view, left, top, right, bottom);
190 	return *this;
191 }
192 
193 
194 BALMLayoutBuilder::Snake&
195 BALMLayoutBuilder::Snake::AddAbove(BView* view, YTab* _top, XTab* left,
196 	XTab* right)
197 {
198 	if (!left)
199 		left = fCurrentArea->Left();
200 	if (!right)
201 		right = fCurrentArea->Right();
202 	BReference<YTab> top = _top;
203 	if (_top == NULL)
204 		top = _Layout()->AddYTab();
205 	YTab* bottom = fCurrentArea->Top();
206 
207 	fCurrentArea = _AddToLayout(view, left, top, right, bottom);
208 	return *this;
209 }
210 
211 
212 BALMLayoutBuilder::Snake&
213 BALMLayoutBuilder::Snake::AddBelow(BView* view, YTab* _bottom, XTab* left,
214 	XTab* right)
215 {
216 	if (!left)
217 		left = fCurrentArea->Left();
218 	if (!right)
219 		right = fCurrentArea->Right();
220 	YTab* top = fCurrentArea->Bottom();
221 	BReference<YTab> bottom = _bottom;
222 	if (_bottom == NULL)
223 		bottom = _Layout()->AddYTab();
224 
225 	fCurrentArea = _AddToLayout(view, left, top, right, bottom);
226 	return *this;
227 }
228 
229 
230 BALMLayoutBuilder::Snake&
231 BALMLayoutBuilder::Snake::AddToLeft(BLayoutItem* item, XTab* _left, YTab* top,
232 	YTab* bottom)
233 {
234 	BReference<XTab> left = _left;
235 	if (_left == NULL)
236 		left = _Layout()->AddXTab();
237 	XTab* right = fCurrentArea->Left();
238 	if (!top)
239 		top = fCurrentArea->Top();
240 	if (!bottom)
241 		bottom = fCurrentArea->Bottom();
242 
243 	fCurrentArea = _AddToLayout(item, left, top, right, bottom);
244 	return *this;
245 }
246 
247 
248 BALMLayoutBuilder::Snake&
249 BALMLayoutBuilder::Snake::AddToRight(BLayoutItem* item, XTab* _right, YTab* top,
250 	YTab* bottom)
251 {
252 	XTab* left = fCurrentArea->Right();
253 	BReference<XTab> right = _right;
254 	if (_right == NULL)
255 		right = _Layout()->AddXTab();
256 	if (!top)
257 		top = fCurrentArea->Top();
258 	if (!bottom)
259 		bottom = fCurrentArea->Bottom();
260 
261 	fCurrentArea = _AddToLayout(item, left, top, right, bottom);
262 	return *this;
263 }
264 
265 
266 BALMLayoutBuilder::Snake&
267 BALMLayoutBuilder::Snake::AddAbove(BLayoutItem* item, YTab* _top, XTab* left,
268 	XTab* right)
269 {
270 	if (!left)
271 		left = fCurrentArea->Left();
272 	if (!right)
273 		right = fCurrentArea->Right();
274 	BReference<YTab> top = _top;
275 	if (_top == NULL)
276 		top = _Layout()->AddYTab();
277 	YTab* bottom = fCurrentArea->Top();
278 
279 	fCurrentArea = _AddToLayout(item, left, top, right, bottom);
280 	return *this;
281 }
282 
283 
284 BALMLayoutBuilder::Snake&
285 BALMLayoutBuilder::Snake::AddBelow(BLayoutItem* item, YTab* _bottom, XTab* left,
286 	XTab* right)
287 {
288 	if (!left)
289 		left = fCurrentArea->Left();
290 	if (!right)
291 		right = fCurrentArea->Right();
292 	YTab* top = fCurrentArea->Bottom();
293 	BReference<YTab> bottom = _bottom;
294 	if (_bottom == NULL)
295 		bottom = _Layout()->AddYTab();
296 
297 	fCurrentArea = _AddToLayout(item, left, top, right, bottom);
298 	return *this;
299 }
300 
301 
302 BALMLayoutBuilder::Snake
303 BALMLayoutBuilder::Snake::StartingAt(BView* view)
304 {
305 	return fRootBuilder->StartingAt(view);
306 }
307 
308 
309 BALMLayoutBuilder::Snake
310 BALMLayoutBuilder::Snake::StartingAt(BLayoutItem* item)
311 {
312 	return fRootBuilder->StartingAt(item);
313 }
314 
315 
316 BALMLayoutBuilder::Snake
317 BALMLayoutBuilder::Snake::Push()
318 {
319 	return Snake(fCurrentArea, this);
320 }
321 
322 
323 BALMLayoutBuilder::Snake&
324 BALMLayoutBuilder::Snake::Pop()
325 {
326 	return *fPreviousSnake;
327 }
328 
329 
330 BALMLayoutBuilder&
331 BALMLayoutBuilder::Snake::End()
332 {
333 	return *fRootBuilder;
334 }
335 
336 
337 BALMLayout*
338 BALMLayoutBuilder::Snake::_Layout()
339 {
340 	return fRootBuilder->fLayout;
341 }
342 
343 
344 Area*
345 BALMLayoutBuilder::Snake::_AddToLayout(BView* view, XTab* left, YTab* top,
346 	XTab* right, YTab* bottom)
347 {
348 	return _Layout()->AddView(view, left, top, right, bottom);
349 }
350 
351 
352 Area*
353 BALMLayoutBuilder::Snake::_AddToLayout(BLayoutItem* item, XTab* left,
354 	YTab* top, XTab* right, YTab* bottom)
355 {
356 	return _Layout()->AddItem(item, left, top, right, bottom);
357 }
358 
359 
360 };
361