* wl-summary.el (wl-summary-buffer-event-handler): New internal
[elisp/wanderlust.git] / elmo / elmo-multi.el
index c9d1368..5903b1c 100644 (file)
                                             &optional
                                             disable-killed
                                             ignore-msgdb
-                                            no-check)
-  (dolist (fld (elmo-multi-folder-children-internal folder))
-    (elmo-folder-synchronize fld disable-killed ignore-msgdb no-check))
+                                            no-check
+                                            mask)
+  (if mask
+      (dolist (element (elmo-multi-split-numbers folder mask))
+       (when (cdr element)
+         (elmo-folder-synchronize (car element)
+                                  disable-killed
+                                  ignore-msgdb
+                                  no-check
+                                  (cdr element))))
+    (dolist (fld (elmo-multi-folder-children-internal folder))
+      (elmo-folder-synchronize fld disable-killed ignore-msgdb no-check)))
   0)
 
 (luna-define-method elmo-folder-expand-msgdb-path ((folder
      (car pair)
      (elmo-message-entity (car pair) (cdr pair)) ignore-cache)))
 
+(luna-define-method elmo-message-number ((folder elmo-multi-folder)
+                                        message-id)
+  (let ((children (elmo-multi-folder-children-internal folder))
+       match)
+    (while children
+      (when (setq match (elmo-message-number (car children) message-id))
+       (setq children nil))
+      (setq children (cdr children)))
+    match))
+
 (luna-define-method elmo-message-entity ((folder elmo-multi-folder) key)
   (cond
    ((numberp key)
   (let ((pair (elmo-multi-real-folder-number folder number)))
     (elmo-message-field (car pair) (cdr pair) field)))
 
-(luna-define-method elmo-message-flags ((folder elmo-multi-folder) number
-                                       &optional msgid)
+(luna-define-method elmo-message-flag-available-p ((folder
+                                                   elmo-multi-folder) number
+                                                   flag)
+  (let ((pair (elmo-multi-real-folder-number folder number)))
+    (elmo-message-flag-available-p (car pair) (cdr pair) flag)))
+
+(luna-define-method elmo-message-flags ((folder elmo-multi-folder) number)
   (let ((pair (elmo-multi-real-folder-number folder number)))
-    (elmo-message-flags (car pair) (cdr pair) msgid)))
+    (elmo-message-flags (car pair) (cdr pair))))
 
 (defun elmo-multi-split-numbers (folder numlist &optional as-is)
   (let ((numbers (sort numlist '<))
+       (folders (elmo-multi-folder-children-internal folder))
        (divider (elmo-multi-folder-divide-number-internal folder))
        (cur-number 0)
        one-list numbers-list)
     (while numbers
+      (setq one-list (list (nth cur-number folders)))
       (setq cur-number (+ cur-number 1))
-      (setq one-list nil)
       (while (and numbers
                  (eq 0
                      (/ (- (car numbers)
 
 (luna-define-method elmo-folder-delete-messages ((folder elmo-multi-folder)
                                                 numbers)
-  (let ((flds (elmo-multi-folder-children-internal folder))
-       one-list-list
-       (cur-number 0))
-    (setq one-list-list (elmo-multi-split-numbers folder numbers))
-    (while (< cur-number (length flds))
-      (elmo-folder-delete-messages (nth cur-number flds)
-                                  (nth cur-number one-list-list))
-      (setq cur-number (+ 1 cur-number)))
-    t))
+  (dolist (element (elmo-multi-split-numbers folder numbers))
+    (when (cdr element)
+      (elmo-folder-delete-messages (car element) (cdr element))))
+  t)
 
 (luna-define-method elmo-folder-detach-messages ((folder elmo-multi-folder)
                                                 numbers)
-  (let ((flds (elmo-multi-folder-children-internal folder))
-       one-list-list
-       (cur-number 0))
-    (setq one-list-list (elmo-multi-split-numbers folder numbers))
-    (while (< cur-number (length flds))
-      (elmo-folder-detach-messages (nth cur-number flds)
-                                  (nth cur-number one-list-list))
-      (setq cur-number (+ 1 cur-number)))
-    t))
+  (dolist (element (elmo-multi-split-numbers folder numbers))
+    (when (cdr element)
+      (elmo-folder-detach-messages (car element) (cdr element))))
+  t)
 
 (luna-define-method elmo-folder-diff ((folder elmo-multi-folder))
   (elmo-multi-folder-diff folder))
                                          flag
                                          &optional is-local)
   (dolist (pair (elmo-multi-make-folder-numbers-list folder numbers))
-    (elmo-folder-set-flag (car pair) (cdr pair) flag is-local)))
+    (elmo-folder-set-flag (car pair) (cdr pair) flag is-local))
+  (elmo-folder-notify-event folder 'flag-changed numbers))
 
 (luna-define-method elmo-folder-unset-flag ((folder elmo-multi-folder)
                                            numbers
                                            flag
                                            &optional is-local)
   (dolist (pair (elmo-multi-make-folder-numbers-list folder numbers))
-    (elmo-folder-unset-flag (car pair) (cdr pair) flag is-local)))
+    (ignore-errors
+     (elmo-folder-unset-flag (car pair) (cdr pair) flag is-local)))
+  (elmo-folder-notify-event folder 'flag-changed numbers))
 
 (luna-define-method elmo-folder-list-flagged ((folder elmo-multi-folder)
                                              flag
     sum))
 
 (luna-define-method elmo-folder-count-flags ((folder elmo-multi-folder))
-  (let ((new 0)
-       (unreads 0)
-       (answered 0)
-       flags)
+  (let (flag-alist element)
     (dolist (child (elmo-multi-folder-children-internal folder))
-      (setq flags (elmo-folder-count-flags child))
-      (setq new (+ new (nth 0 flags)))
-      (setq unreads (+ unreads (nth 1 flags)))
-      (setq answered (+ answered (nth 2 flags))))
-    (list new unreads answered)))
+      (dolist (pair (elmo-folder-count-flags child))
+       (if (setq element (assq (car pair) flag-alist))
+           (setcdr element (+ (cdr element) (cdr pair)))
+         (setq flag-alist (cons pair flag-alist)))))
+    flag-alist))
 
 (require 'product)
 (product-provide (provide 'elmo-multi) (require 'elmo-version))