* wl-vars.el (wl-summary-print-argument-within-window): New variable.
[elisp/wanderlust.git] / elmo / elmo-localdir.el
index 2fa24e5..7deaf26 100644 (file)
     'identity
     (mapcar
      'elmo-replace-string-as-filename
-     (split-string (elmo-localdir-folder-dir-name-internal folder)
-                  "/"))
+     (split-string
+      (let ((dir-name (elmo-localdir-folder-dir-name-internal folder)))
+       (if (file-name-absolute-p dir-name)
+           (expand-file-name dir-name)
+         dir-name))
+      "/"))
     "/")
    (expand-file-name ;;"localdir"
     (symbol-name (elmo-folder-type-internal folder))
 
 (luna-define-method elmo-folder-msgdb-create ((folder elmo-localdir-folder)
                                              numbers
-                                             new-mark
-                                             already-mark
-                                             seen-mark
-                                             important-mark
-                                             seen-list)
+                                             flag-table)
   (when numbers
     (let ((dir (elmo-localdir-folder-directory-internal folder))
          overview number-alist mark-alist entity message-id
-         num seen gmark
+         num gmark
          (i 0)
          (len (length numbers)))
       (message "Creating msgdb...")
                (elmo-msgdb-number-add number-alist
                                       num
                                       message-id))
-         (setq seen (member message-id seen-list))
          (if (setq gmark (or (elmo-msgdb-global-mark-get message-id)
-                             (if (elmo-file-cache-exists-p message-id) ; XXX
-                                 (if seen
-                                     nil
-                                   already-mark)
-                               (if seen
-                                   nil ;;seen-mark
-                                 new-mark))))
+                             (unless (eq 'read (elmo-flag-table-get 
+                                                flag-table message-id))
+                               (elmo-msgdb-mark
+                                (elmo-flag-table-get flag-table message-id)
+                                (elmo-file-cache-status
+                                 (elmo-file-cache-get message-id))
+                                'new))))
              (setq mark-alist
                    (elmo-msgdb-mark-append
                     mark-alist
 
 (luna-define-method elmo-folder-append-messages :around
   ((folder elmo-localdir-folder)
-   src-folder numbers unread-marks &optional same-number)
+   src-folder numbers &optional same-number)
   (if (elmo-folder-message-file-p src-folder)
-      (let ((dir (elmo-localdir-folder-directory-internal folder))
+      (let ((src-msgdb-exists (not (zerop (elmo-folder-length src-folder))))
+           (dir (elmo-localdir-folder-directory-internal folder))
+           (table (elmo-flag-table-load (elmo-folder-msgdb-path folder)))
            (succeeds numbers)
-           (next-num (1+ (car (elmo-folder-status folder)))))
+           (next-num (1+ (car (elmo-folder-status folder))))
+           mark flag id)
        (while numbers
+         (setq mark (and src-msgdb-exists
+                         (elmo-message-mark src-folder (car numbers)))
+               flag (cond
+                     ((null mark) 'read)
+                     ((member mark (elmo-msgdb-answered-marks))
+                      'answered)
+                     ;;
+                     ((not (member mark (elmo-msgdb-unread-marks)))
+                      'read)))
          (elmo-copy-file
           (elmo-message-file-name src-folder (car numbers))
           (expand-file-name
            (int-to-string
             (if same-number (car numbers) next-num))
            dir))
+         ;; save flag-table only when src folder's msgdb is loaded.
+         (when (setq id (and src-msgdb-exists
+                             (elmo-message-field src-folder (car numbers)
+                                                 'message-id)))
+           (elmo-flag-table-set table id flag))
          (elmo-progress-notify 'elmo-folder-move-messages)
          (if (and (setq numbers (cdr numbers))
                   (not same-number))
                        ;; MDA is running.
                        (1+ (car (elmo-folder-status folder)))
                      (1+ next-num)))))
+       (when (elmo-folder-persistent-p folder)
+         (elmo-flag-table-save (elmo-folder-msgdb-path folder) table))
        succeeds)
     (luna-call-next-method)))
 
        (elmo-make-directory dir))
       t)))
 
-(luna-define-method elmo-folder-delete :before ((folder elmo-localdir-folder))
-  (let ((dir (elmo-localdir-folder-directory-internal folder)))
-    (if (not (file-directory-p dir))
-       (error "No such directory: %s" dir)
-      (elmo-delete-match-files dir "[0-9]+" t)
+(luna-define-method elmo-folder-delete ((folder elmo-localdir-folder))
+  (let ((msgs (and (elmo-folder-exists-p folder)
+                  (elmo-folder-list-messages folder))))
+    (when (yes-or-no-p (format "%sDelete msgdb and substance of \"%s\"? "
+                              (if (> (length msgs) 0)
+                                  (format "%d msg(s) exists. " (length msgs))
+                                "")
+                              (elmo-folder-name-internal folder)))
+      (let ((dir (elmo-localdir-folder-directory-internal folder)))
+       (if (not (file-directory-p dir))
+           (error "No such directory: %s" dir)
+         (elmo-delete-match-files dir "[0-9]+" t)))
+      (elmo-msgdb-delete-path folder)
       t)))
 
 (luna-define-method elmo-folder-rename-internal ((folder elmo-localdir-folder)
   (let* ((old (elmo-localdir-folder-directory-internal folder))
         (new (elmo-localdir-folder-directory-internal new-folder))
         (new-dir (directory-file-name (file-name-directory new))))
-    (if (not (file-directory-p old))
-       (error "No such directory: %s" old)
-      (if (file-exists-p new)
-         (error "Already exists directory: %s" new)
-       (if (not (file-exists-p new-dir))
-           (elmo-make-directory new-dir))
-       (rename-file old new)
-       t))))
+    (unless (file-directory-p old)
+      (error "No such directory: %s" old))
+    (when (file-exists-p new)
+      (error "Already exists directory: %s" new))
+    (unless (file-directory-p new-dir)
+      (elmo-make-directory new-dir))
+    (rename-file old new)
+    t))
 
 (defsubst elmo-localdir-field-condition-match (folder condition
                                                      number number-list)
         (elmo-msgdb-overview-get-entity onum msgdb)
         new-number)
        ;; update number-alist
-       (setcar (assq onum onum-alist) new-number))
+       (and (assq onum onum-alist)
+            (setcar (assq onum onum-alist) new-number)))
       ;; update mark-alist
       (when (setq mark (cadr (assq onum omark-alist)))
        (setq new-mark-alist