]> git.saurik.com Git - wxWidgets.git/blame - src/common/valgen.cpp
DMC fix.
[wxWidgets.git] / src / common / valgen.cpp
CommitLineData
89c684ef
JS
1/////////////////////////////////////////////////////////////////////////////
2// Name: valgen.cpp
3// Purpose: wxGenericValidator class
4// Author: Kevin Smith
5// Modified by:
6// Created: Jan 22 1999
913df6f2 7// RCS-ID:
89c684ef 8// Copyright: (c) 1999 Kevin Smith
65571936 9// Licence: wxWindows licence
89c684ef
JS
10/////////////////////////////////////////////////////////////////////////////
11
14f355c2 12#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
89c684ef
JS
13#pragma implementation "valgen.h"
14#endif
15
16// For compilers that support precompilation, includes "wx.h".
17#include "wx/wxprec.h"
18
19#ifdef __BORLANDC__
ce4169a4 20 #pragma hdrstop
89c684ef
JS
21#endif
22
23#ifndef WX_PRECOMP
ce4169a4
RR
24 #include "wx/defs.h"
25#endif
26
27#if wxUSE_VALIDATORS
28
29#ifndef WX_PRECOMP
30 #include "wx/utils.h"
31 #include "wx/intl.h"
32 #include "wx/dynarray.h"
33 #include "wx/choice.h"
34 #include "wx/combobox.h"
35 #include "wx/radiobox.h"
36 #include "wx/radiobut.h"
37 #include "wx/checkbox.h"
38 #include "wx/scrolbar.h"
39 #include "wx/gauge.h"
40 #include "wx/stattext.h"
41 #include "wx/textctrl.h"
42 #include "wx/button.h"
43 #include "wx/listbox.h"
e90196a5 44 #include "wx/slider.h"
89c684ef
JS
45#endif
46
cab1a605 47
a55e0ebc 48 #include "wx/spinctrl.h"
4ded51f2 49
cab1a605 50#if wxUSE_SPINBTN
ce4169a4 51 #include "wx/spinbutt.h"
750b78ba 52#endif
cab1a605 53#if wxUSE_CHECKLISTBOX
a55e0ebc 54 #include "wx/checklst.h"
f6bcfd97 55#endif
89c684ef
JS
56
57#include "wx/valgen.h"
58
5cf69f76
JS
59IMPLEMENT_CLASS(wxGenericValidator, wxValidator)
60
89c684ef
JS
61wxGenericValidator::wxGenericValidator(bool *val)
62{
ce4169a4
RR
63 Initialize();
64 m_pBool = val;
89c684ef
JS
65}
66
67wxGenericValidator::wxGenericValidator(int *val)
68{
ce4169a4
RR
69 Initialize();
70 m_pInt = val;
89c684ef
JS
71}
72
73wxGenericValidator::wxGenericValidator(wxString *val)
74{
ce4169a4
RR
75 Initialize();
76 m_pString = val;
89c684ef
JS
77}
78
79wxGenericValidator::wxGenericValidator(wxArrayInt *val)
80{
ce4169a4
RR
81 Initialize();
82 m_pArrayInt = val;
89c684ef
JS
83}
84
85wxGenericValidator::wxGenericValidator(const wxGenericValidator& val)
d84afea9 86 : wxValidator()
89c684ef 87{
ce4169a4 88 Copy(val);
89c684ef
JS
89}
90
91bool wxGenericValidator::Copy(const wxGenericValidator& val)
92{
e90196a5 93 wxValidator::Copy(val);
89c684ef 94
e90196a5
RR
95 m_pBool = val.m_pBool;
96 m_pInt = val.m_pInt;
97 m_pString = val.m_pString;
98 m_pArrayInt = val.m_pArrayInt;
89c684ef 99
cab1a605 100 return true;
89c684ef
JS
101}
102
103wxGenericValidator::~wxGenericValidator()
104{
105}
106
107// Called to transfer data to the window
108bool wxGenericValidator::TransferToWindow(void)
109{
e90196a5 110 if ( !m_validatorWindow )
cab1a605 111 return false;
89c684ef 112
e90196a5 113 // bool controls
dcf924a3 114#if wxUSE_CHECKBOX
e90196a5 115 if (m_validatorWindow->IsKindOf(CLASSINFO(wxCheckBox)) )
89c684ef 116 {
e90196a5
RR
117 wxCheckBox* pControl = (wxCheckBox*) m_validatorWindow;
118 if (m_pBool)
3ca6a5f0
BP
119 {
120 pControl->SetValue(*m_pBool);
cab1a605 121 return true;
3ca6a5f0 122 }
e90196a5 123 } else
dcf924a3
RR
124#endif
125#if wxUSE_RADIOBTN
e90196a5 126 if (m_validatorWindow->IsKindOf(CLASSINFO(wxRadioButton)) )
89c684ef 127 {
e90196a5 128 wxRadioButton* pControl = (wxRadioButton*) m_validatorWindow;
3ca6a5f0
BP
129 if (m_pBool)
130 {
131 pControl->SetValue(*m_pBool) ;
cab1a605 132 return true;
3ca6a5f0 133 }
e90196a5 134 } else
dcf924a3 135#endif
e90196a5
RR
136
137 // int controls
dcf924a3 138#if wxUSE_GAUGE
e90196a5 139 if (m_validatorWindow->IsKindOf(CLASSINFO(wxGauge)) )
89c684ef 140 {
e90196a5 141 wxGauge* pControl = (wxGauge*) m_validatorWindow;
3ca6a5f0
BP
142 if (m_pInt)
143 {
144 pControl->SetValue(*m_pInt);
cab1a605 145 return true;
3ca6a5f0 146 }
e90196a5 147 } else
dcf924a3
RR
148#endif
149#if wxUSE_RADIOBOX
e90196a5 150 if (m_validatorWindow->IsKindOf(CLASSINFO(wxRadioBox)) )
89c684ef 151 {
e90196a5 152 wxRadioBox* pControl = (wxRadioBox*) m_validatorWindow;
3ca6a5f0
BP
153 if (m_pInt)
154 {
155 pControl->SetSelection(*m_pInt) ;
cab1a605 156 return true;
3ca6a5f0 157 }
e90196a5 158 } else
dcf924a3
RR
159#endif
160#if wxUSE_SCROLLBAR
e90196a5 161 if (m_validatorWindow->IsKindOf(CLASSINFO(wxScrollBar)) )
89c684ef 162 {
e90196a5 163 wxScrollBar* pControl = (wxScrollBar*) m_validatorWindow;
3ca6a5f0
BP
164 if (m_pInt)
165 {
166 pControl->SetThumbPosition(*m_pInt) ;
cab1a605 167 return true;
3ca6a5f0 168 }
e90196a5 169 } else
dcf924a3 170#endif
3a5bcc4d 171#if wxUSE_SPINCTRL && !defined(__WXMOTIF__)
a55e0ebc
JS
172 if (m_validatorWindow->IsKindOf(CLASSINFO(wxSpinCtrl)) )
173 {
174 wxSpinCtrl* pControl = (wxSpinCtrl*) m_validatorWindow;
175 if (m_pInt)
176 {
177 pControl->SetValue(*m_pInt);
cab1a605 178 return true;
a55e0ebc
JS
179 }
180 } else
181#endif
3a5bcc4d 182#if wxUSE_SPINBTN
e90196a5 183 if (m_validatorWindow->IsKindOf(CLASSINFO(wxSpinButton)) )
89c684ef 184 {
e90196a5 185 wxSpinButton* pControl = (wxSpinButton*) m_validatorWindow;
3ca6a5f0
BP
186 if (m_pInt)
187 {
188 pControl->SetValue(*m_pInt) ;
cab1a605 189 return true;
3ca6a5f0 190 }
e90196a5 191 } else
dcf924a3 192#endif
e90196a5
RR
193#if wxUSE_SLIDER
194 if (m_validatorWindow->IsKindOf(CLASSINFO(wxSlider)) )
195 {
196 wxSlider* pControl = (wxSlider*) m_validatorWindow;
197 if (m_pInt)
198 {
3ca6a5f0 199 pControl->SetValue(*m_pInt) ;
cab1a605 200 return true;
3ca6a5f0 201 }
e90196a5
RR
202 } else
203#endif
204
3ca6a5f0 205 // string controls
d7260478 206#if wxUSE_BUTTON
e90196a5 207 if (m_validatorWindow->IsKindOf(CLASSINFO(wxButton)) )
89c684ef 208 {
e90196a5 209 wxButton* pControl = (wxButton*) m_validatorWindow;
3ca6a5f0
BP
210 if (m_pString)
211 {
212 pControl->SetLabel(*m_pString) ;
cab1a605 213 return true;
3ca6a5f0 214 }
e90196a5 215 } else
d7260478 216#endif
e90196a5
RR
217#if wxUSE_COMBOBOX
218 if (m_validatorWindow->IsKindOf(CLASSINFO(wxComboBox)) )
89c684ef 219 {
e90196a5 220 wxComboBox* pControl = (wxComboBox*) m_validatorWindow;
f6bcfd97
BP
221 if (m_pInt)
222 {
223 pControl->SetSelection(*m_pInt) ;
cab1a605 224 return true;
f6bcfd97
BP
225 }
226 else if (m_pString)
227 {
cab1a605 228 if (pControl->FindString(* m_pString) != wxNOT_FOUND)
f6bcfd97
BP
229 {
230 pControl->SetStringSelection(* m_pString);
231 }
7cc3cec9
JS
232 else
233 {
234 pControl->SetValue(* m_pString);
235 }
cab1a605 236 return true;
f6bcfd97 237 }
e90196a5 238 } else
ce4169a4 239#endif
a55e0ebc
JS
240#if wxUSE_CHOICE
241 if (m_validatorWindow->IsKindOf(CLASSINFO(wxChoice)) )
f6bcfd97 242 {
a55e0ebc 243 wxChoice* pControl = (wxChoice*) m_validatorWindow;
f6bcfd97
BP
244 if (m_pInt)
245 {
246 pControl->SetSelection(*m_pInt) ;
cab1a605 247 return true;
f6bcfd97
BP
248 }
249 else if (m_pString)
250 {
cab1a605 251 if (pControl->FindString(* m_pString) != wxNOT_FOUND)
f6bcfd97
BP
252 {
253 pControl->SetStringSelection(* m_pString);
254 }
cab1a605 255 return true;
f6bcfd97
BP
256 }
257 } else
a55e0ebc 258#endif
e90196a5 259 if (m_validatorWindow->IsKindOf(CLASSINFO(wxStaticText)) )
89c684ef 260 {
e90196a5 261 wxStaticText* pControl = (wxStaticText*) m_validatorWindow;
f6bcfd97
BP
262 if (m_pString)
263 {
264 pControl->SetLabel(*m_pString) ;
cab1a605 265 return true;
f6bcfd97 266 }
3ca6a5f0 267 } else
d7260478 268#if wxUSE_TEXTCTRL
e90196a5 269 if (m_validatorWindow->IsKindOf(CLASSINFO(wxTextCtrl)) )
89c684ef 270 {
e90196a5 271 wxTextCtrl* pControl = (wxTextCtrl*) m_validatorWindow;
f6bcfd97
BP
272 if (m_pString)
273 {
274 pControl->SetValue(*m_pString) ;
cab1a605 275 return true;
f6bcfd97
BP
276 }
277 else if (m_pInt)
278 {
279 wxString str;
66b3ec7f 280 str.Printf(wxT("%d"), *m_pInt);
f6bcfd97 281 pControl->SetValue(str);
cab1a605 282 return true;
f6bcfd97 283 }
e90196a5 284 } else
d7260478 285#endif
1e6feb95 286 // array controls
3a5bcc4d 287#if wxUSE_CHECKLISTBOX
1e6feb95
VZ
288 // NOTE: wxCheckListBox is a wxListBox, so wxCheckListBox MUST come first:
289 if (m_validatorWindow->IsKindOf(CLASSINFO(wxCheckListBox)) )
89c684ef 290 {
1e6feb95
VZ
291 wxCheckListBox* pControl = (wxCheckListBox*) m_validatorWindow;
292 if (m_pArrayInt)
293 {
294 // clear all selections
295 size_t i,
296 count = pControl->GetCount();
297 for ( i = 0 ; i < count; i++ )
cab1a605 298 pControl->Check(i, false);
1e6feb95
VZ
299
300 // select each item in our array
301 count = m_pArrayInt->GetCount();
302 for ( i = 0 ; i < count; i++ )
303 pControl->Check(m_pArrayInt->Item(i));
304
cab1a605 305 return true;
1e6feb95 306 }
3ca6a5f0 307 else
cab1a605 308 return false;
1e6feb95 309 } else
750b78ba 310#endif
dcf924a3 311#if wxUSE_LISTBOX
e90196a5 312 if (m_validatorWindow->IsKindOf(CLASSINFO(wxListBox)) )
89c684ef 313 {
e90196a5 314 wxListBox* pControl = (wxListBox*) m_validatorWindow;
3ca6a5f0
BP
315 if (m_pArrayInt)
316 {
317 // clear all selections
1e6feb95
VZ
318 size_t i,
319 count = pControl->GetCount();
320 for ( i = 0 ; i < count; i++ )
3ca6a5f0 321 pControl->Deselect(i);
1e6feb95 322
3ca6a5f0 323 // select each item in our array
1e6feb95
VZ
324 count = m_pArrayInt->GetCount();
325 for ( i = 0 ; i < count; i++ )
326 pControl->SetSelection(m_pArrayInt->Item(i));
327
cab1a605 328 return true;
3ca6a5f0 329 }
e90196a5 330 } else
dcf924a3 331#endif
3ca6a5f0 332 ; // to match the last 'else' above
89c684ef
JS
333
334 // unrecognized control, or bad pointer
cab1a605 335 return false;
89c684ef
JS
336}
337
e90196a5 338// Called to transfer data from the window
89c684ef
JS
339bool wxGenericValidator::TransferFromWindow(void)
340{
341 if ( !m_validatorWindow )
cab1a605 342 return false;
89c684ef
JS
343
344 // bool controls
dcf924a3 345#if wxUSE_CHECKBOX
89c684ef
JS
346 if (m_validatorWindow->IsKindOf(CLASSINFO(wxCheckBox)) )
347 {
348 wxCheckBox* pControl = (wxCheckBox*) m_validatorWindow;
3ca6a5f0 349 if (m_pBool)
89c684ef
JS
350 {
351 *m_pBool = pControl->GetValue() ;
cab1a605 352 return true;
89c684ef 353 }
913df6f2 354 } else
dcf924a3
RR
355#endif
356#if wxUSE_RADIOBTN
357 if (m_validatorWindow->IsKindOf(CLASSINFO(wxRadioButton)) )
89c684ef
JS
358 {
359 wxRadioButton* pControl = (wxRadioButton*) m_validatorWindow;
3ca6a5f0 360 if (m_pBool)
89c684ef
JS
361 {
362 *m_pBool = pControl->GetValue() ;
cab1a605 363 return true;
89c684ef 364 }
dcf924a3
RR
365 } else
366#endif
89c684ef 367 // int controls
dcf924a3
RR
368#if wxUSE_GAUGE
369 if (m_validatorWindow->IsKindOf(CLASSINFO(wxGauge)) )
89c684ef
JS
370 {
371 wxGauge* pControl = (wxGauge*) m_validatorWindow;
3ca6a5f0 372 if (m_pInt)
89c684ef
JS
373 {
374 *m_pInt = pControl->GetValue() ;
cab1a605 375 return true;
89c684ef 376 }
913df6f2 377 } else
dcf924a3
RR
378#endif
379#if wxUSE_RADIOBOX
380 if (m_validatorWindow->IsKindOf(CLASSINFO(wxRadioBox)) )
89c684ef
JS
381 {
382 wxRadioBox* pControl = (wxRadioBox*) m_validatorWindow;
3ca6a5f0 383 if (m_pInt)
89c684ef
JS
384 {
385 *m_pInt = pControl->GetSelection() ;
cab1a605 386 return true;
89c684ef 387 }
913df6f2 388 } else
dcf924a3
RR
389#endif
390#if wxUSE_SCROLLBAR
391 if (m_validatorWindow->IsKindOf(CLASSINFO(wxScrollBar)) )
89c684ef
JS
392 {
393 wxScrollBar* pControl = (wxScrollBar*) m_validatorWindow;
3ca6a5f0 394 if (m_pInt)
89c684ef
JS
395 {
396 *m_pInt = pControl->GetThumbPosition() ;
cab1a605 397 return true;
89c684ef 398 }
dcf924a3
RR
399 } else
400#endif
3a5bcc4d 401#if wxUSE_SPINCTRL && !defined(__WXMOTIF__)
a55e0ebc
JS
402 if (m_validatorWindow->IsKindOf(CLASSINFO(wxSpinCtrl)) )
403 {
404 wxSpinCtrl* pControl = (wxSpinCtrl*) m_validatorWindow;
405 if (m_pInt)
406 {
407 *m_pInt=pControl->GetValue();
cab1a605 408 return true;
a55e0ebc
JS
409 }
410 } else
411#endif
3a5bcc4d 412#if wxUSE_SPINBTN
dcf924a3 413 if (m_validatorWindow->IsKindOf(CLASSINFO(wxSpinButton)) )
89c684ef
JS
414 {
415 wxSpinButton* pControl = (wxSpinButton*) m_validatorWindow;
3ca6a5f0 416 if (m_pInt)
89c684ef
JS
417 {
418 *m_pInt = pControl->GetValue() ;
cab1a605 419 return true;
89c684ef 420 }
dcf924a3
RR
421 } else
422#endif
e90196a5
RR
423#if wxUSE_SLIDER
424 if (m_validatorWindow->IsKindOf(CLASSINFO(wxSlider)) )
425 {
426 wxSlider* pControl = (wxSlider*) m_validatorWindow;
427 if (m_pInt)
428 {
ca36c2cc 429 *m_pInt = pControl->GetValue() ;
cab1a605 430 return true;
e90196a5
RR
431 }
432 } else
750b78ba 433#endif
89c684ef 434 // string controls
d7260478 435#if wxUSE_BUTTON
dcf924a3 436 if (m_validatorWindow->IsKindOf(CLASSINFO(wxButton)) )
89c684ef
JS
437 {
438 wxButton* pControl = (wxButton*) m_validatorWindow;
3ca6a5f0 439 if (m_pString)
89c684ef
JS
440 {
441 *m_pString = pControl->GetLabel() ;
cab1a605 442 return true;
89c684ef 443 }
d7260478
JS
444 } else
445#endif
dcf924a3
RR
446#if wxUSE_COMBOBOX
447 if (m_validatorWindow->IsKindOf(CLASSINFO(wxComboBox)) )
89c684ef
JS
448 {
449 wxComboBox* pControl = (wxComboBox*) m_validatorWindow;
3ca6a5f0 450 if (m_pInt)
89c684ef 451 {
3ca6a5f0 452 *m_pInt = pControl->GetSelection() ;
cab1a605 453 return true;
89c684ef 454 }
f6bcfd97
BP
455 else if (m_pString)
456 {
d491523b 457 *m_pString = pControl->GetValue();
cab1a605 458 return true;
f6bcfd97 459 }
913df6f2 460 } else
dcf924a3 461#endif
ce4169a4 462#if wxUSE_CHOICE
dcf924a3 463 if (m_validatorWindow->IsKindOf(CLASSINFO(wxChoice)) )
89c684ef
JS
464 {
465 wxChoice* pControl = (wxChoice*) m_validatorWindow;
3ca6a5f0 466 if (m_pInt)
89c684ef
JS
467 {
468 *m_pInt = pControl->GetSelection() ;
cab1a605 469 return true;
89c684ef 470 }
f6bcfd97
BP
471 else if (m_pString)
472 {
473 *m_pString = pControl->GetStringSelection();
cab1a605 474 return true;
f6bcfd97 475 }
913df6f2 476 } else
ce4169a4 477#endif
dcf924a3 478 if (m_validatorWindow->IsKindOf(CLASSINFO(wxStaticText)) )
89c684ef
JS
479 {
480 wxStaticText* pControl = (wxStaticText*) m_validatorWindow;
3ca6a5f0 481 if (m_pString)
89c684ef
JS
482 {
483 *m_pString = pControl->GetLabel() ;
cab1a605 484 return true;
89c684ef 485 }
913df6f2 486 } else
d7260478 487#if wxUSE_TEXTCTRL
dcf924a3 488 if (m_validatorWindow->IsKindOf(CLASSINFO(wxTextCtrl)) )
89c684ef
JS
489 {
490 wxTextCtrl* pControl = (wxTextCtrl*) m_validatorWindow;
3ca6a5f0 491 if (m_pString)
89c684ef
JS
492 {
493 *m_pString = pControl->GetValue() ;
cab1a605 494 return true;
89c684ef 495 }
f6bcfd97
BP
496 else if (m_pInt)
497 {
66b3ec7f 498 *m_pInt = wxAtoi(pControl->GetValue());
cab1a605 499 return true;
f6bcfd97 500 }
dcf924a3 501 } else
d7260478 502#endif
1e6feb95 503 // array controls
e90196a5 504#if wxUSE_CHECKLISTBOX
1e6feb95 505 // NOTE: wxCheckListBox isa wxListBox, so wxCheckListBox MUST come first:
dcf924a3 506 if (m_validatorWindow->IsKindOf(CLASSINFO(wxCheckListBox)) )
89c684ef
JS
507 {
508 wxCheckListBox* pControl = (wxCheckListBox*) m_validatorWindow;
1e6feb95 509 if (m_pArrayInt)
89c684ef
JS
510 {
511 // clear our array
512 m_pArrayInt->Clear();
1e6feb95 513
89c684ef 514 // add each selected item to our array
1e6feb95
VZ
515 size_t i,
516 count = pControl->GetCount();
517 for ( i = 0; i < count; i++ )
518 {
89c684ef
JS
519 if (pControl->IsChecked(i))
520 m_pArrayInt->Add(i);
1e6feb95
VZ
521 }
522
cab1a605 523 return true;
89c684ef 524 }
1e6feb95 525 else
cab1a605 526 return false;
dcf924a3
RR
527 } else
528#endif
dcf924a3
RR
529#if wxUSE_LISTBOX
530 if (m_validatorWindow->IsKindOf(CLASSINFO(wxListBox)) )
89c684ef
JS
531 {
532 wxListBox* pControl = (wxListBox*) m_validatorWindow;
3ca6a5f0 533 if (m_pArrayInt)
89c684ef
JS
534 {
535 // clear our array
536 m_pArrayInt->Clear();
1e6feb95 537
89c684ef 538 // add each selected item to our array
1e6feb95
VZ
539 size_t i,
540 count = pControl->GetCount();
541 for ( i = 0; i < count; i++ )
542 {
89c684ef
JS
543 if (pControl->Selected(i))
544 m_pArrayInt->Add(i);
1e6feb95
VZ
545 }
546
cab1a605 547 return true;
89c684ef 548 }
dcf924a3
RR
549 } else
550#endif
89c684ef
JS
551
552 // unrecognized control, or bad pointer
cab1a605
WS
553 return false;
554 return false;
89c684ef
JS
555}
556
557/*
558 Called by constructors to initialize ALL data members
559*/
560void wxGenericValidator::Initialize()
561{
ce4169a4
RR
562 m_pBool = 0;
563 m_pInt = 0;
564 m_pString = 0;
565 m_pArrayInt = 0;
89c684ef
JS
566}
567
ce4169a4
RR
568#endif
569 // wxUSE_VALIDATORS
913df6f2 570