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