diff lisp/speedbar.el @ 89966:d8411455de48

Revision: miles@gnu.org--gnu-2004/emacs--unicode--0--patch-32 Merge from emacs--cvs-trunk--0 Patches applied: * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-486 Update from CVS * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-487 Tweak permissions * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-488 - miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-489 Update from CVS * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-490 Update from CVS: man/fixit.texi (Spelling): Fix typo. * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-491 - miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-494 Update from CVS * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-495 Update from CVS: Add missing lisp/mh-e files * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-496 - miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-499 Update from CVS * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-500 - miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-513 Update from CVS
author Miles Bader <miles@gnu.org>
date Fri, 27 Aug 2004 07:00:34 +0000
parents 68c22ea6027c c36d40df2cc6
children e24e2e78deda
line wrap: on
line diff
--- a/lisp/speedbar.el	Wed Aug 18 06:38:14 2004 +0000
+++ b/lisp/speedbar.el	Fri Aug 27 07:00:34 2004 +0000
@@ -92,7 +92,7 @@
 ;; into sub-lists.  A long flat list can be used instead if needed.
 ;; Other filters can be easily added.
 ;;
-;;    AUC-TEX users: The imenu tags for AUC-TEX mode doesn't work very
+;;    AUCTEX users: The imenu tags for AUCTEX mode doesn't work very
 ;; well.  Use the imenu keywords from tex-mode.el for better results.
 ;;
 ;; This file requires the library package assoc (association lists)
@@ -665,6 +665,9 @@
   "*Regexp matching files we don't want displayed in a speedbar buffer.
 It is generated from the variable `completion-ignored-extensions'")
 
+;; Compiler silencing trick.  The real defvar comes later in this file.
+(defvar speedbar-file-regexp)
+
 ;; this is dangerous to customize, because the defaults will probably
 ;; change in the future.
 (defcustom speedbar-supported-extension-expressions
@@ -689,8 +692,7 @@
   :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))))
 
 (defvar speedbar-file-regexp
   (speedbar-extension-list-to-regex speedbar-supported-extension-expressions)
@@ -698,6 +700,15 @@
 Created from `speedbar-supported-extension-expression' with the
 function `speedbar-extension-list-to-regex'")
 
+(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)
+
 (defun speedbar-add-supported-extension (extension)
   "Add EXTENSION as a new supported extension for speedbar tagging.
 This should start with a `.' if it is not a complete file name, and
@@ -1287,8 +1298,9 @@
     (toggle-read-only 1)
     (speedbar-set-mode-line-format)
     (if speedbar-xemacsp
-	(set (make-local-variable 'mouse-motion-handler)
-	     'speedbar-track-mouse-xemacs)
+	(with-no-warnings
+	 (set (make-local-variable 'mouse-motion-handler)
+	      'speedbar-track-mouse-xemacs))
       (if speedbar-track-mouse-flag
 	  (set (make-local-variable 'track-mouse) t))	;this could be messy.
       (setq auto-show-mode nil))	;no auto-show for Emacs
@@ -1337,7 +1349,8 @@
 frame and window to be the currently active frame and window."
   (if (and (frame-live-p speedbar-frame)
 	   (or (not speedbar-xemacsp)
-	       (specifier-instance has-modeline-p)))
+	       (with-no-warnings
+		(specifier-instance has-modeline-p))))
       (save-excursion
 	(set-buffer speedbar-buffer)
 	(let* ((w (or (speedbar-frame-width) 20))
@@ -1538,9 +1551,7 @@
     ;; This gets the cursor where the user can see it.
     (if (not (bolp)) (forward-char -1))
     (sit-for 0)
-    (if (< emacs-major-version 20)
-	(mouse-major-mode-menu e)
-      (mouse-major-mode-menu e nil))))
+    (mouse-major-mode-menu e nil)))
 
 (defun speedbar-hack-buffer-menu (e)
   "Control mouse 1 is buffer menu.
@@ -2185,21 +2196,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 +2350,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 +2931,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 +4248,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 +4258,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 +4305,7 @@
 (defvar speedbar-expand-image-button-alist
   '(("<+>" . speedbar-directory-plus)
     ("<->" . speedbar-directory-minus)
+    ("< >" . speedbar-directory)
     ("[+]" . speedbar-page-plus)
     ("[-]" . speedbar-page-minus)
     ("[?]" . speedbar-page)