]> git.saurik.com Git - wxWidgets.git/blob - docs/doxygen/overviews/validator.h
mention the problem with writing enums to wxConfig (see #8656)
[wxWidgets.git] / docs / doxygen / overviews / validator.h
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: validator.h
3 // Purpose: topic overview
4 // Author: wxWidgets team
5 // RCS-ID: $Id$
6 // Licence: wxWindows license
7 /////////////////////////////////////////////////////////////////////////////
8
9 /**
10
11 @page overview_validator wxValidator Overview
12
13 Classes: wxValidator, wxTextValidator, wxGenericValidator
14
15 The aim of the validator concept is to make dialogs very much easier to write.
16 A validator is an object that can be plugged into a control (such as a
17 wxTextCtrl), and mediates between C++ data and the control, transferring the
18 data in either direction and validating it. It also is able to intercept events
19 generated by the control, providing filtering behaviour without the need to
20 derive a new control class.
21
22 You can use a stock validator, such as wxTextValidator (which does text control
23 data transfer, validation and filtering) and wxGenericValidator (which does
24 data transfer for a range of controls); or you can write your own.
25
26
27 @li @ref overview_validator_example
28 @li @ref overview_validator_anatomy
29 @li @ref overview_validator_dialogs
30
31
32 <hr>
33
34
35 @section overview_validator_example Example
36
37 Here is an example of wxTextValidator usage.
38
39 @code
40 wxTextCtrl *txt1 = new wxTextCtrl(
41 this, -1, wxT(""), wxPoint(10, 10), wxSize(100, 80), 0,
42 wxTextValidator(wxFILTER_ALPHA, &g_data.m_string));
43 @endcode
44
45 In this example, the text validator object provides the following
46 functionality:
47
48 @li It transfers the value of g_data.m_string (a wxString variable) to the
49 wxTextCtrl when the dialog is initialised.
50 @li It transfers the wxTextCtrl data back to this variable when the dialog is
51 dismissed.
52 @li It filters input characters so that only alphabetic characters are allowed.
53
54 The validation and filtering of input is accomplished in two ways. When a
55 character is input, wxTextValidator checks the character against the allowed
56 filter flag (wxFILTER_ALPHA in this case). If the character is inappropriate,
57 it is vetoed (does not appear) and a warning beep sounds. The second type of
58 validation is performed when the dialog is about to be dismissed, so if the
59 default string contained invalid characters already, a dialog box is shown
60 giving the error, and the dialog is not dismissed.
61
62
63 @section overview_validator_anatomy Anatomy of a Validator
64
65 A programmer creating a new validator class should provide the following
66 functionality.
67
68 A validator constructor is responsible for allowing the programmer to specify
69 the kind of validation required, and perhaps a pointer to a C++ variable that
70 is used for storing the data for the control. If such a variable address is not
71 supplied by the user, then the validator should store the data internally.
72
73 The wxValidator::Validate member function should return @true if the data in
74 the control (not the C++ variable) is valid. It should also show an appropriate
75 message if data was not valid.
76
77 The wxValidator::TransferToWindow member function should transfer the data from
78 the validator or associated C++ variable to the control.
79
80 The wxValidator::TransferFromWindow member function should transfer the data
81 from the control to the validator or associated C++ variable.
82
83 There should be a copy constructor, and a wxValidator::Clone function which
84 returns a copy of the validator object. This is important because validators
85 are passed by reference to window constructors, and must therefore be cloned
86 internally.
87
88 You can optionally define event handlers for the validator, to implement
89 filtering. These handlers will capture events before the control itself does.
90 For an example implementation, see the valtext.h and valtext.cpp files in the
91 wxWidgets library.
92
93
94 @section overview_validator_dialogs How Validators Interact with Dialogs
95
96 For validators to work correctly, validator functions must be called at the
97 right times during dialog initialisation and dismissal.
98
99 When a wxDialog::Show is called (for a modeless dialog) or wxDialog::ShowModal
100 is called (for a modal dialog), the function wxWindow::InitDialog is
101 automatically called. This in turn sends an initialisation event to the dialog.
102 The default handler for the wxEVT_INIT_DIALOG event is defined in the wxWindow
103 class to simply call the function wxWindow::TransferDataToWindow. This function
104 finds all the validators in the window's children and calls the
105 TransferToWindow function for each. Thus, data is transferred from C++
106 variables to the dialog just as the dialog is being shown.
107
108 @note If you are using a window or panel instead of a dialog, you will need to
109 call wxWindow::InitDialog explicitly before showing the window.
110
111 When the user clicks on a button, for example the OK button, the application
112 should first call wxWindow::Validate, which returns @false if any of the child
113 window validators failed to validate the window data. The button handler should
114 return immediately if validation failed. Secondly, the application should call
115 wxWindow::TransferDataFromWindow and return if this failed. It is then safe to
116 end the dialog by calling EndModal (if modal) or Show (if modeless).
117
118 In fact, wxDialog contains a default command event handler for the wxID_OK
119 button. It goes like this:
120
121 @code
122 void wxDialog::OnOK(wxCommandEvent& event)
123 {
124 if ( Validate() && TransferDataFromWindow() )
125 {
126 if ( IsModal() )
127 EndModal(wxID_OK);
128 else
129 {
130 SetReturnCode(wxID_OK);
131 this->Show(false);
132 }
133 }
134 }
135 @endcode
136
137 So if using validators and a normal OK button, you may not even need to write
138 any code for handling dialog dismissal.
139
140 If you load your dialog from a resource file, you will need to iterate through
141 the controls setting validators, since validators can't be specified in a
142 dialog resource.
143
144 */
145