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