1
2
3
4
5
6
7
8
9
10 "Common stuff for the Calendar Import functions"
11
12
13 from __future__ import with_statement
14 import calendar
15 import copy
16 import datetime
17 import sys
18
19
20 import wx
21 import wx.calendar
22 import wx.lib.mixins.listctrl as listmix
23
24
25 import database
26 import guihelper
27 import guiwidgets
28 import pubsub
29
30 no_end_date=(4000, 1, 1, 0, 0)
31
33 if v is None:
34 return ''
35 return v
36
38 try:
39 if v[0]>=no_end_date[0]:
40
41 if dict.get('allday', False):
42 return ''
43 else:
44 return '%02d:%02d'%v[3:]
45
46 if dict.get('allday', False):
47 return '%04d-%02d-%02d'%v[:3]
48 else:
49 return '%04d-%02d-%02d %02d:%02d'% v
50 except (ValueError, TypeError):
51 return ''
52 except:
53 if __debug__: raise
54 return ''
55
57 try:
58 if dict.get('alarm', False):
59 v=dict.get('alarm_value', 0)
60 if v:
61 return '-%d min'%v
62 else:
63 return 'Ontime'
64 else:
65 return ''
66 except (ValueError, TypeError):
67 return ''
68 except:
69 if __debug__: raise
70 return ''
71
73 try:
74 s=''
75 for d in v:
76 if len(d):
77 if len(s):
78 s+=', '+d
79 else:
80 s=d
81 return s
82 except (ValueError, TypeError):
83 return ''
84 except:
85 if __debug__: raise
86 return ''
87
88
90
91
92
93 message_str='Select the source'
94 wildcard='*.*'
95
98
99 - def browse(self, parent=None):
105
107
108 return self._source
109
111
112 return self._source or ''
113
115
116
117 return self.name()
119
120
121 self._source=id
122 id=property(fget=_get_id, fset=_set_id)
123
124
126 ID_ADD=wx.NewId()
127 ID_MERGE=wx.NewId()
128
129 - def __init__(self, parent, id, title, col_labels, data={},
130 config_name=None,
131 style=wx.CAPTION|wx.MAXIMIZE_BOX| \
132 wx.SYSTEM_MENU|wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER):
133
134 wx.Dialog.__init__(self, parent, id=id, title=title, style=style)
135
136 self.__col_labels=col_labels
137 self.__config_name=config_name
138 self.itemDataMap={}
139
140 main_bs=wx.BoxSizer(wx.VERTICAL)
141
142 self.getcontrols(main_bs)
143
144 self.__list=wx.ListView(self, wx.NewId())
145 self.__image_list=wx.ImageList(16, 16)
146 self.__ig_up=self.__image_list.Add(wx.ArtProvider_GetBitmap(wx.ART_GO_UP,
147 wx.ART_OTHER,
148 (16, 16)))
149 self.__ig_dn=self.__image_list.Add(wx.ArtProvider_GetBitmap(wx.ART_GO_DOWN,
150 wx.ART_OTHER,
151 (16, 16)))
152 self.__list.SetImageList(self.__image_list, wx.IMAGE_LIST_SMALL)
153 li=wx.ListItem()
154 li.m_mask=wx.LIST_MASK_TEXT | wx.LIST_MASK_IMAGE
155 li.m_image=-1
156 for i, d in enumerate(self.__col_labels):
157
158 li.m_text=d[1]
159 self.__list.InsertColumnInfo(i, li)
160 self.__list.SetColumnWidth(i, d[2])
161 main_bs.Add(self.__list, 1, wx.EXPAND, 0)
162 self.populate(data)
163
164 listmix.ColumnSorterMixin.__init__(self, len(col_labels))
165
166 self.getpostcontrols(main_bs)
167
168
169 self.SetSizer(main_bs)
170 self.SetAutoLayout(True)
171 main_bs.Fit(self)
172
173 if config_name is not None:
174 guiwidgets.set_size(config_name, self)
175 wx.EVT_SIZE(self, self.__save_size)
176
181
182 - def getpostcontrols(self, main_bs):
183
184
185 main_bs.Add(wx.StaticLine(self, -1), 0, wx.EXPAND|wx.TOP|wx.BOTTOM, 5)
186 main_bs.Add(self.CreateButtonSizer(wx.OK|wx.CANCEL), 0, wx.ALIGN_CENTRE|wx.ALL, 5)
187
189 self.__list.DeleteAllItems()
190 m={}
191 m_count=0
192 for k in data:
193 try:
194 d=data[k]
195 col_idx=None
196 mm={}
197 for i, l in enumerate(self.__col_labels):
198 entry=d.get(l[0], None)
199 s=''
200 if l[3] is None:
201 s=str(entry)
202 else:
203 s=l[3](d, entry)
204 mm[i]=s
205 if i:
206 self.__list.SetStringItem(col_idx, i, s)
207 else:
208 col_idx=self.__list.InsertImageStringItem(sys.maxint, s, -1)
209 self.__list.SetItemData(col_idx, m_count)
210 m[m_count]=mm
211 m_count += 1
212 except:
213
214 if __debug__: raise
215 self.itemDataMap=m
216
219
221 return (self.__ig_dn, self.__ig_up)
222
224 if self.__config_name is not None:
225 guiwidgets.save_size(self.__config_name, self.GetRect())
226 evt.Skip()
227
228
230 _knownproperties=['rpt_events', 'no_alarm', 'alarm_override',
231 'ringtone', 'vibrate', 'alarm_value',
232 'preset_date' ]
233 _knownlistproperties=database.basedataobject._knownlistproperties.copy()
234 _knownlistproperties.update( {'categories': ['category'],
235 'start': ['year', 'month', 'day'],
236 'end': ['year', 'month', 'day'] })
240
241 filterobjectfactory=database.dataobjectfactory(FilterDataObject)
242
244 unnamed="Select:"
245 - def __init__(self, parent, id, caption, categories, style=wx.DEFAULT_DIALOG_STYLE):
246 wx.Dialog.__init__(self, parent, id,
247 title=caption, style=style)
248
249 bs=wx.BoxSizer(wx.VERTICAL)
250
251 main_fgs=wx.FlexGridSizer(0, 1, 0, 0)
252 fgs=wx.FlexGridSizer(3, 2, 0, 5)
253 fgs1=wx.FlexGridSizer(0, 1, 0, 0)
254 fgs2=wx.FlexGridSizer(0, 2, 0, 5)
255
256 self.SetDateControls(fgs, fgs1)
257
258 self._rpt_chkbox=wx.CheckBox(self, id=wx.NewId(), label='Repeat Events:',
259 style=wx.ALIGN_RIGHT)
260 self._rpt_chkbox.Disable()
261 fgs.Add(self._rpt_chkbox, 0, wx.ALIGN_RIGHT|wx.TOP|wx.BOTTOM, 5)
262 self._rpt_chkbox_text=wx.StaticText(self, -1, 'Import as multi-single events.')
263 fgs.Add(self._rpt_chkbox_text, 0, wx.ALIGN_LEFT|wx.ALIGN_CENTRE, 0)
264 self._rpt_chkbox_text.Disable()
265
266 choices=('Disable All Alarms', 'Use Alarm Settings From Calender',
267 'Set Alarm On All Events')
268 self.__alarm_setting = wx.RadioBox(self, id=wx.NewId(),
269 label="Select Alarm Settings For Imported Events",
270 choices=choices,
271 majorDimension=1,
272 size=(280,-1))
273 fgs1.Add(self.__alarm_setting, 0, wx.ALIGN_CENTRE|wx.TOP|wx.BOTTOM, 5)
274
275 self.__vibrate=wx.CheckBox(self, id=wx.NewId(), label='Alarm Vibrate:',
276 style=wx.ALIGN_RIGHT)
277 fgs2.Add(self.__vibrate, 0, wx.ALIGN_RIGHT|wx.TOP|wx.BOTTOM, 5)
278 self.__vibrate_text=wx.StaticText(self, -1, 'Enable vibrate for alarms.')
279 fgs2.Add(self.__vibrate_text, 0, wx.ALIGN_LEFT|wx.TOP|wx.BOTTOM, 5)
280
281 self.__ringtone_text=wx.StaticText(self, -1, 'Alarm Ringtone:')
282 fgs2.Add(self.__ringtone_text, 0, wx.ALIGN_RIGHT|wx.TOP|wx.BOTTOM, 5)
283 self.__ringtone=wx.ComboBox(self, id=wx.NewId(),
284 style=wx.CB_DROPDOWN|wx.CB_READONLY,
285 choices=[self.unnamed], size=(160,-1))
286 fgs2.Add(self.__ringtone, 0, wx.ALIGN_LEFT|wx.TOP|wx.BOTTOM, 2)
287
288 self.__alarm_value_text=wx.StaticText(self, -1, 'Alert before (mins):')
289 fgs2.Add(self.__alarm_value_text, 0, wx.ALIGN_RIGHT|wx.TOP|wx.BOTTOM, 5)
290 self.__alarm_value=wx.lib.intctrl.IntCtrl(self, id=wx.NewId(), size=(50,-1),
291 value=0, min=0, max=1000)
292 fgs2.Add( self.__alarm_value, 0, wx.ALIGN_LEFT|wx.TOP|wx.BOTTOM, 2)
293
294 self.__cat_chkbox=wx.CheckBox(self, id=wx.NewId(), label='Categories:',
295 style=wx.ALIGN_RIGHT)
296 fgs2.Add(self.__cat_chkbox, 0, wx.ALIGN_RIGHT|wx.TOP|wx.BOTTOM, 5)
297 for i,c in enumerate(categories):
298 if not len(c):
299 categories[i]='<None>'
300 self.__cats=wx.CheckListBox(self, choices=categories, size=(160, 50))
301 self.__cats.Disable()
302 fgs2.Add(self.__cats, 0, wx.ALIGN_LEFT, 0)
303 main_fgs.Add(fgs, 1, wx.EXPAND|wx.ALL, 0)
304 main_fgs.Add(fgs1, 1, wx.EXPAND|wx.ALL, 0)
305 main_fgs.Add(fgs2, 1, wx.EXPAND|wx.ALL, 0)
306 bs.Add(main_fgs, 1, wx.EXPAND|wx.ALL, 5)
307
308 bs.Add(wx.StaticLine(self, -1), 0, wx.EXPAND|wx.TOP|wx.BOTTOM, 5)
309 bs.Add(self.CreateButtonSizer(wx.OK|wx.CANCEL), 0, wx.ALIGN_CENTRE|wx.ALL, 5)
310
311 wx.EVT_CHECKBOX(self, self._start_date_chkbox.GetId(), self.OnCheckBox)
312 wx.EVT_CHECKBOX(self, self._end_date_chkbox.GetId(), self.OnCheckBox)
313 wx.EVT_CHECKBOX(self, self.__cat_chkbox.GetId(), self.OnCheckBox)
314 wx.EVT_RADIOBOX(self, self.__alarm_setting.GetId(), self.OnAlarmSetting)
315
316 pubsub.subscribe(self.OnRingtoneUpdates, pubsub.ALL_RINGTONES)
317
318 self.SetSizer(bs)
319 self.SetAutoLayout(True)
320 bs.Fit(self)
321
324
329
331 "Receives pubsub message with ringtone list"
332 tones=msg.data[:]
333
334 try:
335 self.__ringtone.Clear()
336 self.__ringtone.Append(self.unnamed)
337 for p in tones:
338 self.__ringtone.Append(p)
339 rt=self.__ringtone.SetStringSelection(self.ringtone)
340 except:
341 self.ringtone=self.unnamed
342
344 if data is None:
345 chk_box.SetValue(False)
346 c.Disable()
347 else:
348 chk_box.SetValue(True)
349 c.Enable()
350 for i,d in enumerate(data):
351 if not len(d):
352 data[i]='<None>'
353 for i in range(c.GetCount()):
354 c.Check(i, c.GetString(i) in data)
355
357 if self._start_date_chkbox.GetValue() and\
358 self._end_date_chkbox.GetValue():
359 self._rpt_chkbox.Enable()
360 self._rpt_chkbox_text.Enable()
361 self._rpt_chkbox.SetValue(data)
362 else:
363 self._rpt_chkbox.SetValue(False)
364 self._rpt_chkbox.Disable()
365 self._rpt_chkbox_text.Disable()
366
368 if value==0:
369 self.__vibrate.Disable()
370 self.__alarm_value.Disable()
371 self.__ringtone.Disable()
372 self.__vibrate_text.Disable()
373 self.__alarm_value_text.Disable()
374 self.__ringtone_text.Disable()
375 elif value==1:
376 self.__vibrate.Enable()
377 self.__alarm_value.Disable()
378 self.__ringtone.Enable()
379 self.__vibrate_text.Enable()
380 self.__alarm_value_text.Disable()
381 self.__ringtone_text.Enable()
382 else:
383 self.__vibrate.Enable()
384 self.__alarm_value.Enable()
385 self.__ringtone.Enable()
386 self.__vibrate_text.Enable()
387 self.__alarm_value_text.Enable()
388 self.__ringtone_text.Enable()
389
411
413 r['rpt_events']=self._rpt_chkbox.GetValue()
414 value=self.__alarm_setting.GetSelection()
415 if value==0:
416 r['no_alarm']=True
417 r['alarm_override']=False
418 elif value==1:
419 r['no_alarm']=False
420 r['alarm_override']=False
421 else:
422 r['no_alarm']=False
423 r['alarm_override']=True
424 r['ringtone']=self.__ringtone.GetStringSelection()
425 r['vibrate']=self.__vibrate.GetValue()
426 r['alarm_value']=self.__alarm_value.GetValue()
427 if self.__cat_chkbox.GetValue():
428 c=[]
429 for i in range(self.__cats.GetCount()):
430 if self.__cats.IsChecked(i):
431 s=self.__cats.GetString(i)
432 if s=='<None>':
433 c.append('')
434 else:
435 c.append(s)
436 r['categories']=c
437 else:
438 r['categories']=None
439 return
440
443
445 if on:
446 self._rpt_chkbox.Enable()
447 self._rpt_chkbox_text.Enable()
448 else:
449 self._rpt_chkbox.SetValue(False)
450 self._rpt_chkbox.Disable()
451 self._rpt_chkbox_text.Disable()
452
454 evt_id=evt.GetId()
455 if evt_id==self._start_date_chkbox.GetId():
456 w1,w2=self._start_date_chkbox, self._start_date
457 elif evt_id==self._end_date_chkbox.GetId():
458 w1,w2=self._end_date_chkbox, self._end_date
459 else:
460 w1,w2=self.__cat_chkbox, self.__cats
461 if w1.GetValue():
462 w2.Enable()
463 else:
464 w2.Disable()
465
466
467 self._repeat_option(self._start_date_chkbox.GetValue() and \
468 self._end_date_chkbox.GetValue())
469
470
472 - def __init__(self, parent, id, caption, categories, style=wx.DEFAULT_DIALOG_STYLE):
475
477 _db_data=self.GetParent().GetParent().GetActiveDatabase().getmajordictvalues('calendar_filter',
478 filterobjectfactory)
479 _data={}
480 _data.update(_db_data.get('filter', {}))
481 if _data.has_key('categories'):
482 _cat=[x['category'] for x in _data['categories']]
483 del _data['categories']
484 _data['categories']=_cat
485 if _data.has_key('start'):
486 _d0=_data['start'][0]
487 _date=(_d0['year'], _d0['month'], _d0['day'])
488 del _data['start']
489 _data['start']=_date
490 if _data.has_key('end'):
491 _d0=_data['end'][0]
492 _date=(_d0['year'], _d0['month'], _d0['day'])
493 del _data['end']
494 _data['end']=_date
495 self.set(_data)
496
498 _data=copy.deepcopy(data, {})
499 del _data['categories']
500 if data.has_key('categories') and data['categories']:
501 _cat=[{'category': x} for x in data['categories'] ]
502 _data['categories']=_cat
503 del _data['start']
504 if data.has_key('start') and data['start']:
505 _date=[{'year': data['start'][0], 'month': data['start'][1],
506 'day': data['start'][2] }]
507 _data['start']=_date
508 del _data['end']
509 if data.has_key('end') and data['end']:
510 _date=[{'year': data['end'][0], 'month': data['end'][1],
511 'day': data['end'][2] }]
512 _data['end']=_date
513 _dict={ 'filter': _data }
514 database.ensurerecordtype(_dict, filterobjectfactory)
515 self.GetParent().GetParent().GetActiveDatabase().savemajordict('calendar_filter',
516 _dict)
517
519 self._start_date_chkbox=wx.CheckBox(self, id=wx.NewId(),
520 label='Start Date:',
521 style=wx.ALIGN_RIGHT)
522 fgs.Add(self._start_date_chkbox, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTRE_VERTICAL, 0)
523 self._start_date=wx.calendar.CalendarCtrl(self, -1, wx.DateTime_Now(),
524 style = wx.calendar.CAL_SUNDAY_FIRST
525 | wx.calendar.CAL_SEQUENTIAL_MONTH_SELECTION)
526 self._start_date.Disable()
527 fgs.Add(self._start_date, 1, wx.ALIGN_LEFT, 5)
528 self._end_date_chkbox=wx.CheckBox(self, id=wx.NewId(),
529 label='End Date:',
530 style=wx.ALIGN_RIGHT)
531 fgs.Add(self._end_date_chkbox, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTRE_VERTICAL, 0)
532 self._end_date=wx.calendar.CalendarCtrl(self, -1, wx.DateTime_Now(),
533 style = wx.calendar.CAL_SUNDAY_FIRST
534 | wx.calendar.CAL_SEQUENTIAL_MONTH_SELECTION)
535 self._end_date.Disable()
536 fgs.Add(self._end_date, 1, wx.ALIGN_LEFT, 5)
537 self._preset_date_chkbox=wx.CheckBox(self, -1, label='Preset Duration',
538 style=wx.ALIGN_RIGHT)
539 fgs.Add(self._preset_date_chkbox, 0,
540 wx.ALIGN_RIGHT|wx.ALIGN_CENTRE_VERTICAL, 0)
541 self._preset_date=wx.Choice(self, -1, choices=('This Week',
542 'This Month',
543 'This Year',
544 'Next 7 Days',))
545 self._preset_date.SetSelection(1)
546 self._preset_date.Disable()
547 fgs.Add(self._preset_date, 0, wx.ALIGN_LEFT, 5)
548 wx.EVT_CHECKBOX(self, self._preset_date_chkbox.GetId(),
549 self.OnCheckBox)
550
561
563 if d is None:
564 chk_box.SetValue(False)
565 cal.Disable()
566 else:
567 chk_box.SetValue(True)
568 cal.Enable()
569 dt=wx.DateTime()
570 dt.Set(d[2], year=d[0], month=d[1]-1)
571 cal.SetDate(dt)
572
576
577 - def set(self, data):
591
593
594 _today=datetime.date.today()
595 _dow=_today.isoweekday()%7
596 _end=_today+datetime.timedelta(6-_dow)
597 return ((_today.year, _today.month, _today.day),
598 (_end.year, _end.month, _end.day))
599
601
602 _today=datetime.date.today()
603 _end=_today.replace(day=calendar.monthrange(_today.year,_today.month)[1])
604 return ((_today.year, _today.month, _today.day),
605 (_end.year, _end.month, _end.day))
606
608
609 _today=datetime.date.today()
610 _end=_today.replace(month=12, day=31)
611 return ((_today.year, _today.month, _today.day),
612 (_end.year, _end.month, _end.day))
613
615
616 _today=datetime.date.today()
617 _end=_today+datetime.timedelta(days=6)
618 return ((_today.year, _today.month, _today.day),
619 (_end.year, _end.month, _end.day))
620
633
635 r={}
636 if self._preset_date_chkbox.GetValue():
637 r['start'],r['end']=self._get_preset_date()
638 r['preset_date']=self._preset_date.GetSelection()
639 else:
640 r['preset_date']=None
641 if self._start_date_chkbox.GetValue():
642 dt=self._start_date.GetDate()
643 r['start']=(dt.GetYear(), dt.GetMonth()+1, dt.GetDay())
644 else:
645 r['start']=None
646 if self._end_date_chkbox.GetValue():
647 dt=self._end_date.GetDate()
648 r['end']=(dt.GetYear(), dt.GetMonth()+1, dt.GetDay())
649 else:
650 r['end']=None
651 self.get_base(r)
652 self._save_to_fs(r)
653 return r
654
655
657 - def __init__(self, parent, id, caption, categories, style=wx.DEFAULT_DIALOG_STYLE):
659
661
662 self._start_date_chkbox=wx.CheckBox(self, id=wx.NewId(),
663 label='Start Offset (days):',
664 style=wx.ALIGN_RIGHT)
665 fgs.Add(self._start_date_chkbox, 0, wx.ALIGN_RIGHT|wx.TOP|wx.BOTTOM, 5)
666 self._start_date=wx.lib.intctrl.IntCtrl(self, id=wx.NewId(), size=(50,-1),
667 value=0, min=0, max=1000)
668 self._start_date.Disable()
669 fgs.Add( self._start_date, 0, wx.ALIGN_LEFT|wx.TOP|wx.BOTTOM, 2)
670
671 self._end_date_chkbox=wx.CheckBox(self, id=wx.NewId(),
672 label='End Offset (days):',
673 style=wx.ALIGN_RIGHT)
674 fgs.Add(self._end_date_chkbox, 0, wx.ALIGN_RIGHT|wx.TOP|wx.BOTTOM, 5)
675 self._end_date=wx.lib.intctrl.IntCtrl(self, id=wx.NewId(), size=(50,-1),
676 value=0, min=0, max=1000)
677 self._end_date.Disable()
678 fgs.Add( self._end_date, 0, wx.ALIGN_LEFT|wx.TOP|wx.BOTTOM, 2)
679 fgs1.Add(wx.StaticText(self, -1, 'Note: The start offset is the number of days' +
680 ' in the past, and the end offset is the number of days' +
681 ' in the future imported from the calender into your phone. If' +
682 ' disabled, all past and/or future events are imported.',
683 size=(270,55)),
684 0, wx.ALIGN_LEFT|wx.TOP|wx.BOTTOM, 5)
685
686
688 if d is None:
689 self._start_date_chkbox.SetValue(False)
690 self._start_date.Disable()
691 else:
692 self._start_date_chkbox.SetValue(True)
693 self._start_date.Enable()
694 self._start_date.SetValue(d)
695
697 if d is None:
698 self._end_date_chkbox.SetValue(False)
699 self._end_date.Disable()
700 else:
701 self._end_date_chkbox.SetValue(True)
702 self._end_date.Enable()
703 self._end_date.SetValue(d)
704
705 - def set(self, data):
709
711 r={}
712 if self._start_date_chkbox.GetValue():
713 r['start_offset']=self._start_date.GetValue()
714 else:
715 r['start_offset']=None
716 if self._end_date_chkbox.GetValue():
717 r['end_offset']=self._end_date.GetValue()
718 else:
719 r['end_offset']=None
720 self.get_base(r)
721 return r
722
723
725
726 _default_file_name=""
727 _wildcards="All files|*.*"
728
730 super(ExportCalendarDialog, self).__init__(parent, -1, title)
731
732 vbs=wx.BoxSizer(wx.VERTICAL)
733 hbs=wx.BoxSizer(wx.HORIZONTAL)
734 hbs.Add(wx.StaticText(self, -1, "File"), 0, wx.ALL|wx.ALIGN_CENTRE, 5)
735 self.filenamectrl=wx.TextCtrl(self, -1, self._default_file_name)
736 hbs.Add(self.filenamectrl, 1, wx.ALL|wx.EXPAND, 5)
737 self.browsectrl=wx.Button(self, wx.NewId(), "Browse...")
738 hbs.Add(self.browsectrl, 0, wx.ALL|wx.EXPAND, 5)
739 vbs.Add(hbs, 0, wx.EXPAND|wx.ALL, 5)
740
741 vbs.Add(self.GetSelectionGui(self), 5, wx.EXPAND|wx.ALL, 5)
742
743 vbs.Add(wx.StaticLine(self, -1, style=wx.LI_HORIZONTAL), 0, wx.EXPAND|wx.ALL,5)
744 vbs.Add(self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.HELP), 0, wx.ALIGN_CENTER|wx.ALL, 5)
745
746 wx.EVT_BUTTON(self, self.browsectrl.GetId(), self.OnBrowse)
747 wx.EVT_BUTTON(self, wx.ID_OK, self.OnOk)
748
749 self.SetSizer(vbs)
750 self.SetAutoLayout(True)
751 vbs.Fit(self)
752
754 hbs=wx.BoxSizer(wx.HORIZONTAL)
755 self._selection=wx.RadioBox(parent, wx.NewId(), 'Events Selection',
756 choices=['All', 'Date Range'],
757 style=wx.RA_SPECIFY_ROWS)
758 hbs.Add(self._selection, 0, wx.EXPAND|wx.ALL, 5)
759 sbs=wx.StaticBoxSizer(wx.StaticBox(parent, -1, 'Date Range'), wx.VERTICAL)
760 gs=wx.FlexGridSizer(-1, 2, 5, 5)
761 gs.AddGrowableCol(1)
762 gs.Add(wx.StaticText(self, -1, 'Start:'), 0, wx.ALL, 0)
763 self._start_date=wx.DatePickerCtrl(self, style=wx.DP_DROPDOWN | wx.DP_SHOWCENTURY)
764 gs.Add(self._start_date, 0, wx.ALL, 0)
765 gs.Add(wx.StaticText(self, -1, 'End:'), 0, wx.ALL, 0)
766 self._end_date=wx.DatePickerCtrl(self, style=wx.DP_DROPDOWN | wx.DP_SHOWCENTURY)
767 gs.Add(self._end_date, 0, wx.ALL, 0)
768 sbs.Add(gs, 1, wx.EXPAND|wx.ALL, 5)
769 hbs.Add(sbs, 0, wx.EXPAND|wx.ALL, 5)
770 return hbs
771
773 with guihelper.WXDialogWrapper(wx.FileDialog(self, defaultFile=self.filenamectrl.GetValue(),
774 wildcard=self._wildcards, style=wx.SAVE|wx.CHANGE_DIR),
775 True) as (dlg, retcode):
776 if retcode==wx.ID_OK:
777 self.filenamectrl.SetValue(dlg.GetPath())
778
780
781 raise NotImplementedError
782
784
785 self._export()
786 self.EndModal(wx.ID_OK)
787