+;;; @ automatic MIME preview
+;;;
+
+(defvar tm-vm/automatic-mime-preview t
+ "If non-nil, show MIME processed article.")
+
+(defun tm-vm/preview-current-message ()
+ (if tm-vm/automatic-mime-preview
+ (let ((win (selected-window)))
+ (vm-display (current-buffer) t
+ '(tm-vm/preview-current-message
+ vm-preview-current-message)
+ '(tm-vm/preview-current-message reading-message))
+ (mime/viewer-mode)
+ (select-window win)
+ )
+ ))
+
+(add-hook 'vm-select-message-hook 'tm-vm/preview-current-message)
+(add-hook 'vm-visit-folder-hook 'tm-vm/preview-current-message)
+
+(defun tm-vm/scroll-forward ()
+ (interactive)
+ (if tm-vm/automatic-mime-preview
+ (let ((win (get-buffer-window
+ (save-excursion
+ (set-buffer vm-mail-buffer)
+ mime::article/preview-buffer)))
+ (the-win (selected-window))
+ np)
+ (if win
+ (progn
+ (select-window win)
+ (setq np (save-excursion
+ (forward-line (window-height))
+ (point)
+ ))
+ )
+ (vm-scroll-forward)
+ (switch-to-buffer mime::article/preview-buffer)
+ (setq win (selected-window))
+ (setq np (point-min))
+ )
+ (if (eq np (point-max))
+ (progn
+ (select-window the-win)
+ (vm-next-message)
+ )
+ (set-window-start (selected-window) np)
+ (select-window the-win)
+ ))
+ (vm-scroll-forward)
+ ))
+
+(defun tm-vm/scroll-backward ()
+ (interactive)
+ (if tm-vm/automatic-mime-preview
+ (let ((win (get-buffer-window
+ (save-excursion
+ (set-buffer vm-mail-buffer)
+ mime::article/preview-buffer)))
+ (the-win (selected-window))
+ np)
+ (if win
+ (progn
+ (select-window win)
+ (setq np (save-excursion
+ (forward-line (- (window-height)))
+ (point)
+ ))
+ (if (eq np (window-start))
+ (progn
+ (select-window the-win)
+ (vm-previous-message)
+ )
+ (set-window-start (selected-window) np)
+ (select-window the-win)
+ ))
+ (vm-scroll-forward)
+ (switch-to-buffer mime::article/preview-buffer)
+ (setq win (selected-window))
+ (select-window the-win)
+ ))
+ (vm-scroll-backward)
+ ))
+
+(substitute-key-definition 'vm-scroll-forward
+ 'tm-vm/scroll-forward vm-mode-map)
+(substitute-key-definition 'vm-scroll-backward
+ 'tm-vm/scroll-backward vm-mode-map)
+
+(defun tm-vm/toggle-preview-mode ()
+ (interactive)
+ (if tm-vm/automatic-mime-preview
+ (progn
+ (setq tm-vm/automatic-mime-preview nil)
+ (vm-select-folder-buffer)
+ (vm-display (current-buffer) t
+ '(tm-vm/toggle-preview-mode)
+ '(tm-vm/toggle-preview-mode reading-message))
+ )
+ (setq tm-vm/automatic-mime-preview t)
+ (let ((win (selected-window)))
+ (vm-select-folder-buffer)
+ (save-window-excursion
+ (let* ((mp (car vm-message-pointer))
+ (ct (vm-get-header-contents mp "Content-Type:"))
+ (cte (vm-get-header-contents mp "Content-Transfer-Encoding:"))
+ )
+ (mime/viewer-mode nil (mime/parse-Content-Type (or ct "")) cte)
+ ))
+ (vm-display mime::article/preview-buffer t
+ '(tm-vm/toggle-preview-mode)
+ '(tm-vm/toggle-preview-mode reading-message))
+ (select-window win)
+ )
+ ))
+
+
+;;; @ for tm-view
+;;;
+
+(defun tm-vm/quit-view-message ()
+ "Quit MIME-viewer and go back to VM.
+This function is called by `mime-viewer/quit' command via
+`mime-viewer/quitting-method-alist'."
+ (mime-viewer/kill-buffer)
+ (if (get-buffer mime/output-buffer-name)
+ (bury-buffer mime/output-buffer-name))
+ (vm-select-folder-buffer)
+ (vm-display (current-buffer) t '(mime-viewer/quit mime-viewer/up-content)
+ '(mime-viewer/quit reading-message)))
+
+(defun tm-vm/view-message ()
+ "Decode and view MIME encoded message, under VM."
+ (interactive)
+ (vm-follow-summary-cursor)
+ (vm-select-folder-buffer)
+ (vm-check-for-killed-summary)
+ (vm-error-if-folder-empty)
+ (vm-display (current-buffer) t '(tm-vm/view-message)
+ '(tm-vm/view-mesage reading-message))
+ (let* ((mp (car vm-message-pointer))
+ (ct (vm-get-header-contents mp "Content-Type:"))
+ (cte (vm-get-header-contents mp "Content-Transfer-Encoding:"))
+ (exposed (= (point-min) (vm-start-of mp))))
+ (save-restriction
+ (vm-widen-page)
+ ;; vm-widen-page hides exposed header if pages are delimited.
+ ;; So, here we expose it again.
+ (if exposed
+ (narrow-to-region (vm-start-of mp) (point-max)))
+ (select-window (vm-get-buffer-window (current-buffer)))
+ (mime/viewer-mode nil
+ (mime/parse-Content-Type (or ct ""))
+ cte)
+ )))
+
+(set-alist 'mime-viewer/quitting-method-alist
+ 'vm-mode
+ 'tm-vm/quit-view-message)
+
+(set-alist 'mime-viewer/quitting-method-alist
+ 'vm-virtual-mode
+ 'tm-vm/quit-view-message)
+
+