xti additions / changes, trying to reduce dependencies
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@23126 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -82,6 +82,23 @@
|
|||||||
|
|
||||||
const long wxDateTime::TIME_T_FACTOR = 1000l;
|
const long wxDateTime::TIME_T_FACTOR = 1000l;
|
||||||
|
|
||||||
|
#if wxUSE_EXTENDED_RTTI
|
||||||
|
|
||||||
|
template<> void wxStringReadValue(const wxString &s , wxDateTime &data )
|
||||||
|
{
|
||||||
|
data.ParseFormat(s,wxT("%Y-%m-%d %H:%M:%S")) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<> void wxStringWriteValue(wxString &s , const wxDateTime &data )
|
||||||
|
{
|
||||||
|
s = data.Format(wxT("%Y-%m-%d %H:%M:%S")) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
WX_CUSTOM_TYPE_INFO(wxDateTime)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// conditional compilation
|
// conditional compilation
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
@@ -65,6 +65,56 @@
|
|||||||
#include "wx/mac/uma.h"
|
#include "wx/mac/uma.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if wxUSE_EXTENDED_RTTI
|
||||||
|
|
||||||
|
// wxPoint
|
||||||
|
|
||||||
|
template<> void wxStringReadValue(const wxString &s , wxPoint &data )
|
||||||
|
{
|
||||||
|
wxSscanf(s, _T("%d,%d"), &data.x , &data.y ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<> void wxStringWriteValue(wxString &s , const wxPoint &data )
|
||||||
|
{
|
||||||
|
s = wxString::Format("%d,%d", data.x , data.y ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<> void wxStringReadValue(const wxString & , wxPoint* & )
|
||||||
|
{
|
||||||
|
assert(0) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<> void wxStringWriteValue(wxString & , wxPoint* const & )
|
||||||
|
{
|
||||||
|
assert(0) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
WX_CUSTOM_TYPE_INFO(wxPoint)
|
||||||
|
|
||||||
|
template<> void wxStringReadValue(const wxString &s , wxSize &data )
|
||||||
|
{
|
||||||
|
wxSscanf(s, _T("%d,%d"), &data.x , &data.y ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<> void wxStringWriteValue(wxString &s , const wxSize &data )
|
||||||
|
{
|
||||||
|
s = wxString::Format("%d,%d", data.x , data.y ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<> void wxStringReadValue(const wxString & , wxSize* & )
|
||||||
|
{
|
||||||
|
assert(0) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<> void wxStringWriteValue(wxString & , wxSize * const & )
|
||||||
|
{
|
||||||
|
assert(0) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
WX_CUSTOM_TYPE_INFO(wxSize)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
IMPLEMENT_ABSTRACT_CLASS(wxDCBase, wxObject)
|
IMPLEMENT_ABSTRACT_CLASS(wxDCBase, wxObject)
|
||||||
|
|
||||||
wxRect::wxRect(const wxPoint& topLeft, const wxPoint& bottomRight)
|
wxRect::wxRect(const wxPoint& topLeft, const wxPoint& bottomRight)
|
||||||
|
@@ -29,7 +29,6 @@
|
|||||||
#include "wx/xml/xml.h"
|
#include "wx/xml/xml.h"
|
||||||
#include "wx/tokenzr.h"
|
#include "wx/tokenzr.h"
|
||||||
#include "wx/list.h"
|
#include "wx/list.h"
|
||||||
#include "wx/datetime.h"
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#if wxUSE_EXTENDED_RTTI
|
#if wxUSE_EXTENDED_RTTI
|
||||||
@@ -238,71 +237,6 @@ template<> void wxStringWriteValue(wxString &s , const wxString &data )
|
|||||||
s = data ;
|
s = data ;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
Custom Data Streaming / Type Infos
|
|
||||||
we will have to add this for all wx non object types, but it is also an example
|
|
||||||
for custom data structures
|
|
||||||
*/
|
|
||||||
|
|
||||||
// wxPoint
|
|
||||||
|
|
||||||
template<> void wxStringReadValue(const wxString &s , wxPoint &data )
|
|
||||||
{
|
|
||||||
wxSscanf(s, _T("%d,%d"), &data.x , &data.y ) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
template<> void wxStringWriteValue(wxString &s , const wxPoint &data )
|
|
||||||
{
|
|
||||||
s = wxString::Format("%d,%d", data.x , data.y ) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
template<> void wxStringReadValue(const wxString & , wxPoint* & )
|
|
||||||
{
|
|
||||||
assert(0) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
template<> void wxStringWriteValue(wxString & , wxPoint* const & )
|
|
||||||
{
|
|
||||||
assert(0) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
WX_CUSTOM_TYPE_INFO(wxPoint)
|
|
||||||
|
|
||||||
template<> void wxStringReadValue(const wxString &s , wxSize &data )
|
|
||||||
{
|
|
||||||
wxSscanf(s, _T("%d,%d"), &data.x , &data.y ) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
template<> void wxStringWriteValue(wxString &s , const wxSize &data )
|
|
||||||
{
|
|
||||||
s = wxString::Format("%d,%d", data.x , data.y ) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
template<> void wxStringReadValue(const wxString & , wxSize* & )
|
|
||||||
{
|
|
||||||
assert(0) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
template<> void wxStringWriteValue(wxString & , wxSize * const & )
|
|
||||||
{
|
|
||||||
assert(0) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
WX_CUSTOM_TYPE_INFO(wxSize)
|
|
||||||
|
|
||||||
template<> void wxStringReadValue(const wxString &s , wxDateTime &data )
|
|
||||||
{
|
|
||||||
data.ParseFormat(s,wxT("%Y-%m-%d %H:%M:%S")) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
template<> void wxStringWriteValue(wxString &s , const wxDateTime &data )
|
|
||||||
{
|
|
||||||
s = data.Format(wxT("%Y-%m-%d %H:%M:%S")) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
WX_CUSTOM_TYPE_INFO(wxDateTime)
|
|
||||||
|
|
||||||
//
|
|
||||||
// built-ins
|
// built-ins
|
||||||
//
|
//
|
||||||
|
|
||||||
@@ -386,49 +320,42 @@ WX_ILLEGAL_TYPE_SPECIALIZATION( wxString * )
|
|||||||
|
|
||||||
// make wxWindowList known
|
// make wxWindowList known
|
||||||
|
|
||||||
template<> const wxTypeInfo* wxGetTypeInfo( wxArrayString * )
|
WX_COLLECTION_TYPE_INFO( wxString , wxArrayString ) ;
|
||||||
{
|
|
||||||
static wxCollectionTypeInfo s_typeInfo( (wxTypeInfo*) wxGetTypeInfo( (wxString *) NULL) ) ;
|
|
||||||
return &s_typeInfo ;
|
|
||||||
}
|
|
||||||
|
|
||||||
template<> void wxCollectionToVariantArray( wxArrayString const &theArray, wxxVariantArray &value)
|
template<> void wxCollectionToVariantArray( wxArrayString const &theArray, wxxVariantArray &value)
|
||||||
{
|
{
|
||||||
wxArrayCollectionToVariantArray( theArray , value ) ;
|
wxArrayCollectionToVariantArray( theArray , value ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wxTypeInfoMap *wxTypeInfo::sm_typeTable = NULL ;
|
||||||
|
|
||||||
|
wxTypeInfo *wxTypeInfo::FindType(const wxChar *typeName)
|
||||||
/*
|
|
||||||
|
|
||||||
template<> void wxStringReadValue(const wxString &s , wxColour &data )
|
|
||||||
{
|
{
|
||||||
// copied from VS xrc
|
return (wxTypeInfo *)sm_typeTable->find(typeName)->second;
|
||||||
unsigned long tmp = 0;
|
|
||||||
|
|
||||||
if (s.Length() != 7 || s[0u] != wxT('#') ||
|
|
||||||
wxSscanf(s.c_str(), wxT("#%lX"), &tmp) != 1)
|
|
||||||
{
|
|
||||||
wxLogError(_("String To Colour : Incorrect colour specification : %s"),
|
|
||||||
s.c_str() );
|
|
||||||
data = wxNullColour;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
data = wxColour((unsigned char) ((tmp & 0xFF0000) >> 16) ,
|
|
||||||
(unsigned char) ((tmp & 0x00FF00) >> 8),
|
|
||||||
(unsigned char) ((tmp & 0x0000FF)));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<> void wxStringWriteValue(wxString &s , const wxColour &data )
|
wxClassTypeInfo::wxClassTypeInfo( wxTypeKind kind , wxClassInfo* classInfo , converterToString_t to , converterFromString_t from ) :
|
||||||
{
|
wxTypeInfo( kind , to , from , classInfo->GetClassName() )
|
||||||
s = wxString::Format("#%2X%2X%2X", data.Red() , data.Green() , data.Blue() ) ;
|
{ 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 ;}
|
||||||
|
|
||||||
|
void wxTypeInfo::Register()
|
||||||
|
{
|
||||||
|
if ( sm_typeTable == NULL )
|
||||||
|
sm_typeTable = new wxTypeInfoMap() ;
|
||||||
|
|
||||||
|
if( !m_name.IsEmpty() )
|
||||||
|
(*sm_typeTable)[m_name] = this ;
|
||||||
}
|
}
|
||||||
|
|
||||||
WX_CUSTOM_TYPE_INFO(wxColour)
|
void wxTypeInfo::Unregister()
|
||||||
|
{
|
||||||
*/
|
if( !m_name.IsEmpty() )
|
||||||
|
sm_typeTable->erase(m_name);
|
||||||
|
}
|
||||||
|
|
||||||
// removing header dependancy on string tokenizer
|
// removing header dependancy on string tokenizer
|
||||||
|
|
||||||
@@ -559,6 +486,24 @@ void wxClassInfo::AddToPropertyCollection(wxObject *object, const wxChar *proper
|
|||||||
accessor->AddToPropertyCollection( object , value ) ;
|
accessor->AddToPropertyCollection( object , value ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void wxClassInfo::GetProperties( wxPropertyInfoMap &map ) const
|
||||||
|
{
|
||||||
|
const wxPropertyInfo *pi = GetFirstProperty() ;
|
||||||
|
while( pi )
|
||||||
|
{
|
||||||
|
if ( map.find( pi->GetName() ) == map.end() )
|
||||||
|
map[pi->GetName()] = (wxPropertyInfo*) pi ;
|
||||||
|
|
||||||
|
pi = pi->GetNext() ;
|
||||||
|
}
|
||||||
|
|
||||||
|
const wxClassInfo** parents = GetParents() ;
|
||||||
|
for ( int i = 0 ; parents[i] ; ++ i )
|
||||||
|
{
|
||||||
|
parents[i]->GetProperties( map ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
VARIANT TO OBJECT
|
VARIANT TO OBJECT
|
||||||
*/
|
*/
|
||||||
@@ -674,7 +619,7 @@ wxxVariant wxDynamicClassInfo::GetProperty(wxObject *object, const char *propert
|
|||||||
|
|
||||||
void wxDynamicClassInfo::AddProperty( const wxChar *propertyName , const wxTypeInfo* typeInfo )
|
void wxDynamicClassInfo::AddProperty( const wxChar *propertyName , const wxTypeInfo* typeInfo )
|
||||||
{
|
{
|
||||||
new wxPropertyInfo( m_firstProperty , propertyName , typeInfo , new wxGenericPropertyAccessor( propertyName ) , wxxVariant() ) ;
|
new wxPropertyInfo( m_firstProperty , this , propertyName , typeInfo , new wxGenericPropertyAccessor( propertyName ) , wxxVariant() ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxDynamicClassInfo::AddHandler( const wxChar *handlerName , wxObjectEventFunction address , const wxClassInfo* eventClassInfo )
|
void wxDynamicClassInfo::AddHandler( const wxChar *handlerName , wxObjectEventFunction address , const wxClassInfo* eventClassInfo )
|
||||||
|
@@ -59,7 +59,7 @@ wxWriter::~wxWriter()
|
|||||||
|
|
||||||
struct wxWriter::wxWriterInternalPropertiesData
|
struct wxWriter::wxWriterInternalPropertiesData
|
||||||
{
|
{
|
||||||
map< string , int > m_writtenProperties ;
|
char nothing ;
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
void wxWriter::ClearObjectContext()
|
void wxWriter::ClearObjectContext()
|
||||||
@@ -152,102 +152,120 @@ void wxWriter::FindConnectEntry(const wxWindow * evSource,const wxDelegateTypeIn
|
|||||||
}
|
}
|
||||||
void wxWriter::WriteAllProperties( const wxObject * obj , const wxClassInfo* ci , wxPersister *persister, wxWriterInternalPropertiesData * data )
|
void wxWriter::WriteAllProperties( const wxObject * obj , const wxClassInfo* ci , wxPersister *persister, wxWriterInternalPropertiesData * data )
|
||||||
{
|
{
|
||||||
// in case this object is wxDynamic object we have to hand over the streaming
|
wxPropertyInfoMap map ;
|
||||||
// of the properties of the superclasses to the real super class instance
|
ci->GetProperties( map ) ;
|
||||||
|
for ( int i = 0 ; i < ci->GetCreateParamCount() ; ++i )
|
||||||
{
|
{
|
||||||
const wxObject *iterobj = obj ;
|
wxString name = ci->GetCreateParamName(i) ;
|
||||||
const wxDynamicObject* dynobj = dynamic_cast< const wxDynamicObject* > (iterobj ) ;
|
const wxPropertyInfo* prop = map.find(name)->second ;
|
||||||
if ( dynobj )
|
wxASSERT_MSG( prop , wxT("Create Parameter not found in declared RTTI Parameters") ) ;
|
||||||
iterobj = dynobj->GetSuperClassInstance() ;
|
WriteOneProperty( obj , prop->GetDeclaringClass() , prop , persister , data ) ;
|
||||||
const wxClassInfo** parents = ci->GetParents() ;
|
map.erase( name ) ;
|
||||||
for ( int i = 0 ; parents[i] ; ++ i )
|
}
|
||||||
|
|
||||||
|
for( wxPropertyInfoMap::iterator iter = map.begin() ; iter != map.end() ; ++iter )
|
||||||
|
{
|
||||||
|
const wxPropertyInfo* prop = iter->second ;
|
||||||
|
if ( prop->GetFlags() & wxPROP_OBJECT_GRAPH )
|
||||||
{
|
{
|
||||||
WriteAllProperties( iterobj , parents[i] , persister , data ) ;
|
WriteOneProperty( obj , prop->GetDeclaringClass() , prop , persister , data ) ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const wxPropertyInfo *pi = ci->GetFirstProperty() ;
|
for( wxPropertyInfoMap::iterator iter = map.begin() ; iter != map.end() ; ++iter )
|
||||||
while( pi )
|
|
||||||
{
|
{
|
||||||
// this property was not written yet in this object and we don't get a veto
|
const wxPropertyInfo* prop = iter->second ;
|
||||||
// if ( data->m_writtenProperties.find( pi->GetName() ) == data->m_writtenProperties.end() )
|
if ( !(prop->GetFlags() & wxPROP_OBJECT_GRAPH) )
|
||||||
// we will have to handle property overrides differently
|
|
||||||
{
|
{
|
||||||
data->m_writtenProperties[ pi->GetName() ] = 1 ;
|
WriteOneProperty( obj , prop->GetDeclaringClass() , prop , persister , data ) ;
|
||||||
DoBeginWriteProperty( pi ) ;
|
}
|
||||||
if ( pi->GetTypeInfo()->GetKind() == wxT_COLLECTION )
|
}
|
||||||
{
|
}
|
||||||
wxxVariantArray data ;
|
|
||||||
pi->GetAccessor()->GetPropertyCollection(obj, data) ;
|
|
||||||
const wxTypeInfo * elementType = dynamic_cast< const wxCollectionTypeInfo* >( pi->GetTypeInfo() )->GetElementType() ;
|
|
||||||
for ( size_t i = 0 ; i < data.GetCount() ; ++i )
|
|
||||||
{
|
|
||||||
DoBeginWriteElement() ;
|
|
||||||
wxxVariant value = data[i] ;
|
|
||||||
if ( persister->BeforeWriteProperty( this , pi , value ) )
|
|
||||||
{
|
|
||||||
const wxClassTypeInfo* cti = dynamic_cast< const wxClassTypeInfo* > ( elementType ) ;
|
|
||||||
if ( cti )
|
|
||||||
{
|
|
||||||
const wxClassInfo* pci = cti->GetClassInfo() ;
|
|
||||||
wxObject *vobj = pci->VariantToInstance( value ) ;
|
|
||||||
wxxVariantArray md ;
|
|
||||||
WriteObject( vobj , (vobj ? vobj->GetClassInfo() : pci ) , persister , cti->GetKind()== wxT_OBJECT , md ) ;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DoWriteSimpleType( value ) ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
DoEndWriteElement() ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
const wxDelegateTypeInfo* dti = dynamic_cast< const wxDelegateTypeInfo* > ( pi->GetTypeInfo() ) ;
|
|
||||||
if ( dti )
|
|
||||||
{
|
|
||||||
const wxObject* sink = NULL ;
|
|
||||||
const wxHandlerInfo *handler = NULL ;
|
|
||||||
|
|
||||||
const wxWindow * evSource = dynamic_cast<const wxWindow *>(obj) ;
|
void wxWriter::WriteOneProperty( const wxObject *obj , const wxClassInfo* ci , const wxPropertyInfo* pi , wxPersister *persister , wxWriterInternalPropertiesData *data )
|
||||||
wxASSERT_MSG( evSource , wxT("Illegal Object Class (Non-Window) as Event Source") ) ;
|
{
|
||||||
|
// make sure that we are picking the correct object for accessing the property
|
||||||
|
const wxDynamicObject* dynobj = dynamic_cast< const wxDynamicObject* > (obj ) ;
|
||||||
|
if ( dynobj && (dynamic_cast<const wxDynamicClassInfo*>(ci) == NULL) )
|
||||||
|
obj = dynobj->GetSuperClassInstance() ;
|
||||||
|
|
||||||
FindConnectEntry( evSource , dti , sink , handler ) ;
|
DoBeginWriteProperty( pi ) ;
|
||||||
if ( persister->BeforeWriteDelegate( this , obj , ci , pi , sink , handler ) )
|
if ( pi->GetTypeInfo()->GetKind() == wxT_COLLECTION )
|
||||||
{
|
{
|
||||||
if ( sink != NULL && handler != NULL )
|
wxxVariantArray data ;
|
||||||
{
|
pi->GetAccessor()->GetPropertyCollection(obj, data) ;
|
||||||
wxASSERT_MSG( IsObjectKnown( sink ) , wxT("Streaming delegates for not already streamed objects not yet supported") ) ;
|
const wxTypeInfo * elementType = dynamic_cast< const wxCollectionTypeInfo* >( pi->GetTypeInfo() )->GetElementType() ;
|
||||||
DoWriteDelegate( obj , ci , pi , sink , GetObjectID( sink ) , sink->GetClassInfo() , handler ) ;
|
for ( size_t i = 0 ; i < data.GetCount() ; ++i )
|
||||||
}
|
{
|
||||||
}
|
DoBeginWriteElement() ;
|
||||||
|
wxxVariant value = data[i] ;
|
||||||
|
if ( persister->BeforeWriteProperty( this , pi , value ) )
|
||||||
|
{
|
||||||
|
const wxClassTypeInfo* cti = dynamic_cast< const wxClassTypeInfo* > ( elementType ) ;
|
||||||
|
if ( cti )
|
||||||
|
{
|
||||||
|
const wxClassInfo* pci = cti->GetClassInfo() ;
|
||||||
|
wxObject *vobj = pci->VariantToInstance( value ) ;
|
||||||
|
wxxVariantArray md ;
|
||||||
|
WriteObject( vobj , (vobj ? vobj->GetClassInfo() : pci ) , persister , cti->GetKind()== wxT_OBJECT , md ) ;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
wxxVariant value ;
|
DoWriteSimpleType( value ) ;
|
||||||
pi->GetAccessor()->GetProperty(obj, value) ;
|
|
||||||
if ( persister->BeforeWriteProperty( this , pi , value ) )
|
|
||||||
{
|
|
||||||
const wxClassTypeInfo* cti = dynamic_cast< const wxClassTypeInfo* > ( pi->GetTypeInfo() ) ;
|
|
||||||
if ( cti )
|
|
||||||
{
|
|
||||||
const wxClassInfo* pci = cti->GetClassInfo() ;
|
|
||||||
wxObject *vobj = pci->VariantToInstance( value ) ;
|
|
||||||
wxxVariantArray md ;
|
|
||||||
WriteObject( vobj , (vobj ? vobj->GetClassInfo() : pci ) , persister , cti->GetKind()== wxT_OBJECT , md) ;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DoWriteSimpleType( value ) ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
DoEndWriteProperty( pi ) ;
|
DoEndWriteElement() ;
|
||||||
}
|
}
|
||||||
pi = pi->GetNext() ;
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const wxDelegateTypeInfo* dti = dynamic_cast< const wxDelegateTypeInfo* > ( pi->GetTypeInfo() ) ;
|
||||||
|
if ( dti )
|
||||||
|
{
|
||||||
|
const wxObject* sink = NULL ;
|
||||||
|
const wxHandlerInfo *handler = NULL ;
|
||||||
|
|
||||||
|
const wxWindow * evSource = dynamic_cast<const wxWindow *>(obj) ;
|
||||||
|
wxASSERT_MSG( evSource , wxT("Illegal Object Class (Non-Window) as Event Source") ) ;
|
||||||
|
|
||||||
|
FindConnectEntry( evSource , dti , sink , handler ) ;
|
||||||
|
if ( persister->BeforeWriteDelegate( this , obj , ci , pi , sink , handler ) )
|
||||||
|
{
|
||||||
|
if ( sink != NULL && handler != NULL )
|
||||||
|
{
|
||||||
|
wxASSERT_MSG( IsObjectKnown( sink ) , wxT("Streaming delegates for not already streamed objects not yet supported") ) ;
|
||||||
|
DoWriteDelegate( obj , ci , pi , sink , GetObjectID( sink ) , sink->GetClassInfo() , handler ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wxxVariant value ;
|
||||||
|
pi->GetAccessor()->GetProperty(obj, value) ;
|
||||||
|
if ( persister->BeforeWriteProperty( this , pi , value ) )
|
||||||
|
{
|
||||||
|
const wxClassTypeInfo* cti = dynamic_cast< const wxClassTypeInfo* > ( pi->GetTypeInfo() ) ;
|
||||||
|
if ( cti )
|
||||||
|
{
|
||||||
|
const wxClassInfo* pci = cti->GetClassInfo() ;
|
||||||
|
wxObject *vobj = pci->VariantToInstance( value ) ;
|
||||||
|
wxxVariantArray md ;
|
||||||
|
WriteObject( vobj , (vobj ? vobj->GetClassInfo() : pci ) , persister , cti->GetKind()== wxT_OBJECT , md) ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( pi->GetFlags() & wxPROP_ENUM_STORE_LONG )
|
||||||
|
{
|
||||||
|
const wxEnumTypeInfo *eti = dynamic_cast<const wxEnumTypeInfo*>( pi->GetTypeInfo() ) ;
|
||||||
|
wxASSERT_MSG( eti , wxT("Type must have enum - long conversion") ) ;
|
||||||
|
eti->ConvertFromLong( value.Get<long>() , value ) ;
|
||||||
|
}
|
||||||
|
DoWriteSimpleType( value ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DoEndWriteProperty( pi ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
int wxWriter::GetObjectID(const wxObject *obj)
|
int wxWriter::GetObjectID(const wxObject *obj)
|
||||||
@@ -560,6 +578,15 @@ int wxXmlReader::ReadComponent(wxXmlNode *node, wxDepersister *callbacks)
|
|||||||
{
|
{
|
||||||
createParamOids[i] = wxInvalidObjectID ;
|
createParamOids[i] = wxInvalidObjectID ;
|
||||||
createParams[i] = ReadValue( prop , pi->GetTypeInfo() ) ;
|
createParams[i] = ReadValue( prop , pi->GetTypeInfo() ) ;
|
||||||
|
if( pi->GetFlags() & wxPROP_ENUM_STORE_LONG )
|
||||||
|
{
|
||||||
|
const wxEnumTypeInfo *eti = dynamic_cast<const wxEnumTypeInfo*>( pi->GetTypeInfo() ) ;
|
||||||
|
wxASSERT_MSG( eti , wxT("Type must have enum - long conversion") ) ;
|
||||||
|
|
||||||
|
long realval ;
|
||||||
|
eti->ConvertToLong( createParams[i] , realval ) ;
|
||||||
|
createParams[i] = wxxVariant( realval ) ;
|
||||||
|
}
|
||||||
createClassInfos[i] = NULL ;
|
createClassInfos[i] = NULL ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user