1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: wxVariant class, container for any type
4 // Author: Julian Smart
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 // For compilers that support precompilation, includes "wx/wx.h".
13 #include "wx/wxprec.h"
19 #if wxUSE_STD_IOSTREAM
27 #if defined(__MWERKS__) && __MSL__ >= 0x6000
33 #include "wx/stream.h"
34 #include "wx/txtstrm.h"
37 #include "wx/string.h"
38 #include "wx/tokenzr.h"
41 #include "wx/variant.h"
43 IMPLEMENT_ABSTRACT_CLASS(wxVariantData, wxObject)
45 wxVariant WXDLLIMPEXP_BASE wxNullVariant;
51 class WXDLLIMPEXP_BASE wxVariantDataList: public wxVariantData
53 DECLARE_DYNAMIC_CLASS(wxVariantDataList)
55 wxVariantDataList() {}
56 wxVariantDataList(const wxList& list);
59 wxList& GetValue() { return m_value; }
60 void SetValue(const wxList& value) ;
62 virtual void Copy(wxVariantData& data);
63 virtual bool Eq(wxVariantData& data) const;
64 #if wxUSE_STD_IOSTREAM
65 virtual bool Write(wxSTD ostream& str) const;
67 virtual bool Write(wxString& str) const;
68 #if wxUSE_STD_IOSTREAM
69 virtual bool Read(wxSTD istream& str);
71 virtual bool Read(wxString& str);
72 virtual wxString GetType() const { return wxT("list"); };
80 IMPLEMENT_DYNAMIC_CLASS(wxVariantDataList, wxVariantData)
82 wxVariantDataList::wxVariantDataList(const wxList& list)
87 wxVariantDataList::~wxVariantDataList()
92 void wxVariantDataList::SetValue(const wxList& value)
95 wxList::compatibility_iterator node = value.GetFirst();
98 wxVariant* var = (wxVariant*) node->GetData();
99 m_value.Append(new wxVariant(*var));
100 node = node->GetNext();
104 void wxVariantDataList::Clear()
106 wxList::compatibility_iterator node = m_value.GetFirst();
109 wxVariant* var = (wxVariant*) node->GetData();
111 node = node->GetNext();
116 void wxVariantDataList::Copy(wxVariantData& data)
118 wxASSERT_MSG( (data.GetType() == wxT("list")), wxT("wxVariantDataList::Copy: Can't copy to this type of data") );
120 wxVariantDataList& listData = (wxVariantDataList&) data;
123 wxList::compatibility_iterator node = m_value.GetFirst();
126 wxVariant* var = (wxVariant*) node->GetData();
127 listData.m_value.Append(new wxVariant(*var));
128 node = node->GetNext();
132 bool wxVariantDataList::Eq(wxVariantData& data) const
134 wxASSERT_MSG( (data.GetType() == wxT("list")), wxT("wxVariantDataList::Eq: argument mismatch") );
136 wxVariantDataList& listData = (wxVariantDataList&) data;
137 wxList::compatibility_iterator node1 = m_value.GetFirst();
138 wxList::compatibility_iterator node2 = listData.GetValue().GetFirst();
139 while (node1 && node2)
141 wxVariant* var1 = (wxVariant*) node1->GetData();
142 wxVariant* var2 = (wxVariant*) node2->GetData();
143 if ((*var1) != (*var2))
145 node1 = node1->GetNext();
146 node2 = node2->GetNext();
148 if (node1 || node2) return false;
152 #if wxUSE_STD_IOSTREAM
153 bool wxVariantDataList::Write(wxSTD ostream& str) const
157 str << (const char*) s.mb_str();
162 bool wxVariantDataList::Write(wxString& str) const
165 wxList::compatibility_iterator node = m_value.GetFirst();
168 wxVariant* var = (wxVariant*) node->GetData();
169 if (node != m_value.GetFirst())
172 str += var->MakeString();
173 node = node->GetNext();
179 #if wxUSE_STD_IOSTREAM
180 bool wxVariantDataList::Read(wxSTD istream& WXUNUSED(str))
182 wxFAIL_MSG(wxT("Unimplemented"));
188 bool wxVariantDataList::Read(wxString& WXUNUSED(str))
190 wxFAIL_MSG(wxT("Unimplemented"));
194 #if WXWIN_COMPATIBILITY_2_4
197 * wxVariantDataStringList
200 class WXDLLIMPEXP_BASE wxVariantDataStringList: public wxVariantData
202 DECLARE_DYNAMIC_CLASS(wxVariantDataStringList)
204 wxVariantDataStringList() {}
205 wxVariantDataStringList(const wxStringList& list) { m_value = list; }
207 wxStringList& GetValue() const { return (wxStringList&) m_value; }
208 void SetValue(const wxStringList& value);
210 virtual void Copy(wxVariantData& data);
211 virtual bool Eq(wxVariantData& data) const;
212 #if wxUSE_STD_IOSTREAM
213 virtual bool Write(wxSTD ostream& str) const;
215 virtual bool Write(wxString& str) const;
216 #if wxUSE_STD_IOSTREAM
217 virtual bool Read(wxSTD istream& str);
219 virtual bool Read(wxString& str);
220 virtual wxString GetType() const { return wxT("stringlist"); };
223 wxStringList m_value;
226 IMPLEMENT_DYNAMIC_CLASS(wxVariantDataStringList, wxVariantData)
228 void wxVariantDataStringList::SetValue(const wxStringList& value)
233 void wxVariantDataStringList::Copy(wxVariantData& data)
235 wxASSERT_MSG( (data.GetType() == wxT("stringlist")), wxT("wxVariantDataStringList::Copy: Can't copy to this type of data") );
237 wxVariantDataStringList& listData = (wxVariantDataStringList&) data;
239 listData.m_value = m_value ;
242 bool wxVariantDataStringList::Eq(wxVariantData& data) const
244 wxASSERT_MSG( (data.GetType() == wxT("stringlist")), wxT("wxVariantDataStringList::Eq: argument mismatch") );
246 wxVariantDataStringList& listData = (wxVariantDataStringList&) data;
247 wxStringList::compatibility_iterator node1 = m_value.GetFirst();
248 wxStringList::compatibility_iterator node2 = listData.GetValue().GetFirst();
249 while (node1 && node2)
251 wxString str1 ( node1->GetData() );
252 wxString str2 ( node2->GetData() );
255 node1 = node1->GetNext();
256 node2 = node2->GetNext();
258 if (node1 || node2) return false;
262 #if wxUSE_STD_IOSTREAM
263 bool wxVariantDataStringList::Write(wxSTD ostream& str) const
267 str << (const char*) s.mb_str();
272 bool wxVariantDataStringList::Write(wxString& str) const
275 wxStringList::compatibility_iterator node = m_value.GetFirst();
278 const wxChar* s = node->GetData();
279 if (node != m_value.GetFirst())
282 node = node->GetNext();
288 #if wxUSE_STD_IOSTREAM
289 bool wxVariantDataStringList::Read(wxSTD istream& WXUNUSED(str))
291 wxFAIL_MSG(wxT("Unimplemented"));
297 bool wxVariantDataStringList::Read(wxString& WXUNUSED(str))
299 wxFAIL_MSG(wxT("Unimplemented"));
310 class WXDLLIMPEXP_BASE wxVariantDataLong: public wxVariantData
312 DECLARE_DYNAMIC_CLASS(wxVariantDataLong)
314 wxVariantDataLong() { m_value = 0; }
315 wxVariantDataLong(long value) { m_value = value; }
317 inline long GetValue() const { return m_value; }
318 inline void SetValue(long value) { m_value = value; }
320 virtual void Copy(wxVariantData& data);
321 virtual bool Eq(wxVariantData& data) const;
323 virtual bool Read(wxString& str);
324 virtual bool Write(wxString& str) const;
325 #if wxUSE_STD_IOSTREAM
326 virtual bool Read(wxSTD istream& str);
327 virtual bool Write(wxSTD ostream& str) const;
330 virtual bool Read(wxInputStream& str);
331 virtual bool Write(wxOutputStream &str) const;
332 #endif // wxUSE_STREAMS
334 virtual wxString GetType() const { return wxT("long"); };
340 IMPLEMENT_DYNAMIC_CLASS(wxVariantDataLong, wxVariantData)
342 void wxVariantDataLong::Copy(wxVariantData& data)
344 wxASSERT_MSG( (data.GetType() == wxT("long")), wxT("wxVariantDataLong::Copy: Can't copy to this type of data") );
346 wxVariantDataLong& otherData = (wxVariantDataLong&) data;
348 otherData.m_value = m_value;
351 bool wxVariantDataLong::Eq(wxVariantData& data) const
353 wxASSERT_MSG( (data.GetType() == wxT("long")), wxT("wxVariantDataLong::Eq: argument mismatch") );
355 wxVariantDataLong& otherData = (wxVariantDataLong&) data;
357 return (otherData.m_value == m_value);
360 #if wxUSE_STD_IOSTREAM
361 bool wxVariantDataLong::Write(wxSTD ostream& str) const
365 str << (const char*) s.mb_str();
370 bool wxVariantDataLong::Write(wxString& str) const
372 str.Printf(wxT("%ld"), m_value);
376 #if wxUSE_STD_IOSTREAM
377 bool wxVariantDataLong::Read(wxSTD istream& str)
385 bool wxVariantDataLong::Write(wxOutputStream& str) const
387 wxTextOutputStream s(str);
389 s.Write32((size_t)m_value);
393 bool wxVariantDataLong::Read(wxInputStream& str)
395 wxTextInputStream s(str);
396 m_value = s.Read32();
399 #endif // wxUSE_STREAMS
401 bool wxVariantDataLong::Read(wxString& str)
403 m_value = wxAtol((const wxChar*) str);
411 class WXDLLIMPEXP_BASE wxVariantDataReal: public wxVariantData
413 DECLARE_DYNAMIC_CLASS(wxVariantDataReal)
415 wxVariantDataReal() { m_value = 0.0; }
416 wxVariantDataReal(double value) { m_value = value; }
418 inline double GetValue() const { return m_value; }
419 inline void SetValue(double value) { m_value = value; }
421 virtual void Copy(wxVariantData& data);
422 virtual bool Eq(wxVariantData& data) const;
423 virtual bool Read(wxString& str);
424 #if wxUSE_STD_IOSTREAM
425 virtual bool Write(wxSTD ostream& str) const;
427 virtual bool Write(wxString& str) const;
428 #if wxUSE_STD_IOSTREAM
429 virtual bool Read(wxSTD istream& str);
432 virtual bool Read(wxInputStream& str);
433 virtual bool Write(wxOutputStream &str) const;
434 #endif // wxUSE_STREAMS
435 virtual wxString GetType() const { return wxT("double"); };
441 IMPLEMENT_DYNAMIC_CLASS(wxVariantDataReal, wxVariantData)
443 void wxVariantDataReal::Copy(wxVariantData& data)
445 wxASSERT_MSG( (data.GetType() == wxT("double")), wxT("wxVariantDataReal::Copy: Can't copy to this type of data") );
447 wxVariantDataReal& otherData = (wxVariantDataReal&) data;
449 otherData.m_value = m_value;
452 bool wxVariantDataReal::Eq(wxVariantData& data) const
454 wxASSERT_MSG( (data.GetType() == wxT("double")), wxT("wxVariantDataReal::Eq: argument mismatch") );
456 wxVariantDataReal& otherData = (wxVariantDataReal&) data;
458 return wxIsSameDouble(otherData.m_value, m_value);
461 #if wxUSE_STD_IOSTREAM
462 bool wxVariantDataReal::Write(wxSTD ostream& str) const
466 str << (const char*) s.mb_str();
471 bool wxVariantDataReal::Write(wxString& str) const
473 str.Printf(wxT("%.14g"), m_value);
477 #if wxUSE_STD_IOSTREAM
478 bool wxVariantDataReal::Read(wxSTD istream& str)
486 bool wxVariantDataReal::Write(wxOutputStream& str) const
488 wxTextOutputStream s(str);
489 s.WriteDouble((double)m_value);
493 bool wxVariantDataReal::Read(wxInputStream& str)
495 wxTextInputStream s(str);
496 m_value = (float)s.ReadDouble();
499 #endif // wxUSE_STREAMS
501 bool wxVariantDataReal::Read(wxString& str)
503 m_value = wxAtof((const wxChar*) str);
512 class WXDLLIMPEXP_BASE wxVariantDataBool: public wxVariantData
514 DECLARE_DYNAMIC_CLASS(wxVariantDataBool)
516 wxVariantDataBool() { m_value = 0; }
517 wxVariantDataBool(bool value) { m_value = value; }
519 inline bool GetValue() const { return m_value; }
520 inline void SetValue(bool value) { m_value = value; }
522 virtual void Copy(wxVariantData& data);
523 virtual bool Eq(wxVariantData& data) const;
524 #if wxUSE_STD_IOSTREAM
525 virtual bool Write(wxSTD ostream& str) const;
527 virtual bool Write(wxString& str) const;
528 virtual bool Read(wxString& str);
529 #if wxUSE_STD_IOSTREAM
530 virtual bool Read(wxSTD istream& str);
533 virtual bool Read(wxInputStream& str);
534 virtual bool Write(wxOutputStream& str) const;
535 #endif // wxUSE_STREAMS
536 virtual wxString GetType() const { return wxT("bool"); };
542 IMPLEMENT_DYNAMIC_CLASS(wxVariantDataBool, wxVariantData)
544 void wxVariantDataBool::Copy(wxVariantData& data)
546 wxASSERT_MSG( (data.GetType() == wxT("bool")), wxT("wxVariantDataBool::Copy: Can't copy to this type of data") );
548 wxVariantDataBool& otherData = (wxVariantDataBool&) data;
550 otherData.m_value = m_value;
553 bool wxVariantDataBool::Eq(wxVariantData& data) const
555 wxASSERT_MSG( (data.GetType() == wxT("bool")), wxT("wxVariantDataBool::Eq: argument mismatch") );
557 wxVariantDataBool& otherData = (wxVariantDataBool&) data;
559 return (otherData.m_value == m_value);
562 #if wxUSE_STD_IOSTREAM
563 bool wxVariantDataBool::Write(wxSTD ostream& str) const
567 str << (const char*) s.mb_str();
572 bool wxVariantDataBool::Write(wxString& str) const
574 str.Printf(wxT("%d"), (int) m_value);
578 #if wxUSE_STD_IOSTREAM
579 bool wxVariantDataBool::Read(wxSTD istream& WXUNUSED(str))
581 wxFAIL_MSG(wxT("Unimplemented"));
582 // str >> (long) m_value;
588 bool wxVariantDataBool::Write(wxOutputStream& str) const
590 wxTextOutputStream s(str);
596 bool wxVariantDataBool::Read(wxInputStream& str)
598 wxTextInputStream s(str);
600 m_value = s.Read8() != 0;
603 #endif // wxUSE_STREAMS
605 bool wxVariantDataBool::Read(wxString& str)
607 m_value = (wxAtol((const wxChar*) str) != 0);
616 class WXDLLIMPEXP_BASE wxVariantDataChar: public wxVariantData
618 DECLARE_DYNAMIC_CLASS(wxVariantDataChar)
620 wxVariantDataChar() { m_value = 0; }
621 wxVariantDataChar(char value) { m_value = value; }
623 inline char GetValue() const { return m_value; }
624 inline void SetValue(char value) { m_value = value; }
626 virtual void Copy(wxVariantData& data);
627 virtual bool Eq(wxVariantData& data) const;
628 #if wxUSE_STD_IOSTREAM
629 virtual bool Read(wxSTD istream& str);
630 virtual bool Write(wxSTD ostream& str) const;
632 virtual bool Read(wxString& str);
633 virtual bool Write(wxString& str) const;
635 virtual bool Read(wxInputStream& str);
636 virtual bool Write(wxOutputStream& str) const;
637 #endif // wxUSE_STREAMS
638 virtual wxString GetType() const { return wxT("char"); };
644 IMPLEMENT_DYNAMIC_CLASS(wxVariantDataChar, wxVariantData)
646 void wxVariantDataChar::Copy(wxVariantData& data)
648 wxASSERT_MSG( (data.GetType() == wxT("char")), wxT("wxVariantDataChar::Copy: Can't copy to this type of data") );
650 wxVariantDataChar& otherData = (wxVariantDataChar&) data;
652 otherData.m_value = m_value;
655 bool wxVariantDataChar::Eq(wxVariantData& data) const
657 wxASSERT_MSG( (data.GetType() == wxT("char")), wxT("wxVariantDataChar::Eq: argument mismatch") );
659 wxVariantDataChar& otherData = (wxVariantDataChar&) data;
661 return (otherData.m_value == m_value);
664 #if wxUSE_STD_IOSTREAM
665 bool wxVariantDataChar::Write(wxSTD ostream& str) const
669 str << (const char*) s.mb_str();
674 bool wxVariantDataChar::Write(wxString& str) const
676 str.Printf(wxT("%c"), m_value);
680 #if wxUSE_STD_IOSTREAM
681 bool wxVariantDataChar::Read(wxSTD istream& WXUNUSED(str))
683 wxFAIL_MSG(wxT("Unimplemented"));
690 bool wxVariantDataChar::Write(wxOutputStream& str) const
692 wxTextOutputStream s(str);
698 bool wxVariantDataChar::Read(wxInputStream& str)
700 wxTextInputStream s(str);
705 #endif // wxUSE_STREAMS
707 bool wxVariantDataChar::Read(wxString& str)
709 m_value = str.ToAscii()[size_t(0)];
714 * wxVariantDataString
717 class WXDLLIMPEXP_BASE wxVariantDataString: public wxVariantData
719 DECLARE_DYNAMIC_CLASS(wxVariantDataString)
721 wxVariantDataString() { }
722 wxVariantDataString(const wxString& value) { m_value = value; }
724 inline wxString GetValue() const { return m_value; }
725 inline void SetValue(const wxString& value) { m_value = value; }
727 virtual void Copy(wxVariantData& data);
728 virtual bool Eq(wxVariantData& data) const;
729 #if wxUSE_STD_IOSTREAM
730 virtual bool Write(wxSTD ostream& str) const;
732 virtual bool Read(wxString& str);
733 virtual bool Write(wxString& str) const;
734 #if wxUSE_STD_IOSTREAM
735 virtual bool Read(wxSTD istream& str);
738 virtual bool Read(wxInputStream& str);
739 virtual bool Write(wxOutputStream& str) const;
740 #endif // wxUSE_STREAMS
741 virtual wxString GetType() const { return wxT("string"); };
747 void wxVariantDataString::Copy(wxVariantData& data)
749 wxASSERT_MSG( (data.GetType() == wxT("string")), wxT("wxVariantDataString::Copy: Can't copy to this type of data") );
751 wxVariantDataString& otherData = (wxVariantDataString&) data;
753 otherData.m_value = m_value;
756 bool wxVariantDataString::Eq(wxVariantData& data) const
758 wxASSERT_MSG( (data.GetType() == wxT("string")), wxT("wxVariantDataString::Eq: argument mismatch") );
760 wxVariantDataString& otherData = (wxVariantDataString&) data;
762 return (otherData.m_value == m_value);
765 #if wxUSE_STD_IOSTREAM
766 bool wxVariantDataString::Write(wxSTD ostream& str) const
768 str << (const char*) m_value.mb_str();
773 bool wxVariantDataString::Write(wxString& str) const
779 #if wxUSE_STD_IOSTREAM
780 bool wxVariantDataString::Read(wxSTD istream& str)
788 bool wxVariantDataString::Write(wxOutputStream& str) const
790 // why doesn't wxOutputStream::operator<< take "const wxString&"
791 wxTextOutputStream s(str);
792 s.WriteString(m_value);
796 bool wxVariantDataString::Read(wxInputStream& str)
798 wxTextInputStream s(str);
800 m_value = s.ReadString();
803 #endif // wxUSE_STREAMS
805 bool wxVariantDataString::Read(wxString& str)
811 IMPLEMENT_DYNAMIC_CLASS(wxVariantDataString, wxVariantData)
814 * wxVariantDataVoidPtr
817 class wxVariantDataVoidPtr: public wxVariantData
819 DECLARE_DYNAMIC_CLASS(wxVariantDataVoidPtr)
821 wxVariantDataVoidPtr() { }
822 wxVariantDataVoidPtr(void* value) { m_value = value; }
824 inline void* GetValue() const { return m_value; }
825 inline void SetValue(void* value) { m_value = value; }
827 virtual void Copy(wxVariantData& data);
828 virtual bool Eq(wxVariantData& data) const;
829 #if wxUSE_STD_IOSTREAM
830 virtual bool Write(wxSTD ostream& str) const;
832 virtual bool Write(wxString& str) const;
833 #if wxUSE_STD_IOSTREAM
834 virtual bool Read(wxSTD istream& str);
836 virtual bool Read(wxString& str);
837 virtual wxString GetType() const { return wxT("void*"); };
838 virtual wxVariantData* Clone() { return new wxVariantDataVoidPtr; }
843 DECLARE_NO_COPY_CLASS(wxVariantDataVoidPtr)
846 IMPLEMENT_DYNAMIC_CLASS(wxVariantDataVoidPtr, wxVariantData)
848 void wxVariantDataVoidPtr::Copy(wxVariantData& data)
850 wxASSERT_MSG( (data.GetType() == wxT("void*")), wxT("wxVariantDataVoidPtr::Copy: Can't copy to this type of data") );
852 wxVariantDataVoidPtr& otherData = (wxVariantDataVoidPtr&) data;
854 otherData.m_value = m_value;
857 bool wxVariantDataVoidPtr::Eq(wxVariantData& data) const
859 wxASSERT_MSG( (data.GetType() == wxT("void*")), wxT("wxVariantDataVoidPtr::Eq: argument mismatch") );
861 wxVariantDataVoidPtr& otherData = (wxVariantDataVoidPtr&) data;
863 return (otherData.m_value == m_value);
866 #if wxUSE_STD_IOSTREAM
867 bool wxVariantDataVoidPtr::Write(wxSTD ostream& str) const
871 str << (const char*) s.mb_str();
876 bool wxVariantDataVoidPtr::Write(wxString& str) const
878 str.Printf(wxT("%p"), m_value);
882 #if wxUSE_STD_IOSTREAM
883 bool wxVariantDataVoidPtr::Read(wxSTD istream& WXUNUSED(str))
890 bool wxVariantDataVoidPtr::Read(wxString& WXUNUSED(str))
897 * wxVariantDataWxObjectPtr
900 class wxVariantDataWxObjectPtr: public wxVariantData
902 DECLARE_DYNAMIC_CLASS(wxVariantDataWxObjectPtr)
904 wxVariantDataWxObjectPtr() { }
905 wxVariantDataWxObjectPtr(wxObject* value) { m_value = value; }
907 inline wxObject* GetValue() const { return m_value; }
908 inline void SetValue(wxObject* value) { m_value = value; }
910 virtual void Copy(wxVariantData& data);
911 virtual bool Eq(wxVariantData& data) const;
912 #if wxUSE_STD_IOSTREAM
913 virtual bool Write(wxSTD ostream& str) const;
915 virtual bool Write(wxString& str) const;
916 #if wxUSE_STD_IOSTREAM
917 virtual bool Read(wxSTD istream& str);
919 virtual bool Read(wxString& str);
920 virtual wxString GetType() const ;
921 virtual wxVariantData* Clone() { return new wxVariantDataWxObjectPtr; }
923 virtual wxClassInfo* GetValueClassInfo() ;
927 DECLARE_NO_COPY_CLASS(wxVariantDataWxObjectPtr)
930 IMPLEMENT_DYNAMIC_CLASS(wxVariantDataWxObjectPtr, wxVariantData)
932 void wxVariantDataWxObjectPtr::Copy(wxVariantData& data)
934 wxASSERT_MSG( wxIsKindOf((&data), wxVariantDataWxObjectPtr) ,\
935 wxT("wxVariantDataWxObjectPtr::Copy: Can't copy to this type of data") \
938 wxVariantDataWxObjectPtr& otherData = (wxVariantDataWxObjectPtr&) data;
940 otherData.m_value = m_value;
943 bool wxVariantDataWxObjectPtr::Eq(wxVariantData& data) const
945 wxASSERT_MSG( wxIsKindOf((&data), wxVariantDataWxObjectPtr), wxT("wxVariantDataWxObjectPtr::Eq: argument mismatch") );
947 wxVariantDataWxObjectPtr& otherData = (wxVariantDataWxObjectPtr&) data;
949 return (otherData.m_value == m_value);
952 wxString wxVariantDataWxObjectPtr::GetType() const
954 wxString returnVal(wxT("wxObject"));
956 returnVal = m_value->GetClassInfo()->GetClassName();
961 wxClassInfo* wxVariantDataWxObjectPtr::GetValueClassInfo()
963 wxClassInfo* returnVal=NULL;
965 if (m_value) returnVal = m_value->GetClassInfo();
970 #if wxUSE_STD_IOSTREAM
971 bool wxVariantDataWxObjectPtr::Write(wxSTD ostream& str) const
975 str << (const char*) s.mb_str();
980 bool wxVariantDataWxObjectPtr::Write(wxString& str) const
982 str.Printf(wxT("%s(%p)"), GetType().c_str(), m_value);
986 #if wxUSE_STD_IOSTREAM
987 bool wxVariantDataWxObjectPtr::Read(wxSTD istream& WXUNUSED(str))
994 bool wxVariantDataWxObjectPtr::Read(wxString& WXUNUSED(str))
1002 * wxVariantDataDateTime
1007 class wxVariantDataDateTime: public wxVariantData
1009 DECLARE_DYNAMIC_CLASS(wxVariantDataDateTime)
1012 wxVariantDataDateTime() { }
1013 wxVariantDataDateTime(const wxDateTime& value) { m_value = value; }
1015 wxVariantDataDateTime(const TIME_STRUCT* valptr)
1016 { m_value = wxDateTime(valptr->hour, valptr->minute, valptr->second); }
1017 wxVariantDataDateTime(const DATE_STRUCT* valptr)
1018 { m_value = wxDateTime(valptr->day, (wxDateTime::Month) (valptr->month - 1),valptr->year); }
1019 wxVariantDataDateTime(const TIMESTAMP_STRUCT* valptr)
1020 { m_value = wxDateTime(valptr->day, (wxDateTime::Month) (valptr->month - 1), valptr->year,
1021 valptr->hour, valptr->minute, valptr->second, (wxDateTime::wxDateTime_t)valptr->fraction ); }
1024 inline wxDateTime GetValue() const { return m_value; }
1025 inline void SetValue(const wxDateTime& value) { m_value = value; }
1027 virtual void Copy(wxVariantData& data);
1028 virtual bool Eq(wxVariantData& data) const;
1029 #if wxUSE_STD_IOSTREAM
1030 virtual bool Write(wxSTD ostream& str) const;
1032 virtual bool Write(wxString& str) const;
1033 #if wxUSE_STD_IOSTREAM
1034 virtual bool Read(wxSTD istream& str);
1036 virtual bool Read(wxString& str);
1037 virtual wxString GetType() const { return wxT("datetime"); };
1038 virtual wxVariantData* Clone() { return new wxVariantDataDateTime; }
1045 IMPLEMENT_DYNAMIC_CLASS(wxVariantDataDateTime, wxVariantData)
1047 void wxVariantDataDateTime::Copy(wxVariantData& data)
1049 wxASSERT_MSG( (data.GetType() == wxT("datetime")), wxT("wxVariantDataDateTime::Copy: Can't copy to this type of data") );
1051 wxVariantDataDateTime& otherData = (wxVariantDataDateTime&) data;
1053 otherData.m_value = m_value;
1057 bool wxVariantDataDateTime::Eq(wxVariantData& data) const
1059 wxASSERT_MSG( (data.GetType() == wxT("datetime")), wxT("wxVariantDataDateTime::Eq: argument mismatch") );
1061 wxVariantDataDateTime& otherData = (wxVariantDataDateTime&) data;
1063 return (otherData.m_value == m_value);
1067 #if wxUSE_STD_IOSTREAM
1068 bool wxVariantDataDateTime::Write(wxSTD ostream& WXUNUSED(str)) const
1076 bool wxVariantDataDateTime::Write(wxString& str) const
1078 str = m_value.Format();
1083 #if wxUSE_STD_IOSTREAM
1084 bool wxVariantDataDateTime::Read(wxSTD istream& WXUNUSED(str))
1092 bool wxVariantDataDateTime::Read(wxString& str)
1094 if(! m_value.ParseDateTime(str))
1099 #endif // wxUSE_DATETIME
1101 // ----------------------------------------------------------------------------
1102 // wxVariantDataArrayString
1103 // ----------------------------------------------------------------------------
1105 class wxVariantDataArrayString: public wxVariantData
1108 wxVariantDataArrayString() { }
1109 wxVariantDataArrayString(const wxArrayString& value) { m_value = value; }
1111 wxArrayString GetValue() const { return m_value; }
1112 void SetValue(const wxArrayString& value) { m_value = value; }
1114 virtual void Copy(wxVariantData& data);
1115 virtual bool Eq(wxVariantData& data) const;
1116 #if wxUSE_STD_IOSTREAM
1117 virtual bool Write(wxSTD ostream& str) const;
1119 virtual bool Write(wxString& str) const;
1120 #if wxUSE_STD_IOSTREAM
1121 virtual bool Read(wxSTD istream& str);
1123 virtual bool Read(wxString& str);
1124 virtual wxString GetType() const { return wxT("arrstring"); };
1125 virtual wxVariantData* Clone() { return new wxVariantDataArrayString; }
1128 wxArrayString m_value;
1130 DECLARE_DYNAMIC_CLASS(wxVariantDataArrayString)
1133 IMPLEMENT_DYNAMIC_CLASS(wxVariantDataArrayString, wxVariantData)
1135 void wxVariantDataArrayString::Copy(wxVariantData& data)
1137 wxASSERT_MSG( data.GetType() == GetType(), wxT("wxVariantDataArrayString::Copy: Can't copy to this type of data") );
1139 wxVariantDataArrayString& otherData = (wxVariantDataArrayString&) data;
1141 otherData.m_value = m_value;
1145 bool wxVariantDataArrayString::Eq(wxVariantData& data) const
1147 wxASSERT_MSG( data.GetType() == GetType(), wxT("wxVariantDataArrayString::Eq: argument mismatch") );
1149 wxVariantDataArrayString& otherData = (wxVariantDataArrayString&) data;
1151 return otherData.m_value == m_value;
1155 #if wxUSE_STD_IOSTREAM
1156 bool wxVariantDataArrayString::Write(wxSTD ostream& WXUNUSED(str)) const
1164 bool wxVariantDataArrayString::Write(wxString& str) const
1166 size_t count = m_value.GetCount();
1167 for ( size_t n = 0; n < count; n++ )
1179 #if wxUSE_STD_IOSTREAM
1180 bool wxVariantDataArrayString::Read(wxSTD istream& WXUNUSED(str))
1188 bool wxVariantDataArrayString::Read(wxString& str)
1190 wxStringTokenizer tk(str, _T(";"));
1191 while ( tk.HasMoreTokens() )
1193 m_value.Add(tk.GetNextToken());
1205 IMPLEMENT_DYNAMIC_CLASS(wxVariant, wxObject)
1207 // Construction & destruction
1208 wxVariant::wxVariant()
1210 m_data = (wxVariantData*) NULL;
1213 wxVariant::wxVariant(double val, const wxString& name)
1215 m_data = new wxVariantDataReal(val);
1219 wxVariant::wxVariant(long val, const wxString& name)
1221 m_data = new wxVariantDataLong(val);
1226 wxVariant::wxVariant(bool val, const wxString& name)
1228 m_data = new wxVariantDataBool(val);
1233 wxVariant::wxVariant(char val, const wxString& name)
1235 m_data = new wxVariantDataChar(val);
1239 wxVariant::wxVariant(const wxString& val, const wxString& name)
1241 m_data = new wxVariantDataString(val);
1245 wxVariant::wxVariant(const wxChar* val, const wxString& name)
1247 m_data = new wxVariantDataString(wxString(val));
1251 #if WXWIN_COMPATIBILITY_2_4
1253 wxVariant::wxVariant(const wxStringList& val, const wxString& name)
1255 m_data = new wxVariantDataStringList(val);
1261 wxVariant::wxVariant(const wxList& val, const wxString& name) // List of variants
1263 m_data = new wxVariantDataList(val);
1267 wxVariant::wxVariant( void* val, const wxString& name)
1269 m_data = new wxVariantDataVoidPtr(val);
1273 wxVariant::wxVariant( wxObject* val, const wxString& name)
1275 m_data = new wxVariantDataWxObjectPtr(val);
1280 wxVariant::wxVariant(const wxDateTime& val, const wxString& name) // Date
1282 m_data = new wxVariantDataDateTime(val);
1285 #endif // wxUSE_DATETIME
1288 wxVariant::wxVariant(const TIME_STRUCT* valptr, const wxString& name) // Date
1290 m_data = new wxVariantDataDateTime(valptr);
1294 wxVariant::wxVariant(const TIMESTAMP_STRUCT* valptr, const wxString& name) // Date
1296 m_data = new wxVariantDataDateTime(valptr);
1300 wxVariant::wxVariant(const DATE_STRUCT* valptr, const wxString& name) // Date
1302 m_data = new wxVariantDataDateTime(valptr);
1305 #endif // wxUSE_ODBC
1307 wxVariant::wxVariant(const wxArrayString& val, const wxString& name) // Strings
1309 m_data = new wxVariantDataArrayString(val);
1313 wxVariant::wxVariant(const wxVariant& variant)
1316 if (!variant.IsNull())
1318 m_data = (wxVariantData*) variant.GetData()->GetClassInfo()->CreateObject();
1319 variant.m_data->Copy(*m_data);
1322 m_data = (wxVariantData*) NULL;
1323 m_name = variant.m_name;
1326 wxVariant::wxVariant(wxVariantData* data, const wxString& name) // User-defined data
1332 wxVariant::~wxVariant()
1338 // Make NULL (i.e. delete the data)
1339 void wxVariant::MakeNull()
1345 // Generic operators
1347 void wxVariant::operator= (const wxVariant& variant)
1349 if (variant.IsNull())
1355 if (IsNull() || (GetType() != variant.GetType()))
1359 m_data = (wxVariantData*) variant.GetData()->GetClassInfo()->CreateObject();
1362 variant.GetData()->Copy(* GetData());
1364 m_name = variant.m_name;
1367 // Assignment using data, e.g.
1368 // myVariant = new wxStringVariantData("hello")
1369 void wxVariant::operator= (wxVariantData* variantData)
1372 m_data = variantData;
1375 bool wxVariant::operator== (const wxVariant& variant) const
1377 if (IsNull() || variant.IsNull())
1378 return (IsNull() == variant.IsNull());
1380 return (GetData()->Eq(* variant.GetData()));
1383 bool wxVariant::operator!= (const wxVariant& variant) const
1385 return (!(*this == variant));
1389 // Specific operators
1390 bool wxVariant::operator== (double value) const
1393 if (!Convert(&thisValue))
1396 return wxIsSameDouble(value, thisValue);
1399 bool wxVariant::operator!= (double value) const
1401 return (!((*this) == value));
1404 void wxVariant::operator= (double value)
1406 if (GetType() == wxT("double"))
1408 ((wxVariantDataReal*)GetData())->SetValue(value);
1414 m_data = new wxVariantDataReal(value);
1418 bool wxVariant::operator== (long value) const
1421 if (!Convert(&thisValue))
1424 return (value == thisValue);
1427 bool wxVariant::operator!= (long value) const
1429 return (!((*this) == value));
1432 void wxVariant::operator= (long value)
1434 if (GetType() == wxT("long"))
1436 ((wxVariantDataLong*)GetData())->SetValue(value);
1442 m_data = new wxVariantDataLong(value);
1446 bool wxVariant::operator== (char value) const
1449 if (!Convert(&thisValue))
1452 return (value == thisValue);
1455 bool wxVariant::operator!= (char value) const
1457 return (!((*this) == value));
1460 void wxVariant::operator= (char value)
1462 if (GetType() == wxT("char"))
1464 ((wxVariantDataChar*)GetData())->SetValue(value);
1470 m_data = new wxVariantDataChar(value);
1475 bool wxVariant::operator== (bool value) const
1478 if (!Convert(&thisValue))
1481 return (value == thisValue);
1484 bool wxVariant::operator!= (bool value) const
1486 return (!((*this) == value));
1489 void wxVariant::operator= (bool value)
1491 if (GetType() == wxT("bool"))
1493 ((wxVariantDataBool*)GetData())->SetValue(value);
1499 m_data = new wxVariantDataBool(value);
1504 bool wxVariant::operator== (const wxString& value) const
1507 if (!Convert(&thisValue))
1510 return value == thisValue;
1513 bool wxVariant::operator!= (const wxString& value) const
1515 return (!((*this) == value));
1518 void wxVariant::operator= (const wxString& value)
1520 if (GetType() == wxT("string"))
1522 ((wxVariantDataString*)GetData())->SetValue(value);
1528 m_data = new wxVariantDataString(value);
1532 void wxVariant::operator= (const wxChar* value)
1534 if (GetType() == wxT("string"))
1536 ((wxVariantDataString*)GetData())->SetValue(wxString(value));
1542 m_data = new wxVariantDataString(wxString(value));
1546 #if WXWIN_COMPATIBILITY_2_4
1548 bool wxVariant::operator== (const wxStringList& value) const
1550 wxASSERT_MSG( (GetType() == wxT("stringlist")), wxT("Invalid type for == operator") );
1552 wxVariantDataStringList other(value);
1553 return (m_data->Eq(other));
1556 bool wxVariant::operator!= (const wxStringList& value) const
1558 wxASSERT_MSG( (GetType() == wxT("stringlist")), wxT("Invalid type for == operator") );
1560 wxVariantDataStringList other(value);
1561 return !(m_data->Eq(other));
1564 void wxVariant::operator= (const wxStringList& value)
1566 if (GetType() == wxT("stringlist"))
1568 ((wxVariantDataStringList*)GetData())->SetValue(value);
1574 m_data = new wxVariantDataStringList(value);
1580 bool wxVariant::operator== (const wxList& value) const
1582 wxASSERT_MSG( (GetType() == wxT("list")), wxT("Invalid type for == operator") );
1584 wxVariantDataList other(value);
1585 return (m_data->Eq(other));
1588 bool wxVariant::operator!= (const wxList& value) const
1590 return (!((*this) == value));
1593 void wxVariant::operator= (const wxList& value)
1595 if (GetType() == wxT("list"))
1597 ((wxVariantDataList*)GetData())->SetValue(value);
1603 m_data = new wxVariantDataList(value);
1607 bool wxVariant::operator== (void* value) const
1609 return (value == ((wxVariantDataVoidPtr*)GetData())->GetValue());
1612 bool wxVariant::operator!= (void* value) const
1614 return (!((*this) == (void*) value));
1617 void wxVariant::operator= (void* value)
1619 if (GetType() == wxT("void*"))
1621 ((wxVariantDataVoidPtr*)GetData())->SetValue(value);
1627 m_data = new wxVariantDataVoidPtr(value);
1632 bool wxVariant::operator== (const wxDateTime& value) const
1634 wxDateTime thisValue;
1635 if (!Convert(&thisValue))
1638 return value.IsEqualTo(thisValue);
1641 bool wxVariant::operator!= (const wxDateTime& value) const
1643 return (!((*this) == value));
1646 void wxVariant::operator= (const wxDateTime& value)
1648 if (GetType() == wxT("datetime"))
1650 ((wxVariantDataDateTime*)GetData())->SetValue(value);
1656 m_data = new wxVariantDataDateTime(value);
1659 #endif // wxUSE_DATETIME
1662 void wxVariant::operator= (const DATE_STRUCT* value)
1666 m_data = new wxVariantDataDateTime(value);
1670 void wxVariant::operator= (const TIME_STRUCT* value)
1674 m_data = new wxVariantDataDateTime(value);
1678 void wxVariant::operator= (const TIMESTAMP_STRUCT* value)
1682 m_data = new wxVariantDataDateTime(value);
1685 #endif // wxUSE_ODBC
1687 bool wxVariant::operator==(const wxArrayString& WXUNUSED(value)) const
1689 wxFAIL_MSG( _T("TODO") );
1694 bool wxVariant::operator!=(const wxArrayString& value) const
1696 return !(*this == value);
1699 void wxVariant::operator=(const wxArrayString& value)
1701 if (GetType() == wxT("arrstring"))
1703 ((wxVariantDataArrayString *)GetData())->SetValue(value);
1708 m_data = new wxVariantDataArrayString(value);
1712 wxArrayString wxVariant::GetArrayString() const
1714 if ( GetType() == wxT("arrstring") )
1715 return ((wxVariantDataArrayString *)GetData())->GetValue();
1717 return wxArrayString();
1721 // Treat a list variant as an array
1722 wxVariant wxVariant::operator[] (size_t idx) const
1724 #if WXWIN_COMPATIBILITY_2_4
1725 wxASSERT_MSG( (GetType() == wxT("list") || GetType() == wxT("stringlist")), wxT("Invalid type for array operator") );
1727 wxASSERT_MSG( GetType() == wxT("list"), wxT("Invalid type for array operator") );
1730 if (GetType() == wxT("list"))
1732 wxVariantDataList* data = (wxVariantDataList*) m_data;
1733 wxASSERT_MSG( (idx < (size_t) data->GetValue().GetCount()), wxT("Invalid index for array") );
1734 return * (wxVariant*) (data->GetValue().Item(idx)->GetData());
1736 #if WXWIN_COMPATIBILITY_2_4
1737 else if (GetType() == wxT("stringlist"))
1739 wxVariantDataStringList* data = (wxVariantDataStringList*) m_data;
1740 wxASSERT_MSG( (idx < (size_t) data->GetValue().GetCount()), wxT("Invalid index for array") );
1742 wxString str( (const wxChar*) (data->GetValue().Item(idx)->GetData()) );
1743 wxVariant variant( str );
1747 return wxNullVariant;
1750 wxVariant& wxVariant::operator[] (size_t idx)
1752 // We can't return a reference to a variant for a string list, since the string
1753 // is actually stored as a char*, not a variant.
1755 wxASSERT_MSG( (GetType() == wxT("list")), wxT("Invalid type for array operator") );
1757 wxVariantDataList* data = (wxVariantDataList*) m_data;
1758 wxASSERT_MSG( (idx < (size_t) data->GetValue().GetCount()), wxT("Invalid index for array") );
1760 return * (wxVariant*) (data->GetValue().Item(idx)->GetData());
1763 // Return the number of elements in a list
1764 int wxVariant::GetCount() const
1766 #if WXWIN_COMPATIBILITY_2_4
1767 wxASSERT_MSG( (GetType() == wxT("list") || GetType() == wxT("stringlist")), wxT("Invalid type for GetCount()") );
1769 wxASSERT_MSG( GetType() == wxT("list"), wxT("Invalid type for GetCount()") );
1772 if (GetType() == wxT("list"))
1774 wxVariantDataList* data = (wxVariantDataList*) m_data;
1775 return data->GetValue().GetCount();
1777 #if WXWIN_COMPATIBILITY_2_4
1778 else if (GetType() == wxT("stringlist"))
1780 wxVariantDataStringList* data = (wxVariantDataStringList*) m_data;
1781 return data->GetValue().GetCount();
1787 wxString wxVariant::MakeString() const
1792 if (GetData()->Write(str))
1795 return wxEmptyString;
1800 void wxVariant::SetData(wxVariantData* data)
1802 if (m_data) delete m_data;
1807 // Returns a string representing the type of the variant,
1808 // e.g. "string", "bool", "list", "double", "long"
1809 wxString wxVariant::GetType() const
1812 return wxString(wxT("null"));
1814 return m_data->GetType();
1818 bool wxVariant::IsType(const wxString& type) const
1820 return (GetType() == type);
1823 bool wxVariant::IsValueKindOf(const wxClassInfo* type) const
1825 wxClassInfo* info=m_data->GetValueClassInfo();
1826 return info ? info->IsKindOf(type) : false ;
1831 double wxVariant::GetReal() const
1834 if (Convert(& value))
1838 wxFAIL_MSG(wxT("Could not convert to a real number"));
1843 long wxVariant::GetInteger() const
1846 if (Convert(& value))
1850 wxFAIL_MSG(wxT("Could not convert to an integer"));
1855 char wxVariant::GetChar() const
1858 if (Convert(& value))
1862 wxFAIL_MSG(wxT("Could not convert to a char"));
1867 bool wxVariant::GetBool() const
1870 if (Convert(& value))
1874 wxFAIL_MSG(wxT("Could not convert to a bool"));
1879 wxString wxVariant::GetString() const
1882 if (!Convert(& value))
1884 wxFAIL_MSG(wxT("Could not convert to a string"));
1890 void* wxVariant::GetVoidPtr() const
1892 wxASSERT( (GetType() == wxT("void*")) );
1894 return (void*) ((wxVariantDataVoidPtr*) m_data)->GetValue();
1897 wxObject* wxVariant::GetWxObjectPtr()
1899 wxASSERT(wxIsKindOf(m_data, wxVariantDataWxObjectPtr));
1900 return (wxObject*) ((wxVariantDataWxObjectPtr*) m_data)->GetValue();
1904 wxDateTime wxVariant::GetDateTime() const
1907 if (!Convert(& value))
1909 wxFAIL_MSG(wxT("Could not convert to a datetime"));
1914 #endif // wxUSE_DATETIME
1916 wxList& wxVariant::GetList() const
1918 wxASSERT( (GetType() == wxT("list")) );
1920 return (wxList&) ((wxVariantDataList*) m_data)->GetValue();
1923 #if WXWIN_COMPATIBILITY_2_4
1925 wxStringList& wxVariant::GetStringList() const
1927 wxASSERT( (GetType() == wxT("stringlist")) );
1929 return (wxStringList&) ((wxVariantDataStringList*) m_data)->GetValue();
1935 void wxVariant::NullList()
1937 SetData(new wxVariantDataList());
1941 void wxVariant::Append(const wxVariant& value)
1943 wxList& list = GetList();
1945 list.Append(new wxVariant(value));
1948 // Insert at front of list
1949 void wxVariant::Insert(const wxVariant& value)
1951 wxList& list = GetList();
1953 list.Insert(new wxVariant(value));
1956 // Returns true if the variant is a member of the list
1957 bool wxVariant::Member(const wxVariant& value) const
1959 wxList& list = GetList();
1961 wxList::compatibility_iterator node = list.GetFirst();
1964 wxVariant* other = (wxVariant*) node->GetData();
1965 if (value == *other)
1967 node = node->GetNext();
1972 // Deletes the nth element of the list
1973 bool wxVariant::Delete(int item)
1975 wxList& list = GetList();
1977 wxASSERT_MSG( (item < (int) list.GetCount()), wxT("Invalid index to Delete") );
1978 wxList::compatibility_iterator node = list.Item(item);
1979 wxVariant* variant = (wxVariant*) node->GetData();
1986 void wxVariant::ClearList()
1988 if (!IsNull() && (GetType() == wxT("list")))
1990 ((wxVariantDataList*) m_data)->Clear();
1994 if (!GetType().IsSameAs(wxT("list")))
1999 m_data = new wxVariantDataList;
2004 bool wxVariant::Convert(long* value) const
2006 wxString type(GetType());
2007 if (type == wxT("double"))
2008 *value = (long) (((wxVariantDataReal*)GetData())->GetValue());
2009 else if (type == wxT("long"))
2010 *value = ((wxVariantDataLong*)GetData())->GetValue();
2012 else if (type == wxT("bool"))
2013 *value = (long) (((wxVariantDataBool*)GetData())->GetValue());
2015 else if (type == wxT("string"))
2016 *value = wxAtol((const wxChar*) ((wxVariantDataString*)GetData())->GetValue());
2023 bool wxVariant::Convert(bool* value) const
2025 wxString type(GetType());
2026 if (type == wxT("double"))
2027 *value = ((int) (((wxVariantDataReal*)GetData())->GetValue()) != 0);
2028 else if (type == wxT("long"))
2029 *value = (((wxVariantDataLong*)GetData())->GetValue() != 0);
2031 else if (type == wxT("bool"))
2032 *value = ((wxVariantDataBool*)GetData())->GetValue();
2034 else if (type == wxT("string"))
2036 wxString val(((wxVariantDataString*)GetData())->GetValue());
2038 if (val == wxT("true") || val == wxT("yes") || val == wxT('1') )
2040 else if (val == wxT("false") || val == wxT("no") || val == wxT('0') )
2051 bool wxVariant::Convert(double* value) const
2053 wxString type(GetType());
2054 if (type == wxT("double"))
2055 *value = ((wxVariantDataReal*)GetData())->GetValue();
2056 else if (type == wxT("long"))
2057 *value = (double) (((wxVariantDataLong*)GetData())->GetValue());
2059 else if (type == wxT("bool"))
2060 *value = (double) (((wxVariantDataBool*)GetData())->GetValue());
2062 else if (type == wxT("string"))
2063 *value = (double) wxAtof((const wxChar*) ((wxVariantDataString*)GetData())->GetValue());
2070 bool wxVariant::Convert(char* value) const
2072 wxString type(GetType());
2073 if (type == wxT("char"))
2074 *value = ((wxVariantDataChar*)GetData())->GetValue();
2075 else if (type == wxT("long"))
2076 *value = (char) (((wxVariantDataLong*)GetData())->GetValue());
2078 else if (type == wxT("bool"))
2079 *value = (char) (((wxVariantDataBool*)GetData())->GetValue());
2087 bool wxVariant::Convert(wxString* value) const
2089 *value = MakeString();
2094 bool wxVariant::Convert(wxDateTime* value) const
2096 wxString type(GetType());
2097 if (type == wxT("datetime"))
2099 *value = ((wxVariantDataDateTime*)GetData())->GetValue();
2102 // Fallback to string conversion
2104 return Convert(&val) &&
2105 (value->ParseDateTime(val) || value->ParseDate(val));
2107 #endif // wxUSE_DATETIME