diff lisp/gnus/gnus-sum.el @ 105680:0504b0a2d425

Synch with Gnus trunk: 2009-10-19 Katsumi Yamaoka <yamaoka@jpl.org> * gnus-sum.el (gnus-summary-show-thread): Remove useless goto-char. (gnus-summary-show-thread, gnus-summary-hide-thread): Indent. 2009-10-16 Katsumi Yamaoka <yamaoka@jpl.org> * gnus.el (gnus-overlay-get): New alias to overlay-get. (gnus-overlays-in): New alias to overlays-in. * gnus-sum.el (gnus-remove-overlays): Use gnus-overlays-in, gnus-overlay-get, and gnus-delete-overlay. (gnus-summary-show-thread): Make it work as well for systems in which next-single-char-property-change is not available. (gnus-summary-hide-thread): Use gnus-make-overlay and gnus-overlay-put. 2009-10-14 Reiner Steib <Reiner.Steib@gmx.de> * gnus-sum.el (gnus-remove-overlays): Add doc string and alias. 2009-10-14 Dan Nicolaescu <dann@ics.uci.edu> * gnus-sum.el (gnus-remove-overlays): Compatibility code for Emacs 21 and XEmacs that don't have `remove-overlays'. 2009-10-14 Stefan Monnier <monnier@iro.umontreal.ca> * gnus-sum.el (gnus-summary-mode, gnus-summary-show-all-threads) (gnus-summary-show-thread, gnus-summary-hide-thread): Get rid of selective display. Use overlays instead.
author Katsumi Yamaoka <yamaoka@jpl.org>
date Mon, 19 Oct 2009 23:21:04 +0000
parents 2fb28585eb6b
children eb7471ca2f53
line wrap: on
line diff
--- a/lisp/gnus/gnus-sum.el	Mon Oct 19 22:48:52 2009 +0000
+++ b/lisp/gnus/gnus-sum.el	Mon Oct 19 23:21:04 2009 +0000
@@ -3069,8 +3069,7 @@
   (setq buffer-read-only t		;Disable modification
 	show-trailing-whitespace nil)
   (setq truncate-lines t)
-  (setq selective-display t)
-  (setq selective-display-ellipses t)	;Display `...'
+  (add-to-invisibility-spec '(gnus-sum . t))
   (gnus-summary-set-display-table)
   (gnus-set-default-directory)
   (make-local-variable 'gnus-summary-line-format)
@@ -11278,29 +11277,44 @@
     (gnus-message 6 "Threading is now %s" (if gnus-show-threads "on" "off"))
     (gnus-summary-position-point)))
 
+(if (fboundp 'remove-overlays)
+    (defalias 'gnus-remove-overlays 'remove-overlays)
+  (defun gnus-remove-overlays (beg end name val)
+    "Clear BEG and END of overlays whose property NAME has value VAL.
+For compatibility with Emacs 21 and XEmacs."
+    (dolist (ov (gnus-overlays-in beg end))
+      (when (eq (gnus-overlay-get ov name) val)
+	(gnus-delete-overlay ov)))))
+
 (defun gnus-summary-show-all-threads ()
   "Show all threads."
   (interactive)
-  (save-excursion
-    (let ((buffer-read-only nil))
-      (subst-char-in-region (point-min) (point-max) ?\^M ?\n t)))
+  (gnus-remove-overlays (point-min) (point-max) 'invisible 'gnus-sum)
   (gnus-summary-position-point))
 
 (defun gnus-summary-show-thread ()
   "Show thread subtrees.
 Returns nil if no thread was there to be shown."
   (interactive)
-  (let ((buffer-read-only nil)
-	(orig (point))
-	(end (point-at-eol))
-	;; Leave point at bol
-	(beg (progn (beginning-of-line) (point))))
-    (prog1
-	;; Any hidden lines here?
-	(search-forward "\r" end t)
-      (subst-char-in-region beg end ?\^M ?\n t)
+  (let* ((orig (point))
+	 (end (point-at-eol))
+	 ;; Leave point at bol
+	 (beg (progn (beginning-of-line) (if (bobp) (point) (1- (point)))))
+	 (eoi (when (eq (get-char-property end 'invisible) 'gnus-sum)
+		(if (fboundp 'next-single-char-property-change)
+		    (or (next-single-char-property-change end 'invisible)
+			(point-max))
+		  (while (progn
+			   (end-of-line 2)
+			   (and (not (eobp))
+				(eq (get-char-property (point) 'invisible)
+				    'gnus-sum))))
+		  (point)))))
+    (when eoi
+      (gnus-remove-overlays beg eoi 'invisible 'gnus-sum)
       (goto-char orig)
-      (gnus-summary-position-point))))
+      (gnus-summary-position-point)
+      eoi)))
 
 (defun gnus-summary-maybe-hide-threads ()
   "If requested, hide the threads that should be hidden."
@@ -11349,22 +11363,26 @@
 will not be hidden.
 Returns nil if no threads were there to be hidden."
   (interactive)
-  (let ((buffer-read-only nil)
-	(start (point))
+  (let ((start (point))
+	(starteol (line-end-position))
 	(article (gnus-summary-article-number)))
     (goto-char start)
     ;; Go forward until either the buffer ends or the subthread ends.
     (when (and (not (eobp))
 	       (or (zerop (gnus-summary-next-thread 1 t))
 		   (goto-char (point-max))))
-      (prog1
-	  (if (and (> (point) start)
-		   (search-backward "\n" start t))
-	      (progn
-		(subst-char-in-region start (point) ?\n ?\^M)
-		(gnus-summary-goto-subject article))
-	    (goto-char start)
-	    nil)))))
+      (if (and (> (point) start)
+	       ;; FIXME: this should actually search for a non-invisible \n.
+	       (search-backward "\n" start t))
+	  (progn
+	    (when (> (point) starteol)
+	      (gnus-remove-overlays starteol (point) 'invisible 'gnus-sum)
+	      (let ((ol (gnus-make-overlay starteol (point) nil t nil)))
+		(gnus-overlay-put ol 'invisible 'gnus-sum)
+		(gnus-overlay-put ol 'evaporate t)))
+	    (gnus-summary-goto-subject article))
+	(goto-char start)
+	nil))))
 
 (defun gnus-summary-go-to-next-thread (&optional previous)
   "Go to the same level (or less) next thread.