X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8ec1974ea170256698381cc47dd1dcd6cb494433..a5b8e8bf1828cbf3f01800e33ab32699758468b6:/include/wx/xtistrm.h diff --git a/include/wx/xtistrm.h b/include/wx/xtistrm.h index d905d6715d..3c1a465696 100644 --- a/include/wx/xtistrm.h +++ b/include/wx/xtistrm.h @@ -12,7 +12,7 @@ #ifndef _WX_XTISTRMH__ #define _WX_XTISTRMH__ -#if defined(__GNUG__) && !defined(__APPLE__) +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma interface "xtistrm.h" #endif @@ -32,10 +32,175 @@ const int wxNullObjectID = -1 ; // listed below. /* -Main interface for streaming out an object to XML. +Main interfaces for streaming out objects. */ -void WriteComponent(wxObject *Object, const wxClassInfo *ClassInfo, wxXmlNode *parent, const wxString& nodeName ); +// ---------------------------------------------------------------------------- +// wxPersister +// +// This class will be asked during the streaming-out process about every single +// property or object instance. It can veto streaming out by returning false +// or modify the value before it is streamed-out. +// ---------------------------------------------------------------------------- + +class wxWriter ; +class wxReader ; + +class wxPersister +{ +public : + // will be called before an object is written, may veto by returning false + virtual bool BeforeWriteObject( wxWriter *WXUNUSED(writer) , const wxObject *WXUNUSED(object) , const wxClassInfo *WXUNUSED(classInfo) ) { return true ; } + + // will be called after this object has been written, may be needed for adjusting stacks + virtual void AfterWriteObject( wxWriter *WXUNUSED(writer) , const wxObject *WXUNUSED(object) , const wxClassInfo *WXUNUSED(classInfo) ) {} + + // will be called before a property gets written, may change the value , eg replace a concrete wxSize by wxSize( -1 , -1 ) or veto + // writing that property at all by returning false + virtual bool BeforeWriteProperty( wxWriter *WXUNUSED(writer) , const wxPropertyInfo *WXUNUSED(propInfo) , wxxVariant &WXUNUSED(value) ) { return true ; } + + // will be called before a property gets written, may change the value , eg replace a concrete wxSize by wxSize( -1 , -1 ) or veto + // writing that property at all by returning false + virtual bool BeforeWriteProperty( wxWriter *WXUNUSED(writer) , const wxPropertyInfo *WXUNUSED(propInfo) , wxxVariantArray &WXUNUSED(value) ) { return true ; } + + // will be called after a property has been written out, may be needed for adjusting stacks + virtual void AfterWriteProperty( wxWriter *WXUNUSED(writer) , const wxPropertyInfo *WXUNUSED(propInfo) ) {} + + // will be called before this delegate gets written + virtual bool BeforeWriteDelegate( wxWriter *WXUNUSED(writer) , const wxObject *WXUNUSED(object), const wxClassInfo* WXUNUSED(classInfo) , const wxPropertyInfo *WXUNUSED(propInfo) , + const wxObject *&WXUNUSED(eventSink) , const wxHandlerInfo* &WXUNUSED(handlerInfo) ) { return true ; } + + virtual void AfterWriteDelegate( wxWriter *WXUNUSED(writer) , const wxObject *WXUNUSED(object), const wxClassInfo* WXUNUSED(classInfo) , const wxPropertyInfo *WXUNUSED(propInfo) , + const wxObject *&WXUNUSED(eventSink) , const wxHandlerInfo* &WXUNUSED(handlerInfo) ) { } +} ; + +class wxWriter : public wxObject +{ +public : + wxWriter() ; + ~wxWriter() ; + + // with this call you start writing out a new top-level object + void WriteObject(const wxObject *object, const wxClassInfo *classInfo , wxPersister *persister , const wxString &name ) ; + + // + // Managing the object identity table a.k.a context + // + // these methods make sure that no object gets written twice, because sometimes multiple calls to the WriteObject will be + // made without wanting to have duplicate objects written, the object identity table will be reset manually + + virtual void ClearObjectContext() ; + + // gets the object Id for a passed in object in the context + int GetObjectID(const wxObject *obj) ; + + // returns true if this object has already been written in this context + bool IsObjectKnown( const wxObject *obj ) ; + + // + // streaming callbacks + // + // these callbacks really write out the values in the stream format + + // begins writing out a new toplevel entry which has the indicated unique name + virtual void DoBeginWriteTopLevelEntry( const wxString &name ) = 0 ; + + // ends writing out a new toplevel entry which has the indicated unique name + virtual void DoEndWriteTopLevelEntry( const wxString &name ) = 0 ; + + // start of writing an object having the passed in ID + virtual void DoBeginWriteObject(const wxObject *object, const wxClassInfo *classInfo, int objectID ) = 0 ; + + // end of writing an toplevel object name param is used for unique identification within the container + virtual void DoEndWriteObject(const wxObject *object, const wxClassInfo *classInfo, int objectID ) = 0 ; + + // writes a simple property in the stream format + virtual void DoWriteSimpleType( wxxVariant &value ) = 0 ; + + // start of writing a complex property into the stream ( + virtual void DoBeginWriteProperty( const wxPropertyInfo *propInfo ) = 0 ; + + // end of writing a complex property into the stream + virtual void DoEndWriteProperty( const wxPropertyInfo *propInfo ) = 0; + + virtual void DoBeginWriteElement() = 0 ; + virtual void DoEndWriteElement() = 0 ; + // insert an object reference to an already written object + virtual void DoWriteRepeatedObject( int objectID ) = 0 ; + + // insert a null reference + virtual void DoWriteNullObject() = 0 ; + + // writes a delegate in the stream format + virtual void DoWriteDelegate( const wxObject *object, const wxClassInfo* classInfo , const wxPropertyInfo *propInfo , + const wxObject *eventSink , int sinkObjectID , const wxClassInfo* eventSinkClassInfo , const wxHandlerInfo* handlerIndo ) = 0; +private : + + struct wxWriterInternal ; + wxWriterInternal* m_data ; + + struct wxWriterInternalPropertiesData ; + + void WriteAllProperties( const wxObject * obj , const wxClassInfo* ci , wxPersister *persister, wxWriterInternalPropertiesData * data ) ; + void WriteObject(const wxObject *object, const wxClassInfo *classInfo , wxPersister *persister , bool isEmbedded) ; + void FindConnectEntry(const wxWindow * evSource,const wxDelegateTypeInfo* dti, const wxObject* &sink , const wxHandlerInfo *&handler) ; +} ; + +class wxXmlWriter : public wxWriter +{ +public : + + wxXmlWriter( wxXmlNode * parent ) ; + ~wxXmlWriter() ; + + // + // streaming callbacks + // + // these callbacks really write out the values in the stream format + // + + // + // streaming callbacks + // + // these callbacks really write out the values in the stream format + + // begins writing out a new toplevel entry which has the indicated unique name + virtual void DoBeginWriteTopLevelEntry( const wxString &name ) ; + + // ends writing out a new toplevel entry which has the indicated unique name + virtual void DoEndWriteTopLevelEntry( const wxString &name ) ; + + // start of writing an object having the passed in ID + virtual void DoBeginWriteObject(const wxObject *object, const wxClassInfo *classInfo, int objectID ) ; + + // end of writing an toplevel object name param is used for unique identification within the container + virtual void DoEndWriteObject(const wxObject *object, const wxClassInfo *classInfo, int objectID ) ; + + // writes a simple property in the stream format + virtual void DoWriteSimpleType( wxxVariant &value ) ; + + // start of writing a complex property into the stream ( + virtual void DoBeginWriteProperty( const wxPropertyInfo *propInfo ) ; + + // end of writing a complex property into the stream + virtual void DoEndWriteProperty( const wxPropertyInfo *propInfo ) ; + + virtual void DoBeginWriteElement() ; + virtual void DoEndWriteElement() ; + + // insert an object reference to an already written object + virtual void DoWriteRepeatedObject( int objectID ) ; + + // insert a null reference + virtual void DoWriteNullObject() ; + + // writes a delegate in the stream format + virtual void DoWriteDelegate( const wxObject *object, const wxClassInfo* classInfo , const wxPropertyInfo *propInfo , + const wxObject *eventSink , int sinkObjectID , const wxClassInfo* eventSinkClassInfo , const wxHandlerInfo* handlerIndo ) ; +private : + struct wxXmlWriterInternal ; + wxXmlWriterInternal* m_data ; +} ; /* Streaming callbacks for depersisting XML to code, or running objects @@ -53,6 +218,7 @@ class wxReader : public wxObject public : wxReader() ; ~wxReader() ; + // the only thing wxReader knows about is the class info by object ID wxClassInfo *GetObjectClassInfo(int objectID) ; bool HasObjectClassInfo( int objectID ) ; @@ -61,7 +227,7 @@ public : // Reads the component the reader is pointed at from the underlying format. // The return value is the root object ID, which can // then be used to ask the depersister about that object - virtual int ReadObject( wxDepersister *depersist ) = 0 ; + virtual int ReadObject( const wxString &name , wxDepersister *depersist ) = 0 ; private : struct wxReaderInternal; @@ -81,14 +247,14 @@ public: // Reads a component from XML. The return value is the root object ID, which can // then be used to ask the depersister about that object - int ReadObject(wxDepersister *callbacks); + virtual int ReadObject( const wxString &name , wxDepersister *depersist ) ; private : int ReadComponent(wxXmlNode *parent, wxDepersister *callbacks); - // accessor is only used as a temporary measure + // read the content of this node (simple type) and return the corresponding value wxxVariant ReadValue(wxXmlNode *Node, - wxPropertyAccessor *accessor ); + const wxTypeInfo *type ); wxXmlNode * m_parent ; }; @@ -102,37 +268,48 @@ class wxDepersister { public : // allocate the new object on the heap, that object will have the passed in ID - virtual void AllocateObject(int ObjectID, wxClassInfo *ClassInfo) = 0; + virtual void AllocateObject(int objectID, wxClassInfo *classInfo) = 0; - // initialize the already allocated object having the ID ObjectID with the Create method + // initialize the already allocated object having the ID objectID with the Create method // creation parameters which are objects are having their Ids passed in objectIDValues // having objectId <> wxInvalidObjectID - virtual void CreateObject(int ObjectID, - const wxClassInfo *ClassInfo, - int ParamCount, + virtual void CreateObject(int objectID, + const wxClassInfo *classInfo, + int paramCount, wxxVariant *VariantValues , int *objectIDValues , const wxClassInfo **objectClassInfos ) = 0; - // destroy the heap-allocated object having the ID ObjectID, this may be used if an object + // destroy the heap-allocated object having the ID objectID, this may be used if an object // is embedded in another object and set via value semantics, so the intermediate // object can be destroyed after safely - virtual void DestroyObject(int ObjectID, wxClassInfo *ClassInfo) = 0; + virtual void DestroyObject(int objectID, wxClassInfo *classInfo) = 0; // set the corresponding property - virtual void SetProperty(int ObjectID, - const wxClassInfo *ClassInfo, - const wxPropertyInfo* PropertyInfo , + virtual void SetProperty(int objectID, + const wxClassInfo *classInfo, + const wxPropertyInfo* propertyInfo , const wxxVariant &VariantValue) = 0; // sets the corresponding property (value is an object) - virtual void SetPropertyAsObject(int ObjectId, - const wxClassInfo *ClassInfo, - const wxPropertyInfo* PropertyInfo , + virtual void SetPropertyAsObject(int objectID, + const wxClassInfo *classInfo, + const wxPropertyInfo* propertyInfo , int valueObjectId) = 0; + // adds an element to a property collection + virtual void AddToPropertyCollection( int objectID , + const wxClassInfo *classInfo, + const wxPropertyInfo* propertyInfo , + const wxxVariant &VariantValue) = 0; + + // sets the corresponding property (value is an object) + virtual void AddToPropertyCollectionAsObject(int objectID, + const wxClassInfo *classInfo, + const wxPropertyInfo* propertyInfo , + int valueObjectId) = 0; // sets the corresponding event handler virtual void SetConnect(int EventSourceObjectID, @@ -162,19 +339,19 @@ public : // allocate the new object on the heap, that object will have the passed in ID virtual void AllocateObject(int objectID, wxClassInfo *classInfo) ; - // initialize the already allocated object having the ID ObjectID with the Create method + // initialize the already allocated object having the ID objectID with the Create method // creation parameters which are objects are having their Ids passed in objectIDValues // having objectId <> wxInvalidObjectID - virtual void CreateObject(int ObjectID, - const wxClassInfo *ClassInfo, - int ParamCount, + virtual void CreateObject(int objectID, + const wxClassInfo *classInfo, + int paramCount, wxxVariant *VariantValues , int *objectIDValues, const wxClassInfo **objectClassInfos ) ; - // destroy the heap-allocated object having the ID ObjectID, this may be used if an object + // destroy the heap-allocated object having the ID objectID, this may be used if an object // is embedded in another object and set via value semantics, so the intermediate // object can be destroyed after safely virtual void DestroyObject(int objectID, wxClassInfo *classInfo) ; @@ -191,6 +368,17 @@ public : const wxPropertyInfo* propertyInfo , int valueObjectId) ; + // adds an element to a property collection + virtual void AddToPropertyCollection( int objectID , + const wxClassInfo *classInfo, + const wxPropertyInfo* propertyInfo , + const wxxVariant &VariantValue) ; + + // sets the corresponding property (value is an object) + virtual void AddToPropertyCollectionAsObject(int objectID, + const wxClassInfo *classInfo, + const wxPropertyInfo* propertyInfo , + int valueObjectId) ; // sets the corresponding event handler virtual void SetConnect(int eventSourceObjectID, @@ -222,7 +410,7 @@ public: // allocate the new object on the heap, that object will have the passed in ID virtual void AllocateObject(int objectID, wxClassInfo *classInfo) ; - // initialize the already allocated object having the ID ObjectID with the Create method + // initialize the already allocated object having the ID objectID with the Create method // creation parameters which are objects are having their Ids passed in objectIDValues // having objectId <> wxInvalidObjectID @@ -234,7 +422,7 @@ public: const wxClassInfo **objectClassInfos ) ; - // destroy the heap-allocated object having the ID ObjectID, this may be used if an object + // destroy the heap-allocated object having the ID objectID, this may be used if an object // is embedded in another object and set via value semantics, so the intermediate // object can be destroyed after safely virtual void DestroyObject(int objectID, wxClassInfo *classInfo) ; @@ -251,6 +439,17 @@ public: const wxPropertyInfo* propertyInfo , int valueObjectId) ; + // adds an element to a property collection + virtual void AddToPropertyCollection( int objectID , + const wxClassInfo *classInfo, + const wxPropertyInfo* propertyInfo , + const wxxVariant &VariantValue) ; + + // sets the corresponding property (value is an object) + virtual void AddToPropertyCollectionAsObject(int objectID, + const wxClassInfo *classInfo, + const wxPropertyInfo* propertyInfo , + int valueObjectId) ; // sets the corresponding event handler virtual void SetConnect(int eventSourceObjectID, @@ -263,4 +462,4 @@ public: #endif // wxUSE_EXTENDED_RTTI -#endif \ No newline at end of file +#endif