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