- (let* ((folder wl-summary-buffer-elmo-folder)
- message-id visible cur-mark)
- (cond (number
- (setq visible (wl-summary-jump-to-msg number))
- (setq cur-mark (or mark
- (wl-summary-message-mark
- wl-summary-buffer-elmo-folder number)
- " ")))
- ((setq number (wl-summary-message-number))
- (setq visible t)
- (setq cur-mark (or mark (wl-summary-persistent-mark))))
- (t
- (error "No message")))
- (when (or visible
- ;; already exists in msgdb.
- (elmo-message-entity wl-summary-buffer-elmo-folder
- number))
- (setq message-id (elmo-message-field
- wl-summary-buffer-elmo-folder
- number
- 'message-id))
- (if (string= cur-mark wl-summary-important-mark)
- (progn
- ;; server side mark
- (save-match-data
- (elmo-folder-unmark-important folder (list number)
- no-server-update)
- (unless no-server-update
- (elmo-msgdb-global-mark-delete message-id))
- ;; Remove cache if local folder.
- (if (and (elmo-folder-local-p folder)
- (not (eq 'mark
- (elmo-folder-type-internal folder))))
- (elmo-file-cache-delete
- (elmo-file-cache-get-path message-id)))))
- ;; server side mark
- (elmo-folder-mark-as-important folder (list number)
- no-server-update)
- (if (eq (elmo-file-cache-exists-p message-id) 'entire)
- (elmo-folder-mark-as-read folder (list number))
- ;; Force cache message.
- (elmo-message-encache folder number 'read))
- (unless no-server-update
- (elmo-msgdb-global-mark-set message-id
- elmo-msgdb-important-mark))))
- (when visible
- (wl-summary-update-persistent-mark))))
- number)
+ (let ((folder wl-summary-buffer-elmo-folder)
+ number number-list visible)
+ (setq number-list (cond ((numberp number-or-numbers)
+ (list number-or-numbers))
+ ((and (not (null number-or-numbers))
+ (listp number-or-numbers))
+ number-or-numbers)
+ ((setq number (wl-summary-message-number))
+ ;; interactive
+ (list number))))
+ (if remove-all
+ (setq flags nil)
+ (unless flags
+ (setq flags (wl-summary-decide-flag folder (car number-list)))))
+ (if (null number-list)
+ (message "No message.")
+ (dolist (number number-list)
+ (elmo-message-set-global-flags folder number flags local)
+ (setq visible (wl-summary-jump-to-msg number))
+ ;; set mark on buffer
+ (when visible
+ (wl-summary-update-persistent-mark))))
+ flags)))
+
+(defsubst wl-summary-add-flags-internal (&optional
+ number-or-numbers
+ flags
+ local)
+ (save-excursion
+ (let ((folder wl-summary-buffer-elmo-folder)
+ set-flags msg number-list visible)
+ (setq number-list (cond ((numberp number-or-numbers)
+ (list number-or-numbers))
+ ((and (not (null number-or-numbers))
+ (listp number-or-numbers))
+ number-or-numbers)
+ ((setq msg (wl-summary-message-number))
+ ;; interactive
+ (list msg))))
+ (if (null number-list)
+ (message "No message.")
+ (dolist (number number-list)
+ (setq set-flags
+ (elmo-get-global-flags
+ (elmo-message-flags folder number)))
+ (setq set-flags (nconc flags set-flags))
+ (elmo-message-set-global-flags folder number set-flags local)
+ (setq visible (wl-summary-jump-to-msg number))
+ ;; set mark on buffer
+ (when visible
+ (wl-summary-update-persistent-mark)))))))
+
+(defsubst wl-summary-remove-flags-internal (&optional
+ number-or-numbers
+ flags
+ local)
+ (save-excursion
+ (let ((folder wl-summary-buffer-elmo-folder)
+ set-flags msg number-list visible)
+ (setq number-list (cond ((numberp number-or-numbers)
+ (list number-or-numbers))
+ ((and (not (null number-or-numbers))
+ (listp number-or-numbers))
+ number-or-numbers)
+ ((setq msg (wl-summary-message-number))
+ ;; interactive
+ (list msg))))
+ (if (null number-list)
+ (message "No message.")
+ (dolist (number number-list)
+ (setq set-flags (elmo-get-global-flags
+ (elmo-message-flags folder number)))
+ (dolist (flag flags)
+ (setq set-flags (delq flag set-flags)))
+ (elmo-message-set-global-flags folder number set-flags local)
+ (setq visible (wl-summary-jump-to-msg number))
+ ;; set mark on buffer
+ (when visible
+ (wl-summary-update-persistent-mark)))))))
+
+(defun wl-summary-set-flags (&optional remove)
+ (interactive "P")
+ (if (eq 'flag (elmo-folder-type-internal wl-summary-buffer-elmo-folder))
+ (error "Cannot process flags in this folder"))
+ (wl-summary-set-flags-internal nil nil nil remove))