]> code.delx.au - gnu-emacs/blobdiff - lisp/net/newst-treeview.el
Merge from trunk.
[gnu-emacs] / lisp / net / newst-treeview.el
index 01b08c2d66ffe7d91cf7d676d7f25d32217b1d65..d003554e5470e3d9ce0ccafd948528e873a615ab 100644 (file)
@@ -1,13 +1,13 @@
 ;;; newst-treeview.el --- Treeview frontend for newsticker.
 
-;; Copyright (C) 2008, 2009 Free Software Foundation, Inc.
+;; Copyright (C) 2008-2012 Free Software Foundation, Inc.
 
 ;; Author:      Ulf Jasper <ulf.jasper@web.de>
 ;; Filename:    newst-treeview.el
 ;; URL:         http://www.nongnu.org/newsticker
 ;; Created:     2007
 ;; Keywords:    News, RSS, Atom
-;; Time-stamp:  "15. April 2009, 19:51:17 (ulf)"
+;; Package:     newsticker
 
 ;; ======================================================================
 
 ;;; History:
 ;;
 
-
 ;; ======================================================================
 ;;; Code:
-(require 'newsticker-reader "newst-reader")
+(require 'newst-reader)
 (require 'widget)
 (require 'tree-widget)
 (require 'wid-edit)
@@ -52,9 +51,9 @@
 
 (defface newsticker-treeview-face
   '((((class color) (background dark))
-     (:family "helvetica" :foreground "misty rose" :bold nil))
+     (:family "sans" :foreground "white" :bold nil))
     (((class color) (background light))
-     (:family "helvetica" :foreground "black" :bold nil)))
+     (:family "sans" :foreground "black" :bold nil)))
   "Face for newsticker tree."
   :group 'newsticker-treeview)
 
@@ -228,7 +227,7 @@ their id stays constant."
         (string= (widget-get node1 :tag) (widget-get node2 :tag)))))
 
 (defun newsticker--treeview-do-get-node-of-feed (feed-name startnode)
-   "Recursivly search node for feed FEED-NAME starting from STARTNODE."
+   "Recursively search node for feed FEED-NAME starting from STARTNODE."
    ;;(message "%s/%s" feed-name (widget-get startnode :nt-feed))
    (if (string= feed-name (or (widget-get startnode :nt-feed)
                               (widget-get startnode :nt-vfeed)))
@@ -246,7 +245,7 @@ their id stays constant."
                                               newsticker--treeview-vfeed-tree)))
 
 (defun newsticker--treeview-do-get-node (id startnode)
-   "Recursivly search node with ID starting from STARTNODE."
+   "Recursively search node with ID starting from STARTNODE."
    (if (newsticker--treeview-ids-eq id (widget-get startnode :nt-id))
        (throw 'found startnode)
      (let ((children (widget-get startnode :children)))
@@ -597,8 +596,9 @@ The sort function is chosen according to the value of
 (defun newsticker--treeview-list-highlight-start ()
   "Return position of selection in treeview list buffer."
   (with-current-buffer (newsticker--treeview-list-buffer)
-    (goto-char (point-min))
-    (next-single-property-change (point) :nt-selected)))
+    (save-excursion
+      (goto-char (point-min))
+      (next-single-property-change (point) :nt-selected))))
 
 (defun newsticker--treeview-list-update (clear-buffer)
   "Update the faces and highlight in the treeview list buffer.
@@ -665,6 +665,27 @@ for the button."
                 'face face
                 'keymap newsticker-treeview-list-sort-button-map)))
 
+(defun newsticker--treeview-list-select (item)
+  "Select ITEM in treeview's list buffer."
+  (newsticker--treeview-list-clear-highlight)
+    (let (pos num-lines)
+      (save-current-buffer
+        (set-buffer (newsticker--treeview-list-buffer))
+        (goto-char (point-min))
+        (catch 'found
+          (while t
+            (let ((it (get-text-property (point) :nt-item)))
+              (when (eq it item)
+                (newsticker--treeview-list-update-highlight)
+                (newsticker--treeview-list-update-faces)
+                (newsticker--treeview-item-show
+                 item (get-text-property (point) :nt-feed))
+                (throw 'found t)))
+            (forward-line 1)
+            (when (eobp)
+              (goto-char (point-min))
+              (throw 'found nil)))))))
+
 ;; ======================================================================
 ;;; item window
 ;; ======================================================================
@@ -682,7 +703,7 @@ for the button."
       (insert "\n\n" description)
       (when newsticker-justification
         (fill-region (point-min) (point-max) newsticker-justification))
-      (newsticker-treeview-mode)
+      (newsticker-treeview-item-mode)
       (goto-char (point-min)))))
 
 (defun newsticker--treeview-item-show (item feed-name-symbol)
@@ -716,7 +737,7 @@ for the button."
                    (not is-rendered-HTML))
           (fill-region marker1 marker2 newsticker-justification))
 
-        (newsticker-treeview-mode)
+        (newsticker-treeview-item-mode)
         (goto-char (point-min))
         ;; insert logo at top
         (let* ((newsticker-enable-logo-manipulations nil)
@@ -787,7 +808,7 @@ for the button."
     (set-buffer (newsticker--treeview-item-buffer))
     (let ((inhibit-read-only t))
       (erase-buffer))
-    (newsticker-treeview-mode)))
+    (newsticker-treeview-item-mode)))
 
 ;; ======================================================================
 ;;; Tree window
@@ -1046,86 +1067,63 @@ Arguments IGNORE are ignored."
 ;; ======================================================================
 ;;; Toolbar
 ;; ======================================================================
-;;(makunbound 'newsticker-treeview-tool-bar-map)
 (defvar newsticker-treeview-tool-bar-map
   (if (featurep 'xemacs)
       nil
     (if (boundp 'tool-bar-map)
         (let ((tool-bar-map (make-sparse-keymap)))
+          (tool-bar-add-item "newsticker/prev-feed"
+                             'newsticker-treeview-prev-feed
+                             'newsticker-treeview-prev-feed
+                             :help "Go to previous feed"
+                             ;;:enable '(newsticker-previous-feed-available-p) FIXME
+                             )
+          (tool-bar-add-item "newsticker/prev-item"
+                             'newsticker-treeview-prev-item
+                             'newsticker-treeview-prev-item
+                             :help "Go to previous item"
+                             ;;:enable '(newsticker-previous-item-available-p) FIXME
+                             )
+          (tool-bar-add-item "newsticker/next-item"
+                             'newsticker-treeview-next-item
+                             'newsticker-treeview-next-item
+                             :visible t
+                             :help "Go to next item"
+                             ;;:enable '(newsticker-next-item-available-p) FIXME
+                             )
+          (tool-bar-add-item "newsticker/next-feed"
+                             'newsticker-treeview-next-feed
+                             'newsticker-treeview-next-feed
+                             :help "Go to next feed"
+                             ;;:enable '(newsticker-next-feed-available-p) FIXME
+                             )
+          (tool-bar-add-item "newsticker/mark-immortal"
+                             'newsticker-treeview-toggle-item-immortal
+                             'newsticker-treeview-toggle-item-immortal
+                             :help "Toggle current item as immortal"
+                             ;;:enable '(newsticker-item-not-immortal-p) FIXME
+                             )
+          (tool-bar-add-item "newsticker/mark-read"
+                             'newsticker-treeview-mark-item-old
+                             'newsticker-treeview-mark-item-old
+                             :help "Mark current item as read"
+                             ;;:enable '(newsticker-item-not-old-p) FIXME
+                             )
+          (tool-bar-add-item "newsticker/get-all"
+                             'newsticker-get-all-news
+                             'newsticker-get-all-news
+                             :help "Get news for all feeds")
+          (tool-bar-add-item "newsticker/update"
+                             'newsticker-treeview-update
+                             'newsticker-treeview-update
+                             :help "Update newsticker buffer")
+          (tool-bar-add-item "newsticker/browse-url"
+                             'newsticker-browse-url
+                             'newsticker-browse-url
+                             :help "Browse URL for item at point")
+          ;; standard icons / actions
           (define-key tool-bar-map [newsticker-sep-1]
             (list 'menu-item "--double-line"))
-          (define-key tool-bar-map [newsticker-browse-url]
-            (list 'menu-item "newsticker-browse-url"
-                  'newsticker-browse-url
-                  :visible t
-                  :help "Browse URL for item at point"
-                  :image newsticker--browse-image))
-          (define-key tool-bar-map [newsticker-buffer-force-update]
-            (list 'menu-item "newsticker-treeview-update"
-                  'newsticker-treeview-update
-                  :visible t
-                  :help "Update newsticker buffer"
-                  :image newsticker--update-image
-                  :enable t))
-          (define-key tool-bar-map [newsticker-get-all-news]
-            (list 'menu-item "newsticker-get-all-news" 'newsticker-get-all-news
-                  :visible t
-                  :help "Get news for all feeds"
-                  :image newsticker--get-all-image))
-          (define-key tool-bar-map [newsticker-mark-item-at-point-as-read]
-            (list 'menu-item "newsticker-treeview-mark-item-old"
-                  'newsticker-treeview-mark-item-old
-                  :visible t
-                  :image newsticker--mark-read-image
-                  :help "Mark current item as read"
-                  ;;:enable '(newsticker-item-not-old-p) FIXME
-                  ))
-          (define-key tool-bar-map [newsticker-mark-item-at-point-as-immortal]
-            (list 'menu-item "newsticker-treeview-toggle-item-immortal"
-                  'newsticker-treeview-toggle-item-immortal
-                  :visible t
-                  :image newsticker--mark-immortal-image
-                  :help "Toggle current item as immortal"
-                  :enable t
-                  ;;'(newsticker-item-not-immortal-p) FIXME
-                  ))
-          (define-key tool-bar-map [newsticker-next-feed]
-            (list 'menu-item "newsticker-treeview-next-feed"
-                  'newsticker-treeview-next-feed
-                  :visible t
-                  :help "Go to next feed"
-                  :image newsticker--next-feed-image
-                  :enable t
-                  ;;'(newsticker-next-feed-available-p) FIXME
-                  ))
-          (define-key tool-bar-map [newsticker-treeview-next-item]
-            (list 'menu-item "newsticker-treeview-next-item"
-                  'newsticker-treeview-next-item
-                  :visible t
-                  :help "Go to next item"
-                  :image newsticker--next-item-image
-                  :enable t
-                  ;;'(newsticker-next-item-available-p) FIXME
-                  ))
-          (define-key tool-bar-map [newsticker-treeview-prev-item]
-            (list 'menu-item "newsticker-treeview-prev-item"
-                  'newsticker-treeview-prev-item
-                  :visible t
-                  :help "Go to previous item"
-                  :image newsticker--previous-item-image
-                  :enable t
-                  ;;'(newsticker-previous-item-available-p) FIXME
-                  ))
-          (define-key tool-bar-map [newsticker-treeview-prev-feed]
-            (list 'menu-item "newsticker-treeview-prev-feed"
-                  'newsticker-treeview-prev-feed
-                  :visible t
-                  :help "Go to previous feed"
-                  :image newsticker--previous-feed-image
-                  :enable t
-                  ;;'(newsticker-previous-feed-available-p) FIXME
-                  ))
-          ;; standard icons / actions
           (tool-bar-add-item "close"
                              'newsticker-treeview-quit
                              'newsticker-treeview-quit
@@ -1193,17 +1191,23 @@ Arguments IGNORE are ignored."
   "Update all treeview buffers and windows.
 Note: does not update the layout."
   (interactive)
-  (newsticker--group-manage-orphan-feeds)
-  (newsticker--treeview-list-update t)
-  (newsticker--treeview-item-update)
-  (newsticker--treeview-tree-update-tags)
-  (cond (newsticker--treeview-current-feed
-         (newsticker--treeview-list-items newsticker--treeview-current-feed))
-        (newsticker--treeview-current-vfeed
-         (newsticker--treeview-list-items-with-age
-          (intern newsticker--treeview-current-vfeed))))
-  (newsticker--treeview-tree-update-highlight)
-  (newsticker--treeview-list-update-highlight))
+  (let ((cur-item (newsticker--treeview-get-selected-item)))
+    (if (newsticker--group-manage-orphan-feeds)
+      (newsticker--treeview-tree-update))
+    (newsticker--treeview-list-update t)
+    (newsticker--treeview-item-update)
+    (newsticker--treeview-tree-update-tags)
+    (cond (newsticker--treeview-current-feed
+           (newsticker--treeview-list-items newsticker--treeview-current-feed))
+          (newsticker--treeview-current-vfeed
+           (newsticker--treeview-list-items-with-age
+            (intern newsticker--treeview-current-vfeed))))
+    (newsticker--treeview-tree-update-highlight)
+    (newsticker--treeview-list-update-highlight)
+    (let ((cur-feed (or newsticker--treeview-current-feed
+                        newsticker--treeview-current-vfeed)))
+      (if (and cur-feed cur-item)
+          (newsticker--treeview-list-select cur-item)))))
 
 (defun newsticker-treeview-quit ()
   "Quit newsticker treeview."
@@ -1307,7 +1311,8 @@ Note: does not update the layout."
   "Move to next new or immortal item.
 Will move to next feed until an item is found.  Will not move if
 optional argument CURRENT-ITEM-COUNTS is t and current item is
-new or immortal."
+new or immortal.  Will not move from virtual to ordinary feed
+tree or vice versa if optional argument DONT-WRAP-TREES is non-nil."
   (interactive)
   (newsticker--treeview-restore-layout)
   (newsticker--treeview-list-clear-highlight)
@@ -1531,7 +1536,7 @@ is activated."
            (widget-apply-action node)))))
 
 (defun newsticker--treeview-first-feed ()
-  "Jump to the depth-first feed in the newsticker-groups tree."
+  "Jump to the depth-first feed in the `newsticker-groups' tree."
   (newsticker-treeview-jump
    (car (reverse (newsticker--group-get-feeds newsticker-groups t)))))
 
@@ -1788,7 +1793,7 @@ Update teeview afterwards unless NO-UPDATE is non-nil."
     result))
 
 (defun newsticker--group-remove-obsolete-feeds (group)
-  "Recursively remove obselete feeds from GROUP."
+  "Recursively remove obsolete feeds from GROUP."
   (let ((result nil)
         (urls (append newsticker-url-list newsticker-url-list-defaults)))
     (mapc (lambda (g)
@@ -1806,7 +1811,8 @@ Update teeview afterwards unless NO-UPDATE is non-nil."
 
 (defun newsticker--group-manage-orphan-feeds ()
   "Put unmanaged feeds into `newsticker-groups'.
-Remove obsolete feeds as well."
+Remove obsolete feeds as well.
+Return t if groups have changed, nil otherwise."
   (unless newsticker-groups
     (setq newsticker-groups '("Feeds")))
   (let ((new-feed nil)
@@ -1818,10 +1824,9 @@ Remove obsolete feeds as well."
           (append newsticker-url-list-defaults newsticker-url-list))
     (setq newsticker-groups
           (newsticker--group-remove-obsolete-feeds newsticker-groups))
-    (if (or new-feed
-            (not (= grouped-feeds
-                    (newsticker--count-grouped-feeds newsticker-groups))))
-        (newsticker--treeview-tree-update))))
+    (or new-feed
+        (not (= grouped-feeds
+                (newsticker--count-grouped-feeds newsticker-groups))))))
 
 ;; ======================================================================
 ;;; Modes
@@ -1863,8 +1868,31 @@ Remove obsolete feeds as well."
     (define-key menu [newsticker-treeview-mark-list-items-old]
       (list 'menu-item "Mark all items old"
             'newsticker-treeview-mark-list-items-old))
+    (define-key menu [newsticker-treeview-mark-item-old]
+      (list 'menu-item "Mark current item old"
+            'newsticker-treeview-mark-item-old))
+    (define-key menu [newsticker-treeview-toggle-item-immortal]
+      (list 'menu-item "Mark current item immortal (toggle)"
+            'newsticker-treeview-toggle-item-immortal))
+    (define-key menu [newsticker-treeview-get-news]
+      (list 'menu-item "Get news for current feed"
+            'newsticker-treeview-get-news))
+    menu)
+  "Map for newsticker list menu.")
+
+(defvar newsticker-treeview-item-menu
+  (let ((menu (make-sparse-keymap "Newsticker Item")))
+    (define-key menu [newsticker-treeview-mark-item-old]
+      (list 'menu-item "Mark current item old"
+            'newsticker-treeview-mark-item-old))
+    (define-key menu [newsticker-treeview-toggle-item-immortal]
+      (list 'menu-item "Mark current item immortal (toggle)"
+            'newsticker-treeview-toggle-item-immortal))
+    (define-key menu [newsticker-treeview-get-news]
+      (list 'menu-item "Get news for current feed"
+            'newsticker-treeview-get-news))
     menu)
-  "Map for newsticker tree menu.")
+  "Map for newsticker item menu.")
 
 (defvar newsticker-treeview-mode-map
   (let ((map (make-sparse-keymap 'newsticker-treeview-mode-map)))
@@ -1929,6 +1957,11 @@ Remove obsolete feeds as well."
   (define-key newsticker-treeview-list-mode-map [down-mouse-3]
     newsticker-treeview-list-menu))
 
+(define-derived-mode newsticker-treeview-item-mode newsticker-treeview-mode
+  "Item"
+  (define-key newsticker-treeview-item-mode-map [down-mouse-3]
+    newsticker-treeview-item-menu))
+
 (defun newsticker-treeview-tree-click (event)
   "Handle click EVENT on a tag in the newsticker tree."
   (interactive "e")
@@ -1985,10 +2018,10 @@ POS gives the position where EVENT occurred."
   (setq newsticker--treeview-windows nil)
   (setq newsticker--treeview-buffers nil)
   (delete-other-windows)
-  (split-window-horizontally newsticker-treeview-treewindow-width)
+  (split-window-right newsticker-treeview-treewindow-width)
   (add-to-list 'newsticker--treeview-windows (selected-window) t)
   (other-window 1)
-  (split-window-vertically newsticker-treeview-listwindow-height)
+  (split-window-below newsticker-treeview-listwindow-height)
   (add-to-list 'newsticker--treeview-windows (selected-window) t)
   (other-window 1)
   (add-to-list 'newsticker--treeview-windows (selected-window) t)
@@ -2003,7 +2036,8 @@ POS gives the position where EVENT occurred."
   (newsticker--treeview-frame-init)
   (newsticker--treeview-window-init)
   (newsticker--treeview-buffer-init)
-  (newsticker--group-manage-orphan-feeds)
+  (if (newsticker--group-manage-orphan-feeds)
+      (newsticker--treeview-tree-update))
   (newsticker--treeview-set-current-node newsticker--treeview-feed-tree)
   (newsticker-start t) ;; will start only if not running
   (newsticker-treeview-update)
@@ -2017,7 +2051,6 @@ POS gives the position where EVENT occurred."
   (when newsticker--treeview-current-feed
     (newsticker-get-news newsticker--treeview-current-feed)))
 
-(provide 'newsticker-treeview)
+(provide 'newst-treeview)
 
-;; arch-tag: 5dbaff48-1f3e-4fc6-8ebd-e966fc90d2d4
 ;;; newst-treeview.el ends here