X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=wl%2Fwl-summary.el;h=b8155133a10cbc007a8f2110e0ff7bb9b906d8e7;hb=8a81d3a3caef0f94f9721361a749f0b6429f30ce;hp=b00977ae7923bee37d183fbd191fbc20cac89521;hpb=bcff199b81f20dafc46c0272c3caf132b4d3dd5e;p=elisp%2Fwanderlust.git diff --git a/wl/wl-summary.el b/wl/wl-summary.el index b00977a..b815513 100644 --- a/wl/wl-summary.el +++ b/wl/wl-summary.el @@ -60,6 +60,7 @@ (defvar dragdrop-drop-functions) (defvar scrollbar-height) (defvar mail-reply-buffer) +(defvar elmo-global-flag-list) (defvar wl-summary-buffer-name "Summary") (defvar wl-summary-mode-map nil) @@ -71,10 +72,6 @@ (` (and wl-summary-buffer-elmo-folder (elmo-folder-name-internal wl-summary-buffer-elmo-folder)))) -(defmacro wl-summary-buffer-msgdb () - (` (and wl-summary-buffer-elmo-folder - (elmo-folder-msgdb wl-summary-buffer-elmo-folder)))) - (defvar wl-summary-buffer-disp-msg nil) (defvar wl-summary-buffer-disp-folder nil) (defvar wl-summary-buffer-temp-mark-list nil) @@ -94,18 +91,19 @@ (defvar wl-summary-buffer-temp-mark-column nil) (defvar wl-summary-buffer-persistent-mark-column nil) +(defvar wl-summary-buffer-unsync-mark-number-list 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-prev-refile-destination nil) -(defvar wl-summary-buffer-prev-copy-destination nil) (defvar wl-summary-buffer-saved-message nil) (defvar wl-summary-buffer-prev-folder-function nil) (defvar wl-summary-buffer-next-folder-function nil) (defvar wl-summary-buffer-exit-function nil) (defvar wl-summary-buffer-next-message-function nil) +(defvar wl-summary-buffer-window-scroll-functions nil) (defvar wl-summary-buffer-number-list nil) -(defvar wl-summary-buffer-msgdb nil) (defvar wl-summary-buffer-folder-name nil) (defvar wl-summary-buffer-line-formatter nil) (defvar wl-summary-buffer-line-format nil) @@ -119,7 +117,7 @@ (defvar wl-thread-horizontal-str-internal nil) (defvar wl-thread-space-str-internal nil) (defvar wl-summary-last-visited-folder nil) -(defvar wl-read-folder-hist nil) +(defvar wl-read-folder-history nil) (defvar wl-summary-scored nil) (defvar wl-crosspost-alist-modified nil) (defvar wl-summary-alike-hashtb nil) @@ -134,6 +132,8 @@ (defvar wl-ps-preprint-hook nil) (defvar wl-ps-print-hook nil) +(defvar wl-thread-saved-entity-hashtb-internal nil) + (make-variable-buffer-local 'wl-summary-buffer-elmo-folder) (make-variable-buffer-local 'wl-summary-search-buf-folder-name) (make-variable-buffer-local 'wl-summary-buffer-disp-msg) @@ -153,6 +153,7 @@ (make-variable-buffer-local 'wl-summary-buffer-number-column) (make-variable-buffer-local 'wl-summary-buffer-temp-mark-column) (make-variable-buffer-local 'wl-summary-buffer-persistent-mark-column) +(make-variable-buffer-local 'wl-summary-buffer-unsync-mark-number-list) (make-variable-buffer-local 'wl-summary-buffer-persistent) (make-variable-buffer-local 'wl-summary-buffer-thread-nodes) (make-variable-buffer-local 'wl-summary-buffer-prev-refile-destination) @@ -174,8 +175,8 @@ (make-variable-buffer-local 'wl-summary-buffer-next-folder-function) (make-variable-buffer-local 'wl-summary-buffer-exit-function) (make-variable-buffer-local 'wl-summary-buffer-next-message-function) +(make-variable-buffer-local 'wl-summary-buffer-window-scroll-functions) (make-variable-buffer-local 'wl-summary-buffer-number-list) -(make-variable-buffer-local 'wl-summary-buffer-msgdb) (make-variable-buffer-local 'wl-summary-buffer-folder-name) (make-variable-buffer-local 'wl-summary-buffer-line-formatter) (make-variable-buffer-local 'wl-summary-buffer-line-format) @@ -250,7 +251,7 @@ See also variable `wl-use-petname'." string) string)) -(defvar wl-summary-sort-specs '(number date subject from list-info)) +(defvar wl-summary-sort-specs '(number date subject from list-info size)) (defvar wl-summary-default-sort-spec 'date) (defvar wl-summary-mode-menu-spec @@ -278,6 +279,7 @@ See also variable `wl-use-petname'." ["Stick" wl-summary-stick t] ("Sort" ["By Number" wl-summary-sort-by-number t] + ["By Size" wl-summary-sort-by-size t] ["By Date" wl-summary-sort-by-date t] ["By From" wl-summary-sort-by-from t] ["By Subject" wl-summary-sort-by-subject t] @@ -285,15 +287,16 @@ See also variable `wl-use-petname'." "----" ("Message Operation" ["Mark as read" wl-summary-mark-as-read t] - ["Mark as important" wl-summary-mark-as-important t] + ["Set flags" wl-summary-set-flags t] ["Mark as unread" wl-summary-mark-as-unread t] + ["Mark as answered" wl-summary-mark-as-answered t] ["Set dispose mark" wl-summary-dispose t] ["Set refile mark" wl-summary-refile t] ["Set copy mark" wl-summary-copy t] ["Set resend mark" wl-summary-resend t] - ["Prefetch" wl-summary-prefetch t] + ["Prefetch" wl-summary-prefetch t] ["Set target mark" wl-summary-target-mark t] - ["Unmark" wl-summary-unmark t] + ["Unmark" wl-summary-unmark t] ["Save" wl-summary-save t] ["Cancel posted news" wl-summary-cancel-message t] ["Supersedes message" wl-summary-supersedes-message t] @@ -306,8 +309,9 @@ See also variable `wl-use-petname'." ["Open all" wl-thread-open-all (eq wl-summary-buffer-view 'thread)] ["Close all" wl-thread-close-all (eq wl-summary-buffer-view 'thread)] ["Mark as read" wl-thread-mark-as-read (eq wl-summary-buffer-view 'thread)] - ["Mark as important" wl-thread-mark-as-important (eq wl-summary-buffer-view 'thread)] + ["Set flags" wl-thread-set-flags (eq wl-summary-buffer-view 'thread)] ["Mark as unread" wl-thread-mark-as-unread (eq wl-summary-buffer-view 'thread)] + ["Mark as answered" wl-thread-mark-as-answered (eq wl-summary-buffer-view 'thread)] ["Set delete mark" wl-thread-delete (eq wl-summary-buffer-view 'thread)] ["Set refile mark" wl-thread-refile (eq wl-summary-buffer-view 'thread)] ["Set copy mark" wl-thread-copy (eq wl-summary-buffer-view 'thread)] @@ -318,8 +322,9 @@ See also variable `wl-use-petname'." ["Execute" wl-thread-exec (eq wl-summary-buffer-view 'thread)]) ("Region Operation" ["Mark as read" wl-summary-mark-as-read-region t] - ["Mark as important" wl-summary-mark-as-important-region t] + ["Set flags" wl-summary-set-flags-region t] ["Mark as unread" wl-summary-mark-as-unread-region t] + ["Mark as answered" wl-summary-mark-as-answered-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] @@ -330,7 +335,7 @@ See also variable `wl-use-petname'." ["Execute" wl-summary-exec-region t]) ("Mark Operation" ["Mark as read" wl-summary-target-mark-mark-as-read t] - ["Mark as important" wl-summary-target-mark-mark-as-important t] + ["Set flags" wl-summary-target-mark-set-flags t] ["Mark as unread" wl-summary-target-mark-mark-as-unread t] ["Set delete mark" wl-summary-target-mark-delete t] ["Set refile mark" wl-summary-target-mark-refile t] @@ -376,6 +381,11 @@ See also variable `wl-use-petname'." (define-key wl-summary-mode-map [mouse-5] 'wl-summary-next) (define-key wl-summary-mode-map [S-mouse-4] 'wl-summary-up) (define-key wl-summary-mode-map [S-mouse-5] 'wl-summary-down) + ;; For Meadow2 + (define-key wl-summary-mode-map [mouse-wheel1] + 'wl-summary-wheel-dispatcher) + (define-key wl-summary-mode-map [S-mouse-wheel1] + 'wl-summary-wheel-dispatcher) (define-key wl-summary-mode-map [mouse-2] 'wl-summary-click))) (if wl-summary-mode-map @@ -404,7 +414,7 @@ See also variable `wl-use-petname'." (define-key wl-summary-mode-map "E" 'wl-summary-reedit) (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-set-flags) (define-key wl-summary-mode-map "&" 'wl-summary-mark-as-answered) (define-key wl-summary-mode-map "@" 'wl-summary-edit-addresses) @@ -477,12 +487,14 @@ See also variable `wl-use-petname'." (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 "t\M-o" 'wl-thread-refile-prev-destination) (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) + (define-key wl-summary-mode-map "t$" 'wl-thread-set-flags) + (define-key wl-summary-mode-map "t&" 'wl-thread-mark-as-answered) (define-key wl-summary-mode-map "ty" 'wl-thread-save) (define-key wl-summary-mode-map "ts" 'wl-thread-set-parent) @@ -491,6 +503,7 @@ See also variable `wl-use-petname'." (define-key wl-summary-mode-map "mi" 'wl-summary-target-mark-prefetch) (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 "m\M-o" 'wl-summary-target-mark-refile-prev-destination) (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) @@ -500,7 +513,7 @@ See also variable `wl-use-petname'." (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 "m$" 'wl-summary-target-mark-set-flags) (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) @@ -519,12 +532,14 @@ See also variable `wl-use-petname'." (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 "r\M-o" 'wl-summary-refile-prev-destination-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) + (define-key wl-summary-mode-map "r$" 'wl-summary-set-flags-region) + (define-key wl-summary-mode-map "r&" 'wl-summary-mark-as-answered-region) (define-key wl-summary-mode-map "ry" 'wl-summary-save-region) ;; score commands @@ -539,6 +554,8 @@ See also variable `wl-use-petname'." (define-key wl-summary-mode-map "hm" 'wl-score-set-mark-below) (define-key wl-summary-mode-map "hx" 'wl-score-set-expunge-below) + ;; misc + (define-key wl-summary-mode-map "\C-c\C-f" 'wl-summary-toggle-header-narrowing) (define-key wl-summary-mode-map "\M-t" 'wl-toggle-plugged) (define-key wl-summary-mode-map "\C-t" 'wl-plugged-change) ;; @@ -556,6 +573,39 @@ See also variable `wl-use-petname'." (not (wl-thread-entity-parent-invisible-p (wl-thread-get-entity number))))) +(defun wl-summary-update-mark-and-highlight-window (&optional win beg) + "A function to be called as window-scroll-functions." + (with-current-buffer (window-buffer win) + (when (eq major-mode 'wl-summary-mode) + (let ((beg (or beg (window-start win))) + (end (condition-case nil + (window-end win t) ; old emacsen doesn't support 2nd arg. + (error (window-end win)))) + number flags + wl-summary-highlight) + (save-excursion + (goto-char beg) + (while (and (< (point) end) (not (eobp))) + (when (null (get-text-property (point) 'face)) + (setq number (wl-summary-message-number) + flags (elmo-message-flags wl-summary-buffer-elmo-folder + number)) + (setq wl-summary-highlight nil) + (wl-summary-update-persistent-mark number flags) + (setq wl-summary-highlight t) + (wl-highlight-summary-current-line number flags)) + (forward-line 1))))) + (set-buffer-modified-p nil))) + +(defun wl-summary-window-scroll-functions () + (cond ((and wl-summary-lazy-highlight + wl-summary-lazy-update-mark) + (list 'wl-summary-update-mark-and-highlight-window)) + (wl-summary-lazy-highlight + (list 'wl-highlight-summary-window)) + (wl-summary-lazy-update-mark + (list 'wl-summary-update-mark-window)))) + (defun wl-status-update () (interactive) (wl-address-init)) @@ -563,8 +613,7 @@ See also variable `wl-use-petname'." (defun wl-summary-display-top () (interactive) (goto-char (point-min)) - (when wl-summary-lazy-highlight - (wl-highlight-summary-window)) + (run-hooks 'wl-summary-buffer-window-scroll-functions) (if wl-summary-buffer-disp-msg (wl-summary-redisplay))) @@ -572,8 +621,7 @@ See also variable `wl-use-petname'." (interactive) (goto-char (point-max)) (forward-line -1) - (when wl-summary-lazy-highlight - (wl-highlight-summary-window)) + (run-hooks 'wl-summary-buffer-window-scroll-functions) (if wl-summary-buffer-disp-msg (wl-summary-redisplay))) @@ -669,28 +717,36 @@ you." (let ((column wl-summary-buffer-number-column) (formatter wl-summary-buffer-line-formatter) (dummy-temp (char-to-string 200)) - (dummy-persistent (char-to-string 201)) + ;; bind only for the check. + (wl-summary-new-uncached-mark (char-to-string 201)) + (wl-summary-persistent-mark-priority-list '(new)) ; ditto. + (lang wl-summary-buffer-weekday-name-lang) + wl-summary-highlight temp persistent) (with-temp-buffer (setq wl-summary-buffer-number-column column - wl-summary-buffer-line-formatter formatter) + wl-summary-buffer-line-formatter formatter + wl-summary-buffer-weekday-name-lang lang) (insert (wl-summary-create-line (elmo-msgdb-make-message-entity + (luna-make-entity 'modb-entity-handler) :number 10000 :from "foo" :subject "bar" :size 100) nil dummy-temp - dummy-persistent)) + '(new) + nil)) (goto-char (point-min)) (setq temp (save-excursion (when (search-forward dummy-temp nil t) (current-column))) - persistent (save-excursion - (when (search-forward dummy-persistent nil t) - (current-column))))) + persistent + (save-excursion + (when (search-forward wl-summary-new-uncached-mark nil t) + (current-column))))) (setq wl-summary-buffer-temp-mark-column temp wl-summary-buffer-persistent-mark-column persistent))) @@ -728,7 +784,6 @@ you." wl-summary-buffer-mode-line-formatter wl-summary-mode-line-format wl-summary-mode-line-format-spec-alist) - (wl-summary-detect-mark-position) (setq wl-summary-buffer-persistent (wl-folder-persistent-p (elmo-folder-name-internal folder))) (elmo-folder-set-persistent-internal folder wl-summary-buffer-persistent) @@ -781,18 +836,24 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'." selective-display-ellipses nil) (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 - (progn - (make-local-variable 'pre-idle-hook) - (add-hook 'pre-idle-hook 'wl-highlight-summary-window)) - (make-local-variable 'window-scroll-functions) - (add-hook 'window-scroll-functions 'wl-highlight-summary-window))) + (setq wl-summary-buffer-window-scroll-functions + (wl-summary-window-scroll-functions)) + (when wl-summary-buffer-window-scroll-functions + (let ((hook (if wl-on-xemacs 'pre-idle-hook 'window-scroll-functions))) + (make-local-hook hook) + (dolist (function wl-summary-buffer-window-scroll-functions) + (add-hook hook function nil t)))) ;; This hook may contain the function `wl-setup-summary' for reasons ;; of system internal to accord facilities for the Emacs variants. (run-hooks 'wl-summary-mode-hook)) ;;; +(defun wl-summary-overview-entity-compare-by-size (x y) + "Compare entity X and Y by size." + (< (elmo-message-entity-field x 'size) + (elmo-message-entity-field y 'size))) + + (defun wl-summary-overview-entity-compare-by-date (x y) "Compare entity X and Y by date." (condition-case nil @@ -813,10 +874,10 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'." "Compare entity X and Y by from." (string< (wl-address-header-extract-address - (or (elmo-message-entity-field x 'from) + (or (elmo-message-entity-field x 'from t) wl-summary-no-from-message)) (wl-address-header-extract-address - (or (elmo-message-entity-field y 'from) + (or (elmo-message-entity-field y 'from t) wl-summary-no-from-message)))) (defun wl-summary-overview-entity-compare-by-subject (x y) @@ -887,7 +948,7 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'." (interactive) (wl-summary-rescan "list-info")) -(defun wl-summary-rescan (&optional sort-by disable-killed) +(defun wl-summary-rescan (&optional sort-by disable-killed disable-thread) "Rescan current folder without updating." (interactive) (let ((elmo-mime-charset wl-summary-buffer-mime-charset) @@ -898,6 +959,12 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'." (buffer-read-only nil) (numbers (elmo-folder-list-messages wl-summary-buffer-elmo-folder (not disable-killed) t)) ; in-msgdb + (wl-thread-saved-entity-hashtb-internal (and (not disable-thread) + wl-thread-entity-hashtb)) + (wl-summary-search-parent-by-subject-regexp + (and disable-thread wl-summary-search-parent-by-subject-regexp)) + (wl-summary-divide-thread-when-subject-changed + (and disable-thread wl-summary-divide-thread-when-subject-changed)) expunged) (erase-buffer) (message "Re-scanning...") @@ -919,6 +986,7 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'." wl-thread-entities nil wl-summary-scored nil wl-summary-buffer-number-list nil + wl-summary-buffer-unsync-mark-number-list nil wl-summary-buffer-target-mark-list nil wl-summary-buffer-temp-mark-list nil wl-summary-delayed-update nil) @@ -940,7 +1008,7 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'." (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 + (elmo-message-entity-number (cdar wl-summary-delayed-update))) (wl-summary-insert-message (cdar wl-summary-delayed-update) @@ -1008,18 +1076,9 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'." "folder mode")) (defun wl-summary-set-message-modified () - (elmo-folder-set-message-modified - wl-summary-buffer-elmo-folder t) - (setq wl-summary-buffer-message-modified t) - (wl-summary-set-mark-modified)) + (setq wl-summary-buffer-message-modified t)) (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)) -(defun wl-summary-mark-modified-p () - (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 () @@ -1046,7 +1105,6 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'." ;; save the current summary buffer view. (if (and wl-summary-cache-use (or (wl-summary-message-modified-p) - (wl-summary-mark-modified-p) (wl-summary-thread-modified-p))) (wl-summary-save-view-cache)))) @@ -1119,6 +1177,7 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'." wl-folder-buffer-cur-point (goto-char wl-folder-buffer-cur-point)) (setq wl-folder-buffer-cur-path nil) + (setq wl-folder-buffer-last-visited-entity-id wl-folder-buffer-cur-entity-id) (setq wl-folder-buffer-cur-entity-id nil) (wl-delete-all-overlays) (if wl-summary-exit-next-move @@ -1170,7 +1229,8 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'." nil wl-use-scoring))) (wl-summary-rescan nil - (string-match "noscore" range)) + (string-match "noscore" range) + (string-match "thread" range)) (and msg (wl-summary-jump-to-msg msg)))) ((string= range "mark") (let ((msg (wl-summary-message-number))) @@ -1180,8 +1240,9 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'." (let ((msg (wl-summary-message-number))) (wl-summary-resume-cache-status) (and msg (wl-summary-jump-to-msg msg)))) - ((or (string-match "last:" range) - (string-match "first:" range)) + ((string= range "no-sync")) + ((or (string-match "^last:" range) + (string-match "^first:" range)) (wl-summary-goto-folder-subr (concat "/" range "/" (elmo-folder-name-internal folder)) @@ -1332,53 +1393,67 @@ If ARG is non-nil, checking is omitted." (null wl-prefetch-threshold) (< size wl-prefetch-threshold)))) mark new-mark) - (unwind-protect - (progn - (when (and (or arg (not file-cached)) - size (not force-read) wl-prefetch-confirm) - (setq force-read - (save-restriction - (widen) - (y-or-n-p - (format - "Message from %s has %d bytes. Prefetch it? " - (concat - "[ " - (save-match-data - (wl-set-string-width - 17 - (funcall wl-summary-from-function - (eword-decode-string - (elmo-delete-char - ?\" - (or - (elmo-message-field - wl-summary-buffer-elmo-folder - number 'from) - "??")))))) " ]") - size)))) - (message "")) ; flush. - (if force-read - (save-excursion - (save-match-data - ;; online - (if (or arg (not file-cached)) - (elmo-message-encache - wl-summary-buffer-elmo-folder - number)) - (elmo-message-set-cached wl-summary-buffer-elmo-folder - number t) - (when (and (wl-summary-jump-to-msg number) - (wl-summary-update-persistent-mark)) - (sit-for 0) - (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)))) - t) - nil)))))) + (ignore-errors + (when (and (or arg (not file-cached)) + size (not force-read) wl-prefetch-confirm) + (let ((wl-message-entity (elmo-message-entity + wl-summary-buffer-elmo-folder + number))) + (setq force-read + (save-restriction + (widen) + (y-or-n-p + (format + "Message from %s has %d bytes. Prefetch it? " + (concat + "[ " + (save-match-data + (wl-set-string-width + 17 + (funcall + wl-summary-from-function + (elmo-delete-char + ?\" + (or + (elmo-message-entity-field + wl-message-entity + 'from t) + "??"))))) + " ]") + size)))) + (message ""))) ; flush. + (if force-read + (save-excursion + (save-match-data + ;; online + (if (or arg (not file-cached)) + (elmo-message-encache + wl-summary-buffer-elmo-folder + number)) + (elmo-message-set-cached wl-summary-buffer-elmo-folder + number t) + (when (and (wl-summary-jump-to-msg number) + (wl-summary-update-persistent-mark)) + (sit-for 0) + (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)))) + t) + nil))))) + +(defsubst wl-summary-narrow-to-region (beg end) + (narrow-to-region + (save-excursion + (goto-char beg) + (beginning-of-line) + (point)) + (save-excursion + (goto-char end) + (if (eq (current-column) 0) (beginning-of-line) (end-of-line)) + (point)))) (defun wl-summary-prefetch-region-no-mark (beg end &optional prefetch-marks) (interactive "r") @@ -1390,7 +1465,7 @@ If ARG is non-nil, checking is omitted." (save-excursion (setq start-pos (point)) (save-restriction - (narrow-to-region beg end) + (wl-summary-narrow-to-region beg end) ;; collect prefetch targets. (message "Collecting marks...") (goto-char (point-min)) @@ -1446,7 +1521,7 @@ If ARG is non-nil, checking is omitted." (interactive "r") (save-excursion (save-restriction - (narrow-to-region beg end) + (wl-summary-narrow-to-region beg end) (goto-char (point-min)) (if (eq wl-summary-buffer-view 'thread) (let (number-list) @@ -1471,7 +1546,7 @@ If ARG is non-nil, checking is omitted." (interactive "r") (save-excursion (save-restriction - (narrow-to-region beg end) + (wl-summary-narrow-to-region beg end) (goto-char (point-min)) (if (eq wl-summary-buffer-view 'thread) (let (number-list) @@ -1492,15 +1567,14 @@ If ARG is non-nil, checking is omitted." (forward-line 1)) (wl-summary-mark-as-unread number-list)))))) -(defun wl-summary-mark-as-important-region (beg end) +(defun wl-summary-set-flags-region (beg end) (interactive "r") (save-excursion (save-restriction - (narrow-to-region beg end);(save-excursion (goto-char end) - ; (end-of-line) (point))) + (wl-summary-narrow-to-region beg end) (goto-char (point-min)) - (if (eq wl-summary-buffer-view 'thread) - (progn + (let (flags) + (if (eq wl-summary-buffer-view 'thread) (while (not (eobp)) (let* ((number (wl-summary-message-number)) (entity (wl-thread-get-entity number)) @@ -1508,18 +1582,47 @@ If ARG is non-nil, checking is omitted." (if (wl-thread-entity-get-opened entity) ;; opened...mark line. ;; Crossposts are not processed - (wl-summary-mark-as-important) + (setq flags (wl-summary-set-flags-internal + number + flags)) ;; closed - (wl-summary-mark-as-important) ; mark itself. - (setq children - (delq number (wl-thread-get-children-msgs number))) - (while children - (wl-summary-mark-as-important (car children)) - (setq children (cdr children)))) - (forward-line 1)))) - (while (not (eobp)) - (wl-summary-mark-as-important) - (forward-line 1))))) + (setq flags (wl-summary-set-flags-internal + (wl-thread-get-children-msgs number) + flags))) + (forward-line 1))) + (while (not (eobp)) + (setq flags (wl-summary-set-flags-internal + (wl-summary-message-number) flags)) + (forward-line 1)))))) + (wl-summary-count-unread) + (wl-summary-update-modeline)) + +(defun wl-summary-mark-as-answered-region (beg end) + (interactive "r") + (save-excursion + (save-restriction + (wl-summary-narrow-to-region beg end) + (goto-char (point-min)) + (let ((inverse (elmo-message-flagged-p wl-summary-buffer-elmo-folder + (wl-summary-message-number) + 'answered))) + (if (eq wl-summary-buffer-view 'thread) + (while (not (eobp)) + (let* ((number (wl-summary-message-number)) + (entity (wl-thread-get-entity number)) + children) + (if (wl-thread-entity-get-opened entity) + ;; opened...mark line. + ;; Crossposts are not processed + (wl-summary-mark-as-answered-internal inverse) + ;; closed + (wl-summary-mark-as-answered-internal + inverse + (wl-thread-get-children-msgs number))) + (forward-line 1))) + (while (not (eobp)) + (wl-summary-mark-as-answered-internal inverse) + (forward-line 1)))))) (wl-summary-count-unread) (wl-summary-update-modeline)) @@ -1530,9 +1633,10 @@ If ARG is non-nil, checking is omitted." (let ((folder wl-summary-buffer-elmo-folder) (cur-buf (current-buffer))) (message "Setting all msgs as read...") - (elmo-folder-mark-as-read folder - (elmo-folder-list-unreads - folder)) + (elmo-folder-set-flag + folder + (elmo-folder-list-flagged folder 'unread 'in-msgdb) + 'read) (save-excursion (goto-char (point-min)) (while (not (eobp)) @@ -1617,21 +1721,35 @@ If ARG is non-nil, checking is omitted." ;;(message (concat deleting-info "done")) (wl-summary-count-unread) (wl-summary-update-modeline) - (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)))))) + (wl-summary-folder-info-update)))) -(defun wl-summary-update-status-marks () +(defun wl-summary-update-status-marks (beg end &optional check) "Synchronize status marks on current buffer to the msgdb." - (interactive) + (interactive "r") (save-excursion - (goto-char (point-min)) - (while (not (eobp)) - (wl-summary-update-persistent-mark) + (goto-char beg) + (while (and (< (point) end) (not (eobp))) + (when (or (not check) + (let ((number (wl-summary-message-number))) + (when (memq number wl-summary-buffer-unsync-mark-number-list) + (setq wl-summary-buffer-unsync-mark-number-list + (delq number + wl-summary-buffer-unsync-mark-number-list)) + t))) + (wl-summary-update-persistent-mark)) (forward-line 1)))) +(defun wl-summary-update-mark-window (&optional win beg) + "Update persistent mark in visible summary window. +This function is defined for `window-scroll-functions'" + (with-current-buffer (window-buffer win) + (when (eq major-mode 'wl-summary-mode) + (let ((start (window-start win)) + (end (condition-case nil + (window-end win t) ; old emacsen doesn't support 2nd arg. + (error (window-end win))))) + (wl-summary-update-status-marks start end 'check))))) + (defun wl-summary-insert-message (&rest args) (if (eq wl-summary-buffer-view 'thread) (apply 'wl-summary-insert-thread args) @@ -1650,70 +1768,65 @@ If ARG is non-nil, checking is omitted." (defun wl-summary-sync-marks () "Update persistent marks in summary." (interactive) - (let ((last-progress 0) - (folder wl-summary-buffer-elmo-folder) - (i 0) - answereds importants unreads diff diffs - mes progress) + (let ((mes "Updated ") + diff diffs) ;; synchronize marks. (when (not (eq (elmo-folder-type-internal wl-summary-buffer-elmo-folder) 'internal)) + (message "Updating marks...") - (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) - answereds (elmo-folder-list-answereds - wl-summary-buffer-elmo-folder)) - (setq diff (elmo-list-diff importants - (elmo-folder-list-flagged + (dolist (flag elmo-global-flag-list) + (unless (memq flag '(answered cached new unread)) + (setq diff (elmo-list-diff (elmo-folder-list-flagged + wl-summary-buffer-elmo-folder + flag) + (elmo-folder-list-flagged + wl-summary-buffer-elmo-folder + flag 'in-msgdb))) + (setq diffs (cadr diff)) ; deletes + (setq mes (concat mes (format "-%d" (length diffs)))) + (while diffs + (wl-summary-remove-flags-internal (car diffs) + (list flag) 'no-server) + (setq diffs (cdr diffs))) + (setq diffs (car diff)) ; appends + (setq mes (concat mes (format "/+%d %s," (length diffs) flag))) + (while diffs + (wl-summary-add-flags-internal (car diffs) + (list flag) 'no-server) + (setq diffs (cdr diffs))))) + + (setq diff (elmo-list-diff (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 - (wl-summary-mark-as-important (car diffs) - elmo-msgdb-important-mark - 'no-server) - (setq diffs (cdr diffs))) - (setq diffs (car diff)) ; important-appends - (setq mes (concat mes (format "/+%d) important," (length diffs)))) - (while diffs - (wl-summary-mark-as-important (car diffs) " " 'no-server) - (setq diffs (cdr diffs))) - - (setq diff (elmo-list-diff answereds + 'answered) (elmo-folder-list-flagged wl-summary-buffer-elmo-folder 'answered 'in-msgdb))) (setq diffs (cadr diff)) - (setq mes (concat mes (format "(-%d" (length diffs)))) + (setq mes (concat mes (format "-%d" (length diffs)))) (while diffs (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)))) + (setq mes (concat mes (format "/+%d answered," (length diffs)))) (while diffs (wl-summary-mark-as-answered (car diffs) 'no-modeline) (setq diffs (cdr diffs))) - (setq diff (elmo-list-diff unreads + (setq diff (elmo-list-diff (elmo-folder-list-flagged + wl-summary-buffer-elmo-folder + 'unread) (elmo-folder-list-flagged wl-summary-buffer-elmo-folder 'unread 'in-msgdb))) (setq diffs (cadr diff)) - (setq mes (concat mes (format "(-%d" (length diffs)))) + (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)))) + (setq mes (concat mes (format "/+%d unread." (length diffs)))) (while diffs (wl-summary-mark-as-unread (car diffs) 'no-folder 'no-modeline) (setq diffs (cdr diffs))) @@ -1763,7 +1876,13 @@ If ARG is non-nil, checking is omitted." (when delete-list (wl-summary-delete-messages-on-buffer delete-list)) - (wl-summary-update-status-marks) + (unless wl-summary-lazy-update-mark + (wl-summary-update-status-marks (point-min) (point-max))) + (when (and wl-summary-lazy-highlight + wl-summary-lazy-update-mark) + (let (buffer-read-only) + (put-text-property (point-min) (point-max) 'face nil)) + (run-hooks 'wl-summary-buffer-window-scroll-functions)) (setq num (length append-list)) (setq i 0) (setq wl-summary-delayed-update nil) @@ -1778,7 +1897,7 @@ If ARG is non-nil, checking is omitted." (if elmo-use-database (elmo-database-msgid-put (car entity) (elmo-folder-name-internal folder) - (elmo-msgdb-overview-entity-get-number entity))) + (elmo-message-entity-number entity))) (when (> num elmo-display-progress-threshold) (setq i (+ i 1)) (if (or (zerop (% i 5)) (= i num)) @@ -1792,7 +1911,7 @@ If ARG is non-nil, checking is omitted." (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 + (elmo-message-entity-number (cdar wl-summary-delayed-update))) (when (setq update-thread (wl-summary-insert-message @@ -1874,7 +1993,6 @@ If ARG is non-nil, checking is omitted." wl-summary-partial-highlight-above-lines wl-summary-highlight-partial-threshold))) (wl-highlight-summary (point) (point-max)))))) - (setq wl-summary-buffer-msgdb (elmo-folder-msgdb folder)) (wl-delete-all-overlays) (set-buffer-modified-p nil) (if mes (message "%s" mes))))) @@ -1954,8 +2072,8 @@ If ARG is non-nil, checking is omitted." (length dels))) (progn (message "Deleting...") - (elmo-folder-delete-messages wl-summary-buffer-elmo-folder dels) - (elmo-folder-detach-messages wl-summary-buffer-elmo-folder dels) + (elmo-folder-move-messages wl-summary-buffer-elmo-folder dels + 'null) (wl-summary-set-message-modified) (wl-folder-set-folder-updated (wl-summary-buffer-folder-name) (list 0 0 0)) @@ -1986,7 +2104,7 @@ If ARG, without confirm." (setq wl-summary-buffer-view 'thread)) (wl-summary-update-modeline) (force-mode-line-update) - (wl-summary-rescan))) + (wl-summary-rescan nil nil t))) (defun wl-summary-load-file-object (filename) "Load lisp object from dir." @@ -2067,7 +2185,7 @@ If ARG, without confirm." wl-summary-buffer-message-modified wl-summary-buffer-thread-modified wl-summary-buffer-number-list - wl-summary-buffer-msgdb + wl-summary-buffer-unsync-mark-number-list wl-summary-buffer-folder-name wl-summary-buffer-line-formatter) (and (eq wl-summary-buffer-view 'thread) @@ -2133,11 +2251,8 @@ If ARG, without confirm." (defun wl-summary-auto-select-msg-p (unread-msg) (and unread-msg - (not (string= - (elmo-message-mark - wl-summary-buffer-elmo-folder - unread-msg) - elmo-msgdb-important-mark)))) + (not (elmo-message-has-global-flag-p + wl-summary-buffer-elmo-folder unread-msg)))) (defsubst wl-summary-open-folder (folder) ;; Select folder @@ -2145,7 +2260,6 @@ If ARG, without confirm." (unwind-protect (elmo-folder-open folder 'load-msgdb) ;; For compatibility - (setq wl-summary-buffer-msgdb (elmo-folder-msgdb folder)) (setq wl-summary-buffer-folder-name (elmo-folder-name-internal folder))))) @@ -2220,17 +2334,21 @@ If ARG, without confirm." (elmo-folder-name-internal folder)) wl-summary-default-view))) (wl-thread-resume-entity folder) - (wl-summary-open-folder folder)) + (wl-summary-open-folder folder) + (wl-summary-detect-mark-position)) (setq wl-summary-buffer-view (wl-summary-load-file-object (expand-file-name wl-summary-view-file (elmo-folder-msgdb-path folder)))) (wl-summary-open-folder folder) + (wl-summary-detect-mark-position) (wl-summary-rescan)) (wl-summary-count-unread) (wl-summary-update-modeline))) (unless (eq wl-summary-buffer-view 'thread) (wl-summary-make-number-list)) + (setq wl-summary-buffer-unsync-mark-number-list + (copy-sequence wl-summary-buffer-number-list)) (when (and wl-summary-cache-use (or (and wl-summary-check-line-format (wl-summary-line-format-changed-p)) @@ -2273,15 +2391,15 @@ If ARG, without confirm." (cond ((and wl-auto-select-first (wl-summary-auto-select-msg-p unreadp)) ;; wl-auto-select-first is non-nil and - ;; unreadp is non-nil but not important + ;; unreadp is non-nil but not flagged (setq retval 'disp-msg)) ((and wl-auto-prefetch-first (wl-summary-auto-select-msg-p unreadp)) ;; wl-auto-select-first is non-nil and - ;; unreadp is non-nil but not important + ;; unreadp is non-nil but not flagged (setq retval 'prefetch-msg)) ((not (wl-summary-auto-select-msg-p unreadp)) - ;; unreadp is nil or important + ;; unreadp is nil or flagged (setq retval 'more-next)))) (goto-char (point-max)) (if (elmo-folder-plugged-p folder) @@ -2324,7 +2442,7 @@ If ARG, without confirm." ;; entity-id is unknown. (wl-folder-set-current-entity-id (wl-folder-get-entity-id entity))) - (when (and wl-summary-lazy-highlight + (when (and wl-summary-buffer-window-scroll-functions wl-on-xemacs) (sit-for 0)) (unwind-protect @@ -2373,19 +2491,23 @@ If ARG, without confirm." (run-hooks 'wl-summary-line-inserted-hook))) (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-message-mark - folder - (elmo-message-entity-number - entity)))) - (setq wl-summary-buffer-number-list - (wl-append wl-summary-buffer-number-list - (list (elmo-message-entity-number entity)))) - nil)) + (when entity + (let ((inhibit-read-only t) + (number (elmo-message-entity-number entity)) + buffer-read-only) + (goto-char (point-max)) + (wl-summary-insert-line + (wl-summary-create-line entity nil nil + (elmo-message-flags + wl-summary-buffer-elmo-folder + number) + (elmo-message-cached-p + wl-summary-buffer-elmo-folder + number))) + (setq wl-summary-buffer-number-list + (wl-append wl-summary-buffer-number-list + (list (elmo-message-entity-number entity)))) + nil))) (defun wl-summary-default-subject-filter (subject) (setq subject (elmo-replace-in-string subject "[ \t]*\\(re\\|was\\)[:>]" "")) @@ -2406,7 +2528,7 @@ If ARG, without confirm." wl-summary-alike-hashtb))) (defun wl-summary-insert-headers (folder func mime-decode) - (let ((numbers (elmo-folder-list-messages folder nil t)) + (let ((numbers (elmo-folder-list-messages folder 'visible t)) ov this last alike) (buffer-disable-undo (current-buffer)) (make-local-variable 'wl-summary-alike-hashtb) @@ -2437,7 +2559,7 @@ If ARG, without confirm." (let ((summary-buf (current-buffer)) (buf (get-buffer-create wl-summary-search-buf-name)) (folder-name (wl-summary-buffer-folder-name)) - match founds cur result) + match founds result) (with-current-buffer buf (let ((case-fold-search t)) (when (or (not (string= wl-summary-search-buf-folder-name folder-name)) @@ -2488,27 +2610,37 @@ If ARG, without confirm." (defun wl-summary-insert-thread (entity folder update &optional force-insert) (let ((depth 0) - this-id parent-entity parent-number relatives anumber - cur number cur-entity linked retval delayed-entity - update-list entity-stack) + this-id parent-entity parent-number + number cur-entity linked retval delayed-entity + update-list entity-stack thread-entity) (while entity (setq this-id (elmo-message-entity-field entity 'message-id) - parent-entity - (elmo-message-entity-parent folder entity) - parent-number (elmo-message-entity-number parent-entity)) - (setq number (elmo-message-entity-number entity)) - (setq cur entity) + number (elmo-message-entity-number entity)) + (if (and wl-thread-saved-entity-hashtb-internal + (setq thread-entity + (elmo-get-hash-val + (format "#%d" (elmo-message-entity-number entity)) + wl-thread-saved-entity-hashtb-internal))) + (setq parent-entity + (elmo-message-entity + folder + (wl-thread-entity-get-parent thread-entity)) + linked (wl-thread-entity-get-linked thread-entity)) + (setq parent-entity (elmo-message-entity-parent folder entity) + linked nil)) + (setq parent-number (and parent-entity + (elmo-message-entity-number parent-entity))) ;; If thread loop detected, set parent as nil. - (while cur - (setq anumber - (elmo-message-entity-number - (setq cur (elmo-message-entity-parent folder cur)))) - (if (memq anumber relatives) - (setq parent-number nil - cur nil)) - (setq relatives (cons - (elmo-message-entity-number cur) - relatives))) + (let ((cur entity) + anumber relatives) + (while cur + (when (setq anumber + (elmo-message-entity-number + (setq cur (elmo-message-entity-parent folder cur)))) + (if (memq anumber relatives) + (setq parent-number nil + cur nil)) + (setq relatives (cons anumber relatives))))) (if (and parent-number (not (wl-thread-get-entity parent-number)) (not force-insert)) @@ -2522,7 +2654,7 @@ If ARG, without confirm." wl-summary-search-parent-by-subject-regexp (string-match wl-summary-search-parent-by-subject-regexp - (elmo-msgdb-overview-entity-get-subject entity))) + (elmo-message-entity-field entity 'subject))) (let ((found (wl-summary-search-by-subject entity folder))) (when (and found (not (member found wl-summary-delayed-update))) @@ -2558,11 +2690,11 @@ If ARG, without confirm." (defun wl-summary-update-thread (entity thr-entity parent-entity) - (let* ((this-id (elmo-msgdb-overview-entity-get-id entity)) + (let* ((this-id (elmo-message-entity-field entity 'message-id)) (overview-entity entity) - (parent-id (elmo-msgdb-overview-entity-get-id parent-entity)) - (number (elmo-msgdb-overview-entity-get-number entity)) - (parent-number (elmo-msgdb-overview-entity-get-number parent-entity)) + (parent-id (elmo-message-entity-field parent-entity 'message-id)) + (number (elmo-message-entity-number entity)) + (parent-number (elmo-message-entity-number parent-entity)) insert-line) (cond ((or (not parent-id) @@ -2581,7 +2713,8 @@ If ARG, without confirm." entity parent-entity nil - (elmo-message-mark wl-summary-buffer-elmo-folder number) + (elmo-message-flags wl-summary-buffer-elmo-folder number) + (elmo-message-cached-p 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))))))) @@ -2664,9 +2797,9 @@ If ARG, exit virtual folder." (setq wl-summary-buffer-target-mark-list nil) (setq wl-summary-buffer-temp-mark-list nil)))) -(defsubst wl-summary-temp-mark () +(defsubst wl-summary-temp-mark (&optional number) "Return temp-mark string of current line." - (let ((number (wl-summary-message-number)) + (let ((number (or number (wl-summary-message-number))) info) (or (and (wl-summary-have-target-mark-p number) "*") @@ -2675,11 +2808,50 @@ If ARG, exit virtual folder." (wl-summary-get-score-mark number) " "))) -(defsubst wl-summary-persistent-mark () +(defsubst wl-summary-persistent-mark-string (folder flags cached) + "Return the persistent mark string. +The mark is decided according to the FOLDER, FLAGS and CACHED." + (let ((priorities wl-summary-persistent-mark-priority-list) + mark) + (while (and (null mark) priorities) + (if (and (eq (car priorities) 'flag) + (elmo-get-global-flags flags 'ignore-preserved)) + (setq mark wl-summary-flag-mark) + (when (memq (car priorities) flags) + (setq mark + (or (case (car priorities) + (new + (if cached + wl-summary-new-cached-mark + wl-summary-new-uncached-mark)) + (answered + (if cached + wl-summary-answered-cached-mark + wl-summary-answered-uncached-mark)) + (unread + (if cached + wl-summary-unread-cached-mark + wl-summary-unread-uncached-mark))))))) + (setq priorities (cdr priorities))) + (or mark + (if (or cached (elmo-folder-local-p folder)) + nil + wl-summary-read-uncached-mark)))) + +(defsubst wl-summary-message-mark (folder number &optional flags) + "Return mark of the message." + (ignore-errors + (wl-summary-persistent-mark-string + folder + (or flags (setq flags (elmo-message-flags folder number))) + (memq 'cached flags) ; XXX for speed-up. + ))) + +(defsubst wl-summary-persistent-mark (&optional number flags) "Return persistent-mark string of current line." - (or (ignore-errors - (elmo-message-mark wl-summary-buffer-elmo-folder - (wl-summary-message-number))) + (or (wl-summary-message-mark wl-summary-buffer-elmo-folder + (or number (wl-summary-message-number)) + flags) " ")) (defun wl-summary-put-temp-mark (mark) @@ -2721,11 +2893,10 @@ If ARG, exit virtual folder." (goto-char (point-min)) (let ((inhibit-read-only t) (buffer-read-only nil) - wl-summary-buffer-disp-msg - (mlist wl-summary-buffer-temp-mark-list)) - (dolist (number mlist) - (wl-summary-unset-mark number)) - (wl-summary-mark-as-read mlist)))) + wl-summary-buffer-disp-msg) + (wl-summary-mark-as-read wl-summary-buffer-target-mark-list) + (dolist (number wl-summary-buffer-target-mark-list) + (wl-summary-unset-mark number))))) (defun wl-summary-target-mark-mark-as-unread () (interactive) @@ -2733,23 +2904,22 @@ If ARG, exit virtual folder." (goto-char (point-min)) (let ((inhibit-read-only t) (buffer-read-only nil) - wl-summary-buffer-disp-msg - (mlist wl-summary-buffer-target-mark-list)) - (dolist (number mlist) - (wl-summary-unset-mark number)) - (wl-summary-mark-as-unread mlist)))) + wl-summary-buffer-disp-msg) + (wl-summary-mark-as-unread wl-summary-buffer-target-mark-list) + (dolist (number wl-summary-buffer-target-mark-list) + (wl-summary-unset-mark number))))) -(defun wl-summary-target-mark-mark-as-important () +(defun wl-summary-target-mark-set-flags () (interactive) (save-excursion (goto-char (point-min)) (let ((inhibit-read-only t) (buffer-read-only nil) wl-summary-buffer-disp-msg - (mlist wl-summary-buffer-target-mark-list)) - (dolist (number mlist) + flags) + (dolist (number wl-summary-buffer-target-mark-list) (wl-summary-unset-mark number) - (wl-summary-mark-as-important number)) + (setq flags (wl-summary-set-flags-internal number flags))) (wl-summary-count-unread) (wl-summary-update-modeline)))) @@ -2770,23 +2940,22 @@ If ARG, exit virtual folder." (interactive) (wl-summary-pick wl-summary-buffer-target-mark-list 'delete)) -(defun wl-summary-update-persistent-mark () +(defun wl-summary-update-persistent-mark (&optional number flags) "Synch up persistent mark of current line with msgdb's. Return non-nil if the mark is updated" - (if wl-summary-buffer-persistent-mark-column - (save-excursion - (move-to-column wl-summary-buffer-persistent-mark-column) - (let ((inhibit-read-only t) - (buffer-read-only nil) - (mark (buffer-substring (- (point) 1) (point))) - (new-mark (wl-summary-persistent-mark))) - (unless (string= new-mark mark) - (delete-backward-char 1) - (insert new-mark) - (when wl-summary-highlight - (wl-highlight-summary-current-line)) - (set-buffer-modified-p nil) - t))) + (prog1 + (when wl-summary-buffer-persistent-mark-column + (save-excursion + (move-to-column wl-summary-buffer-persistent-mark-column) + (let ((inhibit-read-only t) + (buffer-read-only nil) + (mark (buffer-substring (- (point) 1) (point))) + (new-mark (wl-summary-persistent-mark number flags))) + (unless (string= new-mark mark) + (delete-backward-char 1) + (insert new-mark) + (wl-summary-set-message-modified) + t)))) (when wl-summary-highlight (wl-highlight-summary-current-line)) (set-buffer-modified-p nil))) @@ -2801,10 +2970,10 @@ Return non-nil if the mark is updated" number-list visible) (setq number-list (cond ((numberp number-or-numbers) (setq unread-message - (member (elmo-message-mark - folder - number-or-numbers) - (elmo-msgdb-unread-marks))) + (elmo-message-flagged-p + folder + number-or-numbers + 'unread)) (list number-or-numbers)) ((and (not (null number-or-numbers)) (listp number-or-numbers)) @@ -2812,14 +2981,16 @@ Return non-nil if the mark is updated" ((setq number (wl-summary-message-number)) ;; interactive (setq unread-message - (member (elmo-message-mark folder number) - (elmo-msgdb-unread-marks))) + (elmo-message-flagged-p + folder + number + 'unread)) (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)) + (elmo-folder-unset-flag folder number-list 'read no-folder-mark) + (elmo-folder-set-flag folder number-list 'read no-folder-mark)) (dolist (number number-list) (setq visible (wl-summary-jump-to-msg number)) (unless inverse @@ -2830,7 +3001,6 @@ Return non-nil if the mark is updated" (wl-summary-update-persistent-mark))) (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 @@ -2857,6 +3027,7 @@ Return non-nil if the mark is updated" no-modeline-update)) (defsubst wl-summary-mark-as-answered-internal (inverse + &optional number-or-numbers no-modeline-update) (save-excursion @@ -2873,8 +3044,8 @@ Return non-nil if the mark is updated" (if (null number-list) (message "No message.") (if inverse - (elmo-folder-unmark-answered folder number-list) - (elmo-folder-mark-as-answered folder number-list)) + (elmo-folder-unset-flag folder number-list 'answered) + (elmo-folder-set-flag folder number-list 'answered)) (dolist (number number-list) (setq visible (wl-summary-jump-to-msg number)) ;; set mark on buffer @@ -2882,7 +3053,7 @@ Return non-nil if the mark is updated" (wl-summary-update-persistent-mark))) (unless no-modeline-update ;; Update unread numbers. - ;; should elmo-folder-mark-as-read return unread numbers? + ;; should elmo-flag-mark-as-read return unread numbers? (wl-summary-count-unread) (wl-summary-update-modeline) (wl-folder-update-unread @@ -2895,75 +3066,139 @@ Return non-nil if the mark is updated" (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))) + (elmo-message-flagged-p wl-summary-buffer-elmo-folder + (wl-summary-message-number) + 'answered)) number-or-numbers no-modeline-update)) (defun wl-summary-mark-as-unanswered (&optional number-or-numbers - no-modeline-update) + 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 - no-server-update) - (interactive) - (if (eq (elmo-folder-type-internal wl-summary-buffer-elmo-folder) - 'internal) - (error "Cannot process mark in this folder")) +(defun wl-summary-decide-flag (folder number) + (let ((flags (elmo-get-global-flags (elmo-message-flags + folder number))) + (completion-ignore-case t) + new-flags) + (setq new-flags + (delq nil + (mapcar + (lambda (flag) + (and (> (length flag) 0) + (intern (downcase flag)))) + (wl-completing-read-multiple + "Flags: " + (mapcar (lambda (flag) + (list (capitalize (symbol-name flag)))) + elmo-global-flag-list) + nil nil (mapconcat (lambda (flag) + (capitalize (symbol-name flag))) + (or flags '(important)) + ","))))) + (dolist (flag new-flags) + (unless (memq flag elmo-global-flag-list) + (if (y-or-n-p (format "Flag `%s' does not exist yet. Create?" + (capitalize (symbol-name flag)))) + (setq elmo-global-flag-list (append + elmo-global-flag-list + (list flag))) + (error "Stopped")))) + new-flags)) + +(defsubst wl-summary-set-flags-internal (&optional + number-or-numbers + flags + local + remove-all) (save-excursion - (let* (eol - (folder wl-summary-buffer-elmo-folder) - message-id visible cur-mark) - (cond (number - (setq visible (wl-summary-jump-to-msg number)) - (setq cur-mark (or mark - (elmo-message-mark - wl-summary-buffer-elmo-folder number) - " "))) - ((setq number (wl-summary-message-number)) - (setq visible t) - (setq cur-mark (or mark (wl-summary-persistent-mark)))) - (t - (error "No message"))) - (when (or visible - ;; already exists in msgdb. - (elmo-message-entity wl-summary-buffer-elmo-folder - number)) - (setq message-id (elmo-message-field - wl-summary-buffer-elmo-folder - number - 'message-id)) - (if (string= cur-mark elmo-msgdb-important-mark) - (progn - ;; server side mark - (save-match-data - (elmo-folder-unmark-important folder (list number) - no-server-update) - (unless no-server-update - (elmo-msgdb-global-mark-delete message-id)) - ;; Remove cache if local folder. - (if (and (elmo-folder-local-p folder) - (not (eq 'mark - (elmo-folder-type-internal folder)))) - (elmo-file-cache-delete - (elmo-file-cache-get-path message-id))))) - ;; server side mark - (elmo-folder-mark-as-important folder (list number) - no-server-update) - (if (eq (elmo-file-cache-exists-p message-id) 'entire) - (elmo-folder-mark-as-read folder (list number)) - ;; Force cache message. - (elmo-message-encache folder number 'read)) - (unless no-server-update - (elmo-msgdb-global-mark-set message-id - elmo-msgdb-important-mark)))) - (when visible - (wl-summary-update-persistent-mark)))) - number) + (let ((folder wl-summary-buffer-elmo-folder) + number number-list visible) + (setq number-list (cond ((numberp number-or-numbers) + (list number-or-numbers)) + ((and (not (null number-or-numbers)) + (listp number-or-numbers)) + number-or-numbers) + ((setq number (wl-summary-message-number)) + ;; interactive + (list number)))) + (if remove-all + (setq flags nil) + (unless flags + (setq flags (wl-summary-decide-flag folder (car number-list))))) + (if (null number-list) + (message "No message.") + (dolist (number number-list) + (elmo-message-set-global-flags folder number flags local) + (setq visible (wl-summary-jump-to-msg number)) + ;; set mark on buffer + (when visible + (wl-summary-update-persistent-mark)))) + flags))) + +(defsubst wl-summary-add-flags-internal (&optional + number-or-numbers + flags + local) + (save-excursion + (let ((folder wl-summary-buffer-elmo-folder) + set-flags msg number-list visible) + (setq number-list (cond ((numberp number-or-numbers) + (list number-or-numbers)) + ((and (not (null number-or-numbers)) + (listp number-or-numbers)) + number-or-numbers) + ((setq msg (wl-summary-message-number)) + ;; interactive + (list msg)))) + (if (null number-list) + (message "No message.") + (dolist (number number-list) + (setq set-flags + (elmo-get-global-flags + (elmo-message-flags folder number))) + (setq set-flags (nconc flags set-flags)) + (elmo-message-set-global-flags folder number set-flags local) + (setq visible (wl-summary-jump-to-msg number)) + ;; set mark on buffer + (when visible + (wl-summary-update-persistent-mark))))))) + +(defsubst wl-summary-remove-flags-internal (&optional + number-or-numbers + flags + local) + (save-excursion + (let ((folder wl-summary-buffer-elmo-folder) + set-flags msg number-list visible) + (setq number-list (cond ((numberp number-or-numbers) + (list number-or-numbers)) + ((and (not (null number-or-numbers)) + (listp number-or-numbers)) + number-or-numbers) + ((setq msg (wl-summary-message-number)) + ;; interactive + (list msg)))) + (if (null number-list) + (message "No message.") + (dolist (number number-list) + (setq set-flags (elmo-get-global-flags + (elmo-message-flags folder number))) + (dolist (flag flags) + (setq set-flags (delq flag set-flags))) + (elmo-message-set-global-flags folder number set-flags local) + (setq visible (wl-summary-jump-to-msg number)) + ;; set mark on buffer + (when visible + (wl-summary-update-persistent-mark))))))) + +(defun wl-summary-set-flags (&optional remove) + (interactive "P") + (if (eq 'flag (elmo-folder-type-internal wl-summary-buffer-elmo-folder)) + (error "Cannot process flags in this folder")) + (wl-summary-set-flags-internal nil nil nil remove)) ;;; Summary line. (defvar wl-summary-line-formatter nil) @@ -2999,7 +3234,7 @@ Return non-nil if the mark is updated" (wl-set-string-width (- wl-summary-buffer-number-column) (number-to-string - (elmo-msgdb-overview-entity-get-number wl-message-entity)))) + (elmo-message-entity-number wl-message-entity)))) (defun wl-summary-line-year () (aref wl-datevec 0)) @@ -3019,7 +3254,7 @@ Return non-nil if the mark is updated" (format "%02d" (aref wl-datevec 4))) (defun wl-summary-line-size () - (let ((size (elmo-msgdb-overview-entity-get-size wl-message-entity))) + (let ((size (elmo-message-entity-field wl-message-entity 'size))) (if size (cond ((<= 1 (/ size 1048576)) @@ -3035,11 +3270,13 @@ Return non-nil if the mark is updated" (setq no-parent t)) ; no parent (setq subject (elmo-delete-char ?\n - (or (elmo-msgdb-overview-entity-get-subject - wl-message-entity) + (or (elmo-message-entity-field + wl-message-entity + 'subject t) wl-summary-no-subject-message))) (setq parent-raw-subject - (elmo-msgdb-overview-entity-get-subject wl-parent-message-entity)) + (elmo-message-entity-field wl-parent-message-entity + 'subject t)) (setq parent-subject (if parent-raw-subject (elmo-delete-char ?\n parent-raw-subject))) @@ -3053,8 +3290,9 @@ Return non-nil if the mark is updated" (defun wl-summary-line-from () (elmo-delete-char ?\n (funcall wl-summary-from-function - (elmo-msgdb-overview-entity-get-from - wl-message-entity)))) + (elmo-message-entity-field + wl-message-entity + 'from t)))) (defun wl-summary-line-list-info () (let ((list-info (wl-summary-get-list-info wl-message-entity))) @@ -3070,29 +3308,42 @@ Return non-nil if the mark is updated" ""))) (defun wl-summary-line-attached () - (let ((content-type (elmo-msgdb-overview-entity-get-extra-field - wl-message-entity "content-type")) + (let ((content-type (elmo-message-entity-field + wl-message-entity 'content-type)) (case-fold-search t)) (if (and content-type (string-match "multipart/mixed" content-type)) "@" ""))) +;;; For future use. +;;(defun wl-summary-line-cached () +;; (if (elmo-message-cached-p wl-summary-buffer-elmo-folder +;; (elmo-message-entity-number wl-message-entity)) +;; " " +;; "u")) + (defun wl-summary-create-line (wl-message-entity wl-parent-message-entity wl-temp-mark - wl-persistent-mark + wl-flags + wl-cached &optional wl-thr-children-number wl-thr-indent-string wl-thr-linked) "Create a summary line." (let ((wl-mime-charset wl-summary-buffer-mime-charset) + (wl-persistent-mark (wl-summary-persistent-mark-string + wl-summary-buffer-elmo-folder + wl-flags + wl-cached)) (elmo-mime-charset wl-summary-buffer-mime-charset) (elmo-lang wl-summary-buffer-weekday-name-lang) (wl-datevec (or (ignore-errors (timezone-fix-time - (elmo-msgdb-overview-entity-get-date - wl-message-entity) + (elmo-message-entity-field + wl-message-entity + 'date) nil wl-summary-fix-timezone)) (make-vector 5 0))) @@ -3113,13 +3364,15 @@ Return non-nil if the mark is updated" (setq line (concat line "\r" (number-to-string - (elmo-msgdb-overview-entity-get-number + (elmo-message-entity-number wl-message-entity)))) (if wl-summary-highlight - (wl-highlight-summary-line-string line - wl-persistent-mark - wl-temp-mark - wl-thr-indent-string)) + (wl-highlight-summary-line-string + (elmo-message-entity-number wl-message-entity) + line + wl-flags + wl-temp-mark + wl-thr-indent-string)) line)) (defsubst wl-summary-proc-wday (wday-str year month mday) @@ -3132,10 +3385,10 @@ Return non-nil if the mark is updated" '((new . ((t . nil) (p . new) (p . unread) - (p . important))) + (p . digest))) (unread . ((t . nil) (p . unread) - (p . important))))) + (p . digest))))) (defsubst wl-summary-next-message (num direction hereto) (if wl-summary-buffer-next-message-function @@ -3156,7 +3409,7 @@ Return non-nil if the mark is updated" (if (setq flagged-list (elmo-folder-list-flagged wl-summary-buffer-elmo-folder - (cdr (car cur-spec)))) + (cdr (car cur-spec)) t)) (while nums (if (and (memq (car nums) flagged-list) (elmo-message-accessible-p @@ -3186,7 +3439,7 @@ Return non-nil if the mark is updated" (wl-thread-jump-to-msg num)) t))) ;; -;; Goto unread or important +;; Goto unread or global flag message ;; returns t if next message exists in this folder. (defun wl-summary-cursor-down (&optional hereto) (interactive "P") @@ -3207,52 +3460,54 @@ Return non-nil if the mark is updated" (tmp-buffer (get-buffer-create " *wl-summary-save-view-cache*")) (temp-column wl-summary-buffer-temp-mark-column) (charset wl-summary-buffer-mime-charset)) - (if (file-directory-p dir) - (); ok. - (if (file-exists-p dir) - (error "File %s already exists" dir) - (elmo-make-directory dir))) - (if (eq save-view 'thread) - (wl-thread-save-entity dir)) - (when wl-summary-check-line-format - (wl-summary-line-format-save)) - (unwind-protect - (progn - (when (file-writable-p cache) - (copy-to-buffer tmp-buffer (point-min) (point-max)) - (with-current-buffer tmp-buffer - (widen) - (make-local-variable 'wl-summary-highlight) - (setq wl-summary-highlight nil - wl-summary-buffer-target-mark-list mark-list - wl-summary-buffer-temp-mark-list temp-list - wl-summary-buffer-temp-mark-column temp-column) - (wl-summary-delete-all-temp-marks 'no-msg 'force) - (encode-coding-region - (point-min) (point-max) - (or (and wl-on-mule - ;; one in mcs-ltn1(apel<10.4) cannot take 2 arg. - (mime-charset-to-coding-system charset 'LF)) - ;; Mule 2 doesn't have `*ctext*unix'. - (mime-charset-to-coding-system charset))) - (write-region-as-binary (point-min)(point-max) - cache nil 'no-msg))) - (when (file-writable-p view) ; 'thread or 'sequence - (save-excursion - (set-buffer tmp-buffer) - (erase-buffer) - (prin1 save-view tmp-buffer) - (princ "\n" tmp-buffer) - (write-region (point-min) (point-max) view nil 'no-msg)))) - ;; kill tmp buffer. - (kill-buffer tmp-buffer))))) + (when dir + (if (file-directory-p dir) + (); ok. + (if (file-exists-p dir) + (error "File %s already exists" dir) + (elmo-make-directory dir))) + (if (eq save-view 'thread) + (wl-thread-save-entity dir)) + (when wl-summary-check-line-format + (wl-summary-line-format-save)) + (unwind-protect + (progn + (when (file-writable-p cache) + (copy-to-buffer tmp-buffer (point-min) (point-max)) + (with-current-buffer tmp-buffer + (widen) + (make-local-variable 'wl-summary-highlight) + (setq wl-summary-highlight nil + wl-summary-buffer-target-mark-list mark-list + wl-summary-buffer-temp-mark-list temp-list + wl-summary-buffer-temp-mark-column temp-column) + (wl-summary-delete-all-temp-marks 'no-msg 'force) + (encode-coding-region + (point-min) (point-max) + (or (and wl-on-mule + ;; one in mcs-ltn1(apel<10.4) cannot take 2 arg. + (mime-charset-to-coding-system charset 'LF)) + ;; Mule 2 doesn't have `*ctext*unix'. + (mime-charset-to-coding-system charset))) + (write-region-as-binary (point-min)(point-max) + cache nil 'no-msg))) + (when (file-writable-p view) ; 'thread or 'sequence + (save-excursion + (set-buffer tmp-buffer) + (erase-buffer) + (prin1 save-view tmp-buffer) + (princ "\n" tmp-buffer) + (write-region (point-min) (point-max) view nil 'no-msg)))) + ;; kill tmp buffer. + (kill-buffer tmp-buffer)))))) (defsubst wl-summary-get-sync-range (folder) (intern (or (and (elmo-folder-plugged-p folder) (wl-get-assoc-list-value wl-folder-sync-range-alist - (elmo-folder-name-internal folder))) + (elmo-folder-name-internal folder) + 'function)) wl-default-sync-range))) ;; redefined for wl-summary-sync-update @@ -3266,13 +3521,15 @@ Return non-nil if the mark is updated" "mark" "rescan" "rescan-noscore" + "rescan-thread" "update" "update-entirely" "all" "all-entirely")) (default (or (wl-get-assoc-list-value wl-folder-sync-range-alist - folder) + folder + 'function) wl-default-sync-range)) range) (setq range @@ -3415,8 +3672,7 @@ Return non-nil if the mark is updated" (run-hooks 'wl-summary-toggle-disp-off-hook)) ;;; (switch-to-buffer cur-buf) ))) - (when wl-summary-lazy-highlight - (wl-highlight-summary-window)))) + (run-hooks 'wl-summary-buffer-window-scroll-functions))) (defun wl-summary-next-line-content () "Show next line of the message." @@ -3744,11 +4000,10 @@ Reply to author if invoked with ARG." mes-buf) (when number (save-excursion - (wl-summary-redisplay-internal folder number)) + (wl-summary-set-message-buffer-or-redisplay)) (setq mes-buf wl-message-buffer) (wl-message-select-buffer wl-message-buffer) (set-buffer mes-buf) - (goto-char (point-min)) (condition-case err (when (setq mes-buf (wl-message-get-original-buffer)) (wl-draft-reply mes-buf arg summary-buf number) @@ -3758,7 +4013,7 @@ Reply to author if invoked with ARG." (error (set-window-configuration winconf) (signal (car err)(cdr err)))) (with-current-buffer summary-buf - (elmo-folder-mark-as-answered folder (list number)) + (elmo-folder-set-flag folder (list number) 'answered) (wl-summary-update-persistent-mark)) t))) @@ -3832,7 +4087,9 @@ Use function list is `wl-summary-write-current-folder-functions'." (save-excursion (set-buffer summary-buf) (setq subject - (or (elmo-message-field folder number 'subject) "")))) + (or (elmo-message-entity-field + (elmo-message-entity folder number) 'subject 'decode) + "")))) (set-buffer mes-buf) (wl-draft-forward subject summary-buf) (unless without-setup-hook @@ -3860,13 +4117,7 @@ Use function list is `wl-summary-write-current-folder-functions'." (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) - () - (setq skip-pmark-regexp - (wl-regexp-opt (list " " - elmo-msgdb-unread-cached-mark - elmo-msgdb-important-mark)))) + goto-next next-entity finfo) (beginning-of-line) (while (and skip (not (if downward (eobp) (bobp)))) @@ -3874,13 +4125,10 @@ Use function list is `wl-summary-write-current-folder-functions'." (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)))))))) + (wl-summary-temp-mark)) + (not (elmo-message-accessible-p + wl-summary-buffer-elmo-folder + (wl-summary-message-number)))))) (if (if downward (eobp) (and (bobp) skip)) (setq goto-next t)) (if (or (eobp) (and (bobp) skip)) (goto-char start)) @@ -4064,9 +4312,9 @@ Use function list is `wl-summary-write-current-folder-functions'." (when (elmo-message-use-cache-p folder num) (elmo-message-set-cached folder num t)) (ignore-errors - (if (member (elmo-message-mark wl-summary-buffer-elmo-folder - num) - (elmo-msgdb-unread-marks)) + (if (elmo-message-flagged-p wl-summary-buffer-elmo-folder + num + 'unread) (wl-summary-mark-as-read num no-folder-mark) (wl-summary-update-persistent-mark))) (setq wl-summary-buffer-current-msg num) @@ -4107,8 +4355,7 @@ If ASK-CODING is non-nil, coding-system for the message is asked." (string= (elmo-folder-name-internal fld) wl-draft-folder)) (ignore-errors - (if (member (elmo-message-mark fld num) - (elmo-msgdb-unread-marks)) + (if (elmo-message-flagged-p fld num 'unread) (wl-summary-mark-as-read num); no-folder-mark) (wl-summary-update-persistent-mark))) (setq wl-summary-buffer-current-msg num) @@ -4253,7 +4500,8 @@ If ASK-CODING is non-nil, coding-system for the message is asked." (if num (save-excursion (setq filename (expand-file-name - (int-to-string num) + (concat (int-to-string num) + wl-summary-save-file-suffix) wl-save-dir)) (if (null (and arg (null (file-exists-p filename)))) @@ -4273,7 +4521,7 @@ If ASK-CODING is non-nil, coding-system for the message is asked." (interactive "r") (save-excursion (save-restriction - (narrow-to-region beg end) + (wl-summary-narrow-to-region beg end) (goto-char (point-min)) (let ((wl-save-dir (wl-read-directory-name "Save to directory: " @@ -4368,14 +4616,14 @@ If ASK-CODING is non-nil, coding-system for the message is asked." (wl-summary-message-number)))) (wl-ps-subject (and entity - (or (elmo-msgdb-overview-entity-get-subject entity) + (or (elmo-message-entity-field entity 'subject t) ""))) (wl-ps-from (and entity - (or (elmo-msgdb-overview-entity-get-from entity) ""))) + (or (elmo-message-entity-field entity 'from t) ""))) (wl-ps-date (and entity - (or (elmo-msgdb-overview-entity-get-date entity) "")))) + (or (elmo-message-entity-field entity 'date) "")))) (run-hooks 'wl-ps-preprint-hook) (set-buffer wl-message-buffer) (copy-to-buffer buffer (point-min) (point-max)) @@ -4425,7 +4673,7 @@ If ASK-CODING is non-nil, coding-system for the message is asked." (interactive "P") (elmo-folder-pack-numbers wl-summary-buffer-elmo-folder) (let (wl-use-scoring) - (wl-summary-rescan))) + (wl-summary-rescan nil nil t))) (defun wl-summary-target-mark-uudecode () (interactive) @@ -4561,6 +4809,21 @@ If ASK-CODING is non-nil, coding-system for the message is asked." (setq wl-summary-buffer-saved-message nil))) (message "There's no saved message."))) +(defun wl-summary-toggle-header-narrowing () + "Toggle message header narrowing." + (interactive) + (when wl-message-use-header-narrowing + (save-selected-window + (let* ((mbuf wl-message-buffer) + (mwin (when mbuf (get-buffer-window mbuf))) + (wpos (when mwin (window-start mwin)))) + (when mbuf + (set-buffer mbuf) + (wl-message-header-narrowing-toggle) + (and wpos (set-window-start mwin wpos))))))) + +(autoload 'elmo-folder-list-global-flag-messages "elmo-flag") + (require 'product) (product-provide (provide 'wl-summary) (require 'wl-version))