/Demo/tkinter/guido/MimeViewer.py

http://unladen-swallow.googlecode.com/ · Python · 143 lines · 129 code · 11 blank · 3 comment · 27 complexity · ad00d0111e2d823465b3779520735754 MD5 · raw file

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