]> git.saurik.com Git - wxWidgets.git/blame - src/generic/prop.cpp
implemented menu drawing in the GTK theme
[wxWidgets.git] / src / generic / prop.cpp
CommitLineData
e3a43801
JS
1/////////////////////////////////////////////////////////////////////////////
2// Name: prop.cpp
3// Purpose: Propert sheet classes implementation
4// Author: Julian Smart
5// Modified by:
6// Created: 04/01/98
7// RCS-ID: $Id$
8// Copyright: (c) Julian Smart
1e6feb95 9// Licence: wxWindows licence
e3a43801
JS
10/////////////////////////////////////////////////////////////////////////////
11
12#ifdef __GNUG__
13#pragma implementation "prop.h"
14#endif
15
16// For compilers that support precompilation, includes "wx/wx.h".
17#include "wx/wxprec.h"
18
19#ifdef __BORLANDC__
20#pragma hdrstop
21#endif
22
1e6feb95
VZ
23#if wxUSE_PROPSHEET
24
e3a43801 25#ifndef WX_PRECOMP
e3a43801
JS
26#endif
27
c693edf3
RR
28#include "wx/debug.h"
29#include "wx/prop.h"
30
e3a43801
JS
31#include <ctype.h>
32#include <stdlib.h>
33#include <math.h>
34#include <string.h>
35
e3a43801
JS
36
37IMPLEMENT_DYNAMIC_CLASS(wxPropertyValue, wxObject)
38
39wxPropertyValue::wxPropertyValue(void)
40{
41 m_type = wxPropertyValueNull;
42 m_next = NULL;
43 m_last = NULL;
44 m_value.first = NULL;
45 m_clientData = NULL;
46 m_modifiedFlag = FALSE;
47}
48
49wxPropertyValue::wxPropertyValue(const wxPropertyValue& copyFrom)
50{
30b5fc11 51 m_value.string = (wxChar*) NULL;
e3a43801
JS
52 m_modifiedFlag = FALSE;
53 Copy((wxPropertyValue& )copyFrom);
54}
55
87138c52 56wxPropertyValue::wxPropertyValue(const wxChar *val)
e3a43801
JS
57{
58 m_modifiedFlag = FALSE;
59 m_type = wxPropertyValueString;
60
61 m_value.string = copystring(val);
62 m_clientData = NULL;
63 m_next = NULL;
64 m_last = NULL;
65}
66
67wxPropertyValue::wxPropertyValue(const wxString& val)
68{
69 m_modifiedFlag = FALSE;
70 m_type = wxPropertyValueString;
71
87138c52 72 m_value.string = copystring((const wxChar *)val);
e3a43801
JS
73 m_clientData = NULL;
74 m_next = NULL;
75 m_last = NULL;
76}
77
78wxPropertyValue::wxPropertyValue(long the_integer)
79{
80 m_modifiedFlag = FALSE;
81 m_type = wxPropertyValueInteger;
82 m_value.integer = the_integer;
83 m_clientData = NULL;
84 m_next = NULL;
85}
86
87wxPropertyValue::wxPropertyValue(bool val)
88{
89 m_modifiedFlag = FALSE;
90 m_type = wxPropertyValuebool;
91 m_value.integer = val;
92 m_clientData = NULL;
93 m_next = NULL;
94}
95
96wxPropertyValue::wxPropertyValue(float the_real)
97{
98 m_modifiedFlag = FALSE;
99 m_type = wxPropertyValueReal;
100 m_value.real = the_real;
101 m_clientData = NULL;
102 m_next = NULL;
103}
104
105wxPropertyValue::wxPropertyValue(double the_real)
106{
107 m_modifiedFlag = FALSE;
108 m_type = wxPropertyValueReal;
109 m_value.real = (float)the_real;
110 m_clientData = NULL;
111 m_next = NULL;
112}
113
114// Pointer versions: we have a pointer to the real C++ value.
87138c52 115wxPropertyValue::wxPropertyValue(wxChar **val)
e3a43801
JS
116{
117 m_modifiedFlag = FALSE;
118 m_type = wxPropertyValueStringPtr;
119
120 m_value.stringPtr = val;
121 m_clientData = NULL;
122 m_next = NULL;
123 m_last = NULL;
124}
125
126wxPropertyValue::wxPropertyValue(long *val)
127{
128 m_modifiedFlag = FALSE;
129 m_type = wxPropertyValueIntegerPtr;
130 m_value.integerPtr = val;
131 m_clientData = NULL;
132 m_next = NULL;
133}
134
135wxPropertyValue::wxPropertyValue(bool *val)
136{
137 m_modifiedFlag = FALSE;
138 m_type = wxPropertyValueboolPtr;
139 m_value.boolPtr = val;
140 m_clientData = NULL;
141 m_next = NULL;
142}
143
144wxPropertyValue::wxPropertyValue(float *val)
145{
146 m_modifiedFlag = FALSE;
147 m_type = wxPropertyValueRealPtr;
148 m_value.realPtr = val;
149 m_clientData = NULL;
150 m_next = NULL;
151}
152
153wxPropertyValue::wxPropertyValue(wxList *the_list)
154{
155 m_modifiedFlag = FALSE;
156 m_type = wxPropertyValueList;
157 m_clientData = NULL;
158 m_last = NULL;
159 m_value.first = NULL;
160
161 wxNode *node = the_list->First();
162 while (node)
163 {
164 wxPropertyValue *expr = (wxPropertyValue *)node->Data();
165 Append(expr);
166 node = node->Next();
167 }
168
169 delete the_list;
170}
171
172wxPropertyValue::wxPropertyValue(wxStringList *the_list)
173{
174 m_modifiedFlag = FALSE;
175 m_type = wxPropertyValueList;
176 m_clientData = NULL;
177 m_last = NULL;
178 m_value.first = NULL;
179
180 wxNode *node = the_list->First();
181 while (node)
182 {
f6bcfd97 183 wxChar *s = (wxChar *)node->Data();
e3a43801
JS
184 Append(new wxPropertyValue(s));
185 node = node->Next();
186 }
187 delete the_list;
188}
189
190wxPropertyValue::~wxPropertyValue(void)
191{
192 switch (m_type)
193 {
194 case wxPropertyValueInteger:
195 case wxPropertyValuebool:
196 case wxPropertyValueReal:
197 {
198 break;
199 }
200 case wxPropertyValueString:
201 {
202 delete[] m_value.string;
203 break;
204 }
205 case wxPropertyValueList:
206 {
207 wxPropertyValue *expr = m_value.first;
208 while (expr)
209 {
210 wxPropertyValue *expr1 = expr->m_next;
211
212 delete expr;
213 expr = expr1;
214 }
215 break;
216 }
217 default:
218 case wxPropertyValueNull: break;
219 }
220}
221
222void wxPropertyValue::Append(wxPropertyValue *expr)
223{
224 m_modifiedFlag = TRUE;
225 if (!m_value.first)
226 m_value.first = expr;
227
228 if (m_last)
229 m_last->m_next = expr;
230 m_last = expr;
231}
232
233void wxPropertyValue::Insert(wxPropertyValue *expr)
234{
235 m_modifiedFlag = TRUE;
236 expr->m_next = m_value.first;
237 m_value.first = expr;
238
239 if (!m_last)
240 m_last = expr;
241}
242
243// Delete from list
244void wxPropertyValue::Delete(wxPropertyValue *node)
245{
246 wxPropertyValue *expr = GetFirst();
2179d579 247
e3a43801
JS
248 wxPropertyValue *previous = NULL;
249 while (expr && (expr != node))
250 {
251 previous = expr;
252 expr = expr->GetNext();
253 }
254
255 if (expr)
256 {
257 if (previous)
258 previous->m_next = expr->m_next;
2179d579 259
e3a43801
JS
260 // If node was the first in the list,
261 // make the list point to the NEXT one.
262 if (GetFirst() == expr)
263 {
264 m_value.first = expr->m_next;
265 }
266
267 // If node was the last in the list,
268 // make the list 'last' pointer point to the PREVIOUS one.
269 if (GetLast() == expr)
270 {
271 if (previous)
272 m_last = previous;
273 else
274 m_last = NULL;
275 }
276 m_modifiedFlag = TRUE;
277 delete expr;
278 }
279
280}
281
282void wxPropertyValue::ClearList(void)
283{
284 wxPropertyValue *val = GetFirst();
285 if (val)
286 m_modifiedFlag = TRUE;
287
288 while (val)
289 {
290 wxPropertyValue *next = val->GetNext();
291 delete val;
292 val = next;
293 }
294 m_value.first = NULL;
295 m_last = NULL;
296}
297
298wxPropertyValue *wxPropertyValue::NewCopy(void) const
299{
300 switch (m_type)
301 {
302 case wxPropertyValueInteger:
303 return new wxPropertyValue(m_value.integer);
304 case wxPropertyValuebool:
305 return new wxPropertyValue((bool) (m_value.integer != 0));
306 case wxPropertyValueReal:
307 return new wxPropertyValue(m_value.real);
308 case wxPropertyValueString:
309 return new wxPropertyValue(m_value.string);
310 case wxPropertyValueList:
311 {
312 wxPropertyValue *expr = m_value.first;
313 wxPropertyValue *new_list = new wxPropertyValue;
314 new_list->SetType(wxPropertyValueList);
315 while (expr)
316 {
317 wxPropertyValue *expr2 = expr->NewCopy();
318 new_list->Append(expr2);
319 expr = expr->m_next;
320 }
321 return new_list;
322 }
323 case wxPropertyValueIntegerPtr:
324 return new wxPropertyValue(m_value.integerPtr);
325 case wxPropertyValueRealPtr:
326 return new wxPropertyValue(m_value.realPtr);
327 case wxPropertyValueboolPtr:
328 return new wxPropertyValue(m_value.boolPtr);
329 case wxPropertyValueStringPtr:
330 return new wxPropertyValue(m_value.stringPtr);
331
2179d579 332 case wxPropertyValueNull:
223d09f6 333 wxFAIL_MSG( wxT("Should never get here!\n" ) );
e3a43801
JS
334 break;
335 }
336 return NULL;
337}
338
339void wxPropertyValue::Copy(wxPropertyValue& copyFrom)
340{
30b5fc11
JS
341 if (m_type == wxPropertyValueString)
342 {
343 delete[] m_value.string ;
344 m_value.string = NULL;
345 }
e3a43801
JS
346 m_type = copyFrom.Type();
347
348 switch (m_type)
349 {
350 case wxPropertyValueInteger:
351 (*this) = copyFrom.IntegerValue();
352 return ;
353
354 case wxPropertyValueReal:
355 (*this) = copyFrom.RealValue();
356 return ;
2179d579 357
e3a43801
JS
358 case wxPropertyValueString:
359 (*this) = wxString(copyFrom.StringValue());
360 return ;
2179d579 361
e3a43801
JS
362 case wxPropertyValuebool:
363 (*this) = copyFrom.BoolValue();
364 return ;
365
366 // Pointers
367 case wxPropertyValueboolPtr:
368 (*this) = copyFrom.BoolValuePtr();
369 return ;
370 case wxPropertyValueRealPtr:
371 (*this) = copyFrom.RealValuePtr();
372 return ;
373 case wxPropertyValueIntegerPtr:
374 (*this) = copyFrom.IntegerValuePtr();
375 return ;
376 case wxPropertyValueStringPtr:
377 {
87138c52 378 wxChar** s = copyFrom.StringValuePtr();
cfcab3d2
MB
379
380#if 0
1408104d 381 // what is this? are you trying to assign a bool or a string? VA can't figure it out..
2996bcde 382#if defined(__VISAGECPP__) || defined( __VISUALC__ )
1408104d
DW
383 (*this) = s;
384#else
71cbe687 385 (*this) = s != 0;
1408104d 386#endif
cfcab3d2
MB
387#endif // if 0
388
74b31181 389 (*this) = (bool)(s != 0);
cfcab3d2 390
e3a43801
JS
391 return ;
392 }
2179d579 393
e3a43801
JS
394 case wxPropertyValueList:
395 {
396 m_value.first = NULL;
397 m_next = NULL;
398 m_last = NULL;
399 wxPropertyValue *expr = copyFrom.m_value.first;
400 while (expr)
401 {
402 wxPropertyValue *expr2 = expr->NewCopy();
403 Append(expr2);
404 expr = expr->m_next;
405 }
406 return;
407 }
2179d579 408 case wxPropertyValueNull:
223d09f6 409 wxFAIL_MSG( wxT("Should never get here!\n" ) );
e3a43801
JS
410 break;
411 }
412}
413
414// Return nth argument of a clause (starting from 1)
415wxPropertyValue *wxPropertyValue::Arg(wxPropertyValueType type, int arg) const
416{
417 wxPropertyValue *expr = m_value.first;
418 for (int i = 1; i < arg; i++)
419 if (expr)
420 expr = expr->m_next;
421
422 if (expr && (expr->m_type == type))
423 return expr;
424 else
425 return NULL;
426}
427
428// Return nth argument of a list expression (starting from zero)
429wxPropertyValue *wxPropertyValue::Nth(int arg) const
430{
431 if (m_type != wxPropertyValueList)
432 return NULL;
433
434 wxPropertyValue *expr = m_value.first;
435 for (int i = 0; i < arg; i++)
436 if (expr)
437 expr = expr->m_next;
438 else return NULL;
439
440 if (expr)
441 return expr;
442 else
443 return NULL;
444}
445
446 // Returns the number of elements in a list expression
447int wxPropertyValue::Number(void) const
448{
449 if (m_type != wxPropertyValueList)
450 return 0;
451
452 int i = 0;
453 wxPropertyValue *expr = m_value.first;
454 while (expr)
455 {
456 expr = expr->m_next;
457 i ++;
458 }
459 return i;
460}
461
c693edf3 462void wxPropertyValue::WritePropertyClause(wxString& stream) // Write this expression as a top-level clause
e3a43801
JS
463{
464 if (m_type != wxPropertyValueList)
465 return;
466
467 wxPropertyValue *node = m_value.first;
468 if (node)
469 {
470 node->WritePropertyType(stream);
223d09f6 471 stream.Append( wxT("(") );
e3a43801
JS
472 node = node->m_next;
473 bool first = TRUE;
474 while (node)
475 {
476 if (!first)
223d09f6 477 stream.Append( wxT(" ") );
e3a43801
JS
478 node->WritePropertyType(stream);
479 node = node->m_next;
2179d579 480 if (node)
223d09f6 481 stream.Append( wxT(",\n" ) );
e3a43801
JS
482 first = FALSE;
483 }
223d09f6 484 stream.Append( wxT(").\n\n") );
e3a43801
JS
485 }
486}
487
c693edf3 488void wxPropertyValue::WritePropertyType(wxString& stream) // Write as any other subexpression
e3a43801 489{
c693edf3 490 wxString tmp;
e3a43801
JS
491 switch (m_type)
492 {
493 case wxPropertyValueInteger:
494 {
223d09f6 495 tmp.Printf( wxT("%ld"), m_value.integer );
c693edf3 496 stream.Append( tmp );
e3a43801
JS
497 break;
498 }
499 case wxPropertyValueIntegerPtr:
500 {
223d09f6 501 tmp.Printf( wxT("%ld"), *m_value.integerPtr );
c693edf3 502 stream.Append( tmp );
e3a43801
JS
503 break;
504 }
505 case wxPropertyValuebool:
506 {
507 if (m_value.integer)
223d09f6 508 stream.Append( wxT("True") );
e3a43801 509 else
223d09f6 510 stream.Append( wxT("False") );
e3a43801
JS
511 break;
512 }
513 case wxPropertyValueboolPtr:
514 {
515 if (*m_value.integerPtr)
223d09f6 516 stream.Append( wxT("True") );
e3a43801 517 else
223d09f6 518 stream.Append( wxT("False") );
e3a43801
JS
519 break;
520 }
521 case wxPropertyValueReal:
522 {
c693edf3 523 double d = m_value.real;
223d09f6 524 tmp.Printf( wxT("%.6g"), d );
c693edf3 525 stream.Append( tmp );
e3a43801
JS
526 break;
527 }
528 case wxPropertyValueRealPtr:
529 {
c693edf3 530 double d = *m_value.realPtr;
223d09f6 531 tmp.Printf( wxT("%.6g"), d );
c693edf3 532 stream.Append( tmp );
e3a43801
JS
533 break;
534 }
535 case wxPropertyValueString:
536 {
c693edf3 537 stream.Append( m_value.string );
e3a43801
JS
538 break;
539 }
540 case wxPropertyValueStringPtr:
541 {
223d09f6 542 wxFAIL_MSG( wxT("wxPropertyValue::WritePropertyType( wxPropertyValueStringPtr ) not implemented") );
8710cf5c 543 /*
e3a43801
JS
544 int i;
545 int len = strlen(*(m_value.stringPtr));
546 for (i = 0; i < len; i++)
547 {
548 char ch = *(m_value.stringPtr)[i];
549
550 }
8710cf5c 551 */
e3a43801
JS
552 break;
553 }
554 case wxPropertyValueList:
555 {
556 if (!m_value.first)
223d09f6 557 stream.Append( wxT("[]") );
e3a43801
JS
558 else
559 {
560 wxPropertyValue *expr = m_value.first;
561
223d09f6 562 stream.Append( wxT("[") );
e3a43801
JS
563 while (expr)
564 {
565 expr->WritePropertyType(stream);
566 expr = expr->m_next;
2179d579 567 if (expr)
1e6feb95 568 stream.Append( wxT(", ") );
e3a43801 569 }
223d09f6 570 stream.Append( wxT("]") );
e3a43801
JS
571 }
572 break;
573 }
574 case wxPropertyValueNull: break;
575 }
576}
577
578wxString wxPropertyValue::GetStringRepresentation(void)
579{
c693edf3 580 wxString str;
e3a43801 581 WritePropertyType(str);
c693edf3 582 return str;
e3a43801
JS
583}
584
585void wxPropertyValue::operator=(const wxPropertyValue& val)
586{
587 m_modifiedFlag = TRUE;
588 Copy((wxPropertyValue&)val);
589}
590
591// void wxPropertyValue::operator=(const char *val)
592void wxPropertyValue::operator=(const wxString& val1)
593{
87138c52 594 const wxChar *val = (const wxChar *)val1;
e3a43801
JS
595
596 m_modifiedFlag = TRUE;
30b5fc11
JS
597
598 wxPropertyValueType oldType = m_type;
599 if (oldType == wxPropertyValueString)
600 {
601 delete[] m_value.string ;
602 m_value.string = NULL;
603 }
604
e3a43801
JS
605 if (m_type == wxPropertyValueNull)
606 m_type = wxPropertyValueString;
607
608 if (m_type == wxPropertyValueString)
609 {
610 if (val)
611 m_value.string = copystring(val);
612 else
613 m_value.string = NULL;
614 }
615 else if (m_type == wxPropertyValueStringPtr)
616 {
8ca97ad0 617 wxFAIL_MSG( wxT("Shouldn't try to assign a wxString reference to a char* pointer.") );
e3a43801
JS
618 if (val)
619 *m_value.stringPtr = copystring(val);
620 else
621 *m_value.stringPtr = NULL;
622 }
2179d579 623
e3a43801
JS
624 m_clientData = NULL;
625 m_next = NULL;
626 m_last = NULL;
627
628}
629
630void wxPropertyValue::operator=(const long val)
631{
30b5fc11
JS
632 wxPropertyValueType oldType = m_type;
633 if (oldType == wxPropertyValueString)
634 {
635 delete[] m_value.string ;
636 m_value.string = NULL;
637 }
638
e3a43801
JS
639 m_modifiedFlag = TRUE;
640 if (m_type == wxPropertyValueNull)
641 m_type = wxPropertyValueInteger;
642
643 if (m_type == wxPropertyValueInteger)
644 m_value.integer = val;
645 else if (m_type == wxPropertyValueIntegerPtr)
646 *m_value.integerPtr = val;
647 else if (m_type == wxPropertyValueReal)
648 m_value.real = (float)val;
649 else if (m_type == wxPropertyValueRealPtr)
650 *m_value.realPtr = (float)val;
651
652 m_clientData = NULL;
653 m_next = NULL;
654}
655
656void wxPropertyValue::operator=(const bool val)
657{
30b5fc11
JS
658 wxPropertyValueType oldType = m_type;
659 if (oldType == wxPropertyValueString)
660 {
661 delete[] m_value.string ;
662 m_value.string = NULL;
663 }
664
e3a43801
JS
665 m_modifiedFlag = TRUE;
666 if (m_type == wxPropertyValueNull)
667 m_type = wxPropertyValuebool;
668
669 if (m_type == wxPropertyValuebool)
670 m_value.integer = (long)val;
671 else if (m_type == wxPropertyValueboolPtr)
672 *m_value.boolPtr = val;
673
674 m_clientData = NULL;
675 m_next = NULL;
676}
677
678void wxPropertyValue::operator=(const float val)
679{
30b5fc11
JS
680 wxPropertyValueType oldType = m_type;
681 if (oldType == wxPropertyValueString)
682 {
683 delete[] m_value.string ;
684 m_value.string = NULL;
685 }
686
e3a43801
JS
687 m_modifiedFlag = TRUE;
688 if (m_type == wxPropertyValueNull)
689 m_type = wxPropertyValueReal;
690
691 if (m_type == wxPropertyValueInteger)
692 m_value.integer = (long)val;
693 else if (m_type == wxPropertyValueIntegerPtr)
694 *m_value.integerPtr = (long)val;
695 else if (m_type == wxPropertyValueReal)
696 m_value.real = val;
697 else if (m_type == wxPropertyValueRealPtr)
698 *m_value.realPtr = val;
699
700 m_clientData = NULL;
701 m_next = NULL;
702}
703
87138c52 704void wxPropertyValue::operator=(const wxChar **val)
e3a43801 705{
30b5fc11
JS
706 wxPropertyValueType oldType = m_type;
707 if (oldType == wxPropertyValueString)
708 {
709 delete[] m_value.string ;
710 m_value.string = NULL;
711 }
712
e3a43801
JS
713 m_modifiedFlag = TRUE;
714 m_type = wxPropertyValueStringPtr;
715
716 if (val)
87138c52 717 m_value.stringPtr = (wxChar **)val;
e3a43801
JS
718 else
719 m_value.stringPtr = NULL;
720 m_clientData = NULL;
721 m_next = NULL;
722 m_last = NULL;
723
724}
725
726void wxPropertyValue::operator=(const long *val)
727{
728 m_modifiedFlag = TRUE;
729 m_type = wxPropertyValueIntegerPtr;
730 m_value.integerPtr = (long *)val;
731 m_clientData = NULL;
732 m_next = NULL;
733}
734
735void wxPropertyValue::operator=(const bool *val)
736{
737 m_modifiedFlag = TRUE;
738 m_type = wxPropertyValueboolPtr;
739 m_value.boolPtr = (bool *)val;
740 m_clientData = NULL;
741 m_next = NULL;
742}
743
744void wxPropertyValue::operator=(const float *val)
745{
746 m_modifiedFlag = TRUE;
747 m_type = wxPropertyValueRealPtr;
748 m_value.realPtr = (float *)val;
749 m_clientData = NULL;
750 m_next = NULL;
751}
752
753long wxPropertyValue::IntegerValue(void) const
754 {
755 if (m_type == wxPropertyValueInteger)
756 return m_value.integer;
757 else if (m_type == wxPropertyValueReal)
758 return (long)m_value.real;
759 else if (m_type == wxPropertyValueIntegerPtr)
760 return *m_value.integerPtr;
761 else if (m_type == wxPropertyValueRealPtr)
762 return (long)(*m_value.realPtr);
763 else return 0;
764 }
765
766long *wxPropertyValue::IntegerValuePtr(void) const
767{
768 return m_value.integerPtr;
769}
770
771float wxPropertyValue::RealValue(void) const {
772 if (m_type == wxPropertyValueReal)
773 return m_value.real;
774 else if (m_type == wxPropertyValueRealPtr)
775 return *m_value.realPtr;
776 else if (m_type == wxPropertyValueInteger)
777 return (float)m_value.integer;
778 else if (m_type == wxPropertyValueIntegerPtr)
779 return (float)*(m_value.integerPtr);
780 else return 0.0;
781 }
782
783float *wxPropertyValue::RealValuePtr(void) const
784{
785 return m_value.realPtr;
786}
787
788bool wxPropertyValue::BoolValue(void) const {
789 if (m_type == wxPropertyValueReal)
790 return (m_value.real != 0.0);
791 if (m_type == wxPropertyValueRealPtr)
792 return (*(m_value.realPtr) != 0.0);
793 else if (m_type == wxPropertyValueInteger)
794 return (m_value.integer != 0);
795 else if (m_type == wxPropertyValueIntegerPtr)
796 return (*(m_value.integerPtr) != 0);
797 else if (m_type == wxPropertyValuebool)
798 return (m_value.integer != 0);
799 else if (m_type == wxPropertyValueboolPtr)
800 return (*(m_value.boolPtr) != 0);
801 else return FALSE;
802 }
803
804bool *wxPropertyValue::BoolValuePtr(void) const
805{
806 return m_value.boolPtr;
807}
808
87138c52 809wxChar *wxPropertyValue::StringValue(void) const {
e3a43801
JS
810 if (m_type == wxPropertyValueString)
811 return m_value.string;
812 else if (m_type == wxPropertyValueStringPtr)
813 return *(m_value.stringPtr);
814 else return NULL;
815 }
816
87138c52 817wxChar **wxPropertyValue::StringValuePtr(void) const
e3a43801
JS
818{
819 return m_value.stringPtr;
820}
821
822/*
823 * A property (name plus value)
824 */
2179d579 825
e3a43801
JS
826IMPLEMENT_DYNAMIC_CLASS(wxProperty, wxObject)
827
828wxProperty::wxProperty(void)
829{
ce3ed50d 830 m_propertyRole = wxEmptyString;
e3a43801
JS
831 m_propertyValidator = NULL;
832 m_propertyWindow = NULL;
833 m_enabled = TRUE;
834}
835
836wxProperty::wxProperty(wxProperty& copyFrom)
837{
838 m_value = copyFrom.GetValue();
839 m_name = copyFrom.GetName();
840 m_propertyRole = copyFrom.GetRole();
841 m_propertyValidator = copyFrom.GetValidator();
842 m_enabled = copyFrom.IsEnabled();
843 m_propertyWindow = NULL;
844}
845
846wxProperty::wxProperty(wxString nm, wxString role, wxPropertyValidator *ed):m_name(nm), m_propertyRole(role)
847{
848 m_propertyValidator = ed;
849 m_propertyWindow = NULL;
850 m_enabled = TRUE;
851}
852
853wxProperty::wxProperty(wxString nm, const wxPropertyValue& val, wxString role, wxPropertyValidator *ed):
8710cf5c 854 m_value(val), m_name(nm), m_propertyRole(role)
e3a43801
JS
855{
856 m_propertyValidator = ed;
857 m_propertyWindow = NULL;
858 m_enabled = TRUE;
859}
860
861wxProperty::~wxProperty(void)
862{
863 if (m_propertyValidator)
864 delete m_propertyValidator;
865}
866
867wxPropertyValue& wxProperty::GetValue(void) const
868{
869 return (wxPropertyValue&) m_value;
870}
871
872wxPropertyValidator *wxProperty::GetValidator(void) const
873{
874 return m_propertyValidator;
875}
876
877wxString& wxProperty::GetName(void) const
878{
879 return (wxString&) m_name;
880}
881
882wxString& wxProperty::GetRole(void) const
883{
884 return (wxString&) m_propertyRole;
885}
886
887void wxProperty::SetValue(const wxPropertyValue& val)
888{
889 m_value = val;
890}
891
892void wxProperty::SetValidator(wxPropertyValidator *ed)
893{
894 m_propertyValidator = ed;
895}
896
897void wxProperty::SetRole(wxString& role)
898{
899 m_propertyRole = role;
900}
901
902void wxProperty::SetName(wxString& nm)
903{
904 m_name = nm;
905}
906
907void wxProperty::operator=(const wxPropertyValue& val)
908{
909 m_value = val;
910}
911
912/*
913 * Base property view class
914 */
2179d579 915
e3a43801
JS
916IMPLEMENT_DYNAMIC_CLASS(wxPropertyView, wxEvtHandler)
917
918wxPropertyView::wxPropertyView(long flags)
919{
920 m_buttonFlags = flags;
921 m_propertySheet = NULL;
922 m_currentValidator = NULL;
923 m_currentProperty = NULL;
924}
925
926wxPropertyView::~wxPropertyView(void)
927{
928}
929
930void wxPropertyView::AddRegistry(wxPropertyValidatorRegistry *registry)
931{
932 m_validatorRegistryList.Append(registry);
933}
934
935wxPropertyValidator *wxPropertyView::FindPropertyValidator(wxProperty *property)
936{
937 if (property->GetValidator())
938 return property->GetValidator();
2179d579 939
e3a43801
JS
940 wxNode *node = m_validatorRegistryList.First();
941 while (node)
942 {
943 wxPropertyValidatorRegistry *registry = (wxPropertyValidatorRegistry *)node->Data();
944 wxPropertyValidator *validator = registry->GetValidator(property->GetRole());
945 if (validator)
946 return validator;
947 node = node->Next();
948 }
949 return NULL;
950/*
951 if (!wxDefaultPropertyValidator)
952 wxDefaultPropertyValidator = new wxPropertyListValidator;
953 return wxDefaultPropertyValidator;
954*/
955}
956
957/*
958 * Property sheet
959 */
960
961IMPLEMENT_DYNAMIC_CLASS(wxPropertySheet, wxObject)
962
cba2db0c 963wxPropertySheet::wxPropertySheet(const wxString& name)
f3a65071 964:m_properties(wxKEY_STRING),m_name(name)
e3a43801
JS
965{
966}
967
968wxPropertySheet::~wxPropertySheet(void)
969{
970 Clear();
971}
972
e3a43801
JS
973void wxPropertySheet::UpdateAllViews( wxPropertyView *WXUNUSED(thisView) )
974{
975}
976
977// Add a property
978void wxPropertySheet::AddProperty(wxProperty *property)
979{
87138c52 980 m_properties.Append((const wxChar*) property->GetName(), property);
e3a43801
JS
981}
982
983// Get property by name
cba2db0c 984wxProperty *wxPropertySheet::GetProperty(const wxString& name) const
e3a43801 985{
87138c52 986 wxNode *node = m_properties.Find((const wxChar*) name);
e3a43801
JS
987 if (!node)
988 return NULL;
989 else
990 return (wxProperty *)node->Data();
991}
cba2db0c
JS
992
993bool wxPropertySheet::SetProperty(const wxString& name, const wxPropertyValue& value)
f3a65071
JS
994{
995 wxProperty* prop = GetProperty(name);
996 if(prop){
997 prop->SetValue(value);
0a240683 998 return TRUE;
f3a65071 999 }else{
0a240683 1000 return FALSE;
f3a65071
JS
1001 }
1002}
cba2db0c
JS
1003
1004void wxPropertySheet::RemoveProperty(const wxString& name)
f3a65071
JS
1005{
1006 wxNode *node = m_properties.Find(name);
1007 if(node)
1008 {
1009 wxProperty *prop = (wxProperty *)node->Data();
1e6feb95 1010 delete prop;
f3a65071
JS
1011 m_properties.DeleteNode(node);
1012 }
1e6feb95 1013}
cba2db0c
JS
1014
1015bool wxPropertySheet::HasProperty(const wxString& name) const
2179d579 1016{
1e6feb95 1017 return (GetProperty(name)?TRUE:FALSE);
f3a65071 1018}
cba2db0c 1019
e3a43801
JS
1020// Clear all properties
1021void wxPropertySheet::Clear(void)
1022{
1023 wxNode *node = m_properties.First();
1024 while (node)
1025 {
1026 wxProperty *prop = (wxProperty *)node->Data();
1027 wxNode *next = node->Next();
1028 delete prop;
1029 delete node;
1030 node = next;
1031 }
1032}
1033
1034// Sets/clears the modified flag for each property value
1035void wxPropertySheet::SetAllModified(bool flag)
1036{
1037 wxNode *node = m_properties.First();
1038 while (node)
1039 {
1040 wxProperty *prop = (wxProperty *)node->Data();
1041 prop->GetValue().SetModified(flag);
1042 node = node->Next();
2179d579 1043 }
e3a43801
JS
1044}
1045
1046/*
1047 * Property validator registry
1048 *
1049 */
1050
1051IMPLEMENT_DYNAMIC_CLASS(wxPropertyValidatorRegistry, wxHashTable)
1052
1053wxPropertyValidatorRegistry::wxPropertyValidatorRegistry(void):wxHashTable(wxKEY_STRING)
1054{
1055}
1056
1057wxPropertyValidatorRegistry::~wxPropertyValidatorRegistry(void)
1058{
1059 ClearRegistry();
1060}
1061
1062void wxPropertyValidatorRegistry::RegisterValidator(const wxString& typeName, wxPropertyValidator *validator)
1063{
87138c52 1064 Put((const wxChar*) typeName, validator);
e3a43801
JS
1065}
1066
1067wxPropertyValidator *wxPropertyValidatorRegistry::GetValidator(const wxString& typeName)
1068{
87138c52 1069 return (wxPropertyValidator *)Get((const wxChar*) typeName);
e3a43801
JS
1070}
1071
1072void wxPropertyValidatorRegistry::ClearRegistry(void)
1073{
1074 BeginFind();
1075 wxNode *node;
b21624e7 1076 while ((node = Next()) != NULL)
e3a43801
JS
1077 {
1078 delete (wxPropertyValidator *)node->Data();
1079 }
1080}
1081
1082 /*
1083 * Property validator
1084 */
1085
1086
1087IMPLEMENT_ABSTRACT_CLASS(wxPropertyValidator, wxEvtHandler)
1088
1089wxPropertyValidator::wxPropertyValidator(long flags)
1090{
1091 m_validatorFlags = flags;
1092 m_validatorProperty = NULL;
1093}
1094
1095wxPropertyValidator::~wxPropertyValidator(void)
1096{}
1097
87138c52 1098bool wxPropertyValidator::StringToFloat (wxChar *s, float *number) {
1e6feb95
VZ
1099 double num;
1100 bool ok = StringToDouble (s, &num);
1101 *number = (float) num;
1102 return ok;
e3a43801
JS
1103}
1104
87138c52 1105bool wxPropertyValidator::StringToDouble (wxChar *s, double *number) {
e3a43801 1106 bool ok = TRUE;
87138c52
OK
1107 wxChar *value_ptr;
1108 *number = wxStrtod (s, &value_ptr);
e3a43801 1109 if (value_ptr) {
1e6feb95
VZ
1110 int len = wxStrlen (value_ptr);
1111 for (int i = 0; i < len; i++) {
1112 ok = (wxIsspace (value_ptr[i]) != 0);
1113 if (!ok) return FALSE;
1114 }
e3a43801
JS
1115 }
1116 return ok;
1117}
1118
87138c52 1119bool wxPropertyValidator::StringToInt (wxChar *s, int *number) {
1e6feb95
VZ
1120 long num;
1121 bool ok = StringToLong (s, &num);
1122 *number = (int) num;
1123 return ok;
e3a43801
JS
1124}
1125
87138c52 1126bool wxPropertyValidator::StringToLong (wxChar *s, long *number) {
e3a43801 1127 bool ok = TRUE;
87138c52
OK
1128 wxChar *value_ptr;
1129 *number = wxStrtol (s, &value_ptr, 10);
e3a43801 1130 if (value_ptr) {
1e6feb95
VZ
1131 int len = wxStrlen (value_ptr);
1132 for (int i = 0; i < len; i++) {
1133 ok = (wxIsspace (value_ptr[i]) != 0);
1134 if (!ok) return FALSE;
1135 }
e3a43801
JS
1136 }
1137 return ok;
1138}
1139
87138c52 1140wxChar *wxPropertyValidator::FloatToString (float number) {
1e6feb95
VZ
1141 static wxChar buf[20];
1142 wxSprintf (buf, wxT("%.6g"), number);
1143 return buf;
e3a43801
JS
1144}
1145
87138c52 1146wxChar *wxPropertyValidator::DoubleToString (double number) {
1e6feb95
VZ
1147 static wxChar buf[20];
1148 wxSprintf (buf, wxT("%.6g"), number);
1149 return buf;
e3a43801
JS
1150}
1151
87138c52 1152wxChar *wxPropertyValidator::IntToString (int number) {
1e6feb95 1153 return ::IntToString (number);
e3a43801
JS
1154}
1155
87138c52 1156wxChar *wxPropertyValidator::LongToString (long number) {
1e6feb95 1157 return ::LongToString (number);
e3a43801 1158 }
1e6feb95
VZ
1159
1160#endif // wxUSE_PROPSHEET