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