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