home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2009 June / maximum-cd-2009-06.iso / DiscContents / digsby_setup.exe / lib / gui / buddylist / accounttray.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2009-02-26  |  11.2 KB  |  303 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. import sys
  5. import wx
  6. from wx import Point
  7. from gui.taskbar import DigsbyTaskBarIcon
  8. import common.actions as actions
  9. from common import pref
  10. from gui.toolbox import draw_tiny_text, Monitor
  11. from util import try_this
  12. import social
  13. from traceback import print_exc
  14. from operator import itemgetter
  15. from gui.toolbox import Monitor
  16.  
  17. def should_grey(acct):
  18.     return not isinstance(acct, social.network)
  19.  
  20.  
  21. GetDoubleClickTime = lambda : 600
  22. if 'wxMSW' in wx.PlatformInfo:
  23.     
  24.     try:
  25.         from ctypes import windll
  26.         GetDoubleClickTime = windll.user32.GetDoubleClickTime
  27.     except Exception:
  28.         print_exc()
  29.     except:
  30.         None<EXCEPTION MATCH>Exception
  31.     
  32.  
  33. None<EXCEPTION MATCH>Exception
  34. baseAccountTrayClass = DigsbyTaskBarIcon
  35. if sys.platform.startswith('darwin'):
  36.     from gui.native.mac import macmenuicon
  37.     baseAccountTrayClass = macmenuicon.MenuBarIconDelegate
  38.  
  39.  
  40. class AccountTrayIcon(baseAccountTrayClass):
  41.     
  42.     def create(cls, acct, infobox):
  43.         EmailAccount = EmailAccount
  44.         import common.emailaccount
  45.         import social.facebook.facebook as facebook
  46.         Facebook = facebook.Facebook
  47.         MySpace = protocol
  48.         import social.myspace
  49.         Twitter = Twitter
  50.         import social.twitter
  51.         trayClass = None
  52.         if isinstance(acct, EmailAccount):
  53.             trayClass = EmailTrayIcon
  54.         elif isinstance(acct, Facebook):
  55.             trayClass = FacebookTrayIcon
  56.         elif isinstance(acct, MySpace):
  57.             trayClass = MyspaceTrayIcon
  58.         elif isinstance(acct, Twitter):
  59.             trayClass = TwitterTrayIcon
  60.         elif isinstance(acct, social.network):
  61.             trayClass = SocialAccountTrayIcon
  62.         
  63.         if sys.platform.startswith('darwin'):
  64.             object = trayClass.alloc().init()
  65.             object.initWithAccount(acct, infobox)
  66.             return object
  67.         else:
  68.             return trayClass(acct, infobox)
  69.  
  70.     create = classmethod(create)
  71.     
  72.     def __init__(self, acct, infobox = None):
  73.         self.acct = acct
  74.         self.infobox = infobox
  75.         UMenu = UMenu
  76.         import gui.uberwidgets.umenu
  77.         self._menu = UMenu(wx.FindWindowByName('Buddy List'), onshow = self.update_menu)
  78.         baseAccountTrayClass.__init__(self, acct.icon, menu = self._menu)
  79.         self.Bind(wx.EVT_TASKBAR_LEFT_DOWN, self.on_click)
  80.         self.Bind(wx.EVT_TASKBAR_LEFT_DCLICK, self.on_double_click)
  81.         self.register_observers(acct, self.on_account_updated)
  82.         self.on_account_updated()
  83.  
  84.     
  85.     def update_menu(self, *a):
  86.         self._menu.RemoveAllItems()
  87.         actions.menu(wx.FindWindowByName('Buddy List'), self.acct, cls = type(self.acct), menu = self._menu)
  88.  
  89.     
  90.     def on_click(self, e = None):
  91.         
  92.         try:
  93.             dclick_timer = self.dclick_timer
  94.         except AttributeError:
  95.             dclick_timer = self.dclick_timer = wx.PyTimer((lambda : pass))
  96.  
  97.         if dclick_timer.IsRunning():
  98.             self.on_double_click()
  99.             dclick_timer.Stop()
  100.         else:
  101.             dclick_timer.StartOneShot(GetDoubleClickTime())
  102.             self.show_infobox()
  103.         e.Skip()
  104.  
  105.     
  106.     def on_double_click(self, e = None):
  107.         if self.infobox.IsShown():
  108.             self.infobox.Hide()
  109.         
  110.         url = self.acct.OnClickHomeURL()
  111.         if url is not None:
  112.             wx.LaunchDefaultBrowser(url)
  113.         
  114.  
  115.     
  116.     def show_infobox(self):
  117.         if not self.infobox:
  118.             return None
  119.         
  120.         info = self.infobox
  121.         if info.IsShown() and getattr(info, 'account', None) is self.acct:
  122.             info.Hide()
  123.         else:
  124.             pt = self.get_infobox_tray_position()
  125.             info.Display(pt, pt, self.acct, force_corner = pt)
  126.             wx.CallAfter(info.do_focus)
  127.  
  128.     
  129.     def get_infobox_tray_position(self):
  130.         
  131.         try:
  132.             import cgui
  133.             r = cgui.GetTrayRect()
  134.             pt = Point(r.Right - r.Width / 2, r.Bottom - r.Height / 2)
  135.             display = Monitor.GetFromPoint(pt, find_near = True)
  136.             rect = display.GetClientArea()
  137.             distances = []
  138.             for p in ('TopLeft', 'TopRight', 'BottomLeft', 'BottomRight'):
  139.                 corner = getattr(rect, p)
  140.                 distances.append((corner, corner.DistanceTo(pt), p))
  141.             
  142.             distances.sort(key = itemgetter(1))
  143.             (corner, distance, name) = distances[0]
  144.             return corner
  145.         except Exception:
  146.             print_exc()
  147.             return Monitor.GetFromPointer().ClientArea.BottomRight
  148.  
  149.  
  150.     
  151.     def Destroy(self):
  152.         self._destroyed = True
  153.         if not sys.platform.startswith('darwin'):
  154.             self.unregister_observers(self.acct, self.on_account_updated)
  155.         
  156.         return baseAccountTrayClass.Destroy(self)
  157.  
  158.     
  159.     def count_string(self):
  160.         acct = self.acct
  161.         if acct.offline_reason != acct.Reasons.NONE:
  162.             count = 'X'
  163.         else:
  164.             count = acct.count
  165.         return count
  166.  
  167.     count_string = property(count_string)
  168.     
  169.     def on_account_updated(self, *a):
  170.         if not self or getattr(self, '_destroyed', False):
  171.             return None
  172.         
  173.         acct = self.acct
  174.         count = self.count_string
  175.         if acct.enabled:
  176.             icon = acct.icon.PIL.Resized(self._IconSize)
  177.             if pref('trayicons.email.show_count', True) and count:
  178.                 icon = draw_tiny_text(icon, str(count)).WX
  179.             
  180.             if pref('trayicons.email.gray_on_empty', True) and count in (0, 'X') and should_grey(acct):
  181.                 icon = icon.WXB.Greyed
  182.             
  183.             self.SetIcon(icon, self.Tooltip)
  184.         
  185.  
  186.     
  187.     def Tooltip(self):
  188.         return ''
  189.  
  190.     Tooltip = property(Tooltip)
  191.  
  192.  
  193. class EmailTrayIcon(AccountTrayIcon):
  194.     
  195.     def register_observers(self, acct, callback):
  196.         acct.add_observer(callback, 'count', 'state')
  197.  
  198.     
  199.     def unregister_observers(self, acct, callback):
  200.         acct.remove_observer(callback, 'count', 'state')
  201.  
  202.     
  203.     def update_menu(self, *a):
  204.         EmailAccount = EmailAccount
  205.         import common.emailaccount
  206.         self._menu.RemoveAllItems()
  207.         actions.menu(wx.FindWindowByName('Buddy List'), self.acct, cls = EmailAccount, search_bases = False, menu = self._menu)
  208.  
  209.     
  210.     def Tooltip(self):
  211.         c = self.count_string
  212.         if c == 'X':
  213.             return _('%s (%s)') % (self.acct.offline_reason, self.acct.email_address)
  214.         else:
  215.             
  216.             try:
  217.                 count = int(c)
  218.             except ValueError:
  219.                 count = 0
  220.  
  221.             return None % (_('%s unread message%s (%s)'), c if count != 1 else '', self.acct.email_address)
  222.  
  223.     Tooltip = property(Tooltip)
  224.  
  225.  
  226. class SocialAccountTrayIcon(AccountTrayIcon):
  227.     
  228.     def register_observers(self, acct, callback):
  229.         acct.add_observer(callback, 'count', 'state')
  230.  
  231.     
  232.     def unregister_observers(self, acct, callback):
  233.         acct.remove_observer(callback, 'count', 'state')
  234.  
  235.     
  236.     def Tooltip(self):
  237.         c = self.count_string
  238.         if c == 'X':
  239.             return _('%s (%s)' % (self.acct.offline_reason, self.acct.name))
  240.         else:
  241.             return (None, try_this)((lambda : _('%s new alerts (%s)') % (c, self.acct.name)), '')
  242.  
  243.     Tooltip = property(Tooltip)
  244.  
  245.  
  246. class FacebookTrayIcon(SocialAccountTrayIcon):
  247.     
  248.     def register_observers(self, acct, callback):
  249.         SocialAccountTrayIcon.register_observers(self, acct, callback)
  250.         acct.newsfeed.add_observer(callback)
  251.  
  252.     
  253.     def unregister_observers(self, acct, callback):
  254.         SocialAccountTrayIcon.unregister_observers(self, acct, callback)
  255.         acct.newsfeed.remove_observer(callback)
  256.  
  257.  
  258.  
  259. class MyspaceTrayIcon(SocialAccountTrayIcon):
  260.     
  261.     def register_observers(self, acct, callback):
  262.         SocialAccountTrayIcon.register_observers(self, acct, callback)
  263.         acct.add_observer(callback, 'alerts')
  264.  
  265.     
  266.     def unregister_observers(self, acct, callback):
  267.         SocialAccountTrayIcon.unregister_observers(self, acct, callback)
  268.         acct.remove_observer(callback, 'alerts')
  269.  
  270.  
  271.  
  272. class TwitterTrayIcon(SocialAccountTrayIcon):
  273.     
  274.     def __init__(self, *a, **k):
  275.         SocialAccountTrayIcon.__init__(self, *a, **k)
  276.         self.tray_refresh_timer = wx.PyTimer(self.on_refresh_timer)
  277.         self.tray_refresh_timer.StartRepeating(300000)
  278.  
  279.     
  280.     def on_refresh_timer(self):
  281.         if wx.IsDestroyed(self):
  282.             import sys
  283.             print >>sys.stderr, 'WARNING: TwitterTrayIcon.on_refresh_timer being called but is destroyed.'
  284.         else:
  285.             self.SetIcon(self.acct.icon)
  286.  
  287.     
  288.     def register_observers(self, acct, callback):
  289.         SocialAccountTrayIcon.register_observers(self, acct, callback)
  290.         acct.add_observer(callback, 'user_timeline')
  291.  
  292.     
  293.     def unregister_observers(self, acct, callback):
  294.         SocialAccountTrayIcon.unregister_observers(self, acct, callback)
  295.         acct.remove_observer(callback, 'user_timeline')
  296.  
  297.     
  298.     def Tooltip(self):
  299.         return 'Twitter (%s)' % self.acct.name
  300.  
  301.     Tooltip = property(Tooltip)
  302.  
  303.