Initial commit of OpenSPARC T2 architecture model.
[OpenSPARC-T2-SAM] / sam-t2 / devtools / v8plus / lib / python2.4 / site-packages / Pmw / Pmw_1_2 / contrib / PmwFullTimeCounter.py
CommitLineData
920dae64
AT
1# Authors: Joe VanAndel, Greg McFarlane and Daniel Michelson
2
3import string
4import sys
5import time
6import Tkinter
7import Pmw
8
9class FullTimeCounter(Pmw.MegaWidget):
10 """Up-down counter
11
12 A TimeCounter is a single-line entry widget with Up and Down arrows
13 which increment and decrement the Time value in the entry.
14 """
15
16 def __init__(self, parent = None, **kw):
17
18 # Define the megawidget options.
19 INITOPT = Pmw.INITOPT
20 optiondefs = (
21 ('autorepeat', 1, INITOPT),
22 ('buttonaspect', 1.0, INITOPT),
23 ('initwait', 300, INITOPT),
24 ('labelmargin', 0, INITOPT),
25 ('labelpos', None, INITOPT),
26 ('max', '', self._max),
27 ('min', '', self._min),
28 ('padx', 0, INITOPT),
29 ('pady', 0, INITOPT),
30 ('repeatrate', 50, INITOPT),
31 ('value', '', INITOPT),
32 )
33 self.defineoptions(kw, optiondefs)
34
35 # Initialise the base class (after defining the options).
36 Pmw.MegaWidget.__init__(self, parent)
37
38 self.arrowDirection = {}
39 self._flag = 'stopped'
40 self._timerId = None
41
42 self._createComponents()
43
44 value = self['value']
45 if value is None or value == '':
46 now = time.time()
47 value = time.strftime('%Y:%m:%d:%H:%M',time.gmtime(now))
48 self._setTimeFromStr(value)
49
50 # Check keywords and initialise options.
51 self.initialiseoptions()
52
53 def _createComponents(self):
54
55 # Create the components.
56 interior = self.interior()
57
58 # If there is no label, put the arrows and the entry directly
59 # into the interior, otherwise create a frame for them. In
60 # either case the border around the arrows and the entry will
61 # be raised (but not around the label).
62 if self['labelpos'] is None:
63 frame = interior
64 else:
65 frame = self.createcomponent('frame',
66 (), None,
67 Tkinter.Frame, (interior,))
68 frame.grid(column=2, row=2, sticky='nsew')
69 interior.grid_columnconfigure(2, weight=1)
70 interior.grid_rowconfigure(2, weight=1)
71
72 frame.configure(relief = 'raised', borderwidth = 1)
73
74 # Create the down arrow buttons.
75
76 # Create the year down arrow.
77 self._downYearArrowBtn = self.createcomponent('downyeararrow',
78 (), 'Arrow',
79 Tkinter.Canvas, (frame,),
80 width = 16, height = 16, relief = 'raised', borderwidth = 2)
81 self.arrowDirection[self._downYearArrowBtn] = 0
82 self._downYearArrowBtn.grid(column = 0, row = 2)
83
84 # Create the month down arrow.
85 self._downMonthArrowBtn = self.createcomponent('downmontharrow',
86 (), 'Arrow',
87 Tkinter.Canvas, (frame,),
88 width = 16, height = 16, relief = 'raised', borderwidth = 2)
89 self.arrowDirection[self._downMonthArrowBtn] = 0
90 self._downMonthArrowBtn.grid(column = 1, row = 2)
91
92 # Create the day down arrow.
93 self._downDayArrowBtn = self.createcomponent('downdayarrow',
94 (), 'Arrow',
95 Tkinter.Canvas, (frame,),
96 width = 16, height = 16, relief = 'raised', borderwidth = 2)
97 self.arrowDirection[self._downDayArrowBtn] = 0
98 self._downDayArrowBtn.grid(column = 2, row = 2)
99
100 # Create the hour down arrow.
101 self._downHourArrowBtn = self.createcomponent('downhourarrow',
102 (), 'Arrow',
103 Tkinter.Canvas, (frame,),
104 width = 16, height = 16, relief = 'raised', borderwidth = 2)
105 self.arrowDirection[self._downHourArrowBtn] = 0
106 self._downHourArrowBtn.grid(column = 3, row = 2)
107
108 # Create the minute down arrow.
109 self._downMinuteArrowBtn = self.createcomponent('downminutearrow',
110 (), 'Arrow',
111 Tkinter.Canvas, (frame,),
112 width = 16, height = 16, relief = 'raised', borderwidth = 2)
113 self.arrowDirection[self._downMinuteArrowBtn] = 0
114 self._downMinuteArrowBtn.grid(column = 4, row = 2)
115
116 # Create the entry fields.
117
118 # Create the year entry field.
119 self._yearCounterEntry = self.createcomponent('yearentryfield',
120 (('yearentry', 'yearentryfield_entry'),), None,
121 Pmw.EntryField, (frame,), validate='integer', entry_width = 4)
122 self._yearCounterEntry.grid(column = 0, row = 1, sticky = 'news')
123
124 # Create the month entry field.
125 self._monthCounterEntry = self.createcomponent('monthentryfield',
126 (('monthentry', 'monthentryfield_entry'),), None,
127 Pmw.EntryField, (frame,), validate='integer', entry_width = 2)
128 self._monthCounterEntry.grid(column = 1, row = 1, sticky = 'news')
129
130 # Create the day entry field.
131 self._dayCounterEntry = self.createcomponent('dayentryfield',
132 (('dayentry', 'dayentryfield_entry'),), None,
133 Pmw.EntryField, (frame,), validate='integer', entry_width = 2)
134 self._dayCounterEntry.grid(column = 2, row = 1, sticky = 'news')
135
136 # Create the hour entry field.
137 self._hourCounterEntry = self.createcomponent('hourentryfield',
138 (('hourentry', 'hourentryfield_entry'),), None,
139 Pmw.EntryField, (frame,), validate='integer', entry_width = 2)
140 self._hourCounterEntry.grid(column = 3, row = 1, sticky = 'news')
141
142 # Create the minute entry field.
143 self._minuteCounterEntry = self.createcomponent('minuteentryfield',
144 (('minuteentry', 'minuteentryfield_entry'),), None,
145 Pmw.EntryField, (frame,), validate='integer', entry_width = 2)
146 self._minuteCounterEntry.grid(column = 4, row = 1, sticky = 'news')
147
148 # Create the up arrow buttons.
149
150 # Create the year up arrow.
151 self._upYearArrowBtn = self.createcomponent('upyeararrow',
152 (), 'Arrow',
153 Tkinter.Canvas, (frame,),
154 width = 16, height = 16, relief = 'raised', borderwidth = 2)
155 self.arrowDirection[self._upYearArrowBtn] = 1
156 self._upYearArrowBtn.grid(column = 0, row = 0)
157
158 # Create the month up arrow.
159 self._upMonthArrowBtn = self.createcomponent('upmontharrow',
160 (), 'Arrow',
161 Tkinter.Canvas, (frame,),
162 width = 16, height = 16, relief = 'raised', borderwidth = 2)
163 self.arrowDirection[self._upMonthArrowBtn] = 1
164 self._upMonthArrowBtn.grid(column = 1, row = 0)
165
166 # Create the day up arrow.
167 self._upDayArrowBtn = self.createcomponent('updayarrow',
168 (), 'Arrow',
169 Tkinter.Canvas, (frame,),
170 width = 16, height = 16, relief = 'raised', borderwidth = 2)
171 self.arrowDirection[self._upDayArrowBtn] = 1
172 self._upDayArrowBtn.grid(column = 2, row = 0)
173
174 # Create the hour up arrow.
175 self._upHourArrowBtn = self.createcomponent('uphourarrow',
176 (), 'Arrow',
177 Tkinter.Canvas, (frame,),
178 width = 16, height = 16, relief = 'raised', borderwidth = 2)
179 self.arrowDirection[self._upHourArrowBtn] = 1
180 self._upHourArrowBtn.grid(column = 3, row = 0)
181
182 # Create the minute up arrow.
183 self._upMinuteArrowBtn = self.createcomponent('upminutearrow',
184 (), 'Arrow',
185 Tkinter.Canvas, (frame,),
186 width = 16, height = 16, relief = 'raised', borderwidth = 2)
187 self.arrowDirection[self._upMinuteArrowBtn] = 1
188 self._upMinuteArrowBtn.grid(column = 4, row = 0)
189
190 # Make it resize nicely.
191 padx = self['padx']
192 pady = self['pady']
193 for col in range(5): # YY, MM, DD, HH, mm
194 frame.grid_columnconfigure(col, weight = 1, pad = padx)
195 frame.grid_rowconfigure(0, pad = pady)
196 frame.grid_rowconfigure(2, pad = pady)
197
198 frame.grid_rowconfigure(1, weight = 1)
199
200 # Create the label.
201 self.createlabel(interior)
202
203 # Set bindings.
204
205 # Up year
206 self._upYearArrowBtn.bind('<Configure>',
207 lambda event, s=self,button=self._upYearArrowBtn:
208 s._drawArrow(button, 1))
209 self._upYearArrowBtn.bind('<1>',
210 lambda event, s=self,button=self._upYearArrowBtn:
211 s._countUp(button))
212 self._upYearArrowBtn.bind('<Any-ButtonRelease-1>',
213 lambda event, s=self, button=self._upYearArrowBtn:
214 s._stopUpDown(button))
215
216 # Up month
217 self._upMonthArrowBtn.bind('<Configure>',
218 lambda event, s=self,button=self._upMonthArrowBtn:
219 s._drawArrow(button, 1))
220 self._upMonthArrowBtn.bind('<1>',
221 lambda event, s=self,button=self._upMonthArrowBtn:
222 s._countUp(button))
223 self._upMonthArrowBtn.bind('<Any-ButtonRelease-1>',
224 lambda event, s=self, button=self._upMonthArrowBtn:
225 s._stopUpDown(button))
226
227 # Up day
228 self._upDayArrowBtn.bind('<Configure>',
229 lambda event, s=self,button=self._upDayArrowBtn:
230 s._drawArrow(button, 1))
231 self._upDayArrowBtn.bind('<1>',
232 lambda event, s=self,button=self._upDayArrowBtn:
233 s._countUp(button))
234 self._upDayArrowBtn.bind('<Any-ButtonRelease-1>',
235 lambda event, s=self, button=self._upDayArrowBtn:
236 s._stopUpDown(button))
237
238 # Up hour
239 self._upHourArrowBtn.bind('<Configure>',
240 lambda event, s=self,button=self._upHourArrowBtn:
241 s._drawArrow(button, 1))
242 self._upHourArrowBtn.bind('<1>',
243 lambda event, s=self,button=self._upHourArrowBtn:
244 s._countUp(button))
245 self._upHourArrowBtn.bind('<Any-ButtonRelease-1>',
246 lambda event, s=self, button=self._upHourArrowBtn:
247 s._stopUpDown(button))
248
249 # Up minute
250 self._upMinuteArrowBtn.bind('<Configure>',
251 lambda event, s=self,button=self._upMinuteArrowBtn:
252 s._drawArrow(button, 1))
253 self._upMinuteArrowBtn.bind('<1>',
254 lambda event, s=self,button=self._upMinuteArrowBtn:
255 s._countUp(button))
256 self._upMinuteArrowBtn.bind('<Any-ButtonRelease-1>',
257 lambda event, s=self, button=self._upMinuteArrowBtn:
258 s._stopUpDown(button))
259
260
261 # Down year
262 self._downYearArrowBtn.bind('<Configure>',
263 lambda event, s=self,button=self._downYearArrowBtn:
264 s._drawArrow(button, 0))
265 self._downYearArrowBtn.bind('<1>',
266 lambda event, s=self,button=self._downYearArrowBtn:
267 s._countDown(button))
268 self._downYearArrowBtn.bind('<Any-ButtonRelease-1>',
269 lambda event, s=self, button=self._downYearArrowBtn:
270 s._stopUpDown(button))
271
272 # Down month
273 self._downMonthArrowBtn.bind('<Configure>',
274 lambda event, s=self,button=self._downMonthArrowBtn:
275 s._drawArrow(button, 0))
276 self._downMonthArrowBtn.bind('<1>',
277 lambda event, s=self,button=self._downMonthArrowBtn:
278 s._countDown(button))
279 self._downMonthArrowBtn.bind('<Any-ButtonRelease-1>',
280 lambda event, s=self, button=self._downMonthArrowBtn:
281 s._stopUpDown(button))
282
283 # Down day
284 self._downDayArrowBtn.bind('<Configure>',
285 lambda event, s=self,button=self._downDayArrowBtn:
286 s._drawArrow(button, 0))
287 self._downDayArrowBtn.bind('<1>',
288 lambda event, s=self,button=self._downDayArrowBtn:
289 s._countDown(button))
290 self._downDayArrowBtn.bind('<Any-ButtonRelease-1>',
291 lambda event, s=self, button=self._downDayArrowBtn:
292 s._stopUpDown(button))
293
294 # Down hour
295 self._downHourArrowBtn.bind('<Configure>',
296 lambda event, s=self,button=self._downHourArrowBtn:
297 s._drawArrow(button, 0))
298 self._downHourArrowBtn.bind('<1>',
299 lambda event, s=self,button=self._downHourArrowBtn:
300 s._countDown(button))
301 self._downHourArrowBtn.bind('<Any-ButtonRelease-1>',
302 lambda event, s=self, button=self._downHourArrowBtn:
303 s._stopUpDown(button))
304
305 # Down minute
306 self._downMinuteArrowBtn.bind('<Configure>',
307 lambda event, s=self,button=self._downMinuteArrowBtn:
308 s._drawArrow(button, 0))
309 self._downMinuteArrowBtn.bind('<1>',
310 lambda event, s=self,button=self._downMinuteArrowBtn: s._countDown(button))
311 self._downMinuteArrowBtn.bind('<Any-ButtonRelease-1>',
312 lambda event, s=self, button=self._downMinuteArrowBtn:
313 s._stopUpDown(button))
314
315
316 self._yearCounterEntry.bind('<Return>', self.invoke)
317 self._monthCounterEntry.bind('<Return>', self.invoke)
318 self._dayCounterEntry.bind('<Return>', self.invoke)
319 self._hourCounterEntry.bind('<Return>', self.invoke)
320 self._minuteCounterEntry.bind('<Return>', self.invoke)
321
322 self._yearCounterEntry.bind('<Configure>', self._resizeArrow)
323 self._monthCounterEntry.bind('<Configure>', self._resizeArrow)
324 self._dayCounterEntry.bind('<Configure>', self._resizeArrow)
325 self._hourCounterEntry.bind('<Configure>', self._resizeArrow)
326 self._minuteCounterEntry.bind('<Configure>', self._resizeArrow)
327
328 def _drawArrow(self, arrow, direction):
329 arrow.delete('arrow')
330
331 fg = self._yearCounterEntry.cget('entry_foreground')
332
333 bw = (string.atoi(arrow['borderwidth']) +
334 string.atoi(arrow['highlightthickness'])) / 2
335 h = string.atoi(arrow['height']) + 2 * bw
336 w = string.atoi(arrow['width']) + 2 * bw
337
338 if direction == 0:
339 # down arrow
340 arrow.create_polygon(
341 0.25 * w + bw, 0.25 * h + bw,
342 0.50 * w + bw, 0.75 * h + bw,
343 0.75 * w + bw, 0.25 * h + bw,
344 fill=fg, tag='arrow')
345 else:
346 arrow.create_polygon(
347 0.25 * w + bw, 0.75 * h + bw,
348 0.50 * w + bw, 0.25 * h + bw,
349 0.75 * w + bw, 0.75 * h + bw,
350 fill=fg, tag='arrow')
351
352 def _resizeArrow(self, event = None):
353 for btn in (self._upYearArrowBtn, self._upMonthArrowBtn,
354 self._upDayArrowBtn, self._upHourArrowBtn,
355 self._upMinuteArrowBtn, self._downYearArrowBtn,
356 self._downMonthArrowBtn, self._downDayArrowBtn,
357 self._downHourArrowBtn, self._downMinuteArrowBtn):
358 bw = (string.atoi(btn['borderwidth']) + \
359 string.atoi(btn['highlightthickness']))
360 newHeight = self._yearCounterEntry.winfo_reqheight() - 2 * bw
361 newWidth = newHeight * self['buttonaspect']
362 btn.configure(width=newWidth, height=newHeight)
363 self._drawArrow(btn, self.arrowDirection[btn])
364
365 def _min(self):
366 self._minVal = None
367
368 def _max(self):
369 self._maxVal = None
370
371 def _setTimeFromStr(self, str):
372 list = string.split(str, ':')
373 if len(list) != 5:
374 raise ValueError, 'invalid value: ' + str
375
376 self._year = string.atoi(list[0])
377 self._month = string.atoi(list[1])
378 self._day = string.atoi(list[2])
379 self._hour = string.atoi(list[3])
380 self._minute = string.atoi(list[4])
381
382 self._setHMS()
383
384 def getstring(self):
385 return '%04d:%02d:%02d:%02d:%02d' % (self._year, self._month,
386 self._day, self._hour,
387 self._minute)
388
389 def getint(self):
390 pass
391
392 def _countUp(self, button):
393 self._relief = self._upYearArrowBtn.cget('relief')
394 button.configure(relief='sunken')
395 if button == self._upYearArrowBtn: datetype = "year"
396 elif button == self._upMonthArrowBtn: datetype = "month"
397 elif button == self._upDayArrowBtn: datetype = "day"
398 elif button == self._upHourArrowBtn: datetype = "hour"
399 elif button == self._upMinuteArrowBtn: datetype = "minute"
400 self._count(1, datetype, 'start')
401
402 def _countDown(self, button):
403 self._relief = self._downYearArrowBtn.cget('relief')
404 button.configure(relief='sunken')
405 if button == self._downYearArrowBtn: datetype = "year"
406 elif button == self._downMonthArrowBtn: datetype = "month"
407 elif button == self._downDayArrowBtn: datetype = "day"
408 elif button == self._downHourArrowBtn: datetype = "hour"
409 elif button == self._downMinuteArrowBtn: datetype = "minute"
410 self._count(-1, datetype, 'start')
411
412 def _count(self, factor, datetype, newFlag=None):
413 if newFlag != 'force':
414 if newFlag is not None:
415 self._flag = newFlag
416
417 if self._flag == 'stopped':
418 return
419
420 if datetype == "year": self._year = self._year + factor
421 elif datetype == "month": self._month = self._month + factor
422 elif datetype == "day": self._day = self._day + factor
423 elif datetype == "hour": self._hour = self._hour + factor
424 elif datetype == "minute": self._minute = self._minute + factor
425 secs = time.mktime((self._year, self._month, self._day, self._hour,
426 self._minute, 0, 0, 0, -1))
427 tt = time.localtime(secs) # NOT gmtime!
428
429 self._year = tt[0]
430 self._month = tt[1]
431 self._day = tt[2]
432 self._hour = tt[3]
433 self._minute = tt[4]
434 self._setHMS()
435
436 if newFlag != 'force':
437 if self['autorepeat']:
438 if self._flag == 'start':
439 delay = self['initwait']
440 self._flag = 'running'
441 else:
442 delay = self['repeatrate']
443 self._timerId = self.after(
444 delay, lambda self=self, factor=factor, datetype=datetype:
445 self._count(factor, datetype, 'running'))
446
447 def _setHMS(self):
448 self._yearCounterEntry.setentry('%04d' % self._year)
449 self._monthCounterEntry.setentry('%02d' % self._month)
450 self._dayCounterEntry.setentry('%02d' % self._day)
451 self._hourCounterEntry.setentry('%02d' % self._hour)
452 self._minuteCounterEntry.setentry('%02d' % self._minute)
453
454 def _stopUpDown(self, button):
455 if self._timerId is not None:
456 self.after_cancel(self._timerId)
457 self._timerId = None
458 button.configure(relief=self._relief)
459 self._flag = 'stopped'
460
461 def invoke(self, event = None):
462 cmd = self['command']
463 if callable(cmd):
464 cmd()
465
466 def destroy(self):
467 if self._timerId is not None:
468 self.after_cancel(self._timerId)
469 self._timerId = None
470 Pmw.MegaWidget.destroy(self)
471
472if __name__=="__main__":
473
474 def showString():
475 stringVal = _time.getstring()
476 print stringVal
477
478 root = Tkinter.Tk()
479 Pmw.initialise(root)
480 root.title('FullTimeCounter')
481
482 exitButton = Tkinter.Button(root, text = 'Exit', command = root.destroy)
483 exitButton.pack(side = 'bottom')
484
485 _time = FullTimeCounter(root,
486 labelpos = 'n',
487 label_text = 'YYYY:MM:DD:HH:mm')
488 _time.pack(fill = 'both', expand = 1, padx=10, pady=5)
489
490 button = Tkinter.Button(root, text = 'Show', command = showString)
491 button.pack()
492 root.mainloop()