(defvar wl-summary-buffer-current-msg nil)
(defvar wl-summary-buffer-unread-count 0)
(defvar wl-summary-buffer-new-count 0)
-(defvar wl-summary-buffer-answered-count 0)
(defvar wl-summary-buffer-mime-charset nil)
(defvar wl-summary-buffer-weekday-name-lang nil)
(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)
(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-answered-count)
(make-variable-buffer-local 'wl-summary-buffer-mime-charset)
(make-variable-buffer-local 'wl-summary-buffer-weekday-name-lang)
(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)
(defvar wl-temp-mark)
(defvar wl-persistent-mark)
+;; internal functions (dummy)
+(unless (fboundp 'wl-summary-append-message-func-internal)
+ (defun wl-summary-append-message-func-internal (entity msgdb update
+ &optional force-insert)))
+
(defmacro wl-summary-sticky-buffer-name (name)
(` (concat wl-summary-buffer-name ":" (, name))))
(wl-summary-redisplay)))
(defun wl-summary-count-unread ()
- (let ((lst (elmo-msgdb-count-marks (wl-summary-buffer-msgdb))))
+ (let ((pair
+ (elmo-msgdb-count-marks (wl-summary-buffer-msgdb)
+ wl-summary-new-mark
+ (list wl-summary-unread-uncached-mark
+ wl-summary-unread-cached-mark))))
(if (eq major-mode 'wl-summary-mode)
- (setq wl-summary-buffer-new-count (car lst)
- wl-summary-buffer-unread-count (nth 1 lst)
- wl-summary-buffer-answered-count (nth 2 lst)))
- lst))
+ (setq wl-summary-buffer-new-count (car pair)
+ wl-summary-buffer-unread-count (cdr pair)))
+ pair))
(defun wl-summary-message-string (&optional use-cache)
"Return full body string of current message.
(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))
(inhibit-read-only t)
(buffer-read-only nil)
expunged)
+ (fset 'wl-summary-append-message-func-internal
+ (wl-summary-get-append-message-func))
(erase-buffer)
(message "Re-scanning...")
(setq i 0)
(elmo-kill-buffer wl-summary-search-buf-name)
(while curp
(setq entity (car curp))
- (wl-summary-insert-message entity msgdb nil)
+ (wl-summary-append-message-func-internal entity msgdb nil)
(setq curp (cdr curp))
(when (> num elmo-display-progress-threshold)
(setq i (+ i 1))
(caar wl-summary-delayed-update)
(elmo-msgdb-overview-entity-get-number
(cdar wl-summary-delayed-update)))
- (wl-summary-insert-message
+ (wl-summary-append-message-func-internal
(cdar wl-summary-delayed-update) msgdb nil t)
(setq wl-summary-delayed-update (cdr wl-summary-delayed-update))))
(message "Constructing summary structure...done")
(progn
(message "Inserting thread...")
(wl-thread-insert-top)
- (message "Inserting thread...done")))
+ (message "Inserting thread...done"))
+ (wl-summary-make-number-list))
(when wl-use-scoring
(setq wl-summary-scored nil)
(wl-summary-score-headers nil msgdb
wl-summary-buffer-message-modified)
(defun wl-summary-set-mark-modified ()
(elmo-folder-set-mark-modified-internal
- wl-summary-buffer-elmo-folder t))
+ wl-summary-buffer-elmo-folder t)
+ (setq wl-summary-buffer-mark-modified t))
(defun wl-summary-mark-modified-p ()
- (elmo-folder-mark-modified-internal
- wl-summary-buffer-elmo-folder))
+ wl-summary-buffer-mark-modified)
(defun wl-summary-set-thread-modified ()
(setq wl-summary-buffer-thread-modified t))
(defun wl-summary-thread-modified-p ()
(elmo-folder-commit wl-summary-buffer-elmo-folder)
(elmo-folder-check wl-summary-buffer-elmo-folder)
(if wl-use-scoring (wl-score-save))
- (if (interactive-p) (message "Saving summary status...done.")))
+ (if (interactive-p) (message "Saving summary status...done")))
(defun wl-summary-force-exit ()
"Exit current summary. Buffer is deleted even the buffer is sticky."
(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)))
"??")))))) " ]")
size))))
(message "")) ; flush.
- (setq mark (or (elmo-msgdb-get-mark msgdb number) " "))
+ (setq mark (elmo-msgdb-get-mark msgdb 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
- (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))))
+ (cond
+ ((string= mark
+ wl-summary-unread-uncached-mark)
+ wl-summary-unread-cached-mark)
+ ((string= mark wl-summary-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))
+ wl-summary-unread-cached-mark)
+ ((string= mark wl-summary-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)))
new-mark)))))))
+;;(defvar wl-summary-message-uncached-marks
+;; (list wl-summary-new-mark
+;; wl-summary-unread-uncached-mark
+;; wl-summary-read-uncached-mark))
+
(defun wl-summary-prefetch-region (beg end &optional prefetch-marks)
(interactive "r")
(let ((count 0)
(wl-summary-prefetch))
(wl-summary-prefetch-msg (car targets))))
(if (if prefetch-marks
- (string= mark elmo-msgdb-unread-cached-mark)
- (or (string= mark elmo-msgdb-unread-cached-mark)
+ (string= mark wl-summary-unread-cached-mark)
+ (or (string= mark wl-summary-unread-cached-mark)
(string= mark " ")))
(message "Prefetching... %d/%d message(s)"
(setq count (+ 1 count)) length))
(inhibit-read-only t)
(buffer-read-only nil)
(case-fold-search nil)
- msg mark new-mark)
+ msg mark)
(message "Setting all msgs as read...")
(elmo-folder-mark-as-read folder
(elmo-folder-list-unreads
- folder))
+ folder
+ (list wl-summary-unread-cached-mark
+ wl-summary-unread-uncached-mark
+ wl-summary-new-mark)))
(save-excursion
(goto-char (point-min))
(while (not (eobp))
- (setq msg (wl-summary-message-number)
- mark (wl-summary-persistent-mark)
- new-mark (or (elmo-message-mark folder msg) " "))
- (unless (string= mark new-mark)
+ (setq msg (wl-summary-message-number))
+ (setq mark (wl-summary-persistent-mark))
+ (when (and (not (string= mark " "))
+ (not (string= mark wl-summary-important-mark))
+ (not (string= mark wl-summary-read-uncached-mark)))
(delete-backward-char 1)
- ;; New mark and unread-uncached mark
- (insert new-mark)
+ (if (or (not (elmo-message-use-cache-p folder msg))
+ (string= mark wl-summary-unread-cached-mark))
+ (progn
+ (insert " ")
+ (elmo-msgdb-set-mark msgdb msg nil))
+ ;; New mark and unread-uncached mark
+ (insert wl-summary-read-uncached-mark)
+ (elmo-msgdb-set-mark
+ msgdb msg wl-summary-read-uncached-mark))
(if wl-summary-highlight
(wl-highlight-summary-current-line nil nil t)))
(forward-line 1)))
+ (elmo-folder-replace-marks
+ folder
+ (list (cons wl-summary-unread-cached-mark
+ nil)
+ (cons wl-summary-unread-uncached-mark
+ wl-summary-read-uncached-mark)
+ (cons wl-summary-new-mark
+ wl-summary-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)
(msgdb (wl-summary-buffer-msgdb))
(number-alist (elmo-msgdb-get-number-alist msgdb))
(case-fold-search nil)
- 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)
+ mark number unread new-mark)
+ (setq mark (wl-summary-persistent-mark))
+ (cond
+ ((or (string= mark wl-summary-new-mark)
+ (string= mark wl-summary-unread-uncached-mark)
+ (string= mark wl-summary-important-mark))
+ ;; noop
+ )
+ ((string= mark wl-summary-unread-cached-mark)
+ (setq new-mark wl-summary-unread-uncached-mark))
+ (t
+ (setq new-mark wl-summary-read-uncached-mark)))
+ (when new-mark
+ (setq number (wl-summary-message-number))
(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))
(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)
- (buffer-read-only nil)
- (case-fold-search nil)
- number msgid set-mark mark)
+ (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)
(message "Resuming cache status...")
(save-excursion
(goto-char (point-min))
(while (not (eobp))
- (setq number (wl-summary-message-number))
+ (setq msg (wl-summary-message-number))
(setq mark (wl-summary-persistent-mark))
- (setq msgid (elmo-message-field folder number 'message-id))
+ (setq msgid (elmo-msgdb-get-field msgdb msg 'message-id))
(setq set-mark nil)
(if (elmo-file-cache-exists-p msgid)
- (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) " "))))
+ (if (or
+ (string= mark wl-summary-unread-uncached-mark) ; U -> !
+ (string= mark wl-summary-new-mark) ; N -> !
+ )
+ (setq set-mark wl-summary-unread-cached-mark)
+ (if (string= mark wl-summary-read-uncached-mark) ; u -> ' '
+ (setq set-mark " ")))
+ (if (string= mark " ")
+ (setq set-mark wl-summary-read-uncached-mark) ;' ' -> u
+ (if (string= mark wl-summary-unread-cached-mark)
+ (setq set-mark wl-summary-unread-uncached-mark) ; ! -> U
+ )))
(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")
(wl-highlight-summary-current-line)))
(forward-line 1)))))
-(defun wl-summary-update-status-marks ()
- "Synchronize status marks on current buffer to the msgdb."
- (interactive)
- (save-excursion
- (goto-char (point-min))
- (let ((inhibit-read-only t)
- (buffer-read-only nil)
- mark)
- (while (not (eobp))
- (unless (string= (wl-summary-persistent-mark)
- (setq mark (or (elmo-message-mark
- wl-summary-buffer-elmo-folder
- (wl-summary-message-number))
- " ")))
- (delete-backward-char 1)
- (insert mark)
- (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
(error "Trash Folder is not created"))))
wl-trash-folder)))))
-(defun wl-summary-insert-message (&rest args)
+(defun wl-summary-get-append-message-func ()
(if (eq wl-summary-buffer-view 'thread)
- (apply 'wl-summary-insert-thread-entity args)
- (apply 'wl-summary-insert-sequential args)))
+ 'wl-summary-insert-thread-entity
+ 'wl-summary-insert-sequential))
(defun wl-summary-sort ()
(interactive)
"Update marks in summary."
(interactive)
(let ((last-progress 0)
- (folder wl-summary-buffer-elmo-folder)
(i 0)
- importants unreads
+ unread-marks importants unreads
importants-in-db unreads-in-db diff diffs
mes progress)
;; synchronize marks.
wl-summary-buffer-elmo-folder)
'internal))
(message "Updating marks...")
- (setq importants-in-db (elmo-folder-list-messages-mark-match
+ (setq unread-marks (list wl-summary-unread-cached-mark
+ wl-summary-unread-uncached-mark
+ wl-summary-new-mark)
+ importants-in-db (elmo-folder-list-messages-mark-match
wl-summary-buffer-elmo-folder
- (regexp-quote elmo-msgdb-important-mark))
+ (regexp-quote wl-summary-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-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)))
+ (wl-regexp-opt unread-marks))
+ importants (elmo-folder-list-importants
+ wl-summary-buffer-elmo-folder
+ wl-summary-important-mark)
unreads (elmo-folder-list-unreads
- wl-summary-buffer-elmo-folder))
+ wl-summary-buffer-elmo-folder
+ unread-marks))
(setq diff (elmo-list-diff importants importants-in-db))
(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
+ wl-summary-important-mark
'no-server)
(setq diffs (cdr diffs)))
(setq diffs (car diff)) ; important-appends
(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)
+ (wl-summary-mark-as-read (car diffs) 'no-folder)
(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-folder 'no-modeline)
+ (wl-summary-mark-as-unread (car diffs) 'no-server 'no-modeline)
(setq diffs (cdr diffs)))
(if (interactive-p) (message mes)))))
(buffer-read-only nil)
gc-message
overview number-alist
- curp num i diff
+ curp num i new-msgdb
append-list delete-list crossed
update-thread update-top-list
- expunged mes entity)
+ expunged mes sync-result entity)
(unwind-protect
(progn
(unless wl-summary-buffer-elmo-folder
(error "(Internal error) Folder is not set:%s" (buffer-name
(current-buffer))))
+ (fset 'wl-summary-append-message-func-internal
+ (wl-summary-get-append-message-func))
;; Flush pending append operations (disconnected operation).
;;(setq seen-list
;;(wl-summary-flush-pending-append-operations seen-list))
(goto-char (point-max))
(wl-folder-confirm-existence folder (elmo-folder-plugged-p folder))
- (setq crossed (elmo-folder-synchronize folder sync-all no-check))
- (if crossed
+ (setq sync-result (elmo-folder-synchronize
+ folder
+ wl-summary-new-mark
+ wl-summary-unread-uncached-mark
+ wl-summary-unread-cached-mark
+ wl-summary-read-uncached-mark
+ wl-summary-important-mark
+ sync-all no-check))
+ (setq new-msgdb (nth 0 sync-result))
+ (setq delete-list (nth 1 sync-result))
+ (setq crossed (nth 2 sync-result))
+ (if sync-result
(progn
;; Setup sync-all
(if sync-all (wl-summary-sync-all-init))
; (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
- 'in-msgdb)
- wl-summary-buffer-number-list))
- (setq append-list (car diff))
- (setq delete-list (cadr diff))
-
(when delete-list
- (wl-summary-delete-messages-on-buffer
- delete-list "Deleting...")
+ (wl-summary-delete-messages-on-buffer delete-list "Deleting...")
(message "Deleting...done"))
- (wl-summary-update-status-marks)
+ (when new-msgdb
+ (wl-summary-replace-status-marks
+ wl-summary-new-mark
+ wl-summary-unread-uncached-mark))
+ (setq append-list (elmo-msgdb-get-overview new-msgdb))
(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 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 entity (car curp))
(when (setq update-thread
- (wl-summary-insert-message
+ (wl-summary-append-message-func-internal
entity (elmo-folder-msgdb folder)
(not sync-all)))
(wl-append update-top-list update-thread))
(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...")
+ 'wl-summary-sync-update "Updating thread..."
(/ (* i 100) num)))))
(when wl-summary-delayed-update
(while wl-summary-delayed-update
(elmo-msgdb-overview-entity-get-number
(cdar wl-summary-delayed-update)))
(when (setq update-thread
- (wl-summary-insert-message
+ (wl-summary-append-message-func-internal
(cdar wl-summary-delayed-update)
(elmo-folder-msgdb folder)
(not sync-all) t))
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")))
+ (message "Updating thread...done"))
+ (unless (eq wl-summary-buffer-view 'thread)
+ (wl-summary-make-number-list))
(wl-summary-set-message-modified)
+ (wl-summary-set-mark-modified)
(when (and sync-all (eq wl-summary-buffer-view 'thread))
(elmo-kill-buffer wl-summary-search-buf-name)
- (message "Inserting message...")
+ (message "Inserting thread...")
(wl-thread-insert-top)
- (message "Inserting message...done"))
+ (message "Inserting thread...done"))
(if elmo-use-database
(elmo-database-close))
(run-hooks 'wl-summary-sync-updated-hook)
(length delete-list) num))))
(setq mes "Quit updating.")))
;; synchronize marks.
- (if (and crossed wl-summary-auto-sync-marks)
+ (if (and wl-summary-auto-sync-marks sync-result)
(wl-summary-sync-marks))
;; scoring
(when wl-use-scoring
(wl-folder-set-folder-updated
(elmo-folder-name-internal folder)
(list 0
- (let ((lst (wl-summary-count-unread)))
- (+ (car lst) (nth 1 lst)))
+ (let ((pair (wl-summary-count-unread)))
+ (+ (car pair) (cdr pair)))
(elmo-folder-messages folder)))
(wl-summary-update-modeline)
;;
dels)
;;; (elmo-msgdb-save (wl-summary-buffer-folder-name) nil)
(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.
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
(get-buffer-create wl-summary-buffer-name))))
(defun wl-summary-make-number-list ()
- (save-excursion
- (goto-char (point-min))
- (while (not (eobp))
- (setq wl-summary-buffer-number-list
- (cons (wl-summary-message-number)
- wl-summary-buffer-number-list))
- (forward-line 1))
- (setq wl-summary-buffer-number-list
- (nreverse wl-summary-buffer-number-list))))
+ (setq wl-summary-buffer-number-list
+ (mapcar
+ (lambda (x) (elmo-msgdb-overview-entity-get-number x))
+ (elmo-msgdb-get-overview (wl-summary-buffer-msgdb)))))
(defun wl-summary-auto-select-msg-p (unread-msg)
(and unread-msg
(elmo-msgdb-get-mark
(wl-summary-buffer-msgdb)
unread-msg)
- elmo-msgdb-important-mark))))
+ wl-summary-important-mark))))
(defsubst wl-summary-open-folder (folder)
;; Select folder
(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))
(elmo-msgdb-get-mark
msgdb
(elmo-msgdb-overview-entity-get-number
- entity))))
- (setq wl-summary-buffer-number-list
- (wl-append wl-summary-buffer-number-list
- (list (elmo-msgdb-overview-entity-get-number entity))))
- nil))
+ entity))))))
(defun wl-summary-default-subject-filter (subject)
(let ((case-fold-search t))
wl-summary-alike-hashtb)))
(defun wl-summary-insert-headers (overview func mime-decode)
- (message "Creating subject cache...")
(let (ov this last alike)
(buffer-disable-undo (current-buffer))
(make-local-variable 'wl-summary-alike-hashtb)
(setq this (funcall func ov))
(and this (setq this (std11-unfold-string this)))
(if (equal last this)
- (wl-append alike (list ov))
+ (setq alike (cons ov alike))
(when last
(wl-summary-put-alike alike)
(insert last ?\n))
elmo-mime-charset)
(when (eq mime-decode 'mime)
(eword-decode-region (point-min) (point-max))))
- (message "Creating subject cache...done")
(run-hooks 'wl-summary-insert-headers-hook)))
(defun wl-summary-search-by-subject (entity overview)
(let ((summary-buf (current-buffer))
(buf (get-buffer-create wl-summary-search-buf-name))
(folder-name (wl-summary-buffer-folder-name))
- match founds found-entity)
+ match founds cur result)
(with-current-buffer buf
(let ((case-fold-search t))
(when (or (not (string= wl-summary-search-buf-folder-name folder-name))
(zerop (buffer-size)))
(setq wl-summary-search-buf-folder-name folder-name)
+ (message "Creating subject cache...")
(wl-summary-insert-headers
overview
(function
(lambda (x)
(funcall wl-summary-subject-filter-function
- (elmo-msgdb-overview-entity-get-subject-no-decode x))))
- t))
+ (elmo-msgdb-overview-entity-get-subject-no-decode x))))
+ t)
+ (message "Creating subject cache...done"))
(setq match (funcall wl-summary-subject-filter-function
(elmo-msgdb-overview-entity-get-subject entity)))
(if (string= match "")
(setq match "\n"))
- (goto-char (point-min))
- (while (and (not founds)
- (not (= (point) (point-max)))
- (search-forward match nil t))
+ (goto-char (point-max))
+ (while (and (null result)
+ (not (= (point) (point-min)))
+ (search-backward match nil t))
;; check exactly match
- (when (and (eolp)
- (= (point-at-bol)
- (match-beginning 0)))
- (setq found-entity (wl-summary-get-alike))
- (if (and found-entity
- ;; Is founded entity myself or children?
- (not (string=
- (elmo-msgdb-overview-entity-get-id entity)
- (elmo-msgdb-overview-entity-get-id
- (car found-entity))))
- (with-current-buffer summary-buf
+ (when (and (bolp) (= (point-at-eol)(match-end 0)))
+ (setq founds (wl-summary-get-alike))
+ (with-current-buffer summary-buf
+ (while founds
+ (when (and
+ ;; the first element of found-entity list exists on
+ ;; thread tree.
+ (wl-thread-get-entity
+ (elmo-msgdb-overview-entity-get-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))))
+ ;; not a descendant.
(not (wl-thread-descendant-p
(elmo-msgdb-overview-entity-get-number entity)
(elmo-msgdb-overview-entity-get-number
- (car found-entity))))))
- ;; return matching entity
- (setq founds found-entity))))
- (if founds
- (car founds))))))
+ (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)
(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-number (elmo-msgdb-overview-entity-get-number parent-entity))
+ insert-line)
(cond
((or (not parent-id)
(string= this-id parent-id))
(goto-char (point-max))
- (beginning-of-line))
+ (beginning-of-line)
+ (setq insert-line t))
;; parent already exists in buffer.
((wl-summary-jump-to-msg parent-number)
- (wl-thread-goto-bottom-of-sub-thread)))
- (let ((inhibit-read-only t)
- (buffer-read-only nil))
- (wl-summary-insert-line
- (wl-summary-create-line
- entity
- parent-entity
- nil
- (elmo-msgdb-get-mark (wl-summary-buffer-msgdb) number)
- (wl-thread-maybe-get-children-num number)
- (wl-thread-make-indent-string thr-entity)
- (wl-thread-entity-get-linked thr-entity))))))
+ (wl-thread-goto-bottom-of-sub-thread)
+ (setq insert-line t)))
+ (when insert-line
+ (let (buffer-read-only)
+ (wl-summary-insert-line
+ (wl-summary-create-line
+ entity
+ parent-entity
+ nil
+ (elmo-msgdb-get-mark (wl-summary-buffer-msgdb) 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-folder-mark
+ no-server-update
no-modeline-update)
(interactive)
(save-excursion
- (let ((buffer-read-only nil)
+ (let* (eol
+ (inhibit-read-only t)
+ (buffer-read-only nil)
(folder wl-summary-buffer-elmo-folder)
- mark new-mark visible)
- (setq visible (if number
- (wl-summary-jump-to-msg number)
- t)
- number (or number (wl-summary-message-number))
- mark (elmo-message-mark folder number))
- (unless (member mark (elmo-msgdb-unread-marks))
- (elmo-folder-unmark-read folder (list number) no-folder-mark))
- (setq new-mark (elmo-message-mark folder number))
- (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)))
+ (msgdb (wl-summary-buffer-msgdb))
+;;; (number-alist (elmo-msgdb-get-number-alist msgdb))
+ new-mark visible mark cur-mark)
+ (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
- (unless (string= (wl-summary-persistent-mark) 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)))
- number)))
+ (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 wl-summary-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
+ wl-summary-read-uncached-mark)
+ wl-summary-unread-uncached-mark
+ (if (elmo-message-use-cache-p folder number)
+ wl-summary-unread-mark
+ wl-summary-unread-uncached-mark))))
+ ;; server side mark
+ (unless no-server-update
+ (save-match-data
+ (unless (elmo-folder-unmark-read folder (list number))
+ (error "Setting mark failed"))))
+ (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'.
(while (not (eobp))
(when (string= (wl-summary-temp-mark) mark)
(setq msglist (cons (wl-summary-message-number) msglist)))
- (forward-line 1)))))))
+ (forward-line 1))
+ (nreverse msglist))))))
(defun wl-summary-exec ()
(interactive)
(defun wl-summary-exec-region (beg end)
(interactive "r")
- (message "Collecting marks ...")
+ (message "Collecting marks...")
(save-excursion
(goto-char beg)
(beginning-of-line)
(let ((del-fld (wl-summary-get-delete-folder
(wl-summary-buffer-folder-name)))
(start (point))
+ (unread-marks (list wl-summary-unread-cached-mark
+ wl-summary-unread-uncached-mark
+ wl-summary-new-mark))
(refiles (append moves dels))
(refile-failures 0)
(copy-failures 0)
refile-len
dst-msgs ; loop counter
result)
- (message "Executing ...")
+ (message "Executing...")
(while dels
(when (not (assq (car dels) wl-summary-buffer-refile-list))
(wl-append wl-summary-buffer-refile-list
(not (null (cdr dst-msgs)))
nil ; no-delete
nil ; same-number
+ unread-marks
t))
(error nil))
(if result ; succeeded.
(not (null (cdr dst-msgs)))
t ; t is no-delete (copy)
nil ; same number
+ unread-marks
t))
(error nil))
(if result ; succeeded.
;; end cOpy
(wl-summary-folder-info-update)
(wl-summary-set-message-modified)
+ (wl-summary-set-mark-modified)
(run-hooks 'wl-summary-exec-hook)
+ ;; message buffer is not up-to-date
(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))
+ (wl-summary-toggle-disp-msg 'off)
+ (setq wl-message-buffer nil))
(set-buffer-modified-p nil)
- (message (concat "Executing ... done"
+ (message (concat "Executing...done"
(if (> refile-failures 0)
(format " (%d refiling failed)" refile-failures)
"")
(setq c (+ c (char-width (following-char)))))
(and (> c len) (setq folder (concat " " folder)))
(setq rs (point))
- (put-text-property rs re 'invisible t)
+ (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)
(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)
+ (message "Prefetching... %d/%d message(s)" count length)
(set-buffer-modified-p nil))))
(defun wl-summary-target-mark-refile-subr (copy-or-refile)
(interactive)
(wl-summary-pick wl-summary-buffer-target-mark-list 'delete))
-(defun wl-summary-mark-as-read (&optional number
- no-folder-mark
- no-modeline-update)
+(defun wl-summary-mark-as-read (&optional number no-folder-mark)
(interactive)
(save-excursion
(let ((buffer-read-only nil)
(folder wl-summary-buffer-elmo-folder)
(msgdb (wl-summary-buffer-msgdb))
(case-fold-search nil)
- mark visible new-mark)
- (setq visible (if number
+ 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)
- number (or number (wl-summary-message-number))
- mark (elmo-message-mark folder number))
- (when (member mark (elmo-msgdb-unread-marks))
- ;; folder mark.
- (elmo-folder-mark-as-read folder (list number) no-folder-mark))
- (setq new-mark (elmo-message-mark folder number))
- (unless no-modeline-update
- ;; Update unread numbers.
- ;; should elmo-folder-mark-as-read return unread numbers?
- (wl-summary-count-unread)
+ mark (elmo-msgdb-get-mark msgdb number))
+ (cond
+ ((string= mark wl-summary-new-mark) ; N
+ (setq stat 'new))
+ ((string= mark wl-summary-unread-uncached-mark) ; U
+ (setq stat 'unread))
+ ((string= mark wl-summary-unread-cached-mark) ; !
+ (setq stat 'unread))
+ ((string= mark wl-summary-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))))
+ wl-summary-read-uncached-mark
+ nil))
+ ;; folder mark.
+ (unless no-folder-mark
+ (setq marked (elmo-folder-mark-as-read folder (list number))))
+ (when (or no-folder-mark marked)
+ (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)))
- ;; set mark on buffer
- (when visible
- (unless (string= (wl-summary-persistent-mark) new-mark)
- (delete-backward-char 1)
- (insert (or new-mark " ")))
+ 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 (member mark (elmo-msgdb-unread-marks))
+ (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
)))
wl-summary-buffer-elmo-folder
number
'message-id))
- (if (string= mark elmo-msgdb-important-mark)
+ (if (string= mark wl-summary-important-mark)
(progn
;; server side mark
(save-match-data
(elmo-folder-mark-as-important folder (list number))))
(when visible
(delete-backward-char 1)
- (insert elmo-msgdb-important-mark))
+ (insert wl-summary-important-mark))
(elmo-msgdb-set-mark msgdb number
- elmo-msgdb-important-mark)
+ wl-summary-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-important-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)
"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))
(t (format "%dB" size)))
"")))
-(defvar wl-summary-line-subject-minimum-length nil)
(defun wl-summary-line-subject ()
(let (no-parent subject parent-raw-subject parent-subject)
(if (string= wl-thr-indent-string "")
(setq parent-subject
(if parent-raw-subject
(elmo-delete-char ?\n parent-raw-subject)))
- (setq subject
- (if (or no-parent
- (null parent-subject)
- (not (wl-summary-subject-equal
- subject parent-subject)))
- (funcall wl-summary-subject-function subject)
- ""))
- (when (and wl-summary-line-subject-minimum-length
- (< (string-width subject)
- wl-summary-line-subject-minimum-length))
- (while (< (string-width subject)
- wl-summary-line-subject-minimum-length)
- (setq subject (concat subject " "))))
- (if (and (not wl-summary-width)
- wl-summary-subject-length-limit)
- (truncate-string subject
- wl-summary-subject-length-limit)
- subject)))
+ (if (or no-parent
+ (null parent-subject)
+ (not (wl-summary-subject-equal
+ subject parent-subject)))
+ (funcall wl-summary-subject-function subject)
+ "")))
(defun wl-summary-line-from ()
(elmo-delete-char ?\n
(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))
"")))
(defvar wl-summary-move-spec-plugged-alist
(` ((new . ((t . nil)
- (p . (, elmo-msgdb-new-mark))
+ (p . (, wl-summary-new-mark))
(p . (, (wl-regexp-opt
- (list elmo-msgdb-unread-uncached-mark
- elmo-msgdb-unread-cached-mark))))
- (p . (, (regexp-quote elmo-msgdb-important-mark)))))
+ (list wl-summary-unread-uncached-mark
+ wl-summary-unread-cached-mark))))
+ (p . (, (regexp-quote wl-summary-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))))))))
+ (list wl-summary-new-mark
+ wl-summary-unread-uncached-mark
+ wl-summary-unread-cached-mark))))
+ (p . (, (regexp-quote wl-summary-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)))))
+ (p . (, wl-summary-unread-cached-mark))
+ (p . (, (regexp-quote wl-summary-important-mark)))))
(unread . ((t . nil)
- (p . (, elmo-msgdb-unread-cached-mark))
- (p . (, (regexp-quote elmo-msgdb-important-mark))))))))
+ (p . (, wl-summary-unread-cached-mark))
+ (p . (, (regexp-quote wl-summary-important-mark))))))))
(defsubst wl-summary-next-message (num direction hereto)
(if wl-summary-buffer-next-message-function
(wl-summary-delete-all-temp-marks)
(encode-coding-region
(point-min) (point-max)
- (or (and wl-on-mule ; one in mcs-ltn1 cannot take 2 arg.
+ (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)))
()
(setq skip-pmark-regexp
(wl-regexp-opt (list " "
- elmo-msgdb-unread-cached-mark
- elmo-msgdb-important-mark))))
+ wl-summary-unread-cached-mark
+ wl-summary-important-mark))))
(while (and skip
(not (if downward (eobp) (bobp))))
(if downward
(if wl-summary-buffer-disp-msg
(wl-summary-redisplay))
(if interactive
- (if wl-summary-buffer-next-folder-function
- (funcall wl-summary-buffer-next-folder-function)
+ (cond
+ ((and (not downward) wl-summary-buffer-prev-folder-function)
+ (funcall wl-summary-buffer-prev-folder-function))
+ ((and downward wl-summary-buffer-next-folder-function)
+ (funcall wl-summary-buffer-next-folder-function))
+ (t
(when wl-auto-select-next
(setq next-entity
(if downward
'(lambda () (wl-summary-next-folder-or-exit next-entity))
(format
"No more messages. Type SPC to go to %s."
- (wl-summary-entity-info-msg next-entity finfo))))))))
+ (wl-summary-entity-info-msg next-entity finfo)))))))))
(defun wl-summary-prev (&optional interactive)
(interactive)
(num (or number (wl-summary-message-number)))
(wl-mime-charset wl-summary-buffer-mime-charset)
(default-mime-charset wl-summary-buffer-mime-charset)
- no-folder-mark fld-buf fld-win thr-entity)
+ 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))
- (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)))
- (if (elmo-message-use-cache-p folder num)
- (elmo-message-set-cached folder num t))
- (wl-summary-mark-as-read num no-folder-mark)
+ (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 wl-summary-buffer-current-msg num)
(when wl-summary-recenter
(recenter (/ (- (window-height) 2) 2))