Home | History | Annotate | Download | only in guido
      1 #! /usr/bin/env python
      2 
      3 # View a single MIME multipart message.
      4 # Display each part as a box.
      5 
      6 import string
      7 from types import *
      8 from Tkinter import *
      9 from ScrolledText import ScrolledText
     10 
     11 class MimeViewer:
     12     def __init__(self, parent, title, msg):
     13         self.title = title
     14         self.msg = msg
     15         self.frame = Frame(parent, {'relief': 'raised', 'bd': 2})
     16         self.frame.packing = {'expand': 0, 'fill': 'both'}
     17         self.button = Checkbutton(self.frame,
     18                              {'text': title,
     19                               'command': self.toggle})
     20         self.button.pack({'anchor': 'w'})
     21         headertext = msg.getheadertext(
     22                 lambda x: x != 'received' and x[:5] != 'x400-')
     23         height = countlines(headertext, 4)
     24         if height:
     25             self.htext = ScrolledText(self.frame,
     26                               {'height': height,
     27                                'width': 80,
     28                                'wrap': 'none',
     29                                'relief': 'raised',
     30                                'bd': 2})
     31             self.htext.packing = {'expand': 1, 'fill': 'both',
     32                                   'after': self.button}
     33             self.htext.insert('end', headertext)
     34         else:
     35             self.htext = Frame(self.frame,
     36                                {'relief': 'raised', 'bd': 2})
     37             self.htext.packing = {'side': 'top',
     38                                   'ipady': 2,
     39                                   'fill': 'x',
     40                                   'after': self.button}
     41         body = msg.getbody()
     42         if type(body) == StringType:
     43             self.pad = None
     44             height = countlines(body, 10)
     45             if height:
     46                 self.btext = ScrolledText(self.frame,
     47                                   {'height': height,
     48                                    'width': 80,
     49                                    'wrap': 'none',
     50                                    'relief': 'raised',
     51                                    'bd': 2})
     52                 self.btext.packing = {'expand': 1,
     53                                       'fill': 'both'}
     54                 self.btext.insert('end', body)
     55             else:
     56                 self.btext = None
     57             self.parts = None
     58         else:
     59             self.pad = Frame(self.frame,
     60                              {'relief': 'flat', 'bd': 2})
     61             self.pad.packing = {'side': 'left', 'ipadx': 10,
     62                                 'fill': 'y', 'after': self.htext}
     63             self.parts = []
     64             for i in range(len(body)):
     65                 p = MimeViewer(self.frame,
     66                                '%s.%d' % (title, i+1),
     67                                body[i])
     68                 self.parts.append(p)
     69             self.btext = None
     70         self.collapsed = 1
     71     def pack(self):
     72         self.frame.pack(self.frame.packing)
     73     def destroy(self):
     74         self.frame.destroy()
     75     def show(self):
     76         if self.collapsed:
     77             self.button.invoke()
     78     def toggle(self):
     79         if self.collapsed:
     80             self.explode()
     81         else:
     82             self.collapse()
     83     def collapse(self):
     84         self.collapsed = 1
     85         for comp in self.htext, self.btext, self.pad:
     86             if comp:
     87                 comp.forget()
     88         if self.parts:
     89             for part in self.parts:
     90                 part.frame.forget()
     91         self.frame.pack({'expand': 0})
     92     def explode(self):
     93         self.collapsed = 0
     94         for comp in self.htext, self.btext, self.pad:
     95             if comp: comp.pack(comp.packing)
     96         if self.parts:
     97             for part in self.parts:
     98                 part.pack()
     99         self.frame.pack({'expand': 1})
    100 
    101 def countlines(str, limit):
    102     i = 0
    103     n = 0
    104     while  n < limit:
    105         i = string.find(str, '\n', i)
    106         if i < 0: break
    107         n = n+1
    108         i = i+1
    109     return n
    110 
    111 def main():
    112     import sys
    113     import getopt
    114     import mhlib
    115     opts, args = getopt.getopt(sys.argv[1:], '')
    116     for o, a in opts:
    117         pass
    118     message = None
    119     folder = 'inbox'
    120     for arg in args:
    121         if arg[:1] == '+':
    122             folder = arg[1:]
    123         else:
    124             message = string.atoi(arg)
    125 
    126     mh = mhlib.MH()
    127     f = mh.openfolder(folder)
    128     if not message:
    129         message = f.getcurrent()
    130     m = f.openmessage(message)
    131 
    132     root = Tk()
    133     tk = root.tk
    134 
    135     top = MimeViewer(root, '+%s/%d' % (folder, message), m)
    136     top.pack()
    137     top.show()
    138 
    139     root.minsize(1, 1)
    140 
    141     tk.mainloop()
    142 
    143 if __name__ == '__main__': main()
    144