* wl-vars.el (wl-draft-sendlog-max-size): Add nil to range.
[elisp/wanderlust.git] / wl / wl-action.el
index a77b6c6..9c07368 100644 (file)
@@ -170,7 +170,8 @@ Return number if put mark succeed"
          (delq elem wl-summary-buffer-temp-mark-list))))
 
 (defun wl-summary-registered-temp-mark (number)
-  (assq number wl-summary-buffer-temp-mark-list))
+  (and wl-summary-buffer-temp-mark-list
+       (assq number wl-summary-buffer-temp-mark-list)))
 
 (defun wl-summary-collect-temp-mark (mark &optional begin end)
   (if (or begin end)
@@ -292,12 +293,7 @@ Return number if put mark succeed"
                          refiles
                          (if (eq folder-name 'null)
                              'null
-                           (wl-folder-get-elmo-folder folder-name))
-                         (wl-summary-buffer-msgdb)
-                         (not (null (cdr dst-msgs)))
-                         nil ; no-delete
-                         nil ; same-number
-                         t))
+                           (wl-folder-get-elmo-folder folder-name))))
          (error nil))
        (when result            ; succeeded.
          ;; update buffer.
@@ -438,19 +434,10 @@ Return number if put mark succeed"
 
 ;; Refile action
 (defun wl-summary-set-action-refile (number mark data)
-  (let ((policy (wl-get-assoc-list-value wl-refile-policy-alist
-                                        (wl-summary-buffer-folder-name)))
-       (elem wl-summary-mark-action-list))
-    (if (eq policy 'copy)
-       (while elem
-         (when (eq (wl-summary-action-symbol (car elem)) 'copy)
-           (wl-summary-register-temp-mark number
-                                          (wl-summary-action-mark (car elem))
-                                          data)
-           (setq elem nil))
-         (setq elem (cdr elem)))
-      (wl-summary-register-temp-mark number mark data)
-      (setq wl-summary-buffer-prev-refile-destination data))))
+  (when (null data)
+    (error "Destination folder is empty"))
+  (wl-summary-register-temp-mark number mark data)
+  (setq wl-summary-buffer-prev-refile-destination data))
 
 (defun wl-summary-get-refile-destination (action number)
   "Decide refile destination."
@@ -476,20 +463,14 @@ Return number if put mark succeed"
            (setq result (elmo-folder-move-messages
                          wl-summary-buffer-elmo-folder
                          (cdr (car dst-msgs))
-                         (wl-folder-get-elmo-folder
-                          (car (car dst-msgs)))
-                         (wl-summary-buffer-msgdb)
-                         (not (null (cdr dst-msgs)))
-                         nil ; no-delete
-                         nil ; same-number
-                         t))
+                         (wl-folder-get-elmo-folder (car (car dst-msgs)))))
          (error nil))
        (if result              ; succeeded.
            (progn
              ;; update buffer.
              (wl-summary-delete-messages-on-buffer (cdr (car dst-msgs)))
              (setq wl-summary-buffer-temp-mark-list
-                   (wl-delete-associations 
+                   (wl-delete-associations
                     (cdr (car dst-msgs))
                     wl-summary-buffer-temp-mark-list)))
          (setq failures
@@ -520,15 +501,10 @@ Return number if put mark succeed"
        (setq result nil)
        (condition-case nil
            (setq result (elmo-folder-move-messages
-                           wl-summary-buffer-elmo-folder
-                           (cdr (car dst-msgs))
-                           (wl-folder-get-elmo-folder
-                            (car (car dst-msgs)))
-                           (wl-summary-buffer-msgdb)
-                           (not (null (cdr dst-msgs)))
-                           t ; t is no-delete (copy)
-                           nil ; same-number
-                           t))
+                         wl-summary-buffer-elmo-folder
+                         (cdr (car dst-msgs))
+                         (wl-folder-get-elmo-folder (car (car dst-msgs)))
+                         'no-delete))
          (error nil))
        (if result              ; succeeded.
            (progn
@@ -658,11 +634,11 @@ Return number if put mark succeed"
   (save-excursion
     (save-restriction
       (let (numbers)
-       (narrow-to-region (or begin (point-min))(or end (point-max)))
+       (wl-summary-narrow-to-region (or begin (point-min))(or end (point-max)))
        (goto-char (point-min))
        ;; for thread...
        (if (eq wl-summary-buffer-view 'thread)
-           (let (number entity mark-info)
+           (let (number entity)
              (while (not (eobp))
                (setq numbers (cons (wl-summary-message-number) numbers)
                      entity (wl-thread-get-entity number))
@@ -671,11 +647,11 @@ Return number if put mark succeed"
                  (dolist (msg (wl-thread-get-children-msgs number))
                    (setq numbers (cons msg numbers))))
                (forward-line 1)))
-         (let (number mark-info)
+         (let (number)
            (while (not (eobp))
              (setq numbers (cons (wl-summary-message-number) numbers))
              (forward-line 1))))
-       numbers))))
+       (nreverse (delq nil numbers))))))
 
 (defun wl-summary-exec (&optional numbers)
   (interactive)
@@ -727,7 +703,7 @@ Return number if put mark succeed"
                      default)
              'wl-folder-complete-folder
              nil nil (or init wl-default-spec)
-             'wl-read-folder-hist)))
+             'wl-read-folder-history)))
     (if (or (string= fld wl-default-spec)
            (string= fld ""))
        (setq fld default))
@@ -793,19 +769,60 @@ Return number if put mark succeed"
   "Return t if temporal MARK should be reserved."
   (member mark wl-summary-reserve-mark-list))
 
+;; Refile prev destination
 (defun wl-summary-refile-prev-destination ()
   "Refile message to previously refiled destination."
   (interactive)
   (funcall (symbol-function 'wl-summary-refile)
+          (wl-summary-message-number)
           wl-summary-buffer-prev-refile-destination)
-  (if (eq wl-summary-move-direction-downward nil)
+  (if (and (interactive-p)
+          (eq wl-summary-move-direction-downward nil))
       (wl-summary-prev)
     (wl-summary-next)))
 
-(defsubst wl-summary-no-auto-refile-message-p (msg)
-  (member (elmo-msgdb-get-mark (wl-summary-buffer-msgdb) msg)
+(defun wl-summary-refile-prev-destination-region (beg end)
+  "Refile messages in the region to previously refiled destination."
+  (interactive "r")
+  (wl-summary-mark-region-subr 'wl-summary-refile
+                              beg end
+                              wl-summary-buffer-prev-refile-destination))
+
+(defun wl-thread-refile-prev-destination (arg)
+  "Refile messages in the thread to previously refiled destination."
+  (interactive "P")
+  (wl-thread-call-region-func
+   'wl-summary-refile-prev-destination-region
+   arg))
+
+(defun wl-summary-target-mark-refile-prev-destination ()
+  "Refile messages with target mark to previously refiled destination."
+  (interactive)
+  (let ((elem wl-summary-mark-action-list)
+       action)
+    (while elem
+      (when (eq (wl-summary-action-symbol (car elem)) 'refile)
+       (setq action (car elem))
+       (setq elem nil))
+      (setq elem (cdr elem)))
+    (wl-summary-target-mark-set-action
+     (list
+      (car action)
+      'refile-prev-destination
+      (lambda (&rest args) wl-summary-buffer-prev-refile-destination)
+      (nth 2 action)
+      (nth 3 action)
+      (nth 4 action)
+      (nth 6 action)))))
+
+(defsubst wl-summary-no-auto-refile-message-p (number)
+  (member (wl-summary-message-mark wl-summary-buffer-elmo-folder number)
          wl-summary-auto-refile-skip-marks))
 
+(defvar wl-auto-refile-guess-functions
+  '(wl-refile-guess-by-rule)
+  "*List of functions which is used for guessing refile destination folder.")
+
 (defun wl-summary-auto-refile (&optional open-all)
   "Set refile mark automatically according to 'wl-refile-guess-by-rule'."
   (interactive "P")
@@ -833,9 +850,10 @@ Return number if put mark succeed"
                           number))
                     (setq dst
                           (wl-folder-get-realname
-                           (wl-refile-guess-by-rule
-                            (elmo-msgdb-overview-get-entity
-                             number (wl-summary-buffer-msgdb)))))
+                           (wl-refile-guess
+                            (elmo-message-entity wl-summary-buffer-elmo-folder
+                                                 number)
+                            wl-auto-refile-guess-functions)))
                     (not (equal dst spec))
                     (let ((pair (assoc dst checked-dsts))
                           ret)
@@ -868,7 +886,7 @@ If optional argument NUMBER is specified, unmark message specified by NUMBER."
   (interactive "r")
   (save-excursion
     (save-restriction
-      (narrow-to-region beg end)
+      (wl-summary-narrow-to-region beg end)
       (goto-char (point-min))
       (if (eq wl-summary-buffer-view 'thread)
          (progn
@@ -889,7 +907,7 @@ If optional argument NUMBER is specified, unmark message specified by NUMBER."
 (defun wl-summary-mark-region-subr (function beg end data)
   (save-excursion
     (save-restriction
-      (narrow-to-region beg end)
+      (wl-summary-narrow-to-region beg end)
       (goto-char (point-min))
       (if (eq wl-summary-buffer-view 'thread)
          (progn
@@ -915,7 +933,7 @@ If optional argument NUMBER is specified, unmark message specified by NUMBER."
   (wl-summary-target-mark-region (point-min) (point-max))
   (setq wl-summary-buffer-target-mark-list
        (elmo-folder-list-messages wl-summary-buffer-elmo-folder
-                                  nil 'in-msgdb)))
+                                  t 'in-msgdb)))
 
 (defun wl-summary-delete-all-mark (mark)
   (goto-char (point-min))
@@ -923,13 +941,15 @@ If optional argument NUMBER is specified, unmark message specified by NUMBER."
     (when (string= (wl-summary-temp-mark) mark)
       (wl-summary-unmark))
     (forward-line 1))
-  (let (deleted)
-    (dolist (mark-info wl-summary-buffer-temp-mark-list)
-      (when (string= (nth 1 mark-info) mark)
-       (setq deleted (cons mark-info deleted))))
-    (dolist (delete deleted)
-      (setq wl-summary-buffer-temp-mark-list
-           (delq delete wl-summary-buffer-temp-mark-list)))))
+  (if (string= mark "*")
+      (setq wl-summary-buffer-target-mark-list nil)
+    (let (deleted)
+      (dolist (mark-info wl-summary-buffer-temp-mark-list)
+       (when (string= (nth 1 mark-info) mark)
+         (setq deleted (cons mark-info deleted))))
+      (dolist (delete deleted)
+       (setq wl-summary-buffer-temp-mark-list
+             (delq delete wl-summary-buffer-temp-mark-list))))))
 
 (defun wl-summary-unmark-all ()
   "Unmark all according to what you input."