+(defun wl-folder-virtual ()
+ "Goto virtual folder."
+ (interactive)
+ (let ((entity (wl-folder-get-entity-from-buffer)))
+ (if (wl-folder-buffer-group-p)
+ (setq entity
+ (concat
+ "*"
+ (mapconcat 'identity
+ (wl-folder-get-entity-list
+ (wl-folder-search-group-entity-by-name
+ entity
+ wl-folder-entity)) ","))))
+ (unless entity (error "No folder"))
+ (wl-folder-goto-folder-subr
+ (concat "/"
+ (elmo-read-search-condition
+ wl-fldmgr-make-filter-default)
+ "/" entity))))
+
+(defun wl-folder-pick ()
+ (interactive)
+ (save-excursion
+ (let* ((condition (car (elmo-parse-search-condition
+ (elmo-read-search-condition
+ wl-summary-pick-field-default))))
+ (entity (wl-folder-get-entity-from-buffer))
+ (folder-list
+ (if (wl-folder-buffer-group-p)
+ (wl-folder-get-entity-list
+ (wl-folder-search-group-entity-by-name
+ entity
+ wl-folder-entity))
+ (list entity)))
+ results ret)
+ (while (car folder-list)
+ (setq ret (elmo-folder-search
+ (wl-folder-get-elmo-folder (car folder-list))
+ condition))
+ (if ret
+ (setq results
+ (append results
+ (list (cons (car folder-list) ret)))))
+ (setq folder-list (cdr folder-list)))
+ (if results
+ (message "%s are picked."
+ (mapconcat '(lambda (res)
+ (format "%s(%d)"
+ (car res)
+ (length (cdr res))))
+ results
+ ","))
+ (message "No message was picked.")))))
+
+(defun wl-folder-jump-to-next-summary ()
+ (interactive)
+ (when (wl-collect-summary)
+ (if (get-buffer-window (car (wl-collect-summary)))
+ (switch-to-buffer-other-window (car (wl-collect-summary))))
+ (wl-summary-next-buffer)))
+
+(defun wl-folder-jump-to-previous-summary ()
+ (interactive)
+ (when (wl-collect-summary)
+ (if (get-buffer-window (car (wl-collect-summary)))
+ (switch-to-buffer-other-window (car (wl-collect-summary))))
+ (wl-summary-previous-buffer)))
+
+;;;
+;; Completion
+(defvar wl-folder-complete-folder-candidate nil)
+
+(defun wl-folder-complete-folder (string predicate flag)
+ (cond ((or (string-match "^\\(/[^/]*/\\)\\(.*\\)$" string) ; filter
+ (string-match "^\\(\*\\|\*.*,\\)\\([^,]*\\)$" string) ; multi
+ (string-match "^\\(|[^|]*|:?\\)\\(.*\\)$" string) ;pipe-src
+ (string-match "^\\(|\\)\\([^|]*\\)$" string)) ;pipe-dst
+ (let* ((str1 (match-string 1 string))
+ (str2 (match-string 2 string))
+ (str2-comp (wl-folder-complete-folder str2 predicate flag)))
+ (cond
+ ((listp str2-comp) ; flag=t
+ (mapcar (lambda (x) (concat str1 x)) str2-comp))
+ ((stringp str2-comp)
+ (concat str1 str2-comp))
+ (t
+ str2-comp))))
+ ((string-match "^\\(/\\)\\([^/]*\\)$" string) ; filter-condition
+ (let* ((str1 (match-string 1 string))
+ (str2 (match-string 2 string))
+ (str2-comp
+ (wl-folder-complete-filter-condition str2 predicate flag)))
+ (cond
+ ((listp str2-comp) ; flag=t
+ (mapcar (lambda (x) (concat str1 x)) str2-comp))
+ ((stringp str2-comp)
+ (concat str1 str2-comp))
+ (t
+ str2-comp))))
+ (t
+ (let ((candidate
+ (or wl-folder-complete-folder-candidate
+ (if (memq 'read-folder wl-use-folder-petname)
+ (wl-folder-get-entity-with-petname)
+ wl-folder-entity-hashtb))))
+ (if (not flag)
+ (try-completion string candidate)
+ (all-completions string candidate))))))
+
+(defun wl-folder-complete-filter-condition (string predicate flag)
+ (cond
+ ((string-match "^\\(.*|\\|.*&\\|.*!\\|.*(\\)\\([^:]*\\)$" string)
+ (let* ((str1 (match-string 1 string))
+ (str2 (match-string 2 string))
+ (str2-comp
+ (wl-folder-complete-filter-condition str2 predicate flag)))
+ (cond
+ ((listp str2-comp) ; flag=t
+ (mapcar (lambda (x) (concat str1 x)) str2-comp))
+ ((stringp str2-comp)
+ (concat str1 str2-comp))
+ (t
+ str2-comp))))
+ (t
+ (let ((candidate
+ (mapcar (lambda (x) (list (concat (downcase x) ":")))
+ (append '("last" "first"
+ "from" "subject" "to" "cc" "body"
+ "since" "before" "tocc")
+ elmo-msgdb-extra-fields))))
+ (if (not flag)
+ (try-completion string candidate)
+ (all-completions string candidate))))))
+