diff lisp/speedbar.el @ 56647:d21a8e697065

(speedbar-scan-subdirs): New option. (speedbar-file-lists): Don't ignore file-name case on Unix and use dolist. (speedbar-insert-files-at-point): Take an extra argument and use it to optionally find out if a subdir is empty. Also unreadable files don't get expand buttons. (speedbar-directory-plus): New image (bitmap already existed unused). (speedbar-expand-image-button-alist): Use it.
author Daniel Pfeiffer <occitan@esperanto.org>
date Wed, 11 Aug 2004 19:55:47 +0000
parents 25ff62ff164d
children 5ea587a67aae
line wrap: on
line diff
--- a/lisp/speedbar.el	Wed Aug 11 16:22:21 2004 +0000
+++ b/lisp/speedbar.el	Wed Aug 11 19:55:47 2004 +0000
@@ -689,8 +689,16 @@
   :type '(repeat (regexp :tag "Extension Regexp"))
   :set (lambda (sym val)
 	 (setq speedbar-supported-extension-expressions val
-	       speedbar-file-regexp (speedbar-extension-list-to-regex val)))
-  )
+	       speedbar-file-regexp (speedbar-extension-list-to-regex val))))
+
+(defcustom speedbar-scan-subdirs nil
+  "*Non-nil means speedbar will check if subdirs are empty.
+That way you don't have to click on them to find out.  But this
+incurs extra I/O, hence it slows down directory display
+proportionally to the number of subdirs."
+  :group 'speedbar
+  :type 'boolean
+  :version 21.4)
 
 (defvar speedbar-file-regexp
   (speedbar-extension-list-to-regex speedbar-supported-extension-expressions)
@@ -2185,21 +2193,17 @@
   ;; find the directory, either in the cache, or build it.
   (or (cdr-safe (assoc directory speedbar-directory-contents-alist))
       (let ((default-directory directory)
-	    (dir (directory-files directory nil))
-	    (dirs nil)
-	    (files nil))
-	(while dir
-	  (if (not
-	       (or (string-match speedbar-file-unshown-regexp (car dir))
-		   (string-match speedbar-directory-unshown-regexp (car dir))))
-	      (if (file-directory-p (car dir))
-		  (setq dirs (cons (car dir) dirs))
-		(setq files (cons (car dir) files))))
-	  (setq dir (cdr dir)))
-	(let ((nl (cons (nreverse dirs) (list (nreverse files)))))
+	    (case-fold-search read-file-name-completion-ignore-case)
+	    dirs files)
+	(dolist (file (directory-files directory nil))
+	  (or (string-match speedbar-file-unshown-regexp file)
+	      (string-match speedbar-directory-unshown-regexp file)
+	      (if (file-directory-p file)
+		  (setq dirs (cons file dirs))
+		(setq files (cons file files)))))
+	(let ((nl `(,(nreverse dirs) ,(nreverse files))))
 	  (aput 'speedbar-directory-contents-alist directory nl)
-	  nl))
-      ))
+	  nl))))
 
 (defun speedbar-directory-buttons (directory index)
   "Insert a single button group at point for DIRECTORY.
@@ -2343,34 +2347,40 @@
 
 ;;; Build button lists
 ;;
-(defun speedbar-insert-files-at-point (files level)
+(defun speedbar-insert-files-at-point (files level directory)
   "Insert list of FILES starting at point, and indenting all files to LEVEL.
 Tag expandable items with a +, otherwise a ?.  Don't highlight ? as we
 don't know how to manage them.  The input parameter FILES is a cons
 cell of the form ( 'DIRLIST .  'FILELIST )."
   ;; Start inserting all the directories
-  (let ((dirs (car files)))
-    (while dirs
-      (speedbar-make-tag-line 'angle ?+ 'speedbar-dired (car dirs)
-			      (car dirs) 'speedbar-dir-follow nil
-			      'speedbar-directory-face level)
-      (setq dirs (cdr dirs))))
-  (let ((lst (car (cdr files)))
-	(case-fold-search t))
-    (while lst
-      (let* ((known (string-match speedbar-file-regexp (car lst)))
+  (dolist (dir (car files))
+    (if (if speedbar-scan-subdirs
+	    (condition-case nil
+		(let ((l (speedbar-file-lists (concat directory dir))))
+		  (or (car l) (cadr l)))
+	      (file-error))
+	  (file-readable-p (concat directory dir)))
+	(speedbar-make-tag-line 'angle ?+ 'speedbar-dired dir
+				dir 'speedbar-dir-follow nil
+				'speedbar-directory-face level)
+      (speedbar-make-tag-line 'angle ?  nil dir
+			      dir 'speedbar-dir-follow nil
+			      'speedbar-directory-face level)))
+  (let ((case-fold-search read-file-name-completion-ignore-case))
+    (dolist (file (cadr files))
+      (let* ((known (and (file-readable-p (concat directory file))
+			 (string-match speedbar-file-regexp file)))
 	     (expchar (if known ?+ ??))
 	     (fn (if known 'speedbar-tag-file nil)))
 	(if (or speedbar-show-unknown-files (/= expchar ??))
-	    (speedbar-make-tag-line 'bracket expchar fn (car lst)
-				    (car lst) 'speedbar-find-file nil
-				    'speedbar-file-face level)))
-      (setq lst (cdr lst)))))
+	    (speedbar-make-tag-line 'bracket expchar fn file
+				    file 'speedbar-find-file nil
+				    'speedbar-file-face level))))))
 
 (defun speedbar-default-directory-list (directory index)
   "Insert files for DIRECTORY with level INDEX at point."
   (speedbar-insert-files-at-point
-   (speedbar-file-lists directory) index)
+   (speedbar-file-lists directory) index directory)
   (speedbar-reset-scanners)
   (if (= index 0)
       ;; If the shown files variable has extra directories, then
@@ -2918,7 +2928,7 @@
 	 (newcf (if newcfd newcfd))
 	 (lastb (current-buffer))
 	 (sucf-recursive (boundp 'sucf-recursive))
-	 (case-fold-search t))
+	 (case-fold-search read-file-name-completion-ignore-case))
     (if (and newcf
 	     ;; check here, that way we won't refresh to newcf until
 	     ;; its been written, thus saving ourselves some time
@@ -4235,9 +4245,7 @@
 	   (speedbar-convert-emacs21-imagespec-to-xemacs (quote ,imagespec)))
 	  'buffer)
        (error nil))
-     ,docstring))
-
-)))
+     ,docstring)))))
 
 (defimage-speedbar speedbar-directory-plus
   ((:type xpm :file "sb-dir-plus.xpm" :ascent center))
@@ -4247,6 +4255,10 @@
   ((:type xpm :file "sb-dir-minus.xpm" :ascent center))
   "Image used for open directories with stuff in them.")
 
+(defimage-speedbar speedbar-directory
+  ((:type xpm :file "sb-dir.xpm" :ascent center))
+  "Image used for empty or unreadable directories.")
+
 (defimage-speedbar speedbar-page-plus
   ((:type xpm :file "sb-pg-plus.xpm" :ascent center))
   "Image used for closed files with stuff in them.")
@@ -4290,6 +4302,7 @@
 (defvar speedbar-expand-image-button-alist
   '(("<+>" . speedbar-directory-plus)
     ("<->" . speedbar-directory-minus)
+    ("< >" . speedbar-directory)
     ("[+]" . speedbar-page-plus)
     ("[-]" . speedbar-page-minus)
     ("[?]" . speedbar-page)