X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/499a9a62227fb95b19fdb2d48f799988b218c666..2cdd63c6b1d473ffd7726f619085997b0737952e:/src/common/xti.cpp diff --git a/src/common/xti.cpp b/src/common/xti.cpp index 635e9704d7..4020bb2c8e 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 ; @@ -52,12 +53,12 @@ wxEnumData::wxEnumData( wxEnumMemberData* data ) {} ; } -bool wxEnumData::HasEnumMemberValue(const wxChar *name, int *value) +bool wxEnumData::HasEnumMemberValue(const wxChar *name, int *value) const { int i; for (i = 0; m_members[i].m_name ; i++ ) { - if (!strcmp(name, m_members[i].m_name)) + if (!wxStrcmp(name, m_members[i].m_name)) { if ( value ) *value = m_members[i].m_value; @@ -67,12 +68,12 @@ bool wxEnumData::HasEnumMemberValue(const wxChar *name, int *value) return false ; } -int wxEnumData::GetEnumMemberValue(const wxChar *name) +int wxEnumData::GetEnumMemberValue(const wxChar *name) const { int i; for (i = 0; m_members[i].m_name ; i++ ) { - if (!strcmp(name, m_members[i].m_name)) + if (!wxStrcmp(name, m_members[i].m_name)) { return m_members[i].m_value; } @@ -80,23 +81,23 @@ int wxEnumData::GetEnumMemberValue(const wxChar *name) return 0 ; } -const wxChar *wxEnumData::GetEnumMemberName(int value) +const wxChar *wxEnumData::GetEnumMemberName(int value) const { int i; for (i = 0; m_members[i].m_name ; i++) if (value == m_members[i].m_value) return m_members[i].m_name; - return wxT("") ; + return wxEmptyString ; } -int wxEnumData::GetEnumMemberValueByIndex( int idx ) +int wxEnumData::GetEnumMemberValueByIndex( int idx ) const { // we should cache the count in order to avoid out-of-bounds errors return m_members[idx].m_value ; } -const char * wxEnumData::GetEnumMemberNameByIndex( int idx ) +const wxChar * wxEnumData::GetEnumMemberNameByIndex( int idx ) const { // we should cache the count in order to avoid out-of-bounds errors return m_members[idx].m_name ; @@ -118,12 +119,12 @@ template<> void wxStringReadValue(const wxString &s , bool &data ) { int intdata ; wxSscanf(s, _T("%d"), &intdata ) ; - data = bool(intdata) ; + data = (bool)intdata ; } template<> void wxStringWriteValue(wxString &s , const bool &data ) { - s = wxString::Format("%d", data ) ; + s = wxString::Format(_T("%d"), data ) ; } // char @@ -137,7 +138,7 @@ template<> void wxStringReadValue(const wxString &s , char &data ) template<> void wxStringWriteValue(wxString &s , const char &data ) { - s = wxString::Format("%d", data ) ; + s = wxString::Format(_T("%d"), data ) ; } // unsigned char @@ -151,7 +152,7 @@ template<> void wxStringReadValue(const wxString &s , unsigned char &data ) template<> void wxStringWriteValue(wxString &s , const unsigned char &data ) { - s = wxString::Format("%d", data ) ; + s = wxString::Format(_T("%d"), data ) ; } // int @@ -163,7 +164,7 @@ template<> void wxStringReadValue(const wxString &s , int &data ) template<> void wxStringWriteValue(wxString &s , const int &data ) { - s = wxString::Format("%d", data ) ; + s = wxString::Format(_T("%d"), data ) ; } // unsigned int @@ -175,7 +176,7 @@ template<> void wxStringReadValue(const wxString &s , unsigned int &data ) template<> void wxStringWriteValue(wxString &s , const unsigned int &data ) { - s = wxString::Format("%d", data ) ; + s = wxString::Format(_T("%d"), data ) ; } // long @@ -187,7 +188,7 @@ template<> void wxStringReadValue(const wxString &s , long &data ) template<> void wxStringWriteValue(wxString &s , const long &data ) { - s = wxString::Format("%ld", data ) ; + s = wxString::Format(_T("%ld"), data ) ; } // unsigned long @@ -199,7 +200,7 @@ template<> void wxStringReadValue(const wxString &s , unsigned long &data ) template<> void wxStringWriteValue(wxString &s , const unsigned long &data ) { - s = wxString::Format("%ld", data ) ; + s = wxString::Format(_T("%ld"), data ) ; } // float @@ -211,7 +212,7 @@ template<> void wxStringReadValue(const wxString &s , float &data ) template<> void wxStringWriteValue(wxString &s , const float &data ) { - s = wxString::Format("%f", data ) ; + s = wxString::Format(_T("%f"), data ) ; } // double @@ -223,7 +224,7 @@ template<> void wxStringReadValue(const wxString &s , double &data ) template<> void wxStringWriteValue(wxString &s , const double &data ) { - s = wxString::Format("%lf", data ) ; + s = wxString::Format(_T("%lf"), data ) ; } // wxString @@ -241,65 +242,90 @@ template<> void wxStringWriteValue(wxString &s , const wxString &data ) // built-ins // -wxBuiltInTypeInfo s_typeInfovoid( wxT_VOID , NULL , NULL , typeid(void).name() ) ; -wxBuiltInTypeInfo s_typeInfobool( wxT_BOOL , &wxToStringConverter , &wxFromStringConverter, typeid(bool).name()) ; -wxBuiltInTypeInfo s_typeInfochar( wxT_CHAR , &wxToStringConverter , &wxFromStringConverter, typeid(char).name()) ; -wxBuiltInTypeInfo s_typeInfounsignedchar( wxT_UCHAR , &wxToStringConverter< unsigned char > , &wxFromStringConverter, typeid(unsigned char).name()) ; -wxBuiltInTypeInfo s_typeInfoint( wxT_INT , &wxToStringConverter , &wxFromStringConverter, typeid(int).name()) ; -wxBuiltInTypeInfo s_typeInfounsignedint( wxT_UINT , &wxToStringConverter , &wxFromStringConverter, typeid(unsigned int).name()) ; -wxBuiltInTypeInfo s_typeInfolong( wxT_LONG , &wxToStringConverter , &wxFromStringConverter, typeid(long).name()) ; -wxBuiltInTypeInfo s_typeInfounsignedlong( wxT_ULONG , &wxToStringConverter , &wxFromStringConverter, typeid(unsigned long).name()) ; -wxBuiltInTypeInfo s_typeInfofloat( wxT_FLOAT , &wxToStringConverter , &wxFromStringConverter, typeid(float).name()) ; -wxBuiltInTypeInfo s_typeInfodouble( wxT_DOUBLE , &wxToStringConverter , &wxFromStringConverter, typeid(double).name()) ; -wxBuiltInTypeInfo s_typeInfowxString( wxT_STRING , &wxToStringConverter , &wxFromStringConverter, typeid(wxString).name()) ; +#if wxUSE_FUNC_TEMPLATE_POINTER +#define wxBUILTIN_TYPE_INFO( element , type ) \ + wxBuiltInTypeInfo s_typeInfo##type(element , &wxToStringConverter , &wxFromStringConverter , typeid(type).name()) ; +#else +#define wxBUILTIN_TYPE_INFO( element , type ) \ + void _toString##element( const wxxVariant& data , wxString &result ) { wxToStringConverter(data, result); } \ + void _fromString##element( const wxString& data , wxxVariant &result ) { wxFromStringConverter(data, result); } \ + wxBuiltInTypeInfo s_typeInfo##type(element , &_toString##element , &_fromString##element , typeid(type).name()) ; +#endif + +typedef unsigned char unsigned_char; +typedef unsigned int unsigned_int; +typedef unsigned long unsigned_long; + +wxBuiltInTypeInfo s_typeInfovoid( wxT_VOID , NULL , NULL , typeid(void).name()); +wxBUILTIN_TYPE_INFO( wxT_BOOL , bool); +wxBUILTIN_TYPE_INFO( wxT_CHAR , char); +wxBUILTIN_TYPE_INFO( wxT_UCHAR , unsigned_char); +wxBUILTIN_TYPE_INFO( wxT_INT , int); +wxBUILTIN_TYPE_INFO( wxT_UINT , unsigned_int); +wxBUILTIN_TYPE_INFO( wxT_LONG , long); +wxBUILTIN_TYPE_INFO( wxT_ULONG , unsigned_long); +wxBUILTIN_TYPE_INFO( wxT_FLOAT , float); +wxBUILTIN_TYPE_INFO( wxT_DOUBLE , double); +wxBUILTIN_TYPE_INFO( wxT_STRING , wxString); + // this are compiler induced specialization which are never used anywhere -WX_ILLEGAL_TYPE_SPECIALIZATION( char const * ) -WX_ILLEGAL_TYPE_SPECIALIZATION( char * ) -WX_ILLEGAL_TYPE_SPECIALIZATION( unsigned char * ) -WX_ILLEGAL_TYPE_SPECIALIZATION( int * ) -WX_ILLEGAL_TYPE_SPECIALIZATION( bool * ) -WX_ILLEGAL_TYPE_SPECIALIZATION( long * ) -WX_ILLEGAL_TYPE_SPECIALIZATION( wxString * ) +wxILLEGAL_TYPE_SPECIALIZATION( char const * ) +wxILLEGAL_TYPE_SPECIALIZATION( char * ) +wxILLEGAL_TYPE_SPECIALIZATION( unsigned char * ) +wxILLEGAL_TYPE_SPECIALIZATION( int * ) +wxILLEGAL_TYPE_SPECIALIZATION( bool * ) +wxILLEGAL_TYPE_SPECIALIZATION( long * ) +wxILLEGAL_TYPE_SPECIALIZATION( wxString * ) -WX_COLLECTION_TYPE_INFO( wxString , wxArrayString ) ; +wxCOLLECTION_TYPE_INFO( wxString , wxArrayString ) ; template<> void wxCollectionToVariantArray( wxArrayString const &theArray, wxxVariantArray &value) { 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; } +#if wxUSE_UNICODE +wxClassTypeInfo::wxClassTypeInfo( wxTypeKind kind , wxClassInfo* classInfo , converterToString_t to , converterFromString_t from , const char *name) : +wxTypeInfo( kind , to , from , name) +{ wxASSERT_MSG( kind == wxT_OBJECT_PTR || kind == wxT_OBJECT , wxT("Illegal Kind for Enum Type")) ; m_classInfo = classInfo ;} +#endif + wxClassTypeInfo::wxClassTypeInfo( wxTypeKind kind , wxClassInfo* classInfo , converterToString_t to , converterFromString_t from , const wxString &name) : wxTypeInfo( kind , to , from , name) { wxASSERT_MSG( kind == wxT_OBJECT_PTR || kind == wxT_OBJECT , wxT("Illegal Kind for Enum Type")) ; m_classInfo = classInfo ;} wxDelegateTypeInfo::wxDelegateTypeInfo( int eventType , wxClassInfo* eventClass , converterToString_t to , converterFromString_t from ) : wxTypeInfo ( wxT_DELEGATE , to , from , wxEmptyString ) -{ m_eventClass = eventClass ; m_eventType = eventType ;} +{ m_eventClass = eventClass ; m_eventType = eventType ; m_lastEventType = -1 ;} + +wxDelegateTypeInfo::wxDelegateTypeInfo( int eventType , int lastEventType , wxClassInfo* eventClass , converterToString_t to , converterFromString_t from ) : +wxTypeInfo ( wxT_DELEGATE , to , from , wxEmptyString ) +{ m_eventClass = eventClass ; m_eventType = eventType ; m_lastEventType = lastEventType; } 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 ; + if( !m_name.empty() ) + (*ms_typeTable)[m_name] = this ; } void wxTypeInfo::Unregister() { - if( !m_name.IsEmpty() ) - sm_typeTable->erase(m_name); + if( !m_name.empty() ) + ms_typeTable->erase(m_name); } // removing header dependancy on string tokenizer @@ -363,7 +389,7 @@ wxHandlerInfo::~wxHandlerInfo() } } -const wxPropertyAccessor *wxClassInfo::FindAccessor(const char *PropertyName) const +const wxPropertyAccessor *wxClassInfo::FindAccessor(const wxChar *PropertyName) const { const wxPropertyInfo* info = FindPropertyInfo( PropertyName ) ; @@ -373,13 +399,13 @@ const wxPropertyAccessor *wxClassInfo::FindAccessor(const char *PropertyName) co return NULL ; } -wxPropertyInfo *wxClassInfo::FindPropertyInfoInThisClass (const char *PropertyName) const +wxPropertyInfo *wxClassInfo::FindPropertyInfoInThisClass (const wxChar *PropertyName) const { wxPropertyInfo* info = m_firstProperty ; while( info ) { - if ( strcmp( info->GetName() , PropertyName ) == 0 ) + if ( wxStrcmp( info->GetName() , PropertyName ) == 0 ) return info ; info = info->GetNext() ; } @@ -387,7 +413,7 @@ wxPropertyInfo *wxClassInfo::FindPropertyInfoInThisClass (const char *PropertyNa return 0; } -const wxPropertyInfo *wxClassInfo::FindPropertyInfo (const char *PropertyName) const +const wxPropertyInfo *wxClassInfo::FindPropertyInfo (const wxChar *PropertyName) const { const wxPropertyInfo* info = FindPropertyInfoInThisClass( PropertyName ) ; if ( info ) @@ -403,13 +429,13 @@ const wxPropertyInfo *wxClassInfo::FindPropertyInfo (const char *PropertyName) c return 0; } -wxHandlerInfo *wxClassInfo::FindHandlerInfoInThisClass (const char *PropertyName) const +wxHandlerInfo *wxClassInfo::FindHandlerInfoInThisClass (const wxChar *PropertyName) const { wxHandlerInfo* info = m_firstHandler ; while( info ) { - if ( strcmp( info->GetName() , PropertyName ) == 0 ) + if ( wxStrcmp( info->GetName() , PropertyName ) == 0 ) return info ; info = info->GetNext() ; } @@ -417,7 +443,7 @@ wxHandlerInfo *wxClassInfo::FindHandlerInfoInThisClass (const char *PropertyName return 0; } -const wxHandlerInfo *wxClassInfo::FindHandlerInfo (const char *PropertyName) const +const wxHandlerInfo *wxClassInfo::FindHandlerInfo (const wxChar *PropertyName) const { const wxHandlerInfo* info = FindHandlerInfoInThisClass( PropertyName ) ; @@ -448,7 +474,7 @@ wxObjectStreamingCallback wxClassInfo::GetStreamingCallback() const return retval ; } -bool wxClassInfo::BeforeWriteObject( const wxObject *obj, wxWriter *streamer , wxPersister *persister , wxxVariantArray &metadata) const +bool wxClassInfo::BeforeWriteObject( const wxObject *obj, wxWriter *streamer , wxPersister *persister , wxxVariantArray &metadata) const { wxObjectStreamingCallback sb = GetStreamingCallback() ; if ( sb ) @@ -457,7 +483,7 @@ bool wxClassInfo::BeforeWriteObject( const wxObject *obj, wxWriter *streamer , w return true ; } -void wxClassInfo::SetProperty(wxObject *object, const char *propertyName, const wxxVariant &value) const +void wxClassInfo::SetProperty(wxObject *object, const wxChar *propertyName, const wxxVariant &value) const { const wxPropertyAccessor *accessor; @@ -466,7 +492,7 @@ void wxClassInfo::SetProperty(wxObject *object, const char *propertyName, const accessor->SetProperty( object , value ) ; } -wxxVariant wxClassInfo::GetProperty(wxObject *object, const char *propertyName) const +wxxVariant wxClassInfo::GetProperty(wxObject *object, const wxChar *propertyName) const { const wxPropertyAccessor *accessor; @@ -497,13 +523,16 @@ void wxClassInfo::AddToPropertyCollection(wxObject *object, const wxChar *proper accessor->AddToPropertyCollection( object , value ) ; } -void wxClassInfo::GetProperties( wxPropertyInfoMap &map ) const +// void wxClassInfo::GetProperties( wxPropertyInfoMap &map ) const +// The map parameter (the name map that is) seems something special +// to MSVC and so we use a other name. +void wxClassInfo::GetProperties( wxPropertyInfoMap &infomap ) const { const wxPropertyInfo *pi = GetFirstProperty() ; - while( pi ) + while( pi ) { - if ( map.find( pi->GetName() ) == map.end() ) - map[pi->GetName()] = (wxPropertyInfo*) pi ; + if ( infomap.find( pi->GetName() ) == infomap.end() ) + infomap[pi->GetName()] = (wxPropertyInfo*) pi ; pi = pi->GetNext() ; } @@ -511,7 +540,7 @@ void wxClassInfo::GetProperties( wxPropertyInfoMap &map ) const const wxClassInfo** parents = GetParents() ; for ( int i = 0 ; parents[i] ; ++ i ) { - parents[i]->GetProperties( map ) ; + parents[i]->GetProperties( infomap ) ; } } @@ -538,7 +567,20 @@ wxObject* wxxVariant::GetAsObject() struct wxDynamicObject::wxDynamicObjectInternal { + wxDynamicObjectInternal() {} + +#if wxUSE_UNICODE + map m_properties ; +#else map m_properties ; +#endif +} ; + +typedef list< wxDynamicObject* > wxDynamicObjectList ; + +struct wxDynamicClassInfo::wxDynamicClassInfoInternal +{ + wxDynamicObjectList m_dynamicObjects ; } ; // instantiates this object with an instance of its superclass @@ -551,6 +593,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 ; } @@ -567,6 +610,21 @@ wxxVariant wxDynamicObject::GetProperty (const wxChar *propertyName) const 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 // ---------------------------------------------------------------------------- @@ -576,17 +634,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 @@ -608,7 +670,7 @@ const wxChar* wxDynamicClassInfo::GetCreateParamName(int i) const return GetParents()[0]->GetCreateParamName( i ) ; } -void wxDynamicClassInfo::SetProperty(wxObject *object, const char *propertyName, const wxxVariant &value) const +void wxDynamicClassInfo::SetProperty(wxObject *object, const wxChar *propertyName, const wxxVariant &value) const { wxDynamicObject* dynobj = dynamic_cast< wxDynamicObject * >( object ) ; wxASSERT_MSG( dynobj , wxT("cannot call wxDynamicClassInfo::SetProperty on an object other than wxDynamicObject") ) ; @@ -618,7 +680,7 @@ void wxDynamicClassInfo::SetProperty(wxObject *object, const char *propertyName, GetParents()[0]->SetProperty( dynobj->GetSuperClassInstance() , propertyName , value ) ; } -wxxVariant wxDynamicClassInfo::GetProperty(wxObject *object, const char *propertyName) const +wxxVariant wxDynamicClassInfo::GetProperty(wxObject *object, const wxChar *propertyName) const { wxDynamicObject* dynobj = dynamic_cast< wxDynamicObject * >( object ) ; wxASSERT_MSG( dynobj , wxT("cannot call wxDynamicClassInfo::SetProperty on an object other than wxDynamicObject") ) ; @@ -639,28 +701,32 @@ void wxDynamicClassInfo::AddHandler( const wxChar *handlerName , wxObjectEventFu } // removes an existing runtime-property -void wxDynamicClassInfo::RemoveProperty( const wxChar *propertyName ) +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) ; } // removes an existing runtime-handler -void wxDynamicClassInfo::RemoveHandler( const wxChar *handlerName ) +void wxDynamicClassInfo::RemoveHandler( const wxChar *handlerName ) { delete FindHandlerInfoInThisClass(handlerName) ; } // renames an existing runtime-property -void wxDynamicClassInfo::RenameProperty( const wxChar *oldPropertyName , const wxChar *newPropertyName ) +void wxDynamicClassInfo::RenameProperty( const wxChar *oldPropertyName , const wxChar *newPropertyName ) { wxPropertyInfo* pi = FindPropertyInfoInThisClass(oldPropertyName) ; 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 -void wxDynamicClassInfo::RenameHandler( const wxChar *oldHandlerName , const wxChar *newHandlerName ) +void wxDynamicClassInfo::RenameHandler( const wxChar *oldHandlerName , const wxChar *newHandlerName ) { wxASSERT_MSG(FindHandlerInfoInThisClass(oldHandlerName),wxT("not existing handler") ) ; FindHandlerInfoInThisClass(oldHandlerName)->m_name = newHandlerName ;