* wl-addrmgr.el (wl-addrmgr-replace-field): Use `point-at-bol'.
[elisp/wanderlust.git] / wl / wl-action.el
index 3faaa00..223abe5 100644 (file)
@@ -53,7 +53,6 @@
 
 ;; Set mark
 (defun wl-summary-set-mark (&optional set-mark number interactive data)
-  (interactive)
   "Set temporary mark SET-MARK on the message with NUMBER.
 NUMBER is the message number to set the mark on.
 INTERACTIVE is set as t if it have to run interactively.
@@ -101,11 +100,14 @@ Return number if put mark succeed"
                (wl-highlight-summary-current-line))
              (when data
                (wl-summary-print-argument number data)))
+           (when (and (eq wl-summary-buffer-view 'thread)
+                      interactive)
+             (wl-thread-open-children number))
            (set-buffer-modified-p nil)
            ;; Return value.
            number))
       ;; Move the cursor.
-      (if (or interactive (interactive-p))
+      (if interactive
          (if (eq wl-summary-move-direction-downward nil)
              (wl-summary-prev)
            (wl-summary-next))))))
@@ -276,35 +278,30 @@ Return number if put mark succeed"
       (let ((start (point))
            (refiles (mapcar 'car mark-list))
            (refile-failures 0)
-           refile-len
            dst-msgs                    ; loop counter
            result)
        ;; begin refile...
-       (setq refile-len (length refiles))
        (goto-char start)               ; avoid moving cursor to
                                        ; the bottom line.
-       (message message)
-       (when (> refile-len elmo-display-progress-threshold)
-         (elmo-progress-set 'elmo-folder-move-messages
-                            refile-len message))
-       (setq result nil)
-       (condition-case nil
-           (setq result (elmo-folder-move-messages
-                         wl-summary-buffer-elmo-folder
-                         refiles
-                         (if (eq folder-name 'null)
-                             'null
-                           (wl-folder-get-elmo-folder folder-name))))
-         (error nil))
-       (when result            ; succeeded.
-         ;; update buffer.
-         (wl-summary-delete-messages-on-buffer refiles)
-         ;; update wl-summary-buffer-temp-mark-list.
-         (dolist (mark-info mark-list)
-           (setq wl-summary-buffer-temp-mark-list
-                 (delq mark-info wl-summary-buffer-temp-mark-list))))
-       (elmo-progress-clear 'elmo-folder-move-messages)
-       (message (concat message "done"))
+       (elmo-with-progress-display
+           (elmo-folder-move-messages (length refiles))
+           message
+         (setq result nil)
+         (condition-case nil
+             (setq result (elmo-folder-move-messages
+                           wl-summary-buffer-elmo-folder
+                           refiles
+                           (if (eq folder-name 'null)
+                               'null
+                             (wl-folder-get-elmo-folder folder-name))))
+           (error nil))
+         (when result          ; succeeded.
+           ;; update buffer.
+           (wl-summary-delete-messages-on-buffer refiles)
+           ;; update wl-summary-buffer-temp-mark-list.
+           (dolist (mark-info mark-list)
+             (setq wl-summary-buffer-temp-mark-list
+                   (delq mark-info wl-summary-buffer-temp-mark-list)))))
        (wl-summary-set-message-modified)
        ;; Return the operation failed message numbers.
        (if result
@@ -425,13 +422,13 @@ Return number if put mark succeed"
   (wl-summary-move-mark-list-messages mark-list
                                      (wl-summary-get-dispose-folder
                                       (wl-summary-buffer-folder-name))
-                                     "Disposing messages..."))
+                                     "Disposing messages"))
 
 ;; Delete action.
 (defun wl-summary-exec-action-delete (mark-list)
   (wl-summary-move-mark-list-messages mark-list
                                      'null
-                                     "Deleting messages..."))
+                                     "Deleting messages"))
 
 ;; Refile action
 (defun wl-summary-set-action-refile (number mark data)
@@ -448,36 +445,28 @@ Return number if put mark succeed"
   (save-excursion
     (let ((start (point))
          (failures 0)
-         (refile-len (length mark-list))
-         dst-msgs ; loop counter
-         result)
+         dst-msgs)
       ;; begin refile...
-      (setq dst-msgs
-           (wl-summary-make-destination-numbers-list mark-list))
+      (setq dst-msgs (wl-summary-make-destination-numbers-list mark-list))
       (goto-char start)        ; avoid moving cursor to the bottom line.
-      (when (> refile-len elmo-display-progress-threshold)
-       (elmo-progress-set 'elmo-folder-move-messages
-                          refile-len "Refiling messages..."))
-      (while dst-msgs
-       (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)))))
-         (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
-                    (cdr (car dst-msgs))
-                    wl-summary-buffer-temp-mark-list)))
-         (setq failures
-               (+ failures (length (cdr (car dst-msgs))))))
-       (setq dst-msgs (cdr dst-msgs)))
-      (elmo-progress-clear 'elmo-folder-move-messages)
+      (elmo-with-progress-display
+         (elmo-folder-move-messages (length mark-list))
+         "Refiling messages"
+       (dolist (pair dst-msgs)
+         (if (condition-case nil
+                 (elmo-folder-move-messages
+                  wl-summary-buffer-elmo-folder
+                  (cdr pair)
+                  (wl-folder-get-elmo-folder (car pair)))
+               (error nil))
+             (progn
+               ;; update buffer.
+               (wl-summary-delete-messages-on-buffer (cdr pair))
+               (setq wl-summary-buffer-temp-mark-list
+                     (wl-delete-associations
+                      (cdr pair)
+                      wl-summary-buffer-temp-mark-list)))
+           (setq failures (+ failures (length (cdr pair)))))))
       failures)))
 
 ;; Copy action
@@ -488,37 +477,30 @@ Return number if put mark succeed"
   (save-excursion
     (let ((start (point))
          (failures 0)
-         (refile-len (length mark-list))
-         dst-msgs ; loop counter
-         result)
+         dst-msgs)
       ;; begin refile...
       (setq dst-msgs
            (wl-summary-make-destination-numbers-list mark-list))
       (goto-char start)        ; avoid moving cursor to the bottom line.
-      (when (> refile-len elmo-display-progress-threshold)
-       (elmo-progress-set 'elmo-folder-move-messages
-                          refile-len "Copying messages..."))
-      (while dst-msgs
-       (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)))
-                         'no-delete))
-         (error nil))
-       (if result              ; succeeded.
-           (progn
-             ;; update buffer.
-             (wl-summary-delete-copy-marks-on-buffer (cdr (car dst-msgs)))
-             (setq wl-summary-buffer-temp-mark-list
-                   (wl-delete-associations 
-                    (cdr (car dst-msgs))
-                    wl-summary-buffer-temp-mark-list)))
-         (setq failures
-               (+ failures (length (cdr (car dst-msgs))))))
-       (setq dst-msgs (cdr dst-msgs)))
-      (elmo-progress-clear 'elmo-folder-move-messages)
+      (elmo-with-progress-display
+         (elmo-folder-move-messages (length mark-list))
+         "Copying messages"
+       (dolist (pair dst-msgs)
+         (if (condition-case nil
+                 (elmo-folder-move-messages
+                  wl-summary-buffer-elmo-folder
+                  (cdr pair)
+                  (wl-folder-get-elmo-folder (car pair))
+                  'no-delete)
+               (error nil))
+             (progn
+               ;; update buffer.
+               (wl-summary-delete-copy-marks-on-buffer (cdr pair))
+               (setq wl-summary-buffer-temp-mark-list
+                     (wl-delete-associations
+                      (cdr pair)
+                      wl-summary-buffer-temp-mark-list)))
+           (setq failures (+ failures (length (cdr pair)))))))
       failures)))
 
 ;; Prefetch.
@@ -543,7 +525,7 @@ Return number if put mark succeed"
 ;; Resend.
 (defun wl-summary-get-resend-address (action number)
   "Decide resend address."
-  (completing-read "Resend message to: " 'wl-complete-address))
+  (wl-address-read-from-minibuffer "Resend message to: "))
 
 (defun wl-summary-exec-action-resend (mark-list)
   (let ((failure 0))
@@ -562,10 +544,9 @@ Return number if put mark succeed"
   "Resend the message with NUMBER to ADDRESS."
   (message "Resending message to %s..." address)
   (let ((folder wl-summary-buffer-elmo-folder))
-    (save-excursion
+    (with-current-buffer (get-buffer-create " *wl-draft-resend*")
       ;; We first set up a normal mail buffer.
-      (set-buffer (get-buffer-create " *wl-draft-resend*"))
-      (buffer-disable-undo (current-buffer))
+      (set-buffer-multibyte nil)
       (erase-buffer)
       (setq wl-sent-message-via nil)
       ;; Insert our usual headers.
@@ -583,11 +564,16 @@ Return number if put mark succeed"
       (let ((beg (point)))
        ;; Insert the message to be resent.
        (insert
-        (with-temp-buffer
-          (elmo-message-fetch folder number
-                              (elmo-make-fetch-strategy 'entire)
-                              nil (current-buffer) 'unread)
-          (buffer-string)))
+        ;; elmo-message-fetch is erase current buffer before fetch message
+        (elmo-message-fetch-string folder number
+                                   (if wl-summary-resend-use-cache
+                                       (elmo-make-fetch-strategy
+                                        'entire 'maybe nil
+                                        (elmo-file-cache-get-path
+                                         (elmo-message-field
+                                          folder number 'message-id)))
+                                     (elmo-make-fetch-strategy 'entire))
+                                   'unread))
        (goto-char (point-min))
        (search-forward "\n\n")
        (forward-char -1)
@@ -604,6 +590,7 @@ Return number if put mark succeed"
        (goto-char beg)
        (when (looking-at "From ")
          (replace-match "X-From-Line: ")))
+      (run-hooks 'wl-summary-resend-hook)
       ;; Send it.
       (wl-draft-dispatch-message)
       (kill-buffer (current-buffer)))
@@ -616,8 +603,8 @@ Return number if put mark succeed"
          (buffer-read-only nil)
          (buf (current-buffer))
          sol eol rs re)
+      (setq sol (point-at-bol))
       (beginning-of-line)
-      (setq sol (point))
       (search-forward "\r")
       (forward-char -1)
       (setq eol (point))
@@ -659,25 +646,26 @@ Return number if put mark succeed"
   (let ((failures 0)
        collected pair action modified)
     (dolist (action wl-summary-mark-action-list)
-      (setq collected (cons (cons 
+      (setq collected (cons (cons
                             (wl-summary-action-mark action)
                             nil) collected)))
     (dolist (mark-info wl-summary-buffer-temp-mark-list)
-      (if numbers
-         (when (memq (nth 0 mark-info) numbers)
-           (setq pair (assoc (nth 1 mark-info) collected)))
-       (setq pair (assoc (nth 1 mark-info) collected)))
-      (setq pair (assoc (nth 1 mark-info) collected))
-      (setcdr pair (cons mark-info (cdr pair))))
+      (setq pair
+           (when (or (null numbers)
+                     (memq (nth 0 mark-info) numbers))
+             (assoc (nth 1 mark-info) collected)))
+      (if pair
+         (setcdr pair (cons mark-info (cdr pair)))))
     ;; collected is a pair of
     ;; mark-string and a list of mark-info
     (dolist (pair collected)
-      (setq action (assoc (car pair) wl-summary-mark-action-list))
-      (when (and (cdr pair) (wl-summary-action-exec-function action))
-       (setq modified t)
-       (setq failures (+ failures (funcall
-                                   (wl-summary-action-exec-function action)
-                                   (cdr pair))))))
+      (when (cdr pair)
+       (setq action (assoc (car pair) wl-summary-mark-action-list))
+       (when (wl-summary-action-exec-function action)
+         (setq modified t)
+         (setq failures (+ failures (funcall
+                                     (wl-summary-action-exec-function action)
+                                     (cdr pair)))))))
     (when modified
       (wl-summary-set-message-modified))
     (run-hooks 'wl-summary-exec-hook)
@@ -690,7 +678,7 @@ Return number if put mark succeed"
       (setq wl-message-buffer nil))
     (set-buffer-modified-p nil)
     (when (> failures 0)
-      (format "%d execution(s) were failed" failures))))
+      (message "%d execution(s) were failed" failures))))
 
 (defun wl-summary-exec-region (beg end)
   (interactive "r")
@@ -722,16 +710,16 @@ Return number if put mark succeed"
                                      fld))))
     fld))
 
-(defun wl-summary-print-argument (msg-num folder)
+(defun wl-summary-print-argument (msg-num data)
   "Print action argument on line."
-  (when folder
+  (when data
     (wl-summary-remove-argument)
     (save-excursion
       (let ((inhibit-read-only t)
-           (folder (copy-sequence folder))
+           (data (copy-sequence data))
            (buffer-read-only nil)
            len rs re c)
-       (setq len (string-width folder))
+       (setq len (string-width data))
        (if (< len 1) ()
          ;;(end-of-line)
          (beginning-of-line)
@@ -744,7 +732,8 @@ Return number if put mark succeed"
                              (1- (window-width)))))
                (c (current-column))
                (padding 0))
-           (if (and width (> (+ c len) width))
+           (if (and width
+                    (> (+ c len) width))
                (progn
                  (move-to-column width)
                  (setq c (current-column))
@@ -752,18 +741,18 @@ Return number if put mark succeed"
                    (forward-char -1)
                    (setq c (current-column)))
                  (when (< (+ c len) width)
-                   (setq folder (concat " " folder)))
+                   (setq data (concat " " data)))
                  (setq rs (point))
                  (put-text-property rs re 'invisible t))
              (when (and width
                         (> (setq padding (- width len c)) 0))
-               (setq folder (concat (make-string padding ?\ )
-                                    folder)))
+               (setq data (concat (make-string padding (string-to-char " "))
+                                  data)))
              (setq rs (1- re))))
          (put-text-property rs re 'wl-summary-action-argument t)
          (goto-char re)
-         (wl-highlight-action-argument-string folder)
-         (insert folder)
+         (wl-highlight-action-argument-string data)
+         (insert data)
          (set-buffer-modified-p nil))))))
 
 (defsubst wl-summary-reserve-temp-mark-p (mark)
@@ -836,7 +825,7 @@ Return number if put mark succeed"
           checked-dsts
           (count 0)
           number dst thr-entity)
-      (goto-line 1)
+      (goto-char (point-min))
       (while (not (eobp))
        (setq number (wl-summary-message-number))
        (dolist (number (cons number
@@ -847,8 +836,9 @@ Return number if put mark succeed"
                                               (wl-thread-get-entity number))))
                                   (wl-thread-entity-get-descendant
                                    thr-entity))))
-         (when (and (not (wl-summary-no-auto-refile-message-p
-                          number))
+         (when (and (not (wl-summary-no-auto-refile-message-p number))
+                    (not (wl-summary-reserve-temp-mark-p
+                          (nth 1 (wl-summary-registered-temp-mark number))))
                     (setq dst
                           (wl-folder-get-realname
                            (wl-refile-guess
@@ -931,10 +921,7 @@ If optional argument NUMBER is specified, unmark message specified by NUMBER."
 
 (defun wl-summary-target-mark-all ()
   (interactive)
-  (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
-                                  t 'in-msgdb)))
+  (wl-summary-target-mark-region (point-min) (point-max)))
 
 (defun wl-summary-delete-all-mark (mark)
   (goto-char (point-min))