# HG changeset patch # User Carsten Dominik # Date 1233153119 0 # Node ID 59ea090317cdcc54bf911ccdb89ccc565bdf851d # Parent 7e8c2c1eb8b84b60b9a04ba65e6619dcfc2aaca1 2009-01-28 Carsten Dominik * org-agenda.el (org-agenda-get-todos): Start search from correct position. * org.el (org-fast-todo-selection): Make sure TODO selection does not change buffer position. * org-list.el (org-toggle-checkbox): Implement adding or removing checkboxes from line or region when called with a prefix argument. * org-rmail.el (org-rmail-store-link): Protect the call to `rmail-narrow-to-non-pruned-header'. * org-clock.el (org-clock-special-range): Fix week display in clock tables. * org-exp.el (org-get-current-options): Fix bug when in indirect buffer. * org-agenda.el (org-agenda-dim-blocked-tasks): New option. (org-finalize-agenda): Call `org-agenda-dim-blocked-tasks'. (org-agenda-dim-blocked-tasks): New function. * org.el (org-enforce-todo-dependencies): New option. (org-block-todo-from-children-or-siblings): New function. * org-faces.el (org-agenda-dimmed-todo-face): New face. diff -r 7e8c2c1eb8b8 -r 59ea090317cd lisp/org/ChangeLog --- a/lisp/org/ChangeLog Wed Jan 28 11:50:18 2009 +0000 +++ b/lisp/org/ChangeLog Wed Jan 28 14:31:59 2009 +0000 @@ -1,3 +1,33 @@ +2009-01-28 Carsten Dominik + + * org-agenda.el (org-agenda-get-todos): Start search from correct + position. + + * org.el (org-fast-todo-selection): Make sure TODO selection does + not change buffer position. + + * org-list.el (org-toggle-checkbox): Implement adding or removing + checkboxes from line or region when called with a prefix + argument. + + * org-rmail.el (org-rmail-store-link): Protect the call to + `rmail-narrow-to-non-pruned-header'. + + * org-clock.el (org-clock-special-range): Fix week display in + clock tables. + + * org-exp.el (org-get-current-options): Fix bug when in indirect + buffer. + + * org-agenda.el (org-agenda-dim-blocked-tasks): New option. + (org-finalize-agenda): Call `org-agenda-dim-blocked-tasks'. + (org-agenda-dim-blocked-tasks): New function. + + * org.el (org-enforce-todo-dependencies): New option. + (org-block-todo-from-children-or-siblings): New function. + + * org-faces.el (org-agenda-dimmed-todo-face): New face. + 2009-01-27 Carsten Dominik * org.el (org-todo): Return correct state type even if the blocker diff -r 7e8c2c1eb8b8 -r 59ea090317cd lisp/org/org-agenda.el --- a/lisp/org/org-agenda.el Wed Jan 28 11:50:18 2009 +0000 +++ b/lisp/org/org-agenda.el Wed Jan 28 14:31:59 2009 +0000 @@ -6,7 +6,7 @@ ;; Author: Carsten Dominik ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.19e +;; Version: 6.20c ;; ;; This file is part of GNU Emacs. ;; @@ -513,6 +513,21 @@ :group 'org-agenda-daily/weekly :type 'boolean) +(defcustom org-agenda-dim-blocked-tasks t + "Non-nil means, dim blocked tasks in the agenda display. +This causes some overhead during agenda construction, but if you have turned +on `org-enforce-todo-dependencies' or any other blocking mechanism, this +will create useful feedback in the agenda. +Instead ot t, this variable can also have the value `invisible'. Then +blocked tasks will be invisible and only become visible when they +become unblocked." + :group 'org-agenda-daily/weekly + :group 'org-agenda-todo-list + :type '(choice + (const :tag "Do not dim" nil) + (const :tag "Dim to a grey face" t) + (const :tag "Make invisibe" invisible))) + (defcustom org-timeline-show-empty-dates 3 "Non-nil means, `org-timeline' also shows dates without an entry. When nil, only the days which actually have entries are shown. @@ -2132,6 +2147,8 @@ (org-agenda-columns)) (when org-agenda-fontify-priorities (org-fontify-priorities)) + (when (and org-agenda-dim-blocked-tasks org-blocker-hook) + (org-agenda-dim-blocked-tasks)) (run-hooks 'org-finalize-agenda-hook) (setq org-agenda-type (get-text-property (point) 'org-agenda-type)) ))) @@ -2162,6 +2179,36 @@ ((equal p h) 'bold))) (org-overlay-put ov 'org-type 'org-priority))))) +(defun org-agenda-dim-blocked-tasks () + "Dim currently blocked TODO's in the agenda display." + (mapc (lambda (o) (if (eq (org-overlay-get o 'org-type) 'org-blocked-todo) + (org-delete-overlay o))) + (org-overlays-in (point-min) (point-max))) + (save-excursion + (let ((inhibit-read-only t) + (invis (eq org-agenda-dim-blocked-tasks 'invisible)) + b e p ov h l) + (goto-char (point-min)) + (while (let ((pos (next-single-property-change (point) 'todo-state))) + (and pos (goto-char (1+ pos)))) + (let ((marker (get-text-property (point) 'org-hd-marker))) + (when (and marker + (not (with-current-buffer (marker-buffer marker) + (save-excursion + (goto-char marker) + (run-hook-with-args-until-failure + 'org-blocker-hook + (list :type 'todo-state-change + :position marker + :from 'todo + :to 'done)))))) + (setq b (if invis (max (point-min) (1- (point))) (point)) + e (point-at-eol) + ov (org-make-overlay b e)) + (if invis + (org-overlay-put ov 'invisible t) + (org-overlay-put ov 'face 'org-agenda-dimmed-todo-face)) + (org-overlay-put ov 'org-type 'org-blocked-todo))))))) (defvar org-agenda-skip-function nil "Function to be called at each match during agenda construction. @@ -3272,7 +3319,7 @@ (catch :skip (save-match-data (beginning-of-line) - (setq beg (point) end (progn (outline-next-heading) (point))) + (setq beg (point) end (save-excursion (outline-next-heading) (point))) (when (org-agenda-check-for-timestamp-as-reason-to-ignore-todo-item end) (goto-char (1+ beg)) (or org-agenda-todo-list-sublevels (org-end-of-subtree 'invisible)) diff -r 7e8c2c1eb8b8 -r 59ea090317cd lisp/org/org-archive.el --- a/lisp/org/org-archive.el Wed Jan 28 11:50:18 2009 +0000 +++ b/lisp/org/org-archive.el Wed Jan 28 14:31:59 2009 +0000 @@ -6,7 +6,7 @@ ;; Author: Carsten Dominik ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.19e +;; Version: 6.20c ;; ;; This file is part of GNU Emacs. ;; diff -r 7e8c2c1eb8b8 -r 59ea090317cd lisp/org/org-attach.el --- a/lisp/org/org-attach.el Wed Jan 28 11:50:18 2009 +0000 +++ b/lisp/org/org-attach.el Wed Jan 28 14:31:59 2009 +0000 @@ -4,7 +4,7 @@ ;; Author: John Wiegley ;; Keywords: org data task -;; Version: 6.19e +;; Version: 6.20c ;; This file is part of GNU Emacs. ;; diff -r 7e8c2c1eb8b8 -r 59ea090317cd lisp/org/org-bbdb.el --- a/lisp/org/org-bbdb.el Wed Jan 28 11:50:18 2009 +0000 +++ b/lisp/org/org-bbdb.el Wed Jan 28 14:31:59 2009 +0000 @@ -7,7 +7,7 @@ ;; Thomas Baumann ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.19e +;; Version: 6.20c ;; ;; This file is part of GNU Emacs. ;; diff -r 7e8c2c1eb8b8 -r 59ea090317cd lisp/org/org-bibtex.el --- a/lisp/org/org-bibtex.el Wed Jan 28 11:50:18 2009 +0000 +++ b/lisp/org/org-bibtex.el Wed Jan 28 14:31:59 2009 +0000 @@ -5,7 +5,7 @@ ;; Author: Bastien Guerry ;; Carsten Dominik ;; Keywords: org, wp, remember -;; Version: 6.19e +;; Version: 6.20c ;; ;; This file is part of GNU Emacs. ;; diff -r 7e8c2c1eb8b8 -r 59ea090317cd lisp/org/org-clock.el --- a/lisp/org/org-clock.el Wed Jan 28 11:50:18 2009 +0000 +++ b/lisp/org/org-clock.el Wed Jan 28 14:31:59 2009 +0000 @@ -6,7 +6,7 @@ ;; Author: Carsten Dominik ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.19e +;; Version: 6.20c ;; ;; This file is part of GNU Emacs. ;; @@ -724,6 +724,7 @@ (setq date (calendar-gregorian-from-absolute (calendar-absolute-from-iso (list w 1 y)))) (setq d (nth 1 date) month (car date) y (nth 2 date) + dow 1 key 'week)) ((string-match "^\\([0-9]+\\)-\\([0-9]\\{1,2\\}\\)-\\([0-9]\\{1,2\\}\\)$" skey) (setq y (string-to-number (match-string 1 skey)) diff -r 7e8c2c1eb8b8 -r 59ea090317cd lisp/org/org-colview.el --- a/lisp/org/org-colview.el Wed Jan 28 11:50:18 2009 +0000 +++ b/lisp/org/org-colview.el Wed Jan 28 14:31:59 2009 +0000 @@ -6,7 +6,7 @@ ;; Author: Carsten Dominik ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.19e +;; Version: 6.20c ;; ;; This file is part of GNU Emacs. ;; diff -r 7e8c2c1eb8b8 -r 59ea090317cd lisp/org/org-compat.el --- a/lisp/org/org-compat.el Wed Jan 28 11:50:18 2009 +0000 +++ b/lisp/org/org-compat.el Wed Jan 28 14:31:59 2009 +0000 @@ -6,7 +6,7 @@ ;; Author: Carsten Dominik ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.19e +;; Version: 6.20c ;; ;; This file is part of GNU Emacs. ;; diff -r 7e8c2c1eb8b8 -r 59ea090317cd lisp/org/org-exp.el --- a/lisp/org/org-exp.el Wed Jan 28 11:50:18 2009 +0000 +++ b/lisp/org/org-exp.el Wed Jan 28 14:31:59 2009 +0000 @@ -6,7 +6,7 @@ ;; Author: Carsten Dominik ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.19e +;; Version: 6.20c ;; ;; This file is part of GNU Emacs. ;; @@ -3031,7 +3031,10 @@ (mapconcat 'identity org-export-exclude-tags " ") org-export-html-link-up org-export-html-link-home - (file-name-nondirectory buffer-file-name) + (or (ignore-errors + (file-name-sans-extension + (file-name-nondirectory (buffer-file-name (buffer-base-buffer))))) + "NOFILENAME") "TODO FEEDBACK VERIFY DONE" "Me Jason Marie DONE" org-highest-priority org-lowest-priority org-default-priority diff -r 7e8c2c1eb8b8 -r 59ea090317cd lisp/org/org-export-latex.el --- a/lisp/org/org-export-latex.el Wed Jan 28 11:50:18 2009 +0000 +++ b/lisp/org/org-export-latex.el Wed Jan 28 14:31:59 2009 +0000 @@ -4,7 +4,7 @@ ;; ;; Emacs Lisp Archive Entry ;; Filename: org-export-latex.el -;; Version: 6.19e +;; Version: 6.20c ;; Author: Bastien Guerry ;; Maintainer: Bastien Guerry ;; Keywords: org, wp, tex diff -r 7e8c2c1eb8b8 -r 59ea090317cd lisp/org/org-faces.el --- a/lisp/org/org-faces.el Wed Jan 28 11:50:18 2009 +0000 +++ b/lisp/org/org-faces.el Wed Jan 28 14:31:59 2009 +0000 @@ -6,7 +6,7 @@ ;; Author: Carsten Dominik ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.19e +;; Version: 6.20c ;; ;; This file is part of GNU Emacs. ;; @@ -400,15 +400,15 @@ (defface org-clock-overlay ;; copied from secondary-selection (org-compatible-face nil '((((class color) (min-colors 88) (background light)) - :background "yellow1") + (:background "yellow1")) (((class color) (min-colors 88) (background dark)) - :background "SkyBlue4") + (:background "SkyBlue4")) (((class color) (min-colors 16) (background light)) - :background "yellow") + (:background "yellow")) (((class color) (min-colors 16) (background dark)) - :background "SkyBlue4") + (:background "SkyBlue4")) (((class color) (min-colors 8)) - :background "cyan" :foreground "black") + (:background "cyan" :foreground "black")) (t (:inverse-video t)))) "Basic face for displaying the secondary selection." :group 'org-faces) @@ -456,6 +456,11 @@ "Face for items scheduled for a certain day." :group 'org-faces) +(defface org-agenda-dimmed-todo-face + '((((background light)) (:foreground "grey50")) + (((background dark)) (:foreground "grey50"))) + "Face used to dimm blocked tasks in the agenda." + :group 'org-faces) (defface org-scheduled-previously (org-compatible-face nil diff -r 7e8c2c1eb8b8 -r 59ea090317cd lisp/org/org-footnote.el --- a/lisp/org/org-footnote.el Wed Jan 28 11:50:18 2009 +0000 +++ b/lisp/org/org-footnote.el Wed Jan 28 14:31:59 2009 +0000 @@ -5,7 +5,7 @@ ;; Author: Carsten Dominik ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.19e +;; Version: 6.20c ;; ;; This file is part of GNU Emacs. ;; diff -r 7e8c2c1eb8b8 -r 59ea090317cd lisp/org/org-gnus.el --- a/lisp/org/org-gnus.el Wed Jan 28 11:50:18 2009 +0000 +++ b/lisp/org/org-gnus.el Wed Jan 28 14:31:59 2009 +0000 @@ -7,7 +7,7 @@ ;; Tassilo Horn ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.19e +;; Version: 6.20c ;; ;; This file is part of GNU Emacs. ;; diff -r 7e8c2c1eb8b8 -r 59ea090317cd lisp/org/org-id.el --- a/lisp/org/org-id.el Wed Jan 28 11:50:18 2009 +0000 +++ b/lisp/org/org-id.el Wed Jan 28 14:31:59 2009 +0000 @@ -5,7 +5,7 @@ ;; Author: Carsten Dominik ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.19e +;; Version: 6.20c ;; ;; This file is part of GNU Emacs. ;; diff -r 7e8c2c1eb8b8 -r 59ea090317cd lisp/org/org-info.el --- a/lisp/org/org-info.el Wed Jan 28 11:50:18 2009 +0000 +++ b/lisp/org/org-info.el Wed Jan 28 14:31:59 2009 +0000 @@ -6,7 +6,7 @@ ;; Author: Carsten Dominik ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.19e +;; Version: 6.20c ;; ;; This file is part of GNU Emacs. ;; diff -r 7e8c2c1eb8b8 -r 59ea090317cd lisp/org/org-irc.el --- a/lisp/org/org-irc.el Wed Jan 28 11:50:18 2009 +0000 +++ b/lisp/org/org-irc.el Wed Jan 28 14:31:59 2009 +0000 @@ -4,7 +4,7 @@ ;; ;; Author: Philip Jackson ;; Keywords: erc, irc, link, org -;; Version: 6.19e +;; Version: 6.20c ;; ;; This file is part of GNU Emacs. ;; diff -r 7e8c2c1eb8b8 -r 59ea090317cd lisp/org/org-jsinfo.el --- a/lisp/org/org-jsinfo.el Wed Jan 28 11:50:18 2009 +0000 +++ b/lisp/org/org-jsinfo.el Wed Jan 28 14:31:59 2009 +0000 @@ -6,7 +6,7 @@ ;; Author: Carsten Dominik ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.19e +;; Version: 6.20c ;; ;; This file is part of GNU Emacs. ;; diff -r 7e8c2c1eb8b8 -r 59ea090317cd lisp/org/org-list.el --- a/lisp/org/org-list.el Wed Jan 28 11:50:18 2009 +0000 +++ b/lisp/org/org-list.el Wed Jan 28 14:31:59 2009 +0000 @@ -7,7 +7,7 @@ ;; Bastien Guerry ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.19e +;; Version: 6.20c ;; ;; This file is part of GNU Emacs. ;; @@ -248,11 +248,15 @@ (skip-chars-forward " \t") (looking-at "\\[[- X]\\]")))) -(defun org-toggle-checkbox (&optional arg) - "Toggle the checkbox in the current line." +(defun org-toggle-checkbox (&optional toggle-presence) + "Toggle the checkbox in the current line. +With prefix arg TOGGLE-PRESENCE, add or remove checkboxes. +When there is an active region, toggle status or presence of the checkbox +in the first line, and make every item in the region have the same +status or precence, respectively." (interactive "P") (catch 'exit - (let (beg end status (firstnew 'unknown)) + (let (beg end status first-present first-status) (cond ((org-region-active-p) (setq beg (region-beginning) end (region-end))) @@ -260,23 +264,46 @@ (setq beg (point) end (save-excursion (outline-next-heading) (point)))) ((org-at-item-checkbox-p) (let ((pos (point))) - (replace-match - (cond (arg "[-]") - ((member (match-string 0) '("[ ]" "[-]")) "[X]") - (t "[ ]")) - t t) + (if toggle-presence + (progn + (replace-match "") + (goto-char (match-beginning 0)) + (just-one-space)) + (replace-match + (cond ((member (match-string 0) '("[ ]" "[-]")) "[X]") + (t "[ ]")) + t t)) (goto-char pos)) (throw 'exit t)) + ((org-at-item-p) + ;; add a checkbox + (save-excursion + (goto-char (match-end 0)) + (insert "[ ] ")) + (throw 'exit t)) (t (error "Not at a checkbox or heading, and no active region"))) + (setq end (move-marker (make-marker) end)) (save-excursion (goto-char beg) + (setq first-present (org-at-item-checkbox-p) + first-status (and first-present (equal (match-string 0) "[X]"))) (while (< (point) end) - (when (org-at-item-checkbox-p) - (setq status (equal (match-string 0) "[X]")) - (when (eq firstnew 'unknown) - (setq firstnew (not status))) - (replace-match - (if (if arg (not status) firstnew) "[X]" "[ ]") t t)) + (if toggle-presence + (cond + ((and first-present (org-at-item-checkbox-p)) + (save-excursion + (replace-match "") + (goto-char (match-beginning 0)) + (just-one-space))) + ((and (not first-present) (not (org-at-item-checkbox-p)) + (org-at-item-p)) + (save-excursion + (goto-char (match-end 0)) + (insert "[ ] ")))) + (when (org-at-item-checkbox-p) + (setq status (equal (match-string 0) "[X]")) + (replace-match + (if first-status "[ ]" "[X]") t t))) (beginning-of-line 2))))) (org-update-checkbox-count-maybe)) diff -r 7e8c2c1eb8b8 -r 59ea090317cd lisp/org/org-mac-message.el --- a/lisp/org/org-mac-message.el Wed Jan 28 11:50:18 2009 +0000 +++ b/lisp/org/org-mac-message.el Wed Jan 28 14:31:59 2009 +0000 @@ -3,7 +3,7 @@ ;; Copyright (C) 2008, 2009 Free Software Foundation, Inc. ;; Author: John Wiegley -;; Version: 6.19e +;; Version: 6.20c ;; Keywords: outlines, hypermedia, calendar, wp ;; This file is part of GNU Emacs. diff -r 7e8c2c1eb8b8 -r 59ea090317cd lisp/org/org-macs.el --- a/lisp/org/org-macs.el Wed Jan 28 11:50:18 2009 +0000 +++ b/lisp/org/org-macs.el Wed Jan 28 14:31:59 2009 +0000 @@ -6,7 +6,7 @@ ;; Author: Carsten Dominik ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.19e +;; Version: 6.20c ;; ;; This file is part of GNU Emacs. ;; diff -r 7e8c2c1eb8b8 -r 59ea090317cd lisp/org/org-mew.el --- a/lisp/org/org-mew.el Wed Jan 28 11:50:18 2009 +0000 +++ b/lisp/org/org-mew.el Wed Jan 28 14:31:59 2009 +0000 @@ -5,7 +5,7 @@ ;; Author: Tokuya Kameshima ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.19e +;; Version: 6.20c ;; This file is part of GNU Emacs. diff -r 7e8c2c1eb8b8 -r 59ea090317cd lisp/org/org-mhe.el --- a/lisp/org/org-mhe.el Wed Jan 28 11:50:18 2009 +0000 +++ b/lisp/org/org-mhe.el Wed Jan 28 14:31:59 2009 +0000 @@ -6,7 +6,7 @@ ;; Author: Thomas Baumann ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.19e +;; Version: 6.20c ;; ;; This file is part of GNU Emacs. ;; diff -r 7e8c2c1eb8b8 -r 59ea090317cd lisp/org/org-mouse.el --- a/lisp/org/org-mouse.el Wed Jan 28 11:50:18 2009 +0000 +++ b/lisp/org/org-mouse.el Wed Jan 28 14:31:59 2009 +0000 @@ -4,7 +4,7 @@ ;; ;; Author: Piotr Zielinski ;; Maintainer: Carsten Dominik -;; Version: 6.19e +;; Version: 6.20c ;; ;; This file is part of GNU Emacs. ;; diff -r 7e8c2c1eb8b8 -r 59ea090317cd lisp/org/org-plot.el --- a/lisp/org/org-plot.el Wed Jan 28 11:50:18 2009 +0000 +++ b/lisp/org/org-plot.el Wed Jan 28 14:31:59 2009 +0000 @@ -5,7 +5,7 @@ ;; Author: Eric Schulte ;; Keywords: tables, plotting ;; Homepage: http://orgmode.org -;; Version: 6.19e +;; Version: 6.20c ;; ;; This file is part of GNU Emacs. ;; diff -r 7e8c2c1eb8b8 -r 59ea090317cd lisp/org/org-publish.el --- a/lisp/org/org-publish.el Wed Jan 28 11:50:18 2009 +0000 +++ b/lisp/org/org-publish.el Wed Jan 28 14:31:59 2009 +0000 @@ -4,7 +4,7 @@ ;; Author: David O'Toole ;; Maintainer: Bastien Guerry ;; Keywords: hypermedia, outlines, wp -;; Version: 6.19e +;; Version: 6.20c ;; This file is part of GNU Emacs. ;; diff -r 7e8c2c1eb8b8 -r 59ea090317cd lisp/org/org-remember.el --- a/lisp/org/org-remember.el Wed Jan 28 11:50:18 2009 +0000 +++ b/lisp/org/org-remember.el Wed Jan 28 14:31:59 2009 +0000 @@ -6,7 +6,7 @@ ;; Author: Carsten Dominik ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.19e +;; Version: 6.20c ;; ;; This file is part of GNU Emacs. ;; diff -r 7e8c2c1eb8b8 -r 59ea090317cd lisp/org/org-rmail.el --- a/lisp/org/org-rmail.el Wed Jan 28 11:50:18 2009 +0000 +++ b/lisp/org/org-rmail.el Wed Jan 28 14:31:59 2009 +0000 @@ -6,7 +6,7 @@ ;; Author: Carsten Dominik ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.19e +;; Version: 6.20c ;; ;; This file is part of GNU Emacs. ;; @@ -52,7 +52,8 @@ (save-restriction (when (eq major-mode 'rmail-summary-mode) (rmail-show-message rmail-current-message)) - (rmail-narrow-to-non-pruned-header) + (when (fboundp 'rmail-narrow-to-non-pruned-header) + (rmail-narrow-to-non-pruned-header)) (let* ((folder buffer-file-name) (message-id (mail-fetch-field "message-id")) (from (mail-fetch-field "from")) diff -r 7e8c2c1eb8b8 -r 59ea090317cd lisp/org/org-table.el --- a/lisp/org/org-table.el Wed Jan 28 11:50:18 2009 +0000 +++ b/lisp/org/org-table.el Wed Jan 28 14:31:59 2009 +0000 @@ -6,7 +6,7 @@ ;; Author: Carsten Dominik ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.19e +;; Version: 6.20c ;; ;; This file is part of GNU Emacs. ;; diff -r 7e8c2c1eb8b8 -r 59ea090317cd lisp/org/org-timer.el --- a/lisp/org/org-timer.el Wed Jan 28 11:50:18 2009 +0000 +++ b/lisp/org/org-timer.el Wed Jan 28 14:31:59 2009 +0000 @@ -5,7 +5,7 @@ ;; Author: Carsten Dominik ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.19e +;; Version: 6.20c ;; ;; This file is part of GNU Emacs. ;; diff -r 7e8c2c1eb8b8 -r 59ea090317cd lisp/org/org-vm.el --- a/lisp/org/org-vm.el Wed Jan 28 11:50:18 2009 +0000 +++ b/lisp/org/org-vm.el Wed Jan 28 14:31:59 2009 +0000 @@ -6,7 +6,7 @@ ;; Author: Carsten Dominik ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.19e +;; Version: 6.20c ;; ;; This file is part of GNU Emacs. ;; diff -r 7e8c2c1eb8b8 -r 59ea090317cd lisp/org/org-w3m.el --- a/lisp/org/org-w3m.el Wed Jan 28 11:50:18 2009 +0000 +++ b/lisp/org/org-w3m.el Wed Jan 28 14:31:59 2009 +0000 @@ -5,7 +5,7 @@ ;; Author: Andy Stewart ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.19e +;; Version: 6.20c ;; ;; This file is part of GNU Emacs. ;; diff -r 7e8c2c1eb8b8 -r 59ea090317cd lisp/org/org-wl.el --- a/lisp/org/org-wl.el Wed Jan 28 11:50:18 2009 +0000 +++ b/lisp/org/org-wl.el Wed Jan 28 14:31:59 2009 +0000 @@ -6,7 +6,7 @@ ;; Author: Tokuya Kameshima ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.19e +;; Version: 6.20c ;; ;; This file is part of GNU Emacs. ;; diff -r 7e8c2c1eb8b8 -r 59ea090317cd lisp/org/org.el --- a/lisp/org/org.el Wed Jan 28 11:50:18 2009 +0000 +++ b/lisp/org/org.el Wed Jan 28 14:31:59 2009 +0000 @@ -6,7 +6,7 @@ ;; Author: Carsten Dominik ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.19e +;; Version: 6.20c ;; ;; This file is part of GNU Emacs. ;; @@ -94,7 +94,7 @@ ;;; Version -(defconst org-version "6.19e" +(defconst org-version "6.20c" "The version number of the file org.el.") (defun org-version (&optional here) @@ -1603,6 +1603,49 @@ :group 'org-todo :type 'hook) +(defvar org-blocker-hook nil + "Hook for functions that are allowed to block a state change. + +Each function gets as its single argument a property list, see +`org-trigger-hook' for more information about this list. + +If any of the functions in this hook returns nil, the state change +is blocked.") + +(defvar org-trigger-hook nil + "Hook for functions that are triggered by a state change. + +Each function gets as its single argument a property list with at least +the following elements: + + (:type type-of-change :position pos-at-entry-start + :from old-state :to new-state) + +Depending on the type, more properties may be present. + +This mechanism is currently implemented for: + +TODO state changes +------------------ +:type todo-state-change +:from previous state (keyword as a string), or nil, or a symbol + 'todo' or 'done', to indicate the general type of state. +:to new state, like in :from") + +(defcustom org-enforce-todo-dependencies nil + "Non-nil means, undone TODO entries will block switching the parent to DONE. +Also, if a parent has an :ORDERED: property, switching an entry to DONE will +be blocked if any prior sibling is not yet done. +You need to set this variable through the customize interface, or to +restart emacs after changing the value." + :set (lambda (var val) + (set var val) + (if val + (add-hook 'org-blocker-hook 'org-block-todo-from-children-or-siblings) + (remove-hook 'org-blocker-hook 'org-block-todo-from-children-or-siblings))) + :group 'org-todo + :type 'boolean) + (defcustom org-todo-state-tags-triggers nil "Tag changes that should be triggered by TODO state changes. This is a list. Each entry is @@ -8272,34 +8315,6 @@ (push (nth 2 e) rtn))) rtn))))) -(defvar org-blocker-hook nil - "Hook for functions that are allowed to block a state change. - -Each function gets as its single argument a property list, see -`org-trigger-hook' for more information about this list. - -If any of the functions in this hook returns nil, the state change -is blocked.") - -(defvar org-trigger-hook nil - "Hook for functions that are triggered by a state change. - -Each function gets as its single argument a property list with at least -the following elements: - - (:type type-of-change :position pos-at-entry-start - :from old-state :to new-state) - -Depending on the type, more properties may be present. - -This mechanism is currently implemented for: - -TODO state changes ------------------- -:type todo-state-change -:from previous state (keyword as a string), or nil -:to new state (keyword as a string), or nil") - (defvar org-agenda-headline-snapshot-before-repeat) (defun org-todo (&optional arg) "Change the TODO state of an item. @@ -8492,6 +8507,60 @@ (save-excursion (run-hook-with-args 'org-trigger-hook change-plist))))))) +(defun org-block-todo-from-children-or-siblings (change-plist) + "Block turning an entry into a TODO, using the hierarchy. +This checks whether the current task should be blocked from state +changes. Such blocking occurs when: + + 1. The task has children which are not all in a completed state. + + 2. A task has a parent with the property :ORDERED:, and there + are siblings prior to the current task with incomplete + status." + (catch 'dont-block + ;; If this is not a todo state change, or if this entry is already DONE, + ;; do not block + (when (or (not (eq (plist-get change-plist :type) 'todo-state-change)) + (member (plist-get change-plist :from) + (cons 'done org-done-keywords))) + (throw 'dont-block t)) + ;; If this task has children, and any are undone, it's blocked + (save-excursion + (org-back-to-heading t) + (let ((this-level (funcall outline-level))) + (outline-next-heading) + (let ((child-level (funcall outline-level))) + (while (and (not (eobp)) + (> child-level this-level)) + ;; this todo has children, check whether they are all + ;; completed + (if (and (not (org-entry-is-done-p)) + (org-entry-is-todo-p)) + (throw 'dont-block nil)) + (outline-next-heading) + (setq child-level (funcall outline-level)))))) + ;; Otherwise, if the task's parent has the :ORDERED: property, and + ;; any previous siblings are undone, it's blocked + (save-excursion + (org-back-to-heading t) + (when (save-excursion + (ignore-errors + (outline-up-heading 1) + (org-entry-get (point) "ORDERED"))) + (let* ((this-level (funcall outline-level)) + (current-level this-level)) + (while (and (not (bobp)) + (= current-level this-level)) + (outline-previous-heading) + (setq current-level (funcall outline-level)) + (if (= current-level this-level) + ;; this todo has children, check whether they are all + ;; completed + (if (and (not (org-entry-is-done-p)) + (org-entry-is-todo-p)) + (throw 'dont-block nil))))))) + t)) ; don't block + (defun org-update-parent-todo-statistics () "Update any statistics cookie in the parent of the current headline." (interactive) @@ -8599,49 +8668,50 @@ (ncol (/ (- (window-width) 4) fwidth)) tg cnt e c tbl groups ingroup) - (save-window-excursion - (if expert - (set-buffer (get-buffer-create " *Org todo*")) - (org-switch-to-buffer-other-window (get-buffer-create " *Org todo*"))) - (erase-buffer) - (org-set-local 'org-done-keywords done-keywords) - (setq tbl fulltable cnt 0) - (while (setq e (pop tbl)) + (save-excursion + (save-window-excursion + (if expert + (set-buffer (get-buffer-create " *Org todo*")) + (org-switch-to-buffer-other-window (get-buffer-create " *Org todo*"))) + (erase-buffer) + (org-set-local 'org-done-keywords done-keywords) + (setq tbl fulltable cnt 0) + (while (setq e (pop tbl)) + (cond + ((equal e '(:startgroup)) + (push '() groups) (setq ingroup t) + (when (not (= cnt 0)) + (setq cnt 0) + (insert "\n")) + (insert "{ ")) + ((equal e '(:endgroup)) + (setq ingroup nil cnt 0) + (insert "}\n")) + (t + (setq tg (car e) c (cdr e)) + (if ingroup (push tg (car groups))) + (setq tg (org-add-props tg nil 'face + (org-get-todo-face tg))) + (if (and (= cnt 0) (not ingroup)) (insert " ")) + (insert "[" c "] " tg (make-string + (- fwidth 4 (length tg)) ?\ )) + (when (= (setq cnt (1+ cnt)) ncol) + (insert "\n") + (if ingroup (insert " ")) + (setq cnt 0))))) + (insert "\n") + (goto-char (point-min)) + (if (not expert) (org-fit-window-to-buffer)) + (message "[a-z..]:Set [SPC]:clear") + (setq c (let ((inhibit-quit t)) (read-char-exclusive))) (cond - ((equal e '(:startgroup)) - (push '() groups) (setq ingroup t) - (when (not (= cnt 0)) - (setq cnt 0) - (insert "\n")) - (insert "{ ")) - ((equal e '(:endgroup)) - (setq ingroup nil cnt 0) - (insert "}\n")) - (t - (setq tg (car e) c (cdr e)) - (if ingroup (push tg (car groups))) - (setq tg (org-add-props tg nil 'face - (org-get-todo-face tg))) - (if (and (= cnt 0) (not ingroup)) (insert " ")) - (insert "[" c "] " tg (make-string - (- fwidth 4 (length tg)) ?\ )) - (when (= (setq cnt (1+ cnt)) ncol) - (insert "\n") - (if ingroup (insert " ")) - (setq cnt 0))))) - (insert "\n") - (goto-char (point-min)) - (if (not expert) (org-fit-window-to-buffer)) - (message "[a-z..]:Set [SPC]:clear") - (setq c (let ((inhibit-quit t)) (read-char-exclusive))) - (cond - ((or (= c ?\C-g) - (and (= c ?q) (not (rassoc c fulltable)))) - (setq quit-flag t)) - ((= c ?\ ) nil) - ((setq e (rassoc c fulltable) tg (car e)) - tg) - (t (setq quit-flag t)))))) + ((or (= c ?\C-g) + (and (= c ?q) (not (rassoc c fulltable)))) + (setq quit-flag t)) + ((= c ?\ ) nil) + ((setq e (rassoc c fulltable) tg (car e)) + tg) + (t (setq quit-flag t))))))) (defun org-entry-is-todo-p () (member (org-get-todo-state) org-not-done-keywords))