Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifndef TPROPERTY_INCLUDED
Toshihiro Shimizu 890ddd
#define TPROPERTY_INCLUDED
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "tconvert.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#undef DVAPI
Toshihiro Shimizu 890ddd
#undef DVVAR
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef TNZCORE_EXPORTS
Toshihiro Shimizu 890ddd
#define DVAPI DV_EXPORT_API
Toshihiro Shimizu 890ddd
#define DVVAR DV_EXPORT_VAR
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
#define DVAPI DV_IMPORT_API
Toshihiro Shimizu 890ddd
#define DVVAR DV_IMPORT_VAR
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
#pragma warning(push)
Toshihiro Shimizu 890ddd
#pragma warning(disable : 4251)
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <class t=""></class>
Toshihiro Shimizu 890ddd
class TRangeProperty;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
typedef TRangeProperty<int> TIntProperty;</int>
Toshihiro Shimizu 890ddd
typedef TRangeProperty<double> TDoubleProperty;</double>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class DVAPI TBoolProperty;
Toshihiro Shimizu 890ddd
class DVAPI TStringProperty;
Toshihiro Shimizu 890ddd
class DVAPI TEnumProperty;
Toshihiro Shimizu 890ddd
class DVAPI TDoublePairProperty;
Toshihiro Shimizu 890ddd
class DVAPI TIntPairProperty;
Toshihiro Shimizu 890ddd
class DVAPI TStyleIndexProperty;
Toshihiro Shimizu 890ddd
class DVAPI TPointerProperty;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class TIStream;
Toshihiro Shimizu 890ddd
class TOStream;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class DVAPI TProperty
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	class Visitor
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
	public:
Toshihiro Shimizu 890ddd
		virtual void visit(TDoubleProperty *p) = 0;
Toshihiro Shimizu 890ddd
		virtual void visit(TIntProperty *p) = 0;
Toshihiro Shimizu 890ddd
		virtual void visit(TBoolProperty *p) = 0;
Toshihiro Shimizu 890ddd
		virtual void visit(TStringProperty *p) = 0;
Toshihiro Shimizu 890ddd
		virtual void visit(TEnumProperty *p) = 0;
Toshihiro Shimizu 890ddd
		virtual void visit(TDoublePairProperty *p) = 0;
Toshihiro Shimizu 890ddd
		virtual void visit(TIntPairProperty *p) = 0;
Toshihiro Shimizu 890ddd
		virtual void visit(TStyleIndexProperty *p) = 0;
Toshihiro Shimizu 890ddd
		virtual void visit(TPointerProperty *p) = 0;
Toshihiro Shimizu 890ddd
		virtual ~Visitor() {}
Toshihiro Shimizu 890ddd
	};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	class Listener
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
	public:
Toshihiro Shimizu 890ddd
		virtual void onPropertyChanged() = 0;
Toshihiro Shimizu 890ddd
		virtual ~Listener() {}
Toshihiro Shimizu 890ddd
	};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// eccezioni
Toshihiro Shimizu 890ddd
	class TypeError
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
	};
Toshihiro Shimizu 890ddd
	class RangeError
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
	};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TProperty(string name)
