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.
321 lines
11 KiB
321 lines
11 KiB
/*************************************************************** |
|
* 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
|
|
|