(defvar wl-summary-buffer-disp-msg nil)
(defvar wl-summary-buffer-disp-folder nil)
-(defvar wl-summary-buffer-refile-list nil)
-(defvar wl-summary-buffer-delete-list nil)
+(defvar wl-summary-buffer-temp-mark-list nil)
(defvar wl-summary-buffer-last-displayed-msg nil)
(defvar wl-summary-buffer-current-msg nil)
(defvar wl-summary-buffer-unread-count 0)
(defvar wl-summary-buffer-thread-indent-set-alist nil)
(defvar wl-summary-buffer-view nil)
(defvar wl-summary-buffer-message-modified nil)
-(defvar wl-summary-buffer-mark-modified nil)
(defvar wl-summary-buffer-thread-modified nil)
(defvar wl-summary-buffer-number-column nil)
(defvar wl-summary-buffer-persistent nil)
(defvar wl-summary-buffer-thread-nodes nil)
(defvar wl-summary-buffer-target-mark-list nil)
-(defvar wl-summary-buffer-copy-list nil)
(defvar wl-summary-buffer-prev-refile-destination nil)
(defvar wl-summary-buffer-prev-copy-destination nil)
(defvar wl-summary-buffer-saved-message nil)
(make-variable-buffer-local 'wl-summary-search-buf-folder-name)
(make-variable-buffer-local 'wl-summary-buffer-disp-msg)
(make-variable-buffer-local 'wl-summary-buffer-disp-folder)
-(make-variable-buffer-local 'wl-summary-buffer-refile-list)
-(make-variable-buffer-local 'wl-summary-buffer-copy-list)
(make-variable-buffer-local 'wl-summary-buffer-target-mark-list)
-(make-variable-buffer-local 'wl-summary-buffer-delete-list)
+(make-variable-buffer-local 'wl-summary-buffer-temp-mark-list)
(make-variable-buffer-local 'wl-summary-buffer-last-displayed-msg)
(make-variable-buffer-local 'wl-summary-buffer-unread-count)
(make-variable-buffer-local 'wl-summary-buffer-new-count)
(make-variable-buffer-local 'wl-summary-buffer-thread-indent-set)
(make-variable-buffer-local 'wl-summary-buffer-view)
(make-variable-buffer-local 'wl-summary-buffer-message-modified)
-(make-variable-buffer-local 'wl-summary-buffer-mark-modified)
(make-variable-buffer-local 'wl-summary-buffer-thread-modified)
(make-variable-buffer-local 'wl-summary-buffer-number-column)
(make-variable-buffer-local 'wl-summary-buffer-temp-mark-column)
(wl-summary-buffer-folder-name))
(wl-address-user-mail-address-p from)
(cond
- ((and (setq tos (elmo-msgdb-overview-entity-get-to
- wl-message-entity))
+ ((and (setq tos (elmo-message-entity-field
+ wl-message-entity 'to t))
(not (string= "" tos)))
(setq retval
(concat "To:"
to))))
(wl-parse-addresses tos)
","))))
- ((setq ng (elmo-msgdb-overview-entity-get-extra-field
- wl-message-entity "newsgroups"))
+ ((setq ng (elmo-message-entity-field
+ wl-message-entity 'newsgroups))
(setq retval (concat "Ng:" ng)))))
(if wl-use-petname
(setq retval (or (funcall wl-summary-get-petname-function from)
["Mark as read" wl-summary-mark-as-read t]
["Mark as important" wl-summary-mark-as-important t]
["Mark as unread" wl-summary-mark-as-unread t]
- ["Set delete mark" wl-summary-delete t]
+ ["Set dispose mark" wl-summary-dispose t]
["Set refile mark" wl-summary-refile t]
["Set copy mark" wl-summary-copy t]
["Prefetch" wl-summary-prefetch t]
["Mark as read" wl-summary-mark-as-read-region t]
["Mark as important" wl-summary-mark-as-important-region t]
["Mark as unread" wl-summary-mark-as-unread-region t]
- ["Set delete mark" wl-summary-delete-region t]
+ ["Set dispose mark" wl-summary-dispose-region t]
["Set refile mark" wl-summary-refile-region t]
["Set copy mark" wl-summary-copy-region t]
["Prefetch" wl-summary-prefetch-region t]
(define-key wl-summary-mode-map "\eE" 'wl-summary-resend-bounced-mail)
(define-key wl-summary-mode-map "f" 'wl-summary-forward)
(define-key wl-summary-mode-map "$" 'wl-summary-mark-as-important)
+ (define-key wl-summary-mode-map "&" 'wl-summary-mark-as-answered)
(define-key wl-summary-mode-map "@" 'wl-summary-edit-addresses)
(define-key wl-summary-mode-map "y" 'wl-summary-save)
(define-key wl-summary-mode-map "o" 'wl-summary-refile)
(define-key wl-summary-mode-map "O" 'wl-summary-copy)
(define-key wl-summary-mode-map "\M-o" 'wl-summary-refile-prev-destination)
-; (define-key wl-summary-mode-map "\M-O" 'wl-summary-copy-prev-destination)
(define-key wl-summary-mode-map "\C-o" 'wl-summary-auto-refile)
- (define-key wl-summary-mode-map "d" 'wl-summary-delete)
+ (define-key wl-summary-mode-map "d" 'wl-summary-dispose)
(define-key wl-summary-mode-map "u" 'wl-summary-unmark)
(define-key wl-summary-mode-map "U" 'wl-summary-unmark-all)
- (define-key wl-summary-mode-map "D" 'wl-summary-erase)
+ (define-key wl-summary-mode-map "D" 'wl-summary-delete)
+ (define-key wl-summary-mode-map "~" 'wl-summary-resend)
;; thread commands
(define-key wl-summary-mode-map "t" (make-sparse-keymap))
(define-key wl-summary-mode-map "t*" 'wl-thread-target-mark)
(define-key wl-summary-mode-map "to" 'wl-thread-refile)
(define-key wl-summary-mode-map "tO" 'wl-thread-copy)
- (define-key wl-summary-mode-map "td" 'wl-thread-delete)
+ (define-key wl-summary-mode-map "td" 'wl-thread-dispose)
+ (define-key wl-summary-mode-map "tD" 'wl-thread-delete)
+ (define-key wl-summary-mode-map "t~" 'wl-thread-resend)
(define-key wl-summary-mode-map "tu" 'wl-thread-unmark)
(define-key wl-summary-mode-map "t!" 'wl-thread-mark-as-unread)
(define-key wl-summary-mode-map "t$" 'wl-thread-mark-as-important)
;; target-mark commands
(define-key wl-summary-mode-map "m" (make-sparse-keymap))
(define-key wl-summary-mode-map "mi" 'wl-summary-target-mark-prefetch)
- (define-key wl-summary-mode-map "mR" 'wl-summary-target-mark-mark-as-read)
(define-key wl-summary-mode-map "mo" 'wl-summary-target-mark-refile)
(define-key wl-summary-mode-map "mO" 'wl-summary-target-mark-copy)
- (define-key wl-summary-mode-map "md" 'wl-summary-target-mark-delete)
+ (define-key wl-summary-mode-map "md" 'wl-summary-target-mark-dispose)
+ (define-key wl-summary-mode-map "mD" 'wl-summary-target-mark-delete)
+ (define-key wl-summary-mode-map "m~" 'wl-summary-target-mark-resend)
+
+ (define-key wl-summary-mode-map "mu" 'wl-summary-delete-all-temp-marks)
+
(define-key wl-summary-mode-map "my" 'wl-summary-target-mark-save)
+ (define-key wl-summary-mode-map "mR" 'wl-summary-target-mark-mark-as-read)
(define-key wl-summary-mode-map "m!" 'wl-summary-target-mark-mark-as-unread)
(define-key wl-summary-mode-map "m$" 'wl-summary-target-mark-mark-as-important)
- (define-key wl-summary-mode-map "mu" 'wl-summary-delete-all-temp-marks)
(define-key wl-summary-mode-map "mU" 'wl-summary-target-mark-uudecode)
(define-key wl-summary-mode-map "ma" 'wl-summary-target-mark-all)
(define-key wl-summary-mode-map "mt" 'wl-summary-target-mark-thread)
(define-key wl-summary-mode-map "m?" 'wl-summary-target-mark-pick)
(define-key wl-summary-mode-map "m#" 'wl-summary-target-mark-print)
(define-key wl-summary-mode-map "m|" 'wl-summary-target-mark-pipe)
- (define-key wl-summary-mode-map "mD" 'wl-summary-target-mark-erase)
;; region commands
(define-key wl-summary-mode-map "r" (make-sparse-keymap))
(define-key wl-summary-mode-map "r*" 'wl-summary-target-mark-region)
(define-key wl-summary-mode-map "ro" 'wl-summary-refile-region)
(define-key wl-summary-mode-map "rO" 'wl-summary-copy-region)
- (define-key wl-summary-mode-map "rd" 'wl-summary-delete-region)
+ (define-key wl-summary-mode-map "rd" 'wl-summary-dispose-region)
+ (define-key wl-summary-mode-map "rD" 'wl-summary-delete-region)
+ (define-key wl-summary-mode-map "r~" 'wl-summary-resend-region)
(define-key wl-summary-mode-map "ru" 'wl-summary-unmark-region)
(define-key wl-summary-mode-map "r!" 'wl-summary-mark-as-unread-region)
(define-key wl-summary-mode-map "r$" 'wl-summary-mark-as-important-region)
(wl-summary-redisplay)))
(defun wl-summary-count-unread ()
- (let ((lst (elmo-msgdb-count-marks (wl-summary-buffer-msgdb))))
+ (let ((lst (elmo-folder-count-flags wl-summary-buffer-elmo-folder)))
(if (eq major-mode 'wl-summary-mode)
(setq wl-summary-buffer-new-count (car lst)
wl-summary-buffer-unread-count (nth 1 lst)
If ARG is non-nil, Supersedes message"
(interactive "P")
(wl-summary-toggle-disp-msg 'off)
- (if arg
- (wl-summary-supersedes-message)
- (if (string= (wl-summary-buffer-folder-name) wl-draft-folder)
- (when (wl-summary-message-number)
- (wl-draft-reedit (wl-summary-message-number))
- (if (wl-message-news-p)
- (mail-position-on-field "Newsgroups")
- (mail-position-on-field "To")))
- (wl-draft-edit-string (wl-summary-message-string)))))
+ (cond
+ ((not (wl-summary-message-number))
+ (message "No message."))
+ (arg
+ (wl-summary-supersedes-message))
+ ((string= (wl-summary-buffer-folder-name) wl-draft-folder)
+ (wl-draft-reedit (wl-summary-message-number))
+ (if (wl-message-news-p)
+ (mail-position-on-field "Newsgroups")
+ (mail-position-on-field "To")))
+ (t
+ (wl-draft-edit-string (wl-summary-message-string)))))
(defun wl-summary-resend-bounced-mail ()
"Re-mail the current message.
wl-summary-buffer-line-formatter formatter)
(insert
(wl-summary-create-line
- (elmo-msgdb-make-entity
+ (elmo-msgdb-make-message-entity
:number 10000
:from "foo"
:subject "bar"
(wl-mode-line-buffer-identification '(wl-summary-buffer-mode-line))
(easy-menu-add wl-summary-mode-menu)
(when wl-summary-lazy-highlight
- (if wl-on-xemacs
+ (if wl-on-xemacs
(progn
(make-local-variable 'pre-idle-hook)
(add-hook 'pre-idle-hook 'wl-highlight-summary-window))
;; of system internal to accord facilities for the Emacs variants.
(run-hooks 'wl-summary-mode-hook))
+;;;
(defun wl-summary-overview-entity-compare-by-date (x y)
"Compare entity X and Y by date."
(condition-case nil
(string<
(timezone-make-date-sortable
- (elmo-msgdb-overview-entity-get-date x))
+ (elmo-message-entity-field x 'date))
(timezone-make-date-sortable
- (elmo-msgdb-overview-entity-get-date y)))
+ (elmo-message-entity-field y 'date)))
(error))) ;; ignore error.
(defun wl-summary-overview-entity-compare-by-number (x y)
"Compare entity X and Y by number."
(<
- (elmo-msgdb-overview-entity-get-number x)
- (elmo-msgdb-overview-entity-get-number y)))
+ (elmo-message-entity-number x)
+ (elmo-message-entity-number y)))
(defun wl-summary-overview-entity-compare-by-from (x y)
"Compare entity X and Y by from."
(string<
(wl-address-header-extract-address
- (or (elmo-msgdb-overview-entity-get-from-no-decode x)
+ (or (elmo-message-entity-field x 'from)
wl-summary-no-from-message))
(wl-address-header-extract-address
- (or (elmo-msgdb-overview-entity-get-from-no-decode y)
+ (or (elmo-message-entity-field y 'from)
wl-summary-no-from-message))))
(defun wl-summary-overview-entity-compare-by-subject (x y)
"Compare entity X and Y by subject."
- (string< (elmo-msgdb-overview-entity-get-subject-no-decode x)
- (elmo-msgdb-overview-entity-get-subject-no-decode y)))
+ (string< (elmo-message-entity-field x 'subject)
+ (elmo-message-entity-field y 'subject)))
(defun wl-summary-get-list-info (entity)
"Returns (\"ML-name\" . ML-count) of ENTITY."
(let (sequence ml-name ml-count subject return-path delivered-to mailing-list)
- (setq sequence (elmo-msgdb-overview-entity-get-extra-field
- entity "x-sequence")
- ml-name (or (elmo-msgdb-overview-entity-get-extra-field
- entity "x-ml-name")
+ (setq sequence (elmo-message-entity-field entity 'x-sequence)
+ ml-name (or (elmo-message-entity-field entity 'x-ml-name)
(and sequence
(car (split-string sequence " "))))
- ml-count (or (elmo-msgdb-overview-entity-get-extra-field
- entity "x-mail-count")
- (elmo-msgdb-overview-entity-get-extra-field
- entity "x-ml-count")
+ ml-count (or (elmo-message-entity-field entity 'x-mail-count)
+ (elmo-message-entity-field entity 'x-ml-count)
(and sequence
(cadr (split-string sequence " ")))))
- (and (setq subject (elmo-msgdb-overview-entity-get-subject
- entity))
+ (and (setq subject (elmo-message-entity-field entity 'subject t))
(setq subject (elmo-delete-char ?\n subject))
(string-match "^\\s(\\(\\S)+\\)[ :]\\([0-9]+\\)\\s)[ \t]*" subject)
(progn
(or ml-name (setq ml-name (match-string 1 subject)))
(or ml-count (setq ml-count (match-string 2 subject)))))
(and (setq return-path
- (elmo-msgdb-overview-entity-get-extra-field
- entity "return-path"))
+ (elmo-message-entity-field entity 'return-path))
(string-match "^<\\([^@>]+\\)-return-\\([0-9]+\\)-" return-path)
(progn
(or ml-name (setq ml-name (match-string 1 return-path)))
(or ml-count (setq ml-count (match-string 2 return-path)))))
(and (setq delivered-to
- (elmo-msgdb-overview-entity-get-extra-field
- entity "delivered-to"))
+ (elmo-message-entity-field entity 'delivered-to))
(string-match "^mailing list \\([^@]+\\)@" delivered-to)
(or ml-name (setq ml-name (match-string 1 delivered-to))))
(and (setq mailing-list
- (elmo-msgdb-overview-entity-get-extra-field
- entity "mailing-list"))
+ (elmo-message-entity-field entity 'mailing-list))
(string-match "\\(^\\|; \\)contact \\([^@]+\\)-[^-@]+@" mailing-list) ; *-help@, *-owner@, etc.
(or ml-name (setq ml-name (match-string 2 mailing-list))))
(cons (and ml-name (car (split-string ml-name " ")))
(defun wl-summary-rescan (&optional sort-by)
"Rescan current folder without updating."
(interactive)
- (let* ((cur-buf (current-buffer))
- (msgdb (wl-summary-buffer-msgdb))
- (overview (elmo-msgdb-get-overview msgdb))
- (number-alist (elmo-msgdb-get-number-alist msgdb))
- (elmo-mime-charset wl-summary-buffer-mime-charset)
- i percent num
- gc-message entity
- curp
- (inhibit-read-only t)
- (buffer-read-only nil)
- expunged)
+ (let ((elmo-mime-charset wl-summary-buffer-mime-charset)
+ i percent num
+ gc-message entity
+ curp
+ (inhibit-read-only t)
+ (buffer-read-only nil)
+ numbers expunged)
(erase-buffer)
(message "Re-scanning...")
(setq i 0)
- (setq num (length overview))
+ (setq num (length wl-summary-buffer-number-list))
+ (setq numbers wl-summary-buffer-number-list)
(when sort-by
(message "Sorting by %s..." sort-by)
- (setq overview
- (sort overview
- (intern (format "wl-summary-overview-entity-compare-by-%s"
- sort-by))))
- (message "Sorting by %s...done" sort-by)
- (elmo-msgdb-set-overview (wl-summary-buffer-msgdb)
- overview))
- (setq curp overview)
- (set-buffer cur-buf)
- (setq wl-thread-entity-hashtb (elmo-make-hash (* (length overview) 2)))
- (setq wl-thread-entity-list nil)
- (setq wl-thread-entities nil)
- (setq wl-summary-buffer-number-list nil)
- (setq wl-summary-buffer-target-mark-list nil)
- (setq wl-summary-buffer-refile-list nil)
- (setq wl-summary-buffer-delete-list nil)
- (setq wl-summary-delayed-update nil)
+ (setq numbers
+ (sort wl-summary-buffer-number-list
+ (lambda (x y)
+ (funcall
+ (intern (format "wl-summary-overview-entity-compare-by-%s"
+ sort-by))
+ (elmo-message-entity wl-summary-buffer-elmo-folder x)
+ (elmo-message-entity wl-summary-buffer-elmo-folder y)))))
+ (message "Sorting by %s...done" sort-by))
+ (setq wl-thread-entity-hashtb (elmo-make-hash (* num 2))
+ wl-thread-entity-list nil
+ wl-thread-entities nil
+ wl-summary-buffer-number-list nil
+ wl-summary-buffer-target-mark-list nil
+ wl-summary-buffer-temp-mark-list nil
+ wl-summary-delayed-update nil)
(elmo-kill-buffer wl-summary-search-buf-name)
- (while curp
- (setq entity (car curp))
- (wl-summary-insert-message entity msgdb nil)
- (setq curp (cdr curp))
+ (while numbers
+ (setq entity (elmo-message-entity wl-summary-buffer-elmo-folder
+ (car numbers)))
+ (wl-summary-insert-message entity
+ wl-summary-buffer-elmo-folder
+ nil)
+ (setq numbers (cdr numbers))
(when (> num elmo-display-progress-threshold)
(setq i (+ i 1))
(if (or (zerop (% i 5)) (= i num))
(elmo-msgdb-overview-entity-get-number
(cdar wl-summary-delayed-update)))
(wl-summary-insert-message
- (cdar wl-summary-delayed-update) msgdb nil t)
+ (cdar wl-summary-delayed-update)
+ wl-summary-buffer-elmo-folder nil t)
(setq wl-summary-delayed-update (cdr wl-summary-delayed-update))))
(message "Constructing summary structure...done")
- (set-buffer cur-buf)
(if (eq wl-summary-buffer-view 'thread)
(progn
(message "Inserting thread...")
(message "Inserting thread...done")))
(when wl-use-scoring
(setq wl-summary-scored nil)
- (wl-summary-score-headers nil msgdb
- (wl-summary-rescore-msgs number-alist)
+ (wl-summary-score-headers (wl-summary-rescore-msgs
+ wl-summary-buffer-number-list)
t)
(when (and wl-summary-scored
(setq expunged (wl-summary-score-update-all-lines)))
(defun wl-summary-entity-info-msg (entity finfo)
(or (and entity
(concat
- (elmo-replace-in-string
- (if (memq 'ask-folder wl-use-folder-petname)
- (wl-folder-get-petname entity)
- entity)
- "%" "%%")
+ (if (memq 'ask-folder wl-use-folder-petname)
+ (wl-folder-get-petname entity)
+ entity)
(if (null (car finfo))
" (? new/? unread)"
(format
(defun wl-summary-set-message-modified ()
(elmo-folder-set-message-modified-internal
wl-summary-buffer-elmo-folder t)
- (setq wl-summary-buffer-message-modified t))
+ (setq wl-summary-buffer-message-modified t)
+ (wl-summary-set-mark-modified))
(defun wl-summary-message-modified-p ()
wl-summary-buffer-message-modified)
(defun wl-summary-set-mark-modified ()
(elmo-folder-set-mark-modified-internal
- wl-summary-buffer-elmo-folder t)
- (setq wl-summary-buffer-mark-modified t))
+ wl-summary-buffer-elmo-folder t))
(defun wl-summary-mark-modified-p ()
- wl-summary-buffer-mark-modified)
+ (elmo-folder-mark-modified-internal
+ wl-summary-buffer-elmo-folder))
(defun wl-summary-set-thread-modified ()
(setq wl-summary-buffer-thread-modified t))
(defun wl-summary-thread-modified-p ()
wl-summary-buffer-thread-modified)
(defsubst wl-summary-cleanup-temp-marks (&optional sticky)
- (if (or wl-summary-buffer-refile-list
- wl-summary-buffer-copy-list
- wl-summary-buffer-delete-list)
- (if (y-or-n-p (format "Execute remaining marks in %s? "
- (wl-summary-buffer-folder-name)))
- (progn
- (wl-summary-exec)
- (if (or wl-summary-buffer-refile-list
- wl-summary-buffer-copy-list
- wl-summary-buffer-delete-list)
- (error "Some execution was failed")))
- ;; delete temp-marks
- (message "")
- (wl-summary-delete-all-refile-marks)
- (wl-summary-delete-all-copy-marks)
- (wl-summary-delete-all-delete-marks)))
- (if wl-summary-buffer-target-mark-list
- (progn
- (wl-summary-delete-all-target-marks)
- (setq wl-summary-buffer-target-mark-list nil)))
+ (when wl-summary-buffer-temp-mark-list
+ (if (y-or-n-p (format "Execute remaining marks in %s? "
+ (wl-summary-buffer-folder-name)))
+ (progn
+ (wl-summary-exec)
+ (if wl-summary-buffer-temp-mark-list
+ (error "Some execution was failed")))
+ ;; delete temp-marks
+ (message "")
+ (setq wl-summary-buffer-temp-mark-list nil)))
+ (when wl-summary-buffer-target-mark-list
+ (setq wl-summary-buffer-target-mark-list nil))
(wl-summary-delete-all-temp-marks-on-buffer sticky)
(setq wl-summary-scored nil))
(wl-summary-cleanup-temp-marks)
(erase-buffer)
(wl-summary-set-message-modified)
- (wl-summary-set-mark-modified)
(setq wl-thread-entity-hashtb (elmo-make-hash
- (* (length (elmo-msgdb-get-number-alist
- (wl-summary-buffer-msgdb))) 2)))
+ (* (elmo-folder-length
+ wl-summary-buffer-elmo-folder)
+ 2)))
(setq wl-thread-entity-list nil)
(setq wl-thread-entities nil)
(setq wl-summary-buffer-number-list nil)
(setq wl-summary-buffer-target-mark-list nil)
- (setq wl-summary-buffer-refile-list nil)
- (setq wl-summary-buffer-copy-list nil)
- (setq wl-summary-buffer-delete-list nil))
+ (setq wl-summary-buffer-temp-mark-list nil))
(defun wl-summary-sync (&optional unset-cursor force-range)
(interactive)
(unless arg
(save-excursion
(wl-summary-sync-force-update)))
- (wl-summary-prefetch-region (point-min) (point-max)
- wl-summary-incorporate-marks))
+ (wl-summary-prefetch-region-no-mark (point-min) (point-max)
+ wl-summary-incorporate-marks))
(defun wl-summary-prefetch-msg (number &optional arg)
"Returns status-mark. if skipped, returns nil."
;; prefetching procedure.
(save-excursion
- (let* ((msgdb (wl-summary-buffer-msgdb))
- (number-alist (elmo-msgdb-get-number-alist msgdb))
- (message-id (cdr (assq number number-alist)))
- (ov (elmo-msgdb-overview-get-entity message-id msgdb))
- (wl-message-entity ov)
- (entity ov) ; backward compatibility.
- (size (elmo-msgdb-overview-entity-get-size ov))
+ (let* ((size (elmo-message-field wl-summary-buffer-elmo-folder
+ number 'size))
(inhibit-read-only t)
(buffer-read-only nil)
- (file-cached (elmo-file-cache-exists-p message-id))
+ (file-cached (elmo-file-cache-exists-p
+ (elmo-message-field wl-summary-buffer-elmo-folder
+ number 'message-id)))
(force-read (and size
- (or (and (null wl-prefetch-confirm) arg)
+ (or file-cached
+ (and (null wl-prefetch-confirm) arg)
(null wl-prefetch-threshold)
(< size wl-prefetch-threshold))))
mark new-mark)
(elmo-delete-char
?\"
(or
- (elmo-msgdb-overview-entity-get-from ov)
+ (elmo-message-field
+ wl-summary-buffer-elmo-folder
+ number 'from)
"??")))))) " ]")
size))))
(message "")) ; flush.
- (setq mark (elmo-msgdb-get-mark msgdb number))
+ (setq mark (or (elmo-message-mark wl-summary-buffer-elmo-folder
+ number) " "))
(if force-read
(save-excursion
(save-match-data
(elmo-message-encache
wl-summary-buffer-elmo-folder
number))
+ (elmo-message-set-cached wl-summary-buffer-elmo-folder
+ number t)
(setq new-mark
- (cond
- ((string= mark
- elmo-msgdb-unread-uncached-mark)
- elmo-msgdb-unread-cached-mark)
- ((string= mark elmo-msgdb-new-mark)
- (setq wl-summary-buffer-new-count
- (- wl-summary-buffer-new-count 1))
- (setq wl-summary-buffer-unread-count
- (+ wl-summary-buffer-unread-count 1))
- elmo-msgdb-unread-cached-mark)
- ((string= mark elmo-msgdb-read-uncached-mark)
- nil)
- (t mark)))
- (elmo-msgdb-set-mark msgdb number new-mark)
- (or new-mark (setq new-mark " "))
- (wl-summary-set-mark-modified)
- (wl-summary-update-modeline)
- (wl-folder-update-unread
- (wl-summary-buffer-folder-name)
- (+ wl-summary-buffer-unread-count
- wl-summary-buffer-new-count)))
+ (or (elmo-message-mark wl-summary-buffer-elmo-folder
+ number)
+ " "))
+ (unless (string= new-mark mark)
+ (wl-summary-count-unread)
+ (wl-summary-update-modeline)
+ (wl-folder-update-unread
+ (wl-summary-buffer-folder-name)
+ (+ wl-summary-buffer-unread-count
+ wl-summary-buffer-new-count))))
new-mark)))))))
-;;(defvar wl-summary-message-uncached-marks
-;; (list elmo-msgdb-new-mark
-;; elmo-msgdb-unread-uncached-mark
-;; elmo-msgdb-read-uncached-mark))
-
-(defun wl-summary-prefetch-region (beg end &optional prefetch-marks)
+(defun wl-summary-prefetch-region-no-mark (beg end &optional prefetch-marks)
(interactive "r")
(let ((count 0)
targets
(wl-thread-get-entity (car targets))))
(progn
(wl-summary-jump-to-msg (car targets))
- (wl-summary-prefetch))
+ (wl-summary-prefetch-msg
+ (wl-summary-message-number)))
(wl-summary-prefetch-msg (car targets))))
(if (if prefetch-marks
(string= mark elmo-msgdb-unread-cached-mark)
(message "Prefetching... %d/%d message(s)"
(setq count (+ 1 count)) length))
;; redisplay!
- (save-excursion
- (setq pos (point))
- (goto-char start-pos)
- (if (pos-visible-in-window-p pos)
- (save-restriction
- (widen)
- (sit-for 0))))
+ (when mark
+ (save-excursion
+ (setq pos (point))
+ (when (wl-summary-jump-to-msg (car targets))
+ (wl-summary-update-mark (car targets)))
+ (goto-char start-pos)
+ (if (pos-visible-in-window-p pos)
+ (save-restriction
+ (widen)
+ (sit-for 0)))))
(setq targets (cdr targets)))
(message "Prefetched %d/%d message(s)" count length)
(cons count length)))))
-(defun wl-summary-prefetch (&optional arg)
- "Prefetch current message."
- (interactive "P")
- (save-excursion
- (let ((inhibit-read-only t)
- (buffer-read-only nil)
- (mark (wl-summary-persistent-mark)))
- (setq mark (wl-summary-prefetch-msg (wl-summary-message-number) arg))
- (when mark
- (delete-backward-char 1)
- (insert mark)
- (if wl-summary-highlight
- (wl-highlight-summary-current-line)))
- (set-buffer-modified-p nil)
- mark)))
-
(defun wl-summary-delete-marks-on-buffer (marks)
(while marks
(wl-summary-unmark (pop marks))))
(defun wl-summary-delete-copy-marks-on-buffer (copies)
(wl-summary-delete-marks-on-buffer copies))
-(defun wl-summary-delete-all-refile-marks ()
- (let ((marks wl-summary-buffer-refile-list))
- (while marks
- (wl-summary-unmark (car (pop marks))))))
-
-(defun wl-summary-delete-all-copy-marks ()
- (let ((marks wl-summary-buffer-copy-list))
- (while marks
- (wl-summary-unmark (car (pop marks))))))
-
-(defun wl-summary-delete-all-delete-marks ()
- (wl-summary-delete-marks-on-buffer wl-summary-buffer-delete-list))
-
+;;;
(defun wl-summary-delete-all-target-marks ()
(wl-summary-delete-marks-on-buffer wl-summary-buffer-target-mark-list))
(narrow-to-region beg end)
(goto-char (point-min))
(if (eq wl-summary-buffer-view 'thread)
- (progn
+ (let (number-list)
(while (not (eobp))
(let* ((number (wl-summary-message-number))
- (entity (wl-thread-get-entity number))
- children)
+ (entity (wl-thread-get-entity number)))
(if (wl-thread-entity-get-opened entity)
- ;; opened...mark line.
- (wl-summary-mark-as-read number)
- ;; closed
- (wl-summary-mark-as-read number) ; mark itself.
- (setq children (wl-thread-get-children-msgs number))
- (while children
- (wl-summary-mark-as-read (car children))
- (setq children (cdr children))))
- (forward-line 1))))
- (while (not (eobp))
- (wl-summary-mark-as-read (wl-summary-message-number))
- (forward-line 1)))))
- (wl-summary-count-unread)
- (wl-summary-update-modeline))
+ (setq number-list (append number-list (list number)))
+ (setq number-list
+ (append number-list
+ (wl-thread-get-children-msgs number))))
+ (forward-line 1)))
+ (wl-summary-mark-as-read number-list))
+ (let (number-list)
+ (while (not (eobp))
+ (setq number-list
+ (append number-list (list (wl-summary-message-number))))
+ (forward-line 1))
+ (wl-summary-mark-as-read number-list))))))
(defun wl-summary-mark-as-unread-region (beg end)
(interactive "r")
(save-excursion
(save-restriction
(narrow-to-region beg end)
-;;; use narrowing.
-;;; (save-excursion (goto-char end)
-;;; (end-of-line) (point)))
(goto-char (point-min))
(if (eq wl-summary-buffer-view 'thread)
- (progn
+ (let (number-list)
(while (not (eobp))
(let* ((number (wl-summary-message-number))
- (entity (wl-thread-get-entity number))
- children)
+ (entity (wl-thread-get-entity number)))
(if (wl-thread-entity-get-opened entity)
- ;; opened...mark line.
- ;; Crossposts are not processed
- (wl-summary-mark-as-unread)
- ;; closed
- (wl-summary-mark-as-unread) ; mark itself.
- (setq children
- (delq number (wl-thread-get-children-msgs number)))
- (while children
- (wl-summary-mark-as-unread (car children))
- (setq children (cdr children))))
- (forward-line 1))))
- (while (not (eobp))
- (wl-summary-mark-as-unread)
- (forward-line 1)))))
- (wl-summary-count-unread)
- (wl-summary-update-modeline))
+ (setq number-list (append number-list (list number)))
+ (setq number-list
+ (append number-list
+ (wl-thread-get-children-msgs number))))
+ (forward-line 1)))
+ (wl-summary-mark-as-unread number-list))
+ (let (number-list)
+ (while (not (eobp))
+ (setq number-list
+ (append number-list (list (wl-summary-message-number))))
+ (forward-line 1))
+ (wl-summary-mark-as-unread number-list))))))
(defun wl-summary-mark-as-important-region (beg end)
(interactive "r")
(y-or-n-p "Mark all messages as read? "))
(let* ((folder wl-summary-buffer-elmo-folder)
(cur-buf (current-buffer))
- (msgdb (wl-summary-buffer-msgdb))
(inhibit-read-only t)
(buffer-read-only nil)
(case-fold-search nil)
- msg mark)
+ msg mark new-mark)
(message "Setting all msgs as read...")
(elmo-folder-mark-as-read folder
(elmo-folder-list-unreads
(save-excursion
(goto-char (point-min))
(while (not (eobp))
- (setq msg (wl-summary-message-number))
- (setq mark (wl-summary-persistent-mark))
- (when (and (not (string= mark " "))
- (not (string= mark elmo-msgdb-important-mark))
- (not (string= mark elmo-msgdb-read-uncached-mark)))
+ (setq msg (wl-summary-message-number)
+ mark (wl-summary-persistent-mark)
+ new-mark (or (elmo-message-mark folder msg) " "))
+ (unless (string= mark new-mark)
(delete-backward-char 1)
- (if (or (not (elmo-message-use-cache-p folder msg))
- (string= mark elmo-msgdb-unread-cached-mark))
- (progn
- (insert " ")
- (elmo-msgdb-set-mark msgdb msg nil))
- ;; New mark and unread-uncached mark
- (insert elmo-msgdb-read-uncached-mark)
- (elmo-msgdb-set-mark
- msgdb msg elmo-msgdb-read-uncached-mark))
+ ;; New mark and unread-uncached mark
+ (insert new-mark)
(if wl-summary-highlight
- (wl-highlight-summary-current-line nil nil t)))
+ (wl-highlight-summary-current-line)))
(forward-line 1)))
-; (elmo-folder-replace-marks
-; folder
-; (list (cons elmo-msgdb-unread-cached-mark
-; nil)
-; (cons elmo-msgdb-unread-uncached-mark
-; elmo-msgdb-read-uncached-mark)
-; (cons elmo-msgdb-new-mark
-; elmo-msgdb-read-uncached-mark)))
- (wl-summary-set-mark-modified)
(wl-folder-update-unread (wl-summary-buffer-folder-name) 0)
(setq wl-summary-buffer-unread-count 0)
(setq wl-summary-buffer-new-count 0)
(let* ((inhibit-read-only t)
(buffer-read-only nil)
(folder wl-summary-buffer-elmo-folder)
- (msgdb (wl-summary-buffer-msgdb))
- (number-alist (elmo-msgdb-get-number-alist msgdb))
(case-fold-search nil)
- mark number unread new-mark)
- (setq mark (wl-summary-persistent-mark))
- (cond
- ((or (string= mark elmo-msgdb-new-mark)
- (string= mark elmo-msgdb-unread-uncached-mark)
- (string= mark elmo-msgdb-important-mark))
- ;; noop
- )
- ((string= mark elmo-msgdb-unread-cached-mark)
- (setq new-mark elmo-msgdb-unread-uncached-mark))
- (t
- (setq new-mark elmo-msgdb-read-uncached-mark)))
- (when new-mark
- (setq number (wl-summary-message-number))
+ new-mark mark number unread)
+ (setq number (wl-summary-message-number))
+ (elmo-message-set-cached folder number nil)
+ (setq new-mark (elmo-message-mark folder number)
+ mark (wl-summary-persistent-mark))
+ (unless (string= new-mark mark)
(delete-backward-char 1)
(insert new-mark)
(elmo-file-cache-delete
(elmo-message-field wl-summary-buffer-elmo-folder
number
'message-id)))
- (elmo-msgdb-set-mark msgdb number new-mark)
- (wl-summary-set-mark-modified)
(if wl-summary-highlight
- (wl-highlight-summary-current-line nil nil t))
+ (wl-highlight-summary-current-line))
(set-buffer-modified-p nil)))))
(defun wl-summary-resume-cache-status ()
"Resume the cache status of all messages in the current folder."
(interactive)
- (let* ((folder wl-summary-buffer-elmo-folder)
- (cur-buf (current-buffer))
- (msgdb (wl-summary-buffer-msgdb))
- (number-alist (elmo-msgdb-get-number-alist msgdb))
- (inhibit-read-only t)
- (buffer-read-only nil)
- (case-fold-search nil)
- msg mark msgid set-mark)
+ (let ((folder wl-summary-buffer-elmo-folder)
+ (buffer-read-only nil)
+ (case-fold-search nil)
+ number msgid set-mark mark)
(message "Resuming cache status...")
(save-excursion
(goto-char (point-min))
(while (not (eobp))
- (setq msg (wl-summary-message-number))
+ (setq number (wl-summary-message-number))
(setq mark (wl-summary-persistent-mark))
- (setq msgid (elmo-msgdb-get-field msgdb msg 'message-id))
+ (setq msgid (elmo-message-field folder number 'message-id))
(setq set-mark nil)
(if (elmo-file-cache-exists-p msgid)
- (if (or
- (string= mark elmo-msgdb-unread-uncached-mark) ; U -> !
- (string= mark elmo-msgdb-new-mark) ; N -> !
- )
- (setq set-mark elmo-msgdb-unread-cached-mark)
- (if (string= mark elmo-msgdb-read-uncached-mark) ; u -> ' '
- (setq set-mark " ")))
- (if (string= mark " ")
- (setq set-mark elmo-msgdb-read-uncached-mark) ;' ' -> u
- (if (string= mark elmo-msgdb-unread-cached-mark)
- (setq set-mark elmo-msgdb-unread-uncached-mark) ; ! -> U
- )))
+ (when (member mark (elmo-msgdb-uncached-marks))
+ (elmo-message-set-cached folder number t)
+ (setq set-mark (elmo-message-mark folder number)))
+ (unless (member mark (elmo-msgdb-uncached-marks))
+ (elmo-message-set-cached folder number nil)
+ (setq set-mark (or (elmo-message-mark folder number) " "))))
(when set-mark
(delete-backward-char 1)
(insert set-mark)
- (elmo-msgdb-set-mark msgdb msg
- (if (string= set-mark " ") nil set-mark))
(if wl-summary-highlight
(wl-highlight-summary-current-line)))
(forward-line 1))
- (wl-summary-set-mark-modified)
(wl-summary-count-unread)
(wl-summary-update-modeline)
(message "Resuming cache status...done")
(msgs2 msgs)
(len (length msgs))
(i 0)
+ ;(deleting-info (or deleting-info "Deleting..."))
update-list)
(elmo-kill-buffer wl-summary-search-buf-name)
(while msgs
(delete-char 1) ; delete '\n'
(setq wl-summary-buffer-number-list
(delq (car msgs) wl-summary-buffer-number-list)))))
- (when (and deleting-info
- (> len elmo-display-progress-threshold))
- (setq i (1+ i))
- (if (or (zerop (% i 5)) (= i len))
- (elmo-display-progress
- 'wl-summary-delete-messages-on-buffer deleting-info
- (/ (* i 100) len))))
+; (when (> len elmo-display-progress-threshold)
+; (setq i (1+ i))
+; (if (or (zerop (% i 5)) (= i len))
+; (elmo-display-progress
+; 'wl-summary-delete-messages-on-buffer deleting-info
+; (/ (* i 100) len))))
(setq msgs (cdr msgs)))
(when (eq wl-summary-buffer-view 'thread)
- (wl-thread-update-line-msgs (elmo-uniq-list update-list)
- (unless deleting-info 'no-msg))
+ (wl-thread-update-line-msgs (elmo-uniq-list update-list))
(wl-thread-cleanup-symbols msgs2))
+ ;;(message (concat deleting-info "done"))
(wl-summary-count-unread)
(wl-summary-update-modeline)
- (wl-folder-update-unread
- (wl-summary-buffer-folder-name)
- (+ wl-summary-buffer-unread-count wl-summary-buffer-new-count)))))
+ (wl-folder-set-folder-updated
+ (elmo-folder-name-internal wl-summary-buffer-elmo-folder)
+ (list 0
+ (+ wl-summary-buffer-unread-count wl-summary-buffer-new-count)
+ (elmo-folder-length wl-summary-buffer-elmo-folder))))))
(defun wl-summary-replace-status-marks (before after)
"Replace the status marks on buffer."
- (interactive)
(save-excursion
(goto-char (point-min))
(let ((inhibit-read-only t)
(if wl-summary-highlight (wl-highlight-summary-current-line)))
(forward-line 1)))))
-(defun wl-summary-get-delete-folder (folder)
- (if (string= folder wl-trash-folder)
- 'null
- (let* ((type (or (wl-get-assoc-list-value wl-delete-folder-alist folder)
- 'trash)))
- (cond ((stringp type)
- type)
- ((or (equal type 'remove) (equal type 'null))
- 'null)
- (t;; (equal type 'trash)
- (let ((trash-folder (wl-folder-get-elmo-folder wl-trash-folder)))
- (unless (elmo-folder-exists-p trash-folder)
- (if (y-or-n-p
- (format "Trash Folder %s does not exist, create it? "
- wl-trash-folder))
- (elmo-folder-create trash-folder)
- (error "Trash Folder is not created"))))
- wl-trash-folder)))))
-
(defun wl-summary-insert-message (&rest args)
(if (eq wl-summary-buffer-view 'thread)
- (apply 'wl-summary-insert-thread-entity args)
+ (apply 'wl-summary-insert-thread args)
(apply 'wl-summary-insert-sequential args)))
(defun wl-summary-sort ()
nil t nil nil (symbol-name wl-summary-default-sort-spec))))
(defun wl-summary-sync-marks ()
- "Update marks in summary."
+ "Update persistent marks in summary."
(interactive)
(let ((last-progress 0)
(folder wl-summary-buffer-elmo-folder)
(i 0)
- importants unreads
- importants-in-db unreads-in-db diff diffs
+ answereds importants unreads diff diffs
mes progress)
;; synchronize marks.
(when (not (eq (elmo-folder-type-internal
wl-summary-buffer-elmo-folder)
'internal))
(message "Updating marks...")
- (setq importants-in-db (elmo-folder-list-messages-mark-match
- wl-summary-buffer-elmo-folder
- (regexp-quote elmo-msgdb-important-mark))
- unreads-in-db (elmo-folder-list-messages-mark-match
- wl-summary-buffer-elmo-folder
- (wl-regexp-opt (elmo-msgdb-unread-marks)))
- importants (elmo-folder-list-importants
- wl-summary-buffer-elmo-folder)
+ (setq importants (elmo-uniq-list
+ (nconc
+ (elmo-folder-list-importants
+ wl-summary-buffer-elmo-folder)
+ (elmo-folder-list-messages-with-global-mark
+ wl-summary-buffer-elmo-folder
+ elmo-msgdb-important-mark)))
unreads (elmo-folder-list-unreads
- wl-summary-buffer-elmo-folder))
- (setq diff (elmo-list-diff importants importants-in-db))
+ wl-summary-buffer-elmo-folder)
+ answereds (elmo-folder-list-answereds
+ wl-summary-buffer-elmo-folder))
+ (setq diff (elmo-list-diff importants
+ (elmo-folder-list-flagged
+ wl-summary-buffer-elmo-folder
+ 'important 'in-msgdb)))
(setq diffs (cadr diff)) ; important-deletes
(setq mes (format "Updated (-%d" (length diffs)))
(while diffs
(while diffs
(wl-summary-mark-as-important (car diffs) " " 'no-server)
(setq diffs (cdr diffs)))
- (setq diff (elmo-list-diff unreads unreads-in-db))
+
+ (setq diff (elmo-list-diff answereds
+ (elmo-folder-list-flagged
+ wl-summary-buffer-elmo-folder
+ 'answered 'in-msgdb)))
(setq diffs (cadr diff))
(setq mes (concat mes (format "(-%d" (length diffs))))
(while diffs
- (wl-summary-mark-as-read (car diffs) 'no-folder)
+ (wl-summary-mark-as-unanswered (car diffs) 'no-modeline)
+ (setq diffs (cdr diffs)))
+ (setq diffs (car diff)) ; unread-appends
+ (setq mes (concat mes (format "/+%d) answered mark(s)." (length diffs))))
+ (while diffs
+ (wl-summary-mark-as-answered (car diffs) 'no-modeline)
+ (setq diffs (cdr diffs)))
+
+ (setq diff (elmo-list-diff unreads
+ (elmo-folder-list-flagged
+ wl-summary-buffer-elmo-folder
+ 'unread 'in-msgdb)))
+ (setq diffs (cadr diff))
+ (setq mes (concat mes (format "(-%d" (length diffs))))
+ (while diffs
+ (wl-summary-mark-as-read (car diffs) 'no-folder 'no-modeline)
(setq diffs (cdr diffs)))
(setq diffs (car diff)) ; unread-appends
(setq mes (concat mes (format "/+%d) unread mark(s)." (length diffs))))
(while diffs
- (wl-summary-mark-as-unread (car diffs) 'no-server 'no-modeline)
+ (wl-summary-mark-as-unread (car diffs) 'no-folder 'no-modeline)
(setq diffs (cdr diffs)))
- (if (interactive-p) (message mes)))))
+ (if (interactive-p) (message "%s" mes)))))
(defun wl-summary-sync-update (&optional unset-cursor sync-all no-check)
"Update the summary view to the newest folder status."
(inhibit-read-only t)
(buffer-read-only nil)
gc-message
- overview number-alist
+ overview
curp num i diff
append-list delete-list crossed
update-thread update-top-list
(progn
;; Setup sync-all
(if sync-all (wl-summary-sync-all-init))
-; (if (and has-nntp
-; (elmo-nntp-max-number-precedes-list-active-p))
- ;; XXX this does not work correctly in rare case.
-; (setq delete-list
-; (wl-summary-delete-canceled-msgs-from-list
-; delete-list
-; (wl-summary-buffer-msgdb))))
(setq diff (elmo-list-diff (elmo-folder-list-messages
folder
'visible-only
(setq delete-list (cadr diff))
(when delete-list
- (wl-summary-delete-messages-on-buffer
- delete-list "Deleting...")
- (message "Deleting...done"))
+ (wl-summary-delete-messages-on-buffer delete-list))
(wl-summary-update-status-marks)
- (setq curp append-list)
- (setq num (length curp))
- (when append-list
- (setq i 0)
-
- ;; set these value for append-message-func
- (setq overview (elmo-msgdb-get-overview
- (elmo-folder-msgdb folder)))
- (setq number-alist (elmo-msgdb-get-number-alist
- (elmo-folder-msgdb folder)))
-
- (setq wl-summary-delayed-update nil)
- (elmo-kill-buffer wl-summary-search-buf-name)
- (while curp
- (setq entity (elmo-msgdb-overview-get-entity
- (car curp) (elmo-folder-msgdb folder)))
+ (setq num (length append-list))
+ (setq i 0)
+ (setq wl-summary-delayed-update nil)
+ (elmo-kill-buffer wl-summary-search-buf-name)
+ (dolist (number append-list)
+ (setq entity (elmo-message-entity folder number))
+ (when (setq update-thread
+ (wl-summary-insert-message
+ entity folder
+ (not sync-all)))
+ (wl-append update-top-list update-thread))
+ (if elmo-use-database
+ (elmo-database-msgid-put
+ (car entity) (elmo-folder-name-internal folder)
+ (elmo-msgdb-overview-entity-get-number entity)))
+ (when (> num elmo-display-progress-threshold)
+ (setq i (+ i 1))
+ (if (or (zerop (% i 5)) (= i num))
+ (elmo-display-progress
+ 'wl-summary-sync-update
+ (if (eq wl-summary-buffer-view 'thread)
+ "Making thread..."
+ "Inserting message...")
+ (/ (* i 100) num)))))
+ (when wl-summary-delayed-update
+ (while wl-summary-delayed-update
+ (message "Parent (%d) of message %d is no entity"
+ (caar wl-summary-delayed-update)
+ (elmo-msgdb-overview-entity-get-number
+ (cdar wl-summary-delayed-update)))
(when (setq update-thread
(wl-summary-insert-message
- entity (elmo-folder-msgdb folder)
- (not sync-all)))
+ (cdar wl-summary-delayed-update)
+ wl-summary-buffer-elmo-folder
+ (not sync-all) t))
(wl-append update-top-list update-thread))
- (if elmo-use-database
- (elmo-database-msgid-put
- (car entity) (elmo-folder-name-internal folder)
- (elmo-msgdb-overview-entity-get-number entity)))
- (setq curp (cdr curp))
- (when (> num elmo-display-progress-threshold)
- (setq i (+ i 1))
- (if (or (zerop (% i 5)) (= i num))
- (elmo-display-progress
- 'wl-summary-sync-update
- (if (eq wl-summary-buffer-view 'thread)
- "Making thread..."
- "Inserting message...")
- (/ (* i 100) num)))))
- (when wl-summary-delayed-update
- (while wl-summary-delayed-update
- (message "Parent (%d) of message %d is no entity"
- (caar wl-summary-delayed-update)
- (elmo-msgdb-overview-entity-get-number
- (cdar wl-summary-delayed-update)))
- (when (setq update-thread
- (wl-summary-insert-message
- (cdar wl-summary-delayed-update)
- (elmo-folder-msgdb folder)
- (not sync-all) t))
- (wl-append update-top-list update-thread))
- (setq wl-summary-delayed-update
- (cdr wl-summary-delayed-update))))
- (when (and (eq wl-summary-buffer-view 'thread)
- update-top-list)
- (wl-thread-update-indent-string-thread
- (elmo-uniq-list update-top-list)))
- (message (if (eq wl-summary-buffer-view 'thread)
- "Making thread...done"
- "Inserting message...done")))
- (wl-summary-set-message-modified)
- (wl-summary-set-mark-modified)
+ (setq wl-summary-delayed-update
+ (cdr wl-summary-delayed-update))))
+ (when (and (eq wl-summary-buffer-view 'thread)
+ update-top-list)
+ (wl-thread-update-indent-string-thread
+ (elmo-uniq-list update-top-list)))
+ (message (if (eq wl-summary-buffer-view 'thread)
+ "Making thread...done"
+ "Inserting message...done"))
+ (when (or delete-list append-list)
+ (wl-summary-set-message-modified))
(when (and sync-all (eq wl-summary-buffer-view 'thread))
(elmo-kill-buffer wl-summary-search-buf-name)
(message "Inserting message...")
;; scoring
(when wl-use-scoring
(setq wl-summary-scored nil)
- (wl-summary-score-headers nil (wl-summary-buffer-msgdb)
- (and sync-all
- (wl-summary-rescore-msgs number-alist))
+ (wl-summary-score-headers (and sync-all
+ (wl-summary-rescore-msgs
+ wl-summary-buffer-number-list))
sync-all)
(when (and wl-summary-scored
(setq expunged (wl-summary-score-update-all-lines)))
(list 0
(let ((lst (wl-summary-count-unread)))
(+ (car lst) (nth 1 lst)))
- (elmo-folder-messages folder)))
+ (elmo-folder-length folder)))
(wl-summary-update-modeline)
;;
(unless unset-cursor
(goto-char (point-max))
(forward-line -1))
(if (and wl-summary-highlight
+ (not wl-summary-lazy-highlight)
(not (get-text-property (point) 'face)))
(save-excursion
(forward-line (- 0
(delete-backward-char 1)
(insert mark)
(if wl-summary-highlight
- (wl-highlight-summary-current-line nil nil t))
+ (wl-highlight-summary-current-line))
(set-buffer-modified-p nil)))))
(defun wl-summary-get-score-mark (msg-num)
(message "Deleting...")
(elmo-folder-delete-messages
wl-summary-buffer-elmo-folder dels)
- (elmo-msgdb-delete-msgs (wl-summary-buffer-msgdb)
- dels)
-;;; (elmo-msgdb-save (wl-summary-buffer-folder-name) nil)
+ (elmo-folder-detach-messages wl-summary-buffer-elmo-folder dels)
(wl-summary-set-message-modified)
- (wl-summary-set-mark-modified)
(wl-folder-set-folder-updated (wl-summary-buffer-folder-name)
(list 0 0 0))
;;; for thread.
(folder wl-summary-buffer-elmo-folder)
(copy-variables
(append '(wl-summary-buffer-view
- wl-summary-buffer-refile-list
- wl-summary-buffer-delete-list
- wl-summary-buffer-copy-list
+ wl-summary-buffer-temp-mark-list
wl-summary-buffer-target-mark-list
wl-summary-buffer-elmo-folder
wl-summary-buffer-number-column
wl-summary-buffer-temp-mark-column
wl-summary-buffer-persistent-mark-column
wl-summary-buffer-message-modified
- wl-summary-buffer-mark-modified
wl-summary-buffer-thread-modified
wl-summary-buffer-number-list
wl-summary-buffer-msgdb
(defun wl-summary-make-number-list ()
(save-excursion
(goto-char (point-min))
+ (setq wl-summary-buffer-number-list nil)
(while (not (eobp))
(setq wl-summary-buffer-number-list
(cons (wl-summary-message-number)
(defun wl-summary-auto-select-msg-p (unread-msg)
(and unread-msg
(not (string=
- (elmo-msgdb-get-mark
- (wl-summary-buffer-msgdb)
+ (elmo-message-mark
+ wl-summary-buffer-elmo-folder
unread-msg)
elmo-msgdb-important-mark))))
(wl-summary-rescan))
(wl-summary-toggle-disp-msg (if wl-summary-buffer-disp-msg 'on 'off))
(unless (and reuse-buf keep-cursor)
- ;(setq hilit wl-summary-highlight)
(unwind-protect
- (let ((wl-summary-highlight (if reuse-buf wl-summary-highlight))
- (wl-use-scoring
+ (let ((wl-use-scoring
(if (or scoring interactive) wl-use-scoring)))
(if (and (not scan-type)
interactive
(forward-line -1)
(wl-summary-prev))
(setq retval 'more-next))
- ;(setq wl-summary-highlight hilit)
(if (and wl-summary-highlight
(not wl-summary-lazy-highlight)
(not reuse-buf))
(if (and interactive wl-summary-recenter)
(recenter (/ (- (window-height) 2) 2))))))
;; set current entity-id
- (if (and (not folder)
- (setq entity
- (wl-folder-search-entity-by-name (elmo-folder-name-internal
- folder)
- wl-folder-entity
- 'folder)))
- ;; entity-id is unknown.
- (wl-folder-set-current-entity-id
- (wl-folder-get-entity-id entity)))
+ (when (and folder
+ (setq entity
+ (wl-folder-search-entity-by-name
+ (elmo-folder-name-internal folder)
+ wl-folder-entity
+ 'folder)))
+ ;; entity-id is unknown.
+ (wl-folder-set-current-entity-id
+ (wl-folder-get-entity-id entity)))
(when (and wl-summary-lazy-highlight
wl-on-xemacs)
(sit-for 0))
(ignore-errors
(run-hooks 'wl-summary-line-inserted-hook)))
-(defun wl-summary-insert-sequential (entity msgdb &rest args)
+(defun wl-summary-insert-sequential (entity folder &rest args)
(let ((inhibit-read-only t)
buffer-read-only)
(goto-char (point-max))
(wl-summary-insert-line
(wl-summary-create-line entity nil nil
- (elmo-msgdb-get-mark
- msgdb
- (elmo-msgdb-overview-entity-get-number
+ (elmo-message-mark
+ folder
+ (elmo-message-entity-number
entity))))
(setq wl-summary-buffer-number-list
(wl-append wl-summary-buffer-number-list
- (list (elmo-msgdb-overview-entity-get-number entity))))
+ (list (elmo-message-entity-number entity))))
nil))
(defun wl-summary-default-subject-filter (subject)
(` (elmo-get-hash-val (format "#%d" (wl-count-lines))
wl-summary-alike-hashtb)))
-(defun wl-summary-insert-headers (overview func mime-decode)
- (let (ov this last alike)
+(defun wl-summary-insert-headers (folder func mime-decode)
+ (let ((numbers (elmo-folder-list-messages folder t t))
+ ov this last alike)
(buffer-disable-undo (current-buffer))
(make-local-variable 'wl-summary-alike-hashtb)
- (setq wl-summary-alike-hashtb (elmo-make-hash (* (length overview) 2)))
+ (setq wl-summary-alike-hashtb (elmo-make-hash (* (length numbers) 2)))
(when mime-decode
(elmo-set-buffer-multibyte default-enable-multibyte-characters))
- (while (setq ov (pop overview))
+ (while (setq ov (elmo-message-entity folder (pop numbers)))
(setq this (funcall func ov))
(and this (setq this (std11-unfold-string this)))
(if (equal last this)
(eword-decode-region (point-min) (point-max))))
(run-hooks 'wl-summary-insert-headers-hook)))
-(defun wl-summary-search-by-subject (entity overview)
+(defun wl-summary-search-by-subject (entity folder)
(let ((summary-buf (current-buffer))
(buf (get-buffer-create wl-summary-search-buf-name))
(folder-name (wl-summary-buffer-folder-name))
(setq wl-summary-search-buf-folder-name folder-name)
(message "Creating subject cache...")
(wl-summary-insert-headers
- overview
+ folder
(function
(lambda (x)
(funcall wl-summary-subject-filter-function
- (elmo-msgdb-overview-entity-get-subject-no-decode x))))
+ (elmo-message-entity-field x 'subject))))
t)
(message "Creating subject cache...done"))
(setq match (funcall wl-summary-subject-filter-function
- (elmo-msgdb-overview-entity-get-subject entity)))
+ (elmo-message-entity-field entity 'subject
+ 'decode)))
(if (string= match "")
(setq match "\n"))
(goto-char (point-max))
;; the first element of found-entity list exists on
;; thread tree.
(wl-thread-get-entity
- (elmo-msgdb-overview-entity-get-number
- (car founds)))
+ (elmo-message-entity-number (car founds)))
;; message id is not same as myself.
(not (string=
- (elmo-msgdb-overview-entity-get-id entity)
- (elmo-msgdb-overview-entity-get-id (car founds))))
+ (elmo-message-entity-field entity 'message-id)
+ (elmo-message-entity-field (car founds)
+ 'message-id)))
;; not a descendant.
(not (wl-thread-descendant-p
- (elmo-msgdb-overview-entity-get-number entity)
- (elmo-msgdb-overview-entity-get-number
- (car founds)))))
+ (elmo-message-entity-number entity)
+ (elmo-message-entity-number (car founds)))))
(setq result (car founds)
founds nil))
(setq founds (cdr founds))))))
result))))
-(defun wl-summary-insert-thread-entity (entity msgdb update
- &optional force-insert)
- (let* ((overview (elmo-msgdb-get-overview msgdb))
- this-id
- parent-entity
- parent-number
- (case-fold-search t)
- cur number overview2 cur-entity linked retval delayed-entity
- update-list entity-stack)
+(defun wl-summary-insert-thread (entity folder update
+ &optional force-insert)
+ (let ((case-fold-search t)
+ (depth 0)
+ this-id parent-entity parent-number relatives anumber
+ cur number cur-entity linked retval delayed-entity
+ update-list entity-stack)
(while entity
- (setq this-id (elmo-msgdb-overview-entity-get-id entity)
+ (setq this-id (elmo-message-entity-field entity 'message-id)
parent-entity
- (elmo-msgdb-get-parent-entity entity msgdb)
- parent-number (elmo-msgdb-overview-entity-get-number
- parent-entity))
- (setq number (elmo-msgdb-overview-entity-get-number entity))
- ;; If thread loop detected, set parent as nil.
+ (elmo-message-entity-parent folder entity)
+ parent-number (elmo-message-entity-number parent-entity))
+ (setq number (elmo-message-entity-number entity))
(setq cur entity)
+ ;; If thread loop detected, set parent as nil.
(while cur
- (if (eq number (elmo-msgdb-overview-entity-get-number
- (setq cur
- (elmo-msgdb-get-parent-entity cur msgdb))))
+ (setq anumber
+ (elmo-message-entity-number
+ (setq cur (elmo-message-entity-parent folder cur))))
+ (if (memq anumber relatives)
(setq parent-number nil
- cur nil)))
+ cur nil))
+ (setq relatives (cons
+ (elmo-message-entity-number cur)
+ relatives)))
(if (and parent-number
(not (wl-thread-get-entity parent-number))
(not force-insert))
(string-match
wl-summary-search-parent-by-subject-regexp
(elmo-msgdb-overview-entity-get-subject entity)))
- (let ((found (wl-summary-search-by-subject entity overview)))
+ (let ((found (wl-summary-search-by-subject entity folder)))
(when (and found
(not (member found wl-summary-delayed-update)))
(setq parent-entity found)
(setq parent-number
- (elmo-msgdb-overview-entity-get-number parent-entity))
+ (elmo-message-entity-number parent-entity))
(setq linked t))))
;; If subject is change, divide thread.
(if (and parent-number
wl-summary-divide-thread-when-subject-changed
(not (wl-summary-subject-equal
- (or (elmo-msgdb-overview-entity-get-subject
- entity) "")
- (or (elmo-msgdb-overview-entity-get-subject
- parent-entity) ""))))
+ (or (elmo-message-entity-field entity
+ 'subject t) "")
+ (or (elmo-message-entity-field parent-entity
+ 'subject t) ""))))
(setq parent-number nil))
(setq retval
(wl-thread-insert-message entity
entity
parent-entity
nil
- (elmo-msgdb-get-mark (wl-summary-buffer-msgdb) number)
+ (elmo-message-mark wl-summary-buffer-elmo-folder number)
(wl-thread-maybe-get-children-num number)
(wl-thread-make-indent-string thr-entity)
(wl-thread-entity-get-linked thr-entity)))))))
-(defun wl-summary-mark-as-unread (&optional number
- no-server-update
- no-modeline-update)
- (interactive)
- (save-excursion
- (let* (eol
- (inhibit-read-only t)
- (buffer-read-only nil)
- (folder wl-summary-buffer-elmo-folder)
- (msgdb (wl-summary-buffer-msgdb))
-;;; (number-alist (elmo-msgdb-get-number-alist msgdb))
- new-mark visible mark cur-mark entity)
- (if number
- (progn
- (setq visible (wl-summary-jump-to-msg number))
- (unless (setq mark (elmo-msgdb-get-mark msgdb number))
- (setq mark " ")))
- ;; interactive
- (setq visible t))
- (when visible
- (if (null (wl-summary-message-number))
- (message "No message.")
- (end-of-line)
- (setq eol (point))
- (wl-summary-goto-previous-message-beginning)))
- (if (or (and (not visible)
- ;; already exists in msgdb.
- (elmo-msgdb-overview-get-entity number msgdb))
- (progn
- ;; visible.
- (setq cur-mark (wl-summary-persistent-mark))
- (or (string= cur-mark " ")
- (string= cur-mark elmo-msgdb-read-uncached-mark))))
- (progn
- (setq number (or number (wl-summary-message-number)))
- (setq mark (or mark cur-mark))
- (save-match-data
- (setq new-mark (if (string= mark
- elmo-msgdb-read-uncached-mark)
- elmo-msgdb-unread-uncached-mark
- (if (elmo-message-use-cache-p folder number)
- elmo-msgdb-unread-cached-mark
- elmo-msgdb-unread-uncached-mark))))
- ;; server side mark
- (unless no-server-update
- (elmo-folder-unmark-read folder (list number)))
- (when visible
- (delete-backward-char 1)
- (insert new-mark))
- (elmo-msgdb-set-mark msgdb number new-mark)
- (unless no-modeline-update
- (setq wl-summary-buffer-unread-count
- (+ 1 wl-summary-buffer-unread-count))
- (wl-summary-update-modeline)
- (wl-folder-update-unread
- (wl-summary-buffer-folder-name)
- (+ wl-summary-buffer-unread-count
- wl-summary-buffer-new-count)))
- (wl-summary-set-mark-modified)
- (if (and visible wl-summary-highlight)
- (wl-highlight-summary-current-line))))))
- (set-buffer-modified-p nil))
-
-(defun wl-summary-delete (&optional number)
- "Mark a delete mark 'D'.
-If optional argument NUMBER is specified, mark message specified by NUMBER."
- (interactive)
- (let* ((buffer-num (wl-summary-message-number))
- (msg-num (or number buffer-num))
- mark)
- (catch 'done
- (when (null msg-num)
- (if (interactive-p)
- (message "No message."))
- (throw 'done nil))
- (when (setq mark (wl-summary-get-mark msg-num))
- (when (wl-summary-reserve-temp-mark-p mark)
- (if (interactive-p)
- (error "Already marked as `%s'" mark))
- (throw 'done nil))
- (wl-summary-unmark msg-num))
- (if (or (interactive-p)
- (eq number buffer-num))
- (wl-summary-mark-line "D"))
- (setq wl-summary-buffer-delete-list
- (cons msg-num wl-summary-buffer-delete-list))
- (if (interactive-p)
- (if (eq wl-summary-move-direction-downward nil)
- (wl-summary-prev)
- (wl-summary-next)))
- msg-num)))
-
-(defun wl-summary-remove-destination ()
- (save-excursion
- (let ((inhibit-read-only t)
- (buffer-read-only nil)
- (buf (current-buffer))
- sol eol rs re)
- (beginning-of-line)
- (setq sol (point))
- (search-forward "\r")
- (forward-char -1)
- (setq eol (point))
- (setq rs (next-single-property-change sol 'wl-summary-destination
- buf eol))
- (setq re (next-single-property-change rs 'wl-summary-destination
- buf eol))
- (put-text-property rs re 'wl-summary-destination nil)
- (put-text-property rs re 'invisible nil)
- (goto-char re)
- (delete-char (- eol re)))))
-
-(defun wl-summary-check-mark (msg mark)
- (let ((check-func (cond ((string= mark "o")
- 'wl-summary-msg-marked-as-refiled)
- ((string= mark "O")
- 'wl-summary-msg-marked-as-copied)
- ((string= mark "D")
- 'wl-summary-msg-marked-as-deleted)
- ((string= mark "*")
- 'wl-summary-msg-marked-as-target))))
- (if check-func
- (funcall check-func msg))))
-
-(defun wl-summary-mark-collect (mark &optional begin end)
- (save-excursion
- (save-restriction
- (let (msglist)
- (narrow-to-region (or begin (point-min))
- (or end (point-max)))
- (goto-char (point-min))
- ;; for thread...
- (if (eq wl-summary-buffer-view 'thread)
- (progn
- (while (not (eobp))
- (let* ((number (wl-summary-message-number))
- (entity (wl-thread-get-entity number))
- result)
- ;; opened...only myself is checked.
- (if (wl-summary-check-mark number mark)
- (wl-append msglist (list number)))
- (unless (wl-thread-entity-get-opened entity)
- ;; closed...children is also checked.
- (if (setq result (wl-thread-get-children-msgs-with-mark
- number
- mark))
- (wl-append msglist result)))
- (forward-line 1)))
- (elmo-uniq-list msglist))
- (while (not (eobp))
- (when (string= (wl-summary-temp-mark) mark)
- (setq msglist (cons (wl-summary-message-number) msglist)))
- (forward-line 1)))))))
-
-(defun wl-summary-exec ()
- (interactive)
- (wl-summary-exec-subr (mapcar 'car wl-summary-buffer-refile-list)
- (reverse wl-summary-buffer-delete-list)
- (mapcar 'car wl-summary-buffer-copy-list)))
-
-(defun wl-summary-exec-region (beg end)
- (interactive "r")
- (message "Collecting marks...")
- (save-excursion
- (goto-char beg)
- (beginning-of-line)
- (setq beg (point))
- (goto-char (1- end))
- (forward-line)
- (setq end (point))
- (wl-summary-exec-subr (wl-summary-mark-collect "o" beg end)
- (wl-summary-mark-collect "D" beg end)
- (wl-summary-mark-collect "O" beg end))))
-
-(defun wl-summary-exec-subr (moves dels copies)
- (if (not (or moves dels copies))
- (message "No marks")
- (save-excursion
- (let ((del-fld (wl-summary-get-delete-folder
- (wl-summary-buffer-folder-name)))
- (start (point))
- (unread-marks (list elmo-msgdb-unread-cached-mark
- elmo-msgdb-unread-uncached-mark
- elmo-msgdb-new-mark))
- (refiles (append moves dels))
- (refile-failures 0)
- (copy-failures 0)
- (copy-len (length copies))
- refile-len
- dst-msgs ; loop counter
- result)
- (message "Executing...")
- (while dels
- (when (not (assq (car dels) wl-summary-buffer-refile-list))
- (wl-append wl-summary-buffer-refile-list
- (list (cons (car dels) del-fld)))
- (setq wl-summary-buffer-delete-list
- (delete (car dels) wl-summary-buffer-delete-list)))
- (setq dels (cdr dels)))
- ;; begin refile...
- (setq refile-len (length refiles))
- (setq dst-msgs
- (wl-inverse-alist refiles wl-summary-buffer-refile-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 "Moving 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))
- (if (eq 'null (car (car dst-msgs)))
- 'null
- (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))
- (error nil))
- (if result ; succeeded.
- (progn
- ;; update buffer.
- (wl-summary-delete-messages-on-buffer (cdr (car dst-msgs)))
- ;; update refile-alist.
- (setq wl-summary-buffer-refile-list
- (wl-delete-associations (cdr (car dst-msgs))
- wl-summary-buffer-refile-list)))
- (setq refile-failures
- (+ refile-failures (length (cdr (car dst-msgs))))))
- (setq dst-msgs (cdr dst-msgs)))
- (elmo-progress-clear 'elmo-folder-move-messages)
- ;; end refile
- ;; begin cOpy...
- (setq dst-msgs (wl-inverse-alist copies wl-summary-buffer-copy-list))
- (when (> copy-len elmo-display-progress-threshold)
- (elmo-progress-set 'elmo-folder-move-messages
- copy-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)))
- (wl-summary-buffer-msgdb)
- (not (null (cdr dst-msgs)))
- t ; t is no-delete (copy)
- nil ; same number
- t))
- (error nil))
- (if result ; succeeded.
- (progn
- ;; update buffer.
- (wl-summary-delete-copy-marks-on-buffer (cdr (car dst-msgs)))
- ;; update copy-alist
- (setq wl-summary-buffer-copy-list
- (wl-delete-associations (cdr (car dst-msgs))
- wl-summary-buffer-copy-list)))
- (setq copy-failures
- (+ copy-failures (length (cdr (car dst-msgs))))))
- (setq dst-msgs (cdr dst-msgs)))
- ;; Hide progress bar.
- (elmo-progress-clear 'elmo-folder-move-messages)
- ;; end cOpy
- (wl-summary-folder-info-update)
- (wl-summary-set-message-modified)
- (wl-summary-set-mark-modified)
- (run-hooks 'wl-summary-exec-hook)
- (unless (and wl-message-buffer
- (eq (wl-summary-message-number)
- (with-current-buffer wl-message-buffer
- wl-message-buffer-cur-number)))
- (wl-summary-toggle-disp-msg 'off))
- (set-buffer-modified-p nil)
- (message (concat "Executing...done"
- (if (> refile-failures 0)
- (format " (%d refiling failed)" refile-failures)
- "")
- (if (> copy-failures 0)
- (format " (%d copying failed)" copy-failures)
- "")
- "."))))))
-
-(defun wl-summary-erase (&optional number)
- "Erase message actually, without moving it to trash."
- (interactive)
- (if (elmo-folder-writable-p wl-summary-buffer-elmo-folder)
- (let* ((buffer-num (wl-summary-message-number))
- (msg-num (or number buffer-num)))
- (if (null msg-num)
- (message "No message.")
- (let* ((msgdb (wl-summary-buffer-msgdb))
- (entity (elmo-msgdb-overview-get-entity msg-num msgdb))
- (subject (elmo-delete-char
- ?\n (or (elmo-msgdb-overview-entity-get-subject
- entity)
- wl-summary-no-subject-message))))
- (when (yes-or-no-p
- (format "Erase \"%s\" without moving it to trash? "
- (truncate-string subject 30)))
- (wl-summary-unmark msg-num)
- (elmo-folder-delete-messages wl-summary-buffer-elmo-folder
- (list msg-num))
- (wl-summary-delete-messages-on-buffer (list msg-num))
- (save-excursion (wl-summary-sync nil "update"))))))
- (message "Read-only folder.")))
-
-(defun wl-summary-target-mark-erase ()
- (interactive)
- (if (elmo-folder-writable-p wl-summary-buffer-elmo-folder)
- (if (null wl-summary-buffer-target-mark-list)
- (message "No marked message.")
- (when (yes-or-no-p
- "Erase all marked messages without moving them to trash? ")
- (elmo-folder-delete-messages wl-summary-buffer-elmo-folder
- wl-summary-buffer-target-mark-list)
- (wl-summary-delete-messages-on-buffer
- wl-summary-buffer-target-mark-list)
- (setq wl-summary-buffer-target-mark-list nil)
- (save-excursion (wl-summary-sync nil "update"))))
- (message "Read-only folder.")))
-
-(defun wl-summary-read-folder (default &optional purpose ignore-error
- no-create init)
- (let ((fld (completing-read
- (format "Folder name %s(%s): " (or purpose "")
- default)
- (or wl-folder-completion-function
- (if (memq 'read-folder wl-use-folder-petname)
- (wl-folder-get-entity-with-petname)
- wl-folder-entity-hashtb))
- nil nil (or init wl-default-spec)
- 'wl-read-folder-hist)))
- (if (or (string= fld wl-default-spec)
- (string= fld ""))
- (setq fld default))
- (setq fld (elmo-string (wl-folder-get-realname fld)))
- (if (string-match "\n" fld)
- (error "Not supported folder name: %s" fld))
- (unless no-create
- (if ignore-error
- (condition-case nil
- (wl-folder-confirm-existence
- (wl-folder-get-elmo-folder
- fld))
- (error))
- (wl-folder-confirm-existence (wl-folder-get-elmo-folder
- fld))))
- fld))
-
-(defun wl-summary-print-destination (msg-num folder)
- "Print refile destination on line."
- (wl-summary-remove-destination)
- (let ((inhibit-read-only t)
- (folder (copy-sequence folder))
- (buffer-read-only nil)
- len rs re c)
- (setq len (string-width folder))
- (if (< len 1) ()
- ;;(end-of-line)
- (beginning-of-line)
- (search-forward "\r")
- (forward-char -1)
- (setq re (point))
- (setq c 0)
- (while (< c len)
- (forward-char -1)
- (setq c (+ c (char-width (following-char)))))
- (and (> c len) (setq folder (concat " " folder)))
- (setq rs (point))
- (when wl-summary-width
- (put-text-property rs re 'invisible t))
- (put-text-property rs re 'wl-summary-destination t)
- (goto-char re)
- (wl-highlight-refile-destination-string folder)
- (insert folder)
- (set-buffer-modified-p nil))))
-
-(defsubst wl-summary-get-mark (number)
- "Return a temporal mark of message specified by NUMBER."
- (or (and (memq number wl-summary-buffer-delete-list) "D")
- (and (assq number wl-summary-buffer-copy-list) "O")
- (and (assq number wl-summary-buffer-refile-list) "o")
- (and (memq number wl-summary-buffer-target-mark-list) "*")))
-
-(defsubst wl-summary-reserve-temp-mark-p (mark)
- "Return t if temporal MARK should be reserved."
- (member mark wl-summary-reserve-mark-list))
-
-(defun wl-summary-refile (&optional dst number)
- "Put refile mark on current line message.
-If optional argument DST is specified, put mark without asking
-destination folder.
-If optional argument NUMBER is specified, mark message specified by NUMBER.
-
-If folder is read-only, message should be copied.
-See `wl-refile-policy-alist' for more details."
- (interactive)
- (let ((policy (wl-get-assoc-list-value wl-refile-policy-alist
- (wl-summary-buffer-folder-name))))
- (cond ((eq policy 'copy)
- (if (interactive-p)
- (call-interactively 'wl-summary-copy)
- (wl-summary-copy dst number)))
- (t
- (wl-summary-refile-subr 'refile (interactive-p) dst number)))))
-
-(defun wl-summary-copy (&optional dst number)
- "Put copy mark on current line message.
-If optional argument DST is specified, put mark without asking
-destination folder.
-If optional argument NUMBER is specified, mark message specified by NUMBER."
- (interactive)
- (wl-summary-refile-subr 'copy (interactive-p) dst number))
-
-(defun wl-summary-refile-subr (copy-or-refile interactive &optional dst number)
- (let* ((buffer-num (wl-summary-message-number))
- (msg-num (or number buffer-num))
- (msgid (and msg-num
- (elmo-message-field wl-summary-buffer-elmo-folder
- msg-num 'message-id)))
- (entity (and msg-num
- (elmo-msgdb-overview-get-entity
- msg-num (wl-summary-buffer-msgdb))))
- (variable
- (intern (format "wl-summary-buffer-%s-list" copy-or-refile)))
- folder mark already tmp-folder)
- (catch 'done
- (when (null entity)
- ;; msgdb is empty?
- (if interactive
- (message "Cannot refile."))
- (throw 'done nil))
- (when (null msg-num)
- (if interactive
- (message "No message."))
- (throw 'done nil))
- (when (setq mark (wl-summary-get-mark msg-num))
- (when (wl-summary-reserve-temp-mark-p mark)
- (if interactive
- (error "Already marked as `%s'" mark))
- (throw 'done nil)))
- (setq folder (and msg-num
- (or dst (wl-summary-read-folder
- (or (wl-refile-guess entity) wl-trash-folder)
- (format "for %s" copy-or-refile)))))
- ;; Cache folder hack by okada@opaopa.org
- (if (and (eq (elmo-folder-type-internal
- (wl-folder-get-elmo-folder
- (wl-folder-get-realname folder))) 'cache)
- (not (string= folder
- (setq tmp-folder
- (concat "'cache/"
- (elmo-cache-get-path-subr
- (elmo-msgid-to-cache msgid)))))))
- (progn
- (setq folder tmp-folder)
- (message "Force refile to %s." folder)))
- (if (string= folder (wl-summary-buffer-folder-name))
- (error "Same folder"))
- (if (or (not (elmo-folder-writable-p (wl-folder-get-elmo-folder folder)))
- (string= folder wl-queue-folder)
- (string= folder wl-draft-folder))
- (error "Don't %s messages to %s" copy-or-refile folder))
- ;; learn for refile.
- (if (eq copy-or-refile 'refile)
- (wl-refile-learn entity folder))
- (wl-summary-unmark msg-num)
- (set variable (append
- (symbol-value variable)
- (list (cons msg-num folder))))
- (when (or interactive
- (eq number buffer-num))
- (wl-summary-mark-line (if (eq copy-or-refile 'refile)
- "o" "O"))
- ;; print refile destination
- (wl-summary-print-destination msg-num folder))
- (if interactive
- (if (eq wl-summary-move-direction-downward nil)
- (wl-summary-prev)
- (wl-summary-next)))
- (run-hooks (intern (format "wl-summary-%s-hook" copy-or-refile)))
- (setq wl-summary-buffer-prev-refile-destination folder)
- msg-num)))
-
-(defun wl-summary-refile-prev-destination ()
- "Refile message to previously refiled destination."
- (interactive)
- (wl-summary-refile wl-summary-buffer-prev-refile-destination
- (wl-summary-message-number))
- (if (eq wl-summary-move-direction-downward nil)
- (wl-summary-prev)
- (wl-summary-next)))
-
-(defun wl-summary-copy-prev-destination ()
- "Refile message to previously refiled destination."
- (interactive)
- (wl-summary-copy wl-summary-buffer-prev-copy-destination
- (wl-summary-message-number))
- (if (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)
- wl-summary-auto-refile-skip-marks))
-
-(defun wl-summary-auto-refile (&optional open-all)
- "Set refile mark automatically according to 'wl-refile-guess-by-rule'."
- (interactive "P")
- (message "Marking...")
- (save-excursion
- (if (and (eq wl-summary-buffer-view 'thread)
- open-all)
- (wl-thread-open-all))
- (let* ((spec (wl-summary-buffer-folder-name))
- checked-dsts
- (count 0)
- number dst thr-entity)
- (goto-line 1)
- (while (not (eobp))
- (setq number (wl-summary-message-number))
- (dolist (number (cons number
- (and (eq wl-summary-buffer-view 'thread)
- ;; process invisible children.
- (not (wl-thread-entity-get-opened
- (setq thr-entity
- (wl-thread-get-entity number))))
- (wl-thread-entity-get-descendant
- thr-entity))))
- (when (and (not (wl-summary-no-auto-refile-message-p
- number))
- (setq dst
- (wl-folder-get-realname
- (wl-refile-guess-by-rule
- (elmo-msgdb-overview-get-entity
- number (wl-summary-buffer-msgdb)))))
- (not (equal dst spec))
- (let ((pair (assoc dst checked-dsts))
- ret)
- (if pair
- (cdr pair)
- (setq ret
- (condition-case nil
- (progn
- (wl-folder-confirm-existence
- (wl-folder-get-elmo-folder dst))
- t)
- (error)))
- (setq checked-dsts (cons (cons dst ret) checked-dsts))
- ret)))
- (if (wl-summary-refile dst number)
- (incf count))
- (message "Marking...%d message(s)." count)))
- (forward-line))
- (if (eq count 0)
- (message "No message was marked.")
- (message "Marked %d message(s)." count)))))
-
-(defun wl-summary-unmark (&optional number)
- "Unmark marks (temporary, refile, copy, delete)of current line.
-If optional argument NUMBER is specified, unmark message specified by NUMBER."
- (interactive)
- (save-excursion
- (beginning-of-line)
- (let ((inhibit-read-only t)
- (buffer-read-only nil)
- visible
- msg-num
- cur-mark
- score-mark)
- (if number
- (setq visible (wl-summary-jump-to-msg number))
- (setq visible t))
- ;; Delete mark on buffer.
- (when visible
- (setq cur-mark (wl-summary-temp-mark))
- (if (string= cur-mark " ")
- ()
- (delete-backward-char 1)
- (or number
- (setq number (wl-summary-message-number)))
- (if (setq score-mark (wl-summary-get-score-mark number))
- (insert score-mark)
- (insert " ")))
- (if (or (string= cur-mark "o")
- (string= cur-mark "O"))
- (wl-summary-remove-destination))
- (if wl-summary-highlight
- (wl-highlight-summary-current-line nil nil score-mark))
- (set-buffer-modified-p nil))
- ;; Remove from temporal mark structure.
- (and number
- (wl-summary-delete-mark number)))))
-
-(defun wl-summary-msg-marked-as-target (msg)
- (if (memq msg wl-summary-buffer-target-mark-list)
- t))
-
-(defun wl-summary-msg-marked-as-copied (msg)
- (assq msg wl-summary-buffer-copy-list))
-
-(defun wl-summary-msg-marked-as-deleted (msg)
- (if (memq msg wl-summary-buffer-delete-list)
- t))
-
-(defun wl-summary-msg-marked-as-refiled (msg)
- (assq msg wl-summary-buffer-refile-list))
-
-(defun wl-summary-target-mark (&optional number)
- "Put target mark '*' on current message.
-If optional argument NUMBER is specified, mark message specified by NUMBER."
- (interactive)
- (let* ((buffer-num (wl-summary-message-number))
- (msg-num (or number buffer-num))
- mark)
- (catch 'done
- (when (null msg-num)
- (if (interactive-p)
- (message "No message."))
- (throw 'done nil))
- (when (setq mark (wl-summary-get-mark msg-num))
- (when (wl-summary-reserve-temp-mark-p mark)
- (if (interactive-p)
- (error "Already marked as `%s'" mark))
- (throw 'done nil))
- (wl-summary-unmark msg-num))
- (if (or (interactive-p)
- (eq number buffer-num))
- (wl-summary-mark-line "*"))
- (setq wl-summary-buffer-target-mark-list
- (cons msg-num wl-summary-buffer-target-mark-list))
- (if (interactive-p)
- (if (eq wl-summary-move-direction-downward nil)
- (wl-summary-prev)
- (wl-summary-next)))
- msg-num)))
-
-
-(defun wl-summary-refile-region (beg end)
- "Put refile mark on messages in the region specified by BEG and END."
- (interactive "r")
- (wl-summary-refile-region-subr "refile" beg end))
-
-(defun wl-summary-copy-region (beg end)
- "Put copy mark on messages in the region specified by BEG and END."
- (interactive "r")
- (wl-summary-refile-region-subr "copy" beg end))
-
-(defun wl-summary-refile-region-subr (copy-or-refile beg end)
- (save-excursion
- (save-restriction
- (goto-char beg)
- ;; guess by first msg
- (let* ((msgid (cdr (assq (wl-summary-message-number)
- (elmo-msgdb-get-number-alist
- (wl-summary-buffer-msgdb)))))
- (function (intern (format "wl-summary-%s" copy-or-refile)))
- (entity (assoc msgid (elmo-msgdb-get-overview
- (wl-summary-buffer-msgdb))))
- folder)
- (if entity
- (setq folder (wl-summary-read-folder (wl-refile-guess entity)
- (format "for %s"
- copy-or-refile))))
- (narrow-to-region beg end)
- (if (eq wl-summary-buffer-view 'thread)
- (progn
- (while (not (eobp))
- (let* ((number (wl-summary-message-number))
- (entity (wl-thread-get-entity number))
- children)
- (if (wl-thread-entity-get-opened entity)
- ;; opened...refile line.
- (funcall function folder number)
- ;; closed
- (setq children (wl-thread-get-children-msgs number))
- (while children
- (funcall function folder (pop children))))
- (forward-line 1))))
- (while (not (eobp))
- (funcall function folder (wl-summary-message-number))
- (forward-line 1)))))))
-
-(defun wl-summary-unmark-region (beg end)
- (interactive "r")
- (save-excursion
- (save-restriction
- (narrow-to-region beg end)
- (goto-char (point-min))
- (if (eq wl-summary-buffer-view 'thread)
- (progn
- (while (not (eobp))
- (let* ((number (wl-summary-message-number))
- (entity (wl-thread-get-entity number)))
- (if (wl-thread-entity-get-opened entity)
- ;; opened...unmark line.
- (wl-summary-unmark)
- ;; closed
- (wl-summary-delete-marks-on-buffer
- (wl-thread-get-children-msgs number))))
- (forward-line 1)))
- (while (not (eobp))
- (wl-summary-unmark)
- (forward-line 1))))))
-
-(defun wl-summary-mark-region-subr (function beg end)
- (save-excursion
- (save-restriction
- (narrow-to-region beg end)
- (goto-char (point-min))
- (if (eq wl-summary-buffer-view 'thread)
- (progn
- (while (not (eobp))
- (let* ((number (wl-summary-message-number))
- (entity (wl-thread-get-entity number))
- (wl-summary-move-direction-downward t)
- children)
- (if (wl-thread-entity-get-opened entity)
- ;; opened...delete line.
- (funcall function number)
- ;; closed
- (setq children (wl-thread-get-children-msgs number))
- (while children
- (funcall function (pop children))))
- (forward-line 1))))
- (while (not (eobp))
- (funcall function (wl-summary-message-number))
- (forward-line 1))))))
-
-(defun wl-summary-delete-region (beg end)
- (interactive "r")
- (wl-summary-mark-region-subr 'wl-summary-delete beg end))
-
-(defun wl-summary-target-mark-region (beg end)
- (interactive "r")
- (wl-summary-mark-region-subr 'wl-summary-target-mark beg end))
-
-(defun wl-summary-target-mark-all ()
- (interactive)
- (wl-summary-target-mark-region (point-min) (point-max))
- (setq wl-summary-buffer-target-mark-list
- (mapcar 'car
- (elmo-msgdb-get-number-alist (wl-summary-buffer-msgdb)))))
-
-(defun wl-summary-delete-all-mark (mark)
- (goto-char (point-min))
- (while (not (eobp))
- (when (string= (wl-summary-temp-mark) mark)
- (wl-summary-unmark))
- (forward-line 1))
- (cond ((string= mark "*")
- (setq wl-summary-buffer-target-mark-list nil))
- ((string= mark "D")
- (setq wl-summary-buffer-delete-list nil))
- ((string= mark "O")
- (setq wl-summary-buffer-copy-list nil))
- ((string= mark "o")
- (setq wl-summary-buffer-refile-list nil))))
-
-(defun wl-summary-unmark-all ()
- "Unmark all according to what you input."
- (interactive)
- (let ((unmarks (string-to-char-list (read-from-minibuffer "Unmark: ")))
- cur-mark)
- (save-excursion
- (while unmarks
- (setq cur-mark (char-to-string (car unmarks)))
- (wl-summary-delete-all-mark cur-mark)
- (setq unmarks (cdr unmarks))))))
-
-(defun wl-summary-target-mark-thread ()
- (interactive)
- (wl-thread-call-region-func 'wl-summary-target-mark-region t))
-
(defun wl-summary-target-mark-msgs (msgs)
"Return the number of marked messages."
(let ((i 0) num)
wl-summary-pick-field-default)
"/"
(wl-summary-buffer-folder-name))
- 'update nil nil t)))
+ 'update nil nil t)
+ (run-hooks 'wl-summary-virtual-hook)))
(defun wl-summary-delete-all-temp-marks (&optional no-msg)
"Erase all temp marks from buffer."
(interactive)
(when (or wl-summary-buffer-target-mark-list
- wl-summary-buffer-delete-list
- wl-summary-buffer-refile-list
- wl-summary-buffer-copy-list)
+ wl-summary-buffer-temp-mark-list)
(save-excursion
(goto-char (point-min))
(unless no-msg
(message "Unmarking..."))
(while (not (eobp))
- (wl-summary-unmark)
+ (wl-summary-unset-mark)
(forward-line 1))
(unless no-msg
(message "Unmarking...done"))
(setq wl-summary-buffer-target-mark-list nil)
- (setq wl-summary-buffer-delete-list nil)
- (setq wl-summary-buffer-refile-list nil)
- (setq wl-summary-buffer-copy-list nil))))
-
-(defun wl-summary-delete-mark (number)
- "Delete temporary mark of the message specified by NUMBER."
- (cond
- ((memq number wl-summary-buffer-target-mark-list)
- (setq wl-summary-buffer-target-mark-list
- (delq number wl-summary-buffer-target-mark-list)))
- ((memq number wl-summary-buffer-delete-list)
- (setq wl-summary-buffer-delete-list
- (delq number wl-summary-buffer-delete-list)))
- (t
- (let (pair)
- (cond
- ((setq pair (assq number wl-summary-buffer-copy-list))
- (setq wl-summary-buffer-copy-list
- (delq pair wl-summary-buffer-copy-list)))
- ((setq pair (assq number wl-summary-buffer-refile-list))
- (setq wl-summary-buffer-refile-list
- (delq pair wl-summary-buffer-refile-list))))))))
+ (setq wl-summary-buffer-temp-mark-list nil))))
(defsubst wl-summary-temp-mark ()
"Move to the temp-mark column and return mark string."
(buffer-substring (- (point) 1) (point)))
(defun wl-summary-mark-line (mark)
- "Put MARK on current line. Return message number."
+ "Put MARK on current line."
(save-excursion
(beginning-of-line)
(let ((inhibit-read-only t)
(buffer-read-only nil))
(wl-summary-temp-mark) ; mark
(delete-backward-char 1)
- (insert mark)
- (if wl-summary-highlight
- (wl-highlight-summary-current-line nil nil t))
- (set-buffer-modified-p nil))))
-
-(defun wl-summary-target-mark-delete ()
- (interactive)
- (save-excursion
- (goto-char (point-min))
- (let (number mlist)
- (while (not (eobp))
- (when (string= (wl-summary-temp-mark) "*")
- (let (wl-summary-buffer-disp-msg)
- (when (setq number (wl-summary-message-number))
- (wl-summary-delete number)
- (setq wl-summary-buffer-target-mark-list
- (delq number wl-summary-buffer-target-mark-list)))))
- (forward-line 1))
- (setq mlist wl-summary-buffer-target-mark-list)
- (while mlist
- (wl-append wl-summary-buffer-delete-list (list (car mlist)))
- (setq wl-summary-buffer-target-mark-list
- (delq (car mlist) wl-summary-buffer-target-mark-list))
- (setq mlist (cdr mlist))))))
-
-(defun wl-summary-target-mark-prefetch (&optional ignore-cache)
- (interactive "P")
- (save-excursion
- (let* ((mlist (nreverse wl-summary-buffer-target-mark-list))
- (inhibit-read-only t)
- (buffer-read-only nil)
- (count 0)
- (length (length mlist))
- (pos (point))
- skipped
- new-mark)
- (while mlist
- (setq new-mark (wl-summary-prefetch-msg (car mlist) ignore-cache))
- (if new-mark
- (progn
- (message "Prefetching... %d/%d message(s)"
- (setq count (+ 1 count)) length)
- (when (wl-summary-jump-to-msg (car mlist))
- (wl-summary-unmark)
- (when new-mark
- (wl-summary-persistent-mark) ; move
- (delete-backward-char 1)
- (insert new-mark)
- (if wl-summary-highlight
- (wl-highlight-summary-current-line))
- (save-excursion
- (goto-char pos)
- (sit-for 0)))))
- (setq skipped (cons (car mlist) skipped)))
- (setq mlist (cdr mlist)))
- (setq wl-summary-buffer-target-mark-list skipped)
- (message "Prefetching... %d/%d message(s)" count length)
- (set-buffer-modified-p nil))))
-
-(defun wl-summary-target-mark-refile-subr (copy-or-refile)
- (let ((variable
- (intern (format "wl-summary-buffer-%s-list" copy-or-refile)))
- (function
- (intern (format "wl-summary-%s" copy-or-refile)))
- (numlist wl-summary-buffer-number-list)
- regexp number msgid entity folder mlist)
- (save-excursion
- ;; guess by first mark
- (while numlist
- (if (memq (car numlist) wl-summary-buffer-target-mark-list)
- (setq number (car numlist)
- numlist nil))
- (setq numlist (cdr numlist)))
- (when number
- (setq msgid (elmo-message-field wl-summary-buffer-elmo-folder
- number 'message-id)
- entity (elmo-msgdb-overview-get-entity
- number (wl-summary-buffer-msgdb)))
- (if (null entity)
- (error "Cannot %s" copy-or-refile))
- (setq folder (wl-summary-read-folder
- (wl-refile-guess entity)
- (format "for %s" copy-or-refile)))
- (goto-char (point-min))
- (while (not (eobp))
- (when (string= (wl-summary-temp-mark) "*")
- (let (wl-summary-buffer-disp-msg)
- (when (setq number (wl-summary-message-number))
- (funcall function folder number)
- (setq wl-summary-buffer-target-mark-list
- (delq number wl-summary-buffer-target-mark-list)))))
- (forward-line 1))
- ;; process invisible messages.
- (setq mlist wl-summary-buffer-target-mark-list)
- (while mlist
- (set variable
- (append (symbol-value variable)
- (list (cons (car mlist) folder))))
- (setq wl-summary-buffer-target-mark-list
- (delq (car mlist) wl-summary-buffer-target-mark-list))
- (setq mlist (cdr mlist)))))))
+ (insert mark))))
(defun wl-summary-next-buffer ()
"Switch to next summary buffer."
(or (cadr (memq (current-buffer) buffers))
(car buffers)))))
-(defun wl-summary-target-mark-copy ()
- (interactive)
- (wl-summary-target-mark-refile-subr "copy"))
-
-(defun wl-summary-target-mark-refile ()
- (interactive)
- (wl-summary-target-mark-refile-subr "refile"))
-
(defun wl-summary-target-mark-mark-as-read ()
(interactive)
(save-excursion
(delete-backward-char 1)
(insert " ")
(setq number (wl-summary-message-number))
- (wl-summary-mark-as-read number)
+ (setq mlist (append mlist (list number)))
(if wl-summary-highlight
(wl-highlight-summary-current-line))
(if number
(setq wl-summary-buffer-target-mark-list
(delq number wl-summary-buffer-target-mark-list))))
(forward-line 1))
- (setq mlist wl-summary-buffer-target-mark-list)
- (while mlist
- (wl-summary-mark-as-read (car mlist))
- (setq wl-summary-buffer-target-mark-list
- (delq (car mlist) wl-summary-buffer-target-mark-list))
- (setq mlist (cdr mlist)))
- (wl-summary-count-unread)
- (wl-summary-update-modeline))))
+ (wl-summary-mark-as-read mlist)
+ ;; closed
+ (when (setq mlist wl-summary-buffer-target-mark-list)
+ (wl-summary-mark-as-read mlist)
+ (while mlist
+ (setq wl-summary-buffer-target-mark-list
+ (delq (car mlist) wl-summary-buffer-target-mark-list))
+ (setq mlist (cdr mlist)))))))
(defun wl-summary-target-mark-mark-as-unread ()
(interactive)
(when (string= (wl-summary-temp-mark) "*")
(delete-backward-char 1)
(insert " ")
- (setq number (wl-summary-mark-as-unread))
+ (setq number (wl-summary-message-number))
+ (setq mlist (append mlist (list number)))
(if wl-summary-highlight
(wl-highlight-summary-current-line))
(if number
(setq wl-summary-buffer-target-mark-list
(delq number wl-summary-buffer-target-mark-list))))
(forward-line 1))
- (setq mlist wl-summary-buffer-target-mark-list)
- (while mlist
- (wl-summary-mark-as-unread (car mlist))
-;;; (wl-thread-msg-mark-as-unread (car mlist))
- (setq wl-summary-buffer-target-mark-list
- (delq (car mlist) wl-summary-buffer-target-mark-list))
- (setq mlist (cdr mlist)))
- (wl-summary-count-unread)
- (wl-summary-update-modeline))))
+ (wl-summary-mark-as-unread mlist)
+ ;; closed
+ (when (setq mlist wl-summary-buffer-target-mark-list)
+ (wl-summary-mark-as-unread mlist)
+ (while mlist
+ (setq wl-summary-buffer-target-mark-list
+ (delq (car mlist) wl-summary-buffer-target-mark-list))
+ (setq mlist (cdr mlist)))))))
(defun wl-summary-target-mark-mark-as-important ()
(interactive)
(interactive)
(wl-summary-pick wl-summary-buffer-target-mark-list 'delete))
-(defun wl-summary-mark-as-read (&optional number no-folder-mark)
+(defun wl-summary-update-mark (&optional number)
+ "Synch up persistent mark of current line with msgdb's."
+ (let ((number (or number (wl-summary-message-number)))
+ buffer-read-only cur-mark)
+ (setq cur-mark (elmo-message-mark wl-summary-buffer-elmo-folder number))
+ (save-excursion
+ ;; set mark on buffer
+ (unless (string= (wl-summary-persistent-mark) cur-mark)
+ (delete-backward-char 1)
+ (insert (or cur-mark " ")))
+ (when wl-summary-highlight
+ (wl-highlight-summary-current-line))
+ (set-buffer-modified-p nil))))
+
+(defsubst wl-summary-mark-as-read-internal (inverse
+ number-or-numbers
+ no-folder-mark
+ no-modeline-update)
+ (save-excursion
+ (let ((inhibit-read-only t)
+ (buffer-read-only nil)
+ (folder wl-summary-buffer-elmo-folder)
+ (case-fold-search nil)
+ unread-message number
+ number-list mark visible new-mark)
+ (setq number-list (cond ((numberp number-or-numbers)
+ (setq unread-message
+ (member (elmo-message-mark
+ folder
+ number-or-numbers)
+ (elmo-msgdb-unread-marks)))
+ (list number-or-numbers))
+ ((and (not (null number-or-numbers))
+ (listp number-or-numbers))
+ number-or-numbers)
+ ((setq number (wl-summary-message-number))
+ ;; interactive
+ (setq unread-message
+ (member (elmo-message-mark folder number)
+ (elmo-msgdb-unread-marks)))
+ (list number))))
+ (if (null number-list)
+ (message "No message.")
+ (if inverse
+ (elmo-folder-unmark-read folder number-list no-folder-mark)
+ (elmo-folder-mark-as-read folder number-list no-folder-mark))
+ (dolist (number number-list)
+ (setq visible (wl-summary-jump-to-msg number)
+ new-mark (elmo-message-mark folder number))
+ (unless inverse
+ (when unread-message
+ (run-hooks 'wl-summary-unread-message-hook)))
+ ;; set mark on buffer
+ (when visible
+ (unless (string= (wl-summary-persistent-mark) (or new-mark " "))
+ (delete-backward-char 1)
+ (insert (or new-mark " ")))
+ (if (and visible wl-summary-highlight)
+ (wl-highlight-summary-current-line))
+ (set-buffer-modified-p nil)))
+ (unless no-modeline-update
+ ;; Update unread numbers.
+ ;; should elmo-folder-mark-as-read return unread numbers?
+ (wl-summary-count-unread)
+ (wl-summary-update-modeline)
+ (wl-folder-update-unread
+ (wl-summary-buffer-folder-name)
+ (+ wl-summary-buffer-unread-count
+ wl-summary-buffer-new-count)))))))
+
+(defun wl-summary-mark-as-read (&optional number-or-numbers
+ no-folder-mark
+ no-modeline-update)
+ (interactive)
+ (wl-summary-mark-as-read-internal nil
+ number-or-numbers
+ no-folder-mark
+ no-modeline-update))
+
+(defun wl-summary-mark-as-unread (&optional number-or-numbers
+ no-folder-mark
+ no-modeline-update)
(interactive)
+ (wl-summary-mark-as-read-internal 'inverse
+ number-or-numbers
+ no-folder-mark
+ no-modeline-update))
+
+(defsubst wl-summary-mark-as-answered-internal (inverse
+ number-or-numbers
+ no-modeline-update)
(save-excursion
- (let ((buffer-read-only nil)
+ (let ((inhibit-read-only t)
+ (buffer-read-only nil)
(folder wl-summary-buffer-elmo-folder)
- (msgdb (wl-summary-buffer-msgdb))
(case-fold-search nil)
- cur-mark mark stat visible uncached new-mark marked)
- (setq number (or number (wl-summary-message-number))
- visible (if number
- (wl-summary-jump-to-msg number)
- ;; interactive
- t)
- mark (elmo-msgdb-get-mark msgdb number))
- (cond
- ((string= mark elmo-msgdb-new-mark) ; N
- (setq stat 'new))
- ((string= mark elmo-msgdb-unread-uncached-mark) ; U
- (setq stat 'unread))
- ((string= mark elmo-msgdb-unread-cached-mark) ; !
- (setq stat 'unread))
- ((string= mark elmo-msgdb-read-uncached-mark) ; u
- (setq stat 'read))
- (t
- ;; no need to mark server.
- (setq no-folder-mark t)))
- (setq new-mark
- (if (and (if (elmo-message-use-cache-p folder number)
- (not (elmo-folder-local-p folder)))
- (not (elmo-file-cache-exists-p
- (elmo-message-field wl-summary-buffer-elmo-folder
- number 'message-id))))
- elmo-msgdb-read-uncached-mark
- nil))
- ;; folder mark.
- (unless no-folder-mark
- (elmo-folder-mark-as-read folder (list number)))
- (cond ((eq stat 'unread)
- (setq wl-summary-buffer-unread-count
- (1- wl-summary-buffer-unread-count)))
- ((eq stat 'new)
- (setq wl-summary-buffer-new-count
- (1- wl-summary-buffer-new-count))))
- (wl-summary-update-modeline)
- (wl-folder-update-unread
- (wl-summary-buffer-folder-name)
- (+ wl-summary-buffer-unread-count
- wl-summary-buffer-new-count))
- (when stat
- ;; set mark on buffer
- (when visible
- (unless (string= (wl-summary-persistent-mark) new-mark)
- (delete-backward-char 1)
- (insert (or new-mark " "))))
- ;; set msgdb mark.
- (unless (string= mark new-mark)
- (elmo-msgdb-set-mark msgdb number new-mark))
- (wl-summary-set-mark-modified))
- (if (and visible wl-summary-highlight)
- (wl-highlight-summary-current-line nil nil t))
- (set-buffer-modified-p nil)
- (if stat
- (run-hooks 'wl-summary-unread-message-hook))
- number ;return value
- )))
+ number number-list mark visible new-mark)
+ (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 (null number-list)
+ (message "No message.")
+ (if inverse
+ (elmo-folder-unmark-answered folder number-list)
+ (elmo-folder-mark-as-answered folder number-list))
+ (dolist (number number-list)
+ (setq visible (wl-summary-jump-to-msg number)
+ new-mark (elmo-message-mark folder number))
+ ;; set mark on buffer
+ (when visible
+ (unless (string= (wl-summary-persistent-mark) (or new-mark " "))
+ (delete-backward-char 1)
+ (insert (or new-mark " ")))
+ (if (and visible wl-summary-highlight)
+ (wl-highlight-summary-current-line))
+ (set-buffer-modified-p nil)))
+ (unless no-modeline-update
+ ;; Update unread numbers.
+ ;; should elmo-folder-mark-as-read return unread numbers?
+ (wl-summary-count-unread)
+ (wl-summary-update-modeline)
+ (wl-folder-update-unread
+ (wl-summary-buffer-folder-name)
+ (+ wl-summary-buffer-unread-count
+ wl-summary-buffer-new-count)))))))
+
+(defun wl-summary-mark-as-answered (&optional number-or-numbers
+ no-modeline-update)
+ (interactive)
+ (wl-summary-mark-as-answered-internal
+ (and (interactive-p)
+ (member (elmo-message-mark wl-summary-buffer-elmo-folder
+ (wl-summary-message-number))
+ (elmo-msgdb-answered-marks)))
+ number-or-numbers
+ no-modeline-update))
+
+(defun wl-summary-mark-as-unanswered (&optional number-or-numbers
+ no-modeline-update)
+ (wl-summary-mark-as-answered-internal 'inverse
+ number-or-numbers
+ no-modeline-update))
(defun wl-summary-mark-as-important (&optional number
mark
(inhibit-read-only t)
(buffer-read-only nil)
(folder wl-summary-buffer-elmo-folder)
- (msgdb (wl-summary-buffer-msgdb))
- (number-alist (elmo-msgdb-get-number-alist msgdb))
message-id visible cur-mark)
(if number
(progn
(setq visible (wl-summary-jump-to-msg number))
- (setq mark (or mark (elmo-msgdb-get-mark msgdb number))))
+ (setq mark (or mark (elmo-message-mark
+ wl-summary-buffer-elmo-folder number))))
(setq visible t))
(when visible
(if (null (setq number (wl-summary-message-number)))
(wl-summary-goto-previous-message-beginning)))
(if (or (and (not visible)
;; already exists in msgdb.
- (elmo-msgdb-overview-get-entity number msgdb))
+ (elmo-message-entity wl-summary-buffer-elmo-folder
+ number))
(setq cur-mark (wl-summary-persistent-mark)))
(progn
(setq number (or number (wl-summary-message-number)))
(progn
;; server side mark
(save-match-data
+ (elmo-folder-unmark-important folder (list number)
+ no-server-update)
(unless no-server-update
- (elmo-folder-unmark-important folder (list number))
(elmo-msgdb-global-mark-delete message-id))
;; Remove cache if local folder.
(if (and (elmo-folder-local-p folder)
(elmo-file-cache-get-path message-id))))
(when visible
(delete-backward-char 1)
- (insert " "))
- (elmo-msgdb-set-mark msgdb number nil))
+ (insert (or (elmo-message-mark folder number) " "))))
;; server side mark
- (save-match-data
- (unless no-server-update
- (elmo-folder-mark-as-important folder (list number))))
+ (elmo-folder-mark-as-important folder (list number)
+ no-server-update)
(when visible
(delete-backward-char 1)
(insert elmo-msgdb-important-mark))
- (elmo-msgdb-set-mark msgdb number
- elmo-msgdb-important-mark)
(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)))
- (wl-summary-set-mark-modified)))
+ elmo-msgdb-important-mark)))))
(if (and visible wl-summary-highlight)
- (wl-highlight-summary-current-line nil nil t))))
+ (wl-highlight-summary-current-line))))
(set-buffer-modified-p nil)
number)
"Return non-nil when summary line format is changed."
(not (string=
wl-summary-buffer-line-format
- (or (elmo-object-load (expand-file-name
+ (or (elmo-object-load (expand-file-name
wl-summary-line-format-file
(elmo-folder-msgdb-path
wl-summary-buffer-elmo-folder))
(defun wl-summary-line-list-info ()
(let ((list-info (wl-summary-get-list-info wl-message-entity)))
(if (car list-info)
- (format (if (cdr list-info) "(%s %05d)" "(%s)")
+ (format (if (cdr list-info) "(%s %05.0f)" "(%s)")
(car list-info) (cdr list-info))
"")))
(wl-match-string 1 wday-str)
(elmo-date-get-week year month mday))))
-(defvar wl-summary-move-spec-plugged-alist
- (` ((new . ((t . nil)
- (p . (, elmo-msgdb-new-mark))
- (p . (, (wl-regexp-opt
- (list elmo-msgdb-unread-uncached-mark
- elmo-msgdb-unread-cached-mark))))
- (p . (, (regexp-quote elmo-msgdb-important-mark)))))
- (unread . ((t . nil)
- (p . (, (wl-regexp-opt
- (list elmo-msgdb-new-mark
- elmo-msgdb-unread-uncached-mark
- elmo-msgdb-unread-cached-mark))))
- (p . (, (regexp-quote elmo-msgdb-important-mark))))))))
-
-(defvar wl-summary-move-spec-unplugged-alist
- (` ((new . ((t . nil)
- (p . (, elmo-msgdb-unread-cached-mark))
- (p . (, (regexp-quote elmo-msgdb-important-mark)))))
- (unread . ((t . nil)
- (p . (, elmo-msgdb-unread-cached-mark))
- (p . (, (regexp-quote elmo-msgdb-important-mark))))))))
+(defvar wl-summary-move-spec-alist
+ '((new . ((t . nil)
+ (p . new)
+ (p . unread)
+ (p . important)))
+ (unread . ((t . nil)
+ (p . unread)
+ (p . important)))))
(defsubst wl-summary-next-message (num direction hereto)
(if wl-summary-buffer-next-message-function
(funcall wl-summary-buffer-next-message-function num direction hereto)
(let ((cur-spec (cdr (assq wl-summary-move-order
- (if (elmo-folder-plugged-p
- wl-summary-buffer-elmo-folder)
- wl-summary-move-spec-plugged-alist
- wl-summary-move-spec-unplugged-alist))))
+ wl-summary-move-spec-alist)))
(nums (memq num (if (eq direction 'up)
(reverse wl-summary-buffer-number-list)
wl-summary-buffer-number-list)))
- marked-list nums2)
+ flagged-list nums2)
(unless hereto (setq nums (cdr nums)))
(setq nums2 nums)
(if cur-spec
(while cur-spec
(setq nums nums2)
(cond ((eq (car (car cur-spec)) 'p)
- (if (setq marked-list
- (elmo-folder-list-messages-mark-match
+ (if (setq flagged-list
+ (elmo-folder-list-flagged
wl-summary-buffer-elmo-folder
(cdr (car cur-spec))))
(while nums
- (if (memq (car nums) marked-list)
+ (if (and (memq (car nums) flagged-list)
+ (elmo-message-accessible-p
+ wl-summary-buffer-elmo-folder
+ (car nums)))
(throw 'done (car nums)))
(setq nums (cdr nums)))))
((eq (car (car cur-spec)) 't)
(view (expand-file-name wl-summary-view-file dir))
(save-view wl-summary-buffer-view)
(mark-list (copy-sequence wl-summary-buffer-target-mark-list))
- (refile-list (copy-sequence wl-summary-buffer-refile-list))
- (copy-list (copy-sequence wl-summary-buffer-copy-list))
- (delete-list (copy-sequence wl-summary-buffer-delete-list))
+ (temp-list (copy-sequence wl-summary-buffer-temp-mark-list))
(tmp-buffer (get-buffer-create " *wl-summary-save-view-cache*"))
(temp-column wl-summary-buffer-temp-mark-column)
(charset wl-summary-buffer-mime-charset))
(make-local-variable 'wl-summary-highlight)
(setq wl-summary-highlight nil
wl-summary-buffer-target-mark-list mark-list
- wl-summary-buffer-refile-list refile-list
- wl-summary-buffer-copy-list copy-list
- wl-summary-buffer-delete-list delete-list
+ wl-summary-buffer-temp-mark-list temp-list
wl-summary-buffer-temp-mark-column temp-column)
- (wl-summary-delete-all-temp-marks)
+ (wl-summary-delete-all-temp-marks 'no-msg)
(encode-coding-region
(point-min) (point-max)
(or (and wl-on-mule ; one in mcs-ltn1(apel<10.4) cannot take 2 arg.
(select-window (get-buffer-window cur-buf))
(run-hooks 'wl-summary-toggle-disp-off-hook))
;;; (switch-to-buffer cur-buf)
- )))))
+ )))
+ (when wl-summary-lazy-highlight
+ (wl-highlight-summary-window))))
(defun wl-summary-next-line-content ()
"Show next line of the message."
(save-excursion
(set-buffer summary-buf)
(wl-summary-delete-all-temp-marks)))
+ (wl-draft-reply-position wl-draft-reply-default-position)
(run-hooks 'wl-mail-setup-hook)))
(defun wl-summary-reply-with-citation (&optional arg)
(when (wl-summary-reply arg t)
(goto-char (point-max))
(wl-draft-yank-original)
+ (wl-draft-reply-position wl-draft-reply-default-position)
(run-hooks 'wl-mail-setup-hook)))
(defun wl-summary-jump-to-msg-by-message-id (&optional id)
(interactive)
(let* ((original (wl-summary-message-number))
(msgid (elmo-string (or id (read-from-minibuffer "Message-ID: "))))
- (number-alist (elmo-msgdb-get-number-alist (wl-summary-buffer-msgdb)))
+ (entity (elmo-message-entity wl-summary-buffer-elmo-folder msgid))
msg otherfld schar
- (errmsg
- (format "No message with id \"%s\" in the folder." msgid)))
- (if (setq msg (car (rassoc msgid number-alist)))
-;;; (wl-summary-jump-to-msg-internal
-;;; (wl-summary-buffer-folder-name) msg 'no-sync)
+ (errmsg (format "No message with id \"%s\" in the folder." msgid)))
+ (if (setq msg (elmo-message-entity-number entity))
(progn
(wl-thread-jump-to-msg msg)
t)
(wl-summary-buffer-folder-name) original 'no-sync))
(cond ((eq wl-summary-search-via-nntp 'confirm)
(require 'elmo-nntp)
- (message "Search message in nntp server \"%s\" <y/n/s(elect)>?"
+ (message "Search message in nntp server \"%s\" <y/n/s(elect)>? "
elmo-nntp-default-server)
- (setq schar (read-char))
+ (setq schar (let ((cursor-in-echo-area t)) (read-char)))
(cond ((eq schar ?y)
(wl-summary-jump-to-msg-by-message-id-via-nntp msgid))
((eq schar ?s)
msgid
(read-from-minibuffer "NNTP Server: ")))
(t
- (message errmsg)
+ (message "%s" errmsg)
nil)))
- (wl-summary-search-via-nntp
+ ((or (eq wl-summary-search-via-nntp 'force)
+ (and
+ (eq (elmo-folder-type-internal wl-summary-buffer-elmo-folder)
+ 'nntp)
+ wl-summary-search-via-nntp))
(wl-summary-jump-to-msg-by-message-id-via-nntp msgid))
(t
- (message errmsg)
+ (message "%s" errmsg)
nil))))))
(defun wl-summary-jump-to-msg-by-message-id-via-nntp (&optional id server-spec)
folder scan-type nil nil t)
(if msgid
(setq msg
- (car (rassoc msgid
- (elmo-msgdb-get-number-alist
- (wl-summary-buffer-msgdb))))))
+ (elmo-message-entity-number
+ (elmo-message-entity
+ wl-summary-buffer-elmo-folder
+ msgid))))
(setq entity (wl-folder-search-entity-by-name folder
wl-folder-entity
'folder))
(when number
(save-excursion
(wl-summary-redisplay-internal folder number))
+ (elmo-folder-mark-as-answered folder (list number))
+ (wl-summary-update-mark number)
(setq mes-buf wl-message-buffer)
(wl-message-select-buffer wl-message-buffer)
(set-buffer mes-buf)
(goto-char (point-min))
(when (setq mes-buf (wl-message-get-original-buffer))
- (wl-draft-reply mes-buf arg summary-buf)
+ (wl-draft-reply mes-buf arg summary-buf number)
+ (wl-draft-reply-position wl-draft-reply-default-position)
(unless without-setup-hook
(run-hooks 'wl-mail-setup-hook)))
t)))
(let ((start (point))
(skip-tmark-regexp (wl-regexp-opt wl-summary-skip-mark-list))
(skip t)
+ (column (current-column))
skip-pmark-regexp goto-next next-entity finfo)
(if (elmo-folder-plugged-p wl-summary-buffer-elmo-folder)
()
(wl-regexp-opt (list " "
elmo-msgdb-unread-cached-mark
elmo-msgdb-important-mark))))
- (while (and skip
- (not (if downward (eobp) (bobp))))
- (if downward
- (forward-line 1)
- (forward-line -1))
- (setq skip (or (string-match skip-tmark-regexp
- (save-excursion
- (wl-summary-temp-mark)))
- (and skip-pmark-regexp
- (not (string-match
- skip-pmark-regexp
- (save-excursion
- (wl-summary-persistent-mark))))))))
-
+ (beginning-of-line)
+ (let (case-fold-search)
+ (while (and skip
+ (not (if downward (eobp) (bobp))))
+ (if downward
+ (forward-line 1)
+ (forward-line -1))
+ (setq skip (or (string-match skip-tmark-regexp
+ (save-excursion
+ (wl-summary-temp-mark)))
+ (and skip-pmark-regexp
+ (not (string-match
+ skip-pmark-regexp
+ (save-excursion
+ (wl-summary-persistent-mark)))))))))
(if (if downward (eobp) (and (bobp) skip)) (setq goto-next t))
(if (or (eobp) (and (bobp) skip))
(goto-char start))
-
- (beginning-of-line)
+ (move-to-column column)
(if (not goto-next)
(if wl-summary-buffer-disp-msg
(defsubst wl-summary-redisplay-internal (&optional folder number force-reload)
(interactive)
- (let* ((msgdb (wl-summary-buffer-msgdb))
- (folder (or folder wl-summary-buffer-elmo-folder))
+ (let* ((folder (or folder wl-summary-buffer-elmo-folder))
(num (or number (wl-summary-message-number)))
(wl-mime-charset wl-summary-buffer-mime-charset)
(default-mime-charset wl-summary-buffer-mime-charset)
- fld-buf fld-win thr-entity)
+ no-folder-mark fld-buf fld-win thr-entity)
(if (and wl-thread-open-reading-thread
(eq wl-summary-buffer-view 'thread)
(not (wl-thread-entity-get-opened
(if (setq fld-win (get-buffer-window fld-buf))
(delete-window fld-win)))
(setq wl-current-summary-buffer (current-buffer))
- (wl-summary-mark-as-read
- num
- ;; not fetched, then change server-mark.
- (if (wl-message-redisplay folder num 'mime
- (or force-reload
- (string= (elmo-folder-name-internal
- folder)
- wl-draft-folder)))
- nil
- ;; plugged, then leave server-mark.
- (if (and
- (not
- (elmo-folder-local-p
- wl-summary-buffer-elmo-folder))
- (elmo-folder-plugged-p
- wl-summary-buffer-elmo-folder))
- 'leave)))
+ (setq no-folder-mark
+ ;; If cache is used, change folder-mark.
+ (if (wl-message-redisplay folder num
+ 'mime
+ (or
+ force-reload
+ (string= (elmo-folder-name-internal
+ folder)
+ wl-draft-folder)))
+ nil
+ ;; plugged, then leave folder-mark.
+ (if (and (not (elmo-folder-local-p
+ wl-summary-buffer-elmo-folder))
+ (elmo-folder-plugged-p
+ wl-summary-buffer-elmo-folder))
+ 'leave)))
+ (when (elmo-message-use-cache-p folder num)
+ (elmo-message-set-cached folder num t))
+ (if (member (elmo-message-mark wl-summary-buffer-elmo-folder
+ num)
+ (elmo-msgdb-unread-marks))
+ (wl-summary-mark-as-read num no-folder-mark)
+ (wl-summary-update-mark))
(setq wl-summary-buffer-current-msg num)
(when wl-summary-recenter
(recenter (/ (- (window-height) 2) 2))
(let* ((buffer (generate-new-buffer " *print*"))
(entity (progn
(set-buffer summary-buffer)
- (assoc (cdr (assq
- (wl-summary-message-number)
- (elmo-msgdb-get-number-alist
- (wl-summary-buffer-msgdb))))
- (elmo-msgdb-get-overview
- (wl-summary-buffer-msgdb)))))
+ (elmo-message-entity
+ wl-summary-buffer-elmo-folder
+ (wl-summary-message-number))))
(wl-ps-subject
(and entity
(or (elmo-msgdb-overview-entity-get-subject entity)
(wl-summary-unmark num))))))
(defun wl-summary-folder-info-update ()
- (let ((folder (elmo-string (wl-summary-buffer-folder-name)))
- (num-db (elmo-msgdb-get-number-alist
- (wl-summary-buffer-msgdb))))
- (wl-folder-set-folder-updated folder
- (list 0
- (+ wl-summary-buffer-unread-count
- wl-summary-buffer-new-count)
- (length num-db)))))
+ (wl-folder-set-folder-updated
+ (elmo-string (wl-summary-buffer-folder-name))
+ (list 0
+ (+ wl-summary-buffer-unread-count
+ wl-summary-buffer-new-count)
+ (elmo-folder-length
+ wl-summary-buffer-elmo-folder))))
(defun wl-summary-get-original-buffer ()
"Get original buffer for the current summary."