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.
322 lines
11 KiB
322 lines
11 KiB
6 years ago
|
/***************************************************************
|
||
|
* Name: PropertyIO.cpp
|
||
|
* Purpose: Declares data types I/O and conversion functions
|
||
|
* Author: Michal Bližňák (michal.bliznak@tiscali.cz)
|
||
|
* Created: 2007-10-28
|
||
|
* Copyright: Michal Bližňák
|
||
|
* License: wxWidgets license (www.wxwidgets.org)
|
||
|
* Notes:
|
||
|
**************************************************************/
|
||
|
|
||
|
#ifndef _XSPROPERTYIO_H
|
||
|
#define _XSPROPERTYIO_H
|
||
|
|
||
|
#ifndef WX_PRECOMP
|
||
|
#include <wx/wx.h>
|
||
|
#endif
|
||
|
|
||
|
#include <wx/hashmap.h>
|
||
|
#include <wx/xml/xml.h>
|
||
|
#include <wx/tokenzr.h>
|
||
|
#include <wx/list.h>
|
||
|
|
||
|
#include <wx/wxxmlserializer/Defs.h>
|
||
|
|
||
|
class WXDLLIMPEXP_XS xsProperty;
|
||
|
class WXDLLIMPEXP_XS xsSerializable;
|
||
|
class WXDLLIMPEXP_XS SerializableList;
|
||
|
|
||
|
namespace wxXS
|
||
|
{
|
||
|
WX_DECLARE_OBJARRAY_WITH_DECL(wxRealPoint, RealPointArray, class WXDLLIMPEXP_XS);
|
||
|
WX_DECLARE_LIST_WITH_DECL(wxRealPoint, RealPointList, class WXDLLIMPEXP_XS);
|
||
|
|
||
|
WX_DEFINE_USER_EXPORTED_ARRAY_CHAR(char, CharArray, class WXDLLIMPEXP_XS);
|
||
|
WX_DEFINE_USER_EXPORTED_ARRAY_INT(int, IntArray, class WXDLLIMPEXP_XS);
|
||
|
WX_DEFINE_USER_EXPORTED_ARRAY_LONG(long, LongArray, class WXDLLIMPEXP_XS);
|
||
|
WX_DEFINE_USER_EXPORTED_ARRAY_DOUBLE(double, DoubleArray, class WXDLLIMPEXP_XS);
|
||
|
|
||
|
WX_DECLARE_STRING_HASH_MAP_WITH_DECL(wxString, StringMap, class WXDLLIMPEXP_XS);
|
||
|
}
|
||
|
|
||
|
/*!
|
||
|
* \brief Base class encapsulating a property I/O handler. The class is used by
|
||
|
* the xsSerializable class and is responsiblefor reading and writing of an XML node
|
||
|
* containing property information. Each supported property (data) type should have
|
||
|
* its own I/O handler class. Moreover, all derived classes must provide public functions
|
||
|
* 'static wxString classname::ToString(datatype value)' and 'static datatype classname::
|
||
|
* FromString( const wxString& value )' responsible for conversion between datatype and
|
||
|
* and its string representation (these functions are used internally by class virtual functions.
|
||
|
*/
|
||
|
class WXDLLIMPEXP_XS xsPropertyIO : public wxObject
|
||
|
{
|
||
|
public:
|
||
|
DECLARE_DYNAMIC_CLASS(xsProperty);
|
||
|
|
||
|
/*! \brief Constructor. */
|
||
|
xsPropertyIO(){;}
|
||
|
/*! \brief Destructor. */
|
||
|
virtual ~xsPropertyIO(){;}
|
||
|
|
||
|
/*!
|
||
|
* \brief Read content of the property XML node and store it to given property object.
|
||
|
* \param property Pointer to the target property object
|
||
|
* \param source Pointer to the source XML node
|
||
|
*/
|
||
|
virtual void Read(xsProperty *property, wxXmlNode *source){wxUnusedVar(property);wxUnusedVar(source);}
|
||
|
/*!
|
||
|
* \brief Write content of given property object to target XML node.
|
||
|
* \param property Pointer to the source property object
|
||
|
* \param target Pointer to the target XML node
|
||
|
*/
|
||
|
virtual void Write(xsProperty *property, wxXmlNode *target){wxUnusedVar(property);wxUnusedVar(target);}
|
||
|
/*!
|
||
|
* \brief Get textual representation of current property value.
|
||
|
* \param property Pointer to the source property object
|
||
|
* \return Textual representation of property's value
|
||
|
*/
|
||
|
virtual wxString GetValueStr(xsProperty *property){wxUnusedVar(property);return wxT("");}
|
||
|
/*!
|
||
|
* \brief Set value defined by its textual representation to given property.
|
||
|
* \param property Pointer to the target property object
|
||
|
* \param valstr Textual representation of given value
|
||
|
*/
|
||
|
virtual void SetValueStr(xsProperty *property, const wxString& valstr){wxUnusedVar(property); wxUnusedVar(valstr);}
|
||
|
|
||
|
/*!
|
||
|
* \brief Create new XML node of given name and value and assign it to the given
|
||
|
* parent XML node.
|
||
|
* \param parent Pointer to parent XML node
|
||
|
* \param name Name of new XML node
|
||
|
* \param value Content of new XML node
|
||
|
* \param type Type of new XML (content) node
|
||
|
*/
|
||
|
static wxXmlNode* AddPropertyNode(wxXmlNode* parent, const wxString& name, const wxString& value, wxXmlNodeType type = wxXML_TEXT_NODE );
|
||
|
|
||
|
protected:
|
||
|
|
||
|
/*!
|
||
|
* \brief Append info about the source property to given XML node.
|
||
|
* \param source Pointer to the source property
|
||
|
* \param target Pointer to modified XML node
|
||
|
*/
|
||
|
void AppendPropertyType(xsProperty *source, wxXmlNode *target);
|
||
|
};
|
||
|
|
||
|
/*!
|
||
|
* \brief Macro suitable for declaration of new property I/O handler
|
||
|
* \param datatype Property's data type
|
||
|
* \param name Handler class name
|
||
|
*/
|
||
|
#define XS_DECLARE_IO_HANDLER(datatype, name) \
|
||
|
class name : public xsPropertyIO \
|
||
|
{ \
|
||
|
public: \
|
||
|
DECLARE_DYNAMIC_CLASS(name); \
|
||
|
name(){;} \
|
||
|
virtual ~name(){;} \
|
||
|
\
|
||
|
virtual void Read(xsProperty *property, wxXmlNode *source); \
|
||
|
virtual void Write(xsProperty *property, wxXmlNode *target); \
|
||
|
virtual wxString GetValueStr(xsProperty *property); \
|
||
|
virtual void SetValueStr(xsProperty *property, const wxString& valstr); \
|
||
|
static wxString ToString(const datatype& value); \
|
||
|
static datatype FromString(const wxString& value); \
|
||
|
}; \
|
||
|
|
||
|
/*!
|
||
|
* \brief Macro suitable for declaration of exported new property I/O handler
|
||
|
* \param datatype Property's data type
|
||
|
* \param name Handler class name
|
||
|
* \param decoration Class decoration
|
||
|
*/
|
||
|
#define XS_DECLARE_EXPORTED_IO_HANDLER(datatype, name, decoration) \
|
||
|
class decoration name : public xsPropertyIO \
|
||
|
{ \
|
||
|
public: \
|
||
|
DECLARE_DYNAMIC_CLASS(name); \
|
||
|
name(){;} \
|
||
|
virtual ~name(){;} \
|
||
|
\
|
||
|
virtual void Read(xsProperty *property, wxXmlNode *source); \
|
||
|
virtual void Write(xsProperty *property, wxXmlNode *target); \
|
||
|
virtual wxString GetValueStr(xsProperty *property); \
|
||
|
virtual void SetValueStr(xsProperty *property, const wxString& valstr); \
|
||
|
static wxString ToString(const datatype& value); \
|
||
|
static datatype FromString(const wxString& value); \
|
||
|
}; \
|
||
|
|
||
|
/*!
|
||
|
* \brief Macro suitable for implementation of new property I/O handler
|
||
|
* \param datatype Property's data type
|
||
|
* \param name Handler class name
|
||
|
*/
|
||
|
#define XS_DEFINE_IO_HANDLER(datatype, name) \
|
||
|
IMPLEMENT_DYNAMIC_CLASS(name, xsPropertyIO); \
|
||
|
\
|
||
|
void name::Read(xsProperty *property, wxXmlNode *source) \
|
||
|
{ \
|
||
|
*((datatype*)property->m_pSourceVariable) = FromString(source->GetNodeContent()); \
|
||
|
} \
|
||
|
\
|
||
|
void name::Write(xsProperty *property, wxXmlNode *target) \
|
||
|
{ \
|
||
|
wxString val = ToString(*((datatype*)property->m_pSourceVariable)); \
|
||
|
\
|
||
|
if(val != property->m_sDefaultValueStr) \
|
||
|
{ \
|
||
|
wxXmlNode *newNode = AddPropertyNode(target, wxT("property"), val); \
|
||
|
AppendPropertyType(property, newNode); \
|
||
|
} \
|
||
|
} \
|
||
|
\
|
||
|
wxString name::GetValueStr(xsProperty *property) \
|
||
|
{ \
|
||
|
return ToString(*((datatype*)property->m_pSourceVariable)); \
|
||
|
} \
|
||
|
\
|
||
|
void name::SetValueStr(xsProperty *property, const wxString& valstr) \
|
||
|
{ \
|
||
|
*((datatype*)property->m_pSourceVariable) = FromString(valstr); \
|
||
|
} \
|
||
|
|
||
|
/*!
|
||
|
* \brief Property class encapsulating I/O functions used by 'wxString' properties.
|
||
|
*/
|
||
|
XS_DECLARE_EXPORTED_IO_HANDLER(wxString, xsStringPropIO, WXDLLIMPEXP_XS);
|
||
|
|
||
|
/*!
|
||
|
* \brief Property class encapsulating I/O functions used by 'wxChar' properties.
|
||
|
*/
|
||
|
XS_DECLARE_EXPORTED_IO_HANDLER(wxChar, xsCharPropIO, WXDLLIMPEXP_XS);
|
||
|
|
||
|
/*!
|
||
|
* \brief Property class encapsulating I/O functions used by 'long' properties.
|
||
|
*/
|
||
|
XS_DECLARE_EXPORTED_IO_HANDLER(long, xsLongPropIO, WXDLLIMPEXP_XS);
|
||
|
|
||
|
/*!
|
||
|
* \brief Property class encapsulating I/O functions used by 'int' properties.
|
||
|
*/
|
||
|
XS_DECLARE_EXPORTED_IO_HANDLER(int, xsIntPropIO, WXDLLIMPEXP_XS);
|
||
|
|
||
|
/*!
|
||
|
* \brief Property class encapsulating I/O functions used by 'bool' properties.
|
||
|
*/
|
||
|
XS_DECLARE_EXPORTED_IO_HANDLER(bool, xsBoolPropIO, WXDLLIMPEXP_XS);
|
||
|
|
||
|
/*!
|
||
|
* \brief Property class encapsulating I/O functions used by 'double' properties.
|
||
|
*/
|
||
|
XS_DECLARE_EXPORTED_IO_HANDLER(double, xsDoublePropIO, WXDLLIMPEXP_XS);
|
||
|
|
||
|
/*!
|
||
|
* \brief Property class encapsulating I/O functions used by 'float' properties.
|
||
|
*/
|
||
|
XS_DECLARE_EXPORTED_IO_HANDLER(float, xsFloatPropIO, WXDLLIMPEXP_XS);
|
||
|
|
||
|
/*!
|
||
|
* \brief Property class encapsulating I/O functions used by 'wxPoint' properties.
|
||
|
*/
|
||
|
XS_DECLARE_EXPORTED_IO_HANDLER(wxPoint, xsPointPropIO, WXDLLIMPEXP_XS);
|
||
|
|
||
|
/*!
|
||
|
* \brief Property class encapsulating I/O functions used by 'wxSize' properties.
|
||
|
*/
|
||
|
XS_DECLARE_EXPORTED_IO_HANDLER(wxSize, xsSizePropIO, WXDLLIMPEXP_XS);
|
||
|
|
||
|
/*!
|
||
|
* \brief Property class encapsulating I/O functions used by 'wxRealPoint' properties.
|
||
|
*/
|
||
|
XS_DECLARE_EXPORTED_IO_HANDLER(wxRealPoint, xsRealPointPropIO, WXDLLIMPEXP_XS);
|
||
|
|
||
|
/*!
|
||
|
* \brief Property class encapsulating I/O functions used by 'wxColour' properties.
|
||
|
*/
|
||
|
XS_DECLARE_EXPORTED_IO_HANDLER(wxColour, xsColourPropIO, WXDLLIMPEXP_XS);
|
||
|
|
||
|
/*!
|
||
|
* \brief Property class encapsulating I/O functions used by 'wxPen' properties.
|
||
|
*/
|
||
|
XS_DECLARE_EXPORTED_IO_HANDLER(wxPen, xsPenPropIO, WXDLLIMPEXP_XS);
|
||
|
|
||
|
/*!
|
||
|
* \brief Property class encapsulating I/O functions used by 'wxBrush' properties.
|
||
|
*/
|
||
|
XS_DECLARE_EXPORTED_IO_HANDLER(wxBrush, xsBrushPropIO, WXDLLIMPEXP_XS);
|
||
|
|
||
|
/*!
|
||
|
* \brief Property class encapsulating I/O functions used by 'wxFont' properties.
|
||
|
*/
|
||
|
XS_DECLARE_EXPORTED_IO_HANDLER(wxFont, xsFontPropIO, WXDLLIMPEXP_XS);
|
||
|
|
||
|
/*!
|
||
|
* \brief Property class encapsulating I/O functions used by 'wxArrayString' properties.
|
||
|
*/
|
||
|
XS_DECLARE_EXPORTED_IO_HANDLER(wxArrayString, xsArrayStringPropIO, WXDLLIMPEXP_XS);
|
||
|
|
||
|
/*!
|
||
|
* \brief Property class encapsulating I/O functions used by 'CharArray' properties.
|
||
|
*/
|
||
|
XS_DECLARE_EXPORTED_IO_HANDLER(wxXS::CharArray, xsArrayCharPropIO, WXDLLIMPEXP_XS);
|
||
|
|
||
|
/*!
|
||
|
* \brief Property class encapsulating I/O functions used by 'IntArray' properties.
|
||
|
*/
|
||
|
XS_DECLARE_EXPORTED_IO_HANDLER(wxXS::IntArray, xsArrayIntPropIO, WXDLLIMPEXP_XS);
|
||
|
|
||
|
/*!
|
||
|
* \brief Property class encapsulating I/O functions used by 'LongArray' properties.
|
||
|
*/
|
||
|
XS_DECLARE_EXPORTED_IO_HANDLER(wxXS::LongArray, xsArrayLongPropIO, WXDLLIMPEXP_XS);
|
||
|
|
||
|
/*!
|
||
|
* \brief Property class encapsulating I/O functions used by 'DoubleArray' properties.
|
||
|
*/
|
||
|
XS_DECLARE_EXPORTED_IO_HANDLER(wxXS::DoubleArray, xsArrayDoublePropIO, WXDLLIMPEXP_XS);
|
||
|
|
||
|
/*!
|
||
|
* \brief Property class encapsulating I/O functions used by 'RealPointArray' (array of
|
||
|
* integer values) properties.
|
||
|
*/
|
||
|
XS_DECLARE_EXPORTED_IO_HANDLER(wxXS::RealPointArray, xsArrayRealPointPropIO, WXDLLIMPEXP_XS);
|
||
|
|
||
|
/*!
|
||
|
* \brief Property class encapsulating I/O functions used by 'ListRealPoint' (list of
|
||
|
* wxRealPoint objects) properties.
|
||
|
*/
|
||
|
XS_DECLARE_EXPORTED_IO_HANDLER(wxXS::RealPointList, xsListRealPointPropIO, WXDLLIMPEXP_XS);
|
||
|
|
||
|
/*!
|
||
|
* \brief Property class encapsulating I/O functions used by 'SerializableList' (list of
|
||
|
* xsSerializable objects) properties.
|
||
|
*/
|
||
|
XS_DECLARE_EXPORTED_IO_HANDLER(SerializableList, xsListSerializablePropIO, WXDLLIMPEXP_XS);
|
||
|
|
||
|
/*!
|
||
|
* \brief Property class encapsulating I/O functions used by 'serializabledynamic' (xsSerializable
|
||
|
* dynamic class objects which are created during the deserialization process) properties.
|
||
|
*/
|
||
|
XS_DECLARE_EXPORTED_IO_HANDLER(xsSerializable, xsDynObjPropIO, WXDLLIMPEXP_XS);
|
||
|
|
||
|
/*!
|
||
|
* \brief Property class encapsulating I/O functions used by 'serializabledynamicnocreate' (already
|
||
|
* existing xsSerializable dynamic class objects) properties.
|
||
|
*/
|
||
|
XS_DECLARE_EXPORTED_IO_HANDLER(xsSerializable, xsDynNCObjPropIO, WXDLLIMPEXP_XS);
|
||
|
|
||
|
/*!
|
||
|
* \brief Property class encapsulating I/O functions used by 'serializablestatic' (static
|
||
|
* xsSerializable class objects) properties.
|
||
|
*/
|
||
|
XS_DECLARE_EXPORTED_IO_HANDLER(xsSerializable, xsStaticObjPropIO, WXDLLIMPEXP_XS);
|
||
|
|
||
|
/*!
|
||
|
* \brief Property class encapsulating I/O functions used by 'mapstring' (string hash map) properties.
|
||
|
*/
|
||
|
XS_DECLARE_EXPORTED_IO_HANDLER(wxXS::StringMap, xsMapStringPropIO, WXDLLIMPEXP_XS);
|
||
|
|
||
|
WX_DECLARE_HASH_MAP( wxString, xsPropertyIO*, wxStringHash, wxStringEqual, PropertyIOMap );
|
||
|
|
||
|
#endif //_XSPROPERTYIO_H
|