2002-05-02  Yuuichi Teranishi  <teranisi@gohome.org>
 
+       * wl-vars.el (wl-summary-line-format-spec-alist): New variable.
+       (wl-summary-line-format): New user option.
+       (wl-folder-summary-line-format-alist): Ditto.
+       (wl-summary-from-width): Abolished.
+
+       * wl-util.el (toplevel): Require 'bytecomp.
+       (wl-line-parse-format): New function.
+       (wl-line-formatter-setup): New macro.
+
+       * wl-summary.el (wl-summary-buffer-number-regexp): Abolished.
+       (wl-summary-buffer-line-formatter): New buffer local variable.
+       (wl-summary-switch-to-clone-buffer): Follow the change above.
+       (wl-summary-message-regexp): Fix.
+       (wl-summary-from-func-internal): Abolished.
+       (wl-summary-subject-func-internal): Ditto.
+       (wl-summary-subject-filter-func-internal): Ditto.
+       (All other related portions are changed.)
+       (wl-summary-buffer-set-folder):
+       Set up wl-summary-buffer-number-column and 
+       wl-summary-buffer-line-formatter
+       (All other related portions are changed.)
+       (wl-summary-buffer-number-column-detect): Abolished.
+       (All other related portions are changed.)
+       (wl-summary-delete-all-status-marks-on-buffer): Removed.
+       (wl-summary-delete-all-temp-marks-on-buffer): Use
+       wl-summary-message-regexp instead of wl-summary-buffer-number-regexp.
+       (wl-summary-target-mark-delete): Ditto.
+       (wl-summary-target-mark-refile-subr): Ditto.
+       (wl-summary-target-mark-mark-as-read): Ditto.
+       (wl-summary-target-mark-mark-as-unread): Ditto.
+       (wl-summary-target-mark-mark-as-important): Ditto.
+       (wl-summary-target-mark-save): Ditto.
+       (wl-summary-replace-status-marks): Renamed from
+       wl-summary-set-status-marks-on-buffer;
+       Use wl-summary-message-regexp instead of
+       wl-summary-buffer-number-regexp.
+       (wl-summary-sync-update): Follow the change above.
+       (wl-summary-goto-previous-message-beginning): New function.
+       (wl-summary-mark-as-unread): Use it.
+       (wl-summary-mark-as-important): Ditto.
+       (wl-summary-line-formatter): New variable.
+       (wl-summary-line-year): New function.
+       (wl-summary-line-day): Ditto.
+       (wl-summary-line-day-of-week): Ditto.
+       (wl-summary-line-hour): Ditto.
+       (wl-summary-line-minute): Ditto.
+       (wl-summary-line-open-bracket): Ditto.
+       (wl-summary-line-close-bracket): Ditto.
+       (wl-summary-line-children-number): Ditto.
+       (wl-summary-line-thread-indent): Ditto.
+       (wl-summary-line-size): Ditto.
+       (wl-summary-line-subject): Ditto.
+       (wl-summary-line-from): Ditto.
+       (wl-summary-line-children-and-from): Ditto.
+       (wl-summary-create-line): Rewritten.
+       (wl-summary-format-date): Abolished.
+
+       * wl-highlight.el (wl-highlight-summary-current-line): Use
+       wl-summary-message-regexp instead of wl-summary-buffer-number-regexp;
+       Use thread structure to detect thread top message.
+
+       * wl-draft.el (wl-default-draft-cite): Don't use
+       wl-summary-from-func-internal.
+
+       * wl-refile.el (wl-refile-subject-learn): Don't use
+       wl-summary-subject-filter-func-internal.
+       (wl-refile-guess-by-subject): Ditto.
+
+       * wl-e21.el (wl-e21-toolbar-configurations): Changed default
+       parameters.
+
+       * wl-thread.el (wl-thread-update-indent-string-region):
+       Use wl-thread-update-line-on-buffer instead of
+       wl-thread-update-indent-string.
+       (wl-thread-update-children-number): Redefine using
+       wl-thread-update-line-on-buffer.
+       (wl-thread-update-indent-string): Abolished.
+
         * Version number is increased to 2.9.11.
 
 2002-05-01  Yuuichi Teranishi  <teranisi@gohome.org>
 
 (defvar wl-summary-buffer-mark-modified nil)
 (defvar wl-summary-buffer-thread-modified nil)
 (defvar wl-summary-buffer-number-column nil)
