diff lisp/vm/vm-toolbar.el @ 0:376386a54a3c r19-14

Import from CVS: tag r19-14
author cvs
date Mon, 13 Aug 2007 08:45:50 +0200
parents
children 49a24b4fd526
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/vm/vm-toolbar.el	Mon Aug 13 08:45:50 2007 +0200
@@ -0,0 +1,362 @@
+;;; Toolbar related functions and commands
+;;; Copyright (C) 1995 Kyle E. Jones
+;;;
+;;; 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 1, or (at your option)
+;;; any later version.
+;;;
+;;; This program is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with this program; if not, write to the Free Software
+;;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+(provide 'vm-toolbar)
+
+(defvar vm-toolbar-specifier nil)
+(defvar vm-toolbar nil)
+
+(defvar vm-toolbar-next-button
+  [vm-toolbar-next-icon
+   vm-toolbar-next-command
+   (vm-toolbar-any-messages-p)
+   "Go to the next message.\n
+The command `vm-toolbar-next-command' is run, which is normally
+bound to `vm-next-message'.
+You can make this button run some other command by using a Lisp
+s-expression like this one in your .vm file:
+   (fset 'vm-toolbar-next-command 'some-other-command)"])
+(defvar vm-toolbar-next-icon nil)
+(or (fboundp 'vm-toolbar-next-command)
+    (fset 'vm-toolbar-next-command 'vm-next-message))
+
+(defvar vm-toolbar-previous-button
+  [vm-toolbar-previous-icon
+   vm-toolbar-previous-command
+   (vm-toolbar-any-messages-p)
+   "Go to the previous message.\n
+The command `vm-toolbar-previous-command' is run, which is normally
+bound to `vm-previous-message'.
+You can make this button run some other command by using a Lisp
+s-expression like this one in your .vm file:
+   (fset 'vm-toolbar-previous-command 'some-other-command)"])
+(defvar vm-toolbar-previous-icon nil)
+(or (fboundp 'vm-toolbar-previous-command)
+    (fset 'vm-toolbar-previous-command 'vm-previous-message))
+
+(defvar vm-toolbar-autofile-button
+  [vm-toolbar-autofile-icon
+   vm-toolbar-autofile-message
+   (vm-toolbar-can-autofile-p)
+  "Save the current message to a folder selected using vm-auto-folder-alist."])
+(defvar vm-toolbar-autofile-icon nil)
+
+(defvar vm-toolbar-file-button
+  [vm-toolbar-file-icon vm-toolbar-file-command (vm-toolbar-any-messages-p)
+   "Save the current message to a folder.\n
+The command `vm-toolbar-file-command' is run, which is normally
+bound to `vm-save-message'.
+You can make this button run some other command by using a Lisp
+s-expression like this one in your .vm file:
+   (fset 'vm-toolbar-file-command 'some-other-command)"])
+(defvar vm-toolbar-file-icon nil)
+(or (fboundp 'vm-toolbar-file-command)
+    (fset 'vm-toolbar-file-command 'vm-save-message))
+
+(defvar vm-toolbar-print-button
+  [vm-toolbar-print-icon
+   vm-toolbar-print-command
+   (vm-toolbar-any-messages-p)
+   "Print the current message.\n
+The command `vm-toolbar-print-command' is run, which is normally
+bound to `vm-print-message'.
+You can make this button run some other command by using a Lisp
+s-expression like this one in your .vm file:
+   (fset 'vm-toolbar-print-command 'some-other-command)"])
+(defvar vm-toolbar-print-icon nil)
+(or (fboundp 'vm-toolbar-print-command)
+    (fset 'vm-toolbar-print-command 'vm-print-message))
+
+(defvar vm-toolbar-visit-button
+  [vm-toolbar-visit-icon vm-toolbar-visit-command t
+   "Visit a different folder.\n
+The command `vm-toolbar-visit-command' is run, which is normally
+bound to `vm-visit-folder'.
+You can make this button run some other command by using a Lisp
+s-expression like this one in your .vm file:
+   (fset 'vm-toolbar-visit-command 'some-other-command)"])
+(defvar vm-toolbar-visit-icon nil)
+(or (fboundp 'vm-toolbar-visit-command)
+    (fset 'vm-toolbar-visit-command 'vm-visit-folder))
+
+(defvar vm-toolbar-reply-button
+  [vm-toolbar-reply-icon
+   vm-toolbar-reply-command
+   (vm-toolbar-any-messages-p)
+   "Reply to the current message.\n
+The command `vm-toolbar-reply-command' is run, which is normally
+bound to `vm-followup-include-text'.
+You can make this button run some other command by using a Lisp
+s-expression like this one in your .vm file:
+   (fset 'vm-toolbar-reply-command 'some-other-command)"])
+(defvar vm-toolbar-reply-icon nil)
+(or (fboundp 'vm-toolbar-reply-command)
+    (fset 'vm-toolbar-reply-command 'vm-followup-include-text))
+
+(defvar vm-toolbar-compose-button
+  [vm-toolbar-compose-icon vm-toolbar-compose-command t
+   "Compose a new message.\n
+The command `vm-toolbar-compose-command' is run, which is normally
+bound to `vm-mail'.
+You can make this button run some other command by using a Lisp
+s-expression like this one in your .vm file:
+   (fset 'vm-toolbar-compose-command 'some-other-command)"])
+(defvar vm-toolbar-compose-icon nil)
+(or (fboundp 'vm-toolbar-compose-command)
+    (fset 'vm-toolbar-compose-command 'vm-mail))
+
+(defvar vm-toolbar-delete-icon nil)
+
+(defvar vm-toolbar-undelete-icon nil)
+
+(defvar vm-toolbar-delete/undelete-button
+  [vm-toolbar-delete/undelete-icon
+   vm-toolbar-delete/undelete-message
+   (vm-toolbar-any-messages-p)
+   "Delete the current message, or undelete it if it is already deleted."])
+(defvar vm-toolbar-delete/undelete-icon nil)
+(make-variable-buffer-local 'vm-toolbar-delete/undelete-icon)
+
+(defvar vm-toolbar-help-icon nil)
+
+(defvar vm-toolbar-recover-icon nil)
+
+(defvar vm-toolbar-helper-icon nil)
+(make-variable-buffer-local 'vm-toolbar-helper-icon)
+
+(defvar vm-toolbar-help-button
+  [vm-toolbar-helper-icon vm-toolbar-helper-command t
+   "Don't Panic.\n
+VM uses this button to offer help if you're in trouble.
+Under normal circumstances, this button runs `vm-help'.\n
+If the current folder looks out-of-date relative to its auto-save
+file then this button will run `recover-file'."])
+
+(defvar vm-toolbar-helper-command nil)
+(make-variable-buffer-local 'vm-toolbar-helper-command)
+
+(defun vm-toolbar-helper-command ()
+  (interactive)
+  (setq this-command vm-toolbar-helper-command)
+  (call-interactively vm-toolbar-helper-command))
+
+(defvar vm-toolbar-quit-button
+  [vm-toolbar-quit-icon vm-toolbar-quit-command t
+   "Quit VM.\n
+The command `vm-toolbar-quit-command' is run, which is normally
+bound to `vm-quit'.
+You can make this button run some other command by using a Lisp
+s-expression like this one in your .vm file:
+   (fset 'vm-toolbar-quit-command 'some-other-command)"])
+(defvar vm-toolbar-quit-icon nil)
+(or (fboundp 'vm-toolbar-quit-command)
+    (fset 'vm-toolbar-quit-command 'vm-quit))
+
+(defun vm-toolbar-any-messages-p ()
+  (save-excursion
+    (vm-check-for-killed-folder)
+    (vm-select-folder-buffer)
+    vm-message-list))
+
+(defun vm-toolbar-delete/undelete-message (&optional prefix-arg)
+  (interactive "P")
+  (vm-follow-summary-cursor)
+  (vm-select-folder-buffer)
+  (vm-check-for-killed-summary)
+  (vm-error-if-folder-read-only)
+  (vm-error-if-folder-empty)
+  (let ((current-prefix-arg prefix-arg))
+    (if (vm-deleted-flag (car vm-message-pointer))
+	(call-interactively 'vm-undelete-message)
+      (call-interactively 'vm-delete-message))))
+
+(defun vm-toolbar-can-autofile-p ()
+  (interactive)
+  (save-excursion
+    (vm-check-for-killed-folder)
+    (vm-select-folder-buffer)
+    (and vm-message-pointer
+	 (vm-auto-select-folder vm-message-pointer vm-auto-folder-alist))))
+
+(defun vm-toolbar-autofile-message ()
+  (interactive)
+  (vm-follow-summary-cursor)
+  (vm-select-folder-buffer)
+  (vm-check-for-killed-summary)
+  (vm-error-if-folder-read-only)
+  (vm-error-if-folder-empty)
+  (let ((file (vm-auto-select-folder vm-message-pointer vm-auto-folder-alist)))
+    (if file
+	(progn
+	  (vm-save-message file 1)
+	  (message "Message saved to %s" file))
+      (error "No match for message in vm-auto-folder-alist."))))
+
+(defun vm-toolbar-can-recover-p ()
+  (save-excursion
+    (vm-check-for-killed-folder)
+    (vm-select-folder-buffer)
+    (and vm-folder-read-only
+	 buffer-file-name
+	 buffer-auto-save-file-name
+	 (null (buffer-modified-p))
+	 (file-newer-than-file-p
+	  buffer-auto-save-file-name
+	  buffer-file-name))))
+
+(defun vm-toolbar-update-toolbar ()
+  (if (and vm-message-pointer (vm-deleted-flag (car vm-message-pointer)))
+      (setq vm-toolbar-delete/undelete-icon vm-toolbar-undelete-icon)
+    (setq vm-toolbar-delete/undelete-icon vm-toolbar-delete-icon))
+  (cond ((vm-toolbar-can-recover-p)
+	 (setq vm-toolbar-helper-command 'recover-file
+	       vm-toolbar-helper-icon vm-toolbar-recover-icon))
+	(t
+	 (setq vm-toolbar-helper-command 'vm-help
+	       vm-toolbar-helper-icon vm-toolbar-help-icon)))
+  (if vm-summary-buffer
+      (vm-copy-local-variables vm-summary-buffer
+			       'vm-toolbar-delete/undelete-icon
+			       'vm-toolbar-helper-command
+			       'vm-toolbar-helper-icon))
+  (and vm-toolbar-specifier
+       (progn
+	 (let ((locale (if (memq 'vm-delete-buffer-frame kill-buffer-hook)
+			   (selected-frame)
+			 (current-buffer))))
+	   (set-specifier vm-toolbar-specifier (cons locale nil))
+	   (set-specifier vm-toolbar-specifier (cons locale vm-toolbar))))))
+
+(defun vm-toolbar-install-toolbar ()
+  (vm-toolbar-initialize)
+  (let ((toolbar (vm-toolbar-make-toolbar-spec))
+	(height (+ 4 (glyph-height (car vm-toolbar-help-icon))))
+	(width (+ 4 (glyph-width (car vm-toolbar-help-icon))))
+	(locale (if (memq 'vm-delete-buffer-frame kill-buffer-hook)
+		    (selected-frame)
+		  (current-buffer))))
+    (setq vm-toolbar toolbar)
+    (cond ((eq vm-toolbar-orientation 'right)
+	   (setq vm-toolbar-specifier right-toolbar)
+	   (set-specifier right-toolbar (cons locale toolbar))
+	   (set-specifier right-toolbar-width (cons (selected-frame) width)))
+	  ((eq vm-toolbar-orientation 'left)
+	   (setq vm-toolbar-specifier left-toolbar)
+	   (set-specifier left-toolbar (cons locale toolbar))
+	   (set-specifier left-toolbar-width (cons (selected-frame) width)))
+	  ((eq vm-toolbar-orientation 'bottom)
+	   (setq vm-toolbar-specifier bottom-toolbar)
+	   (set-specifier bottom-toolbar (cons locale toolbar))
+	   (set-specifier bottom-toolbar-height (cons (selected-frame)
+						      height)))
+	  (t
+	   (setq vm-toolbar-specifier top-toolbar)
+	   (set-specifier top-toolbar (cons locale toolbar))
+	   (set-specifier top-toolbar-height (cons (selected-frame)
+						   height))))))
+
+(defun vm-toolbar-make-toolbar-spec ()
+  (let ((button-alist '(
+			(autofile . vm-toolbar-autofile-button)
+			(compose . vm-toolbar-compose-button)
+			(delete/undelete . vm-toolbar-delete/undelete-button)
+			(file . vm-toolbar-file-button)
+			(help . vm-toolbar-help-button)
+			(next . vm-toolbar-next-button)
+			(previous . vm-toolbar-previous-button)
+			(print . vm-toolbar-print-button)
+			(quit . vm-toolbar-quit-button)
+			(reply . vm-toolbar-reply-button)
+			(visit . vm-toolbar-visit-button)
+			))
+	(button-list vm-use-toolbar)
+	cons
+	(toolbar nil))
+    (while button-list
+      (if (null (car button-list))
+	  (setq toolbar (cons nil toolbar))
+	(setq cons (assq (car button-list) button-alist))
+	(if cons
+	    (setq toolbar (cons (symbol-value (cdr cons)) toolbar))))
+      (setq button-list (cdr button-list)))
+    (nreverse toolbar) ))
+
+(defun vm-toolbar-initialize ()
+  ;; drag these in now instead of waiting for them to be
+  ;; autoloaded.  the "loading..." messages could come at a bad
+  ;; moment and wipe an important echo area message, like "Auto
+  ;; save file is newer..."
+  (require 'vm-save)
+  (require 'vm-summary)
+  (cond
+   ((null vm-toolbar-help-icon)
+    (let ((tuples
+	   (if (featurep 'xpm)
+	       '(
+ (vm-toolbar-next-icon "next-up.xpm" "next-dn.xpm" "next-dn.xpm")
+ (vm-toolbar-previous-icon "previous-up.xpm" "previous-dn.xpm"
+			   "previous-dn.xpm")
+ (vm-toolbar-delete-icon "delete-up.xpm" "delete-dn.xpm" "delete-dn.xpm")
+ (vm-toolbar-undelete-icon "undelete-up.xpm" "undelete-dn.xpm"
+			   "undelete-dn.xpm")
+ (vm-toolbar-autofile-icon "autofile-up.xpm" "autofile-dn.xpm"
+			   "autofile-dn.xpm")
+ (vm-toolbar-file-icon "file-up.xpm" "file-dn.xpm" "file-dn.xpm")
+ (vm-toolbar-reply-icon "reply-up.xpm" "reply-dn.xpm" "reply-dn.xpm")
+ (vm-toolbar-compose-icon "compose-up.xpm" "compose-dn.xpm" "compose-dn.xpm")
+ (vm-toolbar-print-icon "print-up.xpm" "print-dn.xpm" "print-dn.xpm")
+ (vm-toolbar-visit-icon "visit-up.xpm" "visit-dn.xpm" "visit-dn.xpm")
+ (vm-toolbar-quit-icon "quit-up.xpm" "quit-dn.xpm" "quit-dn.xpm")
+ (vm-toolbar-help-icon "help-up.xpm" "help-dn.xpm" "help-dn.xpm")
+ (vm-toolbar-recover-icon "recover-up.xpm" "recover-dn.xpm" "recover-dn.xpm")
+	   )
+	       '(
+ (vm-toolbar-next-icon "next-up.xbm" "next-dn.xbm" "next-xx.xbm")
+ (vm-toolbar-previous-icon "previous-up.xbm" "previous-dn.xbm"
+			   "previous-xx.xbm")
+ (vm-toolbar-delete-icon "delete-up.xbm" "delete-dn.xbm" "delete-xx.xbm")
+ (vm-toolbar-undelete-icon "undelete-up.xbm" "undelete-dn.xbm"
+			   "undelete-xx.xbm")
+ (vm-toolbar-autofile-icon "autofile-up.xbm" "autofile-dn.xbm"
+			   "autofile-xx.xbm")
+ (vm-toolbar-file-icon "file-up.xbm" "file-dn.xbm" "file-xx.xbm")
+ (vm-toolbar-reply-icon "reply-up.xbm" "reply-dn.xbm" "reply-xx.xbm")
+ (vm-toolbar-compose-icon "compose-up.xbm" "compose-dn.xbm" "compose-xx.xbm")
+ (vm-toolbar-print-icon "print-up.xbm" "print-dn.xbm" "print-xx.xbm")
+ (vm-toolbar-visit-icon "visit-up.xbm" "visit-dn.xbm" "visit-xx.xbm")
+ (vm-toolbar-quit-icon "quit-up.xbm" "quit-dn.xbm" "quit-xx.xbm")
+ (vm-toolbar-help-icon "help-up.xbm" "help-dn.xbm" "help-xx.xpm")
+ (vm-toolbar-recover-icon "recover-up.xbm" "recover-dn.xbm" "recover-xx.xpm")
+	   )))
+	  tuple files var)
+      (if (not (file-directory-p vm-toolbar-pixmap-directory))
+	  (error "Bad toolbar pixmap directory: %s"
+		 vm-toolbar-pixmap-directory)
+	(while tuples
+	  (setq tuple (car tuples)
+		var (car tuple)
+		files (cdr tuple))
+	  (set var (mapcar
+		    (function
+		     (lambda (f)
+		       (make-glyph
+			(expand-file-name f vm-toolbar-pixmap-directory))))
+		    files))
+	  (setq tuples (cdr tuples)))))))
+  (setq vm-toolbar-delete/undelete-icon vm-toolbar-delete-icon)
+  (setq vm-toolbar-helper-command 'vm-help)
+  (setq vm-toolbar-helper-icon vm-toolbar-help-icon))