* wl-score.el (wl-summary-score-update-all-lines): Use
[elisp/wanderlust.git] / wl / wl-fldmgr.el
index fc4277f..caced28 100644 (file)
@@ -1,4 +1,4 @@
-;;; wl-fldmgr.el -- Folder manager for Wanderlust.
+;;; wl-fldmgr.el --- Folder manager for Wanderlust.
 
 ;; Copyright 1998,1999,2000 Masahiro MURATA <muse@ba2.so-net.ne.jp>
 ;;                          Yuuichi Teranishi <teranisi@gohome.org>
 ;;
 
 ;;; Commentary:
-;; 
+;;
 
 ;;; Code:
-;; 
+;;
 
 (require 'wl-folder)
 (require 'wl-summary)
@@ -51,6 +51,9 @@
 # Folder definition file
 # This file is generated automatically by %s.
 #
+# If you edit this file by hand, be sure that comment lines
+# will be washed out by wl-fldmgr.
+#
 
 " (product-string-1 'wl-version t)))
 
@@ -384,11 +387,11 @@ return value is diffs '(-new -unread -all)."
            (cond
             ((stringp (car new2)) ;; folder
              (cond
-              ((wl-string-member (car new2) flist)
+              ((elmo-string-member (car new2) flist)
                (and errmes (message "%s: already exists" (car new2)))
                (throw 'success nil))
               ((and access
-                    (not (wl-string-member (car new2) unsubscribes)))
+                    (not (elmo-string-member (car new2) unsubscribes)))
                (and errmes (message "%s: not access group folder" (car new2)))
                (throw 'success nil))))
             (t                    ;; group
@@ -410,7 +413,7 @@ return value is diffs '(-new -unread -all)."
                (setq unsubscribes (delete (elmo-string (car new2))
                                           unsubscribes)))
              (setq new2 (cdr new2)))
-           (setcdr (cddr entity) (list unsubscribes))
+           (setcdr (cddr entity) (list unsubscribes))
            (wl-fldmgr-add-modified-access-list group))
          (if (not key-path);; insert group top
              (if (cddr entity)
@@ -458,6 +461,7 @@ return value is diffs '(-new -unread -all)."
 ;;;                     (wl-fldmgr-get-entity-id (cdr previous-entity))))))
        (wl-folder-prev-entity-skip-invalid))
       (if (and prev
+              (wl-folder-buffer-group-p)
               (looking-at wl-folder-group-regexp)
               (string= (wl-match-buffer 2) "-"))
          (setq group-target nil)
@@ -593,7 +597,8 @@ return value is diffs '(-new -unread -all)."
                    (wl-delete-entity path nil wl-folder-entity clear)))
          (setq wl-fldmgr-modified t)
          ;;
-         (if (looking-at wl-folder-group-regexp)
+         (if (and (wl-folder-buffer-group-p)
+                  (looking-at wl-folder-group-regexp))
              ;; group
              (let (beg end indent opened)
                (setq indent (wl-match-buffer 1))
@@ -647,7 +652,7 @@ return value is diffs '(-new -unread -all)."
        (while (< (point) to)
          (and (looking-at "^\\([ ]*\\)")
               (setq indent (wl-match-buffer 1)))
-         (if (looking-at wl-folder-group-regexp)
+         (if (wl-folder-buffer-group-p)
              (progn
                (setq errmes "can't copy group folder")
                (throw 'err t)))
@@ -685,7 +690,7 @@ return value is diffs '(-new -unread -all)."
     (beginning-of-line)
     (let ((ret-val nil))
       (if (and (not ename)
-              (looking-at wl-folder-group-regexp))
+              (wl-folder-buffer-group-p))
          (message "Can't copy group folder")
        (let* ((name (or ename (wl-folder-get-entity-from-buffer)))
               (entity (elmo-string name)))
@@ -751,57 +756,58 @@ 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 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-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 "\\.$" 
+                          (elmo-folder-prefix-internal
+                           (wl-folder-get-elmo-folder string)))
+            (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-folder-type-alist)
+          (when (assq (aref string 0) elmo-folder-type-alist)
+            (delq nil (mapcar
+                       (function list)
+                       (condition-case nil
+                           (wl-fldmgr-add-completion-all-completions string)
+                         (error nil))))))))
+    (cond
+     ((null flag)
+      (try-completion string table predicate))
+     ((eq flag 'lambda)
+      (eq t (try-completion string table predicate)))
+     (t
+      (all-completions string table predicate)))))
 
 (defun wl-fldmgr-add (&optional name)
   (interactive)
@@ -809,7 +815,7 @@ return value is diffs '(-new -unread -all)."
     (beginning-of-line)
     (let ((ret-val nil)
          (inhibit-read-only t)
-         (wl-folder-completion-function
+         (wl-folder-complete-folder-candidate
           (if wl-fldmgr-add-complete-with-current-folder-list
               (function wl-fldmgr-add-completion-subr)))
          tmp indent path diffs)
@@ -822,7 +828,9 @@ 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.
-       (elmo-folder-set-plugged (wl-folder-get-elmo-folder name) wl-plugged t)
+       (elmo-folder-set-plugged (wl-folder-get-elmo-folder
+                                 (if (listp name) (car name) name))
+                                wl-plugged t)
        (when (setq diffs
                    (wl-add-entity
                     path (list name) wl-folder-entity (nth 3 tmp) t))
@@ -837,20 +845,13 @@ return value is diffs '(-new -unread -all)."
   (interactive)
   (save-excursion
     (beginning-of-line)
-    (if (looking-at wl-folder-group-regexp)
+    (if (wl-folder-buffer-group-p)
        (error "Can't delete group folder"))
     (let* ((inhibit-read-only t)
           (tmp (wl-fldmgr-get-path-from-buffer))
           (entity (elmo-string (nth 4 tmp)))
-          (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 want to delete \"%s\"? "
-                                (if (> (length msgs) 0)
-                                    (format "%d msg(s) exists. " (length msgs))
-                                  "")
-                                entity))
-       (elmo-folder-delete folder)
+          (folder (wl-folder-get-elmo-folder entity)))
+      (when (elmo-folder-delete folder)
        (wl-fldmgr-cut tmp nil t)))))
 
 (defun wl-fldmgr-rename ()
@@ -860,9 +861,10 @@ return value is diffs '(-new -unread -all)."
     (if (bobp)
        (message "Can't rename desktop group")
       (cond
-       ((looking-at wl-folder-group-regexp) ;; group
+       ((and (wl-folder-buffer-group-p)
+            (looking-at wl-folder-group-regexp)) ;; group
        (let* ((indent (wl-match-buffer 1))
-              (old-group (wl-folder-get-realname (wl-match-buffer 3)))
+              (old-group (wl-folder-get-entity-from-buffer))
               (group-entity (wl-folder-search-group-entity-by-name
                              old-group wl-folder-entity))
               group)
@@ -889,17 +891,16 @@ return value is diffs '(-new -unread -all)."
 ;;;                (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
-                    indent
-                    group-entity t)
+                   (wl-folder-insert-entity
+                    indent
+                    group-entity t)
                    (setq wl-fldmgr-modified t)
                    (set-buffer-modified-p nil)))))))))
        (t ;; folder
        (let* ((tmp (wl-fldmgr-get-path-from-buffer))
               (old-folder (nth 4 tmp))
               new-folder)
-         (if (eq (cdr (nth 2 tmp)) 'access)
-             (error "Can't rename access folder"))
+         (unless old-folder (error "No folder"))
          (setq new-folder
                (wl-fldmgr-read-string
                 (wl-summary-read-folder old-folder "to rename" t t old-folder)))
@@ -907,13 +908,29 @@ return value is diffs '(-new -unread -all)."
                  (file-exists-p (elmo-folder-msgdb-path
                                  (wl-folder-get-elmo-folder new-folder))))
              (error "Already exists folder: %s" new-folder))
+         (if (and (eq (cdr (nth 2 tmp)) 'access)
+                  (null wl-fldmgr-allow-rename-access-group)
+                  (null (string-match
+                         (format "^%s" (regexp-quote (car (nth 2 tmp))))
+                         new-folder)))
+             (error "Can't rename access folder"))
          (elmo-folder-rename (wl-folder-get-elmo-folder old-folder)
                              new-folder)
          (wl-folder-set-entity-info
           new-folder
           (wl-folder-get-entity-info old-folder))
-         (when (wl-fldmgr-cut tmp nil t)
-           (wl-fldmgr-add new-folder))))))))
+         (wl-folder-clear-entity-info old-folder)
+         (if (eq (cdr (nth 2 tmp)) 'access)
+
+             ;; force update access group
+             (progn
+               (wl-folder-open-close)
+               (wl-folder-jump-to-current-entity t)
+               (message "%s is renamed to %s" old-folder new-folder)
+               (sit-for 1))
+           ;; update folder list
+           (when (wl-fldmgr-cut tmp nil t)
+             (wl-fldmgr-add new-folder)))))))))
 
 (defun wl-fldmgr-make-access-group ()
   (interactive)
@@ -929,7 +946,7 @@ return value is diffs '(-new -unread -all)."
            (type 'group)
            group tmp indent path new prev-id flist diffs)
        (setq tmp (wl-fldmgr-get-path-from-buffer t))
-       (setq path (car tmp))
+       (setq path (car tmp))
        (setq indent (wl-fldmgr-make-indent (nth 1 tmp)))
        (setq prev-id (nth 3 tmp))
        (if (eq (cdr (nth 2 tmp)) 'access)
@@ -938,6 +955,8 @@ return value is diffs '(-new -unread -all)."
                          (wl-fldmgr-read-string
                           (read-from-minibuffer
                            (if access "Access Type Group: " "Group: ")))))
+         ;; To check the folder name is correct.
+         (if access (elmo-make-folder group))
          (when (or access (string-match "[\t ]*/$" group))
            (setq group (if access group
                          (substring group 0 (match-beginning 0))))
@@ -997,37 +1016,45 @@ return value is diffs '(-new -unread -all)."
   (interactive)
   (save-excursion
     (beginning-of-line)
-    (if (looking-at wl-folder-group-regexp)
-       (message "This folder is group")
-      (let ((tmp (wl-fldmgr-get-path-from-buffer))
-           entity)
-       (if (eq (cdr (nth 2 tmp)) 'access)
-           (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)
+    (let ((tmp (wl-fldmgr-get-path-from-buffer))
+         entity)
+      (if (eq (cdr (nth 2 tmp)) 'access)
+         (message "Can't change access group")
+       (if (wl-folder-buffer-group-p)
+           (setq entity
+                 (concat
+                  "*"
+                  (mapconcat 'identity
+                             (wl-folder-get-entity-list
+                              (wl-folder-search-group-entity-by-name
+                               (nth 4 tmp)
+                               wl-folder-entity)) ",")))
+         (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 (&optional arg)
+  (interactive "P")
   (save-excursion
     (beginning-of-line)
     (let ((inhibit-read-only t)
          entity flist indent opened)
-      (when (looking-at wl-folder-group-regexp)
+      (when (and (wl-folder-buffer-group-p)
+                (looking-at wl-folder-group-regexp))
        (setq indent (wl-match-buffer 1))
        (setq opened (wl-match-buffer 2))
        (setq entity (wl-folder-search-group-entity-by-name
-                     (wl-folder-get-realname (wl-match-buffer 3))
+                     (wl-folder-get-entity-from-buffer)
                      wl-folder-entity))
        (message "Sorting...")
        (setq flist (sort (nth 2 entity) wl-fldmgr-sort-function))
+       (when arg (setq flist (nreverse flist)))
        (setcar (cddr entity) flist)
        (wl-fldmgr-add-modified-access-list (car entity))
        (setq wl-fldmgr-modified t)
-       ;;
        (when (string= opened "-")
          (let (beg end)
            (setq beg (point))
@@ -1040,7 +1067,6 @@ 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)
        (message "Sorting...done")
        (set-buffer-modified-p nil)))))
 
@@ -1120,7 +1146,7 @@ return value is diffs '(-new -unread -all)."
         (t
          (if (and type (< type 0))
              nil
-           (setq is-group (looking-at wl-folder-group-regexp))
+           (setq is-group (wl-folder-buffer-group-p))
            (setq tmp (wl-fldmgr-get-path-from-buffer))
            (setq indent (wl-fldmgr-make-indent (nth 1 tmp)))
            (if (eq (cdr (nth 2 tmp)) 'access)
@@ -1156,13 +1182,15 @@ return value is diffs '(-new -unread -all)."
     (let ((inhibit-read-only t)
          entity indent opened
          unsubscribes beg)
-      (when (not (looking-at wl-folder-group-regexp))
+      (when (not
+            (and (wl-folder-buffer-group-p)
+                 (looking-at wl-folder-group-regexp)))
        (wl-folder-goto-top-of-current-folder)
        (looking-at wl-folder-group-regexp))
       (setq indent (wl-match-buffer 1))
       (setq opened (wl-match-buffer 2))
       (setq entity (wl-folder-search-group-entity-by-name
-                   (wl-folder-get-realname (wl-match-buffer 3))
+                   (wl-folder-get-entity-from-buffer)
                    wl-folder-entity))
       (when (eq (nth 1 entity) 'access)
        (save-excursion
@@ -1201,7 +1229,7 @@ return value is diffs '(-new -unread -all)."
   (interactive)
   (save-excursion
     (beginning-of-line)
-      (let* ((is-group (looking-at wl-folder-group-regexp))
+      (let* ((is-group (wl-folder-buffer-group-p))
             (name (wl-folder-get-entity-from-buffer))
             (searchname (wl-folder-get-petname name))
             (pentry (wl-string-assoc name wl-folder-petname-alist))
@@ -1275,10 +1303,8 @@ return value is diffs '(-new -unread -all)."
                       "")
                     "\n"))
            ((consp name)
-            (let ((group (wl-folder-get-realname (car name)))
+            (let ((group (car name))
                   (type (nth 1 name)))
-              (if (not (string= group (car name))) ; petname.
-                  (wl-append pet-entities (list (car name))))
               (cond ((eq type 'group)
                      (insert indent group "{\n")
                      (setq pet-entities
@@ -1320,7 +1346,7 @@ return value is diffs '(-new -unread -all)."
     (wl-fldmgr-delete-disused-petname)
     (setq save-petname-entities
          (wl-fldmgr-insert-folders-buffer "" (nth 2 wl-folder-entity)))
-    (insert "\n# petname definition (group, folder in access group)\n")
+    (insert "\n# petname definition (access group, folder in access group)\n")
     (wl-fldmgr-insert-petname-buffer save-petname-entities)
     (insert "\n# end of file.\n")
     (if (and wl-fldmgr-make-backup