1/*
2 * Copyright 2013-2016, Rene Gollent, rene@gollent.com.
3 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
4 * Distributed under the terms of the MIT License.
5 */
6
7
8#include "Setting.h"
9
10#include <new>
11
12
13// #pragma mark - Setting
14
15
16Setting::~Setting()
17{
18}
19
20
21// #pragma mark - BoolSetting
22
23
24setting_type
25BoolSetting::Type() const
26{
27	return SETTING_TYPE_BOOL;
28}
29
30
31BVariant
32BoolSetting::DefaultValue() const
33{
34	return DefaultBoolValue();
35}
36
37
38// #pragma mark - FloatSetting
39
40
41setting_type
42FloatSetting::Type() const
43{
44	return SETTING_TYPE_FLOAT;
45}
46
47
48BVariant
49FloatSetting::DefaultValue() const
50{
51	return DefaultFloatValue();
52}
53
54
55// #pragma mark - SettingsOption
56
57
58SettingsOption::~SettingsOption()
59{
60}
61
62
63// #pragma mark - OptionsSetting
64
65
66setting_type
67OptionsSetting::Type() const
68{
69	return SETTING_TYPE_OPTIONS;
70}
71
72
73BVariant
74OptionsSetting::DefaultValue() const
75{
76	SettingsOption* option = DefaultOption();
77	return option != NULL
78		? BVariant(option->ID(), B_VARIANT_DONT_COPY_DATA) : BVariant();
79}
80
81
82// #pragma mark - BoundedSetting
83
84
85setting_type
86BoundedSetting::Type() const
87{
88	return SETTING_TYPE_BOUNDED;
89}
90
91
92// #pragma mark - RangeSetting
93
94
95setting_type
96RangeSetting::Type() const
97{
98	return SETTING_TYPE_RANGE;
99}
100
101
102// #pragma mark - RectSetting
103
104setting_type
105RectSetting::Type() const
106{
107	return SETTING_TYPE_RECT;
108}
109
110
111BVariant
112RectSetting::DefaultValue() const
113{
114	return DefaultRectValue();
115}
116
117
118// #pragma mark - StringSetting
119
120
121setting_type
122StringSetting::Type() const
123{
124	return SETTING_TYPE_STRING;
125}
126
127
128BVariant
129StringSetting::DefaultValue() const
130{
131	return DefaultStringValue().String();
132}
133
134
135// #pragma mark - AbstractSetting
136
137
138AbstractSetting::AbstractSetting(const BString& id, const BString& name)
139	:
140	fID(id),
141	fName(name)
142{
143}
144
145
146const char*
147AbstractSetting::ID() const
148{
149	return fID;
150}
151
152
153const char*
154AbstractSetting::Name() const
155{
156	return fName;
157}
158
159
160// #pragma mark - BoolSettingImpl
161
162
163BoolSettingImpl::BoolSettingImpl(const BString& id, const BString& name,
164	bool defaultValue)
165	:
166	AbstractSetting(id, name),
167	fDefaultValue(defaultValue)
168{
169}
170
171
172bool
173BoolSettingImpl::DefaultBoolValue() const
174{
175	return fDefaultValue;
176}
177
178
179// #pragma mark - FloatSettingImpl
180
181
182FloatSettingImpl::FloatSettingImpl(const BString& id, const BString& name,
183	float defaultValue)
184	:
185	AbstractSetting(id, name),
186	fDefaultValue(defaultValue)
187{
188}
189
190
191float
192FloatSettingImpl::DefaultFloatValue() const
193{
194	return fDefaultValue;
195}
196
197
198// #pragma mark - OptionsSettingImpl
199
200
201class OptionsSettingImpl::Option : public SettingsOption {
202public:
203	Option(const BString& id, const BString& name)
204	{
205	}
206
207	virtual const char* ID() const
208	{
209		return fID;
210	}
211
212	virtual const char* Name() const
213	{
214		return fName;
215	}
216
217private:
218	BString	fID;
219	BString	fName;
220};
221
222
223OptionsSettingImpl::OptionsSettingImpl(const BString& id, const BString& name)
224	:
225	AbstractSetting(id, name),
226	fDefaultOption(NULL)
227{
228}
229
230
231OptionsSettingImpl::~OptionsSettingImpl()
232{
233	SetDefaultOption(NULL);
234
235	for (int32 i = 0; SettingsOption* option = fOptions.ItemAt(i); i++)
236		option->ReleaseReference();
237}
238
239
240SettingsOption*
241OptionsSettingImpl::DefaultOption() const
242{
243	return fDefaultOption != NULL ? fDefaultOption : fOptions.ItemAt(0);
244}
245
246
247int32
248OptionsSettingImpl::CountOptions() const
249{
250	return fOptions.CountItems();
251}
252
253
254SettingsOption*
255OptionsSettingImpl::OptionAt(int32 index) const
256{
257	return fOptions.ItemAt(index);
258}
259
260
261SettingsOption*
262OptionsSettingImpl::OptionByID(const char* id) const
263{
264	for (int32 i = 0; SettingsOption* option = fOptions.ItemAt(i); i++) {
265		if (strcmp(option->ID(), id) == 0)
266			return option;
267	}
268
269	return NULL;
270}
271
272
273bool
274OptionsSettingImpl::AddOption(SettingsOption* option)
275{
276	if (!fOptions.AddItem(option))
277		return false;
278
279	option->AcquireReference();
280	return true;
281}
282
283
284bool
285OptionsSettingImpl::AddOption(const BString& id, const BString& name)
286{
287	Option* option = new(std::nothrow) Option(id, name);
288	if (option == NULL)
289		return false;
290	BReference<Option> optionReference(option, true);
291
292	return AddOption(option);
293}
294
295
296void
297OptionsSettingImpl::SetDefaultOption(SettingsOption* option)
298{
299	if (option == fDefaultOption)
300		return;
301
302	if (fDefaultOption != NULL)
303		fDefaultOption->ReleaseReference();
304
305	fDefaultOption = option;
306
307	if (fDefaultOption != NULL)
308		fDefaultOption->AcquireReference();
309}
310
311
312// #pragma mark - RangeSettingImpl
313
314
315BoundedSettingImpl::BoundedSettingImpl(const BString& id, const BString& name,
316	const BVariant& lowerBound, const BVariant& upperBound,
317	const BVariant& defaultValue)
318	:
319	AbstractSetting(id, name),
320	fLowerBound(lowerBound),
321	fUpperBound(upperBound),
322	fDefaultValue(defaultValue)
323{
324}
325
326
327BVariant
328BoundedSettingImpl::DefaultValue() const
329{
330	return fDefaultValue;
331}
332
333
334BVariant
335BoundedSettingImpl::LowerBound() const
336{
337	return fLowerBound;
338}
339
340
341BVariant
342BoundedSettingImpl::UpperBound() const
343{
344	return fUpperBound;
345}
346
347
348// #pragma mark - RangeSettingImpl
349
350
351RangeSettingImpl::RangeSettingImpl(const BString& id, const BString& name,
352	const BVariant& lowerBound, const BVariant& upperBound,
353	const BVariant& lowerValue, const BVariant& upperValue)
354	:
355	AbstractSetting(id, name),
356	fLowerBound(lowerBound),
357	fUpperBound(upperBound),
358	fLowerValue(lowerValue),
359	fUpperValue(upperValue)
360{
361}
362
363
364BVariant
365RangeSettingImpl::DefaultValue() const
366{
367	// this one doesn't really make sense for RangeSetting since it
368	// describes a pair of values, which BVariant can't readily
369	// represent.
370	return BVariant();
371}
372
373
374BVariant
375RangeSettingImpl::LowerBound() const
376{
377	return fLowerBound;
378}
379
380
381BVariant
382RangeSettingImpl::UpperBound() const
383{
384	return fUpperBound;
385}
386
387
388BVariant
389RangeSettingImpl::LowerValue() const
390{
391	return fLowerValue;
392}
393
394
395BVariant
396RangeSettingImpl::UpperValue() const
397{
398	return fUpperValue;
399}
400
401
402// #pragma mark - RectSettingImpl
403
404
405RectSettingImpl::RectSettingImpl(const BString& id, const BString& name,
406	const BRect& defaultValue)
407	:
408	AbstractSetting(id, name),
409	fDefaultValue(defaultValue)
410{
411}
412
413
414BRect
415RectSettingImpl::DefaultRectValue() const
416{
417	return fDefaultValue;
418}
419
420
421// #pragma mark - StringSettingImpl
422
423
424StringSettingImpl::StringSettingImpl(const BString& id, const BString& name,
425	const BString& defaultValue)
426	:
427	AbstractSetting(id, name),
428	fDefaultValue(defaultValue)
429{
430}
431
432
433const BString&
434StringSettingImpl::DefaultStringValue() const
435{
436	return fDefaultValue;
437}
438