Trees | Indices | Help |
|
---|
|
1 ### BITPIM 2 ### 3 ### Copyright (C) 2005 Joe Pham <djpham@bitpim.org> 4 ### 5 ### This program is free software; you can redistribute it and/or modify 6 ### it under the terms of the BitPim license as detailed in the LICENSE file. 7 ### 8 ### $Id: today.py 4601 2008-03-04 22:37:48Z djpham $ 9 10 """ 11 Code to handle BitPim Today tab. 12 13 """ 14 15 # standard modules 16 17 # wx modules 18 import wx 19 import wx.lib.scrolledpanel as scrolled 20 import wx.lib.hyperlink as hl 21 22 # BitPim modules 23 import aggregatedisplay as aggr 24 import pubsub 25 import widgets 26 27 28 # Today REQUEST_TAB_CHANGED keys, types, and constants 29 Tab_Today=0 30 Tab_PhoneBook=1 31 Tab_Wallpaper=2 32 Tab_Ringers=3 33 Tab_Calendar=4 34 Tab_Memo=5 35 Tab_Todo=6 36 Tab_SMS=7 37 Tab_CallHistory=8 38 # TODAY_DATA keys, types, and constants 39 Today_Section='section' 40 Today_Groups='groups' 41 Today_Group_Tab='tab_index' 42 Today_Items='items' 43 Today_Item_Name='name' 44 Today_Item_Data='item_data' 45 # Sections 46 Today_Section_Today='Today' 47 Today_Section_ThisWeek='This Week' 48 # Groups 49 Today_Group_Calendar='Calendar:' 50 Today_Group_Todo='Todo List:' 51 Today_Group_Memo='Memo:' 52 Today_Group_IncomingSMS='SMS Inbox:' 53 Today_Group_IncomingCalls='Incoming Calls:' 54 Today_Group_MissedCalls='Missed Calls:' 55 56 dow_initials=('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', ' ') 57 58 EVT_TODAY_ITEM_SELECTED=wx.NewEventType()59 60 #------------------------------------------------------------------------------- 61 -class NotificationEvent(object):6869 #------------------------------------------------------------------------------- 70 -class NotificationEventHandler(object):738275 evt=NotificationEvent(evt_handler, client_data) 76 self._evt_table.setdefault(group, []).append(evt)7783 #------------------------------------------------------------------------------- 84 evt_handler=None 85 -def bind_notification_event(_evt_handler, group, client_data=None):86 global evt_handler 87 if evt_handler is None: 88 evt_handler=NotificationEventHandler() 89 evt_handler.append(_evt_handler, group, client_data)9091 #------------------------------------------------------------------------------- 92 -class BaseEvent(object):9712099 # append a data item to this event 100 self._items.append({ Today_Item_Name: item_name, 101 Today_Item_Data: item_data })102 108 names=property(fget=_get_names, fset=_set_names) 109111 return self._items112 items=property(fget=_get_items) 113 117 @classmethod121 #------------------------------------------------------------------------------- 122 -class TodayCalendarEvent(BaseEvent):154148 super(TodayIncomingCallsEvent, self).__init__(Today_Section_Today, 149 Today_Group_IncomingCalls)155 # Request Today Event----------------------------------------------------------- 156 -def bind_request_event(evt_handler):160161 #------------------------------------------------------------------------------- 162 EVT_HYPERLINK_LEFT=hl.EVT_HYPERLINK_LEFT 163 -class HyperLinkCtrl(hl.HyperLinkCtrl):179165 super(HyperLinkCtrl, self).__init__(*args, **kargs) 166 self.AutoBrowse(False) 167 self.DoPopup(False) 168 self.client_data=None169171 if isinstance(tip, (str, unicode)): 172 super(HyperLinkCtrl, self).SetToolTip(wx.ToolTip(tip)) 173 else: 174 super(HyperLinkCtrl, self).SetToolTip(tip)175180 #------------------------------------------------------------------------------- 181 -class StaticText(wx.StaticText):182 _max_item_len=30 183 _postfix='...' 184 _max_client_len=_max_item_len-len(_postfix)191188 if len(label)>self._max_item_len: 189 label=label[:self._max_client_len]+self._postfix 190 super(StaticText, self).SetLabel(label)192 #------------------------------------------------------------------------------- 193 -class ItemHyperLink(HyperLinkCtrl):194 _max_item_len=30 195 _postfix='...' 196 _max_client_len=_max_item_len-len(_postfix)208201 # if label contains linefeed truncate 202 if label.find('\n')>-1: 203 label=label.split('\n')[0]+self._postfix 204 if len(label)>self._max_item_len: 205 label=label[:self._max_client_len]+self._postfix 206 super(ItemHyperLink, self).SetLabel(label) 207 self.client_data=client_data209 #------------------------------------------------------------------------------- 210 -class GroupWidget(wx.Panel, widgets.BitPimWidget):211 max_total_items=10 212 max_items=9 213 _title_font=None 214 _item_font=None 215 _last_item={ Today_Item_Name: '... more ...', 216 Today_Item_Data: None }286218 super(GroupWidget, self).__init__(parent, wx.NewId()) 219 self.name=_name.get('name', '') 220 self.tab_index=_name.get('tab_index', None) 221 self._data=[] 222 self._widgets=[] 223 if not self._title_font: 224 self._title_font=wx.Font(12, wx.FONTFAMILY_DEFAULT, 225 wx.FONTSTYLE_NORMAL, 226 wx.FONTWEIGHT_BOLD) 227 self._item_font=wx.Font(10, wx.FONTFAMILY_MODERN, 228 wx.FONTSTYLE_NORMAL, 229 wx.FONTWEIGHT_NORMAL) 230 bs=wx.StaticBoxSizer(wx.StaticBox(self, -1, ''), wx.VERTICAL) 231 title=HyperLinkCtrl(self, -1, self.name) 232 if self._title_font.Ok(): 233 title.SetFont(self._title_font) 234 hl.EVT_HYPERLINK_LEFT(self, title.GetId(), self.OnItemSelected) 235 bs.Add(title, 0, wx.ALL, 5) 236 vbs=wx.BoxSizer(wx.VERTICAL) 237 for i in range(self.max_total_items): 238 w=ItemHyperLink(self, -1, '') 239 if self._item_font.Ok(): 240 w.SetFont(self._item_font) 241 hl.EVT_HYPERLINK_LEFT(self, w.GetId(), self.OnItemSelected) 242 vbs.Add(w, 0, wx.RIGHT|wx.LEFT, 5) 243 vbs.Hide(i) 244 self._widgets.append(w) 245 bs.Add(vbs, 1, wx.LEFT, 10) 246 self._vbs=vbs 247 bs.Fit(self) 248 self.SetSizer(bs) 249 self.SetAutoLayout(True)250252 x=dc.pos[0]-dc.view_start[0] 253 y=dc.pos[1]-dc.view_start[1] 254 self.SetDimensions(x, y, width, height)255 260262 if evt_handler: 263 self.OnHyperlinkLeft(evt) 264 evt_handler.process(self.name, evt.GetEventObject().client_data)265267 data_len=len(data) 268 if data_len>self.max_total_items: 269 self._data=data[:self.max_items] 270 self._data.append(self._last_item) 271 data_len=self.max_total_items 272 else: 273 self._data=data 274 for i in range(data_len): 275 self._widgets[i].SetLabel(self._data[i].get(Today_Item_Name, ''), 276 self._data[i].get(Today_Item_Data, None)) 277 self._vbs.Show(i) 278 for i in range(data_len, self.max_total_items): 279 self._vbs.Hide(i) 280 self._vbs.Layout() 281 self.Fit() 282 self.Refresh()283287 #------------------------------------------------------------------------------- 288 -class SectionHeader(aggr.SectionHeader):289 default_width=10 290 default_height=10318297 return self._items299 l=[] 300 for x in self._items: 301 if x.not_empty(): 302 l.append(x) 303 x.Show() 304 else: 305 x.Hide() 306 return l308 w=self.default_width 309 h=self.default_height 310 for e in self._items: 311 w1,h1=e.GetSizeTuple() 312 w=max(w, w1) 313 h=max(h,h1) 314 return (w,h)315317 return self.GetItems()319 320 #------------------------------------------------------------------------------- 321 -class TodayWidget(aggr.Display, widgets.BitPimWidget):322 _section_names=('Today','This Week') 323 _item_names=(({ 'name': Today_Group_Calendar, 'tab_index': Tab_Calendar }, 324 { 'name': Today_Group_Todo, 'tab_index': Tab_Todo }, 325 { 'name': Today_Group_Memo, 'tab_index': Tab_Memo }, 326 { 'name': Today_Group_IncomingSMS, 'tab_index': Tab_SMS }, 327 { 'name': Today_Group_IncomingCalls, 'tab_index': Tab_CallHistory }, 328 { 'name': Today_Group_MissedCalls, 'tab_index': Tab_CallHistory }), 329 ({ 'name': Today_Group_Calendar, 'tab_index': Tab_Calendar }, 330 { 'name': Today_Group_Todo, 'tab_index': Tab_Todo } )) 331381333 self._sections=[] 334 super(TodayWidget, self).__init__(parent, self) 335 self._main_window=mainwindow 336 # sections & items info 337 self._sections=[SectionHeader(s) for s in self._section_names] 338 for i,group in enumerate(self._item_names): 339 for name in group: 340 w=GroupWidget(self, name) 341 self._sections[i].Add(w) 342 # all done 343 # populate data 344 self.UpdateItems() 345 # register for pubsub events 346 BaseEvent.bind(self.OnNewData) 347 pubsub.subscribe(self._OnMidnight, pubsub.MIDNIGHT)348 352 356358 return sectionheader.GetItems()359361 section_name=data.section 362 group_name=data.group 363 for s in self._sections: 364 if s.label!=section_name: 365 continue 366 for group in s.GetAllItems(): 367 if group.name==group_name: 368 group.Set(data.items) 369 break 370 break 371 self.UpdateItems() 372 self.Refresh()373 378380 send_request_event()
Trees | Indices | Help |
|
---|
Generated by Epydoc 3.0.1 on Sun Jan 24 16:21:46 2010 | http://epydoc.sourceforge.net |