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