1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: wxVariant class, container for any type
4 // Author: Julian Smart
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
13 #pragma implementation "variant.h"
16 // For compilers that support precompilation, includes "wx/wx.h".
17 #include "wx/wxprec.h"
23 #if wxUSE_STD_IOSTREAM
31 #if defined(__MWERKS__) && __MSL__ >= 0x6000
36 #include "wx/stream.h"
37 #include "wx/txtstrm.h"
40 #include "wx/string.h"
41 #include "wx/tokenzr.h"
43 #include "wx/variant.h"
45 IMPLEMENT_ABSTRACT_CLASS(wxVariantData, wxObject)
47 wxVariant WXDLLIMPEXP_BASE wxNullVariant;
53 class WXDLLIMPEXP_BASE wxVariantDataList: public wxVariantData
55 DECLARE_DYNAMIC_CLASS(wxVariantDataList)
57 wxVariantDataList() {}
58 wxVariantDataList(const wxList& list);
61 wxList& GetValue() const { return (wxList&) m_value; }
62 void SetValue(const wxList& value) ;
64 virtual void Copy(wxVariantData& data);
65 virtual bool Eq(wxVariantData& data) const;
66 #if wxUSE_STD_IOSTREAM
67 virtual bool Write(wxSTD ostream& str) const;
69 virtual bool Write(wxString& str) const;
70 #if wxUSE_STD_IOSTREAM
71 virtual bool Read(wxSTD istream& str);
73 virtual bool Read(wxString& str);
74 virtual wxString GetType() const { return wxT("list"); };
82 IMPLEMENT_DYNAMIC_CLASS(wxVariantDataList, wxVariantData)
84 wxVariantDataList::wxVariantDataList(const wxList& list)
89 wxVariantDataList::~wxVariantDataList()
94 void wxVariantDataList::SetValue(const wxList& value)
97 wxList::compatibility_iterator node = value.GetFirst();
100 wxVariant* var = (wxVariant*) node->GetData();
101 m_value.Append(new wxVariant(*var));
102 node = node->GetNext();
106 void wxVariantDataList::Clear()
108 wxList::compatibility_iterator node = m_value.GetFirst();
111 wxVariant* var = (wxVariant*) node->GetData();
113 node = node->GetNext();
118 void wxVariantDataList::Copy(wxVariantData& data)
120 wxASSERT_MSG( (data.GetType() == wxT("list")), wxT("wxVariantDataList::Copy: Can't copy to this type of data") );
122 wxVariantDataList& listData = (wxVariantDataList&) data;
125 wxList::compatibility_iterator node = m_value.GetFirst();
128 wxVariant* var = (wxVariant*) node->GetData();
129 listData.m_value.Append(new wxVariant(*var));
130 node = node->GetNext();
134 bool wxVariantDataList::Eq(wxVariantData& data) const
136 wxASSERT_MSG( (data.GetType() == wxT("list")), wxT("wxVariantDataList::Eq: argument mismatch") );
138 wxVariantDataList& listData = (wxVariantDataList&) data;
139 wxList::compatibility_iterator node1 = m_value.GetFirst();
140 wxList::compatibility_iterator node2 = listData.GetValue().GetFirst();
141 while (node1 && node2)
143 wxVariant* var1 = (wxVariant*) node1->GetData();
144 wxVariant* var2 = (wxVariant*) node2->GetData();
145 if ((*var1) != (*var2))
147 node1 = node1->GetNext();
148 node2 = node2->GetNext();
150 if (node1 || node2) return FALSE;
154 #if wxUSE_STD_IOSTREAM
155 bool wxVariantDataList::Write(wxSTD ostream& str) const
159 str << (const char*) s.mb_str();
164 bool wxVariantDataList::Write(wxString& str) const
167 wxList::compatibility_iterator node = m_value.GetFirst();
170 wxVariant* var = (wxVariant*) node->GetData();
171 if (node != m_value.GetFirst())
174 str += var->MakeString();
175 node = node->GetNext();
181 #if wxUSE_STD_IOSTREAM
182 bool wxVariantDataList::Read(wxSTD istream& WXUNUSED(str))
184 wxFAIL_MSG(wxT("Unimplemented"));
190 bool wxVariantDataList::Read(wxString& WXUNUSED(str))
192 wxFAIL_MSG(wxT("Unimplemented"));
198 * wxVariantDataStringList
201 class WXDLLIMPEXP_BASE wxVariantDataStringList: public wxVariantData
203 DECLARE_DYNAMIC_CLASS(wxVariantDataStringList)
205 wxVariantDataStringList() {}
206 wxVariantDataStringList(const wxStringList& list) { m_value = list; }
208 wxStringList& GetValue() const { return (wxStringList&) m_value; }
209 void SetValue(const wxStringList& value);
211 virtual void Copy(wxVariantData& data);
212 virtual bool Eq(wxVariantData& data) const;
213 #if wxUSE_STD_IOSTREAM
214 virtual bool Write(wxSTD ostream& str) const;
216 virtual bool Write(wxString& str) const;
217 #if wxUSE_STD_IOSTREAM
218 virtual bool Read(wxSTD istream& str);
220 virtual bool Read(wxString& str);
221 virtual wxString GetType() const { return wxT("stringlist"); };
224 wxStringList m_value;
227 IMPLEMENT_DYNAMIC_CLASS(wxVariantDataStringList, wxVariantData)
229 void wxVariantDataStringList::SetValue(const wxStringList& value)
234 void wxVariantDataStringList::Copy(wxVariantData& data)
236 wxASSERT_MSG( (data.GetType() == wxT("stringlist")), wxT("wxVariantDataStringList::Copy: Can't copy to this type of data") );
238 wxVariantDataStringList& listData = (wxVariantDataStringList&) data;
240 listData.m_value = m_value ;
243 bool wxVariantDataStringList::Eq(wxVariantData& data) const
245 wxASSERT_MSG( (data.GetType() == wxT("stringlist")), wxT("wxVariantDataStringList::Eq: argument mismatch") );
247 wxVariantDataStringList& listData = (wxVariantDataStringList&) data;
248 wxStringList::compatibility_iterator node1 = m_value.GetFirst();
249 wxStringList::compatibility_iterator node2 = listData.GetValue().GetFirst();
250 while (node1 && node2)
252 wxString str1 ( node1->GetData() );
253 wxString str2 ( node2->GetData() );
256 node1 = node1->GetNext();
257 node2 = node2->GetNext();
259 if (node1 || node2) return FALSE;
263 #if wxUSE_STD_IOSTREAM
264 bool wxVariantDataStringList::Write(wxSTD ostream& str) const
268 str << (const char*) s.mb_str();
273 bool wxVariantDataStringList::Write(wxString& str) const
276 wxStringList::compatibility_iterator node = m_value.GetFirst();
279 const wxChar* s = node->GetData();
280 if (node != m_value.GetFirst())
283 node = node->GetNext();
289 #if wxUSE_STD_IOSTREAM
290 bool wxVariantDataStringList::Read(wxSTD istream& WXUNUSED(str))
292 wxFAIL_MSG(wxT("Unimplemented"));
298 bool wxVariantDataStringList::Read(wxString& WXUNUSED(str))
300 wxFAIL_MSG(wxT("Unimplemented"));
309 class WXDLLIMPEXP_BASE wxVariantDataLong: public wxVariantData
311 DECLARE_DYNAMIC_CLASS(wxVariantDataLong)
313 wxVariantDataLong() { m_value = 0; }
314 wxVariantDataLong(long value) { m_value = value; }
316 inline long GetValue() const { return m_value; }
317 inline void SetValue(long value) { m_value = value; }
319 virtual void Copy(wxVariantData& data);
320 virtual bool Eq(wxVariantData& data) const;
322 virtual bool Read(wxString& str);
323 virtual bool Write(wxString& str) const;
324 #if wxUSE_STD_IOSTREAM
325 virtual bool Read(wxSTD istream& str);
326 virtual bool Write(wxSTD ostream& str) const;
329 virtual bool Read(wxInputStream& str);
330 virtual bool Write(wxOutputStream &str) const;
331 #endif // wxUSE_STREAMS
333 virtual wxString GetType() const { return wxT("long"); };
339 IMPLEMENT_DYNAMIC_CLASS(wxVariantDataLong, wxVariantData)
341 void wxVariantDataLong::Copy(wxVariantData& data)
343 wxASSERT_MSG( (data.GetType() == wxT("long")), wxT("wxVariantDataLong::Copy: Can't copy to this type of data") );
345 wxVariantDataLong& otherData = (wxVariantDataLong&) data;
347 otherData.m_value = m_value;
350 bool wxVariantDataLong::Eq(wxVariantData& data) const
352 wxASSERT_MSG( (data.GetType() == wxT("long")), wxT("wxVariantDataLong::Eq: argument mismatch") );
354 wxVariantDataLong& otherData = (wxVariantDataLong&) data;
356 return (otherData.m_value == m_value);
359 #if wxUSE_STD_IOSTREAM
360 bool wxVariantDataLong::Write(wxSTD ostream& str) const
364 str << (const char*) s.mb_str();
369 bool wxVariantDataLong::Write(wxString& str) const
371 str.Printf(wxT("%ld"), m_value);
375 #if wxUSE_STD_IOSTREAM
376 bool wxVariantDataLong::Read(wxSTD istream& str)
384 bool wxVariantDataLong::Write(wxOutputStream& str) const
386 wxTextOutputStream s(str);
388 s.Write32((size_t)m_value);
392 bool wxVariantDataLong::Read(wxInputStream& str)
394 wxTextInputStream s(str);
395 m_value = s.Read32();
398 #endif // wxUSE_STREAMS
400 bool wxVariantDataLong::Read(wxString& str)
402 m_value = wxAtol((const wxChar*) str);
410 class WXDLLIMPEXP_BASE wxVariantDataReal: public wxVariantData
412 DECLARE_DYNAMIC_CLASS(wxVariantDataReal)
414 wxVariantDataReal() { m_value = 0.0; }
415 wxVariantDataReal(double value) { m_value = value; }
417 inline double GetValue() const { return m_value; }
418 inline void SetValue(double value) { m_value = value; }
420 virtual void Copy(wxVariantData& data);
421 virtual bool Eq(wxVariantData& data) const;
422 virtual bool Read(wxString& str);
423 #if wxUSE_STD_IOSTREAM
424 virtual bool Write(wxSTD ostream& str) const;
426 virtual bool Write(wxString& str) const;
427 #if wxUSE_STD_IOSTREAM
428 virtual bool Read(wxSTD istream& str);
431 virtual bool Read(wxInputStream& str);
432 virtual bool Write(wxOutputStream &str) const;
433 #endif // wxUSE_STREAMS
434 virtual wxString GetType() const { return wxT("double"); };
440 IMPLEMENT_DYNAMIC_CLASS(wxVariantDataReal, wxVariantData)
442 void wxVariantDataReal::Copy(wxVariantData& data)
444 wxASSERT_MSG( (data.GetType() == wxT("double")), wxT("wxVariantDataReal::Copy: Can't copy to this type of data") );
446 wxVariantDataReal& otherData = (wxVariantDataReal&) data;
448 otherData.m_value = m_value;
451 bool wxVariantDataReal::Eq(wxVariantData& data) const
453 wxASSERT_MSG( (data.GetType() == wxT("double")), wxT("wxVariantDataReal::Eq: argument mismatch") );
455 wxVariantDataReal& otherData = (wxVariantDataReal&) data;
457 return (otherData.m_value == m_value);
460 #if wxUSE_STD_IOSTREAM
461 bool wxVariantDataReal::Write(wxSTD ostream& str) const
465 str << (const char*) s.mb_str();
470 bool wxVariantDataReal::Write(wxString& str) const
472 str.Printf(wxT("%.4f"), m_value);
476 #if wxUSE_STD_IOSTREAM
477 bool wxVariantDataReal::Read(wxSTD istream& str)
485 bool wxVariantDataReal::Write(wxOutputStream& str) const
487 wxTextOutputStream s(str);
488 s.WriteDouble((double)m_value);
492 bool wxVariantDataReal::Read(wxInputStream& str)
494 wxTextInputStream s(str);
495 m_value = (float)s.ReadDouble();
498 #endif // wxUSE_STREAMS
500 bool wxVariantDataReal::Read(wxString& str)
502 m_value = wxAtof((const wxChar*) str);
511 class WXDLLIMPEXP_BASE wxVariantDataBool: public wxVariantData
513 DECLARE_DYNAMIC_CLASS(wxVariantDataBool)
515 wxVariantDataBool() { m_value = 0; }
516 wxVariantDataBool(bool value) { m_value = value; }
518 inline bool GetValue() const { return m_value; }
519 inline void SetValue(bool value) { m_value = value; }
521 virtual void Copy(wxVariantData& data);
522 virtual bool Eq(wxVariantData& data) const;
523 #if wxUSE_STD_IOSTREAM
524 virtual bool Write(wxSTD ostream& str) const;
526 virtual bool Write(wxString& str) const;
527 virtual bool Read(wxString& str);
528 #if wxUSE_STD_IOSTREAM
529 virtual bool Read(wxSTD istream& str);
532 virtual bool Read(wxInputStream& str);
533 virtual bool Write(wxOutputStream& str) const;
534 #endif // wxUSE_STREAMS
535 virtual wxString GetType() const { return wxT("bool"); };
541 IMPLEMENT_DYNAMIC_CLASS(wxVariantDataBool, wxVariantData)
543 void wxVariantDataBool::Copy(wxVariantData& data)
545 wxASSERT_MSG( (data.GetType() == wxT("bool")), wxT("wxVariantDataBool::Copy: Can't copy to this type of data") );
547 wxVariantDataBool& otherData = (wxVariantDataBool&) data;
549 otherData.m_value = m_value;
552 bool wxVariantDataBool::Eq(wxVariantData& data) const
554 wxASSERT_MSG( (data.GetType() == wxT("bool")), wxT("wxVariantDataBool::Eq: argument mismatch") );
556 wxVariantDataBool& otherData = (wxVariantDataBool&) data;
558 return (otherData.m_value == m_value);
561 #if wxUSE_STD_IOSTREAM
562 bool wxVariantDataBool::Write(wxSTD ostream& str) const
566 str << (const char*) s.mb_str();
571 bool wxVariantDataBool::Write(wxString& str) const
573 str.Printf(wxT("%d"), (int) m_value);
577 #if wxUSE_STD_IOSTREAM
578 bool wxVariantDataBool::Read(wxSTD istream& WXUNUSED(str))
580 wxFAIL_MSG(wxT("Unimplemented"));
581 // str >> (long) m_value;
587 bool wxVariantDataBool::Write(wxOutputStream& str) const
589 wxTextOutputStream s(str);
595 bool wxVariantDataBool::Read(wxInputStream& str)
597 wxTextInputStream s(str);
599 m_value = s.Read8() != 0;
602 #endif // wxUSE_STREAMS
604 bool wxVariantDataBool::Read(wxString& str)
606 m_value = (wxAtol((const wxChar*) str) != 0);
615 class WXDLLIMPEXP_BASE wxVariantDataChar: public wxVariantData
617 DECLARE_DYNAMIC_CLASS(wxVariantDataChar)
619 wxVariantDataChar() { m_value = 0; }
620 wxVariantDataChar(char value) { m_value = value; }
622 inline char GetValue() const { return m_value; }
623 inline void SetValue(char value) { m_value = value; }
625 virtual void Copy(wxVariantData& data);
626 virtual bool Eq(wxVariantData& data) const;
627 #if wxUSE_STD_IOSTREAM
628 virtual bool Read(wxSTD istream& str);
629 virtual bool Write(wxSTD ostream& str) const;
631 virtual bool Read(wxString& str);
632 virtual bool Write(wxString& str) const;
634 virtual bool Read(wxInputStream& str);
635 virtual bool Write(wxOutputStream& str) const;
636 #endif // wxUSE_STREAMS
637 virtual wxString GetType() const { return wxT("char"); };
643 IMPLEMENT_DYNAMIC_CLASS(wxVariantDataChar, wxVariantData)
645 void wxVariantDataChar::Copy(wxVariantData& data)
647 wxASSERT_MSG( (data.GetType() == wxT("char")), wxT("wxVariantDataChar::Copy: Can't copy to this type of data") );
649 wxVariantDataChar& otherData = (wxVariantDataChar&) data;
651 otherData.m_value = m_value;
654 bool wxVariantDataChar::Eq(wxVariantData& data) const
656 wxASSERT_MSG( (data.GetType() == wxT("char")), wxT("wxVariantDataChar::Eq: argument mismatch") );
658 wxVariantDataChar& otherData = (wxVariantDataChar&) data;
660 return (otherData.m_value == m_value);
663 #if wxUSE_STD_IOSTREAM
664 bool wxVariantDataChar::Write(wxSTD ostream& str) const
668 str << (const char*) s.mb_str();
673 bool wxVariantDataChar::Write(wxString& str) const
675 str.Printf(wxT("%c"), m_value);
679 #if wxUSE_STD_IOSTREAM
680 bool wxVariantDataChar::Read(wxSTD istream& WXUNUSED(str))
682 wxFAIL_MSG(wxT("Unimplemented"));
689 bool wxVariantDataChar::Write(wxOutputStream& str) const
691 wxTextOutputStream s(str);
697 bool wxVariantDataChar::Read(wxInputStream& str)
699 wxTextInputStream s(str);
704 #endif // wxUSE_STREAMS
706 bool wxVariantDataChar::Read(wxString& str)
708 m_value = str[(size_t)0];
713 * wxVariantDataString
716 #if defined(__BORLANDC__) && defined(__WIN16__)
717 // Change name because of truncation
718 #define wxVariantDataString wxVariantStringData
721 class WXDLLIMPEXP_BASE wxVariantDataString: public wxVariantData
723 #if defined(__BORLANDC__) && defined(__WIN16__)
724 DECLARE_DYNAMIC_CLASS(wxVariantStringData)
726 DECLARE_DYNAMIC_CLASS(wxVariantDataString)
729 wxVariantDataString() { }
730 wxVariantDataString(const wxString& value) { m_value = value; }
732 inline wxString GetValue() const { return m_value; }
733 inline void SetValue(const wxString& value) { m_value = value; }
735 virtual void Copy(wxVariantData& data);
736 virtual bool Eq(wxVariantData& data) const;
737 #if wxUSE_STD_IOSTREAM
738 virtual bool Write(wxSTD ostream& str) const;
740 virtual bool Read(wxString& str);
741 virtual bool Write(wxString& str) const;
742 #if wxUSE_STD_IOSTREAM
743 virtual bool Read(wxSTD istream& str);
746 virtual bool Read(wxInputStream& str);
747 virtual bool Write(wxOutputStream& str) const;
748 #endif // wxUSE_STREAMS
749 virtual wxString GetType() const { return wxT("string"); };
755 void wxVariantDataString::Copy(wxVariantData& data)
757 wxASSERT_MSG( (data.GetType() == wxT("string")), wxT("wxVariantDataString::Copy: Can't copy to this type of data") );
759 wxVariantDataString& otherData = (wxVariantDataString&) data;
761 otherData.m_value = m_value;
764 bool wxVariantDataString::Eq(wxVariantData& data) const
766 wxASSERT_MSG( (data.GetType() == wxT("string")), wxT("wxVariantDataString::Eq: argument mismatch") );
768 wxVariantDataString& otherData = (wxVariantDataString&) data;
770 return (otherData.m_value == m_value);
773 #if wxUSE_STD_IOSTREAM
774 bool wxVariantDataString::Write(wxSTD ostream& str) const
776 str << (const char*) m_value.mb_str();
781 bool wxVariantDataString::Write(wxString& str) const
787 #if wxUSE_STD_IOSTREAM
788 bool wxVariantDataString::Read(wxSTD istream& str)
796 bool wxVariantDataString::Write(wxOutputStream& str) const
798 // why doesn't wxOutputStream::operator<< take "const wxString&"
799 wxTextOutputStream s(str);
800 s.WriteString(m_value);
804 bool wxVariantDataString::Read(wxInputStream& str)
806 wxTextInputStream s(str);
808 m_value = s.ReadString();
811 #endif // wxUSE_STREAMS
813 bool wxVariantDataString::Read(wxString& str)
819 #if defined(__BORLANDC__) && defined(__WIN16__)
820 IMPLEMENT_DYNAMIC_CLASS(wxVariantStringData, wxVariantData)
822 IMPLEMENT_DYNAMIC_CLASS(wxVariantDataString, wxVariantData)
826 * wxVariantDataVoidPtr
829 class wxVariantDataVoidPtr: public wxVariantData
831 DECLARE_DYNAMIC_CLASS(wxVariantDataVoidPtr)
833 wxVariantDataVoidPtr() { }
834 wxVariantDataVoidPtr(void* value) { m_value = value; }
836 inline void* GetValue() const { return m_value; }
837 inline void SetValue(void* value) { m_value = value; }
839 virtual void Copy(wxVariantData& data);
840 virtual bool Eq(wxVariantData& data) const;
841 #if wxUSE_STD_IOSTREAM
842 virtual bool Write(wxSTD ostream& str) const;
844 virtual bool Write(wxString& str) const;
845 #if wxUSE_STD_IOSTREAM
846 virtual bool Read(wxSTD istream& str);
848 virtual bool Read(wxString& str);
849 virtual wxString GetType() const { return wxT("void*"); };
850 virtual wxVariantData* Clone() { return new wxVariantDataVoidPtr; }
855 DECLARE_NO_COPY_CLASS(wxVariantDataVoidPtr)
858 IMPLEMENT_DYNAMIC_CLASS(wxVariantDataVoidPtr, wxVariantData)
860 void wxVariantDataVoidPtr::Copy(wxVariantData& data)
862 wxASSERT_MSG( (data.GetType() == wxT("void*")), wxT("wxVariantDataVoidPtr::Copy: Can't copy to this type of data") );
864 wxVariantDataVoidPtr& otherData = (wxVariantDataVoidPtr&) data;
866 otherData.m_value = m_value;
869 bool wxVariantDataVoidPtr::Eq(wxVariantData& data) const
871 wxASSERT_MSG( (data.GetType() == wxT("void*")), wxT("wxVariantDataVoidPtr::Eq: argument mismatch") );
873 wxVariantDataVoidPtr& otherData = (wxVariantDataVoidPtr&) data;
875 return (otherData.m_value == m_value);
878 #if wxUSE_STD_IOSTREAM
879 bool wxVariantDataVoidPtr::Write(wxSTD ostream& str) const
883 str << (const char*) s.mb_str();
888 bool wxVariantDataVoidPtr::Write(wxString& str) const
890 str.Printf(wxT("%ld"), (long) m_value);
894 #if wxUSE_STD_IOSTREAM
895 bool wxVariantDataVoidPtr::Read(wxSTD istream& WXUNUSED(str))
902 bool wxVariantDataVoidPtr::Read(wxString& WXUNUSED(str))
909 * wxVariantDataWxObjectPtr
912 class wxVariantDataWxObjectPtr: public wxVariantData
914 DECLARE_DYNAMIC_CLASS(wxVariantDataWxObjectPtr)
916 wxVariantDataWxObjectPtr() { }
917 wxVariantDataWxObjectPtr(wxObject* value) { m_value = value; }
919 inline wxObject* GetValue() const { return m_value; }
920 inline void SetValue(wxObject* value) { m_value = value; }
922 virtual void Copy(wxVariantData& data);
923 virtual bool Eq(wxVariantData& data) const;
924 #if wxUSE_STD_IOSTREAM
925 virtual bool Write(wxSTD ostream& str) const;
927 virtual bool Write(wxString& str) const;
928 #if wxUSE_STD_IOSTREAM
929 virtual bool Read(wxSTD istream& str);
931 virtual bool Read(wxString& str);
932 virtual wxString GetType() const ;
933 virtual wxVariantData* Clone() { return new wxVariantDataWxObjectPtr; }
935 virtual wxClassInfo* GetValueClassInfo() ;
939 DECLARE_NO_COPY_CLASS(wxVariantDataWxObjectPtr)
942 IMPLEMENT_DYNAMIC_CLASS(wxVariantDataWxObjectPtr, wxVariantData)
944 void wxVariantDataWxObjectPtr::Copy(wxVariantData& data)
946 wxASSERT_MSG( wxIsKindOf((&data), wxVariantDataWxObjectPtr) ,\
947 wxT("wxVariantDataWxObjectPtr::Copy: Can't copy to this type of data") \
950 wxVariantDataWxObjectPtr& otherData = (wxVariantDataWxObjectPtr&) data;
952 otherData.m_value = m_value;
955 bool wxVariantDataWxObjectPtr::Eq(wxVariantData& data) const
957 wxASSERT_MSG( wxIsKindOf((&data), wxVariantDataWxObjectPtr), wxT("wxVariantDataWxObjectPtr::Eq: argument mismatch") );
959 wxVariantDataWxObjectPtr& otherData = (wxVariantDataWxObjectPtr&) data;
961 return (otherData.m_value == m_value);
964 wxString wxVariantDataWxObjectPtr::GetType() const
966 wxString returnVal(wxT("wxObject"));
968 returnVal = m_value->GetClassInfo()->GetClassName();
973 wxClassInfo* wxVariantDataWxObjectPtr::GetValueClassInfo()
975 wxClassInfo* returnVal=NULL;
977 if (m_value) returnVal = m_value->GetClassInfo();
982 #if wxUSE_STD_IOSTREAM
983 bool wxVariantDataWxObjectPtr::Write(wxSTD ostream& str) const
987 str << (const char*) s.mb_str();
992 bool wxVariantDataWxObjectPtr::Write(wxString& str) const
994 str.Printf(wxT("%s(%ld)"), GetType().c_str(), (long) m_value);
998 #if wxUSE_STD_IOSTREAM
999 bool wxVariantDataWxObjectPtr::Read(wxSTD istream& WXUNUSED(str))
1006 bool wxVariantDataWxObjectPtr::Read(wxString& WXUNUSED(str))
1014 * wxVariantDataDateTime
1019 class wxVariantDataDateTime: public wxVariantData
1021 DECLARE_DYNAMIC_CLASS(wxVariantDataDateTime)
1024 wxVariantDataDateTime() { }
1025 wxVariantDataDateTime(const wxDateTime& value) { m_value = value; }
1027 wxVariantDataDateTime(const TIME_STRUCT* valptr)
1028 { m_value = wxDateTime(valptr->hour, valptr->minute, valptr->second); }
1029 wxVariantDataDateTime(const DATE_STRUCT* valptr)
1030 { m_value = wxDateTime(valptr->day, (wxDateTime::Month) (valptr->month - 1),valptr->year); }
1031 wxVariantDataDateTime(const TIMESTAMP_STRUCT* valptr)
1032 { m_value = wxDateTime(valptr->day, (wxDateTime::Month) (valptr->month - 1), valptr->year,
1033 valptr->hour, valptr->minute, valptr->second, valptr->fraction ); }
1036 inline wxDateTime GetValue() const { return m_value; }
1037 inline void SetValue(const wxDateTime& value) { m_value = value; }
1039 virtual void Copy(wxVariantData& data);
1040 virtual bool Eq(wxVariantData& data) const;
1041 #if wxUSE_STD_IOSTREAM
1042 virtual bool Write(wxSTD ostream& str) const;
1044 virtual bool Write(wxString& str) const;
1045 #if wxUSE_STD_IOSTREAM
1046 virtual bool Read(wxSTD istream& str);
1048 virtual bool Read(wxString& str);
1049 virtual wxString GetType() const { return wxT("datetime"); };
1050 virtual wxVariantData* Clone() { return new wxVariantDataDateTime; }
1057 IMPLEMENT_DYNAMIC_CLASS(wxVariantDataDateTime, wxVariantData)
1059 void wxVariantDataDateTime::Copy(wxVariantData& data)
1061 wxASSERT_MSG( (data.GetType() == wxT("datetime")), wxT("wxVariantDataDateTime::Copy: Can't copy to this type of data") );
1063 wxVariantDataDateTime& otherData = (wxVariantDataDateTime&) data;
1065 otherData.m_value = m_value;
1069 bool wxVariantDataDateTime::Eq(wxVariantData& data) const
1071 wxASSERT_MSG( (data.GetType() == wxT("datetime")), wxT("wxVariantDataDateTime::Eq: argument mismatch") );
1073 wxVariantDataDateTime& otherData = (wxVariantDataDateTime&) data;
1075 return (otherData.m_value == m_value);
1079 #if wxUSE_STD_IOSTREAM
1080 bool wxVariantDataDateTime::Write(wxSTD ostream& str) const
1088 bool wxVariantDataDateTime::Write(wxString& str) const
1090 str = m_value.Format();
1095 #if wxUSE_STD_IOSTREAM
1096 bool wxVariantDataDateTime::Read(wxSTD istream& WXUNUSED(str))
1104 bool wxVariantDataDateTime::Read(wxString& str)
1106 if(! m_value.ParseDateTime(str))
1111 #endif // wxUSE_DATETIME
1113 // ----------------------------------------------------------------------------
1114 // wxVariantDataArrayString
1115 // ----------------------------------------------------------------------------
1117 class wxVariantDataArrayString: public wxVariantData
1120 wxVariantDataArrayString() { }
1121 wxVariantDataArrayString(const wxArrayString& value) { m_value = value; }
1123 wxArrayString GetValue() const { return m_value; }
1124 void SetValue(const wxArrayString& value) { m_value = value; }
1126 virtual void Copy(wxVariantData& data);
1127 virtual bool Eq(wxVariantData& data) const;
1128 #if wxUSE_STD_IOSTREAM
1129 virtual bool Write(wxSTD ostream& str) const;
1131 virtual bool Write(wxString& str) const;
1132 #if wxUSE_STD_IOSTREAM
1133 virtual bool Read(wxSTD istream& str);
1135 virtual bool Read(wxString& str);
1136 virtual wxString GetType() const { return wxT("arrstring"); };
1137 virtual wxVariantData* Clone() { return new wxVariantDataArrayString; }
1140 wxArrayString m_value;
1142 DECLARE_DYNAMIC_CLASS(wxVariantDataArrayString)
1145 IMPLEMENT_DYNAMIC_CLASS(wxVariantDataArrayString, wxVariantData)
1147 void wxVariantDataArrayString::Copy(wxVariantData& data)
1149 wxASSERT_MSG( data.GetType() == GetType(), wxT("wxVariantDataArrayString::Copy: Can't copy to this type of data") );
1151 wxVariantDataArrayString& otherData = (wxVariantDataArrayString&) data;
1153 otherData.m_value = m_value;
1157 bool wxVariantDataArrayString::Eq(wxVariantData& data) const
1159 wxASSERT_MSG( data.GetType() == GetType(), wxT("wxVariantDataArrayString::Eq: argument mismatch") );
1161 wxVariantDataArrayString& otherData = (wxVariantDataArrayString&) data;
1163 return otherData.m_value == m_value;
1167 #if wxUSE_STD_IOSTREAM
1168 bool wxVariantDataArrayString::Write(wxSTD ostream& str) const
1176 bool wxVariantDataArrayString::Write(wxString& str) const
1178 size_t count = m_value.GetCount();
1179 for ( size_t n = 0; n < count; n++ )
1191 #if wxUSE_STD_IOSTREAM
1192 bool wxVariantDataArrayString::Read(wxSTD istream& WXUNUSED(str))
1200 bool wxVariantDataArrayString::Read(wxString& str)
1202 wxStringTokenizer tk(str, _T(";"));
1203 while ( tk.HasMoreTokens() )
1205 m_value.Add(tk.GetNextToken());
1217 IMPLEMENT_DYNAMIC_CLASS(wxVariant, wxObject)
1219 // Construction & destruction
1220 wxVariant::wxVariant()
1222 m_data = (wxVariantData*) NULL;
1225 wxVariant::wxVariant(double val, const wxString& name)
1227 m_data = new wxVariantDataReal(val);
1231 wxVariant::wxVariant(long val, const wxString& name)
1233 m_data = new wxVariantDataLong(val);
1238 wxVariant::wxVariant(bool val, const wxString& name)
1240 m_data = new wxVariantDataBool(val);
1245 wxVariant::wxVariant(char val, const wxString& name)
1247 m_data = new wxVariantDataChar(val);
1251 wxVariant::wxVariant(const wxString& val, const wxString& name)
1253 m_data = new wxVariantDataString(val);
1257 wxVariant::wxVariant(const wxChar* val, const wxString& name)
1259 m_data = new wxVariantDataString(wxString(val));
1263 wxVariant::wxVariant(const wxStringList& val, const wxString& name)
1265 m_data = new wxVariantDataStringList(val);
1269 wxVariant::wxVariant(const wxList& val, const wxString& name) // List of variants
1271 m_data = new wxVariantDataList(val);
1275 wxVariant::wxVariant( void* val, const wxString& name)
1277 m_data = new wxVariantDataVoidPtr(val);
1281 wxVariant::wxVariant( wxObject* val, const wxString& name)
1283 m_data = new wxVariantDataWxObjectPtr(val);
1288 wxVariant::wxVariant(const wxDateTime& val, const wxString& name) // Date
1290 m_data = new wxVariantDataDateTime(val);
1293 #endif // wxUSE_DATETIME
1296 wxVariant::wxVariant(const TIME_STRUCT* valptr, const wxString& name) // Date
1298 m_data = new wxVariantDataDateTime(valptr);
1302 wxVariant::wxVariant(const TIMESTAMP_STRUCT* valptr, const wxString& name) // Date
1304 m_data = new wxVariantDataDateTime(valptr);
1308 wxVariant::wxVariant(const DATE_STRUCT* valptr, const wxString& name) // Date
1310 m_data = new wxVariantDataDateTime(valptr);
1313 #endif // wxUSE_ODBC
1315 wxVariant::wxVariant(const wxArrayString& val, const wxString& name) // Strings
1317 m_data = new wxVariantDataArrayString(val);
1321 wxVariant::wxVariant(const wxVariant& variant)
1324 if (!variant.IsNull())
1326 m_data = (wxVariantData*) variant.GetData()->GetClassInfo()->CreateObject();
1327 variant.m_data->Copy(*m_data);
1330 m_data = (wxVariantData*) NULL;
1331 m_name = variant.m_name;
1334 wxVariant::wxVariant(wxVariantData* data, const wxString& name) // User-defined data
1340 wxVariant::~wxVariant()
1346 // Make NULL (i.e. delete the data)
1347 void wxVariant::MakeNull()
1353 // Generic operators
1355 void wxVariant::operator= (const wxVariant& variant)
1357 if (variant.IsNull())
1363 if (IsNull() || (GetType() != variant.GetType()))
1367 m_data = (wxVariantData*) variant.GetData()->GetClassInfo()->CreateObject();
1370 variant.GetData()->Copy(* GetData());
1372 m_name = variant.m_name;
1375 // Assignment using data, e.g.
1376 // myVariant = new wxStringVariantData("hello")
1377 void wxVariant::operator= (wxVariantData* variantData)
1380 m_data = variantData;
1383 bool wxVariant::operator== (const wxVariant& variant) const
1385 if (IsNull() || variant.IsNull())
1386 return (IsNull() == variant.IsNull());
1388 return (GetData()->Eq(* variant.GetData()));
1391 bool wxVariant::operator!= (const wxVariant& variant) const
1393 return (!(*this == variant));
1397 // Specific operators
1398 bool wxVariant::operator== (double value) const
1401 if (!Convert(&thisValue))
1404 return (value == thisValue);
1407 bool wxVariant::operator!= (double value) const
1409 return (!((*this) == value));
1412 void wxVariant::operator= (double value)
1414 if (GetType() == wxT("double"))
1416 ((wxVariantDataReal*)GetData())->SetValue(value);
1422 m_data = new wxVariantDataReal(value);
1426 bool wxVariant::operator== (long value) const
1429 if (!Convert(&thisValue))
1432 return (value == thisValue);
1435 bool wxVariant::operator!= (long value) const
1437 return (!((*this) == value));
1440 void wxVariant::operator= (long value)
1442 if (GetType() == wxT("long"))
1444 ((wxVariantDataLong*)GetData())->SetValue(value);
1450 m_data = new wxVariantDataLong(value);
1454 bool wxVariant::operator== (char value) const
1457 if (!Convert(&thisValue))
1460 return (value == thisValue);
1463 bool wxVariant::operator!= (char value) const
1465 return (!((*this) == value));
1468 void wxVariant::operator= (char value)
1470 if (GetType() == wxT("char"))
1472 ((wxVariantDataChar*)GetData())->SetValue(value);
1478 m_data = new wxVariantDataChar(value);
1483 bool wxVariant::operator== (bool value) const
1486 if (!Convert(&thisValue))
1489 return (value == thisValue);
1492 bool wxVariant::operator!= (bool value) const
1494 return (!((*this) == value));
1497 void wxVariant::operator= (bool value)
1499 if (GetType() == wxT("bool"))
1501 ((wxVariantDataBool*)GetData())->SetValue(value);
1507 m_data = new wxVariantDataBool(value);
1512 bool wxVariant::operator== (const wxString& value) const
1515 if (!Convert(&thisValue))
1518 return value == thisValue;
1521 bool wxVariant::operator!= (const wxString& value) const
1523 return (!((*this) == value));
1526 void wxVariant::operator= (const wxString& value)
1528 if (GetType() == wxT("string"))
1530 ((wxVariantDataString*)GetData())->SetValue(value);
1536 m_data = new wxVariantDataString(value);
1540 void wxVariant::operator= (const wxChar* value)
1542 if (GetType() == wxT("string"))
1544 ((wxVariantDataString*)GetData())->SetValue(wxString(value));
1550 m_data = new wxVariantDataString(wxString(value));
1554 bool wxVariant::operator== (const wxStringList& value) const
1556 wxASSERT_MSG( (GetType() == wxT("stringlist")), wxT("Invalid type for == operator") );
1558 wxVariantDataStringList other(value);
1559 return (m_data->Eq(other));
1562 bool wxVariant::operator!= (const wxStringList& value) const
1564 return (!((*this) == value));
1567 void wxVariant::operator= (const wxStringList& value)
1569 if (GetType() == wxT("stringlist"))
1571 ((wxVariantDataStringList*)GetData())->SetValue(value);
1577 m_data = new wxVariantDataStringList(value);
1581 bool wxVariant::operator== (const wxList& value) const
1583 wxASSERT_MSG( (GetType() == wxT("list")), wxT("Invalid type for == operator") );
1585 wxVariantDataList other(value);
1586 return (m_data->Eq(other));
1589 bool wxVariant::operator!= (const wxList& value) const
1591 return (!((*this) == value));
1594 void wxVariant::operator= (const wxList& value)
1596 if (GetType() == wxT("list"))
1598 ((wxVariantDataList*)GetData())->SetValue(value);
1604 m_data = new wxVariantDataList(value);
1608 bool wxVariant::operator== (void* value) const
1610 return (value == ((wxVariantDataVoidPtr*)GetData())->GetValue());
1613 bool wxVariant::operator!= (void* value) const
1615 return (!((*this) == (void*) value));
1618 void wxVariant::operator= (void* value)
1620 if (GetType() == wxT("void*"))
1622 ((wxVariantDataVoidPtr*)GetData())->SetValue(value);
1628 m_data = new wxVariantDataVoidPtr(value);
1633 bool wxVariant::operator== (const wxDateTime& value) const
1635 wxDateTime thisValue;
1636 if (!Convert(&thisValue))
1639 return value.IsEqualTo(thisValue);
1642 bool wxVariant::operator!= (const wxDateTime& value) const
1644 return (!((*this) == value));
1647 void wxVariant::operator= (const wxDateTime& value)
1649 if (GetType() == wxT("datetime"))
1651 ((wxVariantDataDateTime*)GetData())->SetValue(value);
1657 m_data = new wxVariantDataDateTime(value);
1660 #endif // wxUSE_DATETIME
1663 void wxVariant::operator= (const DATE_STRUCT* value)
1667 m_data = new wxVariantDataDateTime(value);
1671 void wxVariant::operator= (const TIME_STRUCT* value)
1675 m_data = new wxVariantDataDateTime(value);
1679 void wxVariant::operator= (const TIMESTAMP_STRUCT* value)
1683 m_data = new wxVariantDataDateTime(value);
1686 #endif // wxUSE_ODBC
1688 bool wxVariant::operator==(const wxArrayString& WXUNUSED(value)) const
1690 wxFAIL_MSG( _T("TODO") );
1695 bool wxVariant::operator!=(const wxArrayString& value) const
1697 return !(*this == value);
1700 void wxVariant::operator=(const wxArrayString& value)
1702 if (GetType() == wxT("arrstring"))
1704 ((wxVariantDataArrayString *)GetData())->SetValue(value);
1709 m_data = new wxVariantDataArrayString(value);
1713 wxArrayString wxVariant::GetArrayString() const
1715 if ( GetType() == wxT("arrstring") )
1716 return ((wxVariantDataArrayString *)GetData())->GetValue();
1718 return wxArrayString();
1722 // Treat a list variant as an array
1723 wxVariant wxVariant::operator[] (size_t idx) const
1725 wxASSERT_MSG( (GetType() == wxT("list") || GetType() == wxT("stringlist")), wxT("Invalid type for array operator") );
1727 if (GetType() == wxT("list"))
1729 wxVariantDataList* data = (wxVariantDataList*) m_data;
1730 wxASSERT_MSG( (idx < (size_t) data->GetValue().GetCount()), wxT("Invalid index for array") );
1731 return * (wxVariant*) (data->GetValue().Item(idx)->GetData());
1733 else if (GetType() == wxT("stringlist"))
1735 wxVariantDataStringList* data = (wxVariantDataStringList*) m_data;
1736 wxASSERT_MSG( (idx < (size_t) data->GetValue().GetCount()), wxT("Invalid index for array") );
1738 wxVariant variant( wxString( (const wxChar*) (data->GetValue().Item(idx)->GetData()) ));
1741 return wxNullVariant;
1744 wxVariant& wxVariant::operator[] (size_t idx)
1746 // We can't return a reference to a variant for a string list, since the string
1747 // is actually stored as a char*, not a variant.
1749 wxASSERT_MSG( (GetType() == wxT("list")), wxT("Invalid type for array operator") );
1751 wxVariantDataList* data = (wxVariantDataList*) m_data;
1752 wxASSERT_MSG( (idx < (size_t) data->GetValue().GetCount()), wxT("Invalid index for array") );
1754 return * (wxVariant*) (data->GetValue().Item(idx)->GetData());
1757 // Return the number of elements in a list
1758 int wxVariant::GetCount() const
1760 wxASSERT_MSG( (GetType() == wxT("list") || GetType() == wxT("stringlist")), wxT("Invalid type for GetCount()") );
1762 if (GetType() == wxT("list"))
1764 wxVariantDataList* data = (wxVariantDataList*) m_data;
1765 return data->GetValue().GetCount();
1767 else if (GetType() == wxT("stringlist"))
1769 wxVariantDataStringList* data = (wxVariantDataStringList*) m_data;
1770 return data->GetValue().GetCount();
1775 wxString wxVariant::MakeString() const
1780 if (GetData()->Write(str))
1783 return wxString(wxT(""));
1788 void wxVariant::SetData(wxVariantData* data)
1790 if (m_data) delete m_data;
1795 // Returns a string representing the type of the variant,
1796 // e.g. "string", "bool", "stringlist", "list", "double", "long"
1797 wxString wxVariant::GetType() const
1800 return wxString(wxT("null"));
1802 return m_data->GetType();
1806 bool wxVariant::IsType(const wxString& type) const
1808 return (GetType() == type);
1811 bool wxVariant::IsValueKindOf(const wxClassInfo* type) const
1813 wxClassInfo* info=m_data->GetValueClassInfo();
1814 return info ? info->IsKindOf(type) : false ;
1819 double wxVariant::GetReal() const
1822 if (Convert(& value))
1826 wxFAIL_MSG(wxT("Could not convert to a real number"));
1831 long wxVariant::GetInteger() const
1834 if (Convert(& value))
1838 wxFAIL_MSG(wxT("Could not convert to an integer"));
1843 char wxVariant::GetChar() const
1846 if (Convert(& value))
1850 wxFAIL_MSG(wxT("Could not convert to a char"));
1855 bool wxVariant::GetBool() const
1858 if (Convert(& value))
1862 wxFAIL_MSG(wxT("Could not convert to a bool"));
1867 wxString wxVariant::GetString() const
1870 if (!Convert(& value))
1872 wxFAIL_MSG(wxT("Could not convert to a string"));
1878 void* wxVariant::GetVoidPtr() const
1880 wxASSERT( (GetType() == wxT("void*")) );
1882 return (void*) ((wxVariantDataVoidPtr*) m_data)->GetValue();
1885 wxObject* wxVariant::GetWxObjectPtr()
1887 wxASSERT(wxIsKindOf(m_data, wxVariantDataWxObjectPtr));
1888 return (wxObject*) ((wxVariantDataWxObjectPtr*) m_data)->GetValue();
1892 wxDateTime wxVariant::GetDateTime() const
1895 if (!Convert(& value))
1897 wxFAIL_MSG(wxT("Could not convert to a datetime"));
1902 #endif // wxUSE_DATETIME
1904 wxList& wxVariant::GetList() const
1906 wxASSERT( (GetType() == wxT("list")) );
1908 return (wxList&) ((wxVariantDataList*) m_data)->GetValue();
1911 wxStringList& wxVariant::GetStringList() const
1913 wxASSERT( (GetType() == wxT("stringlist")) );
1915 return (wxStringList&) ((wxVariantDataStringList*) m_data)->GetValue();
1919 void wxVariant::NullList()
1921 SetData(new wxVariantDataList());
1925 void wxVariant::Append(const wxVariant& value)
1927 wxList& list = GetList();
1929 list.Append(new wxVariant(value));
1932 // Insert at front of list
1933 void wxVariant::Insert(const wxVariant& value)
1935 wxList& list = GetList();
1937 list.Insert(new wxVariant(value));
1940 // Returns TRUE if the variant is a member of the list
1941 bool wxVariant::Member(const wxVariant& value) const
1943 wxList& list = GetList();
1945 wxList::compatibility_iterator node = list.GetFirst();
1948 wxVariant* other = (wxVariant*) node->GetData();
1949 if (value == *other)
1951 node = node->GetNext();
1956 // Deletes the nth element of the list
1957 bool wxVariant::Delete(int item)
1959 wxList& list = GetList();
1961 wxASSERT_MSG( (item < (int) list.GetCount()), wxT("Invalid index to Delete") );
1962 wxList::compatibility_iterator node = list.Item(item);
1963 wxVariant* variant = (wxVariant*) node->GetData();
1970 void wxVariant::ClearList()
1972 if (!IsNull() && (GetType() == wxT("list")))
1974 ((wxVariantDataList*) m_data)->Clear();
1978 if (GetType() != wxT("list"))
1983 m_data = new wxVariantDataList;
1988 bool wxVariant::Convert(long* value) const
1990 wxString type(GetType());
1991 if (type == wxT("double"))
1992 *value = (long) (((wxVariantDataReal*)GetData())->GetValue());
1993 else if (type == wxT("long"))
1994 *value = ((wxVariantDataLong*)GetData())->GetValue();
1996 else if (type == wxT("bool"))
1997 *value = (long) (((wxVariantDataBool*)GetData())->GetValue());
1999 else if (type == wxT("string"))
2000 *value = wxAtol((const wxChar*) ((wxVariantDataString*)GetData())->GetValue());
2007 bool wxVariant::Convert(bool* value) const
2009 wxString type(GetType());
2010 if (type == wxT("double"))
2011 *value = ((int) (((wxVariantDataReal*)GetData())->GetValue()) != 0);
2012 else if (type == wxT("long"))
2013 *value = (((wxVariantDataLong*)GetData())->GetValue() != 0);
2015 else if (type == wxT("bool"))
2016 *value = ((wxVariantDataBool*)GetData())->GetValue();
2018 else if (type == wxT("string"))
2020 wxString val(((wxVariantDataString*)GetData())->GetValue());
2022 if (val == wxT("TRUE") || val == wxT("yes"))
2024 else if (val == wxT("FALSE") || val == wxT("no"))
2035 bool wxVariant::Convert(double* value) const
2037 wxString type(GetType());
2038 if (type == wxT("double"))
2039 *value = ((wxVariantDataReal*)GetData())->GetValue();
2040 else if (type == wxT("long"))
2041 *value = (double) (((wxVariantDataLong*)GetData())->GetValue());
2043 else if (type == wxT("bool"))
2044 *value = (double) (((wxVariantDataBool*)GetData())->GetValue());
2046 else if (type == wxT("string"))
2047 *value = (double) wxAtof((const wxChar*) ((wxVariantDataString*)GetData())->GetValue());
2054 bool wxVariant::Convert(char* value) const
2056 wxString type(GetType());
2057 if (type == wxT("char"))
2058 *value = ((wxVariantDataChar*)GetData())->GetValue();
2059 else if (type == wxT("long"))
2060 *value = (char) (((wxVariantDataLong*)GetData())->GetValue());
2062 else if (type == wxT("bool"))
2063 *value = (char) (((wxVariantDataBool*)GetData())->GetValue());
2071 bool wxVariant::Convert(wxString* value) const
2073 *value = MakeString();
2078 bool wxVariant::Convert(wxDateTime* value) const
2080 wxString type(GetType());
2081 if (type == wxT("datetime"))
2083 *value = ((wxVariantDataDateTime*)GetData())->GetValue();
2086 // Fallback to string conversion
2088 return Convert(&val) && (value->ParseDate(val));
2090 #endif // wxUSE_DATETIME