(gnus-offline-agent-automatic-expire): Fix typo.
[elisp/gnus.git-] / lisp / gnus-offline.el
index a73f29e..1e9b95f 100644 (file)
@@ -1,13 +1,14 @@
 ;;; gnus-offline.el --- To process mail & news at offline environment.
-;;; $Id: gnus-offline.el,v 1.1.2.5.2.23 1999-01-06 22:22:40 yamaoka Exp $
+;;; $Id: gnus-offline.el,v 1.1.2.5.2.36.4.4 1999-08-27 16:56:16 czkmt Exp $
 
 ;;; Copyright (C) 1998 Tatsuya Ichikawa
 ;;;                    Yukihiro Ito
 ;;; Author: Tatsuya Ichikawa <t-ichi@po.shiojiri.ne.jp>
 ;;;         Yukihiro Ito <ito@rs.civil.tohoku.ac.jp>
 ;;;         Hidekazu Nakamura <u90121@uis-inf.co.jp>
+;;;         Tsukamoto Tetsuo <czkmt@remus.dti.ne.jp>
 
-;;; Version: 2.01
+;;; Version: 2.20
 ;;; Keywords: news , mail , offline , gnus
 ;;;
 ;;; SPECIAL THANKS
@@ -38,7 +39,7 @@
 ;;;   This file needs miee.el and SEMI.
 ;;;   If you set gnus-offline-drafts-queue-type to 'agent , you don't need 
 ;;;   miee.el
-;;;   You must use Semi-gnus 6.X.X.
+;;;   You must use T-gnus 6.12.0 or later.
 ;;;
 ;;; How to use.
 ;;;
@@ -46,7 +47,6 @@
 ;;;
 ;;;    (load "gnus-ofsetup")
 ;;;    (gnus-setup-for-offline)
