* elmo.el (elmo-folder-list-flagged): New generic function.
[elisp/wanderlust.git] / elmo / elmo-map.el
index b3e4612..526e587 100644 (file)
@@ -1,4 +1,4 @@
-;;; elmo-map.el -- A ELMO folder class with message number mapping.
+;;; elmo-map.el --- A ELMO folder class with message number mapping.
 
 ;; Copyright (C) 2000 Yuuichi Teranishi <teranisi@gohome.org>
 
@@ -28,7 +28,7 @@
 ;; should inherit this folder.
 
 ;;; Code:
-;; 
+;;
 (require 'elmo)
 (require 'elmo-msgdb)
 
 (luna-define-generic elmo-map-folder-mark-as-read (folder locations)
   "")
 
+(luna-define-generic elmo-map-folder-unmark-answered (folder locations)
+  "")
+
+(luna-define-generic elmo-map-folder-mark-as-answered (folder locations)
+  "")
+
 (luna-define-generic elmo-map-message-fetch (folder location
                                                    strategy
                                                    &optional
 (luna-define-generic elmo-map-folder-list-unreads (folder)
   "")
 
+(luna-define-method elmo-map-folder-list-unreads ((folder elmo-map-folder))
+  t)
+
 (luna-define-generic elmo-map-folder-list-importants (folder)
   "")
 
 (luna-define-method elmo-map-folder-list-importants ((folder elmo-map-folder))
   t)
 
+(luna-define-generic elmo-map-folder-list-answereds (folder)
+  "")
+
+(luna-define-method elmo-map-folder-list-answereds ((folder elmo-map-folder))
+  t)
+
 (luna-define-generic elmo-map-folder-delete-messages (folder locations)
   "")
 
 (luna-define-method elmo-folder-status ((folder elmo-map-folder))
   (elmo-folder-open-internal folder)
-  (prog1
-      (let ((numbers (mapcar
-                     'car
-                     (elmo-map-folder-location-alist-internal folder))))
+  (elmo-folder-set-killed-list-internal
+   folder
+   (elmo-msgdb-killed-list-load (elmo-folder-msgdb-path folder)))
+  (let ((numbers (mapcar
+                 'car
+                 (elmo-map-folder-location-alist-internal folder))))
+    (setq numbers (elmo-living-messages numbers (elmo-folder-killed-list-internal folder)))
+    (prog1
        (cons (elmo-max-of-list numbers)
-             (length numbers)))
-    ;; Don't close after status.
-    (unless (elmo-folder-reserve-status-p folder)
-      (elmo-folder-close-internal folder))))
+             (length numbers))
+      ;; Don't close after status.
+      (unless (elmo-folder-reserve-status-p folder)
+       (elmo-folder-close-internal folder)))))
 
 (defun elmo-map-message-number (folder location)
   "Return number of the message in the FOLDER with LOCATION."
     (elmo-map-folder-location-setup folder (nreverse location))
     (elmo-folder-set-msgdb-internal
      folder
-     (list overview
-          (nreverse number-alist)
-          (nreverse mark-alist)
-          (elmo-msgdb-make-overview-hashtb overview)))))
+     (elmo-make-msgdb overview
+                     (nreverse number-alist)
+                     (nreverse mark-alist)))))
 
 (defun elmo-map-folder-location-setup (folder locations)
   (elmo-map-folder-set-location-alist-internal
    folder
    (elmo-map-folder-list-message-locations folder)))
 
