1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/common/variant.cpp
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 #include "wx/variant.h"
22 #include "wx/string.h"
25 #if wxUSE_STD_IOSTREAM
33 #if defined(__MWERKS__) && __MSL__ >= 0x6000
39 #include "wx/stream.h"
40 #include "wx/txtstrm.h"
43 #include "wx/string.h"
44 #include "wx/tokenzr.h"
47 IMPLEMENT_ABSTRACT_CLASS(wxVariantData
, wxObject
)
49 wxVariant WXDLLIMPEXP_BASE wxNullVariant
;
55 class WXDLLIMPEXP_BASE wxVariantDataList
: public wxVariantData
57 DECLARE_DYNAMIC_CLASS(wxVariantDataList
)
59 wxVariantDataList() {}
60 wxVariantDataList(const wxList
& list
);
63 wxList
& GetValue() { return m_value
; }
64 void SetValue(const wxList
& value
) ;
66 virtual void Copy(wxVariantData
& data
);
67 virtual bool Eq(wxVariantData
& data
) const;
68 #if wxUSE_STD_IOSTREAM
69 virtual bool Write(wxSTD ostream
& str
) const;
71 virtual bool Write(wxString
& str
) const;
72 #if wxUSE_STD_IOSTREAM
73 virtual bool Read(wxSTD istream
& str
);
75 virtual bool Read(wxString
& str
);
76 virtual wxString
GetType() const { return wxT("list"); };
84 IMPLEMENT_DYNAMIC_CLASS(wxVariantDataList
, wxVariantData
)
86 wxVariantDataList::wxVariantDataList(const wxList
& list
)
91 wxVariantDataList::~wxVariantDataList()
96 void wxVariantDataList::SetValue(const wxList
& value
)
99 wxList::compatibility_iterator node
= value
.GetFirst();
102 wxVariant
* var
= (wxVariant
*) node
->GetData();
103 m_value
.Append(new wxVariant(*var
));
104 node
= node
->GetNext();
108 void wxVariantDataList::Clear()
110 wxList::compatibility_iterator node
= m_value
.GetFirst();
113 wxVariant
* var
= (wxVariant
*) node
->GetData();
115 node
= node
->GetNext();
120 void wxVariantDataList::Copy(wxVariantData
& data
)
122 wxASSERT_MSG( (data
.GetType() == wxT("list")), wxT("wxVariantDataList::Copy: Can't copy to this type of data") );
124 wxVariantDataList
& listData
= (wxVariantDataList
&) data
;
127 wxList::compatibility_iterator node
= m_value
.GetFirst();
130 wxVariant
* var
= (wxVariant
*) node
->GetData();
131 listData
.m_value
.Append(new wxVariant(*var
));
132 node
= node
->GetNext();
136 bool wxVariantDataList::Eq(wxVariantData
& data
) const
138 wxASSERT_MSG( (data
.GetType() == wxT("list")), wxT("wxVariantDataList::Eq: argument mismatch") );
140 wxVariantDataList
& listData
= (wxVariantDataList
&) data
;
141 wxList::compatibility_iterator node1
= m_value
.GetFirst();
142 wxList::compatibility_iterator node2
= listData
.GetValue().GetFirst();
143 while (node1
&& node2
)
145 wxVariant
* var1
= (wxVariant
*) node1
->GetData();
146 wxVariant
* var2
= (wxVariant
*) node2
->GetData();
147 if ((*var1
) != (*var2
))
149 node1
= node1
->GetNext();
150 node2
= node2
->GetNext();
152 if (node1
|| node2
) return false;
156 #if wxUSE_STD_IOSTREAM
157 bool wxVariantDataList::Write(wxSTD ostream
& str
) const
161 str
<< (const char*) s
.mb_str();
166 bool wxVariantDataList::Write(wxString
& str
) const
169 wxList::compatibility_iterator node
= m_value
.GetFirst();
172 wxVariant
* var
= (wxVariant
*) node
->GetData();
173 if (node
!= m_value
.GetFirst())
176 str
+= var
->MakeString();
177 node
= node
->GetNext();
183 #if wxUSE_STD_IOSTREAM
184 bool wxVariantDataList::Read(wxSTD istream
& WXUNUSED(str
))
186 wxFAIL_MSG(wxT("Unimplemented"));
192 bool wxVariantDataList::Read(wxString
& WXUNUSED(str
))
194 wxFAIL_MSG(wxT("Unimplemented"));
198 #if WXWIN_COMPATIBILITY_2_4
201 * wxVariantDataStringList
204 class WXDLLIMPEXP_BASE wxVariantDataStringList
: public wxVariantData
206 DECLARE_DYNAMIC_CLASS(wxVariantDataStringList
)
208 wxVariantDataStringList() {}
209 wxVariantDataStringList(const wxStringList
& list
) { m_value
= list
; }
211 wxStringList
& GetValue() const { return (wxStringList
&) m_value
; }
212 void SetValue(const wxStringList
& value
);
214 virtual void Copy(wxVariantData
& data
);
215 virtual bool Eq(wxVariantData
& data
) const;
216 #if wxUSE_STD_IOSTREAM
217 virtual bool Write(wxSTD ostream
& str
) const;
219 virtual bool Write(wxString
& str
) const;
220 #if wxUSE_STD_IOSTREAM
221 virtual bool Read(wxSTD istream
& str
);
223 virtual bool Read(wxString
& str
);
224 virtual wxString
GetType() const { return wxT("stringlist"); };
227 wxStringList m_value
;
230 IMPLEMENT_DYNAMIC_CLASS(wxVariantDataStringList
, wxVariantData
)
232 void wxVariantDataStringList::SetValue(const wxStringList
& value
)
237 void wxVariantDataStringList::Copy(wxVariantData
& data
)
239 wxASSERT_MSG( (data
.GetType() == wxT("stringlist")), wxT("wxVariantDataStringList::Copy: Can't copy to this type of data") );
241 wxVariantDataStringList
& listData
= (wxVariantDataStringList
&) data
;
243 listData
.m_value
= m_value
;
246 bool wxVariantDataStringList::Eq(wxVariantData
& data
) const
248 wxASSERT_MSG( (data
.GetType() == wxT("stringlist")), wxT("wxVariantDataStringList::Eq: argument mismatch") );
250 wxVariantDataStringList
& listData
= (wxVariantDataStringList
&) data
;
251 wxStringList::compatibility_iterator node1
= m_value
.GetFirst();
252 wxStringList::compatibility_iterator node2
= listData
.GetValue().GetFirst();
253 while (node1
&& node2
)
255 wxString
str1 ( node1
->GetData() );
256 wxString
str2 ( node2
->GetData() );
259 node1
= node1
->GetNext();
260 node2
= node2
->GetNext();
262 if (node1
|| node2
) return false;
266 #if wxUSE_STD_IOSTREAM
267 bool wxVariantDataStringList::Write(wxSTD ostream
& str
) const
271 str
<< (const char*) s
.mb_str();
276 bool wxVariantDataStringList::Write(wxString
& str
) const
279 wxStringList::compatibility_iterator node
= m_value
.GetFirst();
282 const wxChar
* s
= node
->GetData();
283 if (node
!= m_value
.GetFirst())
286 node
= node
->GetNext();
292 #if wxUSE_STD_IOSTREAM
293 bool wxVariantDataStringList::Read(wxSTD istream
& WXUNUSED(str
))
295 wxFAIL_MSG(wxT("Unimplemented"));
301 bool wxVariantDataStringList::Read(wxString
& WXUNUSED(str
))
303 wxFAIL_MSG(wxT("Unimplemented"));
314 class WXDLLIMPEXP_BASE wxVariantDataLong
: public wxVariantData
316 DECLARE_DYNAMIC_CLASS(wxVariantDataLong
)
318 wxVariantDataLong() { m_value
= 0; }
319 wxVariantDataLong(long value
) { m_value
= value
; }
321 inline long GetValue() const { return m_value
; }
322 inline void SetValue(long value
) { m_value
= value
; }
324 virtual void Copy(wxVariantData
& data
);
325 virtual bool Eq(wxVariantData
& data
) const;
327 virtual bool Read(wxString
& str
);
328 virtual bool Write(wxString
& str
) const;
329 #if wxUSE_STD_IOSTREAM
330 virtual bool Read(wxSTD istream
& str
);
331 virtual bool Write(wxSTD ostream
& str
) const;
334 virtual bool Read(wxInputStream
& str
);
335 virtual bool Write(wxOutputStream
&str
) const;
336 #endif // wxUSE_STREAMS
338 virtual wxString
GetType() const { return wxT("long"); };
344 IMPLEMENT_DYNAMIC_CLASS(wxVariantDataLong
, wxVariantData
)
346 void wxVariantDataLong::Copy(wxVariantData
& data
)
348 wxASSERT_MSG( (data
.GetType() == wxT("long")), wxT("wxVariantDataLong::Copy: Can't copy to this type of data") );
350 wxVariantDataLong
& otherData
= (wxVariantDataLong
&) data
;
352 otherData
.m_value
= m_value
;
355 bool wxVariantDataLong::Eq(wxVariantData
& data
) const
357 wxASSERT_MSG( (data
.GetType() == wxT("long")), wxT("wxVariantDataLong::Eq: argument mismatch") );
359 wxVariantDataLong
& otherData
= (wxVariantDataLong
&) data
;
361 return (otherData
.m_value
== m_value
);
364 #if wxUSE_STD_IOSTREAM
365 bool wxVariantDataLong::Write(wxSTD ostream
& str
) const
369 str
<< (const char*) s
.mb_str();
374 bool wxVariantDataLong::Write(wxString
& str
) const
376 str
.Printf(wxT("%ld"), m_value
);
380 #if wxUSE_STD_IOSTREAM
381 bool wxVariantDataLong::Read(wxSTD istream
& str
)
389 bool wxVariantDataLong::Write(wxOutputStream
& str
) const
391 wxTextOutputStream
s(str
);
393 s
.Write32((size_t)m_value
);
397 bool wxVariantDataLong::Read(wxInputStream
& str
)
399 wxTextInputStream
s(str
);
400 m_value
= s
.Read32();
403 #endif // wxUSE_STREAMS
405 bool wxVariantDataLong::Read(wxString
& str
)
407 m_value
= wxAtol((const wxChar
*) str
);
415 class WXDLLIMPEXP_BASE wxVariantDataReal
: public wxVariantData
417 DECLARE_DYNAMIC_CLASS(wxVariantDataReal
)
419 wxVariantDataReal() { m_value
= 0.0; }
420 wxVariantDataReal(double value
) { m_value
= value
; }
422 inline double GetValue() const { return m_value
; }
423 inline void SetValue(double value
) { m_value
= value
; }
425 virtual void Copy(wxVariantData
& data
);
426 virtual bool Eq(wxVariantData
& data
) const;
427 virtual bool Read(wxString
& str
);
428 #if wxUSE_STD_IOSTREAM
429 virtual bool Write(wxSTD ostream
& str
) const;
431 virtual bool Write(wxString
& str
) const;
432 #if wxUSE_STD_IOSTREAM
433 virtual bool Read(wxSTD istream
& str
);
436 virtual bool Read(wxInputStream
& str
);
437 virtual bool Write(wxOutputStream
&str
) const;
438 #endif // wxUSE_STREAMS
439 virtual wxString
GetType() const { return wxT("double"); };
445 IMPLEMENT_DYNAMIC_CLASS(wxVariantDataReal
, wxVariantData
)
447 void wxVariantDataReal::Copy(wxVariantData
& data
)
449 wxASSERT_MSG( (data
.GetType() == wxT("double")), wxT("wxVariantDataReal::Copy: Can't copy to this type of data") );
451 wxVariantDataReal
& otherData
= (wxVariantDataReal
&) data
;
453 otherData
.m_value
= m_value
;
456 bool wxVariantDataReal::Eq(wxVariantData
& data
) const
458 wxASSERT_MSG( (data
.GetType() == wxT("double")), wxT("wxVariantDataReal::Eq: argument mismatch") );
460 wxVariantDataReal
& otherData
= (wxVariantDataReal
&) data
;
462 return wxIsSameDouble(otherData
.m_value
, m_value
);
465 #if wxUSE_STD_IOSTREAM
466 bool wxVariantDataReal::Write(wxSTD ostream
& str
) const
470 str
<< (const char*) s
.mb_str();
475 bool wxVariantDataReal::Write(wxString
& str
) const
477 str
.Printf(wxT("%.14g"), m_value
);
481 #if wxUSE_STD_IOSTREAM
482 bool wxVariantDataReal::Read(wxSTD istream
& str
)
490 bool wxVariantDataReal::Write(wxOutputStream
& str
) const
492 wxTextOutputStream
s(str
);
493 s
.WriteDouble((double)m_value
);
497 bool wxVariantDataReal::Read(wxInputStream
& str
)
499 wxTextInputStream
s(str
);
500 m_value
= (float)s
.ReadDouble();
503 #endif // wxUSE_STREAMS
505 bool wxVariantDataReal::Read(wxString
& str
)
507 m_value
= wxAtof((const wxChar
*) str
);
516 class WXDLLIMPEXP_BASE wxVariantDataBool
: public wxVariantData
518 DECLARE_DYNAMIC_CLASS(wxVariantDataBool
)
520 wxVariantDataBool() { m_value
= 0; }
521 wxVariantDataBool(bool value
) { m_value
= value
; }
523 inline bool GetValue() const { return m_value
; }
524 inline void SetValue(bool value
) { m_value
= value
; }
526 virtual void Copy(wxVariantData
& data
);
527 virtual bool Eq(wxVariantData
& data
) const;
528 #if wxUSE_STD_IOSTREAM
529 virtual bool Write(wxSTD ostream
& str
) const;
531 virtual bool Write(wxString
& str
) const;
532 virtual bool Read(wxString
& str
);
533 #if wxUSE_STD_IOSTREAM
534 virtual bool Read(wxSTD istream
& str
);
537 virtual bool Read(wxInputStream
& str
);
538 virtual bool Write(wxOutputStream
& str
) const;
539 #endif // wxUSE_STREAMS
540 virtual wxString
GetType() const { return wxT("bool"); };
546 IMPLEMENT_DYNAMIC_CLASS(wxVariantDataBool
, wxVariantData
)
548 void wxVariantDataBool::Copy(wxVariantData
& data
)
550 wxASSERT_MSG( (data
.GetType() == wxT("bool")), wxT("wxVariantDataBool::Copy: Can't copy to this type of data") );
552 wxVariantDataBool
& otherData
= (wxVariantDataBool
&) data
;
554 otherData
.m_value
= m_value
;
557 bool wxVariantDataBool::Eq(wxVariantData
& data
) const
559 wxASSERT_MSG( (data
.GetType() == wxT("bool")), wxT("wxVariantDataBool::Eq: argument mismatch") );
561 wxVariantDataBool
& otherData
= (wxVariantDataBool
&) data
;
563 return (otherData
.m_value
== m_value
);
566 #if wxUSE_STD_IOSTREAM
567 bool wxVariantDataBool::Write(wxSTD ostream
& str
) const
571 str
<< (const char*) s
.mb_str();
576 bool wxVariantDataBool::Write(wxString
& str
) const
578 str
.Printf(wxT("%d"), (int) m_value
);
582 #if wxUSE_STD_IOSTREAM
583 bool wxVariantDataBool::Read(wxSTD istream
& WXUNUSED(str
))
585 wxFAIL_MSG(wxT("Unimplemented"));
586 // str >> (long) m_value;
592 bool wxVariantDataBool::Write(wxOutputStream
& str
) const
594 wxTextOutputStream
s(str
);
600 bool wxVariantDataBool::Read(wxInputStream
& str
)
602 wxTextInputStream
s(str
);
604 m_value
= s
.Read8() != 0;
607 #endif // wxUSE_STREAMS
609 bool wxVariantDataBool::Read(wxString
& str
)
611 m_value
= (wxAtol((const wxChar
*) str
) != 0);
620 class WXDLLIMPEXP_BASE wxVariantDataChar
: public wxVariantData
622 DECLARE_DYNAMIC_CLASS(wxVariantDataChar
)
624 wxVariantDataChar() { m_value
= 0; }
625 wxVariantDataChar(char value
) { m_value
= value
; }
627 inline char GetValue() const { return m_value
; }
628 inline void SetValue(char value
) { m_value
= value
; }
630 virtual void Copy(wxVariantData
& data
);
631 virtual bool Eq(wxVariantData
& data
) const;
632 #if wxUSE_STD_IOSTREAM
633 virtual bool Read(wxSTD istream
& str
);
634 virtual bool Write(wxSTD ostream
& str
) const;
636 virtual bool Read(wxString
& str
);
637 virtual bool Write(wxString
& str
) const;
639 virtual bool Read(wxInputStream
& str
);
640 virtual bool Write(wxOutputStream
& str
) const;
641 #endif // wxUSE_STREAMS
642 virtual wxString
GetType() const { return wxT("char"); };
648 IMPLEMENT_DYNAMIC_CLASS(wxVariantDataChar
, wxVariantData
)
650 void wxVariantDataChar::Copy(wxVariantData
& data
)
652 wxASSERT_MSG( (data
.GetType() == wxT("char")), wxT("wxVariantDataChar::Copy: Can't copy to this type of data") );
654 wxVariantDataChar
& otherData
= (wxVariantDataChar
&) data
;
656 otherData
.m_value
= m_value
;
659 bool wxVariantDataChar::Eq(wxVariantData
& data
) const
661 wxASSERT_MSG( (data
.GetType() == wxT("char")), wxT("wxVariantDataChar::Eq: argument mismatch") );
663 wxVariantDataChar
& otherData
= (wxVariantDataChar
&) data
;
665 return (otherData
.m_value
== m_value
);
668 #if wxUSE_STD_IOSTREAM
669 bool wxVariantDataChar::Write(wxSTD ostream
& str
) const
673 str
<< (const char*) s
.mb_str();
678 bool wxVariantDataChar::Write(wxString
& str
) const
680 str
.Printf(wxT("%c"), m_value
);
684 #if wxUSE_STD_IOSTREAM
685 bool wxVariantDataChar::Read(wxSTD istream
& WXUNUSED(str
))
687 wxFAIL_MSG(wxT("Unimplemented"));
694 bool wxVariantDataChar::Write(wxOutputStream
& str
) const
696 wxTextOutputStream
s(str
);
702 bool wxVariantDataChar::Read(wxInputStream
& str
)
704 wxTextInputStream
s(str
);
709 #endif // wxUSE_STREAMS
711 bool wxVariantDataChar::Read(wxString
& str
)
713 m_value
= str
.ToAscii()[size_t(0)];
718 * wxVariantDataString
721 class WXDLLIMPEXP_BASE wxVariantDataString
: public wxVariantData
723 DECLARE_DYNAMIC_CLASS(wxVariantDataString
)
725 wxVariantDataString() { }
726 wxVariantDataString(const wxString
& value
) { m_value
= value
; }
728 inline wxString
GetValue() const { return m_value
; }
729 inline void SetValue(const wxString
& value
) { m_value
= value
; }
731 virtual void Copy(wxVariantData
& data
);
732 virtual bool Eq(wxVariantData
& data
) const;
733 #if wxUSE_STD_IOSTREAM
734 virtual bool Write(wxSTD ostream
& str
) const;
736 virtual bool Read(wxString
& str
);
737 virtual bool Write(wxString
& str
) const;
738 #if wxUSE_STD_IOSTREAM
739 virtual bool Read(wxSTD istream
& str
);
742 virtual bool Read(wxInputStream
& str
);
743 virtual bool Write(wxOutputStream
& str
) const;
744 #endif // wxUSE_STREAMS
745 virtual wxString
GetType() const { return wxT("string"); };
751 void wxVariantDataString::Copy(wxVariantData
& data
)
753 wxASSERT_MSG( (data
.GetType() == wxT("string")), wxT("wxVariantDataString::Copy: Can't copy to this type of data") );
755 wxVariantDataString
& otherData
= (wxVariantDataString
&) data
;
757 otherData
.m_value
= m_value
;
760 bool wxVariantDataString::Eq(wxVariantData
& data
) const
762 wxASSERT_MSG( (data
.GetType() == wxT("string")), wxT("wxVariantDataString::Eq: argument mismatch") );
764 wxVariantDataString
& otherData
= (wxVariantDataString
&) data
;
766 return (otherData
.m_value
== m_value
);
769 #if wxUSE_STD_IOSTREAM
770 bool wxVariantDataString::Write(wxSTD ostream
& str
) const
772 str
<< (const char*) m_value
.mb_str();
777 bool wxVariantDataString::Write(wxString
& str
) const
783 #if wxUSE_STD_IOSTREAM
784 bool wxVariantDataString::Read(wxSTD istream
& str
)
792 bool wxVariantDataString::Write(wxOutputStream
& str
) const
794 // why doesn't wxOutputStream::operator<< take "const wxString&"
795 wxTextOutputStream
s(str
);
796 s
.WriteString(m_value
);
800 bool wxVariantDataString::Read(wxInputStream
& str
)
802 wxTextInputStream
s(str
);
804 m_value
= s
.ReadLine();
807 #endif // wxUSE_STREAMS
809 bool wxVariantDataString::Read(wxString
& str
)
815 IMPLEMENT_DYNAMIC_CLASS(wxVariantDataString
, wxVariantData
)
818 * wxVariantDataVoidPtr
821 class wxVariantDataVoidPtr
: public wxVariantData
823 DECLARE_DYNAMIC_CLASS(wxVariantDataVoidPtr
)
825 wxVariantDataVoidPtr() { }
826 wxVariantDataVoidPtr(void* value
) { m_value
= value
; }
828 inline void* GetValue() const { return m_value
; }
829 inline void SetValue(void* value
) { m_value
= value
; }
831 virtual void Copy(wxVariantData
& data
);
832 virtual bool Eq(wxVariantData
& data
) const;
833 #if wxUSE_STD_IOSTREAM
834 virtual bool Write(wxSTD ostream
& str
) const;
836 virtual bool Write(wxString
& str
) const;
837 #if wxUSE_STD_IOSTREAM
838 virtual bool Read(wxSTD istream
& str
);
840 virtual bool Read(wxString
& str
);
841 virtual wxString
GetType() const { return wxT("void*"); };
842 virtual wxVariantData
* Clone() { return new wxVariantDataVoidPtr
; }
847 DECLARE_NO_COPY_CLASS(wxVariantDataVoidPtr
)
850 IMPLEMENT_DYNAMIC_CLASS(wxVariantDataVoidPtr
, wxVariantData
)
852 void wxVariantDataVoidPtr::Copy(wxVariantData
& data
)
854 wxASSERT_MSG( (data
.GetType() == wxT("void*")), wxT("wxVariantDataVoidPtr::Copy: Can't copy to this type of data") );
856 wxVariantDataVoidPtr
& otherData
= (wxVariantDataVoidPtr
&) data
;
858 otherData
.m_value
= m_value
;
861 bool wxVariantDataVoidPtr::Eq(wxVariantData
& data
) const
863 wxASSERT_MSG( (data
.GetType() == wxT("void*")), wxT("wxVariantDataVoidPtr::Eq: argument mismatch") );
865 wxVariantDataVoidPtr
& otherData
= (wxVariantDataVoidPtr
&) data
;
867 return (otherData
.m_value
== m_value
);
870 #if wxUSE_STD_IOSTREAM
871 bool wxVariantDataVoidPtr::Write(wxSTD ostream
& str
) const
875 str
<< (const char*) s
.mb_str();
880 bool wxVariantDataVoidPtr::Write(wxString
& str
) const
882 str
.Printf(wxT("%p"), m_value
);
886 #if wxUSE_STD_IOSTREAM
887 bool wxVariantDataVoidPtr::Read(wxSTD istream
& WXUNUSED(str
))
894 bool wxVariantDataVoidPtr::Read(wxString
& WXUNUSED(str
))
901 * wxVariantDataWxObjectPtr
904 class wxVariantDataWxObjectPtr
: public wxVariantData
906 DECLARE_DYNAMIC_CLASS(wxVariantDataWxObjectPtr
)
908 wxVariantDataWxObjectPtr() { }
909 wxVariantDataWxObjectPtr(wxObject
* value
) { m_value
= value
; }
911 inline wxObject
* GetValue() const { return m_value
; }
912 inline void SetValue(wxObject
* value
) { m_value
= value
; }
914 virtual void Copy(wxVariantData
& data
);
915 virtual bool Eq(wxVariantData
& data
) const;
916 #if wxUSE_STD_IOSTREAM
917 virtual bool Write(wxSTD ostream
& str
) const;
919 virtual bool Write(wxString
& str
) const;
920 #if wxUSE_STD_IOSTREAM
921 virtual bool Read(wxSTD istream
& str
);
923 virtual bool Read(wxString
& str
);
924 virtual wxString
GetType() const ;
925 virtual wxVariantData
* Clone() { return new wxVariantDataWxObjectPtr
; }
927 virtual wxClassInfo
* GetValueClassInfo() ;
931 DECLARE_NO_COPY_CLASS(wxVariantDataWxObjectPtr
)
934 IMPLEMENT_DYNAMIC_CLASS(wxVariantDataWxObjectPtr
, wxVariantData
)
936 void wxVariantDataWxObjectPtr::Copy(wxVariantData
& data
)
938 wxASSERT_MSG( wxIsKindOf((&data
), wxVariantDataWxObjectPtr
) ,\
939 wxT("wxVariantDataWxObjectPtr::Copy: Can't copy to this type of data") \
942 wxVariantDataWxObjectPtr
& otherData
= (wxVariantDataWxObjectPtr
&) data
;
944 otherData
.m_value
= m_value
;
947 bool wxVariantDataWxObjectPtr::Eq(wxVariantData
& data
) const
949 wxASSERT_MSG( wxIsKindOf((&data
), wxVariantDataWxObjectPtr
), wxT("wxVariantDataWxObjectPtr::Eq: argument mismatch") );
951 wxVariantDataWxObjectPtr
& otherData
= (wxVariantDataWxObjectPtr
&) data
;
953 return (otherData
.m_value
== m_value
);
956 wxString
wxVariantDataWxObjectPtr::GetType() const
958 wxString
returnVal(wxT("wxObject"));
960 returnVal
= m_value
->GetClassInfo()->GetClassName();
965 wxClassInfo
* wxVariantDataWxObjectPtr::GetValueClassInfo()
967 wxClassInfo
* returnVal
=NULL
;
969 if (m_value
) returnVal
= m_value
->GetClassInfo();
974 #if wxUSE_STD_IOSTREAM
975 bool wxVariantDataWxObjectPtr::Write(wxSTD ostream
& str
) const
979 str
<< (const char*) s
.mb_str();
984 bool wxVariantDataWxObjectPtr::Write(wxString
& str
) const
986 str
.Printf(wxT("%s(%p)"), GetType().c_str(), m_value
);
990 #if wxUSE_STD_IOSTREAM
991 bool wxVariantDataWxObjectPtr::Read(wxSTD istream
& WXUNUSED(str
))
998 bool wxVariantDataWxObjectPtr::Read(wxString
& WXUNUSED(str
))
1006 * wxVariantDataDateTime
1011 class wxVariantDataDateTime
: public wxVariantData
1013 DECLARE_DYNAMIC_CLASS(wxVariantDataDateTime
)
1016 wxVariantDataDateTime() { }
1017 wxVariantDataDateTime(const wxDateTime
& value
) { m_value
= value
; }
1019 wxVariantDataDateTime(const TIME_STRUCT
* valptr
)
1020 { m_value
= wxDateTime(valptr
->hour
, valptr
->minute
, valptr
->second
); }
1021 wxVariantDataDateTime(const DATE_STRUCT
* valptr
)
1022 { m_value
= wxDateTime(valptr
->day
, (wxDateTime::Month
) (valptr
->month
- 1),valptr
->year
); }
1023 wxVariantDataDateTime(const TIMESTAMP_STRUCT
* valptr
)
1024 { m_value
= wxDateTime(valptr
->day
, (wxDateTime::Month
) (valptr
->month
- 1), valptr
->year
,
1025 valptr
->hour
, valptr
->minute
, valptr
->second
, (wxDateTime::wxDateTime_t
)valptr
->fraction
); }
1028 inline wxDateTime
GetValue() const { return m_value
; }
1029 inline void SetValue(const wxDateTime
& value
) { m_value
= value
; }
1031 virtual void Copy(wxVariantData
& data
);
1032 virtual bool Eq(wxVariantData
& data
) const;
1033 #if wxUSE_STD_IOSTREAM
1034 virtual bool Write(wxSTD ostream
& str
) const;
1036 virtual bool Write(wxString
& str
) const;
1037 #if wxUSE_STD_IOSTREAM
1038 virtual bool Read(wxSTD istream
& str
);
1040 virtual bool Read(wxString
& str
);
1041 virtual wxString
GetType() const { return wxT("datetime"); };
1042 virtual wxVariantData
* Clone() { return new wxVariantDataDateTime
; }
1049 IMPLEMENT_DYNAMIC_CLASS(wxVariantDataDateTime
, wxVariantData
)
1051 void wxVariantDataDateTime::Copy(wxVariantData
& data
)
1053 wxASSERT_MSG( (data
.GetType() == wxT("datetime")), wxT("wxVariantDataDateTime::Copy: Can't copy to this type of data") );
1055 wxVariantDataDateTime
& otherData
= (wxVariantDataDateTime
&) data
;
1057 otherData
.m_value
= m_value
;
1061 bool wxVariantDataDateTime::Eq(wxVariantData
& data
) const
1063 wxASSERT_MSG( (data
.GetType() == wxT("datetime")), wxT("wxVariantDataDateTime::Eq: argument mismatch") );
1065 wxVariantDataDateTime
& otherData
= (wxVariantDataDateTime
&) data
;
1067 return (otherData
.m_value
== m_value
);
1071 #if wxUSE_STD_IOSTREAM
1072 bool wxVariantDataDateTime::Write(wxSTD ostream
& WXUNUSED(str
)) const
1080 bool wxVariantDataDateTime::Write(wxString
& str
) const
1082 str
= m_value
.Format();
1087 #if wxUSE_STD_IOSTREAM
1088 bool wxVariantDataDateTime::Read(wxSTD istream
& WXUNUSED(str
))
1096 bool wxVariantDataDateTime::Read(wxString
& str
)
1098 if(! m_value
.ParseDateTime(str
))
1103 #endif // wxUSE_DATETIME
1105 // ----------------------------------------------------------------------------
1106 // wxVariantDataArrayString
1107 // ----------------------------------------------------------------------------
1109 class wxVariantDataArrayString
: public wxVariantData
1112 wxVariantDataArrayString() { }
1113 wxVariantDataArrayString(const wxArrayString
& value
) { m_value
= value
; }
1115 wxArrayString
GetValue() const { return m_value
; }
1116 void SetValue(const wxArrayString
& value
) { m_value
= value
; }
1118 virtual void Copy(wxVariantData
& data
);
1119 virtual bool Eq(wxVariantData
& data
) const;
1120 #if wxUSE_STD_IOSTREAM
1121 virtual bool Write(wxSTD ostream
& str
) const;
1123 virtual bool Write(wxString
& str
) const;
1124 #if wxUSE_STD_IOSTREAM
1125 virtual bool Read(wxSTD istream
& str
);
1127 virtual bool Read(wxString
& str
);
1128 virtual wxString
GetType() const { return wxT("arrstring"); };
1129 virtual wxVariantData
* Clone() { return new wxVariantDataArrayString
; }
1132 wxArrayString m_value
;
1134 DECLARE_DYNAMIC_CLASS(wxVariantDataArrayString
)
1137 IMPLEMENT_DYNAMIC_CLASS(wxVariantDataArrayString
, wxVariantData
)
1139 void wxVariantDataArrayString::Copy(wxVariantData
& data
)
1141 wxASSERT_MSG( data
.GetType() == GetType(), wxT("wxVariantDataArrayString::Copy: Can't copy to this type of data") );
1143 wxVariantDataArrayString
& otherData
= (wxVariantDataArrayString
&) data
;
1145 otherData
.m_value
= m_value
;
1149 bool wxVariantDataArrayString::Eq(wxVariantData
& data
) const
1151 wxASSERT_MSG( data
.GetType() == GetType(), wxT("wxVariantDataArrayString::Eq: argument mismatch") );
1153 wxVariantDataArrayString
& otherData
= (wxVariantDataArrayString
&) data
;
1155 return otherData
.m_value
== m_value
;
1159 #if wxUSE_STD_IOSTREAM
1160 bool wxVariantDataArrayString::Write(wxSTD ostream
& WXUNUSED(str
)) const
1168 bool wxVariantDataArrayString::Write(wxString
& str
) const
1170 size_t count
= m_value
.GetCount();
1171 for ( size_t n
= 0; n
< count
; n
++ )
1183 #if wxUSE_STD_IOSTREAM
1184 bool wxVariantDataArrayString::Read(wxSTD istream
& WXUNUSED(str
))
1192 bool wxVariantDataArrayString::Read(wxString
& str
)
1194 wxStringTokenizer
tk(str
, _T(";"));
1195 while ( tk
.HasMoreTokens() )
1197 m_value
.Add(tk
.GetNextToken());
1209 IMPLEMENT_DYNAMIC_CLASS(wxVariant
, wxObject
)
1211 // Construction & destruction
1212 wxVariant::wxVariant()
1214 m_data
= (wxVariantData
*) NULL
;
1217 wxVariant::wxVariant(double val
, const wxString
& name
)
1219 m_data
= new wxVariantDataReal(val
);
1223 wxVariant::wxVariant(long val
, const wxString
& name
)
1225 m_data
= new wxVariantDataLong(val
);
1230 wxVariant::wxVariant(bool val
, const wxString
& name
)
1232 m_data
= new wxVariantDataBool(val
);
1237 wxVariant::wxVariant(char val
, const wxString
& name
)
1239 m_data
= new wxVariantDataChar(val
);
1243 wxVariant::wxVariant(const wxString
& val
, const wxString
& name
)
1245 m_data
= new wxVariantDataString(val
);
1249 wxVariant::wxVariant(const wxChar
* val
, const wxString
& name
)
1251 m_data
= new wxVariantDataString(wxString(val
));
1255 #if WXWIN_COMPATIBILITY_2_4
1257 wxVariant::wxVariant(const wxStringList
& val
, const wxString
& name
)
1259 m_data
= new wxVariantDataStringList(val
);
1265 wxVariant::wxVariant(const wxList
& val
, const wxString
& name
) // List of variants
1267 m_data
= new wxVariantDataList(val
);
1271 wxVariant::wxVariant( void* val
, const wxString
& name
)
1273 m_data
= new wxVariantDataVoidPtr(val
);
1277 wxVariant::wxVariant( wxObject
* val
, const wxString
& name
)
1279 m_data
= new wxVariantDataWxObjectPtr(val
);
1284 wxVariant::wxVariant(const wxDateTime
& val
, const wxString
& name
) // Date
1286 m_data
= new wxVariantDataDateTime(val
);
1289 #endif // wxUSE_DATETIME
1292 wxVariant::wxVariant(const TIME_STRUCT
* valptr
, const wxString
& name
) // Date
1294 m_data
= new wxVariantDataDateTime(valptr
);
1298 wxVariant::wxVariant(const TIMESTAMP_STRUCT
* valptr
, const wxString
& name
) // Date
1300 m_data
= new wxVariantDataDateTime(valptr
);
1304 wxVariant::wxVariant(const DATE_STRUCT
* valptr
, const wxString
& name
) // Date
1306 m_data
= new wxVariantDataDateTime(valptr
);
1309 #endif // wxUSE_ODBC
1311 wxVariant::wxVariant(const wxArrayString
& val
, const wxString
& name
) // Strings
1313 m_data
= new wxVariantDataArrayString(val
);
1317 wxVariant::wxVariant(const wxVariant
& variant
)
1320 if (!variant
.IsNull())
1322 m_data
= (wxVariantData
*) variant
.GetData()->GetClassInfo()->CreateObject();
1323 variant
.m_data
->Copy(*m_data
);
1326 m_data
= (wxVariantData
*) NULL
;
1327 m_name
= variant
.m_name
;
1330 wxVariant::wxVariant(wxVariantData
* data
, const wxString
& name
) // User-defined data
1336 wxVariant::~wxVariant()
1342 // Make NULL (i.e. delete the data)
1343 void wxVariant::MakeNull()
1349 // Generic operators
1351 void wxVariant::operator= (const wxVariant
& variant
)
1353 if (variant
.IsNull())
1359 if (IsNull() || (GetType() != variant
.GetType()))
1363 m_data
= (wxVariantData
*) variant
.GetData()->GetClassInfo()->CreateObject();
1366 variant
.GetData()->Copy(* GetData());
1368 m_name
= variant
.m_name
;
1371 // Assignment using data, e.g.
1372 // myVariant = new wxStringVariantData("hello")
1373 void wxVariant::operator= (wxVariantData
* variantData
)
1376 m_data
= variantData
;
1379 bool wxVariant::operator== (const wxVariant
& variant
) const
1381 if (IsNull() || variant
.IsNull())
1382 return (IsNull() == variant
.IsNull());
1384 return (GetData()->Eq(* variant
.GetData()));
1387 bool wxVariant::operator!= (const wxVariant
& variant
) const
1389 return (!(*this == variant
));
1393 // Specific operators
1394 bool wxVariant::operator== (double value
) const
1397 if (!Convert(&thisValue
))
1400 return wxIsSameDouble(value
, thisValue
);
1403 bool wxVariant::operator!= (double value
) const
1405 return (!((*this) == value
));
1408 void wxVariant::operator= (double value
)
1410 if (GetType() == wxT("double"))
1412 ((wxVariantDataReal
*)GetData())->SetValue(value
);
1418 m_data
= new wxVariantDataReal(value
);
1422 bool wxVariant::operator== (long value
) const
1425 if (!Convert(&thisValue
))
1428 return (value
== thisValue
);
1431 bool wxVariant::operator!= (long value
) const
1433 return (!((*this) == value
));
1436 void wxVariant::operator= (long value
)
1438 if (GetType() == wxT("long"))
1440 ((wxVariantDataLong
*)GetData())->SetValue(value
);
1446 m_data
= new wxVariantDataLong(value
);
1450 bool wxVariant::operator== (char value
) const
1453 if (!Convert(&thisValue
))
1456 return (value
== thisValue
);
1459 bool wxVariant::operator!= (char value
) const
1461 return (!((*this) == value
));
1464 void wxVariant::operator= (char value
)
1466 if (GetType() == wxT("char"))
1468 ((wxVariantDataChar
*)GetData())->SetValue(value
);
1474 m_data
= new wxVariantDataChar(value
);
1479 bool wxVariant::operator== (bool value
) const
1482 if (!Convert(&thisValue
))
1485 return (value
== thisValue
);
1488 bool wxVariant::operator!= (bool value
) const
1490 return (!((*this) == value
));
1493 void wxVariant::operator= (bool value
)
1495 if (GetType() == wxT("bool"))
1497 ((wxVariantDataBool
*)GetData())->SetValue(value
);
1503 m_data
= new wxVariantDataBool(value
);
1508 bool wxVariant::operator== (const wxString
& value
) const
1511 if (!Convert(&thisValue
))
1514 return value
== thisValue
;
1517 bool wxVariant::operator!= (const wxString
& value
) const
1519 return (!((*this) == value
));
1522 void wxVariant::operator= (const wxString
& value
)
1524 if (GetType() == wxT("string"))
1526 ((wxVariantDataString
*)GetData())->SetValue(value
);
1532 m_data
= new wxVariantDataString(value
);
1536 void wxVariant::operator= (const wxChar
* value
)
1538 if (GetType() == wxT("string"))
1540 ((wxVariantDataString
*)GetData())->SetValue(wxString(value
));
1546 m_data
= new wxVariantDataString(wxString(value
));
1550 #if WXWIN_COMPATIBILITY_2_4
1552 bool wxVariant::operator== (const wxStringList
& value
) const
1554 wxASSERT_MSG( (GetType() == wxT("stringlist")), wxT("Invalid type for == operator") );
1556 wxVariantDataStringList
other(value
);
1557 return (m_data
->Eq(other
));
1560 bool wxVariant::operator!= (const wxStringList
& value
) const
1562 wxASSERT_MSG( (GetType() == wxT("stringlist")), wxT("Invalid type for == operator") );
1564 wxVariantDataStringList
other(value
);
1565 return !(m_data
->Eq(other
));
1568 void wxVariant::operator= (const wxStringList
& value
)
1570 if (GetType() == wxT("stringlist"))
1572 ((wxVariantDataStringList
*)GetData())->SetValue(value
);
1578 m_data
= new wxVariantDataStringList(value
);
1584 bool wxVariant::operator== (const wxList
& value
) const
1586 wxASSERT_MSG( (GetType() == wxT("list")), wxT("Invalid type for == operator") );
1588 wxVariantDataList
other(value
);
1589 return (m_data
->Eq(other
));
1592 bool wxVariant::operator!= (const wxList
& value
) const
1594 return (!((*this) == value
));
1597 void wxVariant::operator= (const wxList
& value
)
1599 if (GetType() == wxT("list"))
1601 ((wxVariantDataList
*)GetData())->SetValue(value
);
1607 m_data
= new wxVariantDataList(value
);
1611 bool wxVariant::operator== (void* value
) const
1613 return (value
== ((wxVariantDataVoidPtr
*)GetData())->GetValue());
1616 bool wxVariant::operator!= (void* value
) const
1618 return (!((*this) == (void*) value
));
1621 void wxVariant::operator= (void* value
)
1623 if (GetType() == wxT("void*"))
1625 ((wxVariantDataVoidPtr
*)GetData())->SetValue(value
);
1631 m_data
= new wxVariantDataVoidPtr(value
);
1636 bool wxVariant::operator== (const wxDateTime
& value
) const
1638 wxDateTime thisValue
;
1639 if (!Convert(&thisValue
))
1642 return value
.IsEqualTo(thisValue
);
1645 bool wxVariant::operator!= (const wxDateTime
& value
) const
1647 return (!((*this) == value
));
1650 void wxVariant::operator= (const wxDateTime
& value
)
1652 if (GetType() == wxT("datetime"))
1654 ((wxVariantDataDateTime
*)GetData())->SetValue(value
);
1660 m_data
= new wxVariantDataDateTime(value
);
1663 #endif // wxUSE_DATETIME
1666 void wxVariant::operator= (const DATE_STRUCT
* value
)
1670 m_data
= new wxVariantDataDateTime(value
);
1674 void wxVariant::operator= (const TIME_STRUCT
* value
)
1678 m_data
= new wxVariantDataDateTime(value
);
1682 void wxVariant::operator= (const TIMESTAMP_STRUCT
* value
)
1686 m_data
= new wxVariantDataDateTime(value
);
1689 #endif // wxUSE_ODBC
1691 bool wxVariant::operator==(const wxArrayString
& WXUNUSED(value
)) const
1693 wxFAIL_MSG( _T("TODO") );
1698 bool wxVariant::operator!=(const wxArrayString
& value
) const
1700 return !(*this == value
);
1703 void wxVariant::operator=(const wxArrayString
& value
)
1705 if (GetType() == wxT("arrstring"))
1707 ((wxVariantDataArrayString
*)GetData())->SetValue(value
);
1712 m_data
= new wxVariantDataArrayString(value
);
1716 wxArrayString
wxVariant::GetArrayString() const
1718 if ( GetType() == wxT("arrstring") )
1719 return ((wxVariantDataArrayString
*)GetData())->GetValue();
1721 return wxArrayString();
1725 // Treat a list variant as an array
1726 wxVariant
wxVariant::operator[] (size_t idx
) const
1728 #if WXWIN_COMPATIBILITY_2_4
1729 wxASSERT_MSG( (GetType() == wxT("list") || GetType() == wxT("stringlist")), wxT("Invalid type for array operator") );
1731 wxASSERT_MSG( GetType() == wxT("list"), wxT("Invalid type for array operator") );
1734 if (GetType() == wxT("list"))
1736 wxVariantDataList
* data
= (wxVariantDataList
*) m_data
;
1737 wxASSERT_MSG( (idx
< data
->GetValue().GetCount()), wxT("Invalid index for array") );
1738 return * (wxVariant
*) (data
->GetValue().Item(idx
)->GetData());
1740 #if WXWIN_COMPATIBILITY_2_4
1741 else if (GetType() == wxT("stringlist"))
1743 wxVariantDataStringList
* data
= (wxVariantDataStringList
*) m_data
;
1744 wxASSERT_MSG( (idx
< data
->GetValue().GetCount()), wxT("Invalid index for array") );
1746 wxString
str( (const wxChar
*) (data
->GetValue().Item(idx
)->GetData()) );
1747 wxVariant
variant( str
);
1751 return wxNullVariant
;
1754 wxVariant
& wxVariant::operator[] (size_t idx
)
1756 // We can't return a reference to a variant for a string list, since the string
1757 // is actually stored as a char*, not a variant.
1759 wxASSERT_MSG( (GetType() == wxT("list")), wxT("Invalid type for array operator") );
1761 wxVariantDataList
* data
= (wxVariantDataList
*) m_data
;
1762 wxASSERT_MSG( (idx
< data
->GetValue().GetCount()), wxT("Invalid index for array") );
1764 return * (wxVariant
*) (data
->GetValue().Item(idx
)->GetData());
1767 // Return the number of elements in a list
1768 size_t wxVariant::GetCount() const
1770 #if WXWIN_COMPATIBILITY_2_4
1771 wxASSERT_MSG( (GetType() == wxT("list") || GetType() == wxT("stringlist")), wxT("Invalid type for GetCount()") );
1773 wxASSERT_MSG( GetType() == wxT("list"), wxT("Invalid type for GetCount()") );
1776 if (GetType() == wxT("list"))
1778 wxVariantDataList
* data
= (wxVariantDataList
*) m_data
;
1779 return data
->GetValue().GetCount();
1781 #if WXWIN_COMPATIBILITY_2_4
1782 else if (GetType() == wxT("stringlist"))
1784 wxVariantDataStringList
* data
= (wxVariantDataStringList
*) m_data
;
1785 return data
->GetValue().GetCount();
1791 wxString
wxVariant::MakeString() const
1796 if (GetData()->Write(str
))
1799 return wxEmptyString
;
1804 void wxVariant::SetData(wxVariantData
* data
)
1806 if (m_data
) delete m_data
;
1811 // Returns a string representing the type of the variant,
1812 // e.g. "string", "bool", "list", "double", "long"
1813 wxString
wxVariant::GetType() const
1816 return wxString(wxT("null"));
1818 return m_data
->GetType();
1822 bool wxVariant::IsType(const wxString
& type
) const
1824 return (GetType() == type
);
1827 bool wxVariant::IsValueKindOf(const wxClassInfo
* type
) const
1829 wxClassInfo
* info
=m_data
->GetValueClassInfo();
1830 return info
? info
->IsKindOf(type
) : false ;
1835 double wxVariant::GetReal() const
1838 if (Convert(& value
))
1842 wxFAIL_MSG(wxT("Could not convert to a real number"));
1847 long wxVariant::GetInteger() const
1850 if (Convert(& value
))
1854 wxFAIL_MSG(wxT("Could not convert to an integer"));
1859 char wxVariant::GetChar() const
1862 if (Convert(& value
))
1866 wxFAIL_MSG(wxT("Could not convert to a char"));
1871 bool wxVariant::GetBool() const
1874 if (Convert(& value
))
1878 wxFAIL_MSG(wxT("Could not convert to a bool"));
1883 wxString
wxVariant::GetString() const
1886 if (!Convert(& value
))
1888 wxFAIL_MSG(wxT("Could not convert to a string"));
1894 void* wxVariant::GetVoidPtr() const
1896 wxASSERT( (GetType() == wxT("void*")) );
1898 return (void*) ((wxVariantDataVoidPtr
*) m_data
)->GetValue();
1901 wxObject
* wxVariant::GetWxObjectPtr()
1903 wxASSERT(wxIsKindOf(m_data
, wxVariantDataWxObjectPtr
));
1904 return (wxObject
*) ((wxVariantDataWxObjectPtr
*) m_data
)->GetValue();
1908 wxDateTime
wxVariant::GetDateTime() const
1911 if (!Convert(& value
))
1913 wxFAIL_MSG(wxT("Could not convert to a datetime"));
1918 #endif // wxUSE_DATETIME
1920 wxList
& wxVariant::GetList() const
1922 wxASSERT( (GetType() == wxT("list")) );
1924 return (wxList
&) ((wxVariantDataList
*) m_data
)->GetValue();
1927 #if WXWIN_COMPATIBILITY_2_4
1929 wxStringList
& wxVariant::GetStringList() const
1931 wxASSERT( (GetType() == wxT("stringlist")) );
1933 return (wxStringList
&) ((wxVariantDataStringList
*) m_data
)->GetValue();
1939 void wxVariant::NullList()
1941 SetData(new wxVariantDataList());
1945 void wxVariant::Append(const wxVariant
& value
)
1947 wxList
& list
= GetList();
1949 list
.Append(new wxVariant(value
));
1952 // Insert at front of list
1953 void wxVariant::Insert(const wxVariant
& value
)
1955 wxList
& list
= GetList();
1957 list
.Insert(new wxVariant(value
));
1960 // Returns true if the variant is a member of the list
1961 bool wxVariant::Member(const wxVariant
& value
) const
1963 wxList
& list
= GetList();
1965 wxList::compatibility_iterator node
= list
.GetFirst();
1968 wxVariant
* other
= (wxVariant
*) node
->GetData();
1969 if (value
== *other
)
1971 node
= node
->GetNext();
1976 // Deletes the nth element of the list
1977 bool wxVariant::Delete(size_t item
)
1979 wxList
& list
= GetList();
1981 wxASSERT_MSG( (item
< list
.GetCount()), wxT("Invalid index to Delete") );
1982 wxList::compatibility_iterator node
= list
.Item(item
);
1983 wxVariant
* variant
= (wxVariant
*) node
->GetData();
1990 void wxVariant::ClearList()
1992 if (!IsNull() && (GetType() == wxT("list")))
1994 ((wxVariantDataList
*) m_data
)->Clear();
1998 if (!GetType().IsSameAs(wxT("list")))
2003 m_data
= new wxVariantDataList
;
2008 bool wxVariant::Convert(long* value
) const
2010 wxString
type(GetType());
2011 if (type
== wxT("double"))
2012 *value
= (long) (((wxVariantDataReal
*)GetData())->GetValue());
2013 else if (type
== wxT("long"))
2014 *value
= ((wxVariantDataLong
*)GetData())->GetValue();
2016 else if (type
== wxT("bool"))
2017 *value
= (long) (((wxVariantDataBool
*)GetData())->GetValue());
2019 else if (type
== wxT("string"))
2020 *value
= wxAtol((const wxChar
*) ((wxVariantDataString
*)GetData())->GetValue());
2027 bool wxVariant::Convert(bool* value
) const
2029 wxString
type(GetType());
2030 if (type
== wxT("double"))
2031 *value
= ((int) (((wxVariantDataReal
*)GetData())->GetValue()) != 0);
2032 else if (type
== wxT("long"))
2033 *value
= (((wxVariantDataLong
*)GetData())->GetValue() != 0);
2035 else if (type
== wxT("bool"))
2036 *value
= ((wxVariantDataBool
*)GetData())->GetValue();
2038 else if (type
== wxT("string"))
2040 wxString
val(((wxVariantDataString
*)GetData())->GetValue());
2042 if (val
== wxT("true") || val
== wxT("yes") || val
== wxT('1') )
2044 else if (val
== wxT("false") || val
== wxT("no") || val
== wxT('0') )
2055 bool wxVariant::Convert(double* value
) const
2057 wxString
type(GetType());
2058 if (type
== wxT("double"))
2059 *value
= ((wxVariantDataReal
*)GetData())->GetValue();
2060 else if (type
== wxT("long"))
2061 *value
= (double) (((wxVariantDataLong
*)GetData())->GetValue());
2063 else if (type
== wxT("bool"))
2064 *value
= (double) (((wxVariantDataBool
*)GetData())->GetValue());
2066 else if (type
== wxT("string"))
2067 *value
= (double) wxAtof((const wxChar
*) ((wxVariantDataString
*)GetData())->GetValue());
2074 bool wxVariant::Convert(char* value
) const
2076 wxString
type(GetType());
2077 if (type
== wxT("char"))
2078 *value
= ((wxVariantDataChar
*)GetData())->GetValue();
2079 else if (type
== wxT("long"))
2080 *value
= (char) (((wxVariantDataLong
*)GetData())->GetValue());
2082 else if (type
== wxT("bool"))
2083 *value
= (char) (((wxVariantDataBool
*)GetData())->GetValue());
2091 bool wxVariant::Convert(wxString
* value
) const
2093 *value
= MakeString();
2098 bool wxVariant::Convert(wxDateTime
* value
) const
2100 wxString
type(GetType());
2101 if (type
== wxT("datetime"))
2103 *value
= ((wxVariantDataDateTime
*)GetData())->GetValue();
2106 // Fallback to string conversion
2108 return Convert(&val
) &&
2109 (value
->ParseDateTime(val
) || value
->ParseDate(val
));
2111 #endif // wxUSE_DATETIME