]> git.saurik.com Git - wxWidgets.git/blame - src/common/variant.cpp
No *.h in src/common/ anymore.
[wxWidgets.git] / src / common / variant.cpp
CommitLineData
341287bf
JS
1/////////////////////////////////////////////////////////////////////////////
2// Name: variant.cpp
3// Purpose: wxVariant class, container for any type
4// Author: Julian Smart
5// Modified by:
6// Created: 10/09/98
7// RCS-ID: $Id$
8// Copyright: (c)
65571936 9// Licence: wxWindows licence
341287bf
JS
10/////////////////////////////////////////////////////////////////////////////
11
14f355c2 12#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
341287bf
JS
13#pragma implementation "variant.h"
14#endif
15
16// For compilers that support precompilation, includes "wx/wx.h".
17#include "wx/wxprec.h"
18
19#ifdef __BORLANDC__
3f4a0c5b 20 #pragma hdrstop
341287bf
JS
21#endif
22
be087207
RR
23#if wxUSE_STD_IOSTREAM
24 #if wxUSE_IOSTREAMH
25 #include <fstream.h>
26 #else
27 #include <fstream>
28 #endif
fbc535ff 29#endif
341287bf 30
31907d03 31#if defined(__MWERKS__) && __MSL__ >= 0x6000
52cbcda3 32namespace std {}
31907d03
SC
33using namespace std ;
34#endif
35
fae05df5 36#if wxUSE_STREAMS
75ed1d15 37#include "wx/stream.h"
fae05df5
GL
38#include "wx/txtstrm.h"
39#endif
40
341287bf 41#include "wx/string.h"
fb42d7c3
VZ
42#include "wx/tokenzr.h"
43
341287bf
JS
44#include "wx/variant.h"
45
46IMPLEMENT_ABSTRACT_CLASS(wxVariantData, wxObject)
47
fd242375 48wxVariant WXDLLIMPEXP_BASE wxNullVariant;
341287bf
JS
49
50/*
51 * wxVariantDataList
52 */
53
fd242375 54class WXDLLIMPEXP_BASE wxVariantDataList: public wxVariantData
341287bf
JS
55{
56DECLARE_DYNAMIC_CLASS(wxVariantDataList)
57public:
58 wxVariantDataList() {}
59 wxVariantDataList(const wxList& list);
60 ~wxVariantDataList();
61
62 wxList& GetValue() const { return (wxList&) m_value; }
63 void SetValue(const wxList& value) ;
64
65 virtual void Copy(wxVariantData& data);
66 virtual bool Eq(wxVariantData& data) const;
38830220 67#if wxUSE_STD_IOSTREAM
dd107c50 68 virtual bool Write(wxSTD ostream& str) const;
38830220 69#endif
341287bf 70 virtual bool Write(wxString& str) const;
38830220 71#if wxUSE_STD_IOSTREAM
dd107c50 72 virtual bool Read(wxSTD istream& str);
38830220 73#endif
341287bf 74 virtual bool Read(wxString& str);
223d09f6 75 virtual wxString GetType() const { return wxT("list"); };
341287bf
JS
76
77 void Clear();
78
79protected:
80 wxList m_value;
81};
82
83IMPLEMENT_DYNAMIC_CLASS(wxVariantDataList, wxVariantData)
84
85wxVariantDataList::wxVariantDataList(const wxList& list)
86{
87 SetValue(list);
88}
89
90wxVariantDataList::~wxVariantDataList()
91{
92 Clear();
93}
94
95void wxVariantDataList::SetValue(const wxList& value)
96{
97 Clear();
df5168c4 98 wxList::compatibility_iterator node = value.GetFirst();
341287bf
JS
99 while (node)
100 {
b1d4dd7a 101 wxVariant* var = (wxVariant*) node->GetData();
341287bf 102 m_value.Append(new wxVariant(*var));
b1d4dd7a 103 node = node->GetNext();
341287bf
JS
104 }
105}
106
107void wxVariantDataList::Clear()
108{
df5168c4 109 wxList::compatibility_iterator node = m_value.GetFirst();
341287bf
JS
110 while (node)
111 {
b1d4dd7a 112 wxVariant* var = (wxVariant*) node->GetData();
341287bf 113 delete var;
b1d4dd7a 114 node = node->GetNext();
341287bf
JS
115 }
116 m_value.Clear();
117}
118
119void wxVariantDataList::Copy(wxVariantData& data)
120{
223d09f6 121 wxASSERT_MSG( (data.GetType() == wxT("list")), wxT("wxVariantDataList::Copy: Can't copy to this type of data") );
341287bf
JS
122
123 wxVariantDataList& listData = (wxVariantDataList&) data;
124
125 listData.Clear();
df5168c4 126 wxList::compatibility_iterator node = m_value.GetFirst();
341287bf
JS
127 while (node)
128 {
b1d4dd7a 129 wxVariant* var = (wxVariant*) node->GetData();
341287bf 130 listData.m_value.Append(new wxVariant(*var));
b1d4dd7a 131 node = node->GetNext();
341287bf
JS
132 }
133}
134
135bool wxVariantDataList::Eq(wxVariantData& data) const
136{
223d09f6 137 wxASSERT_MSG( (data.GetType() == wxT("list")), wxT("wxVariantDataList::Eq: argument mismatch") );
341287bf
JS
138
139 wxVariantDataList& listData = (wxVariantDataList&) data;
df5168c4
MB
140 wxList::compatibility_iterator node1 = m_value.GetFirst();
141 wxList::compatibility_iterator node2 = listData.GetValue().GetFirst();
341287bf
JS
142 while (node1 && node2)
143 {
b1d4dd7a
RL
144 wxVariant* var1 = (wxVariant*) node1->GetData();
145 wxVariant* var2 = (wxVariant*) node2->GetData();
341287bf 146 if ((*var1) != (*var2))
cab1a605 147 return false;
b1d4dd7a
RL
148 node1 = node1->GetNext();
149 node2 = node2->GetNext();
341287bf 150 }
cab1a605
WS
151 if (node1 || node2) return false;
152 return true;
341287bf
JS
153}
154
38830220 155#if wxUSE_STD_IOSTREAM
dd107c50 156bool wxVariantDataList::Write(wxSTD ostream& str) const
341287bf
JS
157{
158 wxString s;
159 Write(s);
783b6cfd 160 str << (const char*) s.mb_str();
cab1a605 161 return true;
341287bf 162}
38830220 163#endif
341287bf
JS
164
165bool wxVariantDataList::Write(wxString& str) const
166{
525d8583 167 str = wxEmptyString;
df5168c4 168 wxList::compatibility_iterator node = m_value.GetFirst();
341287bf
JS
169 while (node)
170 {
b1d4dd7a
RL
171 wxVariant* var = (wxVariant*) node->GetData();
172 if (node != m_value.GetFirst())
223d09f6 173 str += wxT(" ");
341287bf
JS
174 wxString str1;
175 str += var->MakeString();
b1d4dd7a 176 node = node->GetNext();
341287bf
JS
177 }
178
cab1a605 179 return true;
341287bf
JS
180}
181
38830220 182#if wxUSE_STD_IOSTREAM
dd107c50 183bool wxVariantDataList::Read(wxSTD istream& WXUNUSED(str))
341287bf 184{
223d09f6 185 wxFAIL_MSG(wxT("Unimplemented"));
341287bf 186 // TODO
cab1a605 187 return false;
341287bf 188}
38830220 189#endif
341287bf
JS
190
191bool wxVariantDataList::Read(wxString& WXUNUSED(str))
192{
223d09f6 193 wxFAIL_MSG(wxT("Unimplemented"));
341287bf 194 // TODO
cab1a605 195 return false;
341287bf 196}
2c3a1064 197#if WXWIN_COMPATIBILITY_2_4
341287bf
JS
198
199/*
200 * wxVariantDataStringList
201 */
202
fd242375 203class WXDLLIMPEXP_BASE wxVariantDataStringList: public wxVariantData
341287bf
JS
204{
205DECLARE_DYNAMIC_CLASS(wxVariantDataStringList)
206public:
207 wxVariantDataStringList() {}
208 wxVariantDataStringList(const wxStringList& list) { m_value = list; }
209
210 wxStringList& GetValue() const { return (wxStringList&) m_value; }
211 void SetValue(const wxStringList& value);
212
213 virtual void Copy(wxVariantData& data);
214 virtual bool Eq(wxVariantData& data) const;
38830220 215#if wxUSE_STD_IOSTREAM
dd107c50 216 virtual bool Write(wxSTD ostream& str) const;
38830220 217#endif
341287bf 218 virtual bool Write(wxString& str) const;
38830220 219#if wxUSE_STD_IOSTREAM
dd107c50 220 virtual bool Read(wxSTD istream& str);
38830220 221#endif
341287bf 222 virtual bool Read(wxString& str);
223d09f6 223 virtual wxString GetType() const { return wxT("stringlist"); };
341287bf
JS
224
225protected:
226 wxStringList m_value;
227};
228
229IMPLEMENT_DYNAMIC_CLASS(wxVariantDataStringList, wxVariantData)
230
231void wxVariantDataStringList::SetValue(const wxStringList& value)
232{
233 m_value = value;
234}
235
236void wxVariantDataStringList::Copy(wxVariantData& data)
237{
223d09f6 238 wxASSERT_MSG( (data.GetType() == wxT("stringlist")), wxT("wxVariantDataStringList::Copy: Can't copy to this type of data") );
341287bf
JS
239
240 wxVariantDataStringList& listData = (wxVariantDataStringList&) data;
241
242 listData.m_value = m_value ;
243}
244
245bool wxVariantDataStringList::Eq(wxVariantData& data) const
246{
223d09f6 247 wxASSERT_MSG( (data.GetType() == wxT("stringlist")), wxT("wxVariantDataStringList::Eq: argument mismatch") );
341287bf
JS
248
249 wxVariantDataStringList& listData = (wxVariantDataStringList&) data;
df5168c4
MB
250 wxStringList::compatibility_iterator node1 = m_value.GetFirst();
251 wxStringList::compatibility_iterator node2 = listData.GetValue().GetFirst();
341287bf
JS
252 while (node1 && node2)
253 {
b1d4dd7a
RL
254 wxString str1 ( node1->GetData() );
255 wxString str2 ( node2->GetData() );
341287bf 256 if (str1 != str2)
cab1a605 257 return false;
b1d4dd7a
RL
258 node1 = node1->GetNext();
259 node2 = node2->GetNext();
341287bf 260 }
cab1a605
WS
261 if (node1 || node2) return false;
262 return true;
341287bf
JS
263}
264
38830220 265#if wxUSE_STD_IOSTREAM
dd107c50 266bool wxVariantDataStringList::Write(wxSTD ostream& str) const
341287bf
JS
267{
268 wxString s;
269 Write(s);
783b6cfd 270 str << (const char*) s.mb_str();
cab1a605 271 return true;
341287bf 272}
38830220 273#endif
341287bf
JS
274
275bool wxVariantDataStringList::Write(wxString& str) const
276{
b1d4dd7a 277 str.Empty();
df5168c4 278 wxStringList::compatibility_iterator node = m_value.GetFirst();
341287bf
JS
279 while (node)
280 {
df5168c4 281 const wxChar* s = node->GetData();
b1d4dd7a 282 if (node != m_value.GetFirst())
223d09f6 283 str += wxT(" ");
341287bf 284 str += s;
b1d4dd7a 285 node = node->GetNext();
341287bf
JS
286 }
287
cab1a605 288 return true;
341287bf
JS
289}
290
38830220 291#if wxUSE_STD_IOSTREAM
dd107c50 292bool wxVariantDataStringList::Read(wxSTD istream& WXUNUSED(str))
341287bf 293{
223d09f6 294 wxFAIL_MSG(wxT("Unimplemented"));
341287bf 295 // TODO
cab1a605 296 return false;
341287bf 297}
38830220 298#endif
341287bf
JS
299
300bool wxVariantDataStringList::Read(wxString& WXUNUSED(str))
301{
223d09f6 302 wxFAIL_MSG(wxT("Unimplemented"));
341287bf 303 // TODO
cab1a605 304 return false;
341287bf
JS
305}
306
2c3a1064
RN
307#endif //2.4 compat
308
341287bf
JS
309/*
310 * wxVariantDataLong
311 */
312
fd242375 313class WXDLLIMPEXP_BASE wxVariantDataLong: public wxVariantData
341287bf
JS
314{
315DECLARE_DYNAMIC_CLASS(wxVariantDataLong)
316public:
317 wxVariantDataLong() { m_value = 0; }
318 wxVariantDataLong(long value) { m_value = value; }
319
320 inline long GetValue() const { return m_value; }
321 inline void SetValue(long value) { m_value = value; }
322
323 virtual void Copy(wxVariantData& data);
324 virtual bool Eq(wxVariantData& data) const;
1ccbb61a
VZ
325
326 virtual bool Read(wxString& str);
341287bf 327 virtual bool Write(wxString& str) const;
38830220 328#if wxUSE_STD_IOSTREAM
dd107c50
VZ
329 virtual bool Read(wxSTD istream& str);
330 virtual bool Write(wxSTD ostream& str) const;
38830220 331#endif
e02afc7a 332#if wxUSE_STREAMS
75ed1d15 333 virtual bool Read(wxInputStream& str);
1ccbb61a 334 virtual bool Write(wxOutputStream &str) const;
e02afc7a 335#endif // wxUSE_STREAMS
1ccbb61a 336
223d09f6 337 virtual wxString GetType() const { return wxT("long"); };
341287bf
JS
338
339protected:
340 long m_value;
341};
342
343IMPLEMENT_DYNAMIC_CLASS(wxVariantDataLong, wxVariantData)
344
345void wxVariantDataLong::Copy(wxVariantData& data)
346{
223d09f6 347 wxASSERT_MSG( (data.GetType() == wxT("long")), wxT("wxVariantDataLong::Copy: Can't copy to this type of data") );
341287bf
JS
348
349 wxVariantDataLong& otherData = (wxVariantDataLong&) data;
350
351 otherData.m_value = m_value;
352}
353
354bool wxVariantDataLong::Eq(wxVariantData& data) const
355{
223d09f6 356 wxASSERT_MSG( (data.GetType() == wxT("long")), wxT("wxVariantDataLong::Eq: argument mismatch") );
341287bf
JS
357
358 wxVariantDataLong& otherData = (wxVariantDataLong&) data;
359
360 return (otherData.m_value == m_value);
361}
362
38830220 363#if wxUSE_STD_IOSTREAM
dd107c50 364bool wxVariantDataLong::Write(wxSTD ostream& str) const
341287bf
JS
365{
366 wxString s;
367 Write(s);
783b6cfd 368 str << (const char*) s.mb_str();
cab1a605 369 return true;
341287bf 370}
38830220 371#endif
341287bf
JS
372
373bool wxVariantDataLong::Write(wxString& str) const
374{
223d09f6 375 str.Printf(wxT("%ld"), m_value);
cab1a605 376 return true;
341287bf
JS
377}
378
38830220 379#if wxUSE_STD_IOSTREAM
dd107c50 380bool wxVariantDataLong::Read(wxSTD istream& str)
341287bf
JS
381{
382 str >> m_value;
cab1a605 383 return true;
341287bf 384}
38830220 385#endif
341287bf 386
e02afc7a 387#if wxUSE_STREAMS
1ccbb61a
VZ
388bool wxVariantDataLong::Write(wxOutputStream& str) const
389{
fae05df5
GL
390 wxTextOutputStream s(str);
391
479cd5de 392 s.Write32((size_t)m_value);
cab1a605 393 return true;
1ccbb61a
VZ
394}
395
75ed1d15
GL
396bool wxVariantDataLong::Read(wxInputStream& str)
397{
fae05df5
GL
398 wxTextInputStream s(str);
399 m_value = s.Read32();
cab1a605 400 return true;
75ed1d15 401}
e02afc7a 402#endif // wxUSE_STREAMS
75ed1d15 403
341287bf
JS
404bool wxVariantDataLong::Read(wxString& str)
405{
783b6cfd 406 m_value = wxAtol((const wxChar*) str);
cab1a605 407 return true;
341287bf
JS
408}
409
410/*
411 * wxVariantDataReal
412 */
413
fd242375 414class WXDLLIMPEXP_BASE wxVariantDataReal: public wxVariantData
341287bf
JS
415{
416DECLARE_DYNAMIC_CLASS(wxVariantDataReal)
417public:
418 wxVariantDataReal() { m_value = 0.0; }
419 wxVariantDataReal(double value) { m_value = value; }
420
421 inline double GetValue() const { return m_value; }
422 inline void SetValue(double value) { m_value = value; }
423
424 virtual void Copy(wxVariantData& data);
425 virtual bool Eq(wxVariantData& data) const;
1ccbb61a 426 virtual bool Read(wxString& str);
38830220 427#if wxUSE_STD_IOSTREAM
dd107c50 428 virtual bool Write(wxSTD ostream& str) const;
38830220 429#endif
341287bf 430 virtual bool Write(wxString& str) const;
38830220 431#if wxUSE_STD_IOSTREAM
dd107c50 432 virtual bool Read(wxSTD istream& str);
38830220 433#endif
e02afc7a 434#if wxUSE_STREAMS
75ed1d15 435 virtual bool Read(wxInputStream& str);
1ccbb61a 436 virtual bool Write(wxOutputStream &str) const;
e02afc7a 437#endif // wxUSE_STREAMS
223d09f6 438 virtual wxString GetType() const { return wxT("double"); };
341287bf
JS
439
440protected:
441 double m_value;
442};
443
444IMPLEMENT_DYNAMIC_CLASS(wxVariantDataReal, wxVariantData)
445
446void wxVariantDataReal::Copy(wxVariantData& data)
447{
223d09f6 448 wxASSERT_MSG( (data.GetType() == wxT("double")), wxT("wxVariantDataReal::Copy: Can't copy to this type of data") );
341287bf
JS
449
450 wxVariantDataReal& otherData = (wxVariantDataReal&) data;
451
452 otherData.m_value = m_value;
453}
454
455bool wxVariantDataReal::Eq(wxVariantData& data) const
456{
223d09f6 457 wxASSERT_MSG( (data.GetType() == wxT("double")), wxT("wxVariantDataReal::Eq: argument mismatch") );
341287bf
JS
458
459 wxVariantDataReal& otherData = (wxVariantDataReal&) data;
460
461 return (otherData.m_value == m_value);
462}
463
38830220 464#if wxUSE_STD_IOSTREAM
dd107c50 465bool wxVariantDataReal::Write(wxSTD ostream& str) const
341287bf
JS
466{
467 wxString s;
468 Write(s);
783b6cfd 469 str << (const char*) s.mb_str();
cab1a605 470 return true;
341287bf 471}
38830220 472#endif
341287bf
JS
473
474bool wxVariantDataReal::Write(wxString& str) const
475{
223d09f6 476 str.Printf(wxT("%.4f"), m_value);
cab1a605 477 return true;
341287bf
JS
478}
479
38830220 480#if wxUSE_STD_IOSTREAM
dd107c50 481bool wxVariantDataReal::Read(wxSTD istream& str)
341287bf
JS
482{
483 str >> m_value;
cab1a605 484 return true;
341287bf 485}
38830220 486#endif
341287bf 487
e02afc7a 488#if wxUSE_STREAMS
1ccbb61a
VZ
489bool wxVariantDataReal::Write(wxOutputStream& str) const
490{
fae05df5
GL
491 wxTextOutputStream s(str);
492 s.WriteDouble((double)m_value);
cab1a605 493 return true;
1ccbb61a
VZ
494}
495
75ed1d15
GL
496bool wxVariantDataReal::Read(wxInputStream& str)
497{
fae05df5
GL
498 wxTextInputStream s(str);
499 m_value = (float)s.ReadDouble();
cab1a605 500 return true;
75ed1d15 501}
e02afc7a 502#endif // wxUSE_STREAMS
75ed1d15 503
341287bf
JS
504bool wxVariantDataReal::Read(wxString& str)
505{
783b6cfd 506 m_value = wxAtof((const wxChar*) str);
cab1a605 507 return true;
341287bf
JS
508}
509
57493f9f 510#ifdef HAVE_BOOL
341287bf
JS
511/*
512 * wxVariantDataBool
513 */
514
fd242375 515class WXDLLIMPEXP_BASE wxVariantDataBool: public wxVariantData
341287bf
JS
516{
517DECLARE_DYNAMIC_CLASS(wxVariantDataBool)
518public:
519 wxVariantDataBool() { m_value = 0; }
520 wxVariantDataBool(bool value) { m_value = value; }
521
522 inline bool GetValue() const { return m_value; }
523 inline void SetValue(bool value) { m_value = value; }
524
525 virtual void Copy(wxVariantData& data);
526 virtual bool Eq(wxVariantData& data) const;
38830220 527#if wxUSE_STD_IOSTREAM
dd107c50 528 virtual bool Write(wxSTD ostream& str) const;
38830220 529#endif
341287bf 530 virtual bool Write(wxString& str) const;
1ccbb61a 531 virtual bool Read(wxString& str);
38830220 532#if wxUSE_STD_IOSTREAM
dd107c50 533 virtual bool Read(wxSTD istream& str);
38830220 534#endif
e02afc7a 535#if wxUSE_STREAMS
75ed1d15 536 virtual bool Read(wxInputStream& str);
1ccbb61a 537 virtual bool Write(wxOutputStream& str) const;
e02afc7a 538#endif // wxUSE_STREAMS
223d09f6 539 virtual wxString GetType() const { return wxT("bool"); };
341287bf
JS
540
541protected:
542 bool m_value;
543};
544
545IMPLEMENT_DYNAMIC_CLASS(wxVariantDataBool, wxVariantData)
546
547void wxVariantDataBool::Copy(wxVariantData& data)
548{
223d09f6 549 wxASSERT_MSG( (data.GetType() == wxT("bool")), wxT("wxVariantDataBool::Copy: Can't copy to this type of data") );
341287bf
JS
550
551 wxVariantDataBool& otherData = (wxVariantDataBool&) data;
552
553 otherData.m_value = m_value;
554}
555
556bool wxVariantDataBool::Eq(wxVariantData& data) const
557{
223d09f6 558 wxASSERT_MSG( (data.GetType() == wxT("bool")), wxT("wxVariantDataBool::Eq: argument mismatch") );
341287bf
JS
559
560 wxVariantDataBool& otherData = (wxVariantDataBool&) data;
561
562 return (otherData.m_value == m_value);
563}
564
38830220 565#if wxUSE_STD_IOSTREAM
dd107c50 566bool wxVariantDataBool::Write(wxSTD ostream& str) const
341287bf
JS
567{
568 wxString s;
569 Write(s);
783b6cfd 570 str << (const char*) s.mb_str();
cab1a605 571 return true;
341287bf 572}
38830220 573#endif
341287bf
JS
574
575bool wxVariantDataBool::Write(wxString& str) const
576{
223d09f6 577 str.Printf(wxT("%d"), (int) m_value);
cab1a605 578 return true;
341287bf
JS
579}
580
38830220 581#if wxUSE_STD_IOSTREAM
dd107c50 582bool wxVariantDataBool::Read(wxSTD istream& WXUNUSED(str))
341287bf 583{
223d09f6 584 wxFAIL_MSG(wxT("Unimplemented"));
341287bf 585// str >> (long) m_value;
cab1a605 586 return false;
341287bf 587}
38830220 588#endif
341287bf 589
e02afc7a 590#if wxUSE_STREAMS
1ccbb61a
VZ
591bool wxVariantDataBool::Write(wxOutputStream& str) const
592{
fae05df5
GL
593 wxTextOutputStream s(str);
594
2b004197 595 s.Write8(m_value);
cab1a605 596 return true;
1ccbb61a
VZ
597}
598
75ed1d15
GL
599bool wxVariantDataBool::Read(wxInputStream& str)
600{
fae05df5
GL
601 wxTextInputStream s(str);
602
a1b82138 603 m_value = s.Read8() != 0;
cab1a605 604 return true;
75ed1d15 605}
e02afc7a 606#endif // wxUSE_STREAMS
75ed1d15 607
341287bf
JS
608bool wxVariantDataBool::Read(wxString& str)
609{
783b6cfd 610 m_value = (wxAtol((const wxChar*) str) != 0);
cab1a605 611 return true;
341287bf 612}
57493f9f 613#endif // HAVE_BOOL
341287bf
JS
614
615/*
616 * wxVariantDataChar
617 */
618
fd242375 619class WXDLLIMPEXP_BASE wxVariantDataChar: public wxVariantData
341287bf
JS
620{
621DECLARE_DYNAMIC_CLASS(wxVariantDataChar)
622public:
623 wxVariantDataChar() { m_value = 0; }
624 wxVariantDataChar(char value) { m_value = value; }
625
626 inline char GetValue() const { return m_value; }
627 inline void SetValue(char value) { m_value = value; }
628
629 virtual void Copy(wxVariantData& data);
630 virtual bool Eq(wxVariantData& data) const;
38830220 631#if wxUSE_STD_IOSTREAM
dd107c50
VZ
632 virtual bool Read(wxSTD istream& str);
633 virtual bool Write(wxSTD ostream& str) const;
38830220 634#endif
1ccbb61a 635 virtual bool Read(wxString& str);
341287bf 636 virtual bool Write(wxString& str) const;
e02afc7a 637#if wxUSE_STREAMS
75ed1d15 638 virtual bool Read(wxInputStream& str);
1ccbb61a 639 virtual bool Write(wxOutputStream& str) const;
e02afc7a 640#endif // wxUSE_STREAMS
223d09f6 641 virtual wxString GetType() const { return wxT("char"); };
341287bf
JS
642
643protected:
644 char m_value;
645};
646
647IMPLEMENT_DYNAMIC_CLASS(wxVariantDataChar, wxVariantData)
648
649void wxVariantDataChar::Copy(wxVariantData& data)
650{
223d09f6 651 wxASSERT_MSG( (data.GetType() == wxT("char")), wxT("wxVariantDataChar::Copy: Can't copy to this type of data") );
341287bf
JS
652
653 wxVariantDataChar& otherData = (wxVariantDataChar&) data;
654
655 otherData.m_value = m_value;
656}
657
658bool wxVariantDataChar::Eq(wxVariantData& data) const
659{
223d09f6 660 wxASSERT_MSG( (data.GetType() == wxT("char")), wxT("wxVariantDataChar::Eq: argument mismatch") );
341287bf
JS
661
662 wxVariantDataChar& otherData = (wxVariantDataChar&) data;
663
664 return (otherData.m_value == m_value);
665}
666
38830220 667#if wxUSE_STD_IOSTREAM
dd107c50 668bool wxVariantDataChar::Write(wxSTD ostream& str) const
341287bf
JS
669{
670 wxString s;
671 Write(s);
783b6cfd 672 str << (const char*) s.mb_str();
cab1a605 673 return true;
341287bf 674}
38830220 675#endif
341287bf
JS
676
677bool wxVariantDataChar::Write(wxString& str) const
678{
223d09f6 679 str.Printf(wxT("%c"), m_value);
cab1a605 680 return true;
341287bf
JS
681}
682
38830220 683#if wxUSE_STD_IOSTREAM
dd107c50 684bool wxVariantDataChar::Read(wxSTD istream& WXUNUSED(str))
341287bf 685{
223d09f6 686 wxFAIL_MSG(wxT("Unimplemented"));
341287bf 687// str >> m_value;
cab1a605 688 return false;
341287bf 689}
38830220 690#endif
341287bf 691
e02afc7a 692#if wxUSE_STREAMS
1ccbb61a
VZ
693bool wxVariantDataChar::Write(wxOutputStream& str) const
694{
fae05df5
GL
695 wxTextOutputStream s(str);
696
697 s.Write8(m_value);
cab1a605 698 return true;
1ccbb61a
VZ
699}
700
75ed1d15
GL
701bool wxVariantDataChar::Read(wxInputStream& str)
702{
fae05df5
GL
703 wxTextInputStream s(str);
704
705 m_value = s.Read8();
cab1a605 706 return true;
75ed1d15 707}
e02afc7a 708#endif // wxUSE_STREAMS
75ed1d15 709
341287bf
JS
710bool wxVariantDataChar::Read(wxString& str)
711{
91cf52ce 712 m_value = str.ToAscii()[0u];
cab1a605 713 return true;
341287bf
JS
714}
715
716/*
717 * wxVariantDataString
718 */
719
fd242375 720class WXDLLIMPEXP_BASE wxVariantDataString: public wxVariantData
341287bf
JS
721{
722DECLARE_DYNAMIC_CLASS(wxVariantDataString)
723public:
724 wxVariantDataString() { }
725 wxVariantDataString(const wxString& value) { m_value = value; }
726
727 inline wxString GetValue() const { return m_value; }
728 inline void SetValue(const wxString& value) { m_value = value; }
729
730 virtual void Copy(wxVariantData& data);
731 virtual bool Eq(wxVariantData& data) const;
38830220 732#if wxUSE_STD_IOSTREAM
dd107c50 733 virtual bool Write(wxSTD ostream& str) const;
38830220 734#endif
1ccbb61a 735 virtual bool Read(wxString& str);
341287bf 736 virtual bool Write(wxString& str) const;
38830220 737#if wxUSE_STD_IOSTREAM
dd107c50 738 virtual bool Read(wxSTD istream& str);
38830220 739#endif
e02afc7a 740#if wxUSE_STREAMS
75ed1d15 741 virtual bool Read(wxInputStream& str);
1ccbb61a 742 virtual bool Write(wxOutputStream& str) const;
e02afc7a 743#endif // wxUSE_STREAMS
223d09f6 744 virtual wxString GetType() const { return wxT("string"); };
341287bf
JS
745
746protected:
747 wxString m_value;
748};
749
750void wxVariantDataString::Copy(wxVariantData& data)
751{
223d09f6 752 wxASSERT_MSG( (data.GetType() == wxT("string")), wxT("wxVariantDataString::Copy: Can't copy to this type of data") );
341287bf
JS
753
754 wxVariantDataString& otherData = (wxVariantDataString&) data;
755
756 otherData.m_value = m_value;
757}
758
759bool wxVariantDataString::Eq(wxVariantData& data) const
760{
223d09f6 761 wxASSERT_MSG( (data.GetType() == wxT("string")), wxT("wxVariantDataString::Eq: argument mismatch") );
341287bf
JS
762
763 wxVariantDataString& otherData = (wxVariantDataString&) data;
764
765 return (otherData.m_value == m_value);
766}
767
38830220 768#if wxUSE_STD_IOSTREAM
dd107c50 769bool wxVariantDataString::Write(wxSTD ostream& str) const
341287bf 770{
783b6cfd 771 str << (const char*) m_value.mb_str();
cab1a605 772 return true;
341287bf 773}
38830220 774#endif
341287bf
JS
775
776bool wxVariantDataString::Write(wxString& str) const
777{
778 str = m_value;
cab1a605 779 return true;
341287bf
JS
780}
781
38830220 782#if wxUSE_STD_IOSTREAM
dd107c50 783bool wxVariantDataString::Read(wxSTD istream& str)
341287bf
JS
784{
785 str >> m_value;
cab1a605 786 return true;
341287bf 787}
38830220 788#endif
341287bf 789
e02afc7a 790#if wxUSE_STREAMS
1ccbb61a
VZ
791bool wxVariantDataString::Write(wxOutputStream& str) const
792{
783b6cfd 793 // why doesn't wxOutputStream::operator<< take "const wxString&"
fae05df5
GL
794 wxTextOutputStream s(str);
795 s.WriteString(m_value);
cab1a605 796 return true;
1ccbb61a
VZ
797}
798
75ed1d15
GL
799bool wxVariantDataString::Read(wxInputStream& str)
800{
fae05df5
GL
801 wxTextInputStream s(str);
802
803 m_value = s.ReadString();
cab1a605 804 return true;
75ed1d15 805}
e02afc7a 806#endif // wxUSE_STREAMS
75ed1d15 807
341287bf
JS
808bool wxVariantDataString::Read(wxString& str)
809{
810 m_value = str;
cab1a605 811 return true;
341287bf
JS
812}
813
814IMPLEMENT_DYNAMIC_CLASS(wxVariantDataString, wxVariantData)
815
a0a302dc
JS
816/*
817 * wxVariantDataVoidPtr
818 */
819
820class wxVariantDataVoidPtr: public wxVariantData
821{
822DECLARE_DYNAMIC_CLASS(wxVariantDataVoidPtr)
823public:
824 wxVariantDataVoidPtr() { }
825 wxVariantDataVoidPtr(void* value) { m_value = value; }
826
827 inline void* GetValue() const { return m_value; }
828 inline void SetValue(void* value) { m_value = value; }
829
830 virtual void Copy(wxVariantData& data);
831 virtual bool Eq(wxVariantData& data) const;
38830220 832#if wxUSE_STD_IOSTREAM
dd107c50 833 virtual bool Write(wxSTD ostream& str) const;
38830220 834#endif
a0a302dc 835 virtual bool Write(wxString& str) const;
38830220 836#if wxUSE_STD_IOSTREAM
dd107c50 837 virtual bool Read(wxSTD istream& str);
38830220 838#endif
a0a302dc 839 virtual bool Read(wxString& str);
223d09f6 840 virtual wxString GetType() const { return wxT("void*"); };
b1d4dd7a 841 virtual wxVariantData* Clone() { return new wxVariantDataVoidPtr; }
a0a302dc
JS
842
843protected:
844 void* m_value;
22f3361e
VZ
845
846 DECLARE_NO_COPY_CLASS(wxVariantDataVoidPtr)
a0a302dc
JS
847};
848
849IMPLEMENT_DYNAMIC_CLASS(wxVariantDataVoidPtr, wxVariantData)
850
851void wxVariantDataVoidPtr::Copy(wxVariantData& data)
852{
223d09f6 853 wxASSERT_MSG( (data.GetType() == wxT("void*")), wxT("wxVariantDataVoidPtr::Copy: Can't copy to this type of data") );
a0a302dc
JS
854
855 wxVariantDataVoidPtr& otherData = (wxVariantDataVoidPtr&) data;
856
857 otherData.m_value = m_value;
858}
859
860bool wxVariantDataVoidPtr::Eq(wxVariantData& data) const
861{
223d09f6 862 wxASSERT_MSG( (data.GetType() == wxT("void*")), wxT("wxVariantDataVoidPtr::Eq: argument mismatch") );
a0a302dc
JS
863
864 wxVariantDataVoidPtr& otherData = (wxVariantDataVoidPtr&) data;
865
866 return (otherData.m_value == m_value);
867}
868
38830220 869#if wxUSE_STD_IOSTREAM
dd107c50 870bool wxVariantDataVoidPtr::Write(wxSTD ostream& str) const
a0a302dc
JS
871{
872 wxString s;
873 Write(s);
783b6cfd 874 str << (const char*) s.mb_str();
cab1a605 875 return true;
a0a302dc 876}
38830220 877#endif
a0a302dc
JS
878
879bool wxVariantDataVoidPtr::Write(wxString& str) const
880{
223d09f6 881 str.Printf(wxT("%ld"), (long) m_value);
cab1a605 882 return true;
a0a302dc
JS
883}
884
38830220 885#if wxUSE_STD_IOSTREAM
dd107c50 886bool wxVariantDataVoidPtr::Read(wxSTD istream& WXUNUSED(str))
a0a302dc
JS
887{
888 // Not implemented
cab1a605 889 return false;
a0a302dc 890}
38830220 891#endif
a0a302dc 892
8b53e5a2 893bool wxVariantDataVoidPtr::Read(wxString& WXUNUSED(str))
a0a302dc
JS
894{
895 // Not implemented
cab1a605 896 return false;
a0a302dc
JS
897}
898
cf6ae290
RG
899/*
900 * wxVariantDataWxObjectPtr
901 */
902
903class wxVariantDataWxObjectPtr: public wxVariantData
904{
905DECLARE_DYNAMIC_CLASS(wxVariantDataWxObjectPtr)
906public:
907 wxVariantDataWxObjectPtr() { }
908 wxVariantDataWxObjectPtr(wxObject* value) { m_value = value; }
909
910 inline wxObject* GetValue() const { return m_value; }
911 inline void SetValue(wxObject* value) { m_value = value; }
912
913 virtual void Copy(wxVariantData& data);
914 virtual bool Eq(wxVariantData& data) const;
915#if wxUSE_STD_IOSTREAM
916 virtual bool Write(wxSTD ostream& str) const;
917#endif
918 virtual bool Write(wxString& str) const;
919#if wxUSE_STD_IOSTREAM
920 virtual bool Read(wxSTD istream& str);
921#endif
922 virtual bool Read(wxString& str);
923 virtual wxString GetType() const ;
924 virtual wxVariantData* Clone() { return new wxVariantDataWxObjectPtr; }
925
cab1a605 926 virtual wxClassInfo* GetValueClassInfo() ;
cf6ae290
RG
927protected:
928 wxObject* m_value;
929
930 DECLARE_NO_COPY_CLASS(wxVariantDataWxObjectPtr)
931};
932
933IMPLEMENT_DYNAMIC_CLASS(wxVariantDataWxObjectPtr, wxVariantData)
934
935void wxVariantDataWxObjectPtr::Copy(wxVariantData& data)
936{
937 wxASSERT_MSG( wxIsKindOf((&data), wxVariantDataWxObjectPtr) ,\
938 wxT("wxVariantDataWxObjectPtr::Copy: Can't copy to this type of data") \
939 );
940
941 wxVariantDataWxObjectPtr& otherData = (wxVariantDataWxObjectPtr&) data;
942
943 otherData.m_value = m_value;
944}
945
946bool wxVariantDataWxObjectPtr::Eq(wxVariantData& data) const
947{
948 wxASSERT_MSG( wxIsKindOf((&data), wxVariantDataWxObjectPtr), wxT("wxVariantDataWxObjectPtr::Eq: argument mismatch") );
949
950 wxVariantDataWxObjectPtr& otherData = (wxVariantDataWxObjectPtr&) data;
951
952 return (otherData.m_value == m_value);
953}
954
955wxString wxVariantDataWxObjectPtr::GetType() const
956{
957 wxString returnVal(wxT("wxObject"));
958 if (m_value) {
959 returnVal = m_value->GetClassInfo()->GetClassName();
960 }
961 return returnVal;
962}
963
964wxClassInfo* wxVariantDataWxObjectPtr::GetValueClassInfo()
965{
966 wxClassInfo* returnVal=NULL;
cab1a605
WS
967
968 if (m_value) returnVal = m_value->GetClassInfo();
cf6ae290
RG
969
970 return returnVal;
971}
972
973#if wxUSE_STD_IOSTREAM
974bool wxVariantDataWxObjectPtr::Write(wxSTD ostream& str) const
975{
976 wxString s;
977 Write(s);
978 str << (const char*) s.mb_str();
cab1a605 979 return true;
cf6ae290
RG
980}
981#endif
982
983bool wxVariantDataWxObjectPtr::Write(wxString& str) const
984{
f124ddf4 985 str.Printf(wxT("%s(%ld)"), GetType().c_str(), (long) m_value);
cab1a605 986 return true;
cf6ae290
RG
987}
988
989#if wxUSE_STD_IOSTREAM
990bool wxVariantDataWxObjectPtr::Read(wxSTD istream& WXUNUSED(str))
991{
992 // Not implemented
cab1a605 993 return false;
cf6ae290
RG
994}
995#endif
996
997bool wxVariantDataWxObjectPtr::Read(wxString& WXUNUSED(str))
998{
999 // Not implemented
cab1a605 1000 return false;
cf6ae290
RG
1001}
1002
1003
edca7a82
GT
1004/*
1005 * wxVariantDataDateTime
1006 */
1007
e2b87f38
VZ
1008#if wxUSE_DATETIME
1009
edca7a82
GT
1010class wxVariantDataDateTime: public wxVariantData
1011{
1012 DECLARE_DYNAMIC_CLASS(wxVariantDataDateTime)
1013
1014public:
1015 wxVariantDataDateTime() { }
1016 wxVariantDataDateTime(const wxDateTime& value) { m_value = value; }
1017#if wxUSE_ODBC
2b004197 1018 wxVariantDataDateTime(const TIME_STRUCT* valptr)
edca7a82 1019 { m_value = wxDateTime(valptr->hour, valptr->minute, valptr->second); }
2b004197 1020 wxVariantDataDateTime(const DATE_STRUCT* valptr)
edca7a82 1021 { m_value = wxDateTime(valptr->day, (wxDateTime::Month) (valptr->month - 1),valptr->year); }
2b004197 1022 wxVariantDataDateTime(const TIMESTAMP_STRUCT* valptr)
edca7a82 1023 { m_value = wxDateTime(valptr->day, (wxDateTime::Month) (valptr->month - 1), valptr->year,
254a2129 1024 valptr->hour, valptr->minute, valptr->second, (wxDateTime::wxDateTime_t)valptr->fraction ); }
edca7a82
GT
1025#endif //ODBC
1026
1027 inline wxDateTime GetValue() const { return m_value; }
1028 inline void SetValue(const wxDateTime& value) { m_value = value; }
1029
1030 virtual void Copy(wxVariantData& data);
1031 virtual bool Eq(wxVariantData& data) const;
1032#if wxUSE_STD_IOSTREAM
2b004197 1033 virtual bool Write(wxSTD ostream& str) const;
edca7a82
GT
1034#endif
1035 virtual bool Write(wxString& str) const;
1036#if wxUSE_STD_IOSTREAM
2b004197 1037 virtual bool Read(wxSTD istream& str);
edca7a82
GT
1038#endif
1039 virtual bool Read(wxString& str);
1040 virtual wxString GetType() const { return wxT("datetime"); };
1041 virtual wxVariantData* Clone() { return new wxVariantDataDateTime; }
1042
1043protected:
1044 wxDateTime m_value;
1045};
1046
1047
1048IMPLEMENT_DYNAMIC_CLASS(wxVariantDataDateTime, wxVariantData)
1049
1050void wxVariantDataDateTime::Copy(wxVariantData& data)
1051{
1052 wxASSERT_MSG( (data.GetType() == wxT("datetime")), wxT("wxVariantDataDateTime::Copy: Can't copy to this type of data") );
1053
1054 wxVariantDataDateTime& otherData = (wxVariantDataDateTime&) data;
1055
1056 otherData.m_value = m_value;
1057}
1058
1059
1060bool wxVariantDataDateTime::Eq(wxVariantData& data) const
1061{
1062 wxASSERT_MSG( (data.GetType() == wxT("datetime")), wxT("wxVariantDataDateTime::Eq: argument mismatch") );
1063
1064 wxVariantDataDateTime& otherData = (wxVariantDataDateTime&) data;
1065
1066 return (otherData.m_value == m_value);
1067}
1068
1069
1070#if wxUSE_STD_IOSTREAM
2b004197 1071bool wxVariantDataDateTime::Write(wxSTD ostream& str) const
edca7a82
GT
1072{
1073 // Not implemented
cab1a605 1074 return false;
edca7a82
GT
1075}
1076#endif
1077
1078
1079bool wxVariantDataDateTime::Write(wxString& str) const
1080{
1081 str = m_value.Format();
cab1a605 1082 return true;
edca7a82
GT
1083}
1084
1085
1086#if wxUSE_STD_IOSTREAM
2b004197 1087bool wxVariantDataDateTime::Read(wxSTD istream& WXUNUSED(str))
edca7a82
GT
1088{
1089 // Not implemented
cab1a605 1090 return false;
edca7a82
GT
1091}
1092#endif
1093
1094
1095bool wxVariantDataDateTime::Read(wxString& str)
1096{
1097 if(! m_value.ParseDateTime(str))
cab1a605
WS
1098 return false;
1099 return true;
edca7a82
GT
1100}
1101
e2b87f38
VZ
1102#endif // wxUSE_DATETIME
1103
fb42d7c3
VZ
1104// ----------------------------------------------------------------------------
1105// wxVariantDataArrayString
1106// ----------------------------------------------------------------------------
1107
1108class wxVariantDataArrayString: public wxVariantData
1109{
1110public:
1111 wxVariantDataArrayString() { }
1112 wxVariantDataArrayString(const wxArrayString& value) { m_value = value; }
1113
1114 wxArrayString GetValue() const { return m_value; }
1115 void SetValue(const wxArrayString& value) { m_value = value; }
1116
1117 virtual void Copy(wxVariantData& data);
1118 virtual bool Eq(wxVariantData& data) const;
1119#if wxUSE_STD_IOSTREAM
1120 virtual bool Write(wxSTD ostream& str) const;
1121#endif
1122 virtual bool Write(wxString& str) const;
1123#if wxUSE_STD_IOSTREAM
1124 virtual bool Read(wxSTD istream& str);
1125#endif
1126 virtual bool Read(wxString& str);
1127 virtual wxString GetType() const { return wxT("arrstring"); };
1128 virtual wxVariantData* Clone() { return new wxVariantDataArrayString; }
1129
1130protected:
1131 wxArrayString m_value;
1132
1133 DECLARE_DYNAMIC_CLASS(wxVariantDataArrayString)
1134};
1135
1136IMPLEMENT_DYNAMIC_CLASS(wxVariantDataArrayString, wxVariantData)
1137
1138void wxVariantDataArrayString::Copy(wxVariantData& data)
1139{
1140 wxASSERT_MSG( data.GetType() == GetType(), wxT("wxVariantDataArrayString::Copy: Can't copy to this type of data") );
1141
1142 wxVariantDataArrayString& otherData = (wxVariantDataArrayString&) data;
1143
1144 otherData.m_value = m_value;
1145}
1146
1147
1148bool wxVariantDataArrayString::Eq(wxVariantData& data) const
1149{
1150 wxASSERT_MSG( data.GetType() == GetType(), wxT("wxVariantDataArrayString::Eq: argument mismatch") );
1151
1152 wxVariantDataArrayString& otherData = (wxVariantDataArrayString&) data;
1153
1154 return otherData.m_value == m_value;
1155}
1156
1157
1158#if wxUSE_STD_IOSTREAM
1159bool wxVariantDataArrayString::Write(wxSTD ostream& str) const
1160{
1161 // Not implemented
cab1a605 1162 return false;
fb42d7c3
VZ
1163}
1164#endif
1165
1166
1167bool wxVariantDataArrayString::Write(wxString& str) const
1168{
1169 size_t count = m_value.GetCount();
1170 for ( size_t n = 0; n < count; n++ )
1171 {
1172 if ( n )
1173 str += _T(';');
1174
1175 str += m_value[n];
1176 }
1177
cab1a605 1178 return true;
fb42d7c3
VZ
1179}
1180
1181
1182#if wxUSE_STD_IOSTREAM
1183bool wxVariantDataArrayString::Read(wxSTD istream& WXUNUSED(str))
1184{
1185 // Not implemented
cab1a605 1186 return false;
fb42d7c3
VZ
1187}
1188#endif
1189
1190
1191bool wxVariantDataArrayString::Read(wxString& str)
1192{
1193 wxStringTokenizer tk(str, _T(";"));
1194 while ( tk.HasMoreTokens() )
1195 {
1196 m_value.Add(tk.GetNextToken());
1197 }
1198
cab1a605 1199 return true;
fb42d7c3
VZ
1200}
1201
1202
a0a302dc 1203
341287bf
JS
1204/*
1205 * wxVariant
1206 */
1207
1208IMPLEMENT_DYNAMIC_CLASS(wxVariant, wxObject)
1209
1210// Construction & destruction
1211wxVariant::wxVariant()
1212{
1213 m_data = (wxVariantData*) NULL;
1214}
1215
a0a302dc 1216wxVariant::wxVariant(double val, const wxString& name)
341287bf
JS
1217{
1218 m_data = new wxVariantDataReal(val);
a0a302dc 1219 m_name = name;
341287bf
JS
1220}
1221
a0a302dc 1222wxVariant::wxVariant(long val, const wxString& name)
341287bf
JS
1223{
1224 m_data = new wxVariantDataLong(val);
a0a302dc 1225 m_name = name;
341287bf
JS
1226}
1227
57493f9f 1228#ifdef HAVE_BOOL
a0a302dc 1229wxVariant::wxVariant(bool val, const wxString& name)
341287bf
JS
1230{
1231 m_data = new wxVariantDataBool(val);
a0a302dc 1232 m_name = name;
341287bf 1233}
57493f9f 1234#endif
341287bf 1235
a0a302dc 1236wxVariant::wxVariant(char val, const wxString& name)
341287bf
JS
1237{
1238 m_data = new wxVariantDataChar(val);
a0a302dc 1239 m_name = name;
341287bf
JS
1240}
1241
a0a302dc 1242wxVariant::wxVariant(const wxString& val, const wxString& name)
341287bf
JS
1243{
1244 m_data = new wxVariantDataString(val);
a0a302dc 1245 m_name = name;
341287bf
JS
1246}
1247
783b6cfd 1248wxVariant::wxVariant(const wxChar* val, const wxString& name)
341287bf
JS
1249{
1250 m_data = new wxVariantDataString(wxString(val));
a0a302dc 1251 m_name = name;
341287bf
JS
1252}
1253
2c3a1064
RN
1254#if WXWIN_COMPATIBILITY_2_4
1255
a0a302dc 1256wxVariant::wxVariant(const wxStringList& val, const wxString& name)
341287bf
JS
1257{
1258 m_data = new wxVariantDataStringList(val);
a0a302dc 1259 m_name = name;
341287bf 1260}
341287bf 1261
2c3a1064
RN
1262#endif
1263
a0a302dc 1264wxVariant::wxVariant(const wxList& val, const wxString& name) // List of variants
341287bf
JS
1265{
1266 m_data = new wxVariantDataList(val);
a0a302dc
JS
1267 m_name = name;
1268}
1269
b41f79f5
JJ
1270wxVariant::wxVariant( void* val, const wxString& name)
1271{
cab1a605
WS
1272 m_data = new wxVariantDataVoidPtr(val);
1273 m_name = name;
b41f79f5
JJ
1274}
1275
cf6ae290
RG
1276wxVariant::wxVariant( wxObject* val, const wxString& name)
1277{
cab1a605
WS
1278 m_data = new wxVariantDataWxObjectPtr(val);
1279 m_name = name;
cf6ae290
RG
1280}
1281
ff818ab8
RG
1282#if wxUSE_DATETIME
1283wxVariant::wxVariant(const wxDateTime& val, const wxString& name) // Date
1284{
cab1a605
WS
1285 m_data = new wxVariantDataDateTime(val);
1286 m_name = name;
ff818ab8 1287}
cab1a605 1288#endif // wxUSE_DATETIME
ff818ab8 1289
edca7a82
GT
1290#if wxUSE_ODBC
1291wxVariant::wxVariant(const TIME_STRUCT* valptr, const wxString& name) // Date
1292{
1293 m_data = new wxVariantDataDateTime(valptr);
1294 m_name = name;
1295}
1296
1297wxVariant::wxVariant(const TIMESTAMP_STRUCT* valptr, const wxString& name) // Date
1298{
1299 m_data = new wxVariantDataDateTime(valptr);
1300 m_name = name;
1301}
1302
1303wxVariant::wxVariant(const DATE_STRUCT* valptr, const wxString& name) // Date
1304{
1305 m_data = new wxVariantDataDateTime(valptr);
1306 m_name = name;
1307}
fb42d7c3
VZ
1308#endif // wxUSE_ODBC
1309
1310wxVariant::wxVariant(const wxArrayString& val, const wxString& name) // Strings
1311{
1312 m_data = new wxVariantDataArrayString(val);
1313 m_name = name;
1314}
edca7a82 1315
341287bf 1316wxVariant::wxVariant(const wxVariant& variant)
d84afea9 1317 : wxObject()
341287bf
JS
1318{
1319 if (!variant.IsNull())
1320 {
1321 m_data = (wxVariantData*) variant.GetData()->GetClassInfo()->CreateObject();
1322 variant.m_data->Copy(*m_data);
1323 }
4fabb575
JS
1324 else
1325 m_data = (wxVariantData*) NULL;
a0a302dc 1326 m_name = variant.m_name;
341287bf
JS
1327}
1328
a0a302dc 1329wxVariant::wxVariant(wxVariantData* data, const wxString& name) // User-defined data
341287bf
JS
1330{
1331 m_data = data;
a0a302dc 1332 m_name = name;
341287bf
JS
1333}
1334
1335wxVariant::~wxVariant()
1336{
1337 delete m_data;
1338}
1339
1340
1341// Make NULL (i.e. delete the data)
1342void wxVariant::MakeNull()
1343{
1344 delete m_data;
1345 m_data = NULL;
1346}
1347
1348// Generic operators
1349// Assignment
1350void wxVariant::operator= (const wxVariant& variant)
1351{
1352 if (variant.IsNull())
1353 {
1354 MakeNull();
1355 return;
1356 }
1357
1358 if (IsNull() || (GetType() != variant.GetType()))
1359 {
1360 if (m_data)
1361 delete m_data;
1362 m_data = (wxVariantData*) variant.GetData()->GetClassInfo()->CreateObject();
1363 }
3d8daa0f 1364
4fabb575 1365 variant.GetData()->Copy(* GetData());
3d8daa0f
VZ
1366
1367 m_name = variant.m_name;
341287bf
JS
1368}
1369
1370// Assignment using data, e.g.
1371// myVariant = new wxStringVariantData("hello")
1372void wxVariant::operator= (wxVariantData* variantData)
1373{
1374 MakeNull();
1375 m_data = variantData;
1376}
1377
1378bool wxVariant::operator== (const wxVariant& variant) const
1379{
1380 if (IsNull() || variant.IsNull())
1381 return (IsNull() == variant.IsNull());
1382
1383 return (GetData()->Eq(* variant.GetData()));
1384}
1385
1386bool wxVariant::operator!= (const wxVariant& variant) const
1387{
1388 return (!(*this == variant));
1389}
1390
1391
1392// Specific operators
1393bool wxVariant::operator== (double value) const
1394{
1395 double thisValue;
1396 if (!Convert(&thisValue))
cab1a605 1397 return false;
341287bf
JS
1398 else
1399 return (value == thisValue);
1400}
1401
1402bool wxVariant::operator!= (double value) const
1403{
1404 return (!((*this) == value));
1405}
1406
1407void wxVariant::operator= (double value)
1408{
223d09f6 1409 if (GetType() == wxT("double"))
341287bf
JS
1410 {
1411 ((wxVariantDataReal*)GetData())->SetValue(value);
1412 }
1413 else
1414 {
1415 if (m_data)
1416 delete m_data;
1417 m_data = new wxVariantDataReal(value);
1418 }
1419}
1420
1421bool wxVariant::operator== (long value) const
1422{
1423 long thisValue;
1424 if (!Convert(&thisValue))
cab1a605 1425 return false;
341287bf
JS
1426 else
1427 return (value == thisValue);
1428}
1429
1430bool wxVariant::operator!= (long value) const
1431{
1432 return (!((*this) == value));
1433}
1434
1435void wxVariant::operator= (long value)
1436{
223d09f6 1437 if (GetType() == wxT("long"))
341287bf
JS
1438 {
1439 ((wxVariantDataLong*)GetData())->SetValue(value);
1440 }
1441 else
1442 {
1443 if (m_data)
1444 delete m_data;
1445 m_data = new wxVariantDataLong(value);
1446 }
1447}
1448
1449bool wxVariant::operator== (char value) const
1450{
1451 char thisValue;
1452 if (!Convert(&thisValue))
cab1a605 1453 return false;
341287bf
JS
1454 else
1455 return (value == thisValue);
1456}
1457
1458bool wxVariant::operator!= (char value) const
1459{
1460 return (!((*this) == value));
1461}
1462
1463void wxVariant::operator= (char value)
1464{
223d09f6 1465 if (GetType() == wxT("char"))
341287bf
JS
1466 {
1467 ((wxVariantDataChar*)GetData())->SetValue(value);
1468 }
1469 else
1470 {
1471 if (m_data)
1472 delete m_data;
1473 m_data = new wxVariantDataChar(value);
1474 }
1475}
1476
57493f9f 1477#ifdef HAVE_BOOL
341287bf
JS
1478bool wxVariant::operator== (bool value) const
1479{
1480 bool thisValue;
1481 if (!Convert(&thisValue))
cab1a605 1482 return false;
341287bf
JS
1483 else
1484 return (value == thisValue);
1485}
1486
1487bool wxVariant::operator!= (bool value) const
1488{
1489 return (!((*this) == value));
1490}
1491
1492void wxVariant::operator= (bool value)
1493{
223d09f6 1494 if (GetType() == wxT("bool"))
341287bf
JS
1495 {
1496 ((wxVariantDataBool*)GetData())->SetValue(value);
1497 }
1498 else
1499 {
1500 if (m_data)
1501 delete m_data;
1502 m_data = new wxVariantDataBool(value);
1503 }
1504}
57493f9f 1505#endif // HAVE_BOOL
341287bf
JS
1506
1507bool wxVariant::operator== (const wxString& value) const
1508{
1509 wxString thisValue;
1510 if (!Convert(&thisValue))
cab1a605 1511 return false;
f6bcfd97
BP
1512
1513 return value == thisValue;
341287bf
JS
1514}
1515
1516bool wxVariant::operator!= (const wxString& value) const
1517{
1518 return (!((*this) == value));
1519}
1520
1521void wxVariant::operator= (const wxString& value)
1522{
223d09f6 1523 if (GetType() == wxT("string"))
341287bf
JS
1524 {
1525 ((wxVariantDataString*)GetData())->SetValue(value);
1526 }
1527 else
1528 {
1529 if (m_data)
1530 delete m_data;
1531 m_data = new wxVariantDataString(value);
1532 }
1533}
1534
783b6cfd 1535void wxVariant::operator= (const wxChar* value)
341287bf 1536{
223d09f6 1537 if (GetType() == wxT("string"))
341287bf
JS
1538 {
1539 ((wxVariantDataString*)GetData())->SetValue(wxString(value));
1540 }
1541 else
1542 {
1543 if (m_data)
1544 delete m_data;
1545 m_data = new wxVariantDataString(wxString(value));
1546 }
1547}
1548
2c3a1064
RN
1549#if WXWIN_COMPATIBILITY_2_4
1550
341287bf
JS
1551bool wxVariant::operator== (const wxStringList& value) const
1552{
223d09f6 1553 wxASSERT_MSG( (GetType() == wxT("stringlist")), wxT("Invalid type for == operator") );
341287bf
JS
1554
1555 wxVariantDataStringList other(value);
1556 return (m_data->Eq(other));
1557}
1558
1559bool wxVariant::operator!= (const wxStringList& value) const
1560{
1561 return (!((*this) == value));
1562}
1563
1564void wxVariant::operator= (const wxStringList& value)
1565{
223d09f6 1566 if (GetType() == wxT("stringlist"))
341287bf
JS
1567 {
1568 ((wxVariantDataStringList*)GetData())->SetValue(value);
1569 }
1570 else
1571 {
1572 if (m_data)
1573 delete m_data;
1574 m_data = new wxVariantDataStringList(value);
1575 }
1576}
1577
2c3a1064
RN
1578#endif
1579
341287bf
JS
1580bool wxVariant::operator== (const wxList& value) const
1581{
223d09f6 1582 wxASSERT_MSG( (GetType() == wxT("list")), wxT("Invalid type for == operator") );
341287bf
JS
1583
1584 wxVariantDataList other(value);
1585 return (m_data->Eq(other));
1586}
1587
1588bool wxVariant::operator!= (const wxList& value) const
1589{
1590 return (!((*this) == value));
1591}
1592
1593void wxVariant::operator= (const wxList& value)
1594{
223d09f6 1595 if (GetType() == wxT("list"))
341287bf
JS
1596 {
1597 ((wxVariantDataList*)GetData())->SetValue(value);
1598 }
1599 else
1600 {
1601 if (m_data)
1602 delete m_data;
1603 m_data = new wxVariantDataList(value);
1604 }
1605}
1606
a0a302dc
JS
1607bool wxVariant::operator== (void* value) const
1608{
1609 return (value == ((wxVariantDataVoidPtr*)GetData())->GetValue());
1610}
1611
1612bool wxVariant::operator!= (void* value) const
1613{
f6bcfd97 1614 return (!((*this) == (void*) value));
a0a302dc
JS
1615}
1616
1617void wxVariant::operator= (void* value)
1618{
223d09f6 1619 if (GetType() == wxT("void*"))
a0a302dc
JS
1620 {
1621 ((wxVariantDataVoidPtr*)GetData())->SetValue(value);
1622 }
1623 else
1624 {
1625 if (m_data)
1626 delete m_data;
1627 m_data = new wxVariantDataVoidPtr(value);
1628 }
1629}
341287bf 1630
e2b87f38 1631#if wxUSE_DATETIME
edca7a82
GT
1632bool wxVariant::operator== (const wxDateTime& value) const
1633{
1634 wxDateTime thisValue;
1635 if (!Convert(&thisValue))
cab1a605 1636 return false;
edca7a82
GT
1637
1638 return value.IsEqualTo(thisValue);
1639}
1640
1641bool wxVariant::operator!= (const wxDateTime& value) const
1642{
1643 return (!((*this) == value));
1644}
1645
1646void wxVariant::operator= (const wxDateTime& value)
1647{
1648 if (GetType() == wxT("datetime"))
1649 {
1650 ((wxVariantDataDateTime*)GetData())->SetValue(value);
1651 }
1652 else
1653 {
1654 if (m_data)
1655 delete m_data;
1656 m_data = new wxVariantDataDateTime(value);
1657 }
1658}
e2b87f38 1659#endif // wxUSE_DATETIME
edca7a82 1660
edca7a82
GT
1661#if wxUSE_ODBC
1662void wxVariant::operator= (const DATE_STRUCT* value)
1663{
1664 if (m_data)
1665 delete m_data;
1666 m_data = new wxVariantDataDateTime(value);
1667}
1668
1669
1670void wxVariant::operator= (const TIME_STRUCT* value)
1671{
1672 if (m_data)
1673 delete m_data;
1674 m_data = new wxVariantDataDateTime(value);
1675}
1676
1677
1678void wxVariant::operator= (const TIMESTAMP_STRUCT* value)
1679{
1680 if (m_data)
1681 delete m_data;
1682 m_data = new wxVariantDataDateTime(value);
1683}
1684
fb42d7c3
VZ
1685#endif // wxUSE_ODBC
1686
574c939e 1687bool wxVariant::operator==(const wxArrayString& WXUNUSED(value)) const
fb42d7c3
VZ
1688{
1689 wxFAIL_MSG( _T("TODO") );
1690
cab1a605 1691 return false;
fb42d7c3
VZ
1692}
1693
1694bool wxVariant::operator!=(const wxArrayString& value) const
1695{
1696 return !(*this == value);
1697}
1698
1699void wxVariant::operator=(const wxArrayString& value)
1700{
1701 if (GetType() == wxT("arrstring"))
1702 {
1703 ((wxVariantDataArrayString *)GetData())->SetValue(value);
1704 }
1705 else
1706 {
1707 delete m_data;
1708 m_data = new wxVariantDataArrayString(value);
1709 }
1710}
1711
1712wxArrayString wxVariant::GetArrayString() const
1713{
1714 if ( GetType() == wxT("arrstring") )
1715 return ((wxVariantDataArrayString *)GetData())->GetValue();
1716
1717 return wxArrayString();
1718}
1719
edca7a82 1720
341287bf
JS
1721// Treat a list variant as an array
1722wxVariant wxVariant::operator[] (size_t idx) const
1723{
2c3a1064 1724#if WXWIN_COMPATIBILITY_2_4
223d09f6 1725 wxASSERT_MSG( (GetType() == wxT("list") || GetType() == wxT("stringlist")), wxT("Invalid type for array operator") );
2c3a1064
RN
1726#else
1727 wxASSERT_MSG( GetType() == wxT("list"), wxT("Invalid type for array operator") );
1728#endif
341287bf 1729
223d09f6 1730 if (GetType() == wxT("list"))
341287bf
JS
1731 {
1732 wxVariantDataList* data = (wxVariantDataList*) m_data;
b1d4dd7a
RL
1733 wxASSERT_MSG( (idx < (size_t) data->GetValue().GetCount()), wxT("Invalid index for array") );
1734 return * (wxVariant*) (data->GetValue().Item(idx)->GetData());
341287bf 1735 }
2c3a1064 1736#if WXWIN_COMPATIBILITY_2_4
223d09f6 1737 else if (GetType() == wxT("stringlist"))
341287bf
JS
1738 {
1739 wxVariantDataStringList* data = (wxVariantDataStringList*) m_data;
b1d4dd7a 1740 wxASSERT_MSG( (idx < (size_t) data->GetValue().GetCount()), wxT("Invalid index for array") );
341287bf 1741
254a2129
WS
1742 wxString str( (const wxChar*) (data->GetValue().Item(idx)->GetData()) );
1743 wxVariant variant( str );
341287bf
JS
1744 return variant;
1745 }
2c3a1064 1746#endif
341287bf
JS
1747 return wxNullVariant;
1748}
1749
1750wxVariant& wxVariant::operator[] (size_t idx)
1751{
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.
1754
223d09f6 1755 wxASSERT_MSG( (GetType() == wxT("list")), wxT("Invalid type for array operator") );
341287bf
JS
1756
1757 wxVariantDataList* data = (wxVariantDataList*) m_data;
b1d4dd7a 1758 wxASSERT_MSG( (idx < (size_t) data->GetValue().GetCount()), wxT("Invalid index for array") );
341287bf 1759
b1d4dd7a 1760 return * (wxVariant*) (data->GetValue().Item(idx)->GetData());
341287bf
JS
1761}
1762
1763// Return the number of elements in a list
1764int wxVariant::GetCount() const
1765{
2c3a1064 1766#if WXWIN_COMPATIBILITY_2_4
223d09f6 1767 wxASSERT_MSG( (GetType() == wxT("list") || GetType() == wxT("stringlist")), wxT("Invalid type for GetCount()") );
2c3a1064
RN
1768#else
1769 wxASSERT_MSG( GetType() == wxT("list"), wxT("Invalid type for GetCount()") );
1770#endif
341287bf 1771
223d09f6 1772 if (GetType() == wxT("list"))
341287bf
JS
1773 {
1774 wxVariantDataList* data = (wxVariantDataList*) m_data;
b1d4dd7a 1775 return data->GetValue().GetCount();
341287bf 1776 }
2c3a1064 1777#if WXWIN_COMPATIBILITY_2_4
223d09f6 1778 else if (GetType() == wxT("stringlist"))
341287bf
JS
1779 {
1780 wxVariantDataStringList* data = (wxVariantDataStringList*) m_data;
b1d4dd7a 1781 return data->GetValue().GetCount();
341287bf 1782 }
2c3a1064 1783#endif
341287bf
JS
1784 return 0;
1785}
1786
1787wxString wxVariant::MakeString() const
1788{
1789 if (!IsNull())
1790 {
1791 wxString str;
1792 if (GetData()->Write(str))
1793 return str;
1794 }
525d8583 1795 return wxEmptyString;
341287bf
JS
1796}
1797
1798// Accessors
1799
1800void wxVariant::SetData(wxVariantData* data)
1801{
1802 if (m_data) delete m_data;
1803 m_data = data;
1804}
1805
1806
1807// Returns a string representing the type of the variant,
2c3a1064 1808// e.g. "string", "bool", "list", "double", "long"
341287bf
JS
1809wxString wxVariant::GetType() const
1810{
1811 if (IsNull())
223d09f6 1812 return wxString(wxT("null"));
341287bf
JS
1813 else
1814 return m_data->GetType();
1815}
1816
1817
1818bool wxVariant::IsType(const wxString& type) const
1819{
1820 return (GetType() == type);
1821}
1822
cf6ae290
RG
1823bool wxVariant::IsValueKindOf(const wxClassInfo* type) const
1824{
cab1a605 1825 wxClassInfo* info=m_data->GetValueClassInfo();
cf6ae290
RG
1826 return info ? info->IsKindOf(type) : false ;
1827}
1828
341287bf
JS
1829
1830// Value accessors
1831double wxVariant::GetReal() const
1832{
1833 double value;
1834 if (Convert(& value))
1835 return value;
1836 else
1837 {
223d09f6 1838 wxFAIL_MSG(wxT("Could not convert to a real number"));
341287bf
JS
1839 return 0.0;
1840 }
1841}
1842
1843long wxVariant::GetInteger() const
1844{
1845 long value;
1846 if (Convert(& value))
1847 return value;
1848 else
1849 {
223d09f6 1850 wxFAIL_MSG(wxT("Could not convert to an integer"));
341287bf
JS
1851 return 0;
1852 }
1853}
1854
1855char wxVariant::GetChar() const
1856{
1857 char value;
1858 if (Convert(& value))
1859 return value;
1860 else
1861 {
223d09f6 1862 wxFAIL_MSG(wxT("Could not convert to a char"));
341287bf
JS
1863 return 0;
1864 }
1865}
1866
1867bool wxVariant::GetBool() const
1868{
1869 bool value;
1870 if (Convert(& value))
1871 return value;
1872 else
1873 {
223d09f6 1874 wxFAIL_MSG(wxT("Could not convert to a bool"));
341287bf
JS
1875 return 0;
1876 }
1877}
1878
1879wxString wxVariant::GetString() const
1880{
1881 wxString value;
f6bcfd97 1882 if (!Convert(& value))
341287bf 1883 {
223d09f6 1884 wxFAIL_MSG(wxT("Could not convert to a string"));
341287bf 1885 }
f6bcfd97
BP
1886
1887 return value;
341287bf
JS
1888}
1889
a0a302dc
JS
1890void* wxVariant::GetVoidPtr() const
1891{
223d09f6 1892 wxASSERT( (GetType() == wxT("void*")) );
a0a302dc
JS
1893
1894 return (void*) ((wxVariantDataVoidPtr*) m_data)->GetValue();
1895}
1896
cab1a605 1897wxObject* wxVariant::GetWxObjectPtr()
cf6ae290
RG
1898{
1899 wxASSERT(wxIsKindOf(m_data, wxVariantDataWxObjectPtr));
1900 return (wxObject*) ((wxVariantDataWxObjectPtr*) m_data)->GetValue();
1901}
1902
e2b87f38 1903#if wxUSE_DATETIME
edca7a82
GT
1904wxDateTime wxVariant::GetDateTime() const
1905{
1906 wxDateTime value;
1907 if (!Convert(& value))
1908 {
1909 wxFAIL_MSG(wxT("Could not convert to a datetime"));
1910 }
1911
1912 return value;
1913}
e2b87f38 1914#endif // wxUSE_DATETIME
edca7a82 1915
341287bf
JS
1916wxList& wxVariant::GetList() const
1917{
223d09f6 1918 wxASSERT( (GetType() == wxT("list")) );
341287bf
JS
1919
1920 return (wxList&) ((wxVariantDataList*) m_data)->GetValue();
1921}
1922
2c3a1064
RN
1923#if WXWIN_COMPATIBILITY_2_4
1924
341287bf
JS
1925wxStringList& wxVariant::GetStringList() const
1926{
223d09f6 1927 wxASSERT( (GetType() == wxT("stringlist")) );
341287bf
JS
1928
1929 return (wxStringList&) ((wxVariantDataStringList*) m_data)->GetValue();
1930}
1931
2c3a1064
RN
1932#endif
1933
5dfe6069
VZ
1934// Make empty list
1935void wxVariant::NullList()
1936{
1937 SetData(new wxVariantDataList());
1938};
1939
341287bf
JS
1940// Append to list
1941void wxVariant::Append(const wxVariant& value)
1942{
1943 wxList& list = GetList();
1944
1945 list.Append(new wxVariant(value));
1946}
1947
1948// Insert at front of list
1949void wxVariant::Insert(const wxVariant& value)
1950{
1951 wxList& list = GetList();
1952
1953 list.Insert(new wxVariant(value));
1954}
1955
cab1a605 1956// Returns true if the variant is a member of the list
341287bf
JS
1957bool wxVariant::Member(const wxVariant& value) const
1958{
1959 wxList& list = GetList();
1960
df5168c4 1961 wxList::compatibility_iterator node = list.GetFirst();
341287bf
JS
1962 while (node)
1963 {
b1d4dd7a 1964 wxVariant* other = (wxVariant*) node->GetData();
341287bf 1965 if (value == *other)
cab1a605 1966 return true;
b1d4dd7a 1967 node = node->GetNext();
341287bf 1968 }
cab1a605 1969 return false;
341287bf
JS
1970}
1971
1972// Deletes the nth element of the list
1973bool wxVariant::Delete(int item)
1974{
1975 wxList& list = GetList();
1976
b1d4dd7a 1977 wxASSERT_MSG( (item < (int) list.GetCount()), wxT("Invalid index to Delete") );
df5168c4 1978 wxList::compatibility_iterator node = list.Item(item);
b1d4dd7a 1979 wxVariant* variant = (wxVariant*) node->GetData();
341287bf 1980 delete variant;
df5168c4 1981 list.Erase(node);
cab1a605 1982 return true;
341287bf
JS
1983}
1984
1985// Clear list
1986void wxVariant::ClearList()
1987{
223d09f6 1988 if (!IsNull() && (GetType() == wxT("list")))
341287bf
JS
1989 {
1990 ((wxVariantDataList*) m_data)->Clear();
1991 }
1992 else
1993 {
223d09f6 1994 if (GetType() != wxT("list"))
341287bf
JS
1995 {
1996 delete m_data;
1997 m_data = NULL;
1998 }
1999 m_data = new wxVariantDataList;
2000 }
2001}
2002
2003// Type conversion
2004bool wxVariant::Convert(long* value) const
2005{
2006 wxString type(GetType());
223d09f6 2007 if (type == wxT("double"))
341287bf 2008 *value = (long) (((wxVariantDataReal*)GetData())->GetValue());
223d09f6 2009 else if (type == wxT("long"))
341287bf 2010 *value = ((wxVariantDataLong*)GetData())->GetValue();
862416e0 2011#ifdef HAVE_BOOL
223d09f6 2012 else if (type == wxT("bool"))
341287bf 2013 *value = (long) (((wxVariantDataBool*)GetData())->GetValue());
862416e0 2014#endif
223d09f6 2015 else if (type == wxT("string"))
783b6cfd 2016 *value = wxAtol((const wxChar*) ((wxVariantDataString*)GetData())->GetValue());
341287bf 2017 else
cab1a605 2018 return false;
341287bf 2019
cab1a605 2020 return true;
341287bf
JS
2021}
2022
2023bool wxVariant::Convert(bool* value) const
2024{
2025 wxString type(GetType());
223d09f6 2026 if (type == wxT("double"))
341287bf 2027 *value = ((int) (((wxVariantDataReal*)GetData())->GetValue()) != 0);
223d09f6 2028 else if (type == wxT("long"))
341287bf 2029 *value = (((wxVariantDataLong*)GetData())->GetValue() != 0);
862416e0 2030#ifdef HAVE_BOOL
223d09f6 2031 else if (type == wxT("bool"))
341287bf 2032 *value = ((wxVariantDataBool*)GetData())->GetValue();
862416e0 2033#endif
223d09f6 2034 else if (type == wxT("string"))
341287bf
JS
2035 {
2036 wxString val(((wxVariantDataString*)GetData())->GetValue());
2037 val.MakeLower();
0bb309f7 2038 if (val == wxT("true") || val == wxT("yes"))
cab1a605 2039 *value = true;
0bb309f7 2040 else if (val == wxT("false") || val == wxT("no"))
cab1a605 2041 *value = false;
341287bf 2042 else
cab1a605 2043 return false;
341287bf
JS
2044 }
2045 else
cab1a605 2046 return false;
341287bf 2047
cab1a605 2048 return true;
341287bf
JS
2049}
2050
2051bool wxVariant::Convert(double* value) const
2052{
2053 wxString type(GetType());
223d09f6 2054 if (type == wxT("double"))
341287bf 2055 *value = ((wxVariantDataReal*)GetData())->GetValue();
223d09f6 2056 else if (type == wxT("long"))
341287bf 2057 *value = (double) (((wxVariantDataLong*)GetData())->GetValue());
862416e0 2058#ifdef HAVE_BOOL
223d09f6 2059 else if (type == wxT("bool"))
341287bf 2060 *value = (double) (((wxVariantDataBool*)GetData())->GetValue());
862416e0 2061#endif
223d09f6 2062 else if (type == wxT("string"))
783b6cfd 2063 *value = (double) wxAtof((const wxChar*) ((wxVariantDataString*)GetData())->GetValue());
341287bf 2064 else
cab1a605 2065 return false;
341287bf 2066
cab1a605 2067 return true;
341287bf
JS
2068}
2069
2070bool wxVariant::Convert(char* value) const
2071{
2072 wxString type(GetType());
223d09f6 2073 if (type == wxT("char"))
341287bf 2074 *value = ((wxVariantDataChar*)GetData())->GetValue();
223d09f6 2075 else if (type == wxT("long"))
341287bf 2076 *value = (char) (((wxVariantDataLong*)GetData())->GetValue());
862416e0 2077#ifdef HAVE_BOOL
223d09f6 2078 else if (type == wxT("bool"))
341287bf 2079 *value = (char) (((wxVariantDataBool*)GetData())->GetValue());
862416e0 2080#endif
341287bf 2081 else
cab1a605 2082 return false;
341287bf 2083
cab1a605 2084 return true;
341287bf
JS
2085}
2086
2087bool wxVariant::Convert(wxString* value) const
2088{
2089 *value = MakeString();
cab1a605 2090 return true;
341287bf
JS
2091}
2092
e2b87f38 2093#if wxUSE_DATETIME
edca7a82
GT
2094bool wxVariant::Convert(wxDateTime* value) const
2095{
2096 wxString type(GetType());
2097 if (type == wxT("datetime"))
9708db20 2098 {
edca7a82 2099 *value = ((wxVariantDataDateTime*)GetData())->GetValue();
cab1a605 2100 return true;
dc259b79 2101 }
9708db20
JS
2102 // Fallback to string conversion
2103 wxString val;
9a8a9e99
VZ
2104 return Convert(&val) &&
2105 (value->ParseDateTime(val) || value->ParseDate(val));
edca7a82 2106}
b1e343f2
VZ
2107#endif // wxUSE_DATETIME
2108