This commit was generated by cvs2svn to compensate for changes in r6565,
[elisp/gnus.git-] / lisp / gnus-salt.el
index 1efaa60..e98762e 100644 (file)
@@ -58,7 +58,7 @@
   :group 'gnus-summary-pick)
 
 (defcustom gnus-summary-pick-line-format
-  "-5P %U\%R\%z\%I\%(%[%4L: %-20,20n%]%) %s\n"
+  "%-5P %U\%R\%z\%I\%(%[%4L: %-20,20n%]%) %s\n"
   "*The format specification of the lines in pick buffers.
 It accepts the same format specs that `gnus-summary-line-format' does."
   :type 'string
@@ -73,22 +73,10 @@ It accepts the same format specs that `gnus-summary-line-format' does."
 
   (gnus-define-keys gnus-pick-mode-map
     " " gnus-pick-next-page
-    "u" gnus-summary-unmark-as-processable
-    "." gnus-pick-article
+    "u" gnus-pick-unmark-article-or-thread
+    "." gnus-pick-article-or-thread
     gnus-down-mouse-2 gnus-pick-mouse-pick-region
     "\r" gnus-pick-start-reading
-    ;; "t" gnus-uu-mark-thread
-    ;; "T" gnus-uu-unmark-thread
-    ;; "U" gnus-summary-unmark-all-processable
-    ;; "v" gnus-uu-mark-over
-    ;; "r" gnus-uu-mark-region
-    ;; "R" gnus-uu-unmark-region
-    ;; "e" gnus-uu-mark-by-regexp
-    ;; "E" gnus-uu-mark-by-regexp
-    ;; "b" gnus-uu-mark-buffer
-    ;; "B" gnus-uu-unmark-buffer
-    ;;gnus-mouse-2 gnus-pick-mouse-pick
-    ;; "X" gnus-pick-start-reading
     ))
 
 (defun gnus-pick-make-menu-bar ()
@@ -173,21 +161,48 @@ If given a prefix, mark all unpicked articles as read."
            (gnus-summary-next-group)))
       (error "No articles have been picked"))))
 
+(defun gnus-pick-goto-article (arg)
+  "Go to the article number indicated by ARG.  If ARG is an invalid
+article number, then stay on current line."
+  (let (pos)
+    (save-excursion
+      (goto-char (point-min))
+      (when (zerop (forward-line (1- (prefix-numeric-value arg))))
+       (setq pos (point))))
+    (if (not pos)
+       (gnus-error 2 "No such line: %s" arg)
+      (goto-char pos))))
+    
 (defun gnus-pick-article (&optional arg)
-  "Pick the article on the current line.
+    "Pick the article on the current line.
 If ARG, pick the article on that line instead."
   (interactive "P")
   (when arg
-    (let (pos)
-      (save-excursion
-       (goto-char (point-min))
-       (when (zerop (forward-line (1- (prefix-numeric-value arg))))
-         (setq pos (point))))
-      (if (not pos)
-         (gnus-error 2 "No such line: %s" arg)
-       (goto-char pos))))
+    (gnus-pick-goto-article arg))
   (gnus-summary-mark-as-processable 1))
 
