X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=wl%2Fwl-summary.el;h=f719f8a390a8152105c38571b9eb783c7835e444;hb=6444631eeac4bef1933e27202080f62ac536aada;hp=e0c31befc1362dbf8b62e43c9b6f5fa6f72d4b0a;hpb=1a39e2ac1b4561a6a49930a89f6aee357cd1cb91;p=elisp%2Fwanderlust.git diff --git a/wl/wl-summary.el b/wl/wl-summary.el index e0c31be..f719f8a 100644 --- a/wl/wl-summary.el +++ b/wl/wl-summary.el @@ -111,7 +111,6 @@ (defvar wl-summary-buffer-mode-line nil) (defvar wl-summary-buffer-display-mime-mode 'mime) (defvar wl-summary-buffer-display-header-mode 'partial) -(defvar wl-summary-buffer-event-handler nil) (defvar wl-thread-indent-level-internal nil) (defvar wl-thread-have-younger-brother-str-internal nil) @@ -187,7 +186,6 @@ (make-variable-buffer-local 'wl-summary-buffer-mode-line) (make-variable-buffer-local 'wl-summary-buffer-display-mime-mode) (make-variable-buffer-local 'wl-summary-buffer-display-header-mode) -(make-variable-buffer-local 'wl-summary-buffer-event-handler) (defvar wl-datevec) (defvar wl-thr-indent-string) @@ -649,16 +647,9 @@ See also variable `wl-use-petname'." 'nomini frame)))) ;; Handler of event from elmo-folder -(eval-and-compile - (luna-define-class wl-summary-event-handler (elmo-event-handler) - (buffer)) - (luna-define-internal-accessors 'wl-summary-event-handler)) - -(luna-define-method elmo-event-handler-flag-changed ((handler - wl-summary-event-handler) - numbers) +(defun wl-summary-update-persistent-mark-on-event (buffer numbers) (save-excursion - (set-buffer (wl-summary-event-handler-buffer-internal handler)) + (set-buffer buffer) (if wl-summary-lazy-update-mark (let ((window-list (get-buffer-window-list (current-buffer) 'nomini t)) invalidate) @@ -686,38 +677,34 @@ See also variable `wl-use-petname'." (wl-summary-jump-to-msg number)) (wl-summary-update-persistent-mark number)))))) -(luna-define-method elmo-event-handler-cache-changed - ((handler wl-summary-event-handler) number) - (save-excursion - (set-buffer (wl-summary-event-handler-buffer-internal handler)) - (if wl-summary-lazy-update-mark - (let ((window-list (get-buffer-window-list (current-buffer) 'nomini t))) - (when (wl-summary-message-visible-p number) - (if (catch 'visible - (let ((window-list window-list) - win) - (while (setq win (car window-list)) - (when (wl-summary-jump-to-msg number - (window-start win) - (window-end win)) - (throw 'visible t)) - (setq window-list (cdr window-list))))) - (wl-summary-update-persistent-mark number) - (wl-summary-invalidate-persistent-mark) - (dolist (win window-list) - (wl-summary-validate-persistent-mark - (window-start win) - (window-end win)))))) - (when (and (wl-summary-message-visible-p number) - (wl-summary-jump-to-msg number)) - (wl-summary-update-persistent-mark number))))) +(defun wl-summary-buffer-attach () + (when wl-summary-buffer-elmo-folder + (elmo-connect-signal + wl-summary-buffer-elmo-folder + 'flag-changed + (current-buffer) + (elmo-define-signal-handler (buffer folder numbers) + (wl-summary-update-persistent-mark-on-event buffer numbers))) + (elmo-connect-signal + wl-summary-buffer-elmo-folder + 'cache-changed + (current-buffer) + (elmo-define-signal-handler (buffer folder number) + (wl-summary-update-persistent-mark-on-event buffer (list number)))) + (elmo-connect-signal + wl-summary-buffer-elmo-folder + 'update-overview + (current-buffer) + (elmo-define-signal-handler (buffer folder number) + (with-current-buffer buffer + (wl-summary-rescan-message number)))))) (defun wl-summary-buffer-detach () (when (and (eq major-mode 'wl-summary-mode) - wl-summary-buffer-elmo-folder - wl-summary-buffer-event-handler) - (elmo-folder-remove-handler wl-summary-buffer-elmo-folder - wl-summary-buffer-event-handler))) + wl-summary-buffer-elmo-folder) + (elmo-disconnect-signal 'flag-changed (current-buffer)) + (elmo-disconnect-signal 'cache-changed (current-buffer)) + (elmo-disconnect-signal 'update-overview (current-buffer)))) (defun wl-status-update () (interactive) @@ -900,11 +887,7 @@ you." (setq wl-summary-buffer-persistent (wl-folder-persistent-p (elmo-folder-name-internal folder))) (elmo-folder-set-persistent-internal folder wl-summary-buffer-persistent) - (elmo-folder-add-handler folder - (setq wl-summary-buffer-event-handler - (luna-make-entity - 'wl-summary-event-handler - :buffer (current-buffer)))) + (wl-summary-buffer-attach) ;; process duplicates. (elmo-folder-set-process-duplicates-internal folder (cdr (elmo-string-matched-assoc @@ -1169,6 +1152,49 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'." (forward-line -1) (set-buffer-modified-p nil))) +(defun wl-summary-rescan-message (number &optional reparent) + "Rescan current message without updating." + (interactive (list (wl-summary-message-number))) + (let ((start-number (wl-summary-message-number)) + (start-column (current-column))) + (when (wl-summary-jump-to-msg number) + (let* ((folder wl-summary-buffer-elmo-folder) + (entity (elmo-message-entity folder number)) + (inhibit-read-only t)) + (if (eq wl-summary-buffer-view 'thread) + (let* ((thread-entity (wl-thread-get-entity number)) + (descendant (wl-thread-entity-get-descendant thread-entity)) + (thread-parent (wl-thread-entity-get-parent thread-entity)) + (entity-parent (elmo-message-entity-number + (elmo-message-entity-parent folder entity))) + update-top-list) + (if (and (not reparent) + (eq thread-parent entity-parent)) + (progn + (wl-thread-entity-set-linked thread-entity nil) + (wl-thread-update-line-on-buffer-sub nil number)) + (wl-thread-delete-message number 'deep 'update) + (dolist (number (cons number descendant)) + (setq update-top-list + (nconc + update-top-list + (wl-summary-insert-thread + (elmo-message-entity folder number) + folder + 'update)))) + (when update-top-list + (wl-thread-update-indent-string-thread + (elmo-uniq-list update-top-list))))) + (delete-region (point-at-bol) (1+ (point-at-eol))) + (wl-summary-insert-line + (wl-summary-create-line entity nil + (wl-summary-temp-mark number) + (elmo-message-flags folder number) + (elmo-message-cached-p folder number))))) + (wl-summary-set-message-modified) + (wl-summary-jump-to-msg start-number) + (move-to-column start-column)))) + (defun wl-summary-next-folder-or-exit (&optional next-entity upward) (if (and next-entity wl-auto-select-next) @@ -1410,18 +1436,17 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'." (if body (setq candidates (append candidates body))) (setq fields (cdr fields))) (setq candidates (elmo-uniq-list candidates)) - (elmo-set-work-buf - (set-buffer-multibyte default-enable-multibyte-characters) - (mapcar (function - (lambda (x) - (setq components (std11-extract-address-components x)) - (cons (nth 1 components) - (and (car components) - (eword-decode-string - (decode-mime-charset-string - (car components) - mime-charset)))))) - candidates)))) + (elmo-with-enable-multibyte + (mapcar (function + (lambda (x) + (setq components (std11-extract-address-components x)) + (cons (nth 1 components) + (and (car components) + (eword-decode-string + (decode-mime-charset-string + (car components) + mime-charset)))))) + candidates)))) (defun wl-summary-edit-addresses-subr (the-email name-in-addr) ;; returns nil if there's no change. @@ -1958,7 +1983,7 @@ This function is defined for `window-scroll-functions'" (not disable-killed) 'in-msgdb) wl-summary-buffer-number-list)) - (setq append-list (car diff)) + (setq append-list (sort (car diff) #'<)) (setq delete-list (cadr diff)) (when delete-list @@ -4499,7 +4524,9 @@ If ARG is numeric number, decode message as following: (setq mime-mode (case arg (1 'mime) (2 'header-only) - (3 'as-is)))) + (3 'as-is) +;;; (4 'decode-only) + (5 'no-merge)))) (arg ;; Specify coding-system (doesn't change the MIME mode). (setq elmo-mime-display-as-is-coding-system @@ -4708,25 +4735,23 @@ If ARG is numeric number, decode message as following: (interactive) (let ((filename) (num (wl-summary-message-number))) - (if (null wl-save-dir) - (setq wl-save-dir wl-temporary-file-directory)) + (unless wl-save-dir + (setq wl-save-dir wl-temporary-file-directory)) (if num (save-excursion (setq filename (expand-file-name (concat (int-to-string num) wl-summary-save-file-suffix) wl-save-dir)) - (if (null (and arg - (null (file-exists-p filename)))) - (setq filename - (read-file-name "Save to file: " filename))) - + (when (or (null arg) + (file-exists-p filename)) + (setq filename (read-file-name "Save to file: " filename))) (wl-summary-set-message-buffer-or-redisplay) (set-buffer (wl-message-get-original-buffer)) - (if (and (null arg) (file-exists-p filename)) - (if (y-or-n-p "File already exists. override it? ") - (write-region (point-min) (point-max) filename)) - (write-region (point-min) (point-max) filename))) + (when (or arg + (not (file-exists-p filename)) + (y-or-n-p "File already exists. override it? ")) + (write-region-as-binary (point-min) (point-max) filename))) (message "No message to save.")) num))