]> git.saurik.com Git - wxWidgets.git/blame_incremental - docs/latex/wx/proplist.tex
Some work on GTK focus handling and events.
[wxWidgets.git] / docs / latex / wx / proplist.tex
... / ...
CommitLineData
1\chapter{Property sheet classes}\label{proplist}
2
3\section{Introduction}\label{proplistintro}
4
5The Property Sheet Classes help the programmer to specify complex dialogs and
6their relationship with their associated data. By specifying data as a
7wxPropertySheet containing wxProperty objects, the programmer can use
8a range of available or custom wxPropertyView classes to allow the user to
9edit this data. Classes derived from wxPropertyView act as mediators between the
10wxPropertySheet and the actual window (and associated panel items).
11
12For example, the wxPropertyListView is a kind of wxPropertyView which displays
13data in a Visual Basic-style property list (see \helpref{the next section}{proplistappearance} for
14screen shots). This is a listbox containing names and values, with
15an edit control and other optional controls via which the user edits the selected
16data item.
17
18wxPropertyFormView is another kind of wxPropertyView which mediates between
19the data and a panel or dialog box which has already been created. This makes it a contender for
20the replacement of wxForm, since programmer-controlled layout is going to be much more
21satisfactory. If automatic layout is desired, then wxPropertyListView could be used instead.
22
23The main intention of this class library was to provide property {\it list} behaviour, but
24it has been generalised as much as possible so that the concept of a property sheet and its viewers
25can reduce programming effort in a range of user interface tasks.
26
27For further details on the classes and how they are used, please see \helpref{Property classes overview}{proplistpropertyoverview}.
28
29\subsection{The appearance and behaviour of a property list view}\label{proplistappearance}
30
31The property list, as seen in an increasing number of development tools
32such as Visual Basic and Delphi, is a convenient and compact method for
33displaying and editing a number of items without the need for one
34control per item, and without the need for designing a special form. The
35controls are as follows:
36
37\begin{itemize}\itemsep=0pt
38\item A listbox showing the properties and their current values, which has double-click
39properties dependent on the nature of the current property;
40\item a text editing area at the top of the display, allowing the user to edit
41the currently selected property if appropriate;
42\item `confirm' and `cancel' buttons to confirm or cancel an edit (for the property, not the
43whole sheet);
44\item an optional list that appears when the user can make a choice from several known possible values;
45\item a small Edit button to invoke `detailed editing' (perhaps showing or hiding the above value list, or
46maybe invoking a common dialog);
47\item optional OK/Close, Cancel and Help buttons for the whole dialog.
48\end{itemize}
49
50The concept of `detailed editing' versus quick editing gives the user a choice
51of editing mode, so novice and expert behaviour can be catered for, or the user can just
52use what he feels comfortable with.
53
54Behaviour alters depending on the kind of property being edited. For example, a boolean value has
55the following behaviour:
56
57\begin{itemize}\itemsep=0pt
58\item Double-clicking on the item toggles between TRUE and FALSE.
59\item Showing the value list enables the user to select TRUE or FALSE.
60\item The user may be able to type in the word TRUE or FALSE, or the edit control
61may be read-only to disallow this since it is error-prone.
62\end{itemize}
63
64A list of strings may pop up a dialog for editing them, a simple string just allows text editing,
65double-clicking a colour property may show a colour selector, double-clicking on a filename property may
66show a file selector (in addition to being able to type in the name in the edit control), etc.
67
68Note that the `type' of property, such as string or integer, does not
69necessarily determine the behaviour of the property. The programmer has
70to be able to specify different behaviours for the same type, depending
71on the meaning of the property. For example, a colour and a filename may
72both be strings, but their editing behaviour should be different. This
73is why objects of type wxPropertyValidator need to be used, to define
74behaviour for a given class of properties or even specific property
75name. Objects of class wxPropertyView contain a list of property
76registries, which enable reuse of bunches of these validators in
77different circumstances. Or a wxProperty can be explicitly set to use a
78particular validator object.
79
80The following screen shot of the property classes test program shows the
81user editing a string, which is constrained to be one of three possible
82values.
83
84\helponly{\image{}{prop1.bmp}}
85
86The second picture shows the user having entered a integer that
87was outside the range specified to the validator. Note that in this picture,
88the value list is hidden because it is not used when editing an integer.
89
90\helponly{\image{}{prop2.bmp}}
91
92\section{Headers}\label{proplistfiles}
93
94The property class library comprises the following files:
95
96\begin{itemize}\itemsep=0pt
97\item prop.h: base property class header
98\item proplist.h: wxPropertyListView and associated classes
99\item propform.h: wxPropertyListView and associated classes
100\end{itemize}
101
102\section{Topic overviews}\label{proplistoverviews}
103
104This chapter contains a selection of topic overviews.
105
106\subsection{Property classes overview}\label{proplistpropertyoverview}
107
108The property classes help a programmer to express relationships between
109data and physical windows, in particular:
110
111\begin{itemize}\itemsep=0pt
112\item the transfer of data to and from the physical controls;
113\item the behaviour of various controls and custom windows for particular
114types of data;
115\item the validation of data, notifying the user when incorrect data is entered,
116or even better, constraining the input so only valid data can be entered.
117\end{itemize}
118
119With a consistent framework, the programmer should be able to use existing
120components and design new ones in a principled manner, to solve many data entry
121requirements.
122
123Each datum is represented in a \helpref{wxProperty}{wxproperty}, which has a name and a value.
124Various C++ types are permitted in the value of a property, and the property can store a pointer
125to the data instead of a copy of the data. A \helpref{wxPropertySheet}{wxpropertysheet} represents a number of these properties.
126
127These two classes are independent from the way in which the data is visually manipulated. To
128mediate between property sheets and windows, the abstract class \helpref{wxPropertyView}{wxpropertyview} is
129available for programmers to derive new kinds of view. One kind of view that is available is the \helpref{wxPropertyListView}{wxpropertylistview},
130which displays the data in a Visual Basic-style list, with a small number of controls for editing
131the currently selected property. Another is \helpref{wxPropertyFormView}{wxpropertyformview} which
132mediates between an existing dialog or panel and the property sheet.
133
134The hard work of mediation is actually performed by validators, which are instances of classes
135derived from \helpref{wxPropertyValidator}{wxpropertyvalidator}. A validator is associated with
136a particular property and is responsible for
137responding to user interface events, and displaying, updating and checking the property value.
138Because a validator's behaviour depends largely on the kind of view being used, there has to be
139a separate hierarchy of validators for each class of view. So for wxPropertyListView, there is
140an abstract class \helpref{wxPropertyListValidator}{wxpropertylistvalidator} from which concrete
141classes are derived, such as \helpref{wxRealListValidator}{wxreallistvalidator} and
142\rtfsp\helpref{wxStringListValidator}{wxstringlistvalidator}.
143
144A validator can be explicitly set for a property, so there is no doubt which validator
145should be used to edit that property. However, it is also possible to define a registry
146of validators, and have the validator chosen on the basis of the {\it role} of the property.
147So a property with a ``filename" role would match the ``filename" validator, which pops
148up a file selector when the user double clicks on the property.
149
150You don't have to define your own frame or window classes: there are some predefined
151that will work with the property list view. See \helpref{Window classes}{proplistwindowclasses} for
152further details.
153
154\subsubsection{Example 1: Property list view}
155
156The following code fragment shows the essentials of creating a registry of
157standard validators, a property sheet containing some properties, and
158a property list view and dialog or frame. RegisterValidators will be
159called on program start, and PropertySheetTest is called in response to a
160menu command.
161
162Note how some properties are created with an explicit reference to
163a validator, and others are provided with a ``role'' which can be matched
164against a validator in the registry.
165
166The interface generated by this test program is shown in the section \helpref{Appearance and
167behaviour of a property list view}{proplistappearance}.
168
169\begin{verbatim}
170void RegisterValidators(void)
171{
172 myListValidatorRegistry.RegisterValidator((wxString)"real", new wxRealListValidator);
173 myListValidatorRegistry.RegisterValidator((wxString)"string", new wxStringListValidator);
174 myListValidatorRegistry.RegisterValidator((wxString)"integer", new wxIntegerListValidator);
175 myListValidatorRegistry.RegisterValidator((wxString)"bool", new wxBoolListValidator);
176}
177
178void PropertyListTest(Bool useDialog)
179{
180 wxPropertySheet *sheet = new wxPropertySheet;
181
182 sheet->AddProperty(new wxProperty("fred", 1.0, "real"));
183 sheet->AddProperty(new wxProperty("tough choice", (Bool)TRUE, "bool"));
184 sheet->AddProperty(new wxProperty("ian", (long)45, "integer", new wxIntegerListValidator(-50, 50)));
185 sheet->AddProperty(new wxProperty("bill", 25.0, "real", new wxRealListValidator(0.0, 100.0)));
186 sheet->AddProperty(new wxProperty("julian", "one", "string"));
187 sheet->AddProperty(new wxProperty("bitmap", "none", "string", new wxFilenameListValidator("Select a bitmap file", "*.bmp")));
188 wxStringList *strings = new wxStringList("one", "two", "three", NULL);
189 sheet->AddProperty(new wxProperty("constrained", "one", "string", new wxStringListValidator(strings)));
190
191 wxPropertyListView *view =
192 new wxPropertyListView(NULL,
193 wxPROP_BUTTON_CHECK_CROSS|wxPROP_DYNAMIC_VALUE_FIELD|wxPROP_PULLDOWN);
194
195 wxDialogBox *propDialog = NULL;
196 wxPropertyListFrame *propFrame = NULL;
197 if (useDialog)
198 {
199 propDialog = new wxPropertyListDialog(view, NULL, "Property Sheet Test", TRUE, -1, -1, 400, 500);
200 }
201 else
202 {
203 propFrame = new wxPropertyListFrame(view, NULL, "Property Sheet Test", -1, -1, 400, 500);
204 }
205
206 view->AddRegistry(&myListValidatorRegistry);
207
208 if (useDialog)
209 {
210 view->ShowView(sheet, propDialog);
211 propDialog->Centre(wxBOTH);
212 propDialog->Show(TRUE);
213 }
214 else
215 {
216 propFrame->Initialize();
217 view->ShowView(sheet, propFrame->GetPropertyPanel());
218 propFrame->Centre(wxBOTH);
219 propFrame->Show(TRUE);
220 }
221}
222\end{verbatim}
223
224\subsubsection{Example 2: Property form view}
225
226This example is similar to Example 1, but uses a property form view to
227edit a property sheet using a predefined dialog box.
228
229\begin{verbatim}
230void RegisterValidators(void)
231{
232 myFormValidatorRegistry.RegisterValidator((wxString)"real", new wxRealFormValidator);
233 myFormValidatorRegistry.RegisterValidator((wxString)"string", new wxStringFormValidator);
234 myFormValidatorRegistry.RegisterValidator((wxString)"integer", new wxIntegerFormValidator);
235 myFormValidatorRegistry.RegisterValidator((wxString)"bool", new wxBoolFormValidator);
236}
237
238void PropertyFormTest(Bool useDialog)
239{
240 wxPropertySheet *sheet = new wxPropertySheet;
241
242 sheet->AddProperty(new wxProperty("fred", 25.0, "real", new wxRealFormValidator(0.0, 100.0)));
243 sheet->AddProperty(new wxProperty("tough choice", (Bool)TRUE, "bool"));
244 sheet->AddProperty(new wxProperty("ian", (long)45, "integer", new wxIntegerFormValidator(-50, 50)));
245 sheet->AddProperty(new wxProperty("julian", "one", "string"));
246 wxStringList *strings = new wxStringList("one", "two", "three", NULL);
247 sheet->AddProperty(new wxProperty("constrained", "one", "string", new wxStringFormValidator(strings)));
248
249 wxPropertyFormView *view = new wxPropertyFormView(NULL);
250
251 wxDialogBox *propDialog = NULL;
252 wxPropertyFormFrame *propFrame = NULL;
253 if (useDialog)
254 {
255 propDialog = new wxPropertyFormDialog(view, NULL, "Property Form Test", TRUE, -1, -1, 400, 300);
256 }
257 else
258 {
259 propFrame = new wxPropertyFormFrame(view, NULL, "Property Form Test", -1, -1, 400, 300);
260 propFrame->Initialize();
261 }
262
263 wxPanel *panel = propDialog ? propDialog : propFrame->GetPropertyPanel();
264 panel->SetLabelPosition(wxVERTICAL);
265
266 // Add items to the panel
267
268 (void) new wxButton(panel, (wxFunction)NULL, "OK", -1, -1, -1, -1, 0, "ok");
269 (void) new wxButton(panel, (wxFunction)NULL, "Cancel", -1, -1, 80, -1, 0, "cancel");
270 (void) new wxButton(panel, (wxFunction)NULL, "Update", -1, -1, 80, -1, 0, "update");
271 (void) new wxButton(panel, (wxFunction)NULL, "Revert", -1, -1, -1, -1, 0, "revert");
272 panel->NewLine();
273
274 // The name of this text item matches the "fred" property
275 (void) new wxText(panel, (wxFunction)NULL, "Fred", "", -1, -1, 90, -1, 0, "fred");
276 (void) new wxCheckBox(panel, (wxFunction)NULL, "Yes or no", -1, -1, -1, -1, 0, "tough choice");
277 (void) new wxSlider(panel, (wxFunction)NULL, "Sliding scale", 0, -50, 50, 100, -1, -1, wxHORIZONTAL, "ian");
278 panel->NewLine();
279 (void) new wxListBox(panel, (wxFunction)NULL, "Constrained", wxSINGLE, -1, -1, 100, 90, 0, NULL, 0, "constrained");
280
281 view->AddRegistry(&myFormValidatorRegistry);
282
283 if (useDialog)
284 {
285 view->ShowView(sheet, propDialog);
286 view->AssociateNames();
287 view->TransferToDialog();
288 propDialog->Centre(wxBOTH);
289 propDialog->Show(TRUE);
290 }
291 else
292 {
293 view->ShowView(sheet, propFrame->GetPropertyPanel());
294 view->AssociateNames();
295 view->TransferToDialog();
296 propFrame->Centre(wxBOTH);
297 propFrame->Show(TRUE);
298 }
299}
300\end{verbatim}
301
302\subsection{Validator classes overview}\label{proplistvalidatoroverview}
303
304Classes: \helpref{Validator classes}{proplistvalidatorclasses}
305
306The validator classes provide functionality for mediating between a wxProperty and
307the actual display. There is a separate family of validator classes for each
308class of view, since the differences in user interface for these views implies
309that little common functionality can be shared amongst validators.
310
311
312
313\subsubsection{wxPropertyValidator overview}\label{wxpropertyvalidatoroverview}
314
315Class: \helpref{wxPropertyValidator}{wxpropertyvalidator}
316
317This class is the root of all property validator classes. It contains a small
318amount of common functionality, including functions to convert between
319strings and C++ values.
320
321A validator is notionally an object which sits between a property and its displayed
322value, and checks that the value the user enters is correct, giving an error message
323if the validation fails. In fact, the validator does more than that, and is akin to
324a view class but at a finer level of detail. It is also responsible for
325loading the dialog box control with the value from the property, putting it back
326into the property, preparing special controls for editing the value, and
327may even invoke special dialogs for editing the value in a convenient way.
328
329In a property list dialog, there is quite a lot of scope for supplying custom dialogs,
330such as file or colour selectors. For a form dialog, there is less scope because
331there is no concept of `detailed editing' of a value: one control is associated with
332one property, and there is no provision for invoking further dialogs. The reader
333may like to work out how the form view could be extended to provide some of the
334functionality of the property list!
335
336Validator objects may be associated explicitly with a wxProperty, or they may be
337indirectly associated by virtue of a property `kind' that matches validators having
338that kind. In the latter case, such validators are stored in a validator registry
339which is passed to the view before the dialog is shown. If the validator takes
340arguments, such as minimum and maximum values in the case of a wxIntegerListValidator,
341then the validator must be associated explicitly with the property. The validator
342will be deleted when the property is deleted.
343
344\subsubsection{wxPropertyListValidator overview}\label{wxpropertylistvalidatoroverview}
345
346Class: \helpref{wxPropertyListValidator}{wxpropertylistvalidator}
347
348This class is the abstract base class for property list view validators.
349The list view acts upon a user interface containing a list of properties,
350a text item for direct property value editing, confirm/cancel buttons for the value,
351a pulldown list for making a choice between values, and OK/Cancel/Help buttons
352for the dialog (see \helpref{property list appearance}{proplistappearance}).
353
354By overriding virtual functions, the programmer can create custom
355behaviour for different kinds of property. Custom behaviour can use just the
356available controls on the property list dialog, or the validator can
357invoke custom editors with quite different controls, which pop up in
358`detailed editing' mode.
359
360See the detailed class documentation for the members you should override
361to give your validator appropriate behaviour.
362
363\subsubsection{wxPropertyFormValidator overview}\label{wxpropertyformvalidatoroverview}
364
365This class is the abstract base class for property form view validators.
366The form view acts upon an existing dialog box or panel, where either the
367panel item names correspond to property names, or the programmer has explicitly
368associated the panel item with the property.
369
370By overriding virtual functions, the programmer determines how
371values are displayed or retrieved, and the checking that the validator does.
372
373See the detailed class documentation for the members you should override
374to give your validator appropriate behaviour.
375
376\subsection{View classes overview}\label{proplistviewoverview}
377
378Classes: \helpref{View classes}{proplistviewclasses}
379
380An instance of a view class relates a property sheet with an actual window.
381Currently, there are two classes of view: wxPropertyListView and wxPropertyFormView.
382
383\subsubsection{wxPropertyView overview}\label{wxpropertyviewoverview}
384
385Class: \helpref{wxPropertyView}{wxpropertyview}
386
387This is the abstract base class for property views.
388
389\subsubsection{wxPropertyListView overview}\label{wxpropertylistviewoverview}
390
391Class: \helpref{wxPropertyListView}{wxpropertylistview}
392
393The property list view defines the relationship between a property sheet and
394a property list dialog or panel. It manages user interface events such as
395clicking on a property, pressing return in the text edit field, and clicking
396on Confirm or Cancel. These events cause member functions of the
397class to be called, and these in turn may call member functions of
398the appropriate validator to be called, to prepare controls, check the property value,
399invoke detailed editing, etc.
400
401\subsubsection{wxPropertyFormView overview}\label{wxpropertyformviewoverview}
402
403Class: \helpref{wxPropertyFormView}{wxpropertyformview}
404
405The property form view manages the relationship between a property sheet
406and an existing dialog or panel.
407
408You must first create a panel or dialog box for the view to work on.
409The panel should contain panel items with names that correspond to
410properties in your property sheet; or you can explicitly set the
411panel item for each property.
412
413Apart from any custom panel items that you wish to control independently
414of the property-editing items, wxPropertyFormView takes over the
415processing of item events. It can also control normal dialog behaviour such
416as OK, Cancel, so you should also create some standard buttons that the property view
417can recognise. Just create the buttons with standard names and the view
418will do the rest. The following button names are recognised:
419
420\begin{itemize}\itemsep=0pt
421\item {\bf ok}: indicates the OK button. Calls wxPropertyFormView::OnOk. By default,
422checks and updates the form values, closes and deletes the frame or dialog, then deletes the view.
423\item {\bf cancel}: indicates the Cancel button. Calls wxPropertyFormView::OnCancel. By default,
424closes and deletes the frame or dialog, then deletes the view.
425\item {\bf help}: indicates the Help button. Calls wxPropertyFormView::OnHelp. This needs
426to be overridden by the application for anything interesting to happen.
427\item {\bf revert}: indicates the Revert button. Calls wxPropertyFormView::OnRevert,
428which by default transfers the wxProperty values to the panel items (in effect
429undoing any unsaved changes in the items).
430\item {\bf update}: indicates the Revert button. Calls wxPropertyFormView::OnUpdate, which
431by defaults transfers the displayed values to the wxProperty objects.
432\end{itemize}
433
434\subsection{wxPropertySheet overview}\label{wxpropertysheetoverview}
435
436Classes: \helpref{wxPropertySheet}{wxpropertysheet}, \helpref{wxProperty}{wxproperty}, \helpref{wxPropertyValue}{wxpropertyvalue}
437
438A property sheet defines zero or more properties. This is a bit like an explicit representation of
439a C++ object. wxProperty objects can have values which are pointers to C++ values, or they
440can allocate their own storage for values.
441
442Because the property sheet representation is explicit and can be manipulated by
443a program, it is a convenient form to be used for a variety of
444editing purposes. wxPropertyListView and wxPropertyFormView are two classes that
445specify the relationship between a property sheet and a user interface. You could imagine
446other uses for wxPropertySheet, for example to generate a form-like user interface without
447the need for GUI programming. Or for storing the names and values of command-line switches, with the
448option to subsequently edit these values using a wxPropertyListView.
449
450A typical use for a property sheet is to represent values of an object
451which are only implicit in the current representation of it. For
452example, in Visual Basic and similar programming environments, you can
453`edit a button', or rather, edit the button's properties. One of the
454properties you can edit is {\it width} - but there is no explicit
455representation of width in a wxWindows button; instead, you call SetSize
456and GetSize members. To translate this into a consistent,
457property-oriented scheme, we could derive a new class
458wxButtonWithProperties, which has two new functions: SetProperty and
459GetProperty. SetProperty accepts a property name and a value, and calls
460an appropriate function for the property that is being passed.
461GetProperty accepts a property name, returning a property value. So
462instead of having to use the usual arbitrary set of C++ member functions
463to set or access attributes of a window, programmer deals merely with
464SetValue/GetValue, and property names and values.
465We now have a single point at which we can modify or query an object by specifying
466names and values at run-time. (The implementation of SetProperty and GetProperty
467is probably quite messy and involves a large if-then-else statement to
468test the property name and act accordingly.)
469
470When the user invokes the property editor for a wxButtonWithProperties, the system
471creates a wxPropertySheet with `imaginary' properties such as width, height, font size
472and so on. For each property, wxButtonWithProperties::GetProperty is called, and the result is
473passed to the corresponding wxProperty. The wxPropertySheet is passed to a wxPropertyListView
474as described elsewhere, and the user edits away. When the user has finished editing, the system calls
475wxButtonWithProperties::SetProperty to transfer the wxProperty value back into the button
476by way of an appropriate call, wxWindow::SetSize in the case of width and height properties.
477
478\section{Classes by category}\label{proplistclassesbycat}
479
480A classification of property sheet classes by category.
481
482\subsection{Data classes}
483
484\begin{itemize}\itemsep=0pt
485\item \helpref{wxProperty}{wxproperty}
486\item \helpref{wxPropertyValue}{wxpropertyvalue}
487\item \helpref{wxPropertySheet}{wxpropertysheet}
488\end{itemize}
489
490\subsection{Validator classes}\label{proplistvalidatorclasses}
491
492Validators check that the values the user has entered for a property are
493valid. They can also define specific ways of entering data, such as a
494file selector for a filename, and they are responsible for transferring
495values between the wxProperty and the physical display.
496
497Base classes:
498
499\begin{itemize}\itemsep=0pt
500\item \helpref{wxPropertyValidator}{wxproperty}
501\item \helpref{wxPropertyListValidator}{wxpropertylistvalidator}
502\item \helpref{wxPropertyFormValidator}{wxpropertyformvalidator}
503\end{itemize}
504
505List view validators:
506
507\begin{itemize}\itemsep=0pt
508\item \helpref{wxBoolListValidator}{wxboollistvalidator}
509\item \helpref{wxFilenameListValidator}{wxfilenamelistvalidator}
510\item \helpref{wxIntegerListValidator}{wxintegerlistvalidator}
511\item \helpref{wxListOfStringsListValidator}{wxlistofstringslistvalidator}
512\item \helpref{wxRealListValidator}{wxreallistvalidator}
513\item \helpref{wxStringListValidator}{wxstringlistvalidator}
514\end{itemize}
515
516Form view validators:
517
518\begin{itemize}\itemsep=0pt
519\item \helpref{wxBoolFormValidator}{wxboolformvalidator}
520\item \helpref{wxIntegerFormValidator}{wxintegerformvalidator}
521\item \helpref{wxRealFormValidator}{wxrealformvalidator}
522\item \helpref{wxStringFormValidator}{wxstringformvalidator}
523\end{itemize}
524
525\subsection{View classes}\label{proplistviewclasses}
526
527View classes mediate between a property sheet and a physical window.
528
529\begin{itemize}\itemsep=0pt
530\item \helpref{wxPropertyView}{wxpropertyview}
531\item \helpref{wxPropertyListView}{wxpropertylistview}
532\item \helpref{wxPropertyFormView}{wxpropertyformview}
533\end{itemize}
534
535\subsection{Window classes}\label{proplistwindowclasses}
536
537The class library defines some window classes that can be used as-is with a suitable
538view class and property sheet.
539
540\begin{itemize}\itemsep=0pt
541\item \helpref{wxPropertyFormFrame}{wxpropertyformframe}
542\item \helpref{wxPropertyFormDialog}{wxpropertyformdialog}
543\item \helpref{wxPropertyFormPanel}{wxpropertyformpanel}
544\item \helpref{wxPropertyListFrame}{wxpropertylistframe}
545\item \helpref{wxPropertyListDialog}{wxpropertylistdialog}
546\item \helpref{wxPropertyListPanel}{wxpropertylistpanel}
547\end{itemize}
548
549\subsection{Registry classes}
550
551A validator registry is a list of validators that can be applied to properties in a property sheet.
552There may be one or more registries per property view.
553
554\begin{itemize}\itemsep=0pt
555\item \helpref{wxPropertyValidatorRegistry}{wxpropertyvalidatorregistry}
556\end{itemize}