2 # 11/21/2003 - Jeff Grimmett (grimmtooth@softhome.net)
4 # o presense of spin control causing probs (see spin ctrl demo for details)
8 import wx
.lib
.scrolledpanel
as scrolled
9 import wx
.lib
.masked
as masked
11 #----------------------------------------------------------------------
13 class TestPanel( scrolled
.ScrolledPanel
):
14 def __init__( self
, parent
, log
):
16 scrolled
.ScrolledPanel
.__init
__( self
, parent
, -1 )
19 box_label
= wx
.StaticBox( self
, -1, "Change Controls through API" )
20 buttonbox
= wx
.StaticBoxSizer( box_label
, wx
.HORIZONTAL
)
22 text1
= wx
.StaticText( self
, -1, "12-hour format:")
23 self
.time12
= masked
.TimeCtrl( self
, -1, name
="12 hour control" )
24 h
= self
.time12
.GetSize().height
25 spin1
= wx
.SpinButton( self
, -1, wx
.DefaultPosition
, (-1,h
), wx
.SP_VERTICAL
)
26 self
.time12
.BindSpinButton( spin1
)
28 text2
= wx
.StaticText( self
, -1, "24-hour format:")
29 spin2
= wx
.SpinButton( self
, -1, wx
.DefaultPosition
, (-1,h
), wx
.SP_VERTICAL
)
30 self
.time24
= masked
.TimeCtrl(
31 self
, -1, name
="24 hour control", fmt24hr
=True,
35 text3
= wx
.StaticText( self
, -1, "No seconds\nor spin button:")
36 self
.spinless_ctrl
= masked
.TimeCtrl(
37 self
, -1, name
="spinless control",
38 display_seconds
= False
41 grid
= wx
.FlexGridSizer( 0, 2, 10, 5 )
42 grid
.Add( text1
, 0, wx
.ALIGN_RIGHT
)
43 hbox1
= wx
.BoxSizer( wx
.HORIZONTAL
)
44 hbox1
.Add( self
.time12
, 0, wx
.ALIGN_CENTRE
)
45 hbox1
.Add( spin1
, 0, wx
.ALIGN_CENTRE
)
46 grid
.Add( hbox1
, 0, wx
.LEFT
)
48 grid
.Add( text2
, 0, wx
.ALIGN_RIGHT|wx
.TOP|wx
.BOTTOM
)
49 hbox2
= wx
.BoxSizer( wx
.HORIZONTAL
)
50 hbox2
.Add( self
.time24
, 0, wx
.ALIGN_CENTRE
)
51 hbox2
.Add( spin2
, 0, wx
.ALIGN_CENTRE
)
52 grid
.Add( hbox2
, 0, wx
.LEFT
)
54 grid
.Add( text3
, 0, wx
.ALIGN_RIGHT|wx
.TOP|wx
.BOTTOM
)
55 grid
.Add( self
.spinless_ctrl
, 0, wx
.LEFT
)
58 buttonChange
= wx
.Button( self
, -1, "Change Controls")
59 self
.radio12to24
= wx
.RadioButton(
60 self
, -1, "Copy 12-hour time to 24-hour control",
61 wx
.DefaultPosition
, wx
.DefaultSize
, wx
.RB_GROUP
64 self
.radio24to12
= wx
.RadioButton(
65 self
, -1, "Copy 24-hour time to 12-hour control"
68 self
.radioWx
= wx
.RadioButton( self
, -1, "Set controls to 'now' using wxDateTime")
69 self
.radioMx
= wx
.RadioButton( self
, -1, "Set controls to 'now' using mxDateTime")
71 radio_vbox
= wx
.BoxSizer( wx
.VERTICAL
)
72 radio_vbox
.Add( self
.radio12to24
, 0, wx
.ALIGN_CENTER_VERTICAL|wx
.ALL
, 5 )
73 radio_vbox
.Add( self
.radio24to12
, 0, wx
.ALIGN_CENTER_VERTICAL|wx
.ALL
, 5 )
74 radio_vbox
.Add( self
.radioWx
, 0, wx
.ALIGN_CENTER_VERTICAL|wx
.ALL
, 5 )
75 radio_vbox
.Add( self
.radioMx
, 0, wx
.ALIGN_CENTER_VERTICAL|wx
.ALL
, 5 )
77 buttonbox
.Add( buttonChange
, 0, wx
.ALIGN_CENTRE|wx
.ALL
, 5 )
78 buttonbox
.Add( radio_vbox
, 0, wx
.ALIGN_CENTRE|wx
.ALL
, 5 )
80 hbox
= wx
.BoxSizer( wx
.HORIZONTAL
)
81 hbox
.Add( grid
, 0, wx
.ALIGN_LEFT|wx
.ALL
, 15 )
82 hbox
.Add( buttonbox
, 0, wx
.ALIGN_RIGHT|wx
.BOTTOM
, 20 )
85 box_label
= wx
.StaticBox( self
, -1, "Bounds Control" )
86 boundsbox
= wx
.StaticBoxSizer( box_label
, wx
.HORIZONTAL
)
87 self
.set_bounds
= wx
.CheckBox( self
, -1, "Set time bounds:" )
89 minlabel
= wx
.StaticText( self
, -1, "minimum time:" )
90 self
.min = masked
.TimeCtrl( self
, -1, name
="min", display_seconds
= False )
91 self
.min.Enable( False )
93 maxlabel
= wx
.StaticText( self
, -1, "maximum time:" )
94 self
.max = masked
.TimeCtrl( self
, -1, name
="max", display_seconds
= False )
95 self
.max.Enable( False )
97 self
.limit_check
= wx
.CheckBox( self
, -1, "Limit control" )
99 label
= wx
.StaticText( self
, -1, "Resulting time control:" )
100 self
.target_ctrl
= masked
.TimeCtrl( self
, -1, name
="new" )
102 grid2
= wx
.FlexGridSizer( 0, 2, 0, 0 )
103 grid2
.Add( (20, 0), 0, wx
.ALIGN_LEFT|wx
.ALL
, 5 )
104 grid2
.Add( (20, 0), 0, wx
.ALIGN_LEFT|wx
.ALL
, 5 )
106 grid2
.Add( self
.set_bounds
, 0, wx
.ALIGN_LEFT|wx
.ALL
, 5 )
107 grid3
= wx
.FlexGridSizer( 0, 2, 5, 5 )
108 grid3
.Add(minlabel
, 0, wx
.ALIGN_RIGHT|wx
.ALIGN_CENTER_VERTICAL
)
109 grid3
.Add( self
.min, 0, wx
.ALIGN_LEFT
)
110 grid3
.Add(maxlabel
, 0, wx
.ALIGN_RIGHT|wx
.ALIGN_CENTER_VERTICAL
)
111 grid3
.Add( self
.max, 0, wx
.ALIGN_LEFT
)
112 grid2
.Add(grid3
, 0, wx
.ALIGN_LEFT
)
114 grid2
.Add( self
.limit_check
, 0, wx
.ALIGN_LEFT|wx
.ALL
, 5 )
115 grid2
.Add( (20, 0), 0, wx
.ALIGN_LEFT|wx
.ALL
, 5 )
117 grid2
.Add( (20, 0), 0, wx
.ALIGN_LEFT|wx
.ALL
, 5 )
118 grid2
.Add( (20, 0), 0, wx
.ALIGN_LEFT|wx
.ALL
, 5 )
119 grid2
.Add( label
, 0, wx
.ALIGN_LEFT|wx
.ALIGN_CENTER_VERTICAL|wx
.ALL
, 5 )
120 grid2
.Add( self
.target_ctrl
, 0, wx
.ALIGN_LEFT|wx
.ALL
, 5 )
121 boundsbox
.Add(grid2
, 0, wx
.ALIGN_CENTER|wx
.EXPAND|wx
.ALL
, 5)
123 vbox
= wx
.BoxSizer( wx
.VERTICAL
)
125 vbox
.Add( hbox
, 0, wx
.ALIGN_LEFT|wx
.ALL
, 5)
126 vbox
.Add( boundsbox
, 0, wx
.ALIGN_LEFT|wx
.ALL
, 5 )
129 outer_box
= wx
.BoxSizer( wx
.VERTICAL
)
130 outer_box
.Add( vbox
, 0, wx
.ALIGN_LEFT|wx
.ALL
, 5)
133 # Turn on mxDateTime option only if we can import the module:
135 from mx
import DateTime
137 self
.radioMx
.Enable( False )
140 self
.SetAutoLayout( True )
141 self
.SetSizer( outer_box
)
142 outer_box
.Fit( self
)
143 self
.SetupScrolling()
145 self
.Bind(wx
.EVT_BUTTON
, self
.OnButtonClick
, buttonChange
)
146 self
.Bind(masked
.EVT_TIMEUPDATE
, self
.OnTimeChange
, self
.time12
)
147 self
.Bind(masked
.EVT_TIMEUPDATE
, self
.OnTimeChange
, self
.time24
)
148 self
.Bind(masked
.EVT_TIMEUPDATE
, self
.OnTimeChange
, self
.spinless_ctrl
)
149 self
.Bind(wx
.EVT_CHECKBOX
, self
.OnBoundsCheck
, self
.set_bounds
)
150 self
.Bind(wx
.EVT_CHECKBOX
, self
.SetTargetMinMax
, self
.limit_check
)
151 self
.Bind(masked
.EVT_TIMEUPDATE
, self
.SetTargetMinMax
, self
.min )
152 self
.Bind(masked
.EVT_TIMEUPDATE
, self
.SetTargetMinMax
, self
.max )
153 self
.Bind(masked
.EVT_TIMEUPDATE
, self
.OnTimeChange
, self
.target_ctrl
)
156 def OnTimeChange( self
, event
):
157 timectrl
= self
.FindWindowById( event
.GetId() )
158 ib_str
= [ " (out of bounds)", "" ]
160 self
.log
.write('%s time = %s%s\n' % ( timectrl
.GetName(), timectrl
.GetValue(), ib_str
[ timectrl
.IsInBounds() ] ) )
163 def OnButtonClick( self
, event
):
164 if self
.radio12to24
.GetValue():
165 self
.time24
.SetValue( self
.time12
.GetValue() )
167 elif self
.radio24to12
.GetValue():
168 self
.time12
.SetValue( self
.time24
.GetValue() )
170 elif self
.radioWx
.GetValue():
171 now
= wx
.DateTime_Now()
172 self
.time12
.SetValue( now
)
173 # (demonstrates that G/SetValue returns/takes a wx.DateTime)
174 self
.time24
.SetValue( self
.time12
.GetValue(as_wxDateTime
=True) )
176 # (demonstrates that G/SetValue returns/takes a wx.TimeSpan)
177 self
.spinless_ctrl
.SetValue( self
.time12
.GetValue(as_wxTimeSpan
=True) )
179 elif self
.radioMx
.GetValue():
180 from mx
import DateTime
182 self
.time12
.SetValue( now
)
184 # (demonstrates that G/SetValue returns/takes a DateTime)
185 self
.time24
.SetValue( self
.time12
.GetValue(as_mxDateTime
=True) )
187 # (demonstrates that G/SetValue returns/takes a DateTimeDelta)
188 self
.spinless_ctrl
.SetValue( self
.time12
.GetValue(as_mxDateTimeDelta
=True) )
191 def OnBoundsCheck( self
, event
):
192 self
.min.Enable( self
.set_bounds
.GetValue() )
193 self
.max.Enable( self
.set_bounds
.GetValue() )
194 self
.SetTargetMinMax()
197 def SetTargetMinMax( self
, event
=None ):
201 if self
.set_bounds
.GetValue():
202 min = self
.min.GetWxDateTime()
203 max = self
.max.GetWxDateTime()
205 min, max = None, None
207 cur_min
, cur_max
= self
.target_ctrl
.GetBounds()
209 if min and (min != cur_min
): self
.target_ctrl
.SetMin( min )
210 if max and (max != cur_max
): self
.target_ctrl
.SetMax( max )
212 self
.target_ctrl
.SetLimited( self
.limit_check
.GetValue() )
214 if min != cur_min
or max != cur_max
:
215 new_min
, new_max
= self
.target_ctrl
.GetBounds()
217 if new_min
and new_max
:
218 self
.log
.write( "current min, max: (%s, %s)\n" % ( new_min
.FormatTime(), new_max
.FormatTime() ) )
220 self
.log
.write( "current min, max: (None, None)\n" )
222 #----------------------------------------------------------------------
224 def runTest( frame
, nb
, log
):
225 win
= TestPanel( nb
, log
)
228 #----------------------------------------------------------------------
229 import wx
.lib
.masked
.timectrl
as timectl
232 """ + timectl
.__doc
__ + """
235 if __name__
== '__main__':
238 run
.main(['', os
.path
.basename(sys
.argv
[0])])