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