Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #pragma once
00019
00020 #ifndef __OpenKarto_Parameter_h__
00021 #define __OpenKarto_Parameter_h__
00022
00023 #include <OpenKarto/String.h>
00024 #include <OpenKarto/Geometry.h>
00025 #include <OpenKarto/Event.h>
00026 #include <OpenKarto/SmartPointer.h>
00027 #include <OpenKarto/Meta.h>
00028
00029 namespace karto
00030 {
00031
00033
00034
00038
00043 enum ParameterFlags
00044 {
00048 ParameterFlag_Read = 0x01,
00052 ParameterFlag_Write = 0x02,
00056 ParameterFlag_Hidden = 0x08,
00060 ParameterFlag_System = 0x10
00061 };
00062
00066
00071 class KARTO_EXPORT ParameterDescription : public Referenced
00072 {
00073 public:
00080 ParameterDescription(const karto::String& rName, const karto::String& rDisplayName = "", const karto::String& rDescription = "");
00081 virtual ~ParameterDescription();
00082
00083 public:
00088 inline const karto::String& GetName() const
00089 {
00090 return m_Name;
00091 }
00092
00097 inline const karto::String& GetDisplayName() const
00098 {
00099 return m_DisplayName;
00100 }
00101
00106 inline const karto::String& GetDescription() const
00107 {
00108 return m_Description;
00109 }
00110
00115 inline kt_int32s GetFlags() const
00116 {
00117 return m_Flags;
00118 }
00119
00124 inline void SetFlags(kt_int32s flags)
00125 {
00126 m_Flags = flags;
00127 }
00128
00134 const karto::String& GetFieldName(kt_int32u index) const
00135 {
00136 if (index >= 4)
00137 {
00138 assert(index < 4);
00139 throw karto::Exception("ParameterDescription::GetFieldName() - Invalid argument, index must be [0;3]");
00140 }
00141
00142 return m_FieldNames[index];
00143 }
00144
00152 void SetFieldNames(const karto::String& rX = "X", const karto::String& rY = "Y", const karto::String& rZ = "Z", const karto::String& rW = "W")
00153 {
00154 m_FieldNames[0] = rX;
00155 m_FieldNames[1] = rY;
00156 m_FieldNames[2] = rZ;
00157 m_FieldNames[3] = rW;
00158 }
00159
00164 kt_int32s GetNumberOfDecimalPlaces() const
00165 {
00166 return m_nDecimalPlaces;
00167 }
00168
00173 void SetNumberOfDecimalPlaces(kt_int32s decimalPlaces)
00174 {
00175 m_nDecimalPlaces = decimalPlaces;
00176 }
00177
00178 private:
00182 karto::String m_Name;
00183
00187 karto::String m_DisplayName;
00188
00192 karto::String m_Description;
00193
00198 karto::String m_FieldNames[4];
00199
00203 kt_int32s m_Flags;
00204
00208 kt_int32s m_nDecimalPlaces;
00209 };
00210
00214
00215 class ParameterSet;
00216
00220 class KARTO_EXPORT AbstractParameter : public Referenced
00221 {
00222 KARTO_RTTI();
00223
00224 public:
00230 AbstractParameter(ParameterDescription* pDescription, ParameterSet* pParameterSet = NULL);
00231
00232 protected:
00233
00237 virtual ~AbstractParameter();
00238
00239
00240 public:
00244 BasicEvent<EventArguments> Changed;
00245
00246 public:
00251 inline const karto::String& GetName() const
00252 {
00253 return m_pDescription->GetName();
00254 }
00255
00260 inline const karto::String& GetDisplayName() const
00261 {
00262 return m_pDescription->GetDisplayName();
00263 }
00264
00269 inline const karto::String& GetDescription() const
00270 {
00271 return m_pDescription->GetDescription();
00272 }
00273
00278 inline kt_int32s GetFlags() const
00279 {
00280 return m_pDescription->GetFlags();
00281 }
00282
00287 inline const ParameterDescription* GetParameterDescription() const
00288 {
00289 return m_pDescription;
00290 }
00291
00296 inline ParameterDescription* GetParameterDescription()
00297 {
00298 return m_pDescription;
00299 }
00300
00305 virtual const karto::String GetValueAsString() const = 0;
00306
00311 virtual void SetValueFromString(const karto::String& rStringValue) = 0;
00312
00316 virtual void SetToDefaultValue() = 0;
00317
00318 protected:
00322 virtual void InitializeParameters();
00323
00324 private:
00325
00326 AbstractParameter(const AbstractParameter&);
00327 const AbstractParameter& operator=(const AbstractParameter&);
00328
00329 private:
00330 karto::SmartPointer<ParameterDescription> m_pDescription;
00331 ParameterSet* m_pParameterSet;
00332 };
00333
00337 KARTO_TYPE(AbstractParameter);
00338
00342 typedef List<SmartPointer<AbstractParameter> > ParameterList;
00343
00347
00348 struct ParameterSetPrivate;
00349
00353 class KARTO_EXPORT ParameterSet : public Referenced
00354 {
00355 public:
00359 ParameterSet();
00360
00361 protected:
00362
00366 virtual ~ParameterSet();
00367
00368
00369 public:
00375 void AddParameter(AbstractParameter* pParameter);
00376
00381 void RemoveParameter(AbstractParameter* pParameter);
00382
00388 AbstractParameter* GetParameter(const karto::String& rParameterName) const;
00389
00395 AbstractParameter* GetParameter(const karto::String& rParameterName);
00396
00400 void Clear();
00401
00406 const ParameterList& GetParameters() const;
00407
00412 ParameterList& GetParameters();
00413
00414 private:
00415
00416 ParameterSet(const ParameterSet&);
00417 const ParameterSet& operator=(const ParameterSet&);
00418
00419 private:
00420 ParameterSetPrivate* m_pPrivate;
00421 };
00422
00426 typedef SmartPointer<ParameterSet> ParameterSetPtr;
00427
00431
00435 template<typename T>
00436 class Parameter : public AbstractParameter
00437 {
00438 KARTO_RTTI();
00439
00440 public:
00446 Parameter(ParameterDescription* pDescription, const T& rValue)
00447 : AbstractParameter(pDescription)
00448 , m_Value(rValue)
00449 {
00450 InitializeParameters();
00451 }
00452
00461 Parameter(ParameterSet* pParameterSet, const karto::String& rName, const karto::String& rDisplayName, const karto::String& rDescription, const T& rValue)
00462 : AbstractParameter(new ParameterDescription(rName, rDisplayName, rDescription), pParameterSet)
00463 , m_Value(rValue)
00464 {
00465 InitializeParameters();
00466 }
00467
00468 protected:
00469
00473 virtual ~Parameter()
00474 {
00475 }
00476
00477
00478 public:
00483 virtual const T& GetValue() const
00484 {
00485 return m_Value;
00486 }
00487
00492 virtual void SetValue(const T& rValue)
00493 {
00494 kt_bool changed = !CompareValue(rValue);
00495
00496 if (changed)
00497 {
00498 m_Value = rValue;
00499
00500 Changed.Notify(this, EventArguments::Empty());
00501 }
00502 }
00503
00508 virtual T& GetDefaultValue()
00509 {
00510 return m_DefaultValue;
00511 }
00512
00517 virtual void SetDefaultValue(const T& rValue)
00518 {
00519 m_DefaultValue = rValue;
00520 }
00521
00526 virtual const karto::String GetValueAsString() const
00527 {
00528 return karto::StringHelper::ToString(m_Value);
00529 }
00530
00535 virtual void SetValueFromString(const karto::String& rStringValue)
00536 {
00537 T value;
00538 if (karto::StringHelper::FromString(rStringValue, value))
00539 {
00540 SetValue(value);
00541 }
00542 }
00543
00547 virtual void SetToDefaultValue()
00548 {
00549 SetValue(m_DefaultValue);
00550 }
00551
00552 protected:
00556 virtual void InitializeParameters()
00557 {
00558 SetDefaultValue(GetValue());
00559 }
00560
00566 kt_bool CompareValue(const T& rValue)
00567 {
00568 return m_Value == rValue;
00569 }
00570
00571 private:
00572
00573 Parameter(const Parameter&);
00574 const Parameter& operator=(const Parameter&);
00575
00576 protected:
00580 T m_Value;
00581
00582 private:
00586 T m_DefaultValue;
00587 };
00588
00592 KARTO_TYPE(Parameter<kt_bool>);
00593
00597 KARTO_TYPE(Parameter<kt_char>);
00598
00602 KARTO_TYPE(Parameter<kt_int8s>);
00603
00607 KARTO_TYPE(Parameter<kt_int8u>);
00608
00612 KARTO_TYPE(Parameter<kt_int16s>);
00613
00617 KARTO_TYPE(Parameter<kt_int16u>);
00618
00622 KARTO_TYPE(Parameter<kt_int32s>);
00623
00627 KARTO_TYPE(Parameter<kt_int32u>);
00628
00632 KARTO_TYPE(Parameter<kt_int64s>);
00633
00637 KARTO_TYPE(Parameter<kt_int64u>);
00638
00642 KARTO_TYPE(Parameter<kt_float>);
00643
00647 KARTO_TYPE(Parameter<kt_double>);
00648
00652 KARTO_TYPE(Parameter<karto::String>);
00653
00657 KARTO_TYPE(Parameter<karto::Size2<kt_int32s> >);
00658
00662 KARTO_TYPE(Parameter<karto::Size2<kt_int32u> >);
00663
00667 KARTO_TYPE(Parameter<karto::Size2<kt_double> >);
00668
00672 KARTO_TYPE(Parameter<karto::Vector2i>);
00673
00677 KARTO_TYPE(Parameter<karto::Vector3i>);
00678
00682 KARTO_TYPE(Parameter<karto::Vector4i>);
00683
00687 KARTO_TYPE(Parameter<karto::Vector2<kt_int32u> >);
00688
00692 KARTO_TYPE(Parameter<karto::Vector3iu>);
00693
00697 KARTO_TYPE(Parameter<karto::Vector4iu>);
00698
00702 KARTO_TYPE(Parameter<karto::Vector2<kt_double> >);
00703
00707 KARTO_TYPE(Parameter<karto::Vector3d>);
00708
00712 KARTO_TYPE(Parameter<karto::Vector4d>);
00713
00717 KARTO_TYPE(Parameter<karto::Quaternion>);
00718
00722 KARTO_TYPE(Parameter<karto::Color>);
00723
00727 KARTO_TYPE(Parameter<karto::Pose2>);
00728
00732 KARTO_TYPE(Parameter<karto::Pose3>);
00733
00737 KARTO_TYPE(Parameter<karto::gps::PointGps>);
00738
00742
00743 struct ParameterEnumPrivate;
00744
00748 class KARTO_EXPORT ParameterEnum : public Parameter<kt_int64s>
00749 {
00750 KARTO_RTTI();
00751
00752 public:
00761 ParameterEnum(ParameterSet* pParameterSet, const karto::String& rName, const karto::String& rDisplayName, const karto::String& rDescription, kt_int64s value);
00762
00763 protected:
00764
00768 virtual ~ParameterEnum();
00769
00770
00771 public:
00777 virtual const karto::String GetValueAsString() const;
00778
00784 virtual void SetValueFromString(const karto::String& rStringValue);
00785
00786 public:
00792 void DefineEnumValue(const String& rName, kt_int64s value);
00793
00798 const EnumPairList GetEnumValues() const;
00799
00800 private:
00801 ParameterEnumPrivate* m_pPrivate;
00802 };
00803
00807 KARTO_TYPE(ParameterEnum);
00808
00810 }
00811
00812 #endif // __OpenKarto_Parameter_h__