X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=elmo%2Felmo-multi.el;h=4d5b9a6621fc1772c76f34cbf23a88f1b0404bcc;hb=a6d5a5adb70f71665568e1189525fc4eb98b088d;hp=2a13b79897b16937046676247bce3875c967a25a;hpb=ca1e39e78c25619f867a0a738c0ba2192dfed435;p=elisp%2Fwanderlust.git diff --git a/elmo/elmo-multi.el b/elmo/elmo-multi.el index 2a13b79..4d5b9a6 100644 --- a/elmo/elmo-multi.el +++ b/elmo/elmo-multi.el @@ -31,6 +31,7 @@ (eval-when-compile (require 'cl)) (require 'elmo) +(require 'elmo-signal) (require 'luna) (defvar elmo-multi-divide-number 100000 @@ -59,7 +60,7 @@ folder (nconc (elmo-multi-folder-children-internal folder) - (list (elmo-make-folder (car name))))) + (list (elmo-get-folder (car name))))) (setq name (cdr name)) (when (and (> (length name) 0) (eq (aref name 0) ?,)) @@ -67,8 +68,58 @@ (elmo-multi-folder-set-divide-number-internal folder elmo-multi-divide-number) + (elmo-multi-connect-signals folder) folder) +(defun elmo-multi-connect-signals (folder) + (elmo-connect-signal + nil 'flag-changing folder + (elmo-define-signal-handler (folder child number old-flags new-flags) + (elmo-emit-signal 'flag-changing folder + (car (elmo-multi-map-numbers folder child (list number))) + old-flags new-flags)) + (elmo-define-signal-filter (folder sender) + (memq sender (elmo-multi-folder-children-internal folder)))) + (elmo-connect-signal + nil 'flag-changed folder + (elmo-define-signal-handler (folder child numbers) + (elmo-emit-signal 'flag-changed folder + (elmo-multi-map-numbers folder child numbers))) + (elmo-define-signal-filter (folder sender) + (memq sender (elmo-multi-folder-children-internal folder)))) + (elmo-connect-signal + nil 'cache-changed folder + (elmo-define-signal-handler (folder child number) + (elmo-emit-signal + 'cache-changed folder + (car (elmo-multi-map-numbers folder child (list number))))) + (elmo-define-signal-filter (folder sender) + (memq sender (elmo-multi-folder-children-internal folder)))) + (elmo-connect-signal + nil 'update-overview folder + (elmo-define-signal-handler (folder child number) + (elmo-emit-signal + 'update-overview folder + (car (elmo-multi-map-numbers folder child (list number))))) + (elmo-define-signal-filter (folder sender) + (memq sender (elmo-multi-folder-children-internal folder))))) + +(defun elmo-multi-map-numbers (folder child numbers) + (let ((multi (catch 'found + (let ((children (elmo-multi-folder-children-internal folder)) + (index 0)) + (while children + (setq index (1+ index)) + (when (eq (car children) child) + (throw 'found index)) + (setq children (cdr children))))))) + (when multi + (let ((offset (* (elmo-multi-folder-divide-number-internal folder) + multi))) + (mapcar (lambda (number) (+ offset number)) + numbers))))) + + (luna-define-method elmo-folder-open-internal ((folder elmo-multi-folder)) (dolist (fld (elmo-multi-folder-children-internal folder)) (elmo-folder-open-internal fld))) @@ -81,9 +132,10 @@ (dolist (fld (elmo-multi-folder-children-internal folder)) (elmo-folder-close-internal fld))) -(luna-define-method elmo-folder-close :after ((folder elmo-multi-folder)) +(luna-define-method elmo-folder-close ((folder elmo-multi-folder)) + (elmo-generic-folder-close folder) (dolist (fld (elmo-multi-folder-children-internal folder)) - (elmo-folder-set-msgdb-internal fld nil))) + (elmo-folder-close fld))) (luna-define-method elmo-folder-synchronize ((folder elmo-multi-folder) &optional @@ -144,8 +196,7 @@ (luna-define-method elmo-message-set-cached ((folder elmo-multi-folder) number cached) (let ((pair (elmo-multi-real-folder-number folder number))) - (elmo-message-set-cached (car pair) (cdr pair) cached)) - (elmo-folder-notify-event folder 'cache-changed number)) + (elmo-message-set-cached (car pair) (cdr pair) cached))) (luna-define-method elmo-find-fetch-strategy ((folder elmo-multi-folder) number @@ -174,8 +225,9 @@ (let* ((pair (elmo-multi-real-folder-number folder key)) (entity (elmo-message-entity (car pair) (cdr pair)))) (when entity - (elmo-message-entity-set-number (elmo-message-copy-entity entity) - key)))) + (setq entity (elmo-message-copy-entity entity)) + (elmo-message-entity-set-number entity key) + entity))) ((stringp key) (let ((children (elmo-multi-folder-children-internal folder)) (cur-number 0) @@ -200,9 +252,9 @@ (elmo-message-entity-field entity 'references))) (luna-define-method elmo-message-field ((folder elmo-multi-folder) - number field) + number field &optional type) (let ((pair (elmo-multi-real-folder-number folder number))) - (elmo-message-field (car pair) (cdr pair) field))) + (elmo-message-field (car pair) (cdr pair) field type))) (luna-define-method elmo-message-flag-available-p ((folder elmo-multi-folder) number @@ -247,11 +299,7 @@ number strategy &optional unseen section) (let ((pair (elmo-multi-real-folder-number folder number))) - (when (elmo-message-fetch (car pair) (cdr pair) - strategy unseen section) - (unless unseen - (elmo-folder-notify-event folder 'flag-changed (list number))) - t))) + (elmo-message-fetch (car pair) (cdr pair) strategy unseen section))) (luna-define-method elmo-folder-delete-messages ((folder elmo-multi-folder) numbers) @@ -425,8 +473,7 @@ 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-notify-event folder 'flag-changed numbers)) + (elmo-folder-set-flag (car pair) (cdr pair) flag is-local))) (luna-define-method elmo-folder-unset-flag ((folder elmo-multi-folder) numbers @@ -434,8 +481,7 @@ &optional is-local) (dolist (pair (elmo-multi-make-folder-numbers-list folder numbers)) (ignore-errors - (elmo-folder-unset-flag (car pair) (cdr pair) flag is-local))) - (elmo-folder-notify-event folder 'flag-changed numbers)) + (elmo-folder-unset-flag (car pair) (cdr pair) flag is-local)))) (luna-define-method elmo-folder-list-flagged ((folder elmo-multi-folder) flag