You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
137 lines
4.5 KiB
137 lines
4.5 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
// |
|
//=============================================================================// |
|
|
|
#include "toolutils/attributeelementchoicelist.h" |
|
#include "datamodel/dmelement.h" |
|
|
|
|
|
typedef CUtlRBTree< CDmElement *, int > ElementDict_t; |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// returns the choice string that AddElementsRecursively would have returned |
|
//----------------------------------------------------------------------------- |
|
const char *GetChoiceString( CDmElement *pElement ) |
|
{ |
|
return pElement->GetName(); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Recursively adds all elements referred to this element into the list of elements |
|
//----------------------------------------------------------------------------- |
|
void AddElementsRecursively_R( CDmElement *pElement, ElementChoiceList_t &list, ElementDict_t &dict, const char *pElementType ) |
|
{ |
|
if ( !pElement ) |
|
return; |
|
|
|
if ( dict.Find( pElement ) != dict.InvalidIndex() ) |
|
return; |
|
|
|
dict.Insert( pElement ); |
|
|
|
if ( pElement->IsA( pElementType ) ) |
|
{ |
|
int nIndex = list.AddToTail( ); |
|
ElementChoice_t &entry = list[nIndex]; |
|
entry.m_pValue = pElement; |
|
entry.m_pChoiceString = GetChoiceString( pElement ); |
|
} |
|
|
|
for ( CDmAttribute *pAttribute = pElement->FirstAttribute(); pAttribute; pAttribute = pAttribute->NextAttribute() ) |
|
{ |
|
char const *attributeName = pAttribute->GetName( ); |
|
DmAttributeType_t attrType = pAttribute->GetType( ); |
|
if ( attrType == AT_ELEMENT ) |
|
{ |
|
CDmElement *pChild = pElement->GetValueElement< CDmElement >( attributeName ); |
|
AddElementsRecursively_R( pChild, list, dict, pElementType ); |
|
} |
|
else if ( attrType == AT_ELEMENT_ARRAY ) |
|
{ |
|
const CDmrElementArray<CDmElement> children( pElement, attributeName ); |
|
uint n = children.Count(); |
|
for ( uint i = 0; i < n; ++i ) |
|
{ |
|
CDmElement *pChild = children[ i ]; |
|
AddElementsRecursively_R( pChild, list, dict, pElementType ); |
|
} |
|
} |
|
} |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Recursively adds all elements referred to this element into the list of elements |
|
//----------------------------------------------------------------------------- |
|
void AddElementsRecursively_R( CDmElement *pElement, DmeHandleVec_t &list, ElementDict_t &dict, const char *pElementType ) |
|
{ |
|
if ( !pElement ) |
|
return; |
|
|
|
if ( dict.Find( pElement ) != dict.InvalidIndex() ) |
|
return; |
|
|
|
dict.Insert( pElement ); |
|
|
|
if ( pElement->IsA( pElementType ) ) |
|
{ |
|
int nIndex = list.AddToTail( ); |
|
list[nIndex] = pElement; |
|
} |
|
|
|
for ( CDmAttribute *pAttribute = pElement->FirstAttribute(); pAttribute; pAttribute = pAttribute->NextAttribute() ) |
|
{ |
|
char const *attributeName = pAttribute->GetName( ); |
|
DmAttributeType_t attrType = pAttribute->GetType( ); |
|
if ( attrType == AT_ELEMENT ) |
|
{ |
|
CDmElement *pChild = pElement->GetValueElement< CDmElement >( attributeName ); |
|
AddElementsRecursively_R( pChild, list, dict, pElementType ); |
|
} |
|
else if ( attrType == AT_ELEMENT_ARRAY ) |
|
{ |
|
const CDmrElementArray<CDmElement> children( pElement, attributeName ); |
|
uint n = children.Count(); |
|
for ( uint i = 0; i < n; ++i ) |
|
{ |
|
CDmElement *pChild = children[ i ]; |
|
AddElementsRecursively_R( pChild, list, dict, pElementType ); |
|
} |
|
} |
|
} |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Recursively adds all elements referred to this element into the list of elements |
|
//----------------------------------------------------------------------------- |
|
void AddElementsRecursively( CDmElement *obj, ElementChoiceList_t &list, const char *pElementType ) |
|
{ |
|
if ( !pElementType ) |
|
{ |
|
pElementType = g_pDataModel->GetString( CDmElement::GetStaticTypeSymbol() ); |
|
} |
|
|
|
ElementDict_t dict( 0, 0, DefLessFunc( CDmElement * ) ); |
|
AddElementsRecursively_R( obj, list, dict, pElementType ); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Recursively adds all elements of the specified type under pElement into the vector |
|
//----------------------------------------------------------------------------- |
|
void AddElementsRecursively( CDmElement *pElement, DmeHandleVec_t &list, const char *pElementType ) |
|
{ |
|
if ( !pElementType ) |
|
{ |
|
pElementType = g_pDataModel->GetString( CDmElement::GetStaticTypeSymbol() ); |
|
} |
|
|
|
ElementDict_t dict( 0, 0, DefLessFunc( CDmElement * ) ); |
|
AddElementsRecursively_R( pElement, list, dict, pElementType ); |
|
}
|
|
|