X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8805dbab72812a326c121cc7fdefe82620595b1a..1e8bd6b2aeca2ac6f97a1c4e8087051edc811c1d:/src/common/xti.cpp diff --git a/src/common/xti.cpp b/src/common/xti.cpp index 5e1779399c..5320362612 100644 --- a/src/common/xti.cpp +++ b/src/common/xti.cpp @@ -37,6 +37,7 @@ #include "wx/beforestd.h" #include #include +#include #include "wx/afterstd.h" using namespace std ; @@ -270,12 +271,12 @@ template<> void wxCollectionToVariantArray( wxArrayString const &theArray, wxxVa wxArrayCollectionToVariantArray( theArray , value ) ; } -wxTypeInfoMap *wxTypeInfo::sm_typeTable = NULL ; +wxTypeInfoMap *wxTypeInfo::ms_typeTable = NULL ; wxTypeInfo *wxTypeInfo::FindType(const wxChar *typeName) { - wxTypeInfoMap::iterator iter = sm_typeTable->find(typeName) ; - wxASSERT_MSG( iter != sm_typeTable->end() , wxT("lookup for a non-existent type-info") ) ; + wxTypeInfoMap::iterator iter = ms_typeTable->find(typeName) ; + wxASSERT_MSG( iter != ms_typeTable->end() , wxT("lookup for a non-existent type-info") ) ; return (wxTypeInfo *)iter->second; } @@ -299,17 +300,17 @@ wxTypeInfo ( wxT_DELEGATE , to , from , wxEmptyString ) void wxTypeInfo::Register() { - if ( sm_typeTable == NULL ) - sm_typeTable = new wxTypeInfoMap() ; + if ( ms_typeTable == NULL ) + ms_typeTable = new wxTypeInfoMap() ; if( !m_name.IsEmpty() ) - (*sm_typeTable)[m_name] = this ; + (*ms_typeTable)[m_name] = this ; } void wxTypeInfo::Unregister() { if( !m_name.IsEmpty() ) - sm_typeTable->erase(m_name); + ms_typeTable->erase(m_name); } // removing header dependancy on string tokenizer @@ -546,31 +547,22 @@ wxObject* wxxVariant::GetAsObject() // own attributes in a hash map. Like this it is possible to create the objects and // stream them, as if their class information was already available from compiled data -// can't keep the attributes in a hash map, because if someone renames a property in -// the class info, then things go potty later on when we try to iterate through -// the property values by name. -struct wxDynamicProperty__ -{ -#if wxUSE_UNICODE - wstring name; -#else - string name; -#endif - wxxVariant value; - wxDynamicProperty__ *next; -}; - struct wxDynamicObject::wxDynamicObjectInternal { - wxDynamicObjectInternal() : m_properties(NULL) {} - wxDynamicProperty__ *m_properties; -#if 0 + wxDynamicObjectInternal() {} + #if wxUSE_UNICODE map m_properties ; #else map m_properties ; #endif -#endif +} ; + +typedef list< wxDynamicObject* > wxDynamicObjectList ; + +struct wxDynamicClassInfo::wxDynamicClassInfoInternal +{ + wxDynamicObjectList m_dynamicObjects ; } ; // instantiates this object with an instance of its superclass @@ -583,6 +575,7 @@ wxDynamicObject::wxDynamicObject(wxObject* superClassInstance, const wxDynamicCl wxDynamicObject::~wxDynamicObject() { + dynamic_cast(m_classInfo)->m_data->m_dynamicObjects.remove( this ) ; delete m_data ; delete m_superClassInstance ; } @@ -590,41 +583,30 @@ wxDynamicObject::~wxDynamicObject() void wxDynamicObject::SetProperty (const wxChar *propertyName, const wxxVariant &value) { wxASSERT_MSG(m_classInfo->FindPropertyInfoInThisClass(propertyName),wxT("Accessing Unknown Property in a Dynamic Object") ) ; - wxDynamicProperty__ *prop; - prop = m_data->m_properties; - while (prop) - { - if (!strcmp(prop->name.c_str(), propertyName)) - { - prop->value = value; - return; - } - prop = prop->next; - } - prop = new wxDynamicProperty__; - prop->name = propertyName; - prop->value = value; - prop->next = m_data->m_properties; - m_data->m_properties = prop; -// m_data->m_properties[propertyName] = value ; + m_data->m_properties[propertyName] = value ; } wxxVariant wxDynamicObject::GetProperty (const wxChar *propertyName) const { wxASSERT_MSG(m_classInfo->FindPropertyInfoInThisClass(propertyName),wxT("Accessing Unknown Property in a Dynamic Object") ) ; - wxDynamicProperty__ *prop; - prop = m_data->m_properties; - while (prop) - { - if (!strcmp(prop->name.c_str(), propertyName)) - return prop->value; - prop = prop->next; - } - // FIXME: needs to return something a little more sane here. - return wxxVariant(); -// return m_data->m_properties[propertyName] ; + return m_data->m_properties[propertyName] ; +} + +void wxDynamicObject::RemoveProperty( const wxChar *propertyName ) +{ + wxASSERT_MSG(m_classInfo->FindPropertyInfoInThisClass(propertyName),wxT("Removing Unknown Property in a Dynamic Object") ) ; + m_data->m_properties.erase( propertyName ) ; } +void wxDynamicObject::RenameProperty( const wxChar *oldPropertyName , const wxChar *newPropertyName ) +{ + wxASSERT_MSG(m_classInfo->FindPropertyInfoInThisClass(oldPropertyName),wxT("Renaming Unknown Property in a Dynamic Object") ) ; + wxxVariant value = m_data->m_properties[oldPropertyName] ; + m_data->m_properties.erase( oldPropertyName ) ; + m_data->m_properties[newPropertyName] = value ; +} + + // ---------------------------------------------------------------------------- // wxDynamiClassInfo // ---------------------------------------------------------------------------- @@ -634,17 +616,21 @@ wxClassInfo( unitName, className , new const wxClassInfo*[2]) { GetParents()[0] = superClass ; GetParents()[1] = NULL ; + m_data = new wxDynamicClassInfoInternal ; } wxDynamicClassInfo::~wxDynamicClassInfo() { delete[] GetParents() ; + delete m_data ; } wxObject *wxDynamicClassInfo::AllocateObject() const { wxObject* parent = GetParents()[0]->AllocateObject() ; - return new wxDynamicObject( parent , this ) ; + wxDynamicObject *obj = new wxDynamicObject( parent , this ) ; + m_data->m_dynamicObjects.push_back( obj ) ; + return obj ; } void wxDynamicClassInfo::Create (wxObject *object, int paramCount, wxxVariant *params) const @@ -699,6 +685,8 @@ void wxDynamicClassInfo::AddHandler( const wxChar *handlerName , wxObjectEventFu // removes an existing runtime-property void wxDynamicClassInfo::RemoveProperty( const wxChar *propertyName ) { + for ( wxDynamicObjectList::iterator iter = m_data->m_dynamicObjects.begin() ; iter != m_data->m_dynamicObjects.end() ; ++iter ) + (*iter)->RemoveProperty( propertyName ) ; delete FindPropertyInfoInThisClass(propertyName) ; } @@ -715,6 +703,8 @@ void wxDynamicClassInfo::RenameProperty( const wxChar *oldPropertyName , const w wxASSERT_MSG( pi ,wxT("not existing property") ) ; pi->m_name = newPropertyName ; dynamic_cast(pi->GetAccessor())->RenameProperty( oldPropertyName , newPropertyName ) ; + for ( wxDynamicObjectList::iterator iter = m_data->m_dynamicObjects.begin() ; iter != m_data->m_dynamicObjects.end() ; ++iter ) + (*iter)->RenameProperty( oldPropertyName , newPropertyName ) ; } // renames an existing runtime-handler