1/*
2 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Distributed under the terms of the MIT License.
4 */
5
6
7#include "Setting.h"
8
9#include <new>
10
11
12// #pragma mark - Setting
13
14
15Setting::~Setting()
16{
17}
18
19
20// #pragma mark - BoolSetting
21
22
23setting_type
24BoolSetting::Type() const
25{
26	return SETTING_TYPE_BOOL;
27}
28
29
30BVariant
31BoolSetting::DefaultValue() const
32{
33	return DefaultBoolValue();
34}
35
36
37// #pragma mark - FloatSetting
38
39
40setting_type
41FloatSetting::Type() const
42{
43	return SETTING_TYPE_FLOAT;
44}
45
46
47BVariant
48FloatSetting::DefaultValue() const
49{
50	return DefaultFloatValue();
51}
52
53
54// #pragma mark - SettingsOption
55
56
57SettingsOption::~SettingsOption()
58{
59}
60
61
62// #pragma mark - OptionsSetting
63
64
65setting_type
66OptionsSetting::Type() const
67{
68	return SETTING_TYPE_OPTIONS;
69}
70
71
72BVariant
73OptionsSetting::DefaultValue() const
74{
75	SettingsOption* option = DefaultOption();
76	return option != NULL
77		? BVariant(option->ID(), B_VARIANT_DONT_COPY_DATA) : BVariant();
78}
79
80
81// #pragma mark - RangeSetting
82
83
84setting_type
85RangeSetting::Type() const
86{
87	return SETTING_TYPE_RANGE;
88}
89
90
91// #pragma mark - RectSetting
92
93setting_type
94RectSetting::Type() const
95{
96	return SETTING_TYPE_RECT;
97}
98
99
100BVariant
101RectSetting::DefaultValue() const
102{
103	return DefaultRectValue();
104}
105
106
107// #pragma mark - AbstractSetting
108
109
110AbstractSetting::AbstractSetting(const BString& id, const BString& name)
111	:
112	fID(id),
113	fName(name)
114{
115}
116
117
118const char*
119AbstractSetting::ID() const
120{
121	return fID;
122}
123
124
125const char*
126AbstractSetting::Name() const
127{
128	return fName;
129}
130
131
132// #pragma mark - BoolSettingImpl
133
134
135BoolSettingImpl::BoolSettingImpl(const BString& id, const BString& name,
136	bool defaultValue)
137	:
138	AbstractSetting(id, name),
139	fDefaultValue(defaultValue)
140{
141}
142
143
144bool
145BoolSettingImpl::DefaultBoolValue() const
146{
147	return fDefaultValue;
148}
149
150
151// #pragma mark - FloatSettingImpl
152
153
154FloatSettingImpl::FloatSettingImpl(const BString& id, const BString& name,
155	float defaultValue)
156	:
157	AbstractSetting(id, name),
158	fDefaultValue(defaultValue)
159{
160}
161
162
163float
164FloatSettingImpl::DefaultFloatValue() const
165{
166	return fDefaultValue;
167}
168
169
170// #pragma mark - OptionsSettingImpl
171
172
173class OptionsSettingImpl::Option : public SettingsOption {
174public:
175	Option(const BString& id, const BString& name)
176	{
177	}
178
179	virtual const char* ID() const
180	{
181		return fID;
182	}
183
184	virtual const char* Name() const
185	{
186		return fName;
187	}
188
189private:
190	BString	fID;
191	BString	fName;
192};
193
194
195OptionsSettingImpl::OptionsSettingImpl(const BString& id, const BString& name)
196	:
197	AbstractSetting(id, name),
198	fDefaultOption(NULL)
199{
200}
201
202
203OptionsSettingImpl::~OptionsSettingImpl()
204{
205	SetDefaultOption(NULL);
206
207	for (int32 i = 0; SettingsOption* option = fOptions.ItemAt(i); i++)
208		option->ReleaseReference();
209}
210
211
212SettingsOption*
213OptionsSettingImpl::DefaultOption() const
214{
215	return fDefaultOption != NULL ? fDefaultOption : fOptions.ItemAt(0);
216}
217
218
219int32
220OptionsSettingImpl::CountOptions() const
221{
222	return fOptions.CountItems();
223}
224
225
226SettingsOption*
227OptionsSettingImpl::OptionAt(int32 index) const
228{
229	return fOptions.ItemAt(index);
230}
231
232
233SettingsOption*
234OptionsSettingImpl::OptionByID(const char* id) const
235{
236	for (int32 i = 0; SettingsOption* option = fOptions.ItemAt(i); i++) {
237		if (strcmp(option->ID(), id) == 0)
238			return option;
239	}
240
241	return NULL;
242}
243
244
245bool
246OptionsSettingImpl::AddOption(SettingsOption* option)
247{
248	if (!fOptions.AddItem(option))
249		return false;
250
251	option->AcquireReference();
252	return true;
253}
254
255
256bool
257OptionsSettingImpl::AddOption(const BString& id, const BString& name)
258{
259	Option* option = new(std::nothrow) Option(id, name);
260	if (option == NULL)
261		return false;
262	BReference<Option> optionReference(option, true);
263
264	return AddOption(option);
265}
266
267
268void
269OptionsSettingImpl::SetDefaultOption(SettingsOption* option)
270{
271	if (option == fDefaultOption)
272		return;
273
274	if (fDefaultOption != NULL)
275		fDefaultOption->ReleaseReference();
276
277	fDefaultOption = option;
278
279	if (fDefaultOption != NULL)
280		fDefaultOption->AcquireReference();
281}
282
283
284// #pragma mark - RangeSettingImpl
285
286
287RangeSettingImpl::RangeSettingImpl(const BString& id, const BString& name,
288	const BVariant& lowerBound, const BVariant& upperBound,
289	const BVariant& defaultValue)
290	:
291	AbstractSetting(id, name),
292	fLowerBound(lowerBound),
293	fUpperBound(upperBound),
294	fDefaultValue(defaultValue)
295{
296}
297
298
299BVariant
300RangeSettingImpl::DefaultValue() const
301{
302	return fDefaultValue;
303}
304
305
306BVariant
307RangeSettingImpl::LowerBound() const
308{
309	return fLowerBound;
310}
311
312
313BVariant
314RangeSettingImpl::UpperBound() const
315{
316	return fUpperBound;
317}
318
319
320// #pragma mark - RectSettingImpl
321
322
323RectSettingImpl::RectSettingImpl(const BString& id, const BString& name,
324	const BRect& defaultValue)
325	:
326	AbstractSetting(id, name),
327	fDefaultValue(defaultValue)
328{
329}
330
331
332BRect
333RectSettingImpl::DefaultRectValue() const
334{
335	return fDefaultValue;
336}
337