-(defvar wl-summary-buffer-number-regexp nil)
 (defvar wl-summary-buffer-persistent nil)
 (defvar wl-summary-buffer-thread-nodes nil)
 (defvar wl-summary-buffer-target-mark-list nil)
 (defvar wl-summary-buffer-number-list nil)
 (defvar wl-summary-buffer-msgdb nil)
 (defvar wl-summary-buffer-folder-name nil)
+(defvar wl-summary-buffer-line-formatter nil)
 
 (defvar wl-thread-indent-level-internal nil)
 (defvar wl-thread-have-younger-brother-str-internal nil)
 
 (defvar wl-summary-get-petname-function 'wl-address-get-petname-1)
 
-(defvar wl-summary-message-regexp "^ *\\(-?[0-9]+\\)")
+(defconst wl-summary-message-regexp "^ *-?[0-9]+"
+  "Regexp for the message.")
 
 (defvar wl-summary-shell-command-last "")
 
 (make-variable-buffer-local 'wl-summary-buffer-mark-modified)
 (make-variable-buffer-local 'wl-summary-buffer-thread-modified)
 (make-variable-buffer-local 'wl-summary-buffer-number-column)
-(make-variable-buffer-local 'wl-summary-buffer-number-regexp)
 (make-variable-buffer-local 'wl-summary-buffer-persistent)
 (make-variable-buffer-local 'wl-summary-buffer-thread-nodes)
 (make-variable-buffer-local 'wl-summary-buffer-prev-refile-destination)
 (make-variable-buffer-local 'wl-summary-buffer-number-list)
 (make-variable-buffer-local 'wl-summary-buffer-msgdb)
 (make-variable-buffer-local 'wl-summary-buffer-folder-name)
+(make-variable-buffer-local 'wl-summary-buffer-line-formatter)
 
 ;; internal functions (dummy)
 (unless (fboundp 'wl-summary-append-message-func-internal)
   (defun wl-summary-append-message-func-internal (entity msgdb update
                                                         &optional force-insert)))
-(unless (fboundp 'wl-summary-from-func-internal)
-  (defun wl-summary-from-func-internal (from)
-    from))
-(unless (fboundp 'wl-summary-subject-func-internal)
-  (defun wl-summary-subject-func-internal (subject)
-    subject))
-(unless (fboundp 'wl-summary-subject-filter-func-internal)
-  (defun wl-summary-subject-filter-func-internal (subject)
-    subject))
 
 (defmacro wl-summary-sticky-buffer-name (name)
   (` (concat wl-summary-buffer-name ":" (, name))))
        (wl-get-assoc-list-value
         wl-folder-thread-indent-set-alist
         (elmo-folder-name-internal folder)))
+  (setq wl-summary-buffer-number-column
+       (or (wl-get-assoc-list-value wl-summary-number-column-alist
+                                    (wl-summary-buffer-folder-name))
+           wl-summary-default-number-column))
+  (wl-line-formatter-setup
+   wl-summary-buffer-line-formatter
+   (or (wl-get-assoc-list-value
+       wl-folder-summary-line-format-alist
+       (elmo-folder-name-internal folder))
+       wl-summary-line-format)
+   wl-summary-line-format-spec-alist)
   (setq wl-summary-buffer-persistent
        (wl-folder-persistent-p (elmo-folder-name-internal folder)))
   (elmo-folder-set-persistent-internal folder wl-summary-buffer-persistent)
         expunged)
     (fset 'wl-summary-append-message-func-internal
          (wl-summary-get-append-message-func))
-    (wl-summary-buffer-number-column-detect nil)
     (erase-buffer)
     (message "Re-scanning...")
     (setq i 0)
   (setq wl-summary-buffer-target-mark-list nil)
   (setq wl-summary-buffer-refile-list nil)
   (setq wl-summary-buffer-copy-list nil)
-  (setq wl-summary-buffer-delete-list nil)
-  (wl-summary-buffer-number-column-detect nil))
+  (setq wl-summary-buffer-delete-list nil))
 
 (defun wl-summary-sync (&optional unset-cursor force-range)
   (interactive)
                         "[ "
                         (save-match-data
                           (wl-set-string-width
-                           wl-summary-from-width
-                           (wl-summary-from-func-internal
+                           17
+                           (funcall wl-summary-from-function
                             (eword-decode-string
                              (elmo-delete-char
                               ?\"
          (set-buffer-modified-p nil)
          mark)))))
 
-(defun wl-summary-delete-all-status-marks-on-buffer ()
-  (interactive)
-  (save-excursion
-    (goto-char (point-min))
-    (let ((inhibit-read-only t)
-         (buffer-read-only nil)
-         (case-fold-search nil))
-      (while (re-search-forward
-             (concat "^" wl-summary-buffer-number-regexp ".\\(.\\)") nil t)
-       (delete-region (match-beginning 1) (match-end 1))
-       (insert " ")))))
-
 (defun wl-summary-delete-marks-on-buffer (marks)
   (while marks
     (wl-summary-unmark (pop marks))))
     (let ((inhibit-read-only t)
          (buffer-read-only nil)
          (case-fold-search nil)
-         (regexp (concat "^" wl-summary-buffer-number-regexp "\\([^ ]\\)" )))
+         (regexp (concat wl-summary-message-regexp "\\([^ 0-9]\\)" )))
       (while (re-search-forward regexp nil t)
        (delete-region (match-beginning 1) (match-end 1))
        (insert " ")
                                         wl-summary-new-mark)))
        (save-excursion
          (goto-char (point-min))
-         (while (re-search-forward "^ *\\(-?[0-9]+\\)[^0-9]\\([^0-9 ]\\)" nil t)
+         (while (re-search-forward "^ *\\(-?[0-9]+\\)[^0-9]\\([^0-9 ]\\)"
+                                   nil t)
            (setq msg (string-to-int (wl-match-buffer 1)))
            (setq mark (wl-match-buffer 2))
            (when (and (not (string= mark wl-summary-important-mark))
           (number-alist (elmo-msgdb-get-number-alist msgdb))
           (case-fold-search nil)
           mark number unread new-mark)
-;;;   (re-search-backward "^ *[0-9]+..[0-9]+/[0-9]+" nil t) ; set cursor line
       (beginning-of-line)
       (when (looking-at "^ *\\(-?[0-9]+\\)[^0-9]\\([^0-9]\\)")
        (progn
        (wl-summary-buffer-folder-name)
        (+ wl-summary-buffer-unread-count wl-summary-buffer-new-count)))))
 
-(defun wl-summary-set-status-marks-on-buffer (before after)
-  "Set the MARKS marks on buffer."
+(defun wl-summary-replace-status-marks (before after)
+  "Replace the status marks on buffer."
   (interactive)
   (save-excursion
     (goto-char (point-min))
     (let ((inhibit-read-only t)
          (buffer-read-only nil)
-         (regexp (concat "^" wl-summary-buffer-number-regexp ".\\(\\%s\\)")))
+         (regexp (concat wl-summary-message-regexp ".\\(\\%s\\)")))
       (while (re-search-forward
              (format regexp (regexp-quote before)) nil t)
        (delete-region (match-beginning 1) (match-end 1))
                  (wl-summary-delete-messages-on-buffer delete-list "Deleting...")
                  (message "Deleting...done"))
                (when new-msgdb
-                 (wl-summary-set-status-marks-on-buffer
+                 (wl-summary-replace-status-marks
                   wl-summary-new-mark
                   wl-summary-unread-uncached-mark))
                (setq append-list (elmo-msgdb-get-overview new-msgdb))
               (+ (car pair) (cdr pair)))
             (elmo-folder-messages folder)))
       (wl-summary-update-modeline)
-      (wl-summary-buffer-number-column-detect t)
       ;;
       (unless unset-cursor
        (goto-char (point-min))
                   wl-summary-buffer-target-mark-list
                   wl-summary-buffer-elmo-folder
                   wl-summary-buffer-number-column
-                  wl-summary-buffer-number-regexp
                   wl-summary-buffer-message-modified
                   wl-summary-buffer-mark-modified
                   wl-summary-buffer-thread-modified
                   wl-summary-buffer-number-list
                   wl-summary-buffer-msgdb
-                  wl-summary-buffer-folder-name)
+                  wl-summary-buffer-folder-name
+                  wl-summary-buffer-line-formatter)
                 (and (eq wl-summary-buffer-view 'thread)
                      '(wl-thread-entity-hashtb
                        wl-thread-entities
            (wl-summary-update-modeline)))
       (unless (eq wl-summary-buffer-view 'thread)
        (wl-summary-make-number-list))
-      (wl-summary-buffer-number-column-detect t)
       (wl-summary-toggle-disp-msg (if wl-summary-buffer-disp-msg 'on 'off))
       (unless (and reuse-buf keep-cursor)
        ;(setq hilit wl-summary-highlight)
       (set-buffer-modified-p nil))
     retval))
 
+(defun wl-summary-goto-previous-message-beginning ()
+  (end-of-line)
+  (re-search-backward wl-summary-message-regexp nil t)
+  (beginning-of-line))
+
 (defun wl-summary-goto-top-of-current-thread ()
   (wl-summary-jump-to-msg
    (wl-thread-entity-get-number
     (elmo-replace-in-string subject "^\\[.*\\]" "")))
 
 (defun wl-summary-subject-equal (subject1 subject2)
-  (string= (wl-summary-subject-filter-func-internal subject1)
-          (wl-summary-subject-filter-func-internal subject2)))
+  (string= (funcall wl-summary-subject-filter-function subject1)
+          (funcall wl-summary-subject-filter-function subject2)))
 
 (defmacro wl-summary-put-alike (alike)
   (` (elmo-set-hash-val (format "#%d" (wl-count-lines))
           overview
           (function
            (lambda (x)
-             (wl-summary-subject-filter-func-internal
+             (funcall wl-summary-subject-filter-function
               (elmo-msgdb-overview-entity-get-subject-no-decode x))))
           t))
-       (setq match (wl-summary-subject-filter-func-internal
-                    (elmo-msgdb-overview-entity-get-subject entity)))
+       (setq match (funcall wl-summary-subject-filter-function
+                            (elmo-msgdb-overview-entity-get-subject entity)))
        (if (string= match "")
            (setq match "\n"))
        (goto-char (point-min))
            (message "No message.")
          (end-of-line)
          (setq eol (point))
-         (re-search-backward (concat "^" wl-summary-buffer-number-regexp
-                                     "..../..")) ; set cursor line
-         (beginning-of-line)))
+         (wl-summary-goto-previous-message-beginning)))
       (if (or (and (not visible)
                   ;; already exists in msgdb.
                   (assq number (elmo-msgdb-get-number-alist msgdb)))
   (interactive)
   (save-excursion
     (goto-char (point-min))
-    (let ((regexp (concat "^" wl-summary-buffer-number-regexp "\\(\\*\\)"))
+    (let ((regexp (concat wl-summary-message-regexp "\\(\\*\\)"))
          number mlist)
       (while (re-search-forward regexp nil t)
        (let (wl-summary-buffer-disp-msg)
        regexp number msgid entity folder mlist)
     (save-excursion
       (goto-char (point-min))
-      (setq regexp (concat "^" wl-summary-buffer-number-regexp "\\(\\*\\)"))
+      (setq regexp (concat wl-summary-message-regexp "\\(\\*\\)"))
       ;; guess by first mark
       (when (re-search-forward regexp nil t)
        (setq msgid (cdr (assq (setq number (wl-summary-message-number))
   (interactive)
   (save-excursion
     (goto-char (point-min))
-    (let ((regexp (concat "^" wl-summary-buffer-number-regexp "\\(\\*\\)"))
+    (let ((regexp (concat wl-summary-message-regexp "\\(\\*\\)"))
          (inhibit-read-only t)
          (buffer-read-only nil)
          number mlist)
   (interactive)
   (save-excursion
     (goto-char (point-min))
-    (let ((regexp (concat "^" wl-summary-buffer-number-regexp "\\(\\*\\)"))
+    (let ((regexp (concat wl-summary-message-regexp "\\(\\*\\)"))
          (inhibit-read-only t)
          (buffer-read-only nil)
          number mlist)
   (interactive)
   (save-excursion
     (goto-char (point-min))
-    (let ((regexp (concat "^" wl-summary-buffer-number-regexp "\\(\\*\\)"))
+    (let ((regexp (concat wl-summary-message-regexp "\\(\\*\\)"))
          (inhibit-read-only t)
          (buffer-read-only nil)
          number mlist)
     (let ((wl-save-dir
           (wl-read-directory-name "Save to directory: "
                                   wl-temporary-file-directory))
-         (regexp (concat "^" wl-summary-buffer-number-regexp "\\(\\*\\)"))
+         (regexp (concat wl-summary-message-regexp "\\(\\*\\)"))
          number mlist)
       (if (null (file-exists-p wl-save-dir))
          (make-directory wl-save-dir))
              (setq visible nil))
          (end-of-line)
          (setq eol (point))
-         (re-search-backward (concat "^" wl-summary-buffer-number-regexp
-                                     "..../..") nil t)) ; set cursor line
-       (beginning-of-line))
+         (wl-summary-goto-previous-message-beginning)))
       (if (or (and (not visible)
                   (assq number (elmo-msgdb-get-number-alist msgdb)))
              (re-search-forward "^ *\\(-?[0-9]+\\)[^0-9]\\([^0-9]\\)" eol t))
   (set-buffer-modified-p nil)
   number)
 
-(defsubst wl-summary-format-date (date-string)
-  (condition-case nil
-      (let ((datevec (timezone-fix-time date-string nil
-                                       wl-summary-fix-timezone)))
-       (format "%02d/%02d(%s)%02d:%02d"
-               (aref datevec 1)
-               (aref datevec 2)
-               (elmo-date-get-week (aref datevec 0)
-                                   (aref datevec 1)
-                                   (aref datevec 2))
-               (aref datevec 3)
-               (aref datevec 4)))
-    (error "??/??(??)??:??")))
-
-(defun wl-summary-create-line (entity parent temp-mark
-                                     &optional
-                                     thr-children-number
-                                     thr-indent-string
-                                     thr-linked)
-  "Create a summary line."
-  (let ((wl-mime-charset wl-summary-buffer-mime-charset)
-       (elmo-mime-charset wl-summary-buffer-mime-charset)
-       (folder wl-summary-buffer-elmo-folder)
-       (number (elmo-msgdb-overview-entity-get-number entity))
-       (thr-indent-string (or thr-indent-string ""))
-       no-parent from subject parent-raw-subject parent-subject
-       line mark
-       (elmo-lang wl-summary-buffer-weekday-name-lang)
-       (children-num (if thr-children-number
-                         (int-to-string thr-children-number))))
-    (if (string= thr-indent-string "")
+;;; Summary line.
+(defvar wl-summary-line-formatter nil)
+
+(defvar wl-datevec)
+(defvar wl-thr-indent-string)
+(defvar wl-thr-children-number)
+(defvar wl-thr-linked)
+(defvar wl-message-entity)
+(defvar wl-parent-message-entity)
+
+(defun wl-summary-line-year ()
+  (aref wl-datevec 0))
+(defun wl-summary-line-month ()
+  (format "%02d" (aref wl-datevec 1)))
+(defun wl-summary-line-day ()
+  (format "%02d" (aref wl-datevec 2)))
+(defun wl-summary-line-day-of-week ()
+  (elmo-date-get-week (aref wl-datevec 0)
+                     (aref wl-datevec 1)
+                     (aref wl-datevec 2)))
+(defun wl-summary-line-hour ()
+  (format "%02d" (aref wl-datevec 3)))
+(defun wl-summary-line-minute ()
+  (format "%02d" (aref wl-datevec 4)))
+(defun wl-summary-line-open-bracket ()
+  (if wl-thr-linked "<" "["))
+(defun wl-summary-line-close-bracket ()
+  (if wl-thr-linked ">" "]"))
+(defun wl-summary-line-children-number ()
+  (if wl-thr-children-number
+      (concat "+" (int-to-string wl-thr-children-number) ":")
+    ""))
+(defun wl-summary-line-thread-indent ()
+  (or wl-thr-indent-string ""))
+
+(defun wl-summary-line-size ()
+  (let ((size (elmo-msgdb-overview-entity-get-size wl-message-entity)))
+    (if size
+       (cond
+        ((<= 1 (/ size 1048576))
+         (format "%.0fM" (/ size 1048576.0)))
+        ((<= 1 (/ size 1024))
+         (format "%.0fK" (/ size 1024.0)))
+        (t (format "%dB" size)))
+      "")))
+
+(defun wl-summary-line-subject ()
+  (let (no-parent subject parent-raw-subject parent-subject)
+    (if (string= wl-thr-indent-string "")
        (setq no-parent t)) ; no parent
-    (if (and wl-summary-indent-length-limit
-            (< wl-summary-indent-length-limit
-               (string-width thr-indent-string)))
-       (setq thr-indent-string (wl-set-string-width
-                                wl-summary-indent-length-limit
-                                thr-indent-string)))
-    (setq from
-         (wl-set-string-width
-          (if children-num
-              (- wl-summary-from-width (length children-num) 2)
-            wl-summary-from-width)
-          (elmo-delete-char ?\n
-                            (wl-summary-from-func-internal
-                             (elmo-msgdb-overview-entity-get-from entity)))))
     (setq subject
          (elmo-delete-char ?\n
                            (or (elmo-msgdb-overview-entity-get-subject
-                                entity)
+                                wl-message-entity)
                                wl-summary-no-subject-message)))
     (setq parent-raw-subject
-         (elmo-msgdb-overview-entity-get-subject parent))
+         (elmo-msgdb-overview-entity-get-subject wl-parent-message-entity))
     (setq parent-subject
          (if parent-raw-subject
              (elmo-delete-char ?\n parent-raw-subject)))
-    (setq line
+    (setq subject
+         (if (or no-parent
+                 (null parent-subject)
+                 (not (wl-summary-subject-equal
+                       subject parent-subject)))
+             (funcall wl-summary-subject-function subject)
+           ""))
+    (if (and (not wl-summary-width)
+            wl-summary-subject-length-limit)
+       (truncate-string subject 
+                        wl-summary-subject-length-limit)
+      subject)))
+
+(defun wl-summary-line-from ()
+  (elmo-delete-char ?\n
+                   (funcall wl-summary-from-function
+                            (elmo-msgdb-overview-entity-get-from
+                             wl-message-entity))))
+
+(defun wl-summary-line-children-and-from ()
+  (concat
+   (wl-summary-line-children-number) " "
+   (wl-summary-line-from)))
+
+(defun wl-summary-create-line (wl-message-entity
+                              wl-parent-message-entity
+                              temp-mark
+                              &optional
+                              wl-thr-children-number
+                              wl-thr-indent-string
+                              wl-thr-linked)
+  "Create a summary line."
+  (let ((wl-mime-charset wl-summary-buffer-mime-charset)
+       (elmo-mime-charset wl-summary-buffer-mime-charset)
+       (elmo-lang wl-summary-buffer-weekday-name-lang)
+       (wl-datevec (timezone-fix-time
+                    (elmo-msgdb-overview-entity-get-date 
+                     wl-message-entity)
+                    nil
+                    wl-summary-fix-timezone))
+       line mark)
+    (if (and wl-summary-indent-length-limit
+            (< wl-summary-indent-length-limit
+               (string-width wl-thr-indent-string)))
+       (setq wl-thr-indent-string (wl-set-string-width
+                                   wl-summary-indent-length-limit
+                                   wl-thr-indent-string)))
+    (setq line 
          (concat
-          (format (concat "%"
-                          (int-to-string
-                           wl-summary-buffer-number-column)
-                          "s%s%s%s %s")
-                  number
-                  (or temp-mark " ")
-                  (setq mark (or (elmo-message-mark folder number) " "))
-                  (wl-summary-format-date
-                   (elmo-msgdb-overview-entity-get-date entity))
-                  (or thr-indent-string ""))
-          (format (if thr-linked
-                      "<%s > %s"
-                    "[%s ] %s")
-                  (if children-num
-                      (concat "+" children-num ": " from)
-                    (concat " " from))
-                  (progn
-                    (setq subject
-                          (if (or no-parent
-                                  (null parent-subject)
-                                  (not (wl-summary-subject-equal
-                                        subject parent-subject)))
-                              (wl-summary-subject-func-internal subject) ""))
-                    (if (and (not wl-summary-width)
-                             wl-summary-subject-length-limit)
-                        (truncate-string subject 
-                                         wl-summary-subject-length-limit)
-                      subject)))))
+          (format
+           (concat "%"
+                   (number-to-string wl-summary-buffer-number-column)
+                   "s%s%s")
+           (number-to-string
+            (elmo-msgdb-overview-entity-get-number wl-message-entity))
+           (or temp-mark " ")
+           (setq mark
+                 (or (elmo-msgdb-get-mark
+                      (wl-summary-buffer-msgdb)
+                      (elmo-msgdb-overview-entity-get-number
+                       wl-message-entity))
+                     " ")))
+          (funcall wl-summary-buffer-line-formatter)))
     (if wl-summary-width (setq line
                               (wl-set-string-width
                                (- wl-summary-width 1) line)))
        (wl-highlight-summary-line-string line
                                          mark
                                          temp-mark
-                                         thr-indent-string))
+                                         wl-thr-indent-string))
     line))
 
-(defsubst wl-summary-buffer-number-column-detect (update)
-  (let (end)
-    (save-excursion
-      (goto-char (point-min))
-      (setq wl-summary-buffer-number-column
-           (or
-            (if (and update
-                     (setq end (if (re-search-forward
-                                    "^ *-?[0-9]+[^0-9]" nil t)
-                                   (point))))
-                (- end (progn (beginning-of-line) (point)) 1))
-            (wl-get-assoc-list-value wl-summary-number-column-alist
-                                     (wl-summary-buffer-folder-name))
-            wl-summary-default-number-column))
-      (setq wl-summary-buffer-number-regexp
-           (wl-repeat-string "." wl-summary-buffer-number-column)))))
-
 (defsubst wl-summary-proc-wday (wday-str year month mday)
   (save-match-data
     (if (string-match "\\([A-Z][a-z][a-z]\\).*" wday-str)
        goto-next regex-list regex next-entity finfo)
     (beginning-of-line)
     (if (elmo-folder-plugged-p wl-summary-buffer-elmo-folder)
-       (setq regex (format "^%s[^%s]"
-                           wl-summary-buffer-number-regexp
+       (setq regex (format "%s[^%s]"
+                           wl-summary-message-regexp
                            skip-mark-regexp))
-      (setq regex (format "^%s[^%s]\\(%s\\|%s\\| \\)"
-                         wl-summary-buffer-number-regexp
+      (setq regex (format "%s[^%s]\\(%s\\|%s\\| \\)"
+                         wl-summary-message-regexp
                          skip-mark-regexp
                          (regexp-quote wl-summary-unread-cached-mark)
                          (regexp-quote wl-summary-important-mark))))
        goto-next regex regex-list next-entity finfo)
     (end-of-line)
     (if (elmo-folder-plugged-p wl-summary-buffer-elmo-folder)
-       (setq regex (format "^%s[^%s]"
-                           wl-summary-buffer-number-regexp
+       (setq regex (format "%s[^%s]"
+                           wl-summary-message-regexp
                            skip-mark-regexp))
-      (setq regex (format "^%s[^%s]\\(%s\\|%s\\| \\)"
-                         wl-summary-buffer-number-regexp
+      (setq regex (format "%s[^%s]\\(%s\\|%s\\| \\)"
+                         wl-summary-message-regexp
                          skip-mark-regexp
                          (regexp-quote wl-summary-unread-cached-mark)
                          (regexp-quote wl-summary-important-mark))))