1/*
2 * Copyright 2010, Haiku, Inc.
3 * Copyright 2006, Ingo Weinhold <bonefish@cs.tu-berlin.de>.
4 * All rights reserved. Distributed under the terms of the MIT License.
5 */
6
7
8#include <SpaceLayoutItem.h>
9
10#include <new>
11
12#include <ControlLook.h>
13#include <Message.h>
14
15
16namespace {
17	const char* const kSizesField = "BSpaceLayoutItem:sizes";
18		// kSizesField = {min, max, preferred}
19	const char* const kAlignmentField = "BSpaceLayoutItem:alignment";
20	const char* const kFrameField = "BSpaceLayoutItem:frame";
21	const char* const kVisibleField = "BSpaceLayoutItem:visible";
22
23	BSize& ComposeSpacingInPlace(BSize& size)
24	{
25		size.width = BControlLook::ComposeSpacing(size.width);
26		size.height = BControlLook::ComposeSpacing(size.height);
27		return size;
28	}
29}
30
31
32BSpaceLayoutItem::BSpaceLayoutItem(BSize minSize, BSize maxSize,
33	BSize preferredSize, BAlignment alignment)
34	:
35	fFrame(),
36	fMinSize(ComposeSpacingInPlace(minSize)),
37	fMaxSize(ComposeSpacingInPlace(maxSize)),
38	fPreferredSize(ComposeSpacingInPlace(preferredSize)),
39	fAlignment(alignment),
40	fVisible(true)
41{
42}
43
44
45BSpaceLayoutItem::BSpaceLayoutItem(BMessage* archive)
46	:
47	BLayoutItem(archive)
48{
49	archive->FindSize(kSizesField, 0, &fMinSize);
50	archive->FindSize(kSizesField, 1, &fMaxSize);
51	archive->FindSize(kSizesField, 2, &fPreferredSize);
52
53	archive->FindAlignment(kAlignmentField, &fAlignment);
54
55	archive->FindRect(kFrameField, &fFrame);
56	archive->FindBool(kVisibleField, &fVisible);
57}
58
59
60BSpaceLayoutItem::~BSpaceLayoutItem()
61{
62}
63
64
65BSpaceLayoutItem*
66BSpaceLayoutItem::CreateGlue()
67{
68	return new BSpaceLayoutItem(
69		BSize(-1, -1),
70		BSize(B_SIZE_UNLIMITED, B_SIZE_UNLIMITED),
71		BSize(-1, -1),
72		BAlignment(B_ALIGN_HORIZONTAL_CENTER, B_ALIGN_VERTICAL_CENTER));
73}
74
75
76BSpaceLayoutItem*
77BSpaceLayoutItem::CreateHorizontalStrut(float width)
78{
79	return new BSpaceLayoutItem(
80		BSize(width, -1),
81		BSize(width, B_SIZE_UNLIMITED),
82		BSize(width, -1),
83		BAlignment(B_ALIGN_HORIZONTAL_CENTER, B_ALIGN_VERTICAL_CENTER));
84}
85
86
87BSpaceLayoutItem*
88BSpaceLayoutItem::CreateVerticalStrut(float height)
89{
90	return new BSpaceLayoutItem(
91		BSize(-1, height),
92		BSize(B_SIZE_UNLIMITED, height),
93		BSize(-1, height),
94		BAlignment(B_ALIGN_HORIZONTAL_CENTER, B_ALIGN_VERTICAL_CENTER));
95}
96
97
98BSize
99BSpaceLayoutItem::MinSize()
100{
101	return fMinSize;
102}
103
104
105BSize
106BSpaceLayoutItem::MaxSize()
107{
108	return fMaxSize;
109}
110
111
112BSize
113BSpaceLayoutItem::PreferredSize()
114{
115	return fPreferredSize;
116}
117
118
119BAlignment
120BSpaceLayoutItem::Alignment()
121{
122	return fAlignment;
123}
124
125
126void
127BSpaceLayoutItem::SetExplicitMinSize(BSize size)
128{
129	if (size.IsWidthSet())
130		fMinSize.width = size.width;
131	if (size.IsHeightSet())
132		fMinSize.height = size.height;
133
134	InvalidateLayout();
135}
136
137
138void
139BSpaceLayoutItem::SetExplicitMaxSize(BSize size)
140{
141	if (size.IsWidthSet())
142		fMaxSize.width = size.width;
143	if (size.IsHeightSet())
144		fMaxSize.height = size.height;
145
146	InvalidateLayout();
147}
148
149
150void
151BSpaceLayoutItem::SetExplicitPreferredSize(BSize size)
152{
153	if (size.IsWidthSet())
154		fPreferredSize.width = size.width;
155	if (size.IsHeightSet())
156		fPreferredSize.height = size.height;
157
158	InvalidateLayout();
159}
160
161
162void
163BSpaceLayoutItem::SetExplicitAlignment(BAlignment alignment)
164{
165	if (alignment.IsHorizontalSet())
166		fAlignment.horizontal = alignment.horizontal;
167	if (alignment.IsVerticalSet())
168		fAlignment.vertical = alignment.vertical;
169
170	InvalidateLayout();
171}
172
173
174bool
175BSpaceLayoutItem::IsVisible()
176{
177	return fVisible;
178}
179
180
181void
182BSpaceLayoutItem::SetVisible(bool visible)
183{
184	fVisible = visible;
185}
186
187
188BRect
189BSpaceLayoutItem::Frame()
190{
191	return fFrame;
192}
193
194
195void
196BSpaceLayoutItem::SetFrame(BRect frame)
197{
198	fFrame = frame;
199}
200
201
202status_t
203BSpaceLayoutItem::Archive(BMessage* into, bool deep) const
204{
205	status_t err = BLayoutItem::Archive(into, deep);
206
207	if (err == B_OK)
208		err = into->AddRect(kFrameField, fFrame);
209
210	if (err == B_OK)
211		err = into->AddSize(kSizesField, fMinSize);
212
213	if (err == B_OK)
214		err = into->AddSize(kSizesField, fMaxSize);
215
216	if (err == B_OK)
217		err = into->AddSize(kSizesField, fPreferredSize);
218
219	if (err == B_OK)
220		err = into->AddAlignment(kAlignmentField, fAlignment);
221
222	if (err == B_OK)
223		err = into->AddBool(kVisibleField, fVisible);
224
225	return err;
226}
227
228
229BArchivable*
230BSpaceLayoutItem::Instantiate(BMessage* from)
231{
232	if (validate_instantiation(from, "BSpaceLayoutItem"))
233		return new(std::nothrow) BSpaceLayoutItem(from);
234	return NULL;
235}
236
237
238void BSpaceLayoutItem::_ReservedSpaceLayoutItem1() {}
239void BSpaceLayoutItem::_ReservedSpaceLayoutItem2() {}
240void BSpaceLayoutItem::_ReservedSpaceLayoutItem3() {}
241void BSpaceLayoutItem::_ReservedSpaceLayoutItem4() {}
242void BSpaceLayoutItem::_ReservedSpaceLayoutItem5() {}
243void BSpaceLayoutItem::_ReservedSpaceLayoutItem6() {}
244void BSpaceLayoutItem::_ReservedSpaceLayoutItem7() {}
245void BSpaceLayoutItem::_ReservedSpaceLayoutItem8() {}
246void BSpaceLayoutItem::_ReservedSpaceLayoutItem9() {}
247void BSpaceLayoutItem::_ReservedSpaceLayoutItem10() {}
248
249