* wl-summary.el (wl-summary-buffer-attach): Connect to signal
[elisp/wanderlust.git] / wl / wl-summary.el
index e0c31be..f719f8a 100644 (file)
 (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)
 (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))