| 
									
										
										
										
											2010-03-11 22:53:45 +00:00
										 |  |  | #! /usr/bin/env python3 | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | # View a single MIME multipart message. | 
					
						
							|  |  |  | # Display each part as a box. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import string | 
					
						
							|  |  |  | from types import * | 
					
						
							| 
									
										
										
										
											2009-01-04 18:53:28 +00:00
										 |  |  | from tkinter import * | 
					
						
							|  |  |  | from tkinter.scrolledtext import ScrolledText | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | class MimeViewer: | 
					
						
							| 
									
										
										
										
											2004-07-18 06:16:08 +00:00
										 |  |  |     def __init__(self, parent, title, msg): | 
					
						
							|  |  |  |         self.title = title | 
					
						
							|  |  |  |         self.msg = msg | 
					
						
							|  |  |  |         self.frame = Frame(parent, {'relief': 'raised', 'bd': 2}) | 
					
						
							|  |  |  |         self.frame.packing = {'expand': 0, 'fill': 'both'} | 
					
						
							|  |  |  |         self.button = Checkbutton(self.frame, | 
					
						
							|  |  |  |                              {'text': title, | 
					
						
							|  |  |  |                               'command': self.toggle}) | 
					
						
							|  |  |  |         self.button.pack({'anchor': 'w'}) | 
					
						
							|  |  |  |         headertext = msg.getheadertext( | 
					
						
							|  |  |  |                 lambda x: x != 'received' and x[:5] != 'x400-') | 
					
						
							|  |  |  |         height = countlines(headertext, 4) | 
					
						
							|  |  |  |         if height: | 
					
						
							|  |  |  |             self.htext = ScrolledText(self.frame, | 
					
						
							|  |  |  |                               {'height': height, | 
					
						
							|  |  |  |                                'width': 80, | 
					
						
							|  |  |  |                                'wrap': 'none', | 
					
						
							|  |  |  |                                'relief': 'raised', | 
					
						
							|  |  |  |                                'bd': 2}) | 
					
						
							|  |  |  |             self.htext.packing = {'expand': 1, 'fill': 'both', | 
					
						
							|  |  |  |                                   'after': self.button} | 
					
						
							|  |  |  |             self.htext.insert('end', headertext) | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             self.htext = Frame(self.frame, | 
					
						
							|  |  |  |                                {'relief': 'raised', 'bd': 2}) | 
					
						
							|  |  |  |             self.htext.packing = {'side': 'top', | 
					
						
							|  |  |  |                                   'ipady': 2, | 
					
						
							|  |  |  |                                   'fill': 'x', | 
					
						
							|  |  |  |                                   'after': self.button} | 
					
						
							|  |  |  |         body = msg.getbody() | 
					
						
							|  |  |  |         if type(body) == StringType: | 
					
						
							|  |  |  |             self.pad = None | 
					
						
							|  |  |  |             height = countlines(body, 10) | 
					
						
							|  |  |  |             if height: | 
					
						
							|  |  |  |                 self.btext = ScrolledText(self.frame, | 
					
						
							|  |  |  |                                   {'height': height, | 
					
						
							|  |  |  |                                    'width': 80, | 
					
						
							|  |  |  |                                    'wrap': 'none', | 
					
						
							|  |  |  |                                    'relief': 'raised', | 
					
						
							|  |  |  |                                    'bd': 2}) | 
					
						
							|  |  |  |                 self.btext.packing = {'expand': 1, | 
					
						
							|  |  |  |                                       'fill': 'both'} | 
					
						
							|  |  |  |                 self.btext.insert('end', body) | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 self.btext = None | 
					
						
							|  |  |  |             self.parts = None | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             self.pad = Frame(self.frame, | 
					
						
							|  |  |  |                              {'relief': 'flat', 'bd': 2}) | 
					
						
							|  |  |  |             self.pad.packing = {'side': 'left', 'ipadx': 10, | 
					
						
							|  |  |  |                                 'fill': 'y', 'after': self.htext} | 
					
						
							|  |  |  |             self.parts = [] | 
					
						
							|  |  |  |             for i in range(len(body)): | 
					
						
							|  |  |  |                 p = MimeViewer(self.frame, | 
					
						
							|  |  |  |                                '%s.%d' % (title, i+1), | 
					
						
							|  |  |  |                                body[i]) | 
					
						
							|  |  |  |                 self.parts.append(p) | 
					
						
							|  |  |  |             self.btext = None | 
					
						
							|  |  |  |         self.collapsed = 1 | 
					
						
							|  |  |  |     def pack(self): | 
					
						
							|  |  |  |         self.frame.pack(self.frame.packing) | 
					
						
							|  |  |  |     def destroy(self): | 
					
						
							|  |  |  |         self.frame.destroy() | 
					
						
							|  |  |  |     def show(self): | 
					
						
							|  |  |  |         if self.collapsed: | 
					
						
							|  |  |  |             self.button.invoke() | 
					
						
							|  |  |  |     def toggle(self): | 
					
						
							|  |  |  |         if self.collapsed: | 
					
						
							|  |  |  |             self.explode() | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             self.collapse() | 
					
						
							|  |  |  |     def collapse(self): | 
					
						
							|  |  |  |         self.collapsed = 1 | 
					
						
							|  |  |  |         for comp in self.htext, self.btext, self.pad: | 
					
						
							|  |  |  |             if comp: | 
					
						
							|  |  |  |                 comp.forget() | 
					
						
							|  |  |  |         if self.parts: | 
					
						
							|  |  |  |             for part in self.parts: | 
					
						
							|  |  |  |                 part.frame.forget() | 
					
						
							|  |  |  |         self.frame.pack({'expand': 0}) | 
					
						
							|  |  |  |     def explode(self): | 
					
						
							|  |  |  |         self.collapsed = 0 | 
					
						
							|  |  |  |         for comp in self.htext, self.btext, self.pad: | 
					
						
							|  |  |  |             if comp: comp.pack(comp.packing) | 
					
						
							|  |  |  |         if self.parts: | 
					
						
							|  |  |  |             for part in self.parts: | 
					
						
							|  |  |  |                 part.pack() | 
					
						
							|  |  |  |         self.frame.pack({'expand': 1}) | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def countlines(str, limit): | 
					
						
							| 
									
										
										
										
											2004-07-18 06:16:08 +00:00
										 |  |  |     i = 0 | 
					
						
							|  |  |  |     n = 0 | 
					
						
							|  |  |  |     while  n < limit: | 
					
						
							|  |  |  |         i = string.find(str, '\n', i) | 
					
						
							|  |  |  |         if i < 0: break | 
					
						
							|  |  |  |         n = n+1 | 
					
						
							|  |  |  |         i = i+1 | 
					
						
							|  |  |  |     return n | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def main(): | 
					
						
							| 
									
										
										
										
											2004-07-18 06:16:08 +00:00
										 |  |  |     import sys | 
					
						
							|  |  |  |     import getopt | 
					
						
							|  |  |  |     import mhlib | 
					
						
							|  |  |  |     opts, args = getopt.getopt(sys.argv[1:], '') | 
					
						
							|  |  |  |     for o, a in opts: | 
					
						
							|  |  |  |         pass | 
					
						
							|  |  |  |     message = None | 
					
						
							|  |  |  |     folder = 'inbox' | 
					
						
							|  |  |  |     for arg in args: | 
					
						
							|  |  |  |         if arg[:1] == '+': | 
					
						
							|  |  |  |             folder = arg[1:] | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             message = string.atoi(arg) | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-07-18 06:16:08 +00:00
										 |  |  |     mh = mhlib.MH() | 
					
						
							|  |  |  |     f = mh.openfolder(folder) | 
					
						
							|  |  |  |     if not message: | 
					
						
							|  |  |  |         message = f.getcurrent() | 
					
						
							|  |  |  |     m = f.openmessage(message) | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-07-18 06:16:08 +00:00
										 |  |  |     root = Tk() | 
					
						
							|  |  |  |     tk = root.tk | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-07-18 06:16:08 +00:00
										 |  |  |     top = MimeViewer(root, '+%s/%d' % (folder, message), m) | 
					
						
							|  |  |  |     top.pack() | 
					
						
							|  |  |  |     top.show() | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-07-18 06:16:08 +00:00
										 |  |  |     root.minsize(1, 1) | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-07-18 06:16:08 +00:00
										 |  |  |     tk.mainloop() | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | if __name__ == '__main__': main() |