1/*
2 * Copyright 2006, Ingo Weinhold <bonefish@cs.tu-berlin.de>.
3 * All rights reserved. Distributed under the terms of the MIT License.
4 */
5
6#include <GroupLayoutBuilder.h>
7
8#include <new>
9
10#include <SpaceLayoutItem.h>
11
12
13using std::nothrow;
14
15
16// constructor
17BGroupLayoutBuilder::BGroupLayoutBuilder(orientation orientation,
18	float spacing)
19	: fRootLayout((new BGroupView(orientation, spacing))->GroupLayout())
20{
21	_PushLayout(fRootLayout);
22}
23
24// constructor
25BGroupLayoutBuilder::BGroupLayoutBuilder(BGroupLayout* layout)
26	: fRootLayout(layout)
27{
28	_PushLayout(fRootLayout);
29}
30
31// constructor
32BGroupLayoutBuilder::BGroupLayoutBuilder(BGroupView* view)
33	: fRootLayout(view->GroupLayout())
34{
35	_PushLayout(fRootLayout);
36}
37
38// RootLayout
39BGroupLayout*
40BGroupLayoutBuilder::RootLayout() const
41{
42	return fRootLayout;
43}
44
45// TopLayout
46BGroupLayout*
47BGroupLayoutBuilder::TopLayout() const
48{
49	int32 count = fLayoutStack.CountItems();
50	return (count > 0
51		? (BGroupLayout*)fLayoutStack.ItemAt(count - 1) : NULL);
52}
53
54// GetTopLayout
55BGroupLayoutBuilder&
56BGroupLayoutBuilder::GetTopLayout(BGroupLayout** _layout)
57{
58	*_layout = TopLayout();
59	return *this;
60}
61
62// TopView
63BView*
64BGroupLayoutBuilder::TopView() const
65{
66	if (BGroupLayout* layout = TopLayout())
67		return layout->Owner();
68	return NULL;
69}
70
71// GetTopView
72BGroupLayoutBuilder&
73BGroupLayoutBuilder::GetTopView(BView** _view)
74{
75	if (BGroupLayout* layout = TopLayout())
76		*_view = layout->Owner();
77	else
78		*_view = NULL;
79
80	return *this;
81}
82
83// Add
84BGroupLayoutBuilder&
85BGroupLayoutBuilder::Add(BView* view)
86{
87	if (BGroupLayout* layout = TopLayout())
88		layout->AddView(view);
89	return *this;
90}
91
92// Add
93BGroupLayoutBuilder&
94BGroupLayoutBuilder::Add(BView* view, float weight)
95{
96	if (BGroupLayout* layout = TopLayout())
97		layout->AddView(view, weight);
98	return *this;
99}
100
101// Add
102BGroupLayoutBuilder&
103BGroupLayoutBuilder::Add(BLayoutItem* item)
104{
105	if (BGroupLayout* layout = TopLayout())
106		layout->AddItem(item);
107	return *this;
108}
109
110// Add
111BGroupLayoutBuilder&
112BGroupLayoutBuilder::Add(BLayoutItem* item, float weight)
113{
114	if (BGroupLayout* layout = TopLayout())
115		layout->AddItem(item, weight);
116	return *this;
117}
118
119// AddGroup
120BGroupLayoutBuilder&
121BGroupLayoutBuilder::AddGroup(orientation orientation, float spacing,
122	float weight)
123{
124	if (BGroupLayout* layout = TopLayout()) {
125		BGroupView* group = new(nothrow) BGroupView(orientation, spacing);
126		if (group) {
127			if (layout->AddView(group, weight))
128				_PushLayout(group->GroupLayout());
129			else
130				delete group;
131		}
132	}
133
134	return *this;
135}
136
137// End
138BGroupLayoutBuilder&
139BGroupLayoutBuilder::End()
140{
141	_PopLayout();
142	return *this;
143}
144
145// AddGlue
146BGroupLayoutBuilder&
147BGroupLayoutBuilder::AddGlue(float weight)
148{
149	if (BGroupLayout* layout = TopLayout())
150		layout->AddItem(BSpaceLayoutItem::CreateGlue(), weight);
151
152	return *this;
153}
154
155// AddStrut
156BGroupLayoutBuilder&
157BGroupLayoutBuilder::AddStrut(float size)
158{
159	if (BGroupLayout* layout = TopLayout()) {
160		if (layout->Orientation() == B_HORIZONTAL)
161			layout->AddItem(BSpaceLayoutItem::CreateHorizontalStrut(size));
162		else
163			layout->AddItem(BSpaceLayoutItem::CreateVerticalStrut(size));
164	}
165
166	return *this;
167}
168
169// SetInsets
170BGroupLayoutBuilder&
171BGroupLayoutBuilder::SetInsets(float left, float top, float right, float bottom)
172{
173	if (BGroupLayout* layout = TopLayout())
174		layout->SetInsets(left, top, right, bottom);
175
176	return *this;
177}
178
179// cast operator BGroupLayout*
180BGroupLayoutBuilder::operator BGroupLayout*()
181{
182	return fRootLayout;
183}
184
185// _PushLayout
186bool
187BGroupLayoutBuilder::_PushLayout(BGroupLayout* layout)
188{
189	return fLayoutStack.AddItem(layout);
190}
191
192// _PopLayout
193void
194BGroupLayoutBuilder::_PopLayout()
195{
196	int32 count = fLayoutStack.CountItems();
197	if (count > 0)
198		fLayoutStack.RemoveItem(count - 1);
199}
200