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("%.4f"), 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()[0u]; 
 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