X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/27cacd2d42b66bac45c7317c7edb0b7323e8dfc7..42b2a986d9d4b7040fb20c90ec0efeffb78e761a:/lisp/net/newst-treeview.el diff --git a/lisp/net/newst-treeview.el b/lisp/net/newst-treeview.el index 01b08c2d66..d003554e54 100644 --- a/lisp/net/newst-treeview.el +++ b/lisp/net/newst-treeview.el @@ -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 ;; 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 ;; ====================================================================== @@ -35,10 +35,9 @@ ;;; 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