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