1/*
2 * Copyright 2013, 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#ifndef SETTINGS_H
7#define SETTINGS_H
8
9
10#include <Locker.h>
11#include <Message.h>
12
13#include <ObjectList.h>
14#include <Referenceable.h>
15#include <Variant.h>
16
17#include "Setting.h"
18
19
20class SettingsDescription;
21
22
23class Settings : public BReferenceable {
24public:
25	class Listener;
26
27public:
28								Settings(SettingsDescription* description);
29	virtual						~Settings();
30
31			status_t			Init();
32
33			bool				Lock()		{ return fLock.Lock(); }
34			void				Unlock()	{ fLock.Unlock(); }
35
36			SettingsDescription* Description() const	{ return fDescription; }
37			const BMessage&		Message() const			{ return fValues; }
38
39			BVariant			Value(Setting* setting) const;
40			BVariant			Value(const char* settingID) const;
41			bool				SetValue(Setting* setting,
42									const BVariant& value);
43
44			bool				RestoreValues(const BMessage& message);
45
46			bool				BoolValue(BoolSetting* setting) const
47									{ return Value(setting).ToBool(); }
48			SettingsOption*		OptionValue(OptionsSetting* setting) const;
49			BVariant			RangeValue(RangeSetting* setting) const
50									{ return Value(setting); }
51
52			bool				AddListener(Listener* listener);
53			void				RemoveListener(Listener* listener);
54
55private:
56			typedef BObjectList<Listener> ListenerList;
57
58private:
59	mutable	BLocker				fLock;
60			SettingsDescription* fDescription;
61			BMessage			fValues;
62			ListenerList		fListeners;
63};
64
65
66class Settings::Listener {
67public:
68	virtual						~Listener();
69
70	virtual	void				SettingValueChanged(Setting* setting) = 0;
71};
72
73
74#endif	// SETTINGS_H
75