X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=elmo%2Felmo-filter.el;h=1241285b54e38a22239e34ff4232ea7b36182beb;hb=a717271e46f76079d48f9f976807cfaeeb0a3f85;hp=e9d6b74d30208ffd89d740d68da279d0816acaee;hpb=ba73c38820510691bbd7e51526d9c8dc30263545;p=elisp%2Fwanderlust.git diff --git a/elmo/elmo-filter.el b/elmo/elmo-filter.el index e9d6b74..1241285 100644 --- a/elmo/elmo-filter.el +++ b/elmo/elmo-filter.el @@ -1,4 +1,4 @@ -;;; elmo-filter.el -- Filtered Folder Interface for ELMO. +;;; elmo-filter.el --- Filtered Folder Interface for ELMO. ;; Copyright (C) 1998,1999,2000 Yuuichi Teranishi @@ -24,16 +24,16 @@ ;; ;;; Commentary: -;; +;; ;;; Code: -;; +;; (require 'elmo) ;;; ELMO filter folder (eval-and-compile (luna-define-class elmo-filter-folder (elmo-folder) - (condition target)) + (condition target require-msgdb)) (luna-define-internal-accessors 'elmo-filter-folder)) (luna-define-method elmo-folder-initialize ((folder elmo-filter-folder) @@ -43,26 +43,51 @@ (elmo-filter-folder-set-condition-internal folder (car pair)) (if (string-match "^ */\\(.*\\)$" (cdr pair)) - (elmo-filter-folder-set-target-internal + (elmo-filter-folder-set-target-internal folder (elmo-make-folder (elmo-match-string 1 (cdr pair)))) (error "Folder syntax error `%s'" (elmo-folder-name-internal folder))) + (elmo-filter-folder-set-require-msgdb-internal + folder + (elmo-folder-search-requires-msgdb-p + (elmo-filter-folder-target-internal folder) + (elmo-filter-folder-condition-internal folder))) folder)) (luna-define-method elmo-folder-open-internal ((folder elmo-filter-folder)) (elmo-folder-open-internal (elmo-filter-folder-target-internal folder))) +(luna-define-method elmo-folder-msgdb :around ((folder elmo-filter-folder)) + ;; Load target's msgdb if required. + (if (elmo-filter-folder-require-msgdb-internal folder) + (elmo-folder-msgdb (elmo-filter-folder-target-internal folder))) + ;; Load msgdb of itself. + (luna-call-next-method)) + (luna-define-method elmo-folder-check ((folder elmo-filter-folder)) - (elmo-folder-check (elmo-filter-folder-target-internal folder))) + (if (elmo-filter-folder-require-msgdb-internal folder) + (elmo-folder-synchronize (elmo-filter-folder-target-internal folder)))) (luna-define-method elmo-folder-close-internal ((folder elmo-filter-folder)) (elmo-folder-close-internal (elmo-filter-folder-target-internal folder))) +(luna-define-method elmo-folder-close :after ((folder elmo-filter-folder)) + ;; Clear target msgdb if it is used. + (if (elmo-filter-folder-require-msgdb-internal folder) + (elmo-folder-set-msgdb-internal (elmo-filter-folder-target-internal + folder) nil))) + +(luna-define-method elmo-folder-commit :around ((folder elmo-filter-folder)) + ;; Save target msgdb if it is used. + (if (elmo-filter-folder-require-msgdb-internal folder) + (elmo-folder-commit (elmo-filter-folder-target-internal folder))) + (luna-call-next-method)) + (luna-define-method elmo-folder-expand-msgdb-path ((folder elmo-filter-folder)) (expand-file-name (elmo-replace-string-as-filename (elmo-folder-name-internal folder)) - (expand-file-name "filter" elmo-msgdb-dir))) + (expand-file-name "filter" elmo-msgdb-directory))) (luna-define-method elmo-folder-newsgroups ((folder elmo-filter-folder)) (elmo-folder-newsgroups (elmo-filter-folder-target-internal folder))) @@ -84,20 +109,42 @@ type)) (luna-define-method elmo-folder-msgdb-create ((folder elmo-filter-folder) - numlist new-mark already-mark - seen-mark important-mark - seen-list) - (elmo-folder-msgdb-create (elmo-filter-folder-target-internal folder) - numlist - new-mark - already-mark - seen-mark important-mark seen-list)) + numlist flag-table) + (if (elmo-filter-folder-require-msgdb-internal folder) + (let* ((target-folder (elmo-filter-folder-target-internal folder)) + (len (length numlist)) + (msgdb (elmo-folder-msgdb target-folder)) + overview number-alist mark-alist message-id entity mark) + (when (> len elmo-display-progress-threshold) + (elmo-progress-set 'elmo-folder-msgdb-create + len "Creating msgdb...")) + (unwind-protect + (dolist (number numlist) + (setq entity (elmo-msgdb-overview-get-entity number msgdb)) + (when entity + (setq overview (elmo-msgdb-append-element overview entity) + message-id (elmo-msgdb-overview-entity-get-id entity) + number-alist (elmo-msgdb-number-add number-alist + number + message-id)) + (when (setq mark (elmo-msgdb-get-mark msgdb number)) + (setq mark-alist (elmo-msgdb-mark-append + mark-alist + number + mark)))) + (elmo-progress-notify 'elmo-folder-msgdb-create)) + (elmo-progress-clear 'elmo-folder-msgdb-create)) + (list overview number-alist mark-alist)) + ;; Does not require msgdb. + (elmo-folder-msgdb-create + (elmo-filter-folder-target-internal folder) + numlist flag-table))) (luna-define-method elmo-folder-append-buffer ((folder elmo-filter-folder) - unread &optional number) + &optional flag number) (elmo-folder-append-buffer (elmo-filter-folder-target-internal folder) - unread number)) + flag number)) (luna-define-method elmo-message-fetch ((folder elmo-filter-folder) number strategy @@ -113,61 +160,77 @@ (luna-define-method elmo-folder-list-messages-internal ((folder elmo-filter-folder) &optional nohide) - (elmo-folder-search (elmo-filter-folder-target-internal folder) - (elmo-filter-folder-condition-internal folder))) - -(defsubst elmo-filter-folder-list-unreads-internal (folder unread-marks - mark-alist) - (let ((unreads (elmo-folder-list-unreads-internal - (elmo-filter-folder-target-internal folder) - unread-marks mark-alist))) - (unless (listp unreads) - (setq unreads - (delq nil - (mapcar - (function - (lambda (x) - (if (member (cadr x) unread-marks) - (car x)))) - (elmo-msgdb-get-mark-alist (elmo-folder-msgdb folder)))))) - (elmo-list-filter - (mapcar 'car (elmo-msgdb-get-number-alist - (elmo-folder-msgdb folder))) - unreads))) - -(luna-define-method elmo-folder-list-unreads-internal - ((folder elmo-filter-folder) - unread-marks &optional mark-alist) - (elmo-filter-folder-list-unreads-internal folder unread-marks mark-alist)) - -(defsubst elmo-filter-folder-list-importants-internal (folder important-mark) - (let ((importants (elmo-folder-list-importants-internal - (elmo-filter-folder-target-internal folder) - important-mark))) - (if (listp importants) - (elmo-list-filter - (mapcar 'car (elmo-msgdb-get-number-alist - (elmo-folder-msgdb folder))) - importants) + (let ((target (elmo-filter-folder-target-internal folder))) + (if (or (elmo-folder-plugged-p target) + (not (elmo-folder-persistent-p folder))) + ;; search target folder + (elmo-folder-search + target + (elmo-filter-folder-condition-internal folder)) + ;; not available t))) -(luna-define-method elmo-folder-list-importants-internal - ((folder elmo-filter-folder) - important-mark) - (elmo-filter-folder-list-importants-internal folder important-mark)) - -(luna-define-method elmo-folder-diff :around ((folder elmo-filter-folder) - &optional numbers) - (if (not (and (vectorp (elmo-filter-folder-condition-internal - folder)) - (string-match "^last$" - (elmo-filter-key - (elmo-filter-folder-condition-internal - folder))))) - (cons nil (cdr (elmo-folder-diff (elmo-filter-folder-target-internal - folder)))) +(defsubst elmo-filter-folder-list-unreads (folder) + (elmo-list-filter + (elmo-folder-list-messages folder nil 'in-msgdb) + (elmo-folder-list-unreads + (elmo-filter-folder-target-internal folder)))) + +(luna-define-method elmo-folder-list-unreads :around ((folder + elmo-filter-folder)) + (if (elmo-filter-folder-require-msgdb-internal folder) + (elmo-filter-folder-list-unreads folder) (luna-call-next-method))) +(defsubst elmo-filter-folder-list-importants (folder) + (elmo-list-filter + (elmo-folder-list-messages folder nil 'in-msgdb) + (elmo-folder-list-importants + (elmo-filter-folder-target-internal folder)))) + +(luna-define-method elmo-folder-list-importants :around ((folder + elmo-filter-folder)) + (if (elmo-filter-folder-require-msgdb-internal folder) + (elmo-filter-folder-list-importants folder) + (luna-call-next-method))) + +(luna-define-method elmo-folder-list-subfolders ((folder elmo-filter-folder) + &optional one-level) + (let* ((target (elmo-filter-folder-target-internal folder)) + (prefix (and (string-match + (concat "^\\(.*\\)" + (regexp-quote + (elmo-folder-name-internal + target)) + "$") + (elmo-folder-name-internal folder)) + (match-string 1 (elmo-folder-name-internal + folder))))) + (elmo-mapcar-list-of-list + (lambda (x) (concat prefix x)) + (elmo-folder-list-subfolders target one-level)))) + +(luna-define-method elmo-folder-diff :around ((folder elmo-filter-folder)) + (let ((condition (elmo-filter-folder-condition-internal folder)) + diff) + (if (vectorp condition) + (cond + ((and (string= (elmo-filter-key condition) "flag") + (or (string= (elmo-filter-value condition) "any") + (string= (elmo-filter-value condition) "digest") + (string= (elmo-filter-value condition) "unread"))) + (setq diff (elmo-folder-diff (elmo-filter-folder-target-internal + folder))) + (if (consp diff) + (cons (car diff) (car diff)) + (cons (car diff) (nth 1 diff)))) + ((string= "last" (elmo-filter-key condition)) + (luna-call-next-method)) + (t + (cons nil (cdr (elmo-folder-diff (elmo-filter-folder-target-internal + folder)))))) + (luna-call-next-method)))) + (luna-define-method elmo-folder-status ((folder elmo-filter-folder)) (elmo-folder-status (elmo-filter-folder-target-internal folder))) @@ -214,26 +277,54 @@ (elmo-message-file-name (elmo-filter-folder-target-internal folder) number)) -(luna-define-method elmo-folder-mark-as-read ((folder elmo-filter-folder) - numbers) +(luna-define-method elmo-folder-mark-as-read :around ((folder + elmo-filter-folder) + numbers + &optional ignore-flag) (elmo-folder-mark-as-read (elmo-filter-folder-target-internal folder) - numbers)) + numbers ignore-flag) + (luna-call-next-method)) -(luna-define-method elmo-folder-unmark-read ((folder elmo-filter-folder) - numbers) +(luna-define-method elmo-folder-unmark-read :around ((folder + elmo-filter-folder) + numbers + &optional ignore-flag) (elmo-folder-unmark-read (elmo-filter-folder-target-internal folder) - numbers)) - -(luna-define-method elmo-folder-mark-as-important ((folder elmo-filter-folder) - numbers) + numbers ignore-flag) + (luna-call-next-method)) + +(luna-define-method elmo-folder-mark-as-important :around ((folder + elmo-filter-folder) + numbers + &optional + ignore-flag) (elmo-folder-mark-as-important (elmo-filter-folder-target-internal folder) - numbers)) - -(luna-define-method elmo-folder-unmark-important ((folder elmo-filter-folder) - numbers) + numbers ignore-flag) + (luna-call-next-method)) + +(luna-define-method elmo-folder-unmark-important :around ((folder + elmo-filter-folder) + numbers + &optional + ignore-flag) (elmo-folder-unmark-important (elmo-filter-folder-target-internal folder) - numbers)) - + numbers ignore-flag) + (luna-call-next-method)) + +(luna-define-method elmo-folder-mark-as-answered :around ((folder + elmo-filter-folder) + numbers) + (elmo-folder-mark-as-answered (elmo-filter-folder-target-internal folder) + numbers) + (luna-call-next-method)) + + +(luna-define-method elmo-folder-unmark-answered :around ((folder + elmo-filter-folder) + numbers) + (elmo-folder-unmark-answered (elmo-filter-folder-target-internal folder) + numbers) + (luna-call-next-method)) (require 'product) (product-provide (provide 'elmo-filter) (require 'elmo-version))