00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef TA_DESCRIPTORITEMLIST_H
00013 #define TA_DESCRIPTORITEMLIST_H
00014
00015 #ifndef TA_DESCRIPTORITEM_H
00016 #include "DescriptorItem.h"
00017 #endif // TA_DESCRIPTORITEM_H
00018
00019 #ifndef TA_DESCRIPTORLIST_H
00020 #include "DescriptorList.h"
00021 #endif // TA_DESCRIPTORLIST_H
00022
00023 namespace TA
00024 {
00025
00026 class TACOMMON_CLASS DescriptorItemList : public DescriptorItem
00027 {
00028 public:
00029 DescriptorItemList() : DescriptorItem() { }
00030 virtual ~DescriptorItemList() { Finalise(); }
00031
00032 void Initialise(const char* szName, const char* szDescription)
00033 {
00034 DescriptorItem::Initialise(szName, szDescription);
00035 }
00036
00037 void Finalise()
00038 {
00039 DescriptorItem::Finalise();
00040 }
00041
00042 static DescriptorItemList& GetFromDescItem(DescriptorItem* pItem)
00043 {
00044 TA_ASSERT(pItem->GetTypeID() == GetStaticTypeID());
00045 return *(DescriptorItemList*)pItem;
00046 }
00047
00048
00049 virtual int GetListSize(Descriptor* pDescriptor) = 0;
00050 virtual Descriptor& GetListItem(Descriptor* pDescriptor, int nIndex) = 0;
00051 virtual Descriptor* AppendListItem(Descriptor* pDescriptor) = 0;
00052
00053 virtual String GetValueAsString(Descriptor* pDescriptor) const { return ""; };
00054 virtual String GetDisplayString(Descriptor* pDescriptor) const { return GetName(); };
00055 virtual void SetValueFromString(const char* szString, Descriptor* pDescriptor) {}
00056 virtual void SetToDefaultValue(Descriptor* pDescriptor) {}
00057 virtual void Read(AmlReader& amlReader, Descriptor* pDescriptor);
00058 virtual u32 GetTypeID() const { return s_nClassID; }
00059 static u32 GetStaticTypeID() { return s_nClassID; }
00060
00061 private:
00062
00063 static u32 s_nClassID;
00064 };
00065
00066 template <class Type>
00067 class DescriptorItemListOfType : public DescriptorItemList
00068 {
00069 public:
00070 enum { INVALID_DATA_OFFSET = 0xFFFFFFFF };
00071
00072 DescriptorItemListOfType() : DescriptorItemList()
00073 {
00074 m_nOffset = INVALID_DATA_OFFSET;
00075 }
00076 virtual ~DescriptorItemListOfType() { Finalise(); }
00077
00078 void Initialise(
00079 const Char* szName,
00080 Descriptor* pDescriptor,
00081 DescriptorList<Type>& list,
00082 const Char* szDescription)
00083 {
00084 DescriptorItemList::Initialise(szName, szDescription);
00085 m_nOffset = (u32)&list - (u32)pDescriptor;
00086 }
00087
00088 void Finalise()
00089 {
00090 m_nOffset = INVALID_DATA_OFFSET;
00091 DescriptorItemList::Finalise();
00092 }
00093
00094 virtual int GetListSize(Descriptor* pDescriptor)
00095 {
00096 return GetList(pDescriptor).GetSize();
00097 }
00098
00099 virtual Descriptor& GetListItem(Descriptor* pDescriptor, int nIndex)
00100 {
00101 return GetList(pDescriptor)[nIndex];
00102 }
00103
00104 virtual Descriptor* AppendListItem(Descriptor* pDescriptor)
00105 {
00106 return &GetList(pDescriptor).Append();
00107 }
00108
00109
00110
00111 private:
00112 u32 m_nOffset;
00113
00114 static u32 s_nClassID;
00115
00116 DescriptorList<Type>& GetList(Descriptor* pDescriptor) const
00117 {
00118 TA_ASSERT (m_nOffset != INVALID_DATA_OFFSET);
00119 return *(DescriptorList<Type>*)((u32)pDescriptor + m_nOffset);
00120 }
00121 };
00122
00123 };
00124
00125 #endif // TA_DESCRIPTORITEMLIST_H
© Copyright 2004-2006 TRUE AXIS PTY LTD Australia. All rights reserved.