+(defun gnus-pick-article-or-thread (&optional arg)
+  "If gnus-thread-hide-subtree is t, then pick the thread on the current line.
+Otherwise pick the article on the current line.
+If ARG, pick the article/thread on that line instead."
+  (interactive "P")
+  (when arg
+    (gnus-pick-goto-article arg))
+  (if gnus-thread-hide-subtree
+      (gnus-uu-mark-thread)
+    (gnus-summary-mark-as-processable 1)))
+                 
+(defun gnus-pick-unmark-article-or-thread (&optional arg)
+  "If gnus-thread-hide-subtree is t, then unmark the thread on current line.
+Otherwise unmark the article on current line.
+If ARG, unmark thread/article on that line instead."
+  (interactive "P")
+  (when arg
+    (gnus-pick-goto-article arg))
+  (if gnus-thread-hide-subtree
+      (gnus-uu-unmark-thread)
+    (gnus-summary-unmark-as-processable 1)))
+  
 (defun gnus-pick-mouse-pick (e)
   (interactive "e")
   (mouse-set-point e)
@@ -204,7 +219,6 @@ This must be bound to a button-down mouse event."
         (start-point (posn-point start-posn))
          (start-line (1+ (count-lines 1 start-point)))
         (start-window (posn-window start-posn))
-        (start-frame (window-frame start-window))
         (bounds (gnus-window-edges start-window))
         (top (nth 1 bounds))
         (bottom (if (window-minibuffer-p start-window)
@@ -224,50 +238,48 @@ This must be bound to a button-down mouse event."
     ;; end-of-range is used only in the single-click case.
     ;; It is the place where the drag has reached so far
     ;; (but not outside the window where the drag started).
-    (let (event end end-point last-end-point (end-of-range (point)))
+    (let (event end end-point (end-of-range (point)))
       (track-mouse
-       (while (progn
-               (setq event (read-event))
-               (or (mouse-movement-p event)
-                   (eq (car-safe event) 'switch-frame)))
-        (if (eq (car-safe event) 'switch-frame)
-            nil
-          (setq end (event-end event)
-                end-point (posn-point end))
-          (when end-point
-            (setq last-end-point end-point))
-
-          (cond
-           ;; Are we moving within the original window?
-           ((and (eq (posn-window end) start-window)
-                 (integer-or-marker-p end-point))
-            ;; Go to START-POINT first, so that when we move to END-POINT,
-            ;; if it's in the middle of intangible text,
-            ;; point jumps in the direction away from START-POINT.
-            (goto-char start-point)
-            (goto-char end-point)
-            (gnus-pick-article)
-            ;; In case the user moved his mouse really fast, pick
-            ;; articles on the line between this one and the last one.
-            (let* ((this-line (1+ (count-lines 1 end-point)))
-                   (min-line (min this-line start-line))
-                   (max-line (max this-line start-line)))
-              (while (< min-line max-line)
-                (goto-line min-line)
-                (gnus-pick-article)
-                (setq min-line (1+ min-line)))
-              (setq start-line this-line))
-            (when (zerop (% click-count 3))
-              (setq end-of-range (point))))
-           (t
-            (let ((mouse-row (cdr (cdr (mouse-position)))))
-              (cond
-               ((null mouse-row))
-               ((< mouse-row top)
-                (mouse-scroll-subr start-window (- mouse-row top)))
-               ((>= mouse-row bottom)
-                (mouse-scroll-subr start-window
-                                   (1+ (- mouse-row bottom)))))))))))
+       (while (progn
+                (setq event (cdr (gnus-read-event-char)))
+                (or (mouse-movement-p event)
+                    (eq (car-safe event) 'switch-frame)))
+         (if (eq (car-safe event) 'switch-frame)
+             nil
+           (setq end (event-end event)
+                 end-point (posn-point end))
+
+           (cond
+            ;; Are we moving within the original window?
+            ((and (eq (posn-window end) start-window)
+                  (integer-or-marker-p end-point))
+             ;; Go to START-POINT first, so that when we move to END-POINT,
+             ;; if it's in the middle of intangible text,
+             ;; point jumps in the direction away from START-POINT.
+             (goto-char start-point)
+             (goto-char end-point)
+             (gnus-pick-article)
+             ;; In case the user moved his mouse really fast, pick
+             ;; articles on the line between this one and the last one.
+             (let* ((this-line (1+ (count-lines 1 end-point)))
+                    (min-line (min this-line start-line))
+                    (max-line (max this-line start-line)))
+               (while (< min-line max-line)
+                 (goto-line min-line)
+                 (gnus-pick-article)
+                 (setq min-line (1+ min-line)))
+               (setq start-line this-line))
+             (when (zerop (% click-count 3))
+               (setq end-of-range (point))))
+            (t
+             (let ((mouse-row (cdr (cdr (mouse-position)))))
+               (cond
+                ((null mouse-row))
+                ((< mouse-row top)
+                 (mouse-scroll-subr start-window (- mouse-row top)))
+                ((>= mouse-row bottom)
+                 (mouse-scroll-subr start-window
+                                    (1+ (- mouse-row bottom)))))))))))
       (when (consp event)
        (let ((fun (key-binding (vector (car event)))))
          ;; Run the binding of the terminating up-event, if possible.
@@ -364,7 +376,8 @@ This must be bound to a button-down mouse event."
   "If non-nil, minimize the tree buffer window.
 If a number, never let the tree buffer grow taller than that number of
 lines."
-  :type 'boolean
+  :type '(choice boolean
+                integer)
   :group 'gnus-summary-tree)
 
 (defcustom gnus-selected-tree-face 'modeline
@@ -541,9 +554,8 @@ Two predefined functions are available:
 (defun gnus-get-tree-buffer ()
   "Return the tree buffer properly initialized."
   (save-excursion
-    (set-buffer (get-buffer-create gnus-tree-buffer))
+    (set-buffer (gnus-get-buffer-create gnus-tree-buffer))
     (unless (eq major-mode 'gnus-tree-mode)
-      (gnus-add-current-to-buffer-list)
       (gnus-tree-mode))
     (current-buffer)))
 
@@ -638,7 +650,7 @@ Two predefined functions are available:
                    (not (eval (caar list))))
          (setq list (cdr list)))))
     (unless (eq (setq face (cdar list)) (get-text-property beg 'face))
-      (gnus-put-text-property
+      (gnus-put-text-property-excluding-characters-with-faces
        beg end 'face
        (if (boundp face) (symbol-value face) face)))))
 
@@ -747,7 +759,8 @@ Two predefined functions are available:
          (setq beg (point))
          (forward-char -1)
          ;; Draw "-" lines leftwards.
-         (while (= (char-after (1- (point))) ? )
+         (while (and (> (point) 1)
+                     (= (char-after (1- (point))) ? ))
            (delete-char -1)
            (insert (car gnus-tree-parent-child-edges))
            (forward-char -1))
@@ -964,11 +977,10 @@ The following commands are available:
     (if (get-buffer buffer)
        ()
       (save-excursion
-       (set-buffer (get-buffer-create buffer))
+       (set-buffer (gnus-get-buffer-create buffer))
        (gnus-carpal-mode)
        (setq gnus-carpal-attached-buffer
              (intern (format "gnus-%s-buffer" type)))
-       (gnus-add-current-to-buffer-list)
        (let ((buttons (symbol-value
                        (intern (format "gnus-carpal-%s-buffer-buttons"
                                        type))))