+(luna-define-method elmo-folder-clear :around ((folder elmo-map-folder)
+                                              &optional keep-killed)
+  (unless keep-killed
+    (elmo-map-folder-set-number-max-internal folder 0)
+    (elmo-map-folder-set-location-alist-internal folder nil)
+    ;; clear hashtable.
+    (elmo-map-folder-set-location-hash-internal folder (elmo-make-hash)))
+  (luna-call-next-method))
+
 (luna-define-method elmo-folder-list-messages-internal
   ((folder elmo-map-folder) &optional nohide)
   (mapcar 'car (elmo-map-folder-location-alist-internal folder)))
 
-(luna-define-method elmo-folder-unmark-important ((folder elmo-map-folder)
-                                                 numbers)
+(luna-define-method elmo-folder-unmark-important :before ((folder
+                                                          elmo-map-folder)
+                                                         numbers)
   (elmo-map-folder-unmark-important
    folder
    (elmo-map-folder-numbers-to-locations folder numbers)))
 
-(luna-define-method elmo-folder-mark-as-important ((folder elmo-map-folder)
-                                                  numbers)
+(luna-define-method elmo-folder-mark-as-important :before ((folder
+                                                           elmo-map-folder)
+                                                          numbers)
   (elmo-map-folder-mark-as-important
    folder
    (elmo-map-folder-numbers-to-locations folder numbers)))
 
-(luna-define-method elmo-folder-unmark-read ((folder elmo-map-folder)
-                                            numbers)
-  (elmo-map-folder-unmark-read
+(luna-define-method elmo-folder-unmark-read :before ((folder elmo-map-folder)
+                                                    numbers
+                                                    &optional ignore-flags)
+  (unless ignore-flags
+    (elmo-map-folder-unmark-read
+     folder
+     (elmo-map-folder-numbers-to-locations folder numbers))))
+
+(luna-define-method elmo-folder-mark-as-read :before ((folder
+                                                      elmo-map-folder)
+                                                     numbers
+                                                     &optional ignore-flags)
+  (unless ignore-flags
+    (elmo-map-folder-mark-as-read
+     folder
+     (elmo-map-folder-numbers-to-locations folder numbers))))
+
+(luna-define-method elmo-folder-unmark-answered :before ((folder
+                                                         elmo-map-folder)
+                                                        numbers)
+  (elmo-map-folder-unmark-answered
    folder
    (elmo-map-folder-numbers-to-locations folder numbers)))
 
-(luna-define-method elmo-folder-mark-as-read ((folder elmo-map-folder) numbers)
-  (elmo-map-folder-mark-as-read
+(luna-define-method elmo-folder-mark-as-answered :before ((folder
+                                                         elmo-map-folder)
+                                                        numbers)
+  (elmo-map-folder-mark-as-answered
    folder
    (elmo-map-folder-numbers-to-locations folder numbers)))
 
    (elmo-map-message-location folder number)
    strategy section unread))
 
-(luna-define-method elmo-folder-list-unreads-internal
-  ((folder elmo-map-folder) unread-marks &optional mark-alist)
-  (elmo-map-folder-locations-to-numbers
-   folder
-   (elmo-map-folder-list-unreads folder)))
+(luna-define-method elmo-folder-list-unreads :around ((folder elmo-map-folder))
+  (let ((locations (elmo-map-folder-list-unreads folder)))
+    (if (listp locations)
+       (elmo-map-folder-locations-to-numbers folder locations)
+      (luna-call-next-method))))
 
-(luna-define-method elmo-folder-list-importants-internal
-  ((folder elmo-map-folder) important-mark)
+(luna-define-method elmo-folder-list-importants :around ((folder
+                                                         elmo-map-folder))
   (let ((locations (elmo-map-folder-list-importants folder)))
     (if (listp locations)
        (elmo-map-folder-locations-to-numbers folder locations)
-      t)))
+      (luna-call-next-method))))
+
+(luna-define-method elmo-folder-list-answereds :around ((folder
+                                                        elmo-map-folder))
+  (let ((locations (elmo-map-folder-list-answereds folder)))
+    (if (listp locations)
+       (elmo-map-folder-locations-to-numbers folder locations)
+      (luna-call-next-method))))
 
 (luna-define-method elmo-folder-delete-messages ((folder elmo-map-folder)
                                                 numbers)
             folder))
           (elmo-map-folder-location-alist-internal folder))))
   t) ; success
-  
 
 (require 'product)
 (product-provide (provide 'elmo-map) (require 'elmo-version))