00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef TA_DESCRIPTORITEMNUMERIC_H
00013 #define TA_DESCRIPTORITEMNUMERIC_H
00014
00015 #ifndef TA_DESCRIPTORITEM_H
00016 #include "DescriptorItem.h"
00017 #endif // TA_DESCRIPTORITEM_H
00018
00019 namespace TA
00020 {
00021
00022 template <class Type>
00023 class DescriptorItemNumericOfType;
00024
00025 #ifndef DOXYGEN
00026 typedef DescriptorItemNumericOfType<float> DescriptorItemNumericFloat;
00027 typedef DescriptorItemNumericOfType<int> DescriptorItemNumericInt;
00028 #endif // DOXYGEN
00029
00030 class TACOMMON_CLASS DescriptorItemNumeric : public DescriptorItem
00031 {
00032 public:
00033 DescriptorItemNumeric() : DescriptorItem() { }
00034 virtual ~DescriptorItemNumeric() { Finalise(); }
00035
00036 void Initialise(const char* szName, const char* szDescription)
00037 {
00038 DescriptorItem::Initialise(szName, szDescription);
00039 }
00040
00041 void Finalise()
00042 {
00043 DescriptorItem::Finalise();
00044 }
00045
00046 virtual u32 GetTypeID() const { return s_nClassID; }
00047 static u32 GetStaticTypeID() { return s_nClassID; }
00048
00049 private:
00050 static u32 s_nClassID;
00051 };
00052
00053 template <class Type>
00054 class DescriptorItemNumericOfType : public DescriptorItemNumeric
00055 {
00056 public:
00057 enum { INVALID_DATA_OFFSET = 0xFFFFFFFF };
00058 DescriptorItemNumericOfType() : DescriptorItemNumeric()
00059 {
00060 m_nDataOffset = INVALID_DATA_OFFSET;
00061 m_pSetValueCallBack = 0;
00062 m_pGetValueCallBack = 0;
00063 m_defaultValue = 0;
00064 m_minValue = 0;
00065 m_maxValue = 0;
00066 }
00067
00068 virtual ~DescriptorItemNumericOfType() { Finalise(); }
00069
00070 void Initialise(
00071 const Char* szName,
00072 Descriptor* pDescriptor,
00073 Type& var,
00074 Type defaultValue,
00075 Type min,
00076 Type max,
00077 const Char* szDescription)
00078 {
00079 Initialise(
00080 szName,
00081 0,
00082 0,
00083 defaultValue,
00084 min,
00085 max,
00086 szDescription);
00087 m_nDataOffset = (u32)&var - (u32)pDescriptor;
00088 }
00089
00090 void Initialise(
00091 const Char* szName,
00092 void (*SetVar)(Type, void* pData),
00093 Type (*GetVar)(void* pData),
00094 Type defaultValue,
00095 Type min,
00096 Type max,
00097 const Char* szDescription)
00098 {
00099 DescriptorItemNumeric::Initialise(szName, szDescription);
00100 m_defaultValue = defaultValue;
00101 m_minValue = min;
00102 m_maxValue = max;
00103
00104 m_pSetValueCallBack = SetVar;
00105 m_pGetValueCallBack = GetVar;
00106 }
00107
00108 void Finalise()
00109 {
00110 DescriptorItemNumeric::Finalise();
00111 m_nDataOffset = INVALID_DATA_OFFSET;
00112 m_pSetValueCallBack = 0;
00113 m_pGetValueCallBack = 0;
00114 m_defaultValue = 0;
00115 m_minValue = 0;
00116 m_maxValue = 0;
00117 }
00118
00119 virtual String GetValueAsString(Descriptor* pDescriptor) const
00120 {
00121 return String(GetValue(pDescriptor));
00122 }
00123 virtual String GetDisplayString(Descriptor* pDescriptor) const
00124 {
00125 String strDisplayString = GetName();
00126 strDisplayString += ": ";
00127 strDisplayString += GetValue(pDescriptor);
00128 return strDisplayString;
00129 }
00130 virtual void SetValueFromString(const char* szString, Descriptor* pDescriptor)
00131 {
00132 SetValue((Type)atof(szString), pDescriptor);
00133 }
00134 virtual void SetToDefaultValue(Descriptor* pDescriptor) { SetValue(m_defaultValue, pDescriptor); }
00135
00136 private:
00137 u32 m_nDataOffset;
00138 Type m_defaultValue;
00139 Type m_minValue;
00140 Type m_maxValue;
00141 void (*m_pSetValueCallBack)(Type, void* pData);
00142 Type (*m_pGetValueCallBack)(void* pData);
00143
00144 Type& GetValueRef(Descriptor* pDescriptor) const
00145 {
00146 return *(Type*)((u32)pDescriptor + m_nDataOffset);
00147 }
00148
00149 void SetValue(Type value, Descriptor* pDescriptor)
00150 {
00151 if (m_nDataOffset != INVALID_DATA_OFFSET)
00152 GetValueRef(pDescriptor) = value;
00153 else if (m_pSetValueCallBack)
00154 m_pSetValueCallBack(value, pDescriptor);
00155 }
00156 Type GetValue(Descriptor* pDescriptor) const
00157 {
00158 if (m_nDataOffset != INVALID_DATA_OFFSET)
00159 return GetValueRef(pDescriptor);
00160 else if (m_pGetValueCallBack)
00161 return m_pGetValueCallBack(pDescriptor);
00162 else
00163 return Type(0);
00164 }
00165 };
00166
00167 }
00168
00169 #include "DescriptorItemNumeric.inl"
00170
00171
00172 #endif // TA_DESCRIPTORITEMNUMERIC_H
© Copyright 2004-2006 TRUE AXIS PTY LTD Australia. All rights reserved.