|
Module calendarentryeditor
|
|
1
2
3
4
5
6
7
8
9
10 from __future__ import with_statement
11 import calendar
12 import copy
13 import datetime
14 import time
15
16 import wx
17 import wx.lib
18 import wx.lib.masked.textctrl
19 import wx.lib.intctrl
20 import wx.lib.scrolledpanel as scrolled
21
22 import bpcalendar
23 import field_color
24 import helpids
25 import phonebookentryeditor as pb_editor
26 import pubsub
27 import guihelper
28 import guiwidgets
29
30 widgets_list=[]
31
33 _repeat_type= {
34 'daily': 1,
35 'weekly': 2,
36 'monthly': 3,
37 'yearly': 4 }
38 _repeat_options=('None', 'Daily', 'Weekly', 'Monthly', 'Yearly')
39 _dow=('Sun', 'Mon', 'Tues', 'Wed', 'Thu', 'Fri', 'Sat')
40 _monthly_nth_day=('First', 'Second', 'Third', 'Fourth', 'Last')
41 _daily_option_index=0
42 _weekly_option_index=1
43 _monthly_option_index=2
44 _weekly_wkst_str=(None, 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun')
45 _weekly_wkst_idx=(7, 1, 2, 3, 4, 5, 6)
46
48 global widgets_list
49 pb_editor.DirtyUIBase.__init__(self, parent)
50
51 self._main_bs=wx.BoxSizer(wx.VERTICAL)
52
53 hbs_1=wx.BoxSizer(wx.HORIZONTAL)
54 self._repeat_option_rb = wx.RadioBox(
55 self, -1, "Repeat Types:", wx.DefaultPosition, wx.DefaultSize,
56 self._repeat_options, 1, wx.RA_SPECIFY_COLS)
57 widgets_list.append((self._repeat_option_rb, 'repeat'))
58 wx.EVT_RADIOBOX(self, self._repeat_option_rb.GetId(), self.OnRepeatType)
59 hbs_1.Add(self._repeat_option_rb, 0, wx.LEFT, 5)
60
61 self._option_bs=wx.BoxSizer(wx.VERTICAL)
62 _box=wx.StaticBox(self, -1, 'Daily Options:')
63 widgets_list.append((_box, 'repeat'))
64 vbs=wx.StaticBoxSizer(_box, wx.VERTICAL)
65 hbs=wx.BoxSizer(wx.HORIZONTAL)
66 self._dl_every_nday=wx.RadioButton(self, -1, 'Every ', style=wx.RB_GROUP)
67 self._dl_every_nday.SetValue(True)
68 self._dl_every_wday=wx.RadioButton(self, -1, 'Every Weekday')
69 wx.EVT_RADIOBUTTON(self, self._dl_every_nday.GetId(), self.OnDirtyUI)
70 wx.EVT_RADIOBUTTON(self, self._dl_every_wday.GetId(), self.OnDirtyUI)
71 hbs.Add(self._dl_every_nday, 0, wx.LEFT, 0)
72 self._dl_interval=wx.TextCtrl(self, -1, '1')
73 wx.EVT_TEXT(self, self._dl_interval.GetId(), self.OnDirtyUI)
74 hbs.Add(self._dl_interval, 0, wx.LEFT, 0)
75 hbs.Add(wx.StaticText(self, -1, ' day(s)'), 0, wx.LEFT, 0)
76 vbs.Add(hbs, 0, wx.LEFT|wx.TOP, 10)
77 vbs.Add(self._dl_every_wday, 0, wx.LEFT, 10)
78 self._option_bs.Add(vbs, 0, wx.LEFT, 5)
79 self._daily_option_bs=vbs
80
81 _box=wx.StaticBox(self, -1, 'Weekly Options:')
82 widgets_list.append((_box, 'repeat'))
83 vbs=wx.StaticBoxSizer(_box, wx.VERTICAL)
84 hbs=wx.BoxSizer(wx.HORIZONTAL)
85 hbs.Add(wx.StaticText(self, -1, 'Every '),0, wx.LEFT, 0)
86 self._wl_interval=wx.TextCtrl(self, -1, '1')
87 wx.EVT_TEXT(self, self._wl_interval.GetId(), self.OnDirtyUI)
88 hbs.Add(self._wl_interval, 0, wx.LEFT, 0)
89 hbs.Add(wx.StaticText(self, -1, ' week(s)'), 0, wx.LEFT, 0)
90 vbs.Add(hbs, 0, wx.LEFT|wx.TOP, 10)
91 vbs.Add(wx.StaticText(self, -1, 'On:'), 0, wx.LEFT, 10)
92 hbs=wx.GridSizer(2, 4)
93 self._wl_dow={}
94 for i, n in enumerate(self._dow):
95 self._wl_dow[i]=wx.CheckBox(self, -1, n)
96 wx.EVT_CHECKBOX(self, self._wl_dow[i].GetId(), self.OnDirtyUI)
97 hbs.Add(self._wl_dow[i], 0, wx.LEFT|wx.TOP, 5)
98 vbs.Add(hbs, 0, wx.LEFT, 5)
99 hbs=wx.BoxSizer(wx.HORIZONTAL)
100 hbs.Add(wx.StaticText(self, -1, 'Week starts on:'), 0, wx.LEFT, 10)
101 self._wl_wkst=wx.ComboBox(self, -1, value=self._dow[0],
102 choices=self._dow, style=wx.CB_READONLY)
103 wx.EVT_COMBOBOX(self, self._wl_wkst.GetId(), self.OnDirtyUI)
104 hbs.Add(self._wl_wkst, 0, wx.LEFT, 5)
105 vbs.Add(hbs, 0, wx.TOP, 10)
106 self._option_bs.Add(vbs, 0, wx.LEFT, 5)
107 self._weekly_option_bs=vbs
108
109 _box=wx.StaticBox(self, -1, 'Monthly Options:')
110 widgets_list.append((_box, 'repeat'))
111 vbs=wx.StaticBoxSizer(_box, wx.VERTICAL)
112 hbs=wx.BoxSizer(wx.HORIZONTAL)
113 hbs.Add(wx.StaticText(self, -1, 'Every '),0, wx.LEFT, 0)
114 self._ml_interval=wx.TextCtrl(self, -1, '1')
115 wx.EVT_TEXT(self, self._ml_interval.GetId(), self.OnDirtyUI)
116 hbs.Add(self._ml_interval, 0, wx.LEFT, 0)
117 hbs.Add(wx.StaticText(self, -1, ' month(s)'), 0, wx.LEFT, 0)
118 vbs.Add(hbs, 0, wx.LEFT|wx.TOP, 10)
119 vbs.Add(wx.StaticText(self, -1, 'On:'), 0, wx.LEFT, 10)
120 self._ml_every_nday=wx.RadioButton(self, -1, 'Every nth day', style=wx.RB_GROUP)
121 self._ml_every_nday.SetValue(True)
122 self._ml_every_wday=wx.RadioButton(self, -1, 'Every ')
123 wx.EVT_RADIOBUTTON(self, self._ml_every_nday.GetId(), self.OnDirtyUI)
124 wx.EVT_RADIOBUTTON(self, self._ml_every_wday.GetId(), self.OnDirtyUI)
125 vbs.Add(self._ml_every_nday, 0, wx.LEFT|wx.TOP, 10)
126 hbs=wx.BoxSizer(wx.HORIZONTAL)
127 hbs.Add(self._ml_every_wday, 0, wx.LEFT, 0)
128 self._ml_nth_day=wx.ComboBox(self, -1, value=self._monthly_nth_day[0],
129 choices=self._monthly_nth_day,
130 style=wx.CB_READONLY)
131 self._ml_wday=wx.ComboBox(self, -1, value=self._dow[0],
132 choices=self._dow, style=wx.CB_READONLY)
133 wx.EVT_COMBOBOX(self, self._ml_nth_day.GetId(), self.OnDirtyUI)
134 wx.EVT_COMBOBOX(self, self._ml_wday.GetId(), self.OnDirtyUI)
135 hbs.Add(self._ml_nth_day, 0, wx.LEFT, 5)
136 hbs.Add(self._ml_wday, 0, wx.LEFT, 5)
137 vbs.Add(hbs, 0, wx.LEFT|wx.TOP, 10)
138
139 self._option_bs.Add(vbs, 0, wx.LEFT, 5)
140 self._monthly_option_bs=vbs
141
142 hbs_1.Add(self._option_bs, 0, wx.LEFT, 5)
143 self._main_bs.Add(hbs_1, 0, wx.LEFT|wx.TOP, 5)
144
145 _box=wx.StaticBox(self, -1, 'Excluded Dates:')
146 widgets_list.append((_box, 'repeat'))
147 hbs=wx.StaticBoxSizer(_box, wx.HORIZONTAL)
148 self._exception_list=wx.ListBox(self, -1)
149 hbs.Add(self._exception_list, 1, wx.LEFT|wx.TOP|wx.EXPAND, 5)
150 exception_del=wx.Button(self, -1, 'Include')
151 wx.EVT_BUTTON(self, exception_del.GetId(), self.OnIncludeException)
152 hbs.Add(exception_del, 0, wx.LEFT|wx.TOP, 5)
153 self._main_bs.Add(hbs, 1, wx.LEFT|wx.TOP|wx.EXPAND, 5)
154
155 self.SetSizer(self._main_bs)
156 self.SetAutoLayout(True)
157 self._main_bs.Fit(self)
158 self.OnRepeatType(None)
159
202
203 - def Set(self, data):
204 self.ignore_dirty=True
205 self.populate(data)
206 self.dirty=self.ignore_dirty=False
207
251
275
289
298
299
301 _dict_key_index=0
302 _label_index=1
303 _class_index=2
304 _get_index=3
305 _set_index=4
306 _w_index=5
307 color_field_name='general'
309 global widgets_list
310
311 pb_editor.DirtyUIBase.__init__(self, parent)
312
313 self._fields=[
314 ['description', 'Summary:', DVTextControl, None, None, None],
315 ['location', 'Location:', DVTextControl, None, None, None],
316 ['allday', 'All-Day:', wx.CheckBox, None, None, None],
317 ['start', 'From:', DVDateTimeControl, None, self._set_start_datetime, None],
318 ['end', 'To:', DVDateTimeControl, None, self._set_end_datetime, None],
319 ['priority', 'Priority:', None, self._get_priority, self._set_priority, None],
320 ['alarm', 'Alarm:', DVIntControl, None, None, None],
321 ['vibrate', 'Vibrate:', wx.CheckBox, None, None, None],
322 ]
323
324 vbs=wx.StaticBoxSizer(wx.StaticBox(self, -1), wx.VERTICAL)
325
326 self._w={}
327 gs=wx.FlexGridSizer(-1,2,5,5)
328 gs.AddGrowableCol(1)
329 for n in self._fields:
330 desc=n[self._label_index]
331 t=wx.StaticText(self, -1, desc, style=wx.ALIGN_LEFT)
332 widgets_list.append((t, n[self._dict_key_index]))
333 gs.Add(t)
334 if desc=='Priority:':
335 c=wx.ComboBox(self, -1, "", (-1, -1), (-1, -1),
336 ['<None>', '1 - Highest', '2', '3', '4', '5 - Normal',
337 '6', '7' ,'8', '9', '10 - Lowest'], wx.CB_DROPDOWN)
338 else:
339 c=n[self._class_index](self, -1)
340 gs.Add(c, 0, wx.EXPAND, 0)
341 n[self._w_index]=self._w[n[self._dict_key_index]]=c
342 vbs.Add(gs, 0, wx.EXPAND|wx.ALL, 5)
343
344 wx.EVT_CHECKBOX(self, self._w['allday'].GetId(), self.OnAllday)
345 wx.EVT_CHECKBOX(self, self._w['vibrate'].GetId(), self.OnDirtyUI)
346 wx.EVT_COMBOBOX(self, self._w['priority'].GetId(), self.OnDirtyUI)
347
348 self.SetSizer(vbs)
349 self.SetAutoLayout(True)
350 vbs.Fit(self)
351
354
360
380
381 - def Set(self, data):
395
396 - def Get(self, data):
407
420
423
426
427
429
430
431
432 unnamed="Select:"
433
435 global widgets_list
436
437 pb_editor.DirtyUIBase.__init__(self, parent)
438 self.static_box=wx.StaticBox(self, -1, "Category")
439 hs=wx.StaticBoxSizer(self.static_box, wx.HORIZONTAL)
440
441 self.categories=[]
442 self.category=wx.ListBox(self, -1, choices=self.categories)
443 pubsub.subscribe(self.OnUpdateCategories, pubsub.ALL_CATEGORIES)
444 pubsub.publish(pubsub.REQUEST_CATEGORIES)
445
446 vbs=wx.BoxSizer(wx.VERTICAL)
447 vbs.Add(wx.StaticText(self, -1, 'Master Category'), 0,
448 wx.TOP|wx.LEFT, 5)
449 vbs.Add(self.category, 1, wx.EXPAND|wx.ALL, 5)
450 hs.Add(vbs, 1, wx.EXPAND|wx.ALL, 5)
451
452 vbs=wx.BoxSizer(wx.VERTICAL)
453 self.but=wx.Button(self, wx.NewId(), "Manage Categories:")
454 add_btn=wx.Button(self, -1, 'Add ->')
455 del_btn=wx.Button(self, -1, '<- Remove')
456 vbs.Add(self.but, 0, wx.ALIGN_CENTRE|wx.ALL, 5)
457 vbs.Add(add_btn, 0, wx.ALIGN_CENTRE|wx.ALL, 5)
458 vbs.Add(del_btn, 0, wx.ALIGN_CENTRE|wx.ALL, 5)
459 hs.Add(vbs, 0, wx.ALIGN_CENTRE|wx.ALL, 5)
460 wx.EVT_BUTTON(self, add_btn.GetId(), self.OnAddCategory)
461 wx.EVT_BUTTON(self, del_btn.GetId(), self.OnDelCategory)
462
463 vbs=wx.BoxSizer(wx.VERTICAL)
464 vbs.Add(wx.StaticText(self, -1, 'Selected Category:'), 0,
465 wx.TOP|wx.LEFT, 5)
466 self._my_category=wx.ListBox(self, -1)
467 vbs.Add(self._my_category, 1, wx.EXPAND|wx.ALL, 5)
468 hs.Add(vbs, 1, wx.EXPAND|wx.ALL, 5)
469 wx.EVT_BUTTON(self, self.but.GetId(), self.OnManageCategories)
470
471 self.SetSizer(hs)
472 hs.Fit(self)
473
478
492
494 self.ignore_dirty=self.dirty=False
495 r=[]
496 count=self._my_category.GetCount()
497 if count==0:
498 return r
499 for i in range(count):
500 r.append({ 'category': self._my_category.GetString(i) })
501 return r
502
503 - def Set(self, data):
504 self.ignore_dirty=True
505 self._my_category.Clear()
506 if data is None or len(data)==0:
507
508 return
509 for n in data:
510 v=n.get('category', None)
511 if v is not None:
512 self._my_category.Append(v)
513 self.ignore_dirty=self.dirty=False
514
525
527 v=self._my_category.GetSelection()
528 if v==wx.NOT_FOUND:
529
530 return
531 self.ignore_dirty=True
532 self._my_category.Delete(v)
533 self.ignore_dirty=False
534 self.OnDirtyUI(evt)
535
536
538
539
540
541 ANSWER_ORIGINAL=1
542 ANSWER_THIS=2
543 ANSWER_CANCEL=3
544 _dict_key_index=0
545 _label_index=1
546 _get_index=2
547 _set_index=3
548 _w_index=4
549
550 _general_page=0
551 _repeat_page=1
552 _notes_page=2
553 _categories_page=3
554 _wallpapers_page=4
555 _ringtones_page=5
556 _last_page=6
557 _items=[
558 ("General", None, GeneralEditor, None),
559 ("Repeat", 'repeat', RepeatEditor, None),
560 ("Notes", "notes", pb_editor.MemoEditor, 'memo'),
561 ("Categories", "categories", CategoryEditor, 'category'),
562 ("Wallpapers", "wallpapers", pb_editor.WallpaperEditor, 'wallpaper'),
563 ("Ringtones", "ringtones", pb_editor.RingtoneEditor, 'ringtone'),
564 ]
565 color_field_name='calendar'
566