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
15namespace BALM {
16
17
18BALMLayoutBuilder::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
26BALMLayoutBuilder::BALMLayoutBuilder(BView* view, BALMLayout* layout)
27{
28	fLayout = layout;
29	view->SetLayout(layout);
30}
31
32
33BALMLayoutBuilder::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
44BALMLayoutBuilder::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
54BALMLayoutBuilder::BALMLayoutBuilder(BALMLayout* layout)
55{
56	fLayout = layout;
57}
58
59
60BALMLayoutBuilder&
61BALMLayoutBuilder::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
70BALMLayoutBuilder&
71BALMLayoutBuilder::Add(BView* view, Row* row, Column* column)
72{
73	_SetCurrentArea(fLayout->AddView(view, row, column));
74	return *this;
75}
76
77
78BALMLayoutBuilder&
79BALMLayoutBuilder::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
87BALMLayoutBuilder&
88BALMLayoutBuilder::Add(BLayoutItem* item, Row* row, Column* column)
89{
90	fLayout->AddItem(item, row, column);
91	return *this;
92}
93
94
95
96BALMLayoutBuilder&
97BALMLayoutBuilder::SetInsets(float insets)
98{
99	fLayout->SetInsets(insets);
100	return *this;
101}
102
103
104BALMLayoutBuilder&
105BALMLayoutBuilder::SetInsets(float horizontal, float vertical)
106{
107	fLayout->SetInsets(horizontal, vertical);
108	return *this;
109}
110
111
112BALMLayoutBuilder&
113BALMLayoutBuilder::SetInsets(float left, float top, float right,
114									float bottom)
115{
116	fLayout->SetInsets(left, top, right, bottom);
117	return *this;
118}
119
120
121BALMLayoutBuilder&
122BALMLayoutBuilder::SetSpacing(float horizontal, float vertical)
123{
124	fLayout->SetSpacing(horizontal, vertical);
125	return *this;
126}
127
128
129BALMLayoutBuilder&
130BALMLayoutBuilder::StartingAt(BView* view)
131{
132	fAreaStack.MakeEmpty();
133	fAreaStack.AddItem(fLayout->AreaFor(view));
134	return *this;
135}
136
137
138BALMLayoutBuilder&
139BALMLayoutBuilder::StartingAt(BLayoutItem* item)
140{
141	fAreaStack.MakeEmpty();
142	fAreaStack.AddItem(fLayout->AreaFor(item));
143	return *this;
144}
145
146
147BALMLayoutBuilder&
148BALMLayoutBuilder::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
164BALMLayoutBuilder&
165BALMLayoutBuilder::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
182BALMLayoutBuilder&
183BALMLayoutBuilder::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
200BALMLayoutBuilder&
201BALMLayoutBuilder::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
218BALMLayoutBuilder&
219BALMLayoutBuilder::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
236BALMLayoutBuilder&
237BALMLayoutBuilder::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
254BALMLayoutBuilder&
255BALMLayoutBuilder::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
272BALMLayoutBuilder&
273BALMLayoutBuilder::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
290BALMLayoutBuilder&
291BALMLayoutBuilder::Push()
292{
293	fAreaStack.AddItem(_CurrentArea());
294	return *this;
295}
296
297
298BALMLayoutBuilder&
299BALMLayoutBuilder::Pop()
300{
301	if (fAreaStack.CountItems() > 0)
302		fAreaStack.RemoveItemAt(fAreaStack.CountItems() - 1);
303	return *this;
304}
305
306
307void
308BALMLayoutBuilder::_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
317Area*
318BALMLayoutBuilder::_CurrentArea() const
319{
320	return fAreaStack.ItemAt(fAreaStack.CountItems() - 1);
321}
322
323
324};
325