hopefully fixes focus assertion
[wxWidgets.git] / wxPython / demo / wxValidator.py
1
2 from wxPython.wx import *
3 from wxPython.lib.grids import wxFlexGridSizer
4
5 import string
6
7 #----------------------------------------------------------------------
8
9 ALPHA_ONLY = 1
10 DIGIT_ONLY = 2
11
12 class MyValidator(wxPyValidator):
13 def __init__(self, flag=None, pyVar=None):
14 wxPyValidator.__init__(self)
15 self.flag = flag
16 EVT_CHAR(self, self.OnChar)
17
18 def Clone(self):
19 return MyValidator(self.flag)
20
21 def Validate(self, win):
22 tc = self.GetWindow()
23 val = tc.GetValue()
24 if self.flag == ALPHA_ONLY:
25 for x in val:
26 if x not in string.letters:
27 return false
28
29 elif self.flag == DIGIT_ONLY:
30 for x in val:
31 if x not in string.digits:
32 return false
33
34 return true
35
36
37 def OnChar(self, event):
38 key = event.KeyCode()
39 if key < WXK_SPACE or key == WXK_DELETE or key > 255:
40 event.Skip()
41 return
42 if self.flag == ALPHA_ONLY and chr(key) in string.letters:
43 event.Skip()
44 return
45 if self.flag == DIGIT_ONLY and chr(key) in string.digits:
46 event.Skip()
47 return
48
49 if not wxValidator_IsSilent():
50 wxBell()
51
52 # Returning without calling even.Skip eats the event before it
53 # gets to the text control
54 return
55
56 #----------------------------------------------------------------------
57
58 class TestValidatorPanel(wxPanel):
59 def __init__(self, parent):
60 wxPanel.__init__(self, parent, -1)
61 self.SetAutoLayout(true)
62 VSPACE = 10
63
64 fgs = wxFlexGridSizer(0, 2)
65
66 fgs.Add(1,1);
67 fgs.Add(wxStaticText(self, -1, "These controls have validators that limit\n"
68 "the type of characters that can be entered."))
69
70 fgs.Add(1,VSPACE); fgs.Add(1,VSPACE)
71
72 label = wxStaticText(self, -1, "Alpha Only: ")
73 fgs.Add(label, 0, wxALIGN_RIGHT|wxCENTER)
74
75 fgs.Add(wxTextCtrl(self, -1, "", validator = MyValidator(ALPHA_ONLY)))
76
77 fgs.Add(1,VSPACE); fgs.Add(1,VSPACE)
78
79 label = wxStaticText(self, -1, "Digits Only: ")
80 fgs.Add(label, 0, wxALIGN_RIGHT|wxCENTER)
81 fgs.Add(wxTextCtrl(self, -1, "", validator = MyValidator(DIGIT_ONLY)))
82
83 fgs.Add(1,VSPACE); fgs.Add(1,VSPACE)
84 fgs.Add(1,VSPACE); fgs.Add(1,VSPACE)
85 fgs.Add(0,0)
86 b = wxButton(self, -1, "Test Dialog Validation")
87 EVT_BUTTON(self, b.GetId(), self.OnDoDialog)
88 fgs.Add(b)
89
90 border = wxBoxSizer()
91 border.Add(fgs, 1, wxGROW|wxALL, 25)
92 self.SetSizer(border)
93 self.Layout()
94
95 def OnDoDialog(self, evt):
96 dlg = TestValidateDialog(self)
97 dlg.ShowModal()
98 dlg.Destroy()
99
100
101 #----------------------------------------------------------------------
102
103 class TextObjectValidator(wxPyValidator):
104 """ This validator is used to ensure that the user has entered something
105 into the text object editor dialog's text field.
106 """
107 def __init__(self):
108 """ Standard constructor.
109 """
110 wxPyValidator.__init__(self)
111
112
113
114 def Clone(self):
115 """ Standard cloner.
116
117 Note that every validator must implement the Clone() method.
118 """
119 return TextObjectValidator()
120
121
122 def Validate(self, win):
123 """ Validate the contents of the given text control.
124 """
125 textCtrl = self.GetWindow()
126 text = textCtrl.GetValue()
127
128 if len(text) == 0:
129 wxMessageBox("A text object must contain some text!", "Error")
130 textCtrl.SetFocus()
131 return false
132 else:
133 return true
134
135
136 def TransferToWindow(self):
137 """ Transfer data from validator to window.
138
139 The default implementation returns false, indicating that an error
140 occurred. We simply return true, as we don't do any data transfer.
141 """
142 return true # Prevent wxDialog from complaining.
143
144
145 def TransferFromWindow(self):
146 """ Transfer data from window to validator.
147
148 The default implementation returns false, indicating that an error
149 occurred. We simply return true, as we don't do any data transfer.
150 """
151 return true # Prevent wxDialog from complaining.
152
153 #----------------------------------------------------------------------
154
155 class TestValidateDialog(wxDialog):
156 def __init__(self, parent):
157 wxDialog.__init__(self, parent, -1, "Validated Dialog")
158
159 self.SetAutoLayout(true)
160 VSPACE = 10
161
162 fgs = wxFlexGridSizer(0, 2)
163
164 fgs.Add(1,1);
165 fgs.Add(wxStaticText(self, -1,
166 "These controls must have text entered into them. Each\n"
167 "one has a validator that is checked when the Okay\n"
168 "button is clicked."))
169
170 fgs.Add(1,VSPACE); fgs.Add(1,VSPACE)
171
172 label = wxStaticText(self, -1, "First: ")
173 fgs.Add(label, 0, wxALIGN_RIGHT|wxCENTER)
174
175 fgs.Add(wxTextCtrl(self, -1, "", validator = TextObjectValidator()))
176
177 fgs.Add(1,VSPACE); fgs.Add(1,VSPACE)
178
179 label = wxStaticText(self, -1, "Second: ")
180 fgs.Add(label, 0, wxALIGN_RIGHT|wxCENTER)
181 fgs.Add(wxTextCtrl(self, -1, "", validator = TextObjectValidator()))
182
183
184 buttons = wxBoxSizer(wxHORIZONTAL)
185 buttons.Add(wxButton(self, wxID_OK, "Okay"), 0, wxALL, 10)
186 buttons.Add(wxButton(self, wxID_CANCEL, "Cancel"), 0, wxALL, 10)
187
188 border = wxBoxSizer(wxVERTICAL)
189 border.Add(fgs, 1, wxGROW|wxALL, 25)
190 border.Add(buttons)
191 self.SetSizer(border)
192 border.Fit(self)
193 self.Layout()
194
195
196 #----------------------------------------------------------------------
197
198 def runTest(frame, nb, log):
199 win = TestValidatorPanel(nb)
200 return win
201
202 #----------------------------------------------------------------------
203
204
205
206
207
208
209
210
211
212 overview = """\
213 wxValidator is the base class for a family of validator classes that mediate between a class of control, and application data.
214
215 A validator has three major roles:
216
217 1. to transfer data from a C++ variable or own storage to and from a control;
218
219 2. to validate data in a control, and show an appropriate error message;
220
221 3. to filter events (such as keystrokes), thereby changing the behaviour of the associated control.
222
223 Validators can be plugged into controls dynamically.
224
225 """