This commit was generated by cvs2svn to compensate for changes in r377,
[elisp/tm.git] / tm-vm.el
index a9718ed..dd876f7 100644 (file)
--- a/tm-vm.el
+++ b/tm-vm.el
@@ -1,24 +1,26 @@
 ;;;
 ;;; tm-vm.el --- tm-MUA for VM
 ;;;
-;;; Copyright (C) 1995 Free Software Foundation, Inc.
-;;; 
-;;; Author:   MASUTANI Yasuhiro <masutani@me.es.osaka-u.ac.jp>
-;;;           Kenji Wakamiya <wkenji@flab.fujitsu.co.jp>
-;;;           MORIOKA Tomohiko <morioka@jaist.ac.jp>
-;;;           Shuhei KOBAYASHI <shuhei@cmpt01.phys.tohoku.ac.jp>
-;;;           Oscar Figueiredo <figueire@lspsun2.epfl.ch>
+;;; Copyright (C) 1994 MASUTANI Yasuhiro
+;;; Copyright (C) 1995 WAKAMIYA Kenji
+;;; Copyright (C) 1995,1996 KOBAYASHI Shuhei
+;;; Copyright (C) 1996 Oscar Figueiredo
+;;;
+;;; Author: MASUTANI Yasuhiro <masutani@me.es.osaka-u.ac.jp>
+;;;         Kenji Wakamiya <wkenji@flab.fujitsu.co.jp>
+;;;         MORIOKA Tomohiko <morioka@jaist.ac.jp>
+;;;         KOBAYASHI Shuhei <shuhei-k@jaist.ac.jp>
+;;;         Oscar Figueiredo <figueire@lspsun2.epfl.ch>
 ;;; modified by SHIONO Jun'ichi <jun@case.nm.fujitsu.co.jp>
-;;;         and ISHIHARA Akito <aki@bpel.tutics.tut.ac.jp>
-;;; Maintainer: Shuhei KOBAYASHI <shuhei@cmpt01.phys.tohoku.ac.jp>
+;;;             ISHIHARA Akito <aki@bpel.tutics.tut.ac.jp>
+;;;             Rob Kooper <kooper@cc.gatech.edu>
+;;; Maintainer: KOBAYASHI Shuhei <shuhei-k@jaist.ac.jp>
 ;;; Created: 1994/10/29
-;;; Version: $Revision: 7.39 $
+;;; Version: $Revision: 7.52 $
 ;;; Keywords: mail, MIME, multimedia, multilingual, encoded-word
 ;;;
 ;;; This file is part of tm (Tools for MIME).
 ;;;