-;;;    (load gnus-offline-setting-file)
 ;;;
 ;;; If you use gnus-agent as souper , put gnus-agent setup code in you .gnus.el
 ;;;
 
 (require 'cl)
 (require 'custom)
-(require 'pop3-fma)
 (require 'easymenu)
+(provide 'gnus-offline)
 
-(unless (and (condition-case ()
-                (require 'custom)
-              (file-error nil))
-            (fboundp 'defgroup)
-            (fboundp 'defcustom))
-  (require 'backquote)
-  (defmacro defgroup (&rest args))
-  (defmacro defcustom (symbol value &optional doc &rest args)
-    (` (defvar (, symbol) (, value) (, doc))))
-  )
 (defgroup gnus-offline nil
   "Offline backend utility for Gnus."
   :prefix "gnus-offline-"
   :group 'mail
   :group 'news)
 
-(defconst gnus-offline-version-number "2.02")
+(defconst gnus-offline-version-number "2.20")
 (defconst gnus-offline-codename
 ;;  "Beta5"                    ; Beta
 ;;  "This is the time"         ; 2.00
 ;;  "A matter of trust"
-  "Modern Woman"
+;;  "Modern Woman"
+;;  "Ahhhhhhh!!"               ; 2.10b1
+  "Cup of life"                 ; 2.20
 ;;  "Code of silence"
   )
 
 (defconst gnus-offline-version (format "Gnus offline backend utiliy v%s"
                                       gnus-offline-version-number))
 
-(defcustom gnus-offline-dialup-program-arguments nil
-  "*Program arguments of gnus-offline-dialup-program."
-  :group 'gnus-offline
-  :type '(repeat (string :tag "Argument")))
+(eval-when-compile
+  (mapc
+   #'(lambda (symbol)
+       (unless (boundp symbol)
+        (make-local-variable symbol)
+        (eval (list 'setq symbol nil))))
+   '(nnagent-version
+     nnspool-version
+     msspool-news-server
+     msspool-news-service
+     miee-popup-menu
+     gnus-group-toolbar))
+  (mapc
+   #'(lambda (symbol)
+       (unless (fboundp symbol)
+        (defalias symbol 'ignore)))
+   '(general-process-argument-editing-function
+     define-process-argument-editing
+     gnspool-get-news
+     mail-spool-send
+     news-spool-post)))
 
-(defcustom gnus-offline-hangup-program-arguments nil
-  "*Program arguments of gnus-offline-hangup-program."
-  :group 'gnus-offline
-  :type '(repeat (string :tag "Argument")))
+(put 'gnus-offline-set-unplugged-state 'menu-enable 'gnus-offline-connected)
+(if (eq system-type 'windows-nt)
+    (define-process-argument-editing "/hang\\.exe\\'"
+      (lambda (x)
+       (general-process-argument-editing-function
+        x nil t t nil t t))))
 
 (defcustom gnus-offline-auto-hangup t
   "*Whether dialup-network automatically hang up when all online jobs has done."
@@ -157,12 +168,6 @@ If mail , gnus-offline only fetch mail articles.
                 (const mail)
                 (const news)))
 
-(defcustom gnus-offline-interval-time 0
-  "*Interval time(minutes) to do online jobs.
-If set to 0 , timer call is disabled."
-  :group 'gnus-offline
-  :type 'integer)
-
 (defcustom gnus-offline-mail-group-level 1
   "*Group level for mail group."
   :group 'gnus-offline
@@ -188,6 +193,36 @@ If set to 0 , timer call is disabled."
   :group 'gnus-offline
   :type 'function)
 
+(defcustom gnus-offline-agent-automatic-expire t
+  "*Non-nil means expire articles on every session."
+  :group 'gnus-offline
+  :type 'boolean)
+
+;; These variables should be customized using `gnus-offline-customize',
+;; not by `customize'.
+
+(defvar gnus-offline-dialup-program nil
+  "*Program name for dialup.")
+
+(defvar gnus-offline-hangup-program nil
+  "*Program name for hangup.")
+
+(defvar gnus-offline-dialup-program-arguments nil
+  "*Program arguments of gnus-offline-dialup-program.")
+
+(defvar gnus-offline-hangup-program-arguments nil
+  "*Program arguments of gnus-offline-hangup-program.")
+
+(defvar gnus-offline-interval-time 0
+  "*Interval time(minutes) to do online jobs.
+If set to 0 , timer call is disabled.")
+
+(defvar gnus-offline-drafts-queue-type 'agent
+  "*Queuing function used for draft messages.")
+
+(defvar gnus-offline-MTA-type 'smtp
+  "*Type of MTA, sendmail or smtp.el.")
+
 ;;; Internal variables.
 (defvar gnus-offline-connected nil
   "*If value is t , dialup line is connected status.
@@ -208,54 +243,9 @@ If value is nil , dialup line is disconnected status.")
 (defvar gnus-offline-stored-group-level nil
   "*Mail Group level before changing.")
 
-(defvar gnus-offline-movemail-arguments nil
-  "*All command line arguments of exec-directory/movemail.")
-
-;;; Temporary variable:
-(defvar string)
-(defvar hdr)
-(defvar str)
-(defvar ver)
-(defvar passwd)
-(defvar num)
-(defvar gnus-offline-error-buffer " *Error*")
-(defvar gnus-offline-map (make-sparse-keymap))
-
-;;; To silence byte compiler
-(and
- (fboundp 'eval-when-compile)
- (eval-when-compile
-   (save-excursion
-     (beginning-of-defun)
-     (eval-region (point-min) (point)))
-   (let (case-fold-search)
-     (mapcar
-      (function
-       (lambda (symbol)
-        (unless (boundp symbol)
-          (make-local-variable symbol)
-          (eval (list 'setq symbol nil)))))
-      '(:group
-       :prefix :type
-       sendmail-to-spool-directory
-       news-spool-request-post-directory
-       nnspool-version
-       nnagent-version
-       msspool-news-server
-       msspool-news-service
-       gnspool-get-news
-       mail-spool-send
-       news-spool-post
-       gnus-agent-handle-level
-       ))
-     (make-local-variable 'byte-compile-warnings)
-     (setq byte-compile-warnings nil))))
-       
-(put 'gnus-offline-set-unplugged-state 'menu-enable 'gnus-offline-connected)
-(if (eq system-type 'windows-nt)
-    (define-process-argument-editing "/hang\\.exe\\'"
-      (lambda (x) (general-process-argument-editing-function
-                  x nil t t nil t t))))
+(defvar gnus-offline-mail-source nil
+  "*mail-sources save variable.")
+
 ;;; Functions
 ;;
 ;; Setting up...
@@ -263,9 +253,6 @@ If value is nil , dialup line is disconnected status.")
 (defun gnus-offline-setup ()
   "*Initialize gnus-offline function"
 
-  ;; Load setting file - required.
-  (load gnus-offline-setting-file)
-
   ;; Menu and keymap
   (gnus-offline-define-menu-and-key)
   
@@ -276,44 +263,44 @@ If value is nil , dialup line is disconnected status.")
        ((eq gnus-offline-mail-treat-environ 'online)
         ;; send mail under offline environ.
         (gnus-offline-set-online-sendmail-function))))
-;;  (add-hook 'gnus-group-mode-hook 'gnus-offline-setup))
 
 ;;
 ;; Setting Error check.
 (defun gnus-offline-error-check ()
   ;; Check gnus-agent and nnspool setting.
-  (cond ((eq gnus-offline-news-fetch-method 'nnagent)
-        ;; nnagent and gnus-agent loaded ??
-        (if (not (and (featurep 'gnus-agent)
-                      (featurep 'nnagent)))
-            (progn
-              (get-buffer-create gnus-offline-error-buffer)
-              (set-buffer gnus-offline-error-buffer)
-              (erase-buffer)
-              (insert "WARNING!!: gnus-agent.el or nnagent.el is not loaded.\n")
-              (insert "Please check your .emacs or .gnus.el to work gnus-agent fine.")
-              (pop-to-buffer gnus-offline-error-buffer))))
+  (let ((buffer " *Offline Error*"))
+    (cond ((eq gnus-offline-news-fetch-method 'nnagent)
+          ;; nnagent and gnus-agent loaded ??
+          (unless (and (featurep 'gnus-agent)
+                       (featurep 'nnagent))
+            (set-buffer (gnus-get-buffer-create buffer))
+            (erase-buffer)
+            (insert "WARNING!!: gnus-agent.el or nnagent.el is not loaded.
+Please check your .emacs or .gnus.el to work gnus-agent fine.")
+            (pop-to-buffer buffer)))
        
-       ((eq gnus-offline-news-fetch-method 'nnspool)
-        (if (not (featurep 'nnspool))
-            (progn
-              (get-buffer-create gnus-offline-error-buffer)
-              (set-buffer gnus-offline-error-buffer)
-              (erase-buffer)
-              (insert "WARNING!!: nnspool.el is not loaded.\n")
-              (insert "Please check your .emacs or .gnus.el to work nnspool fine.")
-              (pop-to-buffer gnus-offline-error-buffer))))))
+         ((eq gnus-offline-news-fetch-method 'nnspool)
+          (unless (featurep 'nnspool)
+            (set-buffer (gnus-get-buffer-create buffer))
+            (erase-buffer)
+            (insert "WARNING!!: nnspool.el is not loaded.
+Please check your .emacs or .gnus.el to work nnspool fine.")
+            (pop-to-buffer buffer)))
+         (t
+          nil))))
 ;;
 ;;
 (defun gnus-offline-set-offline-sendmail-function ()
   "*Initialize sendmail-function when unplugged status."
-  (if (eq gnus-offline-drafts-queue-type 'miee)
-      (progn
-       (if (eq gnus-offline-news-fetch-method 'nnagent)
-           (setq gnus-agent-send-mail-function 'sendmail-to-spool-in-gnspool-format))
-       (setq message-send-mail-function 'sendmail-to-spool-in-gnspool-format))
-    (setq gnus-agent-send-mail-function (gnus-offline-set-online-sendmail-function)
-         message-send-mail-function 'gnus-agent-send-mail)))
+  (cond ((eq gnus-offline-drafts-queue-type 'miee)
+        (if (eq gnus-offline-news-fetch-method 'nnagent)
+            (setq gnus-agent-send-mail-function
+                  'sendmail-to-spool-in-gnspool-format))
+        (setq message-send-mail-function 'sendmail-to-spool-in-gnspool-format))
+       (t
+        (setq gnus-agent-send-mail-function
+              (gnus-offline-set-online-sendmail-function)
+              message-send-mail-function 'gnus-agent-send-mail))))
 ;;
 (defun gnus-offline-set-online-sendmail-function ()
   "*Initialize sendmail-function when plugged status."
@@ -416,12 +403,12 @@ If value is nil , dialup line is disconnected status.")
   "*Restore nnm* group level."
   (switch-to-buffer gnus-group-buffer)
   (goto-char (point-min))
-  (setq num 0)
-  (while (re-search-forward " nnm" nil t)
-    (gnus-group-set-current-level 1 (nth num gnus-offline-stored-group-level))
-    (forward-line 1)
-    (setq num (+ num 1))
-    (beginning-of-line)))
+  (let ((num 0))
+    (while (re-search-forward " nnm" nil t)
+      (gnus-group-set-current-level 1 (nth num gnus-offline-stored-group-level))
+      (forward-line 1)
+      (setq num (+ num 1))
+      (beginning-of-line))))
 ;;
 ;; Jobs after getting new news.
 ;;
@@ -469,20 +456,15 @@ If value is nil , dialup line is disconnected status.")
 ;;
 (defun gnus-offline-disable-fetch-mail ()
   "*Set do not fetch mail."
-  (setq nnmail-spool-file nil))
+  (setq mail-sources nil
+       nnmail-spool-file nil))
 ;;
 ;; Enable fetch mail
 ;;
 (defun gnus-offline-enable-fetch-mail ()
   "*Set to fetch mail."
   (setq gnus-offline-mail-fetch-method 'nnmail)
-  (setq nnmail-movemail-program 'pop3-fma-movemail)
-  (setq nnmail-spool-file (append
-                          pop3-fma-local-spool-file-alist
-                          (mapcar
-                           (lambda (spool)
-                             (car spool))
-                           pop3-fma-spool-file-alist))))
+  (setq mail-sources gnus-offline-mail-source))
 ;;
 ;; Enable fetch news
 ;;
@@ -502,31 +484,30 @@ If value is nil , dialup line is disconnected status.")
         (progn (goto-char (point-min))
                (re-search-forward
                 (concat "^" (regexp-quote mail-header-separator) "\n"))
-               (point-marker))))
+               (point-marker)))
+       hdr str)
     (goto-char (point-min))
-    (or (re-search-forward (concat "^" header) delimline t)
-       (progn
-         (goto-char delimline)
-         (forward-line -1)
-         (beginning-of-line)
-         (setq hdr (concat header " "))
-         (setq str (concat hdr string))
-         (setq hdr (concat str "\n"))
-         (insert-string hdr)))))
+    (unless (re-search-forward (concat "^" header) delimline t)
+      (goto-char delimline)
+      (forward-line -1)
+      (beginning-of-line)
+      (setq hdr (concat header " "))
+      (setq str (concat hdr string))
+      (setq hdr (concat str "\n"))
+      (insert-string hdr))))
 ;;
 ;; Add X-Offline-Backend header.
 ;;
 (defun gnus-offline-message-add-header ()
   "*Add X-Gnus-Offline-Backend header to Mail/News message."
-  (if (eq gnus-offline-mail-treat-environ 'offline)
-      (progn
-       (if (eq gnus-offline-news-fetch-method 'nnagent)
-           (setq ver nnagent-version)
-         (setq ver nnspool-version))
-       (setq str (format "\n                        with %s" ver)
-             string (concat gnus-offline-header-string str))
-       (gnus-offline-add-custom-header "X-Gnus-Offline-Backend:" string))))
-  
+  (when (eq gnus-offline-mail-treat-environ 'offline)
+    (let* ((ver (if (eq gnus-offline-news-fetch-method 'nnagent)
+                   nnagent-version
+                 nnspool-version))
+          (str (format "\n                        with %s" ver)))
+    (gnus-offline-add-custom-header
+     "X-Gnus-Offline-Backend:" (concat gnus-offline-header-string str)))))
+
 \f
 ;;
 ;; Toggle plugged/unplugged
@@ -588,8 +569,7 @@ If value is nil , dialup line is disconnected status.")
   (if (eq gnus-offline-articles-to-fetch 'mail)
       (gnus-offline-restore-mail-group-level))
   (if (eq gnus-offline-news-fetch-method 'nnagent)
-      (or gnus-agent-expire-all
-         (gnus-offline-agent-expire)))
+      (gnus-offline-agent-expire))
   (if (and (featurep 'xemacs)
           (fboundp 'play-sound-file))
       (ding nil 'drum)
@@ -604,14 +584,14 @@ If value is nil , dialup line is disconnected status.")
 (defun gnus-offline-toggle-auto-hangup ()
   "*Toggle auto hangup flag."
   (interactive)
-  (setq string "Auto hang up logic")
-  (if gnus-offline-auto-hangup
-      (progn
-       (setq gnus-offline-auto-hangup nil
-             str "disabled."))
-    (setq gnus-offline-auto-hangup t
-         str "enabled."))
-  (message (format "%s %s" string str)))
+  (let ((string "Auto hang up logic") str)
+    (if gnus-offline-auto-hangup
+       (progn
+         (setq gnus-offline-auto-hangup nil
+               str "disabled."))
+      (setq gnus-offline-auto-hangup t
+           str "enabled."))
+    (message (format "%s %s" string str))))
 ;;
 ;; Toggle offline/online to send mail.
 ;;
@@ -634,31 +614,17 @@ If value is nil , dialup line is disconnected status.")
 (defun gnus-offline-toggle-articles-to-fetch ()
   "*Set articles to fetch... both(Mail/News) -> mail only -> News only -> both"
   (interactive)
-  (setq string "Articles fetch from server.")
-  (cond ((eq gnus-offline-articles-to-fetch 'both)
-        (setq gnus-offline-articles-to-fetch 'mail
-              str "Only Mail"))
-       ((eq gnus-offline-articles-to-fetch 'mail)
+  (let ((string "Articles fetch from server.") str)
+    (cond ((eq gnus-offline-articles-to-fetch 'both)
+          (setq gnus-offline-articles-to-fetch 'mail
+                str "Only Mail"))
+         ((eq gnus-offline-articles-to-fetch 'mail)
           (setq gnus-offline-articles-to-fetch 'news
                 str "Only News"))
-       (t
-        (setq gnus-offline-articles-to-fetch 'both
-              str "Mail/News both")))
-  (message (format "%s %s" string str)))
-;;
-;; Toggle movemail program pop3.el -> movemail -> pop3.el
-;;
-(defun gnus-offline-toggle-movemail-program ()
-  "*Toggle movemail program movemail -> pop3.el -> movemail ->..."
-  (interactive)
-  (setq string "Set nnmail-movemail-program")
-  (cond ((eq pop3-fma-movemail-type 'lisp)
-        (setq pop3-fma-movemail-type 'exe
-              str "to movemail"))
-       (t
-        (setq pop3-fma-movemail-type 'lisp
-              str "to pop3.el")))
-  (message (format "%s %s" string str)))
+         (t
+          (setq gnus-offline-articles-to-fetch 'both
+                str "Mail/News both")))
+    (message (format "%s %s" string str))))
 ;;
 ;; Send mail and Post news using Miee or gnus-agent.
 ;;
@@ -704,7 +670,8 @@ If value is nil , dialup line is disconnected status.")
       (progn
        (message "Retrieving message logic by timer is disabled.")
        (setq gnus-offline-interval-time 0))
-    (message (format "Interval time set to %d minutes" gnus-offline-interval-time)))
+    (message
+     (format "Interval time set to %d minutes" gnus-offline-interval-time)))
   (gnus-offline-processed-by-timer))
 ;;
 ;; Expire articles using gnus-agent.
@@ -712,7 +679,11 @@ If value is nil , dialup line is disconnected status.")
 (defun gnus-offline-agent-expire ()
   "*Expire expirable article on News group."
   (interactive)
-  (gnus-agent-expire))
+  (when gnus-offline-agent-automatic-expire
+    (let ((gnus-agent-expire-all (if (eq 0 gnus-agent-expire-days)
+                                    nil
+                                  gnus-agent-expire-all)))
+      (gnus-agent-expire))))
 ;;
 ;; Menu.
 ;;
@@ -726,7 +697,6 @@ If value is nil , dialup line is disconnected status.")
   (add-hook 'gnus-group-mode-hook
            '(lambda ()
               (local-set-key "\C-coh" 'gnus-offline-set-unplugged-state)
-              (local-set-key "\C-com" 'gnus-offline-toggle-movemail-program)
               (local-set-key "\C-cof" 'gnus-offline-toggle-articles-to-fetch)
               (local-set-key "\C-coo" 'gnus-offline-toggle-on/off-send-mail)
               (local-set-key "\C-cox" 'gnus-offline-toggle-auto-hangup)
@@ -754,62 +724,72 @@ If value is nil , dialup line is disconnected status.")
       ;; Overwrite the toolbar spec for gnus-group-mode.
       (add-hook 'gnus-startup-hook
                (lambda ()
-                 (let ((i 0) (stat t) but)
-                   (while (and stat (setq but (nth i gnus-group-toolbar)))
-                     (and (equal 'gnus-group-get-new-news (aref but 1))
-                          (aset but 1 'gnus-offline-gnus-get-new-news)
-                          (setq stat nil))
-                     (setq i (1+ i))))))))
+                 (catch 'tag
+                   (mapc (lambda (but)
+                           (when (eq 'gnus-group-get-new-news (aref but 1))
+                             (aset but 1 'gnus-offline-gnus-get-new-news)
+                             (throw 'tag nil)))
+                         gnus-group-toolbar))))))
 ;;
 ;;
 (defun gnus-offline-define-menu-on-miee ()
   "*Set and change menu bar on MIEE menu."
-  (let ((menu
-  (if (featurep 'meadow)
-      (easy-menu-change
-       nil
-       "Miee"
-       '(
-        ["Spool \e$B$K$"$k5-;v$NAw?.\e(B" news-spool-post t]
-        ["Spool \e$B$K$"$k\e(B Mail \e$B$NAw?.\e(B" mail-spool-send t]
-        "----"
-        ["Offline \e$B>uBV$X\e(B" message-offline-state (not message-offline-state)]
-        ["Online \e$B>uBV$X\e(B" message-online-state message-offline-state]
-        "----"
-        ("Gnus Offline"
-         ["movemail \e$B$N@ZBX$(\e(B" gnus-offline-toggle-movemail-program t]
-         ["\e$B<hF@5-;v<oN`$NJQ99\e(B" gnus-offline-toggle-articles-to-fetch t]
-         ["Mail \e$BAw?.J}K!\e(B(On/Off)\e$B$N@ZBX$(\e(B" gnus-offline-toggle-on/off-send-mail t]
+  (let (menu)
+    (if (featurep 'meadow)
+       (easy-menu-change
+        nil
+        "Miee"
+        '(
+          ["Spool \e$B$K$"$k5-;v$NAw?.\e(B" news-spool-post t]
+          ["Spool \e$B$K$"$k\e(B Mail \e$B$NAw?.\e(B" mail-spool-send t]
+          "----"
+          ["Offline \e$B>uBV$X\e(B" message-offline-state (not message-offline-state)]
+          ["Online \e$B>uBV$X\e(B" message-online-state message-offline-state]
+          "----"
+          ("Gnus Offline"
+           ["\e$B<hF@5-;v<oN`$NJQ99\e(B" gnus-offline-toggle-articles-to-fetch t]
+           ["Mail \e$BAw?.J}K!\e(B(On/Off)\e$B$N@ZBX$(\e(B"
+            gnus-offline-toggle-on/off-send-mail t]
          ["\e$B<+F0@ZCG$N@ZBX$(\e(B" gnus-offline-toggle-auto-hangup t]
          "----"
-         ["\e$B<hF@:Q5-;v$r>C$9\e(B" gnus-offline-agent-expire (eq gnus-offline-news-fetch-method 'nnagent)]
+         ["\e$B<hF@:Q5-;v$r>C$9\e(B" gnus-offline-agent-expire
+          (eq gnus-offline-news-fetch-method 'nnagent)]
          ["\e$B5-;v<hF@4V3V;~4V$N@_Dj\e(B" gnus-offline-set-interval-time t]
          "----"
-         ["\e$B2s@~$N@ZCG\e(B" gnus-offline-set-unplugged-state gnus-offline-connected])
+         ["\e$B2s@~$N@ZCG\e(B" gnus-offline-set-unplugged-state gnus-offline-connected]
+         "----"
+         ["\e$B%W%m%Q%F%#\e(B..." gnus-ofsetup-customize t])
         ))
-    (easy-menu-change
-     nil
-     "Miee"
-     '(
-       ["Post news in spool" news-spool-post t]
-       ["Send mails in spool" mail-spool-send t]
-       "----"
-       ["Message Offline" message-offline-state (not message-offline-state)]
-       ["Message Online" message-online-state message-offline-state]
-       "----"
-       ("Gnus Offline"
-       ["Toggle movemail program" gnus-offline-toggle-movemail-program t]
-       ["Toggle articles to fetch" gnus-offline-toggle-articles-to-fetch t]
-       ["Toggle online/offline send mail" gnus-offline-toggle-on/off-send-mail t]
-       ["Toggle auto hangup" gnus-offline-toggle-auto-hangup t]
-       "----"
-       ["Expire articles" gnus-offline-agent-expire (eq gnus-offline-news-fetch-method 'nnagent)]
-       ["Set interval time" gnus-offline-set-interval-time t]
-       "----"
-       ["Hang up Line." gnus-offline-set-unplugged-state gnus-offline-connected]
-       ))))))
-  (and (featurep 'xemacs)
-       (easy-menu-add menu))))
+      (setq menu
+           (easy-menu-change
+            nil
+            "Miee"
+            '(
+              ["Post news in spool" news-spool-post t]
+              ["Send mails in spool" mail-spool-send t]
+              "----"
+              ["Message Offline" message-offline-state
+               (not message-offline-state)]
+              ["Message Online" message-online-state message-offline-state]
+              "----"
+              ("Gnus Offline"
+               ["Toggle articles to fetch"
+                gnus-offline-toggle-articles-to-fetch t]
+               ["Toggle online/offline send mail"
+                gnus-offline-toggle-on/off-send-mail t]
+               ["Toggle auto hangup" gnus-offline-toggle-auto-hangup t]
+               "----"
+               ["Expire articles" gnus-offline-agent-expire
+                (eq gnus-offline-news-fetch-method 'nnagent)]
+               ["Set interval time" gnus-offline-set-interval-time t]
+               "----"
+               ["Hang up Line." gnus-offline-set-unplugged-state
+                gnus-offline-connected]
+               "----"
+               ["Customize options..." gnus-ofsetup-customize t]
+               )))))
+    (and (featurep 'xemacs)
+        (easy-menu-add menu))))
 ;;
 ;; define menu without miee.
 ;;
@@ -821,39 +801,60 @@ If value is nil , dialup line is disconnected status.")
    "Gnus offline Menu"
    (if (featurep 'meadow)
        '("Offline"
-        ["movemail \e$B$N@ZBX$(\e(B" gnus-offline-toggle-movemail-program t]
         ["\e$B<hF@5-;v<oN`$NJQ99\e(B" gnus-offline-toggle-articles-to-fetch t]
-        ["Mail \e$BAw?.J}K!\e(B(On/Off)\e$B$N@ZBX$(\e(B" gnus-offline-toggle-on/off-send-mail t]
+        ["Mail \e$BAw?.J}K!\e(B(On/Off)\e$B$N@ZBX$(\e(B" gnus-offline-toggle-on/off-send-mail
+         t]
         ["\e$B<+F0@ZCG$N@ZBX$(\e(B" gnus-offline-toggle-auto-hangup t]
         "----"
-        ["\e$B<hF@:Q5-;v$r>C$9\e(B" gnus-offline-agent-expire (eq gnus-offline-news-fetch-method 'nnagent)]
+        ["\e$B<hF@:Q5-;v$r>C$9\e(B" gnus-offline-agent-expire
+         (eq gnus-offline-news-fetch-method 'nnagent)]
         ["\e$B5-;v<hF@4V3V;~4V$N@_Dj\e(B" gnus-offline-set-interval-time t]
         "----"
-        ["\e$B2s@~$N@ZCG\e(B" gnus-offline-set-unplugged-state gnus-offline-connected])
+        ["\e$B2s@~$N@ZCG\e(B" gnus-offline-set-unplugged-state gnus-offline-connected]
+        "----"
+        ["\e$B%W%m%Q%F%#\e(B..." gnus-ofsetup-customize t])
      '("Offline"
-       ["Toggle movemail program" gnus-offline-toggle-movemail-program t]
        ["Toggle articles to fetch" gnus-offline-toggle-articles-to-fetch t]
-       ["Toggle online/offline send mail" gnus-offline-toggle-on/off-send-mail t]
+       ["Toggle online/offline send mail" gnus-offline-toggle-on/off-send-mail
+       t]
        ["Toggle auto hangup" gnus-offline-toggle-auto-hangup t]
        "----"
-       ["Expire articles" gnus-offline-agent-expire (eq gnus-offline-news-fetch-method 'nnagent)]
+       ["Expire articles" gnus-offline-agent-expire
+       (eq gnus-offline-news-fetch-method 'nnagent)]
        ["Set interval time" gnus-offline-set-interval-time t]
        "----"
-       ["Hang up Line." gnus-offline-set-unplugged-state gnus-offline-connected])))
+       ["Hang up Line." gnus-offline-set-unplugged-state gnus-offline-connected]
+       "----"
+       ["Customize options..." gnus-ofsetup-customize t])))
   (and (featurep 'xemacs)
        (easy-menu-add gnus-offline-menu-on-agent)))
 ;;
 ;; Popup menu within the group buffer (under Emacs).
 ;;
+(defvar gnus-offline-popup-menu nil)
 (defun gnus-offline-popup-menu (event)
   "Popup menu for Gnus offline."
   (interactive "e")
-  (let* ((menu (or
-               (and (boundp 'miee-popup-menu)
-                    (assoc 'keymap (assoc 'Miee (assoc 'menu-bar global-map))))
-               gnus-offline-menu-on-agent))
-        (pop (x-popup-menu t menu))
-        (func (and pop (lookup-key menu (apply 'vector pop)))))
+  (unless gnus-offline-popup-menu
+    (setq gnus-offline-popup-menu
+         (let ((menu
+                (if (boundp 'miee-popup-menu)
+                    (or (assq 'keymap
+                               (assq 'Miee (assq 'menu-bar global-map)))
+                        miee-popup-menu)
+                  (symbol-value 'gnus-offline-menu-on-agent))))
+           (if (string< emacs-version "20")
+               (append (list 'keymap
+                             (if (boundp 'miee-popup-menu)
+                                 '(nil "Miee")
+                               '(nil "Offline"))
+                             '(nil "")
+                             '(nil ""))
+                       (cdr menu))
+             menu))))
+  (let* ((pop (x-popup-menu t gnus-offline-popup-menu))
+        (func (and pop (lookup-key gnus-offline-popup-menu
+                                   (apply 'vector pop)))))
     (and pop func (funcall func))))
 \f
 ;;
@@ -870,5 +871,4 @@ If value is nil , dialup line is disconnected status.")
       (gnus-demon-remove-handler 'gnus-offline-gnus-get-new-news t)))
 ;;
 ;;
-(provide 'gnus-offline)
 ;;; gnus-offline.el ends here