7 import  wx
.lib
.maskededit       
as  med
 
   8 import  wx
.lib
.maskedctrl       
as  mctl
 
   9 import  wx
.lib
.scrolledpanel    
as  scroll
 
  14     Centralized routines common to demo pages, to remove repetition. 
  16     def labelGeneralTable(self
, sizer
): 
  17         description 
= wx
.StaticText( self
, -1, "Description", ) 
  18         mask        
= wx
.StaticText( self
, -1, "Mask Value" ) 
  19         formatcode  
= wx
.StaticText( self
, -1, "Format" ) 
  20         regex       
= wx
.StaticText( self
, -1, "Regexp Validator(opt.)" ) 
  21         ctrl        
= wx
.StaticText( self
, -1, "MaskedTextCtrl" ) 
  23         description
.SetFont( wx
.Font(9, wx
.SWISS
, wx
.NORMAL
, wx
.BOLD
)) 
  24         mask
.SetFont( wx
.Font(9, wx
.SWISS
, wx
.NORMAL
, wx
.BOLD
)) 
  25         formatcode
.SetFont( wx
.Font(9, wx
.SWISS
, wx
.NORMAL
, wx
.BOLD
) ) 
  26         regex
.SetFont( wx
.Font(9, wx
.SWISS
, wx
.NORMAL
, wx
.BOLD
)) 
  27         ctrl
.SetFont( wx
.Font(9, wx
.SWISS
, wx
.NORMAL
, wx
.BOLD
)) 
  29         sizer
.Add(description
) 
  36     def layoutGeneralTable(self
, controls
, sizer
): 
  37         for control 
in controls
: 
  38             sizer
.Add( wx
.StaticText( self
, -1, control
[0]) ) 
  39             sizer
.Add( wx
.StaticText( self
, -1, control
[1]) ) 
  40             sizer
.Add( wx
.StaticText( self
, -1, control
[3]) ) 
  41             sizer
.Add( wx
.StaticText( self
, -1, control
[4]) ) 
  43             if control 
in controls
: 
  44                 newControl  
