Synch up with elmo-lunafy.
[elisp/wanderlust.git] / wl / wl-fldmgr.el
index 2cbdaaf..f63811e 100644 (file)
@@ -33,6 +33,7 @@
 (require 'wl-folder)
 (require 'wl-summary)
 (require 'wl-highlight)
+(require 'wl-version)
 (eval-when-compile
   (require 'wl-util))
 
 (defvar wl-fldmgr-group-insert-opened nil)
 
 (defconst wl-fldmgr-folders-header
-  "#
+  (format
+   "#
 # Folder definition file
-# This file is generated automatically by %s %s (%s).
+# This file is generated automatically by %s.
 #
 
-")
-
-(defconst wl-fldmgr-filter-completion-alist
-  '(("/last:")
-    ("/first:")
-    ("/since:")
-    ("/before:")
-    ("/from=")
-    ("/subject=")
-    ("/date=")
-    ("/to=")
-    ("/cc=")
-    ("/tocc=")
-    ("/body=")))
+" (product-string-1 'wl-version t)))
 
 ;;; Initial setup
 
 (defun wl-fldmgr-exit ()
   (when (and wl-fldmgr-modified
             (or (not wl-interactive-save-folders)
-                (y-or-n-p "Folder view was modified. Save current folders? ")))
+                (y-or-n-p "Folder view was modified.  Save current folders? ")))
     (wl-fldmgr-save-folders)))
 
 ;;; Macro and misc Function
 (defmacro wl-fldmgr-assign-id (entity &optional id)
   (` (let ((entity-id (or (, id) wl-folder-entity-id)))
        (put-text-property 0 (length (, entity))
-                         'wl-folder-entity-id 
+                         'wl-folder-entity-id
                          entity-id
                          (, entity)))))
 
                wl-folder-group-alist)))
 
 (defun wl-fldmgr-add-entity-hashtb (entities)
-  "update `wl-folder-entity-hashtb', `wl-folder-newsgroups-hashtb'.
-return value is diffs '(new unread all)."
+  "Update `wl-folder-entity-hashtb', `wl-folder-newsgroups-hashtb'.
+Return value is diffs '(new unread all)."
   (let* ((new-diff 0)
         (unread-diff 0)
         (all-diff 0)
@@ -188,7 +177,7 @@ return value is diffs '(new unread all)."
     (list new-diff unread-diff all-diff)))
 
 (defun wl-fldmgr-delete-entity-hashtb (entities &optional clear)
-  "update `wl-folder-entity-hashtb'.
+  "Update `wl-folder-entity-hashtb'.
 return value is diffs '(-new -unread -all)."
   (let* ((new-diff 0)
         (unread-diff 0)
@@ -363,13 +352,10 @@ return value is diffs '(-new -unread -all)."
 
 (defun wl-add-entity (key-path new entity prev-entity-id &optional errmes)
   (when (string= (caar key-path) (car entity))
-    (mapcar
-     '(lambda (ent)
+    (let ((entities new))
+      (while entities
        (wl-folder-entity-assign-id
-        ent
-        wl-folder-entity-id-name-hashtb
-        t))
-     new)
+        (pop entities) wl-folder-entity-id-name-hashtb t)))
     (when (wl-add-entity-sub (cdr key-path) new entity errmes)
       ;; return value is non-nil (diffs)
       (wl-fldmgr-add-entity-hashtb new))))
@@ -415,20 +401,15 @@ return value is diffs '(-new -unread -all)."
          ;; do it
          (when access
            ;; remove from unsubscribe
-           (mapcar
-            '(lambda (x)
-               (cond
-                ((consp x)
+           (setq new2 new)
+           (while new2
+             (if (consp (car new2))
                  (setq unsubscribes
-                       (delete (wl-string-assoc (car x) unsubscribes)
-                               unsubscribes)))
-                (t
-                 (setq unsubscribes (delete (elmo-string x) unsubscribes)))))
-            new)
-;;         (setq new2 new)
-;;         (while new2
-;;           (setq unsubscribes (delete (elmo-string (car new2)) unsubscribes))
-;;           (setq new2 (cdr new2)))
+                       (delq (wl-string-assoc (car (car new2)) unsubscribes)
+                             unsubscribes))
+               (setq unsubscribes (delete (elmo-string (car new2))
+                                          unsubscribes)))
+             (setq new2 (cdr new2)))
            (setcdr (cddr entity) (list unsubscribes))
            (wl-fldmgr-add-modified-access-list group))
          (if (not key-path);; insert group top
@@ -454,7 +435,7 @@ return value is diffs '(-new -unread -all)."
 ;; return value is
 ;; (path indent-level (group . type) previous-entity-id target-entity)
 ;; previous-entity-id is (id-name-alist-prev-id . entity-alist-prev-id)
-;; example: 
+;; example:
 ;; '((("Desktop" group) ("ML" group) "+ml/wl") '(3 2) ("ML" . group) nil "+ml/wl")
 
 (defun wl-fldmgr-get-path-from-buffer (&optional prev)
@@ -464,27 +445,27 @@ return value is diffs '(-new -unread -all)."
     (save-excursion
       (beginning-of-line)
       (when prev
-;;     (wl-folder-next-entity-skip-invalid t)
-;;     (and (setq previous-entity
-;;                (wl-fldmgr-get-previous-entity wl-folder-entity
-;;                                               (wl-fldmgr-get-entity-id)))
-;;          ;; change entity to id
-;;          (setq previous-entity
-;;                (cons
-;;                 (and (car previous-entity)
-;;                      (wl-fldmgr-get-entity-id (car previous-entity)))
-;;                 (and (cdr previous-entity)
-;;                      (wl-fldmgr-get-entity-id (cdr previous-entity))))))
+;;;    (wl-folder-next-entity-skip-invalid t)
+;;;    (and (setq previous-entity
+;;;               (wl-fldmgr-get-previous-entity wl-folder-entity
+;;;                                              (wl-fldmgr-get-entity-id)))
+;;;         ;; change entity to id
+;;;         (setq previous-entity
+;;;               (cons
+;;;                (and (car previous-entity)
+;;;                     (wl-fldmgr-get-entity-id (car previous-entity)))
+;;;                (and (cdr previous-entity)
+;;;                     (wl-fldmgr-get-entity-id (cdr previous-entity))))))
        (wl-folder-prev-entity-skip-invalid))
       (if (and prev
               (looking-at wl-folder-group-regexp)
               (string= (wl-match-buffer 2) "-"))
          (setq group-target nil)
        (if (and prev (bobp))
-           (error "out of desktop group")))
+           (error "Out of desktop group")))
       (setq folder-path (wl-fldmgr-get-path wl-folder-entity
                                            (wl-folder-get-entity-from-buffer)
-                                           ;;(wl-fldmgr-get-entity-id)
+;;;                                        (wl-fldmgr-get-entity-id)
                                            group-target))
       (let ((fp folder-path))
        (while fp
@@ -770,54 +751,57 @@ return value is diffs '(-new -unread -all)."
 
 (defvar wl-fldmgr-add-completion-hashtb (make-vector 7 0))
 
-(defun wl-fldmgr-add-completion-all-completions (string)
-  (let ((table
-        (catch 'found
-          (mapatoms
-           (function
-            (lambda (atom)
-              (if (string-match (symbol-name atom) string)
-                  (throw 'found (symbol-value atom)))))
-           wl-fldmgr-add-completion-hashtb)))
-       (pattern
-        (if (string-match "\\.$"
-                          (car (elmo-network-get-spec
-                                string nil nil nil)))
-            (substring string 0 (match-beginning 0))
-          (concat string nil))))
-    (or table
-       (setq table (elmo-list-folders pattern))
-       (and table
-            (or (/= (length table) 1)
-                (elmo-folder-exists-p (car table))))
-       (setq pattern
-             (if (string-match "\\.[^\\.]+$" string)
-                 (substring string 0 (match-beginning 0))
-               (char-to-string (aref string 0)))
-             table (elmo-list-folders pattern)))
-    (setq pattern (concat "^" (regexp-quote pattern)))
-    (unless (intern-soft pattern wl-fldmgr-add-completion-hashtb)
-      (set (intern pattern wl-fldmgr-add-completion-hashtb) table))
-    table))
-
-(defun wl-fldmgr-add-completion-subr (string predicate flag)
-  (let ((table
-        (if (string= string "")
-            (mapcar (function (lambda (spec)
-                                (list (char-to-string (car spec)))))
-                    elmo-spec-alist)
-          (when (assq (aref string 0) elmo-spec-alist)
-            (delq nil (mapcar
-                       (function list)
-                       (condition-case nil
-                           (wl-fldmgr-add-completion-all-completions string)
-                         (error nil))))))))
-    (if (null flag)
-       (try-completion string table predicate)
-      (if (eq flag 'lambda)
-         (eq t (try-completion string table predicate))
-       (if flag
-           (all-completions string table predicate))))))
+;(defun wl-fldmgr-add-completion-all-completions (string)
+;  (let ((table
+;       (catch 'found
+;         (mapatoms
+;          (function
+;           (lambda (atom)
+;             (if (string-match (symbol-name atom) string)
+;                 (throw 'found (symbol-value atom)))))
+;          wl-fldmgr-add-completion-hashtb)))
+;      (pattern
+;       (if (string-match "\\.$"
+;                         (car (elmo-network-get-spec
+;                               string nil nil nil nil)))
+;           (substring string 0 (match-beginning 0))
+;         (concat string nil))))
+;    (or table
+;      (setq table (elmo-folder-list-subfolders (wl-folder-get-elmo-folder
+;                                                pattern)))
+;      (and table
+;           (or (/= (length table) 1)
+;               (elmo-folder-exists-p (wl-folder-get-elmo-folder
+;                                      (car table)))))
+;      (setq pattern
+;            (if (string-match "\\.[^\\.]+$" string)
+;                (substring string 0 (match-beginning 0))
+;              (char-to-string (aref string 0)))
+;            table (elmo-folder-list-subfolders
+;                   (wl-folder-get-elmo-folder pattern))))
+;    (setq pattern (concat "^" (regexp-quote pattern)))
+;    (unless (intern-soft pattern wl-fldmgr-add-completion-hashtb)
+;      (set (intern pattern wl-fldmgr-add-completion-hashtb) table))
+;    table))
+
+;(defun wl-fldmgr-add-completion-subr (string predicate flag)
+;  (let ((table
+;       (if (string= string "")
+;           (mapcar (function (lambda (spec)
+;                               (list (char-to-string (car spec)))))
+;                   elmo-spec-alist)
+;         (when (assq (aref string 0) elmo-spec-alist)
+;           (delq nil (mapcar
+;                      (function list)
+;                      (condition-case nil
+;                          (wl-fldmgr-add-completion-all-completions string)
+;                        (error nil))))))))
+;    (if (null flag)
+;      (try-completion string table predicate)
+;      (if (eq flag 'lambda)
+;        (eq t (try-completion string table predicate))
+;      (if flag
+;          (all-completions string table predicate))))))
 
 (defun wl-fldmgr-add (&optional name)
   (interactive)
@@ -825,7 +809,7 @@ return value is diffs '(-new -unread -all)."
     (beginning-of-line)
     (let ((ret-val nil)
          (inhibit-read-only t)
-         (wl-folder-completion-func
+         (wl-folder-completion-function
           (if wl-fldmgr-add-complete-with-current-folder-list
               (function wl-fldmgr-add-completion-subr)))
          tmp indent path diffs)
@@ -838,8 +822,7 @@ return value is diffs '(-new -unread -all)."
            (setq name (wl-fldmgr-read-string
                        (wl-summary-read-folder wl-default-folder "to add"))))
        ;; maybe add elmo-plugged-alist.
-       (when (stringp name)
-         (elmo-folder-set-plugged name wl-plugged t))
+       (elmo-folder-set-plugged (wl-folder-get-elmo-folder name) wl-plugged t)
        (when (setq diffs
                    (wl-add-entity
                     path (list name) wl-folder-entity (nth 3 tmp) t))
@@ -855,18 +838,19 @@ return value is diffs '(-new -unread -all)."
   (save-excursion
     (beginning-of-line)
     (if (looking-at wl-folder-group-regexp)
-       (error "can't delete group folder"))
+       (error "Can't delete group folder"))
     (let* ((inhibit-read-only t)
           (tmp (wl-fldmgr-get-path-from-buffer))
           (entity (elmo-string (nth 4 tmp)))
-          (msgs (and (elmo-folder-exists-p entity)
-                     (elmo-list-folder entity))))
+          (folder (wl-folder-get-elmo-folder entity))
+          (msgs (and (elmo-folder-exists-p folder)
+                     (elmo-folder-list-messages folder))))
       (when (yes-or-no-p (format "%sDo you really delete \"%s\"? "
                                 (if (> (length msgs) 0)
                                     (format "%d msg(s) exists. " (length msgs))
                                   "")
                                 entity))
-       (elmo-delete-folder entity)
+       (elmo-folder-delete folder)
        (wl-fldmgr-cut tmp nil t)))))
 
 (defun wl-fldmgr-rename ()
@@ -879,7 +863,7 @@ return value is diffs '(-new -unread -all)."
        ((looking-at wl-folder-group-regexp) ;; group
        (let* ((indent (wl-match-buffer 1))
               (old-group (wl-folder-get-realname (wl-match-buffer 3)))
-              (group-entity (wl-folder-search-group-entity-by-name 
+              (group-entity (wl-folder-search-group-entity-by-name
                              old-group wl-folder-entity))
               group)
          (if (eq (nth 1 group-entity) 'access)
@@ -902,7 +886,7 @@ return value is diffs '(-new -unread -all)."
                    (setcar group-entity group)
                    (setcar (wl-string-assoc old-group wl-folder-group-alist)
                            group)
-                   ;;(setcdr (assq id wl-folder-entity-id-name-alist) group)
+;;;                (setcdr (assq id wl-folder-entity-id-name-alist) group)
                    (wl-folder-set-id-name id group)
                    (wl-fldmgr-delete-line)
                    (wl-folder-insert-entity
@@ -915,14 +899,16 @@ return value is diffs '(-new -unread -all)."
               (old-folder (nth 4 tmp))
               new-folder)
          (if (eq (cdr (nth 2 tmp)) 'access)
-             (error "can't rename access folder"))
+             (error "Can't rename access folder"))
          (setq new-folder
                (wl-fldmgr-read-string
                 (wl-summary-read-folder old-folder "to rename" t t old-folder)))
          (if (or (wl-folder-entity-exists-p new-folder)
-                 (file-exists-p (elmo-msgdb-expand-path new-folder)))
-             (error "already exists folder: %s" new-folder))
-         (elmo-rename-folder old-folder new-folder)
+                 (file-exists-p (elmo-folder-msgdb-path
+                                 (wl-folder-get-elmo-folder new-folder))))
+             (error "Already exists folder: %s" new-folder))
+         (elmo-folder-rename (wl-folder-get-elmo-folder old-folder)
+                             (wl-folder-get-elmo-folder new-folder))
          (wl-folder-set-entity-info
           new-folder
           (wl-folder-get-entity-info old-folder))
@@ -950,7 +936,7 @@ return value is diffs '(-new -unread -all)."
            (message "Can't insert access group")
          (setq group (or group-name
                          (wl-fldmgr-read-string
-                          (read-from-minibuffer 
+                          (read-from-minibuffer
                            (if access "Access Type Group: " "Group: ")))))
          (when (or access (string-match "[\t ]*/$" group))
            (setq group (if access group
@@ -989,9 +975,10 @@ return value is diffs '(-new -unread -all)."
                  (message "Can't make multi included group folder")
                  (throw 'done nil))
                 (t
-                 (let ((spec (elmo-folder-get-spec (car cut-entity)))
+                 (let ((folder (wl-folder-get-elmo-folder
+                                (car cut-entity)))
                        multi-fld)
-                   (if (eq (car spec) 'multi)
+                   (if (eq (elmo-folder-type-internal folder) 'multi)
                        (setq multi-fld
                              (substring (car cut-entity) 1)))
                    (setq new-entity
@@ -1012,37 +999,16 @@ return value is diffs '(-new -unread -all)."
     (beginning-of-line)
     (if (looking-at wl-folder-group-regexp)
        (message "This folder is group")
-      (let ((tmp (wl-fldmgr-get-path-from-buffer)))
+      (let ((tmp (wl-fldmgr-get-path-from-buffer))
+           entity)
        (if (eq (cdr (nth 2 tmp)) 'access)
-           (message "Tan't change access group")
-         (let* ((entity (nth 4 tmp))
-                (old-entity entity)
-                old-filter
-                filter new-entity)
-           (unless entity (error "no folder"))
-           (when (string-match "^\\(\\(/[^/]+/\\)+\\)\\(.*\\)" entity)
-             (setq old-filter (substring entity
-                                         (match-beginning 1)
-                                         (match-end 1)))
-             (setq old-entity (substring entity
-                                         (match-beginning 3)
-                                         (match-end 3))))
-           (setq filter (completing-read "Filter: "
-                                         wl-fldmgr-filter-completion-alist
-                                         nil nil
-                                         (or old-filter "/")))
-           (unless (or (string= filter "")
-                       (string-match "/$" filter))
-             (setq filter (concat filter "/")))
-           (setq new-entity (concat filter old-entity))
-           (let ((entity new-entity)
-                 spec)
-             ;; check filter syntax
-             (while (eq
-                     (car (setq spec (elmo-folder-get-spec entity)))
-                     'filter)
-               (setq entity (nth 2 spec))))
-           (wl-fldmgr-add new-entity)))))))
+           (message "Can't change access group")
+         (setq entity (nth 4 tmp))
+         (unless entity (error "No folder"))
+         (wl-fldmgr-add (concat "/"
+                                (elmo-read-search-condition
+                                 wl-fldmgr-make-filter-default)
+                                "/" entity)))))))
 
 (defun wl-fldmgr-sort ()
   (interactive)
@@ -1057,7 +1023,7 @@ return value is diffs '(-new -unread -all)."
                      (wl-folder-get-realname (wl-match-buffer 3))
                      wl-folder-entity))
        (message "Sorting...")
-       (setq flist (sort (nth 2 entity) wl-fldmgr-sort-func))
+       (setq flist (sort (nth 2 entity) wl-fldmgr-sort-function))
        (setcar (cddr entity) flist)
        (wl-fldmgr-add-modified-access-list (car entity))
        (setq wl-fldmgr-modified t)
@@ -1074,7 +1040,7 @@ return value is diffs '(-new -unread -all)."
                      (point))))
            (delete-region beg end)
            (wl-folder-insert-entity indent entity)))
-       ;;(wl-fldmgr-reconst-entity-hashtb t t)
+;;;    (wl-fldmgr-reconst-entity-hashtb t t)
        (message "Sorting...done")
        (set-buffer-modified-p nil)))))
 
@@ -1141,8 +1107,8 @@ return value is diffs '(-new -unread -all)."
              (wl-fldmgr-delete-line)
              (when (wl-fldmgr-add folder)
                (wl-folder-maybe-load-folder-list folder)
-;;              (wl-folder-search-group-entity-by-name (car folder)
-;;                                                     wl-folder-entity))
+;;;            (wl-folder-search-group-entity-by-name (car folder)
+;;;                                                   wl-folder-entity)
                (setq execed t)))))
         ((looking-at (format "^[ ]*%s\\(.*\\)" wl-folder-unsubscribe-mark))
          (if (and type (> type 0))
@@ -1242,7 +1208,7 @@ return value is diffs '(-new -unread -all)."
             (old-petname (or (cdr pentry) ""))
             (change)
             petname)
-       (unless name (error "no folder"))
+       (unless name (error "No folder"))
        (if (and is-group
                 (not (eq (nth 1 (wl-folder-search-group-entity-by-name
                                  name wl-folder-entity))
@@ -1272,19 +1238,19 @@ return value is diffs '(-new -unread -all)."
                (progn
                  (if (string= old-petname "")
                      (setq old-petname name))
-                 (while (wl-folder-buffer-search-group old-petname) 
-                   (beginning-of-line)           
+                 (while (wl-folder-buffer-search-group old-petname)
+                   (beginning-of-line)
                    (and (looking-at "^\\([ ]*\\)")
                         (setq indent (wl-match-buffer 1)))
                    (wl-fldmgr-delete-line)
                    (wl-folder-insert-entity
                     indent
-                    (wl-folder-search-group-entity-by-name 
-                     name wl-folder-entity) 
+                    (wl-folder-search-group-entity-by-name
+                     name wl-folder-entity)
                     t)))
              (while (wl-folder-buffer-search-entity name searchname)
                (save-excursion
-                 (beginning-of-line)             
+                 (beginning-of-line)
                  (and (looking-at "^\\([ ]*\\)")
                       (setq indent (wl-match-buffer 1)))
                  (wl-fldmgr-delete-line))
@@ -1350,8 +1316,7 @@ return value is diffs '(-new -unread -all)."
     (message "Saving folders...")
     (set-buffer tmp-buf)
     (erase-buffer)
-    (insert (format wl-fldmgr-folders-header
-                   wl-appname wl-version wl-codename))
+    (insert wl-fldmgr-folders-header)
     (wl-fldmgr-delete-disused-petname)
     (setq save-petname-entities
          (wl-fldmgr-insert-folders-buffer "" (nth 2 wl-folder-entity)))
@@ -1361,7 +1326,7 @@ return value is diffs '(-new -unread -all)."
     (if (and wl-fldmgr-make-backup
             (file-exists-p wl-folders-file))
        (rename-file wl-folders-file (concat wl-folders-file ".bak") t))
-    (let ((output-coding-system (mime-charset-to-coding-system 
+    (let ((output-coding-system (mime-charset-to-coding-system
                                 wl-mime-charset)))
       (write-region
        (point-min)
@@ -1369,7 +1334,7 @@ return value is diffs '(-new -unread -all)."
        wl-folders-file
        nil
        'no-msg)
-      (set-file-modes wl-folders-file 384)) ; 600
+      (set-file-modes wl-folders-file (+ (* 64 6) (* 8 0) 0))) ; chmod 0600
     (kill-buffer tmp-buf)
     (while access-list
       (setq entity (wl-folder-search-group-entity-by-name
@@ -1384,6 +1349,7 @@ return value is diffs '(-new -unread -all)."
     (setq wl-fldmgr-modified-access-list nil)
     (message "Saving folders...done")))
 
-(provide 'wl-fldmgr)
+(require 'product)
+(product-provide (provide 'wl-fldmgr) (require 'wl-version))
 
 ;;; wl-fldmgr.el ends here