diff lisp/hyperbole/hrmail.el @ 0:376386a54a3c r19-14

Import from CVS: tag r19-14
author cvs
date Mon, 13 Aug 2007 08:45:50 +0200
parents
children 4103f0995bd7
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/hyperbole/hrmail.el	Mon Aug 13 08:45:50 2007 +0200
@@ -0,0 +1,266 @@
+;;!emacs
+;;
+;; FILE:         hrmail.el
+;; SUMMARY:      Support for Hyperbole buttons in mail reader: Rmail.
+;; USAGE:        GNU Emacs Lisp Library
+;; KEYWORDS:     hypermedia, mail
+;;
+;; AUTHOR:       Bob Weiner
+;; ORG:          Brown U.
+;;
+;; ORIG-DATE:     9-May-91 at 04:22:02
+;; LAST-MOD:     19-May-95 at 15:09:04 by Bob Weiner
+;;
+;; This file is part of Hyperbole.
+;; Available for use and distribution under the same terms as GNU Emacs.
+;;
+;; Copyright (C) 1991-1995, Free Software Foundation, Inc.
+;; Developed with support from Motorola Inc.
+;;
+;; DESCRIPTION:  
+;; 
+;;   Automatically configured for use in "hyperbole.el".
+;;   If hsite loading fails prior to initializing Hyperbole Rmail support,
+;;
+;;       {M-x Rmail-init RTN}
+;;
+;;   will do it.
+;;
+;; DESCRIP-END.
+
+;;; ************************************************************************
+;;; Other required Elisp libraries
+;;; ************************************************************************
+
+(require 'hmail)
+(require 'hact)
+(load "hsmail")
+(require 'rmail)
+(load "rmailedit")
+(provide 'rmailedit)
+
+;;; ************************************************************************
+;;; Public variables
+;;; ************************************************************************
+
+;;; ************************************************************************
+;;; Public functions
+;;; ************************************************************************
+
+(defun Rmail-init ()
+  "Initializes Hyperbole support for Rmail mail reading."
+  (interactive)
+  (setq hmail:composer  'mail-mode
+	hmail:lister    'rmail-summary-mode
+	hmail:modifier  'rmail-edit-mode
+	hmail:reader    'rmail-mode)
+  (var:append 'rmail-show-message-hook '(hmail:msg-narrow))
+  ;;
+  ;;
+  ;; Setup public abstract interface to Hyperbole defined mail
+  ;; reader-specific functions used in "hmail.el".
+  ;;
+  (rmail:init)
+  ;;
+  ;; Setup private abstract interface to mail reader-specific functions
+  ;; used in "hmail.el".
+  ;;
+  (fset 'rmail:get-new       'rmail-get-new-mail)
+  (fset 'rmail:msg-forward   'rmail-forward)
+  (fset 'rmail:summ-msg-to   'rmail-summary-goto-msg)
+  (fset 'rmail:summ-new      'rmail-new-summary)
+  (if (interactive-p)
+      (message "Hyperbole RMAIL mail reader support initialized."))
+  )
+
+(defun Rmail-msg-hdrs-full (toggled)
+  "If TOGGLED is non-nil, toggle full/hidden headers, else show full headers."
+  (save-excursion
+    (if (or toggled
+	    (let ((tog nil))
+	      (save-excursion
+		(save-restriction
+		  (rmail-maybe-set-message-counters)
+		  (narrow-to-region (rmail-msgbeg rmail-current-message)
+				    (point-max))
+		  (let ((buffer-read-only nil))
+		    (goto-char (point-min))
+		    (forward-line 1)
+		    ;; Need to show full header
+		    (if (= (following-char) ?1)
+			(setq tog t)))))
+	      tog))
+	(progn (rmail-toggle-header)
+	       (setq toggled t)))
+    toggled))
+
+(defun Rmail-msg-narrow ()
+  "Narrows mail reader buffer to current message.
+This includes Hyperbole button data."
+  (let ((beg (rmail-msgbeg rmail-current-message))
+	(end (rmail-msgend rmail-current-message)))
+    (narrow-to-region beg end)))
+
+(defun Rmail-msg-next ()        (rmail-next-undeleted-message 1))
+
+(defun Rmail-msg-num ()
+  "Returns number of Rmail message that point is within."
+  (interactive)
+  (let ((count 0) opoint)
+    (save-excursion
+     (while (and (not (eobp))
+		 (progn (setq opoint (point))
+			(re-search-backward "^\^_" nil t)))
+       (if (= opoint (point))
+	   (backward-char 1)
+	 (setq count (1+ count)))))
+    count))
+
+(defun Rmail-msg-prev ()        (rmail-previous-undeleted-message 1))
+
+(defun Rmail-msg-to-p (mail-msg-id mail-file)
+  "Sets current buffer to start of msg with MAIL-MSG-ID in MAIL-FILE.
+Returns t if successful, else nil."
+  (if (not (file-readable-p mail-file))
+      nil
+    (let ((buf (get-file-buffer mail-file)))
+      (cond (buf
+	     (switch-to-buffer buf)
+	     (or (eq major-mode 'rmail-mode)
+		 (rmail mail-file)))
+	    (t (rmail mail-file))))
+    (widen)
+    (goto-char 1)
+    (if (re-search-forward (concat rmail:msg-hdr-prefix
+				   (regexp-quote mail-msg-id)) nil t)
+	;; Found matching msg
+	(progn
+	  (setq buffer-read-only t)
+	  (rmail-show-message (Rmail-msg-num))
+	  t))))
+
+
+(defun Rmail-msg-widen ()
+  "Widens buffer to full current message including Hyperbole button data."
+  (let ((start (point-min))
+	(end (point-max)))
+    (unwind-protect
+	(save-excursion
+	  (widen)
+	  (if (re-search-forward "^\^_" nil t)
+	      (progn (forward-char -1)
+		     (setq end (point)))))
+      (narrow-to-region start end))))
+
+(defun Rmail-to ()
+  "Sets current buffer to a mail reader buffer."
+  (and (eq major-mode 'rmail-summary-mode) (set-buffer rmail-buffer)))
+
+(fset 'Rmail-Summ-delete        'rmail-summary-delete-forward)
+
+(fset 'Rmail-Summ-expunge       'rmail-summary-expunge)
+
+(fset 'Rmail-Summ-goto          'rmail-summary-goto-msg)
+
+(defun Rmail-Summ-to ()
+  "Sets current buffer to a mail listing buffer."
+  (and (eq major-mode 'rmail-mode) (set-buffer rmail-summary-buffer)))
+
+(fset 'Rmail-Summ-undelete-all  'rmail-summary-undelete-many)
+
+;;; ************************************************************************
+;;; Private functions
+;;; ************************************************************************
+
+;;;
+;;; Overlay version of this function from "rmailedit.el" to include any
+;;; hidden Hyperbole button data when computing message length.
+(defun rmail-cease-edit ()
+  "Finish editing message; switch back to Rmail proper."
+  (interactive)
+  ;; Make sure buffer ends with a newline.
+  (save-excursion
+    (Rmail-msg-widen)
+    (goto-char (point-max))
+    (if (/= (preceding-char) ?\n)
+	(insert "\n"))
+    ;; Adjust the marker that points to the end of this message.
+    (set-marker (aref rmail-message-vector (1+ rmail-current-message))
+		(point))
+    (hmail:msg-narrow)
+    )
+  (let ((old rmail-old-text))
+    ;; Update the mode line.
+    (set-buffer-modified-p (buffer-modified-p))
+    (rmail-mode-1)
+    (if (and (= (length old) (- (point-max) (point-min)))
+	     (string= old (buffer-substring (point-min) (point-max))))
+	()
+      (setq old nil)
+      (rmail-set-attribute "edited" t)
+      (if (boundp 'rmail-summary-vector)
+	  (progn
+	    (aset rmail-summary-vector (1- rmail-current-message) nil)
+	    (save-excursion
+	      (rmail-widen-to-current-msgbeg
+	        (function (lambda ()
+			    (forward-line 2)
+			    (if (looking-at "Summary-line: ")
+				(let ((buffer-read-only nil))
+				  (delete-region (point)
+						 (progn (forward-line 1)
+							(point))))))))
+	      (rmail-show-message))))))
+  (setq buffer-read-only t))
+
+
+;;; Overlay version of this function from "rmail.el" to include any
+;;; Hyperbole button data.
+(defun rmail-forward (&optional resend)
+  "Forward the current message to another user."
+  (interactive)
+  ;; Resend argument is ignored but for now but is there for Emacs V19 call
+  ;; compatibility.
+  ;;>> this gets set even if we abort. Can't do anything about it, though.
+  (rmail-set-attribute "forwarded" t)
+  (let ((forward-buffer (current-buffer))
+	(subject (concat "["
+			 (mail-strip-quoted-names (mail-fetch-field "From"))
+			 ": " (or (mail-fetch-field "Subject") "") "]")))
+    (save-restriction
+      (Rmail-msg-widen)
+      ;; If only one window, use it for the mail buffer.
+      ;; Otherwise, use another window for the mail buffer
+      ;; so that the Rmail buffer remains visible
+      ;; and sending the mail will get back to it.
+      (if (if (one-window-p t)
+	      (mail nil nil subject)
+	    (mail-other-window nil nil subject))
+	  (save-excursion
+	    (goto-char (point-max))
+	    (forward-line 1)
+	    (insert-buffer forward-buffer)
+	    (hmail:msg-narrow)
+	    )))))
+
+;;; Overlay version of 'rmail-get-new-mail' from "rmail.el" to highlight
+;;; Hyperbole buttons when possible.
+;;;
+(hypb:function-overload 'rmail-get-new-mail nil
+			'(if (fboundp 'hproperty:but-create)
+			     (progn (widen) (hproperty:but-create)
+				    (rmail-show-message))))
+
+;;; Overlay version of 'rmail-new-summary' from "rmailsum.el" to
+;;; highlight Hyperbole buttons when possible.
+;;;
+(or (fboundp 'rmail-new-summary) (load "rmailsum"))
+(hypb:function-overload 'rmail-new-summary nil
+			'(if (fboundp 'hproperty:but-create)
+			     (hproperty:but-create)))
+
+;;; ************************************************************************
+;;; Private variables
+;;; ************************************************************************
+
+(provide 'hrmail)