= med
.MaskedTextCtrl( self
, -1, "", 
  46                                                 excludeChars 
= control
[2], 
  47                                                 formatcodes  
= control
[3], 
  49                                                 validRegex   
= control
[4], 
  50                                                 validRange   
= control
[5], 
  52                                                 choiceRequired 
= True, 
  53                                                 defaultValue 
= control
[7], 
  56             self
.editList
.append(newControl
) 
  60     def changeControlParams(self
, event
, parameter
, checked_value
, notchecked_value
): 
  61         if event
.IsChecked(): value 
= checked_value
 
  62         else:               value 
= notchecked_value
 
  64         kwargs 
= {parameter: value}
 
  66         for control 
in self
.editList
: 
  67             control
.SetCtrlParameters(**kwargs
) 
  74 #---------------------------------------------------------------------------- 
  75 class demoPage1(scroll
.ScrolledPanel
, demoMixin
): 
  76     def __init__(self
, parent
, log
): 
  77         scroll
.ScrolledPanel
.__init
__(self
, parent
, -1) 
  78         self
.sizer 
= wx
.BoxSizer( wx
.VERTICAL 
) 
  81         label 
= wx
.StaticText( self
, -1, """\ 
  82 Here are some basic MaskedTextCtrls to give you an idea of what you can do 
  83 with this control.  Note that all controls have been auto-sized by including 'F' in 
  86 Try entering nonsensical or partial values in validated fields to see what happens. 
  87 Note that the State and Last Name fields are list-limited (valid last names are: 
  88 Smith, Jones, Williams).  Signs on numbers can be toggled with the minus key. 
  90         label
.SetForegroundColour( "Blue" ) 
  91         header 
= wx
.BoxSizer( wx
.HORIZONTAL 
) 
  92         header
.Add( label
, 0, flag
=wx
.ALIGN_LEFT|wx
.ALL
, border 
= 5 ) 
  94         highlight 
= wx
.CheckBox( self
, -1, "Highlight Empty" ) 
  95         disallow 
=  wx
.CheckBox( self
, -1, "Disallow Empty" ) 
  96         showFill 
= wx
.CheckBox( self
, -1, "change fillChar" ) 
  98         vbox 
= wx
.BoxSizer( wx
.VERTICAL 
) 
  99         vbox
.Add( highlight
, 0, wx
.ALIGN_LEFT|wx
.ALL
, 5 ) 
 100         vbox
.Add( disallow
, 0, wx
.ALIGN_LEFT|wx
.ALL
, 5 ) 
 101         vbox
.Add( showFill
, 0, wx
.ALIGN_LEFT|wx
.ALL
, 5 ) 
 103         header
.Add(vbox
, 0, flag
=wx
.ALIGN_LEFT|wx
.ALL
, border
=5 ) 
 105         self
.Bind(wx
.EVT_CHECKBOX
, self
.onHighlightEmpty
, id=highlight
.GetId()) 
 106         self
.Bind(wx
.EVT_CHECKBOX
, self
.onDisallowEmpty
, id=disallow
.GetId()) 
 107         self
.Bind(wx
.EVT_CHECKBOX
, self
.onShowFill
, id=showFill
.GetId()) 
 109         grid 
= wx
.FlexGridSizer( 0, 5, vgap
=10, hgap
=10 ) 
 110         self
.labelGeneralTable(grid
) 
 112         # The following list is of the controls for the demo. Feel free to play around with 
 115         #description        mask                    excl format     regexp                              range,list,initial 
 116        ("Phone No",         "(###) ###-#### x:###", "", 'F^-',     "^\(\d{3}\) \d{3}-\d{4}",           '','',''), 
 117        ("Social Sec#",      "###-##-####",          "", 'F',        "\d{3}-\d{2}-\d{4}",                '','',''), 
 118        ("Full Name",        "C{14}",                "", 'F_',       '^[A-Z][a-zA-Z]+ [A-Z][a-zA-Z]+',   '','',''), 
 119        ("Last Name Only",   "C{14}",                "", 'F {list}', '^[A-Z][a-zA-Z]+',                  '',('Smith','Jones','Williams'),''), 
 120        ("Zip plus 4",       "#{5}-#{4}",            "", 'F',        "\d{5}-(\s{4}|\d{4})",              '','',''), 
 121        ("Customer No",      "\CAA-###",             "", 'F!',       "C[A-Z]{2}-\d{3}",                  '','',''), 
 122        ("Invoice Total",    "#{9}.##",              "", 'F-_,',     "",                                 '','',''), 
 123        ("Integer",          "#{9}",                 "", 'F-_',      "",                                 '','',''), 
 126         self
.layoutGeneralTable(controls
, grid
) 
 127         self
.sizer
.Add( header
, 0, flag
=wx
.ALIGN_LEFT|wx
.ALL
, border
=5 ) 
 128         self
.sizer
.Add( grid
, 0, flag
= wx
.ALIGN_LEFT|wx
.LEFT
, border
=5 ) 
 129         self
.SetSizer(self
.sizer
) 
 130         self
.SetupScrolling() 
 131         self
.SetAutoLayout(1) 
 134     def onDisallowEmpty( self
, event 
): 
 135         """ Set emptyInvalid parameter on/off """ 
 136         self
.changeControlParams( event
, "emptyInvalid", True, False ) 
 138     def onHighlightEmpty( self
, event 
): 
 139         """ Highlight empty values""" 
 140         self
.changeControlParams( event
, "emptyBackgroundColour", "Blue", "White" ) 
 142     def onShowFill( self
, event 
): 
 143         """ Set fillChar parameter to '?' or ' ' """ 
 144         self
.changeControlParams( event
, "fillChar", '?', ' ' ) 
 147 class demoPage2(scroll
.ScrolledPanel
, demoMixin
): 
 148     def __init__( self
, parent
, log 
): 
 150         scroll
.ScrolledPanel
.__init
__( self
, parent
, -1 ) 
 151         self
.sizer 
= wx
.BoxSizer( wx
.VERTICAL 
) 
 153         label 
= wx
.StaticText( self
, -1, """\ 
 154 All these controls have been created by passing a single parameter, the autoformat code, 
 155 and use the factory class MaskedCtrl with its default controlType. 
 156 The maskededit module contains an internal dictionary of types and formats (autoformats). 
 157 Many of these already do complicated validation; To see some examples, try 
 158 29 Feb 2002 vs. 2004 for the date formats, or email address validation. 
 161         label
.SetForegroundColour( "Blue" ) 
 162         self
.sizer
.Add( label
, 0, wx
.ALIGN_LEFT|wx
.ALL
, 5 ) 
 164         description 
= wx
.StaticText( self
, -1, "Description") 
 165         autofmt     
= wx
.StaticText( self
, -1, "AutoFormat Code") 
 166         ctrl        
= wx
.StaticText( self
, -1, "MaskedCtrl") 
 168         description
.SetFont( wx
.Font( 9, wx
.SWISS
, wx
.NORMAL
, wx
.BOLD 
) ) 
 169         autofmt
.SetFont( wx
.Font( 9, wx
.SWISS
, wx
.NORMAL
, wx
.BOLD 
) ) 
 170         ctrl
.SetFont( wx
.Font( 9, wx
.SWISS
, wx
.NORMAL
, wx
.BOLD 
) ) 
 172         grid 
= wx
.FlexGridSizer( 0, 3, vgap
=10, hgap
=5 ) 
 173         grid
.Add( description
, 0, wx
.ALIGN_LEFT 
) 
 174         grid
.Add( autofmt
,     0, wx
.ALIGN_LEFT 
) 
 175         grid
.Add( ctrl
,        0, wx
.ALIGN_LEFT 
) 
 177         for autoformat
, desc 
in med
.autoformats
: 
 178             grid
.Add( wx
.StaticText( self
, -1, desc
), 0, wx
.ALIGN_LEFT 
) 
 179             grid
.Add( wx
.StaticText( self
, -1, autoformat
), 0, wx
.ALIGN_LEFT 
) 
 180             grid
.Add( mctl
.MaskedCtrl( self
, -1, "", 
 181                                     autoformat       
= autoformat
, 
 186         self
.sizer
.Add( grid
, 0, wx
.ALIGN_LEFT|wx
.ALL
, border
=5 ) 
 187         self
.SetSizer( self
.sizer 
) 
 188         self
.SetAutoLayout( 1 ) 
 189         self
.SetupScrolling() 
 192 class demoPage3(scroll
.ScrolledPanel
, demoMixin
): 
 193     def __init__(self
, parent
, log
): 
 195         scroll
.ScrolledPanel
.__init
__(self
, parent
, -1) 
 196         self
.sizer 
= wx
.BoxSizer( wx
.VERTICAL 
) 
 199         label 
= wx
.StaticText( self
, -1, """\ 
 200 Here MaskedTextCtrls that have default values.  The states 
 201 control has a list of valid values, and the unsigned integer 
 202 has a legal range specified. 
 204         label
.SetForegroundColour( "Blue" ) 
 205         requireValid 
=  wx
.CheckBox( self
, -1, "Require Valid Value" ) 
 206         self
.Bind(wx
.EVT_CHECKBOX
, self
.onRequireValid
, id=requireValid
.GetId()) 
 208         header 
= wx
.BoxSizer( wx
.HORIZONTAL 
) 
 209         header
.Add( label
, 0, flag
=wx
.ALIGN_LEFT|wx
.ALL
, border 
= 5) 
 211         header
.Add( requireValid
, 0, flag
=wx
.ALIGN_LEFT|wx
.ALL
, border
=10 ) 
 213         grid 
= wx
.FlexGridSizer( 0, 5, vgap
=10, hgap
=10 ) 
 214         self
.labelGeneralTable( grid 
) 
 217         #description        mask                    excl format     regexp                              range,list,initial 
 218        ("U.S. State (2 char)",      "AA",            "", 'F!_',       "[A-Z]{2}",                         '',med
.states
, med
.states
[0]), 
 219        ("Integer (signed)",         "#{6}",          "", 'F-_',       "",                                 '','', ' 0    '), 
 220        ("Integer (unsigned)\n(1-399)","######",      "", 'F_',        "",                                 (1,399),'', '1     '), 
 221        ("Float (signed)",           "#{6}.#{9}",     "", 'F-_R',      "",                                 '','', '000000.000000000'), 
 222        ("Date (MDY) + Time",        "##/##/#### ##:##:## AM",  'BCDEFGHIJKLMNOQRSTUVWXYZ','DF!',"",          '','', wx
.DateTime_Now().Format("%m/%d/%Y %I:%M:%S %p")), 
 224         self
.layoutGeneralTable( controls
, grid 
) 
 226         self
.sizer
.Add( header
, 0, flag
=wx
.ALIGN_LEFT|wx
.ALL
, border
=5 ) 
 227         self
.sizer
.Add( grid
, 0, flag
=wx
.ALIGN_LEFT|wx
.ALL
, border
=5 ) 
 229         self
.SetSizer( self
.sizer 
) 
 230         self
.SetAutoLayout( 1 ) 
 231         self
.SetupScrolling() 
 233     def onRequireValid( self
, event 
): 
 234         """ Set validRequired parameter on/off """ 
 235         self
.changeControlParams( event
, "validRequired", True, False ) 
 238 class demoPage4(scroll
.ScrolledPanel
, demoMixin
): 
 239     def __init__( self
, parent
, log 
): 
 241         scroll
.ScrolledPanel
.__init
__( self
, parent
, -1 ) 
 242         self
.sizer 
= wx
.BoxSizer( wx
.VERTICAL 
) 
 244         label 
= wx
.StaticText( self
, -1, """\ 
 245 These controls have field-specific choice lists and allow autocompletion. 
 247 Down arrow or Page Down in an uncompleted field with an auto-completable field will attempt 
 248 to auto-complete a field if it has a choice list. 
 249 Page Down and Shift-Down arrow will also auto-complete, or cycle through the complete list. 
 250 Page Up and Shift-Up arrow will similarly cycle backwards through the list. 
 253         label
.SetForegroundColour( "Blue" ) 
 254         self
.sizer
.Add( label
, 0, wx
.ALIGN_LEFT|wx
.ALL
, 5 ) 
 256         description  
= wx
.StaticText( self
, -1, "Description" ) 
 257         autofmt      
= wx
.StaticText( self
, -1, "AutoFormat Code" ) 
 258         fields       
= wx
.StaticText( self
, -1, "Field Objects" ) 
 259         ctrl         
= wx
.StaticText( self
, -1, "MaskedTextCtrl" ) 
 261         description
.SetFont( wx
.Font( 9, wx
.SWISS
, wx
.NORMAL
, wx
.BOLD 
) ) 
 262         autofmt
.SetFont( wx
.Font( 9, wx
.SWISS
, wx
.NORMAL
, wx
.BOLD 
) ) 
 263         fields
.SetFont( wx
.Font( 9, wx
.SWISS
, wx
.NORMAL
, wx
.BOLD 
) ) 
 264         ctrl
.SetFont( wx
.Font( 9, wx
.SWISS
, wx
.NORMAL
, wx
.BOLD 
) ) 
 266         grid 
= wx
.FlexGridSizer( 0, 4, vgap
=10, hgap
=10 ) 
 267         grid
.Add( description
, 0, wx
.ALIGN_LEFT 
) 
 268         grid
.Add( autofmt
,     0, wx
.ALIGN_LEFT 
) 
 269         grid
.Add( fields
,      0, wx
.ALIGN_LEFT 
) 
 270         grid
.Add( ctrl
,        0, wx
.ALIGN_LEFT 
) 
 272         autoformat 
= "USPHONEFULLEXT" 
 273         fieldsDict 
= {0: med.Field(choices=["617","781","508","978","413"], choiceRequired=True)}
 
 278           choiceRequired=True)}""" 
 279         grid
.Add( wx
.StaticText( self
, -1, "Restricted Area Code"), 0, wx
.ALIGN_LEFT 
) 
 280         grid
.Add( wx
.StaticText( self
, -1, autoformat
), 0, wx
.ALIGN_LEFT 
) 
 281         grid
.Add( wx
.StaticText( self
, -1, fieldsLabel
), 0, wx
.ALIGN_LEFT 
) 
 282         grid
.Add( med
.MaskedTextCtrl( self
, -1, "", 
 283                                     autoformat       
= autoformat
, 
 289         autoformat 
= "EXPDATEMMYY" 
 290         fieldsDict 
= {1: med.Field(choices=["03", "04", "05"], choiceRequired=True)}
 
 294           choiceRequired=True)}""" 
 295         exp 
=  med
.MaskedTextCtrl( self
, -1, "", 
 296                                  autoformat       
= autoformat
, 
 301         grid
.Add( wx
.StaticText( self
, -1, "Restricted Expiration"), 0, wx
.ALIGN_LEFT 
) 
 302         grid
.Add( wx
.StaticText( self
, -1, autoformat
), 0, wx
.ALIGN_LEFT 
) 
 303         grid
.Add( wx
.StaticText( self
, -1, fieldsLabel
), 0, wx
.ALIGN_LEFT 
) 
 304         grid
.Add( exp
, 0, wx
.ALIGN_LEFT 
) 
 306         fieldsDict 
= {0: med
.Field(choices
=["02134","02155"], choiceRequired
=True), 
 307                       1: med
.Field(choices
=["1234", "5678"],  choiceRequired
=False)} 
 309 {0: Field(choices=["02134","02155"], 
 310           choiceRequired=True), 
 311  1: Field(choices=["1234", "5678"], 
 312           choiceRequired=False)}""" 
 313         autoformat 
= "USZIPPLUS4" 
 314         zip =  med
.MaskedTextCtrl( self
, -1, "", 
 315                                  autoformat       
= autoformat
, 
 320         grid
.Add( wx
.StaticText( self
, -1, "Restricted Zip + 4"), 0, wx
.ALIGN_LEFT 
) 
 321         grid
.Add( wx
.StaticText( self
, -1, autoformat
), 0, wx
.ALIGN_LEFT 
) 
 322         grid
.Add( wx
.StaticText( self
, -1, fieldsLabel
), 0, wx
.ALIGN_LEFT 
) 
 323         grid
.Add( zip, 0, wx
.ALIGN_LEFT 
) 
 325         self
.sizer
.Add( grid
, 0, wx
.ALIGN_LEFT|wx
.ALL
, border
=5 ) 
 326         self
.SetSizer( self
.sizer 
) 
 327         self
.SetAutoLayout(1) 
 328         self
.SetupScrolling() 
 331 class demoPage5(scroll
.ScrolledPanel
, demoMixin
): 
 332     def __init__( self
, parent
, log 
): 
 334         scroll
.ScrolledPanel
.__init
__( self
, parent
, -1 ) 
 335         self
.sizer 
= wx
.BoxSizer( wx
.VERTICAL 
) 
 338         labelMaskedCombos 
= wx
.StaticText( self
, -1, """\ 
 339 These are some examples of MaskedComboBox:""") 
 340         labelMaskedCombos
.SetForegroundColour( "Blue" ) 
 343         label_statecode 
= wx
.StaticText( self
, -1, """\ 
 344 A state selector; only 
 345 "legal" values can be 
 347         statecode 
= med
.MaskedComboBox( self
, -1, med
.states
[0], 
 348                                   choices 
= med
.states
, 
 349                                   autoformat
="USSTATE") 
 351         label_statename 
= wx
.StaticText( self
, -1, """\ 
 352 A state name selector, 
 353 with auto-select:""") 
 355         # Create this one using factory function: 
 356         statename 
= mctl
.MaskedCtrl( self
, -1, med
.state_names
[0], 
 357                                   controlType 
= mctl
.controlTypes
.MASKEDCOMBO
, 
 358                                   choices 
= med
.state_names
, 
 359                                   autoformat
="USSTATENAME", 
 361         statename
.SetCtrlParameters(formatcodes 
= 'F!V_') 
 364         numerators 
= [ str(i
) for i 
in range(1, 4) ] 
 365         denominators 
= [ string
.ljust(str(i
), 2) for i 
in [2,3,4,5,8,16,32,64] ] 
 366         fieldsDict 
= {0: med
.Field(choices
=numerators
, choiceRequired
=False), 
 367                       1: med
.Field(choices
=denominators
, choiceRequired
=True)} 
 370             for d 
in denominators
: 
 372                     choices
.append( '%s/%s' % (n
,d
) ) 
 375         label_fraction 
= wx
.StaticText( self
, -1, """\ 
 376 A masked ComboBox for fraction selection. 
 377 Choices for each side of the fraction can 
 378 be selected with PageUp/Down:""") 
 380         fraction 
= mctl
.MaskedCtrl( self
, -1, "", 
 381                                  controlType 
= mctl
.MASKEDCOMBO
, 
 383                                  choiceRequired 
= True, 
 386                                  validRegex 
= "^\d\/\d\d?", 
 387                                  fields 
= fieldsDict 
) 
 390         label_code 
= wx
.StaticText( self
, -1, """\ 
 391 A masked ComboBox to validate 
 392 text from a list of numeric codes:""") 
 394         choices 
= ["91", "136", "305", "4579"] 
 395         code 
= med
.MaskedComboBox( self
, -1, choices
[0], 
 397                                  choiceRequired 
= True, 
 401         label_selector 
= wx
.StaticText( self
, -1, """\ 
 404         self
.list_selector 
= wx
.ComboBox(self
, -1, '', choices 
= ['list1', 'list2', 'list3']) 
 405         self
.dynamicbox 
= mctl
.MaskedCtrl( self
, -1, '    ', 
 406                                       controlType 
= mctl
.controlTypes
.MASKEDCOMBO
, 
 409                                       # these are to give dropdown some initial height, 
 410                                       # as base control apparently only sets that size 
 411                                       # during initial construction <sigh>: 
 412                                       choices 
= ['', '1', '2', '3', '4', '5'] ) 
 414         self
.dynamicbox
.Clear()   # get rid of initial choices used to size the dropdown 
 417         labelIpAddrs 
= wx
.StaticText( self
, -1, """\ 
 418 Here are some examples of IpAddrCtrl, a control derived from MaskedTextCtrl:""") 
 419         labelIpAddrs
.SetForegroundColour( "Blue" ) 
 422         label_ipaddr1 
= wx
.StaticText( self
, -1, "An empty control:") 
 423         ipaddr1 
= med
.IpAddrCtrl( self
, -1, style 
= wx
.TE_PROCESS_TAB 
) 
 426         label_ipaddr2 
= wx
.StaticText( self
, -1, "A restricted mask:") 
 427         ipaddr2 
= med
.IpAddrCtrl( self
, -1, mask
=" 10.  1.109.###" ) 
 430         label_ipaddr3 
= wx
.StaticText( self
, -1, """\ 
 431 A control with restricted legal values: 
 432 10. (1|2) . (129..255) . (0..255)""") 
 433         ipaddr3 
= mctl
.MaskedCtrl( self
, -1, 
 434                                 controlType 
= mctl
.controlTypes
.IPADDR
, 
 435                                 mask
=" 10.  #.###.###") 
 436         ipaddr3
.SetFieldParameters(0, validRegex
="1|2",validRequired
=False )   # requires entry to match or not allowed 
 438         # This allows any value in penultimate field, but colors anything outside of the range invalid: 
 439         ipaddr3
.SetFieldParameters(1, validRange
=(129,255), validRequired
=False ) 
 443         labelNumerics 
= wx
.StaticText( self
, -1, """\ 
 444 Here are some useful configurations of a MaskedTextCtrl for integer and floating point input that still treat 
 445 the control as a text control.  (For a true numeric control, check out the MaskedNumCtrl class!)""") 
 446         labelNumerics
.SetForegroundColour( "Blue" ) 
 448         label_intctrl1 
= wx
.StaticText( self
, -1, """\ 
 449 An integer entry control with 
 450 shifting insert enabled:""") 
 451         self
.intctrl1 
= med
.MaskedTextCtrl(self
, -1, name
='intctrl', mask
="#{9}", formatcodes 
= '_-,F>') 
 452         label_intctrl2 
= wx
.StaticText( self
, -1, """\ 
 453      Right-insert integer entry:""") 
 454         self
.intctrl2 
= med
.MaskedTextCtrl(self
, -1, name
='intctrl', mask
="#{9}", formatcodes 
= '_-,Fr') 
 456         label_floatctrl 
= wx
.StaticText( self
, -1, """\ 
 457 A floating point entry control 
 458 with right-insert for ordinal:""") 
 459         self
.floatctrl 
= med
.MaskedTextCtrl(self
, -1, name
='floatctrl', mask
="#{9}.#{2}", formatcodes
="F,_-R", useParensForNegatives
=False) 
 460         self
.floatctrl
.SetFieldParameters(0, formatcodes
='r<', validRequired
=True)  # right-insert, require explicit cursor movement to change fields 
 461         self
.floatctrl
.SetFieldParameters(1, defaultValue
='00')                     # don't allow blank fraction 
 463         label_numselect 
= wx
.StaticText( self
, -1, """\ 
 464 <= Programmatically set the value 
 465      of the float entry ctrl:""") 
 466         numselect 
= wx
.ComboBox(self
, -1, choices 
= [ '', '111', '222.22', '-3', '54321.666666666', '-1353.978', 
 467                                                      '1234567', '-1234567', '123456789', '-123456789.1', 
 468                                                      '1234567890.', '-1234567890.1' ]) 
 470         parens_check 
= wx
.CheckBox(self
, -1, "Use () to indicate negatives in above controls") 
 474         gridCombos 
= wx
.FlexGridSizer( 0, 4, vgap
=10, hgap 
= 10 ) 
 475         gridCombos
.Add( label_statecode
, 0, wx
.ALIGN_LEFT 
) 
 476         gridCombos
.Add( statecode
, 0, wx
.ALIGN_LEFT 
) 
 477         gridCombos
.Add( label_fraction
, 0, wx
.ALIGN_LEFT 
) 
 478         gridCombos
.Add( fraction
, 0, wx
.ALIGN_LEFT 
) 
 479         gridCombos
.Add( label_statename
, 0, wx
.ALIGN_LEFT 
) 
 480         gridCombos
.Add( statename
, 0, wx
.ALIGN_LEFT 
) 
 481         gridCombos
.Add( label_code
, 0, wx
.ALIGN_LEFT 
) 
 482         gridCombos
.Add( code
, 0, wx
.ALIGN_LEFT 
) 
 483         gridCombos
.Add( label_selector
, 0, wx
.ALIGN_LEFT
) 
 484         hbox 
= wx
.BoxSizer( wx
.HORIZONTAL 
) 
 485         hbox
.Add( self
.list_selector
, 0, wx
.ALIGN_LEFT 
) 
 486         hbox
.Add(wx
.StaticText(self
, -1, ' => '), 0, wx
.ALIGN_LEFT
) 
 487         hbox
.Add( self
.dynamicbox
, 0, wx
.ALIGN_LEFT 
) 
 488         gridCombos
.Add( hbox
, 0, wx
.ALIGN_LEFT 
) 
 490         gridIpAddrs 
= wx
.FlexGridSizer( 0, 4, vgap
=10, hgap 
= 15 ) 
 491         gridIpAddrs
.Add( label_ipaddr1
, 0, wx
.ALIGN_LEFT 
) 
 492         gridIpAddrs
.Add( ipaddr1
, 0, wx
.ALIGN_LEFT 
) 
 493         gridIpAddrs
.Add( label_ipaddr2
, 0, wx
.ALIGN_LEFT 
) 
 494         gridIpAddrs
.Add( ipaddr2
, 0, wx
.ALIGN_LEFT 
) 
 495         gridIpAddrs
.Add( label_ipaddr3
, 0, wx
.ALIGN_LEFT 
) 
 496         gridIpAddrs
.Add( ipaddr3
, 0, wx
.ALIGN_LEFT 
) 
 498         gridNumerics 
= wx
.FlexGridSizer( 0, 4, vgap
=10, hgap 
= 10 ) 
 499         gridNumerics
.Add( label_intctrl1
, 0, wx
.ALIGN_LEFT 
) 
 500         gridNumerics
.Add( self
.intctrl1
, 0, wx
.ALIGN_LEFT 
) 
 501         gridNumerics
.Add( label_intctrl2
, 0, wx
.ALIGN_RIGHT 
) 
 502         gridNumerics
.Add( self
.intctrl2
, 0, wx
.ALIGN_LEFT 
) 
 503         gridNumerics
.Add( label_floatctrl
, 0, wx
.ALIGN_LEFT 
) 
 504         gridNumerics
.Add( self
.floatctrl
, 0, wx
.ALIGN_LEFT 
) 
 505         gridNumerics
.Add( label_numselect
, 0, wx
.ALIGN_RIGHT 
) 
 506         gridNumerics
.Add( numselect
, 0, wx
.ALIGN_LEFT 
) 
 508         self
.sizer
.Add( labelMaskedCombos
, 0, wx
.ALIGN_LEFT|wx
.ALL
, 5 ) 
 509         self
.sizer
.Add( gridCombos
, 0, wx
.ALIGN_LEFT|wx
.ALL
, border
=5 ) 
 510         self
.sizer
.Add( wx
.StaticLine(self
, -1), 0, wx
.EXPAND|wx
.TOP|wx
.BOTTOM
, border
=8 ) 
 511         self
.sizer
.Add( labelIpAddrs
, 0, wx
.ALIGN_LEFT|wx
.ALL
, 5 ) 
 512         self
.sizer
.Add( gridIpAddrs
, 0, wx
.ALIGN_LEFT|wx
.ALL
, border
=5 ) 
 513         self
.sizer
.Add( wx
.StaticLine(self
, -1), 0, wx
.EXPAND|wx
.TOP|wx
.BOTTOM
, border
=8 ) 
 514         self
.sizer
.Add( labelNumerics
, 0, wx
.ALIGN_LEFT|wx
.ALL
, 5 ) 
 515         self
.sizer
.Add( gridNumerics
, 0, wx
.ALIGN_LEFT|wx
.ALL
, border
=5 ) 
 516         self
.sizer
.Add( parens_check
, 0, wx
.ALIGN_LEFT|wx
.ALL
, 5 ) 
 518         self
.SetSizer( self
.sizer 
) 
 519         self
.SetAutoLayout(1) 
 520         self
.SetupScrolling() 
 522         self
.Bind(wx
.EVT_COMBOBOX
, self
.OnComboSelection
, id=fraction
.GetId()) 
 523         self
.Bind(wx
.EVT_COMBOBOX
, self
.OnComboSelection
, id=code
.GetId()) 
 524         self
.Bind(wx
.EVT_COMBOBOX
, self
.OnComboSelection
, id=statecode
.GetId()) 
 525         self
.Bind(wx
.EVT_COMBOBOX
, self
.OnComboSelection
, id=statename
.GetId()) 
 526         self
.Bind(wx
.EVT_TEXT
, self
.OnTextChange
, id=code
.GetId()) 
 527         self
.Bind(wx
.EVT_TEXT
, self
.OnTextChange
, id=statecode
.GetId()) 
 528         self
.Bind(wx
.EVT_TEXT
, self
.OnTextChange
, id=statename
.GetId()) 
 529         self
.Bind(wx
.EVT_COMBOBOX
, self
.OnListSelection
, id=self
.list_selector
.GetId()) 
 531         self
.Bind(wx
.EVT_TEXT
, self
.OnTextChange
, id=self
.intctrl1
.GetId()) 
 532         self
.Bind(wx
.EVT_TEXT
, self
.OnTextChange
, id=self
.intctrl2
.GetId()) 
 533         self
.Bind(wx
.EVT_TEXT
, self
.OnTextChange
, id=self
.floatctrl
.GetId()) 
 534         self
.Bind(wx
.EVT_COMBOBOX
, self
.OnNumberSelect
, id=numselect
.GetId()) 
 535         self
.Bind(wx
.EVT_CHECKBOX
, self
.OnParensCheck
, id=parens_check
.GetId()) 
 537         self
.Bind(wx
.EVT_TEXT
, self
.OnIpAddrChange
, id=ipaddr1
.GetId()) 
 538         self
.Bind(wx
.EVT_TEXT
, self
.OnIpAddrChange
, id=ipaddr2
.GetId()) 
 539         self
.Bind(wx
.EVT_TEXT
, self
.OnIpAddrChange
, id=ipaddr3
.GetId()) 
 544     def OnComboSelection( self
, event 
): 
 545         ctl 
= self
.FindWindowById( event
.GetId() ) 
 546         if not ctl
.IsValid(): 
 547             self
.log
.write('current value not a valid choice') 
 548         self
.log
.write('new value = %s' % ctl
.GetValue()) 
 550     def OnTextChange( self
, event 
): 
 551         ctl 
= self
.FindWindowById( event
.GetId() ) 
 553             self
.log
.write('new value = %s\n' % ctl
.GetValue() ) 
 555     def OnNumberSelect( self
, event 
): 
 556         value 
= event
.GetString() 
 557         # Format choice to fit into format for #{9}.#{2}, with sign position reserved: 
 558         # (ordinal + fraction == 11 + decimal point + sign == 13) 
 560             floattext 
= "%13.2f" % float(value
) 
 562             floattext 
= value   
# clear the value again 
 564             self
.floatctrl
.SetValue(floattext
) 
 566             type, value
, tb 
= sys
.exc_info() 
 567             for line 
in traceback
.format_exception_only(type, value
): 
 570     def OnParensCheck( self
, event 
): 
 571         self
.intctrl1
.SetCtrlParameters(useParensForNegatives
=event
.IsChecked()) 
 572         self
.intctrl2
.SetCtrlParameters(useParensForNegatives
=event
.IsChecked()) 
 573         self
.floatctrl
.SetCtrlParameters(useParensForNegatives
=event
.IsChecked()) 
 575     def OnIpAddrChange( self
, event 
): 
 576         ipaddr 
= self
.FindWindowById( event
.GetId() ) 
 578             self
.log
.write('new addr = %s\n' % ipaddr
.GetAddress() ) 
 580     def OnListSelection( self
, event 
): 
 581         list = self
.list_selector
.GetStringSelection() 
 584             choices 
= ['abc', 'defg', 'hi'] 
 586         elif list == 'list2': 
 587             choices 
= ['1', '2', '34', '567'] 
 594         self
.dynamicbox
.SetCtrlParameters( mask 
= mask
, 
 598                                            formatcodes
=formatcodes
) 
 599         self
.dynamicbox
.SetValue(choices
[0]) 
 601 # --------------------------------------------------------------------- 
 602 class TestMaskedTextCtrls(wx
.Notebook
): 
 603     def __init__(self
, parent
, id, log
): 
 604         wx
.Notebook
.__init
__(self
, parent
, id) 
 607         win 
= demoPage1(self
, log
) 
 608         self
.AddPage(win
, "General examples") 
 610         win 
= demoPage2(self
, log
) 
 611         self
.AddPage(win
, 'Auto-formatted controls') 
 613         win 
= demoPage3(self
, log
) 
 614         self
.AddPage(win
, "Using default values") 
 616         win 
= demoPage4(self
, log
) 
 617         self
.AddPage(win
, 'Using auto-complete fields') 
 619         win 
= demoPage5(self
, log
) 
 620         self
.AddPage(win
, 'Other masked controls') 
 623 #---------------------------------------------------------------------------- 
 625 def runTest(frame
, nb
, log
): 
 626     testWin 
= TestMaskedTextCtrls(nb
, -1, log
) 
 630     app 
= wx
.PySimpleApp() 
 631     frame 
= wx
.Frame(None, -1, "Test MaskedTextCtrl", size
=(640, 480)) 
 632     win 
= TestMaskedTextCtrls(frame
, -1, sys
.stdout
) 
 635 #---------------------------------------------------------------------------- 
 639 """ + med
.__doc
__ + """ 
 643 if __name__ 
== "__main__": 
 646     run
.main(['', os
.path
.basename(sys
.argv
[0])])