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