home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2012 January / maximum-cd-2012-01.iso / DiscContents / digsby_setup.exe / lib / gui / infobox / emailpanels.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2011-10-05  |  19.2 KB  |  540 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.6)
  3.  
  4. from __future__ import with_statement
  5. import sys
  6. import wx
  7. import traceback
  8. from wx import Rect, RectS, BLACK
  9. from datetime import datetime
  10. from gui import skin
  11. from gui.textutil import default_font, CopyFont
  12. from gui.skin.skinobjects import SkinColor
  13. from gui.toolbox import add_image_text
  14. from gui.uberwidgets.pseudosizer import PseudoSizer
  15. from gui.uberwidgets.clearlink import ClearLink
  16. from cgui import SimplePanel
  17. from common import actions, pref
  18. from gui.textutil import GetFontHeight
  19. link_style = wx.NO_BORDER | wx.HL_ALIGN_LEFT | wx.TRANSPARENT_WINDOW
  20.  
  21. class Header(SimplePanel):
  22.     
  23.     def __init__(self, parent):
  24.         SimplePanel.__init__(self, parent)
  25.         self.account = None
  26.         self.Bind(wx.EVT_PAINT, self.OnPaint)
  27.         self.Bind(wx.EVT_SIZE, self.OnSize)
  28.         self.linkage = PseudoSizer()
  29.         self.extralinkage = None
  30.         self.UpdateSkin()
  31.  
  32.     
  33.     def SetAccount(self, account):
  34.         if account is self.account:
  35.             return None
  36.         if self.account is not None:
  37.             
  38.             try:
  39.                 self.account.unobserve_count(self.Refreshxor)
  40.             except NotImplementedError:
  41.                 account is self.account
  42.                 account is self.account
  43.             except:
  44.                 account is self.account
  45.  
  46.             
  47.             try:
  48.                 self.account.unobserve_state(self.Refreshxor)
  49.             except NotImplementedError:
  50.                 account is self.account
  51.                 account is self.account
  52.             except:
  53.                 account is self.account<EXCEPTION MATCH>NotImplementedError
  54.             
  55.  
  56.         account is self.account
  57.         self.account = account
  58.         self.icon = account.icon.Resized(16)
  59.         self.linkage.Clear(True)
  60.         for linkfunc in account.header_funcs:
  61.             link = ClearLink(self, -1, linkfunc[0], (lambda l = (linkfunc,): self.do_link(l)), style = link_style, pos = (-400, -400))
  62.             link.Font = self.linkfont
  63.             self.linkage.Add(link)
  64.         
  65.         self.linkage.Layout()
  66.         
  67.         try:
  68.             self._unbound_cbs.clear()
  69.         except AttributeError:
  70.             None if self.extralinkage else account is self.account if getattr(account, 'extra_header_func', None) is not None else self.extralinkage = elink = ClearLink(self, -1, account.extra_header_func[0], (lambda l = (account.extra_header_func,): self.do_link(l)), style = link_style, pos = (-400, -400))
  71.             None if self.extralinkage else account is self.account if getattr(account, 'extra_header_func', None) is not None else self.extralinkage = elink = ClearLink(self, -1, account.extra_header_func[0], (lambda l = (account.extra_header_func,): self.do_link(l)), style = link_style, pos = (-400, -400))
  72.         except:
  73.             None if self.extralinkage else account is self.account if getattr(account, 'extra_header_func', None) is not None else self.extralinkage = elink = ClearLink(self, -1, account.extra_header_func[0], (lambda l = (account.extra_header_func,): self.do_link(l)), style = link_style, pos = (-400, -400))
  74.  
  75.         
  76.         try:
  77.             account.observe_count(self.Refreshxor)
  78.         except NotImplementedError:
  79.             None if self.extralinkage else account is self.account if getattr(account, 'extra_header_func', None) is not None else self.extralinkage = elink = ClearLink(self, -1, account.extra_header_func[0], (lambda l = (account.extra_header_func,): self.do_link(l)), style = link_style, pos = (-400, -400))
  80.             None if self.extralinkage else account is self.account if getattr(account, 'extra_header_func', None) is not None else self.extralinkage = elink = ClearLink(self, -1, account.extra_header_func[0], (lambda l = (account.extra_header_func,): self.do_link(l)), style = link_style, pos = (-400, -400))
  81.         except:
  82.             None if self.extralinkage else account is self.account if getattr(account, 'extra_header_func', None) is not None else self.extralinkage = elink = ClearLink(self, -1, account.extra_header_func[0], (lambda l = (account.extra_header_func,): self.do_link(l)), style = link_style, pos = (-400, -400))
  83.  
  84.         
  85.         try:
  86.             account.observe_state(self.Refreshxor)
  87.         except NotImplementedError:
  88.             None if self.extralinkage else account is self.account if getattr(account, 'extra_header_func', None) is not None else self.extralinkage = elink = ClearLink(self, -1, account.extra_header_func[0], (lambda l = (account.extra_header_func,): self.do_link(l)), style = link_style, pos = (-400, -400))
  89.             None if self.extralinkage else account is self.account if getattr(account, 'extra_header_func', None) is not None else self.extralinkage = elink = ClearLink(self, -1, account.extra_header_func[0], (lambda l = (account.extra_header_func,): self.do_link(l)), style = link_style, pos = (-400, -400))
  90.         except:
  91.             None if self.extralinkage else account is self.account if getattr(account, 'extra_header_func', None) is not None else self.extralinkage = elink = ClearLink(self, -1, account.extra_header_func[0], (lambda l = (account.extra_header_func,): self.do_link(l)), style = link_style, pos = (-400, -400))
  92.  
  93.         self.Refresh(False)
  94.  
  95.     
  96.     def OnSize(self, event):
  97.         event.Skip()
  98.         self.ExtraLinkLayout()
  99.  
  100.     
  101.     def ExtraLinkLayout(self):
  102.         elink = self.extralinkage
  103.         if elink is not None:
  104.             elink.Size = elink.BestSize
  105.             elinkposx = self.Size.width - self.padding[0] - elink.BestSize.width
  106.             elinkposy = self.headerfont.Height + 2 * self.padding[1]
  107.             elink.SetPosition((elinkposx, elinkposy))
  108.         
  109.  
  110.     
  111.     def do_link(self, link):
  112.         if len(link) > 2:
  113.             if link[2]:
  114.                 wx.GetTopLevelParent(self).Hide()
  115.             
  116.         else:
  117.             wx.GetTopLevelParent(self).Hide()
  118.         if callable(link[1]):
  119.             link[1]()
  120.         else:
  121.             wx.LaunchDefaultBrowser(link[1])
  122.  
  123.     
  124.     def Refreshxor(self, *a):
  125.         self.Refresh(False)
  126.  
  127.     
  128.     def UpdateSkin(self):
  129.         self.padding = wx.Point(4, 4)
  130.         self.headerfont = skin.get('infobox.fonts.header', (lambda : default_font()))
  131.         self.linkfont = CopyFont(skin.get('infobox.fonts.link', (lambda : default_font())), underline = True)
  132.         self.elinkfont = CopyFont(self.linkfont, weight = wx.FONTWEIGHT_BOLD)
  133.         self.headerfc = skin.get('infobox.fontcolors.navbarheader', (lambda : wx.BLACK))
  134.         self.linkfc = skin.get('infobox.fontcolors.navbarlink', (lambda : wx.BLUE))
  135.         linkposx = self.padding[0] * 2 + 16
  136.         linkposy = self.headerfont.Height + 2 * self.padding[1]
  137.         self.linkage.SetPosition((linkposx, linkposy))
  138.         for link in self.linkage:
  139.             link.NormalColour = link.HoverColour = link.VisitedColour = self.linkfc
  140.             link.Font = self.linkfont
  141.         
  142.         self.linkage.Layout()
  143.         elink = self.extralinkage
  144.         if elink:
  145.             elink.NormalColour = elink.HoverColour = elink.VisitedColour = self.linkfc
  146.             elink.Font = self.elinkfont
  147.             elink.Size = elink.BestSize
  148.             elinkposx = self.Size.width - self.padding[0] - elink.BestSize.width
  149.             elink.SetPosition((elinkposx, linkposy))
  150.         
  151.         self.bg = skin.get('infobox.backgrounds.header', (lambda : SkinColor(wx.Color(225, 255, 225))))
  152.         self.Size = self.MinSize = wx.Size(-1, self.headerfont.Height + self.linkfont.Height + self.padding.y * 4)
  153.  
  154.     
  155.     def OnPaint(self, event):
  156.         dc = wx.AutoBufferedPaintDC(self)
  157.         rect = RectS(self.Size)
  158.         (padx, pady) = self.padding
  159.         self.bg.Draw(dc, rect)
  160.         dc.Font = self.headerfont
  161.         font_height = self.headerfont.Height
  162.         dc.TextForeground = self.headerfc
  163.         dc.DrawBitmap(self.icon, padx, padx + font_height // 2 - self.icon.Height // 2, True)
  164.         printable = rect.width - padx
  165.         curserx = rect.x + 2 * padx + self.icon.Width
  166.         cursery = rect.y + pady
  167.         dc.DrawLabel(self.account.display_name, wx.Rect(curserx, cursery, printable - curserx, font_height))
  168.         curserx += dc.GetTextExtent(self.account.display_name + ' ')[0]
  169.         if getattr(self.account, 'service', None) != 'twitter':
  170.             None(dc.DrawLabel if not hasattr(self.account, 'count') else '(' + str(self.account.count) + ')', Rect(curserx, cursery, printable - curserx, dc.Font.Height))
  171.         
  172.  
  173.  
  174.  
  175. class EmailList(wx.VListBox):
  176.     
  177.     def __init__(self, parent):
  178.         wx.VListBox.__init__(self, parent)
  179.         import common.favicons as common
  180.         common.favicons.on_icon += self.OnFaviconReceived
  181.         self.emails = []
  182.         self.account = None
  183.         self.itemheight = 0
  184.         self.preview_offset = 0
  185.         self.preview_timer = wx.PyTimer(self.on_preview_timer)
  186.         self.marquee_timer = wx.PyTimer(self.on_marquee)
  187.         self.SetItemCount(len(self.emails))
  188.         self.linkage = PseudoSizer()
  189.         self.linkage.Show(False)
  190.         self.errorlink = None
  191.         self.UpdateSkin()
  192.         links = [
  193.             ('olink', 'Open', 'OnClickEmail'),
  194.             ('rlink', 'Mark as Read', 'markAsRead'),
  195.             ('alink', 'Archive', 'archive'),
  196.             ('dlink', 'Delete', 'delete'),
  197.             ('slink', 'Report Spam', 'reportSpam')]
  198.         for attr, text, method in links:
  199.             link = ClearLink(self, -1, text, method, style = wx.NO_BORDER | wx.HL_ALIGN_CENTRE)
  200.             link.Font = self.linkfont
  201.             setattr(self, attr, link)
  202.             self.linkage.Add(link)
  203.         
  204.         self.BBind(HYPERLINK = self.OnLink, MOTION = self.OnMouseMotion, LEFT_DCLICK = self.OnDblClick, LEAVE_WINDOW = self.OnMouseOut, MOUSEWHEEL = self.OnMouseWheel, PAINT = self.OnPaint, SHOW = self.OnShow)
  205.         self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)
  206.  
  207.     
  208.     def SetSelection(self, i):
  209.         
  210.         try:
  211.             self.preview_offset = 0
  212.             self.marquee_timer.Stop()
  213.             if pref('email.marquee.enabled', False):
  214.                 if i == -1:
  215.                     self.preview_timer.Stop()
  216.                 else:
  217.                     self.preview_timer.Start(1000, True)
  218.         except Exception:
  219.             import traceback
  220.             traceback.print_exc()
  221.  
  222.         return wx.VListBox.SetSelection(self, i)
  223.  
  224.     
  225.     def on_preview_timer(self):
  226.         self.marquee_timer.Start(pref('email.marquee.delay_ms', 50), False)
  227.  
  228.     
  229.     def on_marquee(self):
  230.         sel = self.Selection
  231.  
  232.     Selection = property(wx.VListBox.GetSelection, SetSelection)
  233.     
  234.     def OnFaviconReceived(self, domain):
  235.         get_icon_domain = get_icon_domain
  236.         import common.favicons
  237.         for i, email in enumerate(self.emails):
  238.             if not email.domain:
  239.                 continue
  240.             
  241.             if domain == get_icon_domain(email.domain):
  242.                 self.RefreshLine(i)
  243.                 continue
  244.         
  245.  
  246.     
  247.     def OnMouseWheel(self, event):
  248.         self.ScrollLines(-(event.WheelRotation) // abs(event.WheelRotation))
  249.  
  250.     
  251.     def OnDblClick(self, event):
  252.         self.account.OnClickEmail(self.account.emails[self.Selection])
  253.  
  254.     
  255.     def OnMouseOut(self, event):
  256.         if not self.linkage.Rect.Contains(event.Position) and self.Selection != -1:
  257.             self.RefreshLine(self.Selection)
  258.             self.Selection = -1
  259.             self.linkage.Show(False)
  260.         
  261.  
  262.     
  263.     def OnMouseMotion(self, event):
  264.         i = self.HitTest(event.Position)
  265.         if self.Selection != i:
  266.             oldSelection = self.Selection
  267.             self.Selection = i
  268.             if self.Selection == -1:
  269.                 self.linkage.Show(False)
  270.             else:
  271.                 self.linkage.Show(True)
  272.             if oldSelection >= 0:
  273.                 self.RefreshLine(oldSelection)
  274.             
  275.             if self.Selection >= 0:
  276.                 self.RefreshLine(self.Selection)
  277.             
  278.         
  279.  
  280.     
  281.     def remove_observers(self):
  282.         if self.account is not None:
  283.             self.account.emails.remove_observer(self.ListChanged)
  284.         
  285.         
  286.         try:
  287.             self._unbound_cbs.clear()
  288.         except AttributeError:
  289.             pass
  290.  
  291.  
  292.     
  293.     def OnShow(self, event):
  294.         event.Skip()
  295.         if wx.IsDestroyed(self):
  296.             print >>sys.stderr, 'WARNING: emailpanels.py OnShow called, but is destroyed'
  297.             return None
  298.         if not self.Shown:
  299.             self.remove_observers()
  300.         
  301.         self.Selection = -1
  302.         self.linkage.Show(False)
  303.         self.Refresh(False)
  304.  
  305.     
  306.     def SetAccount(self, account):
  307.         self.ScrollToLine(0)
  308.         self.Selection = -1
  309.         self.linkage.Show(False)
  310.         self.remove_observers()
  311.         self.account = account
  312.         self.account.emails.add_observer(self.ListChanged)
  313.         self.ListChanged()
  314.         acts = actions.forclass(account)
  315.         fnames = [ _[1] if not isinstance(act, basestring) else None for act in acts ]
  316.         self.olink.Show('open' in fnames)
  317.         self.rlink.Show('markAsRead' in fnames)
  318.         self.alink.Show('archive' in fnames)
  319.         self.dlink.Show('delete' in fnames)
  320.         self.slink.Show('reportSpam' in fnames)
  321.         self.linkage.Layout()
  322.         self.itemheight = [] + self.padding.y * 4 + self.titlefont.Height + self.majorfont.Height + self.linkfont.Height if self.sep else 0
  323.         if account.can_has_preview:
  324.             self.itemheight += self.minorfont.Height + self.padding.y
  325.         
  326.         self.RefreshAll()
  327.         self.Show(True)
  328.         self.Frozen().__enter__()
  329.         
  330.         try:
  331.             self.GrandParent.DoSizeMagic()
  332.         finally:
  333.             pass
  334.  
  335.  
  336.     
  337.     def ListChanged(self, *args, **kwargs):
  338.         i = self.GetFirstVisibleLine()
  339.         
  340.         try:
  341.             topemail = self.emails[i]
  342.         except IndexError:
  343.             topemail = None
  344.  
  345.         self.emails = self.account.emails
  346.         self.Frozen().__enter__()
  347.         
  348.         try:
  349.             self.SetItemCount(len(self.emails))
  350.             self.GrandParent.DoSizeMagic()
  351.             if topemail is not None:
  352.                 
  353.                 try:
  354.                     i = self.emails.index(topemail)
  355.                 except ValueError:
  356.                     self.Frozen().__exit__
  357.                     self.Frozen().__exit__
  358.                     self.Frozen()
  359.                 except:
  360.                     self.Frozen().__exit__<EXCEPTION MATCH>ValueError
  361.                 
  362.  
  363.             self.Frozen().__exit__
  364.             self.ScrollLines(i)
  365.         finally:
  366.             pass
  367.  
  368.         self.Parent.Refresh(False)
  369.  
  370.     
  371.     def UpdateSkin(self):
  372.         s = skin.get
  373.         self.padding = s('infobox.padding', (lambda : wx.Point(4, 4)))
  374.         self.headerfont = s('infobox.fonts.header', default_font)
  375.         self.titlefont = s('infobox.fonts.title', default_font)
  376.         self.majorfont = s('infobox.fonts.major', default_font)
  377.         self.minorfont = s('infobox.fonts.minor', default_font)
  378.         self.linkfont = CopyFont(s('infobox.fonts.link', default_font), underline = True)
  379.         fc = s('infobox.fontcolors')
  380.         g = fc.get
  381.         self.titlefc = g('title', BLACK)
  382.         self.majorfc = g('major', wx.BLACK)
  383.         self.minorfc = g('minor', wx.Color(128, 128, 128))
  384.         self.linkfc = g('link', wx.BLUE)
  385.         self.hovertitlefc = g('emailhovertitle', self.titlefc)
  386.         self.hovermajorfc = g('emailhovermajor', self.majorfc)
  387.         self.hoverminorfc = g('emailhoverminor', self.minorfc)
  388.         self.hoverlinkfc = g('emailhoverlink', self.linkfc)
  389.         for link in self.linkage:
  390.             link.NormalColour = link.HoverColour = link.VisitedColour = self.hoverlinkfc
  391.             link.Font = self.linkfont
  392.         
  393.         self.linkage.Layout()
  394.         if self.errorlink:
  395.             self.errorlink.Font = self.Parent.Font
  396.             self.errorlink.VisitedColour = self.errorlink.HoverColour = self.errorlink.NormalColour = s('infobox.linkcolor', (lambda : wx.BLUE))
  397.         
  398.         self.bg = s('infobox.backgrounds.email', (lambda : SkinColor(wx.WHITE)))
  399.         self.selbg = s('infobox.backgrounds.emailhover', (lambda : SkinColor(wx.Color(225, 255, 225))))
  400.         self.sep = s('infobox.shortseparatorimage', None)
  401.  
  402.     
  403.     def GetFullHeight(self):
  404.         if not self.ItemCount:
  405.             pass
  406.         return 1 * self.OnMeasureItem(0)
  407.  
  408.     
  409.     def SkimIt(self, it):
  410.         if self.ItemCount:
  411.             h = self.OnMeasureItem(0)
  412.             r = (it // h) * h
  413.             return r
  414.         return self.OnMeasureItem(0)
  415.  
  416.     
  417.     def OnMeasureItem(self, n):
  418.         return self.itemheight
  419.  
  420.     
  421.     def OnDrawBackground(self, dc, rect, n):
  422.         if self.Selection == n:
  423.             self.selbg.Draw(dc, rect, n)
  424.         else:
  425.             self.bg.Draw(dc, rect, n)
  426.  
  427.     
  428.     def OnPaint(self, event):
  429.         if self.ItemCount:
  430.             event.Skip()
  431.             return None
  432.         dc = wx.AutoBufferedPaintDC(self)
  433.         rect = RectS(self.Size)
  434.         self.OnDrawBackground(dc, rect, 0)
  435.         dc.Font = self.titlefont
  436.         self.ItemCount(dc.DrawLabel if self.account.count else 'No New Email', rect, wx.ALIGN_CENTER)
  437.  
  438.     
  439.     def OnDrawItem(self, dc, rect, n):
  440.         issel = n == self.Selection
  441.         email = self.emails[n]
  442.         pad = self.padding
  443.         sendtime = getattr(email, 'sendtime', None)
  444.         if hasattr(sendtime, 'strftime'):
  445.             strf = sendtime.strftime
  446.             
  447.             try:
  448.                 iscurdate = strf('%b %d %y') == datetime.now().strftime('%b %d %y')
  449.                 date = strf('%b %d')
  450.                 time = strf('%I:%M %p')
  451.                 if time[0] == '0':
  452.                     time = time[1:]
  453.                 
  454.                 if iscurdate and getattr(self.account, 'timestamp_is_time', (lambda t: True))(sendtime):
  455.                     timestamp = time
  456.                 else:
  457.                     timestamp = date
  458.             except Exception:
  459.                 traceback.print_exc_once()
  460.                 timestamp = None
  461.             except:
  462.                 None<EXCEPTION MATCH>Exception
  463.             
  464.  
  465.         None<EXCEPTION MATCH>Exception
  466.         timestamp = sendtime
  467.         if timestamp is None:
  468.             timestamp = ''
  469.         
  470.         curserx = rect.x + pad.x
  471.         cursery = rect.y + pad.y
  472.         favicon = favicon
  473.         import common.favicons
  474.         d = email.domain
  475.         icon = None if d is not None else None
  476.         iconsize = 16
  477.         if icon is None:
  478.             icon = skin.get('emailpanel.miscicons.defaulticon', None)
  479.         
  480.         if icon is not None:
  481.             icon = icon.Resized(iconsize)
  482.             dc.DrawBitmap(icon, curserx, cursery, True)
  483.         
  484.         curserx += iconsize + pad.x
  485.         dc.Font = self.minorfont
  486.         dc.TextForeground = None if issel else self.minorfc
  487.         tste = dc.GetFullTextExtent(timestamp)
  488.         tsrect = wx.Rect(rect.x + rect.width - tste[0] - pad.x, cursery, tste[0], tste[1] + tste[2] + tste[3])
  489.         dc.DrawTruncatedText(timestamp, tsrect)
  490.         if email.attachments:
  491.             atticon = skin.get('emailpanel.miscicons.attachmenticon', None)
  492.             if atticon is not None:
  493.                 count = len(email.attachments)
  494.                 if count > 1:
  495.                     atticon = add_image_text(atticon, str(count))
  496.                 
  497.                 dc.DrawBitmap(atticon, tsrect.X - atticon.Width - pad.x, tsrect.Y, True)
  498.             
  499.         
  500.         dc.Font = self.titlefont
  501.         dc.TextForeground = None if issel else self.titlefc
  502.         if not email.fromname:
  503.             pass
  504.         dc.DrawTruncatedText(u'%s' % email.fromemail, Rect(curserx, cursery, rect.Width - (curserx + pad.x) - tsrect.width, dc.Font.Height))
  505.         cursery += dc.Font.Height + self.padding.y
  506.         dc.Font = self.majorfont
  507.         dc.TextForeground = None if issel else self.majorfc
  508.         if not email.subject:
  509.             pass
  510.         dc.DrawTruncatedText(_('(No Subject)'), Rect(curserx, cursery, rect.Width - (curserx + pad.x), dc.Font.Height))
  511.         if self.account.can_has_preview:
  512.             cursery += dc.Font.Height + pad.y
  513.             dc.Font = self.minorfont
  514.             dc.TextForeground = None if issel else self.minorfc
  515.             self.preview_rect = wx.Rect(curserx, cursery, rect.Width - (curserx + pad.x), GetFontHeight(dc.Font, line_height = True))
  516.             if not email.content[self.preview_offset:]:
  517.                 pass
  518.             if dc.DrawTruncatedTextInfo(_('(No Preview)'), self.preview_rect):
  519.                 self.marquee_timer.Stop()
  520.             
  521.         
  522.         if self.sep and n < len(self.emails) - 1:
  523.             self.sep.Draw(dc, wx.RectPS(rect.Position + (2, rect.height - self.sep.Size.height), (rect.width - 4, self.sep.Size.height)))
  524.         
  525.         if issel:
  526.             cursery += dc.Font.Height + pad.y
  527.             self.linkage.SetPosition((curserx, cursery))
  528.         
  529.  
  530.     
  531.     def OnLink(self, event):
  532.         if event.URL == 'OnClickEmail':
  533.             wx.GetTopLevelParent(self).Hide()
  534.         
  535.         getattr(self.account, event.URL)(self.account.emails[self.Selection])
  536.         self.Selection = -1
  537.         self.linkage.Show(False)
  538.  
  539.  
  540.