]> git.saurik.com Git - wxWidgets.git/blame - wxPython/demo/wxCalendar.py
hopefully fixes focus assertion
[wxWidgets.git] / wxPython / demo / wxCalendar.py
CommitLineData
944930d5 1#----------------------------------------------------------------------------
f6bcfd97
BP
2# Name: wxCalendar.py
3# Purpose: Calendar control display testing on panel for wxPython demo
944930d5
RD
4#
5# Author: Lorne White (email: lwhite1@planet.eon.net)
6#
96bfd053 7# Version 0.9
49875c53 8# Date: Feb 26, 2001
944930d5
RD
9# Licence: wxWindows license
10#----------------------------------------------------------------------------
11
12from wxPython.wx import *
49875c53 13from wxPython.lib.calendar import wxCalendar, Month, PrtCalDraw, CalenDlg
944930d5 14
96bfd053 15import images
944930d5 16import os
944930d5
RD
17
18
19# highlighted days in month
20
21test_days ={ 0: [],
22 1: [3, 7, 9, 21],
23 2: [2, 10, 4, 9],
24 3: [4, 20, 29],
25 4: [1, 12, 22],
26 5: [2, 10, 15],
27 6: [4, 8, 17],
28 7: [6, 7, 8],
29 8: [5, 10, 20],
30 9: [1, 2, 5, 29],
31 10: [2, 4, 6, 22],
32 11: [6, 9, 12, 28, 29],
33 12: [8, 9, 10, 11, 20] }
34
35# test of full window calendar control functions
36
37def GetMonthList():
38 monthlist = []
39 for i in range(13):
40 name = Month[i]
41 if name != None:
42 monthlist.append(name)
43 return monthlist
44
45class TestPanel(wxPanel):
f6bcfd97 46 def __init__(self, parent, log, frame):
944930d5
RD
47 wxPanel.__init__(self, parent, -1)
48
49 self.log = log
f6bcfd97 50 self.frame = frame
944930d5 51
e0473f5f 52 self.calend = wxCalendar(self, -1, wxPoint(100, 50), wxSize(200, 180))
944930d5 53
49875c53
RD
54# start_month = 2 # preselect the date for calendar
55# start_year = 2001
56
57 start_month = self.calend.GetMonth() # get the current month & year
58 start_year = self.calend.GetYear()
944930d5
RD
59
60# month list from DateTime module
61
62 monthlist = GetMonthList()
63
49875c53
RD
64 mID = NewId()
65 self.date = wxComboBox(self, mID, Month[start_month], wxPoint(100, 20), wxSize(90, -1), monthlist, wxCB_DROPDOWN)
66 EVT_COMBOBOX(self, mID, self.EvtComboBox)
944930d5
RD
67
68# set start month and year
69
70 self.calend.SetMonth(start_month)
71 self.calend.SetYear(start_year)
72
73# set attributes of calendar
74
f6bcfd97 75 self.calend.hide_title = TRUE
944930d5 76 self.calend.HideGrid()
f6bcfd97 77 self.calend.SetWeekColor('WHITE', 'BLACK')
944930d5
RD
78
79# display routine
80
81 self.ResetDisplay()
82
83# mouse click event
84
85 self.Connect(self.calend.GetId(), -1, 2100, self.MouseClick)
86
87# scroll bar for month selection
88
49875c53
RD
89 mID = NewId()
90 self.scroll = wxScrollBar(self, mID, wxPoint(100, 240), wxSize(200, 20), wxSB_HORIZONTAL)
944930d5 91 self.scroll.SetScrollbar(start_month-1, 1, 12, 1, TRUE)
49875c53 92 EVT_COMMAND_SCROLL(self, mID, self.Scroll)
944930d5
RD
93
94# spin control for year selection
95
96 self.dtext = wxTextCtrl(self, -1, str(start_year), wxPoint(200, 20), wxSize(60, -1))
97 h = self.dtext.GetSize().height
98
49875c53
RD
99 mID = NewId()
100 self.spin = wxSpinButton(self, mID, wxPoint(270, 20), wxSize(h*2, h))
944930d5
RD
101 self.spin.SetRange(1980, 2010)
102 self.spin.SetValue(start_year)
49875c53 103 EVT_SPIN(self, mID, self.OnSpin)
944930d5
RD
104
105# button for calendar dialog test
106
f6bcfd97 107 wxStaticText(self, -1, "Test Calendar Dialog", wxPoint(350, 50), wxSize(150, -1))
944930d5 108
49875c53 109 mID = NewId()
96bfd053 110 bmp = images.getCalendarBitmap()
49875c53
RD
111 self.but = wxBitmapButton(self, mID, bmp, wxPoint(380, 80))#, wxSize(30, 30))
112 EVT_BUTTON(self, mID, self.TestDlg)
944930d5
RD
113
114# button for calendar window test
115
f6bcfd97 116 wxStaticText(self, -1, "Test Calendar Window", wxPoint(350, 150), wxSize(150, -1))
944930d5 117
49875c53 118 mID = NewId()
49875c53
RD
119 self.but = wxBitmapButton(self, mID, bmp, wxPoint(380, 180))#, wxSize(30, 30))
120 EVT_BUTTON(self, mID, self.TestFrame)
944930d5 121
f6bcfd97
BP
122 wxStaticText(self, -1, "Test Calendar Print", wxPoint(350, 250), wxSize(150, -1))
123
49875c53 124 mID = NewId()
49875c53
RD
125 self.but = wxBitmapButton(self, mID, bmp, wxPoint(380, 280))#, wxSize(30, 30))
126 EVT_BUTTON(self, mID, self.OnPreview)
f6bcfd97 127
944930d5
RD
128# calendar dialog
129
49875c53
RD
130 def TestDlg(self, event): # test the date dialog
131 dlg = CalenDlg(self)
944930d5 132 dlg.Centre()
49875c53
RD
133 if dlg.ShowModal() == wxID_OK:
134 result = dlg.result
135 day = result[1]
136 month = result[2]
137 year = result[3]
138 new_date = str(month) + '/'+ str(day) + '/'+ str(year)
139 self.log.WriteText('Date Selected: %s\n' % new_date)
140 else:
141 self.log.WriteText('No Date Selected')
944930d5
RD
142
143# calendar window test
144
145 def TestFrame(self, event):
e0473f5f 146 frame = CalendFrame(self, -1, "Test Calendar", self.log)
944930d5 147 frame.Show(true)
944930d5
RD
148 return true
149
f6bcfd97
BP
150# calendar print preview
151
152 def OnPreview(self, event):
153 month = self.calend.GetMonth()
154 year = self.calend.GetYear()
155
156 prt = PrintCalend(self.frame, month, year)
157 prt.Preview()
158
944930d5
RD
159# month and year control events
160
161 def OnSpin(self, event):
162 year = event.GetPosition()
163 self.dtext.SetValue(str(year))
164 self.calend.SetYear(year)
165 self.calend.Refresh()
166
167 def EvtComboBox(self, event):
168 name = event.GetString()
169 self.log.WriteText('EvtComboBox: %s\n' % name)
170 monthval = self.date.FindString(name)
171 self.scroll.SetScrollbar(monthval, 1, 12, 1, TRUE)
172
173 self.calend.SetMonth(monthval+1)
174 self.ResetDisplay()
175
176 def Scroll(self, event):
177 value = self.scroll.GetThumbPosition()
178 monthval = int(value)+1
179 self.calend.SetMonth(monthval)
180 self.ResetDisplay()
181 self.log.WriteText('Month: %s\n' % value)
182
183 name = Month[monthval]
184 self.date.SetValue(name)
185
186# log mouse events
187
188 def MouseClick(self, evt):
189 text = '%s CLICK %02d/%02d/%d' % (evt.click, evt.day, evt.month, evt.year) # format date
190 self.log.WriteText('Date Selected: ' + text + '\n')
191
944930d5
RD
192
193# set the highlighted days for the calendar
194
195 def ResetDisplay(self):
196 month = self.calend.GetMonth()
197 try:
198 set_days = test_days[month]
199 except:
200 set_days = [1, 5, 12]
201
f6bcfd97 202 self.calend.AddSelect([4, 11], 'BLUE', 'WHITE')
944930d5
RD
203 self.calend.SetSelDay(set_days)
204 self.calend.Refresh()
205
206# increment and decrement toolbar controls
207
208 def OnIncYear(self, event):
209 self.calend.IncYear()
210 self.ResetDisplay()
211
212 def OnDecYear(self, event):
213 self.calend.DecYear()
214 self.ResetDisplay()
215
216 def OnIncMonth(self, event):
217 self.calend.IncMonth()
218 self.ResetDisplay()
219
220 def OnDecMonth(self, event):
221 self.calend.DecMonth()
222 self.ResetDisplay()
223
224 def OnCurrent(self, event):
225 self.calend.SetCurrentDay()
226 self.ResetDisplay()
227
944930d5
RD
228# test of full window calendar control functions
229
230class CalendFrame(wxFrame):
231 def __init__(self, parent, id, title, log):
232 wxFrame.__init__(self, parent, id, title, wxPyDefaultPosition, wxSize(400, 400))
f6bcfd97 233 EVT_CLOSE(self, self.OnCloseWindow)
944930d5
RD
234
235 self.log = log
236 self.CreateStatusBar()
237 self.mainmenu = wxMenuBar()
238 menu = wxMenu()
239
240 menu = self.MakeFileMenu()
241 self.mainmenu.Append(menu, '&File')
242
243 self.MakeToolMenu() # toolbar
244
245 self.SetMenuBar(self.mainmenu)
e0473f5f 246 self.calend = wxCalendar(self, -1)
944930d5
RD
247 self.calend.SetCurrentDay()
248 self.calend.grid_color = 'BLUE'
f6bcfd97
BP
249 self.calend.SetBusType()
250# self.calend.ShowWeekEnd()
251
944930d5
RD
252 self.ResetDisplay()
253
254 self.Connect(self.calend.GetId(), -1, 2100, self.MouseClick)
255
256 def MouseClick(self, evt):
257 text = '%s CLICK %02d/%02d/%d' % (evt.click, evt.day, evt.month, evt.year) # format date
258 self.log.WriteText('Date Selected: ' + text + '\n')
259
260 def OnCloseWindow(self, event):
261 self.Destroy()
262
263 def ResetDisplay(self):
264 month = self.calend.GetMonth()
265 try:
266 set_days = test_days[month]
267 except:
268 set_days = [1, 5, 12]
269
f6bcfd97
BP
270 self.calend.AddSelect([2, 16], 'GREEN', 'WHITE')
271
944930d5
RD
272 self.calend.SetSelDay(set_days)
273 self.calend.Refresh()
274
275 def OnIncYear(self, event):
276 self.calend.IncYear()
277 self.ResetDisplay()
278
279 def OnDecYear(self, event):
280 self.calend.DecYear()
281 self.ResetDisplay()
282
283 def OnIncMonth(self, event):
284 self.calend.IncMonth()
285 self.ResetDisplay()
286
287 def OnDecMonth(self, event):
288 self.calend.DecMonth()
289 self.ResetDisplay()
290
291 def OnCurrent(self, event):
292 self.calend.SetCurrentDay()
293 self.ResetDisplay()
294
295 def MakeFileMenu(self):
296 menu = wxMenu()
297
298 mID = NewId()
299 menu.Append(mID, 'Decrement', 'Next')
300 EVT_MENU(self, mID, self.OnDecMonth)
301
302 mID = NewId()
303 menu.Append(mID, 'Increment', 'Dec')
304 EVT_MENU(self, mID, self.OnIncMonth)
305
306 menu.AppendSeparator()
307
308 mID = NewId()
309 menu.Append(mID, 'E&xit', 'Exit')
310 EVT_MENU(self, mID, self.OnCloseWindow)
311
312 return menu
313
314 def MakeToolMenu(self):
315 tb = self.CreateToolBar(wxTB_HORIZONTAL|wxNO_BORDER)
316
49875c53 317 mID = NewId()
96bfd053 318 SetToolPath(self, tb, mID, images.getDbDecBitmap(), 'Dec Year')
49875c53 319 EVT_TOOL(self, mID, self.OnDecYear)
944930d5 320
49875c53 321 mID = NewId()
96bfd053 322 SetToolPath(self, tb, mID, images.getDecBitmap(), 'Dec Month')
49875c53 323 EVT_TOOL(self, mID, self.OnDecMonth)
944930d5 324
49875c53 325 mID = NewId()
96bfd053 326 SetToolPath(self, tb, mID, images.getPtBitmap(), 'Current Month')
49875c53
RD
327 EVT_TOOL(self, mID, self.OnCurrent)
328
329 mID = NewId()
96bfd053 330 SetToolPath(self, tb, mID, images.getIncBitmap(), 'Inc Month')
49875c53 331 EVT_TOOL(self, mID, self.OnIncMonth)
944930d5 332
49875c53 333 mID = NewId()
96bfd053 334 SetToolPath(self, tb, mID, images.getDbIncBitmap(), 'Inc Year')
49875c53 335 EVT_TOOL(self, mID, self.OnIncYear)
944930d5
RD
336
337 tb.Realize()
338
f6bcfd97
BP
339#---------------------------------------------------------------------------
340
341# example class for printing/previewing calendars
342
343class PrintCalend:
344 def __init__(self, parent, month, year):
345 self.frame = parent
346 self.month = month
347 self.year = year
348
349 self.SetParms()
350 self.SetCal()
351 self.printData = wxPrintData()
352
353 def SetCal(self):
354 self.grid_color = 'BLUE'
355 self.back_color = 'WHITE'
356 self.sel_color = 'RED'
357 self.high_color = 'LIGHT BLUE'
358 self.font = wxSWISS
359 self.bold = wxNORMAL
360
361 self.sel_key = None # last used by
362 self.sel_lst = [] # highlighted selected days
363
364 self.size = None
365 self.hide_title = FALSE
366 self.hide_grid = FALSE
367 self.set_day = None
368
369 def SetParms(self):
370 self.ymax = 1
371 self.xmax = 1
372 self.page = 1
373 self.total_pg = 1
374
375 self.preview = None
376 self.scale = 1.0
377
378 self.pagew = 8.5
379 self.pageh = 11.0
380
381 self.txt_marg = 0.1
382 self.lf_marg = 0
383 self.top_marg = 0
384
385 self.page = 0
386
387 def SetDates(self, month, year):
388 self.month = month
389 self.year = year
390
391 def SetStyleDef(self, desc):
392 self.style = desc
393
394 def SetCopies(self, copies): # number of copies of label
395 self.copies = copies
396
397 def SetStart(self, start): # start position of label
398 self.start = start
399
400 def Preview(self):
401 printout = SetPrintout(self)
402 printout2 = SetPrintout(self)
403 self.preview = wxPrintPreview(printout, printout2, self.printData)
404 if not self.preview.Ok():
405 wxMessageBox("There was a problem printing!", "Printing", wxOK)
406 return
407
408 self.preview.SetZoom(60) # initial zoom value
409
410 frame = wxPreviewFrame(self.preview, self.frame, "Print preview")
411
412 frame.Initialize()
413 frame.SetPosition(self.frame.GetPosition())
414 frame.SetSize(self.frame.GetSize())
415 frame.Show(true)
416
417 def Print(self):
418 pdd = wxPrintDialogData()
419 pdd.SetPrintData(self.printData)
420 printer = wxPrinter(pdd)
421 printout = SetPrintout(self)
493f1553 422 frame = wxFrame(None, -1, "Test")
f6bcfd97
BP
423 if not printer.Print(frame, printout):
424 wxMessageBox("There was a problem printing.\nPerhaps your current printer is not set correctly?", "Printing", wxOK)
425 else:
426 self.printData = printer.GetPrintDialogData().GetPrintData()
427 printout.Destroy()
428
429 def DoDrawing(self, DC):
430 size = DC.GetSizeTuple()
431 DC.BeginDrawing()
432
433 cal = PrtCalDraw(self)
434
435 if self.preview is None:
436 cal.SetPSize(size[0]/self.pagew, size[1]/self.pageh)
437 cal.SetPreview(FALSE)
438
439 else:
440 if self.preview == 1:
441 cal.SetPSize(size[0]/self.pagew, size[1]/self.pageh)
442 else:
443 cal.SetPSize(self.pwidth, self.pheight)
444
445 cal.SetPreview(self.preview)
446
447 cal.hide_title = self.hide_title # set the calendar parameters
448 cal.hide_grid = self.hide_grid
449
450 cal.grid_color = self.grid_color
451 cal.high_color = self.high_color
452 cal.back_color = self.back_color
453 cal.outer_border = FALSE
454 cal.font = self.font
455 cal.bold = self.bold
456
457 cal_size = wxSize(3.0, 3.0)
458 cal.SetSize(cal_size)
459
460 year, month = self.year, self.month
461
462 x = 1.0
463 for i in range(2):
464 y = 0.5
465 for j in range(3):
466 cal.SetCal(year, month) # current month
467 cal.SetPos(x, y)
468
469 try:
470 set_days = test_days[month]
471 except:
472 set_days = [1, 5, 12]
473
474 cal.AddSelect([2, 16], 'GREEN', 'WHITE')
475
476 cal.DrawCal(DC, set_days)
477
478 year, month = self.IncMonth(year, month)
479 y = y + 3.5
480 x = x + 4.0 # next colum
481
482 DC.EndDrawing()
483
484 self.ymax = DC.MaxY()
485 self.xmax = DC.MaxX()
486
487 def IncMonth(self, year, month): # next month
488 month = month + 1
489 if month > 12:
490 month = 1
491 year = year + 1
492
493 return year, month
494
495 def GetTotalPages(self):
496 self.pg_cnt = 1
497 return self.pg_cnt
498
499 def SetPage(self, page):
500 self.page = page
501
502 def SetPageSize(self, width, height):
503 self.pwidth, self.pheight = width, height
504
505 def SetTotalSize(self, width, height):
506 self.ptwidth, self.ptheight = width, height
507
508 def SetPreview(self, preview, scale):
509 self.preview = preview
510 self.scale = scale
511
512 def SetTotalSize(self, width, height):
513 self.ptwidth = width
514 self.ptheight = height
515
944930d5 516def SetToolPath(self, tb, id, bmp, title):
96bfd053 517 tb.AddSimpleTool(id, bmp, title, title)
944930d5 518
f6bcfd97
BP
519class SetPrintout(wxPrintout):
520 def __init__(self, canvas):
521 wxPrintout.__init__(self)
522 self.canvas = canvas
523 self.end_pg = 1
524
525 def OnBeginDocument(self, start, end):
526 return self.base_OnBeginDocument(start, end)
527
528 def OnEndDocument(self):
529 self.base_OnEndDocument()
530
531 def HasPage(self, page):
532 if page <= self.end_pg:
533 return true
534 else:
535 return false
536
537 def GetPageInfo(self):
538 self.end_pg = self.canvas.GetTotalPages()
539 str_pg = 1
540 try:
541 end_pg = self.end_pg
542 except:
543 end_pg = 1
544 return (str_pg, end_pg, str_pg, end_pg)
545
546 def OnPreparePrinting(self):
547 self.base_OnPreparePrinting()
548
549 def OnBeginPrinting(self):
550 dc = self.GetDC()
551
552 self.preview = self.IsPreview()
553 if (self.preview):
554 self.pixelsPerInch = self.GetPPIScreen()
555 else:
556 self.pixelsPerInch = self.GetPPIPrinter()
557
558 (w, h) = dc.GetSizeTuple()
559 scaleX = float(w) / 1000
560 scaleY = float(h) / 1000
561 self.printUserScale = min(scaleX, scaleY)
562
563 self.base_OnBeginPrinting()
564
565 def GetSize(self):
566 self.psizew, self.psizeh = self.GetPPIPrinter()
567 return self.psizew, self.psizeh
568
569 def GetTotalSize(self):
570 self.ptsizew, self.ptsizeh = self.GetPageSizePixels()
571 return self.ptsizew, self.ptsizeh
572
573 def OnPrintPage(self, page):
574 dc = self.GetDC()
575 (w, h) = dc.GetSizeTuple()
576 scaleX = float(w) / 1000
577 scaleY = float(h) / 1000
578 self.printUserScale = min(scaleX, scaleY)
579 dc.SetUserScale(self.printUserScale, self.printUserScale)
580
581 self.preview = self.IsPreview()
582
583 self.canvas.SetPreview(self.preview, self.printUserScale)
584 self.canvas.SetPage(page)
585
586 self.ptsizew, self.ptsizeh = self.GetPageSizePixels()
587 self.canvas.SetTotalSize(self.ptsizew, self.ptsizeh)
588
589 self.psizew, self.psizeh = self.GetPPIPrinter()
590 self.canvas.SetPageSize(self.psizew, self.psizeh)
591
592 self.canvas.DoDrawing(dc)
593 return true
e0473f5f 594
944930d5
RD
595class MyApp(wxApp):
596 def OnInit(self):
493f1553 597 frame = CalendFrame(None, -1, "Test Calendar")
944930d5
RD
598 frame.Show(true)
599 self.SetTopWindow(frame)
600 return true
601
602#---------------------------------------------------------------------------
603
604def MessageDlg(self, message, type = 'Message'):
605 dlg = wxMessageDialog(self, message, type, wxOK | wxICON_INFORMATION)
606 dlg.ShowModal()
607 dlg.Destroy()
608
609#---------------------------------------------------------------------------
610
611def main():
612 app = MyApp(0)
613 app.MainLoop()
614
615
616if __name__ == '__main__':
617 main()
618
619
620#---------------------------------------------------------------------------
621
622def runTest(frame, nb, log):
f6bcfd97 623 win = TestPanel(nb, log, frame)
944930d5
RD
624 return win
625
626#---------------------------------------------------------------------------
627
628
629overview = """\
f6bcfd97
BP
630This control provides a calendar control class for displaying and selecting dates. In addition, the class is extended and can now be used for printing/previewing.
631
632Additional features include weekend highlighting and business type Monday-Sunday format.
944930d5 633
f6bcfd97 634See example for various methods used to set display month, year, and highlighted dates (different font and background colours).
944930d5
RD
635
636by Lorne White
637
638"""