Toshihiro Shimizu 890ddd
		: m_name(name)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		m_qstringName = QString::fromStdString(name);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	virtual ~TProperty() {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	virtual TProperty *clone() const = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// Used only for translation in Qt
Toshihiro Shimizu 890ddd
	QString getQStringName() const { return m_qstringName; }
Toshihiro Shimizu 890ddd
	void setQStringName(const QString &str) { m_qstringName = str; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	string getName() const { return m_name; }
Toshihiro Shimizu 890ddd
	virtual string getValueAsString() = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	virtual void accept(Visitor &v) = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void addListener(Listener *listener);
Toshihiro Shimizu 890ddd
	void removeListener(Listener *listener);
Toshihiro Shimizu 890ddd
	void notifyListeners() const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	string getId() const { return m_id; }
Toshihiro Shimizu 890ddd
	void setId(string id) { m_id = id; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Toshihiro Shimizu 890ddd
	string m_name;
Toshihiro Shimizu 890ddd
	QString m_qstringName;
Toshihiro Shimizu 890ddd
	string m_id;
Toshihiro Shimizu 890ddd
	std::vector<listener *=""> m_listeners;</listener>
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <class t=""></class>
Toshihiro Shimizu 890ddd
class TRangeProperty : public TProperty
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	typedef std::pair<t, t=""> Range;</t,>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TRangeProperty(
Toshihiro Shimizu 890ddd
		string name,
Toshihiro Shimizu 890ddd
		T minValue, T maxValue,
Toshihiro Shimizu 890ddd
		T value, bool isMaxRangeLimited = true)
Toshihiro Shimizu 890ddd
		: TProperty(name), m_range(minValue, maxValue), m_value(minValue), m_isMaxRangeLimited(isMaxRangeLimited)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		setValue(value);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TProperty *clone() const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return new TRangeProperty<t>(*this);</t>
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	Range getRange() const { return m_range; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void setValue(T v, bool cropEnabled = false)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		if (cropEnabled && m_isMaxRangeLimited)
Toshihiro Shimizu 890ddd
			v = tcrop(v, m_range.first, m_range.second);
Toshihiro Shimizu 890ddd
		if (cropEnabled && !m_isMaxRangeLimited)
Toshihiro Shimizu 890ddd
			v = v < m_range.first ? m_range.first : v;
Toshihiro Shimizu 890ddd
		if (v < m_range.first || (v > m_range.second && m_isMaxRangeLimited))
Toshihiro Shimizu 890ddd
			throw RangeError();
Toshihiro Shimizu 890ddd
		m_value = v;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	T getValue() const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return m_value;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	string getValueAsString()
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return toString(m_value);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void accept(Visitor &v) { v.visit(this); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool isMaxRangeLimited() const { return m_isMaxRangeLimited; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Toshihiro Shimizu 890ddd
	Range m_range;
Toshihiro Shimizu 890ddd
	T m_value;
Toshihiro Shimizu 890ddd
	bool m_isMaxRangeLimited;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
template class DVAPI TRangeProperty<int>;</int>
Toshihiro Shimizu 890ddd
template class DVAPI TRangeProperty<double>;</double>
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
//---------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class TDoublePairProperty : public TProperty
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	typedef std::pair<double, double=""> Range;</double,>
Toshihiro Shimizu 890ddd
	typedef std::pair<double, double=""> Value;</double,>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TDoublePairProperty(
Toshihiro Shimizu 890ddd
		string name,
Toshihiro Shimizu 890ddd
		double minValue, double maxValue,
Toshihiro Shimizu 890ddd
		double v0, double v1,
Toshihiro Shimizu 890ddd
		bool isMaxRangeLimited = true)
Toshihiro Shimizu 890ddd
		: TProperty(name), m_range(Range(minValue, maxValue)), m_isMaxRangeLimited(isMaxRangeLimited)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		setValue(Value(v0, v1));
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TProperty *clone() const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return new TDoublePairProperty(*this);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	Range getRange() const { return m_range; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool isMaxRangeLimited() const { return m_isMaxRangeLimited; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void setValue(const Value &value)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		if (value.first < m_range.first || (m_isMaxRangeLimited && value.first > m_range.second) ||
Toshihiro Shimizu 890ddd
			value.second < m_range.first || (m_isMaxRangeLimited && value.second > m_range.second))
Toshihiro Shimizu 890ddd
			throw RangeError();
Toshihiro Shimizu 890ddd
		m_value = value;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	Value getValue() const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return m_value;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	string getValueAsString()
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return toString(m_value.first) + "," + toString(m_value.second);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	void accept(Visitor &v) { v.visit(this); };
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Toshihiro Shimizu 890ddd
	Range m_range;
Toshihiro Shimizu 890ddd
	Value m_value;
Toshihiro Shimizu 890ddd
	bool m_isMaxRangeLimited;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class TIntPairProperty : public TProperty
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	typedef std::pair<int, int=""> Range;</int,>
Toshihiro Shimizu 890ddd
	typedef std::pair<int, int=""> Value;</int,>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TIntPairProperty(
Toshihiro Shimizu 890ddd
		string name,
Toshihiro Shimizu 890ddd
		int minValue, int maxValue,
Toshihiro Shimizu 890ddd
		int v0, int v1,
Toshihiro Shimizu 890ddd
		bool isMaxRangeLimited = true)
Toshihiro Shimizu 890ddd
		: TProperty(name), m_range(minValue, maxValue), m_isMaxRangeLimited(isMaxRangeLimited)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		setValue(Value(v0, v1));
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TProperty *clone() const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return new TIntPairProperty(*this);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	Range getRange() const { return m_range; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool isMaxRangeLimited() const { return m_isMaxRangeLimited; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void setValue(const Value &value)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		if (value.first < m_range.first || (m_isMaxRangeLimited && value.first > m_range.second) ||
Toshihiro Shimizu 890ddd
			value.second < m_range.first || (m_isMaxRangeLimited && value.second > m_range.second))
Toshihiro Shimizu 890ddd
			throw RangeError();
Toshihiro Shimizu 890ddd
		m_value = value;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	Value getValue() const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return m_value;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	string getValueAsString()
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return toString(m_value.first) + "," + toString(m_value.second);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	void accept(Visitor &v) { v.visit(this); };
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Toshihiro Shimizu 890ddd
	Range m_range;
Toshihiro Shimizu 890ddd
	Value m_value;
Toshihiro Shimizu 890ddd
	bool m_isMaxRangeLimited;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class DVAPI TBoolProperty : public TProperty
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	TBoolProperty(string name, bool value)
Toshihiro Shimizu 890ddd
		: TProperty(name), m_value(value)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TProperty *clone() const { return new TBoolProperty(*this); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void setValue(bool v) { m_value = v; }
Toshihiro Shimizu 890ddd
	bool getValue() const { return m_value; }
Toshihiro Shimizu 890ddd
	string getValueAsString()
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return toString(m_value);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	void accept(Visitor &v) { v.visit(this); };
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Toshihiro Shimizu 890ddd
	bool m_value;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class DVAPI TStringProperty : public TProperty
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	TStringProperty(string name, wstring value)
Toshihiro Shimizu 890ddd
		: TProperty(name), m_value(value)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TProperty *clone() const { return new TStringProperty(*this); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void setValue(wstring v) { m_value = v; }
Toshihiro Shimizu 890ddd
	wstring getValue() const { return m_value; }
Toshihiro Shimizu 890ddd
	string getValueAsString()
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return toString(m_value);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	void accept(Visitor &v) { v.visit(this); };
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Toshihiro Shimizu 890ddd
	wstring m_value;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class DVAPI TStyleIndexProperty : public TProperty
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	TStyleIndexProperty(string name, wstring value)
Toshihiro Shimizu 890ddd
		: TProperty(name), m_value(value)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TProperty *clone() const { return new TStyleIndexProperty(*this); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void setValue(wstring v) { m_value = v; }
Toshihiro Shimizu 890ddd
	wstring getValue() const { return m_value; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	string getValueAsString()
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return toString(m_value);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void accept(Visitor &v) { v.visit(this); };
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Toshihiro Shimizu 890ddd
	wstring m_value;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class DVAPI TPointerProperty : public TProperty
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	TPointerProperty(string name, void *value)
Toshihiro Shimizu 890ddd
		: TProperty(name), m_value(value)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TProperty *clone() const { return new TPointerProperty(*this); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void setValue(void *v) { m_value = v; }
Toshihiro Shimizu 890ddd
	void *getValue() const { return m_value; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	string getValueAsString()
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return toString((unsigned long long)m_value);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void accept(Visitor &v) { v.visit(this); };
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Toshihiro Shimizu 890ddd
	void *m_value;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class DVAPI TEnumProperty : public TProperty
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	typedef std::vector<wstring> Range;</wstring>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TEnumProperty(const string &name)
Toshihiro Shimizu 890ddd
		: TProperty(name), m_index(-1) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TEnumProperty(const string &name, const Range &range, const wstring &v)
Toshihiro Shimizu 890ddd
		: TProperty(name), m_range(range), m_index(indexOf(v))
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		if (m_index < 0)
Toshihiro Shimizu 890ddd
			throw RangeError();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TEnumProperty(const string &name,
Toshihiro Shimizu 890ddd
				  Range::const_iterator i0, Range::const_iterator i1,
Toshihiro Shimizu 890ddd
				  const wstring &v)
Toshihiro Shimizu 890ddd
		: TProperty(name), m_range(i0, i1), m_index(indexOf(v))
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		if (m_index < 0)
Toshihiro Shimizu 890ddd
			throw RangeError();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TProperty *clone() const { return new TEnumProperty(*this); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int indexOf(const wstring &value)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		Range::const_iterator it = std::find(m_range.begin(), m_range.end(), value);
Toshihiro Shimizu 890ddd
		return (it == m_range.end()) ? -1 : it - m_range.begin();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool isValue(const wstring &value)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		bool ret = std::find(m_range.begin(), m_range.end(), value) != m_range.end();
Toshihiro Shimizu 890ddd
		return ret;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void addValue(wstring value)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		if (m_index == -1)
Toshihiro Shimizu 890ddd
			m_index = 0;
Toshihiro Shimizu 890ddd
		m_range.push_back(value);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void deleteAllValues()
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		m_range.clear();
Toshihiro Shimizu 890ddd
		m_index = -1;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void setIndex(int index)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		if (index < 0 || index >= (int)m_range.size())
Toshihiro Shimizu 890ddd
			throw RangeError();
Toshihiro Shimizu 890ddd
		m_index = index;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void setValue(const wstring &value)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		int idx = indexOf(value);
Toshihiro Shimizu 890ddd
		if (idx < 0)
Toshihiro Shimizu 890ddd
			throw RangeError();
Toshihiro Shimizu 890ddd
		m_index = idx;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	const Range &getRange() const { return m_range; }
Toshihiro Shimizu 890ddd
	wstring getValue() const { return (m_index < 0) ? L"" : m_range[m_index]; }
Toshihiro Shimizu 890ddd
	string getValueAsString() { return toString(m_range[m_index]); }
Toshihiro Shimizu 890ddd
	int getIndex() const { return m_index; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void accept(Visitor &v) { v.visit(this); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	static void enableRangeSaving(bool on);
Toshihiro Shimizu 890ddd
	static bool isRangeSavingEnabled();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Toshihiro Shimizu 890ddd
	Range m_range;
Toshihiro Shimizu 890ddd
	int m_index;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class DVAPI TPropertyGroup
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	typedef std::vector<std::pair<tproperty *,="" bool="">> PropertyVector;</std::pair<tproperty>
Toshihiro Shimizu 890ddd
	typedef std::map<string, *="" tproperty=""> PropertyTable;</string,>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// exception
Toshihiro Shimizu 890ddd
	class PropertyNotFoundError
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
	};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPropertyGroup();
Toshihiro Shimizu 890ddd
	virtual ~TPropertyGroup();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	virtual TPropertyGroup *clone() const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//! get ownership
Toshihiro Shimizu 890ddd
	void add(TProperty *p);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//! don't get ownership
Toshihiro Shimizu 890ddd
	void bind(TProperty &p);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//! returns 0 if the property doesn't exist
Toshihiro Shimizu 890ddd
	TProperty *getProperty(string name);
Toshihiro Shimizu 890ddd
	TProperty *getProperty(int i) { return (i >= (int)m_properties.size()) ? 0 : m_properties[i].first; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void setProperties(TPropertyGroup *g);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void accept(TProperty::Visitor &v);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int getPropertyCount() const { return (int)m_properties.size(); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void loadData(TIStream &is);
Toshihiro Shimizu 890ddd
	void saveData(TOStream &os) const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void clear();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Toshihiro Shimizu 890ddd
	PropertyTable m_table;
Toshihiro Shimizu 890ddd
	PropertyVector m_properties;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Toshihiro Shimizu 890ddd
	// not implemented
Toshihiro Shimizu 890ddd
	TPropertyGroup(const TPropertyGroup &);
Toshihiro Shimizu 890ddd
	TPropertyGroup &operator=(const TPropertyGroup &);
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
#pragma warning(pop)
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#endif