-;;; Plese insert (require 'tm-vm) in your ~/.vm or ~/.emacs file.
-;;;
 ;;; This program is free software; you can redistribute it and/or
 ;;; modify it under the terms of the GNU General Public License as
 ;;; published by the Free Software Foundation; either version 2, or
 ;;; along with This program.  If not, write to the Free Software
 ;;; Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
 ;;;
+;;; Commentary:
+;;; 
+;;; Plese insert `(require 'tm-vm)' in your ~/.vm file.
+;;;
 ;;; Code:
 
 (require 'tm-view)
 (require 'vm)
 
 (defconst tm-vm/RCS-ID
-  "$Id: tm-vm.el,v 7.39 1996/01/23 04:46:54 morioka Exp $")
+  "$Id: tm-vm.el,v 7.52 1996/04/19 18:49:19 shuhei-k Exp $")
 (defconst tm-vm/version (get-version-string tm-vm/RCS-ID))
 
 (define-key vm-mode-map "Z" 'tm-vm/view-message)
 (define-key vm-mode-map "T" 'tm-vm/decode-message-header)
 (define-key vm-mode-map "\et" 'tm-vm/toggle-preview-mode)
 
+(defvar tm-vm/use-original-url-button nil
+  "*If it is t, use original URL button instead of tm's.")
+
 (defvar tm-vm-load-hook nil
   "*List of functions called after tm-vm is loaded.")
 
@@ -217,10 +226,30 @@ tm-vm uses `vm-select-message-hook', use this hook instead.")
           (progn
             (set (make-local-variable 'tm-vm/system-state) 'previewing)
             (save-window-excursion
-              (mime/viewer-mode)
-              (goto-char (point-min))
-              (narrow-to-region (point)
-                                (search-forward "\n\n" nil t))
+             (vm-widen-page)
+             (goto-char (point-max))
+             (widen)
+             (narrow-to-region (point)
+                               (save-excursion
+                                 (goto-char
+                                  (vm-start-of (car vm-message-pointer))
+                                  )
+                                 (forward-line)
+                                 (point)
+                                 ))
+             (mime/viewer-mode)
+             (if (and tm-vm/use-original-url-button
+                      vm-use-menus (vm-menu-support-possible-p))
+                 (vm-energize-urls))
+             ;; 1996/2/16, fixed by
+             ;;    Oscar Figueiredo <figueire@lspsun2.epfl.ch>
+             ;; Highlight message (and display XFace if supported)
+             (if (or vm-highlighted-header-regexp
+                     (and (vm-xemacs-p) vm-use-lucid-highlighting))
+                 (vm-highlight-headers))
+             ;;
+             (goto-char (point-min))
+              (narrow-to-region (point) (search-forward "\n\n" nil t))
               ))
         ;; don't do MIME processing. decode header only.
         (let (buffer-read-only)
@@ -332,7 +361,7 @@ tm-vm uses `vm-select-message-hook', use this hook instead.")
          (setq mwin (vm-get-buffer-window mbuf)
                pwin (and pbuf (vm-get-buffer-window pbuf)))
          (cond
-          (was-invisible
+          ((or mp-changed was-invisible)
            nil
            )
           ((null pbuf)
@@ -401,7 +430,9 @@ tm-vm uses `vm-select-message-hook', use this hook instead.")
   "Moves to the beginning of the current message."
   (interactive)
   (if (not (tm-vm/system-state))
-      (vm-beginning-of-message)
+      (progn
+       (setq this-command 'vm-beginning-of-message)
+       (vm-beginning-of-message))
     (vm-follow-summary-cursor)
     (vm-select-folder-buffer)
     (vm-check-for-killed-summary)
@@ -429,7 +460,9 @@ tm-vm uses `vm-select-message-hook', use this hook instead.")
   "Moves to the end of the current message."
   (interactive)
   (if (not (tm-vm/system-state))
-      (vm-end-of-message)
+      (progn
+       (setq this-command 'vm-end-of-message)
+       (vm-end-of-message))
     (vm-follow-summary-cursor)
     (vm-select-folder-buffer)
     (vm-check-for-killed-summary)
@@ -530,6 +563,107 @@ tm-vm uses `vm-select-message-hook', use this hook instead.")
 (set-alist 'mime-viewer/over-to-next-method-alist
           'vm-virtual-mode 'tm-vm/next-message)
 
+;;; @@ vm-yank-message
+;;;
+;; 1996/3/28 by Oscar Figueiredo <figueire@lspsun16.epfl.ch>
+
+(require 'vm-reply)
+
+(defun vm-yank-message (message)
+  "Yank message number N into the current buffer at point.
+When called interactively N is always read from the minibuffer.  When
+called non-interactively the first argument is expected to be a
+message struct.
+
+This function originally provided by vm-reply has been patched for TM in
+order to provide better citation of MIME messages : if a MIME Preview
+buffer is displayed for the message then its contents are inserted
+instead of the raw message.
+
+This command is meant to be used in VM created Mail mode buffers; the
+yanked message comes from the mail buffer containing the message you
+are replying to, forwarding, or invoked VM's mail command from.
+
+All message headers are yanked along with the text.  Point is
+left before the inserted text, the mark after.  Any hook
+functions bound to mail-citation-hook are run, after inserting
+the text and setting point and mark.  For backward compatibility,
+if mail-citation-hook is set to nil, `mail-yank-hooks' is run
+instead.
+
+If mail-citation-hook and mail-yank-hooks are both nil, this
+default action is taken: the yanked headers are trimmed as
+specified by vm-included-text-headers and
+vm-included-text-discard-header-regexp, and the value of
+vm-included-text-prefix is prepended to every yanked line."
+  (interactive
+   (list
+    ;; What we really want for the first argument is a message struct,
+    ;; but if called interactively, we let the user type in a message
+    ;; number instead.
+    (let (mp default
+            (result 0)
+            prompt
+            (last-command last-command)
+            (this-command this-command))
+      (save-excursion
+       (vm-select-folder-buffer)
+       (setq default (and vm-message-pointer
+                          (vm-number-of (car vm-message-pointer)))
+             prompt (if default
+                        (format "Yank message number: (default %s) "
+                                default)
+                      "Yank message number: "))
+       (while (zerop result)
+         (setq result (read-string prompt))
+         (and (string= result "") default (setq result default))
+         (setq result (string-to-int result)))
+       (if (null (setq mp (nthcdr (1- result) vm-message-list)))
+           (error "No such message.")))
+      (car mp))))
+  (if (not (bufferp vm-mail-buffer))
+      (error "This is not a VM Mail mode buffer."))
+  (if (null (buffer-name vm-mail-buffer))
+      (error "The folder buffer containing message %d has been killed."
+            (vm-number-of message)))
+  (vm-display nil nil '(vm-yank-message) '(vm-yank-message composing-message))
+  (setq message (vm-real-message-of message))
+  (let ((b (current-buffer)) (start (point)) end)
+    (save-restriction
+      (widen)
+      (save-excursion
+       (set-buffer (vm-buffer-of message))
+       (let* ((mbuf (current-buffer))
+              (pbuf (and mime::article/preview-buffer
+                         (get-buffer mime::article/preview-buffer)))
+              (pwin (and pbuf (vm-get-visible-buffer-window pbuf))))
+         (if pwin
+             (if running-xemacs
+                 (let ((tmp (generate-new-buffer "tm-vm/tmp")))
+                   (set-buffer pbuf)
+                   (append-to-buffer tmp (point-min) (point-max))
+                   (set-buffer tmp)
+                   (map-extents
+                    '(lambda (ext maparg) 
+                       (set-extent-property ext 'begin-glyph nil)))
+                   (append-to-buffer b (point-min) (point-max))
+                   (setq end (vm-marker (+ start (length (buffer-string))) b))
+                   (kill-buffer tmp))
+               (set-buffer pbuf)
+               (append-to-buffer b (point-min) (point-max))
+               (setq end (vm-marker (+ start (length (buffer-string))) b)))
+           (save-restriction
+             (widen)
+             (append-to-buffer
+              b (vm-headers-of message) (vm-text-end-of message))
+             (setq end
+                   (vm-marker (+ start (- (vm-text-end-of message)
+                                          (vm-headers-of message))) b))))))
+      (push-mark end)
+      (cond (mail-citation-hook (run-hooks 'mail-citation-hook))
+           (mail-yank-hooks (run-hooks 'mail-yank-hooks))
+           (t (vm-mail-yank-default message))))))
+
 \f
 ;;; @ for tm-view
 ;;;
@@ -544,7 +678,7 @@ This function is called by `mime-viewer/quit' command via
            (save-excursion
              (set-buffer mime::preview/article-buffer)
              vm-summary-buffer))
-      (switch-to-buffer mime::preview/mother-buffer)
+      (switch-to-buffer mime::preview/article-buffer)
     (mime-viewer/kill-buffer)
     (vm-select-folder-buffer)
     (setq tm-vm/system-state nil))
@@ -627,7 +761,7 @@ created to send a digest in multipart/digest type format.
 If `vm-digest-send-type' is \"rfc1521\", tm-vm runs this hook
 instead of `vm-send-digest-hook'.")
 
-(defun tm-vm/enclose-messages (mlist)
+(defun tm-vm/enclose-messages (mlist &optional preamble)
   "Enclose the messages in MLIST as multipart/digest.
 The resulting digest is inserted at point in the current buffer.
 
@@ -635,6 +769,7 @@ MLIST should be a list of message structs (real or virtual).
 These are the messages that will be enclosed."
   (if mlist
       (let ((digest (consp (cdr mlist)))
+            (mp mlist)
             m)
        (save-restriction
          (narrow-to-region (point) (point))
@@ -644,6 +779,21 @@ These are the messages that will be enclosed."
             (tm-mail/insert-message m)
             (goto-char (point-max))
            (setq mlist (cdr mlist)))
+          (if preamble
+              (progn
+                (goto-char (point-min))
+                (mime-editor/insert-tag "text" "plain")
+                (vm-unsaved-message "Building digest preamble...")
+                (while mp
+                  (let ((vm-summary-uninteresting-senders nil))
+                    (insert
+                     (vm-sprintf 'vm-digest-preamble-format (car mp)) "\n"))
+                  (if vm-digest-center-preamble
+                      (progn
+                        (forward-char -1)
+                        (center-line)
+                        (forward-char 1)))
+                  (setq mp (cdr mp)))))
           (if digest
               (mime-editor/enclose-digest-region (point-min) (point-max)))
           ))))
@@ -688,7 +838,7 @@ Subject: header manually."
         (run-hooks 'tm-vm/forward-message-hook)
         (run-hooks 'vm-mail-mode-hook)))))
 
-(defun tm-vm/send-digest (&optional prefix)
+(defun tm-vm/send-digest (&optional arg)
   "Send a digest of all messages in the current folder to recipients.
 The type of the digest is specified by the variable vm-digest-send-type.
 You will be placed in a Mail mode buffer as is usual with replies, but you
@@ -698,45 +848,26 @@ If invoked on marked messages (via vm-next-command-uses-marks),
 only marked messages will be put into the digest."
   (interactive "P")
   (if (not (equal vm-digest-send-type "rfc1521"))
-      (vm-send-digest prefix)
+      (vm-send-digest arg)
     (vm-select-folder-buffer)
     (vm-check-for-killed-summary)
     (vm-error-if-folder-empty)
     (let ((dir default-directory)
-          (mp vm-message-pointer)
-          (mlist (if (eq last-command 'vm-next-command-uses-marks)
-                     (vm-select-marked-or-prefixed-messages 0)
-                   vm-message-list))
+          (vm-forward-list (if (eq last-command 'vm-next-command-uses-marks)
+                               (vm-select-marked-or-prefixed-messages 0)
+                             vm-message-list))
           start)
       (save-restriction
         (widen)
         (vm-mail-internal (format "digest from %s" (buffer-name)))
         (setq vm-system-state 'forwarding
-              vm-forward-list mlist
               default-directory dir)
         (goto-char (point-min))
         (re-search-forward (concat "^" (regexp-quote mail-header-separator)
                                    "\n"))
         (goto-char (match-end 0))
-        (setq start (point)
-              mp mlist)
         (vm-unsaved-message "Building %s digest..." vm-digest-send-type)
-        (tm-vm/enclose-messages mlist)
-        (goto-char start)
-        (setq mp mlist)
-        (if prefix
-         (progn
-            (mime-editor/insert-tag "text" "plain")
-           (vm-unsaved-message "Building digest preamble...")
-           (while mp
-             (let ((vm-summary-uninteresting-senders nil))
-               (insert (vm-sprintf 'vm-digest-preamble-format (car mp)) "\n"))
-             (if vm-digest-center-preamble
-                 (progn
-                   (forward-char -1)
-                   (center-line)
-                   (forward-char 1)))
-             (setq mp (cdr mp)))))
+        (tm-vm/enclose-messages vm-forward-list arg)
         (mail-position-on-field "To")
         (message "Building %s digest... done" vm-digest-send-type)))
     (run-hooks 'tm-vm/send-digest-hook)
@@ -746,9 +877,6 @@ only marked messages will be put into the digest."
                           'tm-vm/forward-message vm-mode-map)
 (substitute-key-definition 'vm-send-digest
                           'tm-vm/send-digest vm-mode-map)
-
-;;; @@ for message/rfc822
-;;;
 \f
 
 ;;; @@ setting