2009-01-28 Carsten Dominik <carsten.dominik@gmail.com>

* 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.
This commit is contained in:
Carsten Dominik 2009-01-28 14:33:23 +00:00
parent f088b05476
commit d6685abc9e
35 changed files with 314 additions and 126 deletions

View file

@ -1,3 +1,7 @@
2009-01-28 Carsten Dominik <dominik@science.uva.nl>
* org.texi (TODO dependencies): New section.
2009-01-27 Carsten Dominik <dominik@science.uva.nl>
* org.texi (Plain lists, TODO basics, Priorities)

View file

@ -1,3 +1,33 @@
2009-01-28 Carsten Dominik <carsten.dominik@gmail.com>
* 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 <carsten.dominik@gmail.com>
* org.el (org-todo): Return correct state type even if the blocker

View file

@ -6,7 +6,7 @@
;; Author: Carsten Dominik <carsten at orgmode dot org>
;; 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 @@ deadlines are always turned off when the item is DONE."
: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 @@ VALUE defaults to t."
(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 @@ VALUE defaults to t."
((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 @@ the documentation of `org-diary'."
(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))

View file

@ -6,7 +6,7 @@
;; Author: Carsten Dominik <carsten at orgmode dot org>
;; Keywords: outlines, hypermedia, calendar, wp
;; Homepage: http://orgmode.org
;; Version: 6.19e
;; Version: 6.20c
;;
;; This file is part of GNU Emacs.
;;

View file

@ -4,7 +4,7 @@
;; Author: John Wiegley <johnw@newartisans.com>
;; Keywords: org data task
;; Version: 6.19e
;; Version: 6.20c
;; This file is part of GNU Emacs.
;;

View file

@ -7,7 +7,7 @@
;; Thomas Baumann <thomas dot baumann at ch dot tum dot de>
;; Keywords: outlines, hypermedia, calendar, wp
;; Homepage: http://orgmode.org
;; Version: 6.19e
;; Version: 6.20c
;;
;; This file is part of GNU Emacs.
;;

View file

@ -5,7 +5,7 @@
;; Author: Bastien Guerry <bzg at altern dot org>
;; Carsten Dominik <carsten dot dominik at gmail dot com>
;; Keywords: org, wp, remember
;; Version: 6.19e
;; Version: 6.20c
;;
;; This file is part of GNU Emacs.
;;

View file

@ -6,7 +6,7 @@
;; Author: Carsten Dominik <carsten at orgmode dot org>
;; 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 @@ the returned times will be formatted strings."
(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))

View file

@ -6,7 +6,7 @@
;; Author: Carsten Dominik <carsten at orgmode dot org>
;; Keywords: outlines, hypermedia, calendar, wp
;; Homepage: http://orgmode.org
;; Version: 6.19e
;; Version: 6.20c
;;
;; This file is part of GNU Emacs.
;;

View file

@ -6,7 +6,7 @@
;; Author: Carsten Dominik <carsten at orgmode dot org>
;; Keywords: outlines, hypermedia, calendar, wp
;; Homepage: http://orgmode.org
;; Version: 6.19e
;; Version: 6.20c
;;
;; This file is part of GNU Emacs.
;;

View file

@ -6,7 +6,7 @@
;; Author: Carsten Dominik <carsten at orgmode dot org>
;; 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 @@ Does include HTML export options as well as TODO and CATEGORY stuff."
(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

View file

@ -4,7 +4,7 @@
;;
;; Emacs Lisp Archive Entry
;; Filename: org-export-latex.el
;; Version: 6.19e
;; Version: 6.20c
;; Author: Bastien Guerry <bzg AT altern DOT org>
;; Maintainer: Bastien Guerry <bzg AT altern DOT org>
;; Keywords: org, wp, tex

View file

@ -6,7 +6,7 @@
;; Author: Carsten Dominik <carsten at orgmode dot org>
;; 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 @@ changes."
(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 @@ belong to the weekend.")
"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

View file

@ -5,7 +5,7 @@
;; Author: Carsten Dominik <carsten at orgmode dot org>
;; Keywords: outlines, hypermedia, calendar, wp
;; Homepage: http://orgmode.org
;; Version: 6.19e
;; Version: 6.20c
;;
;; This file is part of GNU Emacs.
;;

View file

@ -7,7 +7,7 @@
;; Tassilo Horn <tassilo at member dot fsf dot org>
;; Keywords: outlines, hypermedia, calendar, wp
;; Homepage: http://orgmode.org
;; Version: 6.19e
;; Version: 6.20c
;;
;; This file is part of GNU Emacs.
;;

View file

@ -5,7 +5,7 @@
;; Author: Carsten Dominik <carsten at orgmode dot org>
;; Keywords: outlines, hypermedia, calendar, wp
;; Homepage: http://orgmode.org
;; Version: 6.19e
;; Version: 6.20c
;;
;; This file is part of GNU Emacs.
;;

View file

@ -6,7 +6,7 @@
;; Author: Carsten Dominik <carsten at orgmode dot org>
;; Keywords: outlines, hypermedia, calendar, wp
;; Homepage: http://orgmode.org
;; Version: 6.19e
;; Version: 6.20c
;;
;; This file is part of GNU Emacs.
;;

View file

@ -4,7 +4,7 @@
;;
;; Author: Philip Jackson <emacs@shellarchive.co.uk>
;; Keywords: erc, irc, link, org
;; Version: 6.19e
;; Version: 6.20c
;;
;; This file is part of GNU Emacs.
;;

View file

@ -6,7 +6,7 @@
;; Author: Carsten Dominik <carsten at orgmode dot org>
;; Keywords: outlines, hypermedia, calendar, wp
;; Homepage: http://orgmode.org
;; Version: 6.19e
;; Version: 6.20c
;;
;; This file is part of GNU Emacs.
;;

View file

@ -7,7 +7,7 @@
;; Bastien Guerry <bzg AT altern DOT org>
;; 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 @@ Return t when things worked, nil when we are not in an item."
(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 @@ Return t when things worked, nil when we are not in an item."
(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))

View file

@ -3,7 +3,7 @@
;; Copyright (C) 2008, 2009 Free Software Foundation, Inc.
;; Author: John Wiegley <johnw@gnu.org>
;; Version: 6.19e
;; Version: 6.20c
;; Keywords: outlines, hypermedia, calendar, wp
;; This file is part of GNU Emacs.

View file

@ -6,7 +6,7 @@
;; Author: Carsten Dominik <carsten at orgmode dot org>
;; Keywords: outlines, hypermedia, calendar, wp
;; Homepage: http://orgmode.org
;; Version: 6.19e
;; Version: 6.20c
;;
;; This file is part of GNU Emacs.
;;

View file

@ -5,7 +5,7 @@
;; Author: Tokuya Kameshima <kames at fa2 dot so-net dot ne dot jp>
;; Keywords: outlines, hypermedia, calendar, wp
;; Homepage: http://orgmode.org
;; Version: 6.19e
;; Version: 6.20c
;; This file is part of GNU Emacs.

View file

@ -6,7 +6,7 @@
;; Author: Thomas Baumann <thomas dot baumann at ch dot tum dot de>
;; Keywords: outlines, hypermedia, calendar, wp
;; Homepage: http://orgmode.org
;; Version: 6.19e
;; Version: 6.20c
;;
;; This file is part of GNU Emacs.
;;

View file

@ -4,7 +4,7 @@
;;
;; Author: Piotr Zielinski <piotr dot zielinski at gmail dot com>
;; Maintainer: Carsten Dominik <carsten at orgmode dot org>
;; Version: 6.19e
;; Version: 6.20c
;;
;; This file is part of GNU Emacs.
;;

View file

@ -5,7 +5,7 @@
;; Author: Eric Schulte <schulte dot eric at gmail dot com>
;; Keywords: tables, plotting
;; Homepage: http://orgmode.org
;; Version: 6.19e
;; Version: 6.20c
;;
;; This file is part of GNU Emacs.
;;

View file

@ -4,7 +4,7 @@
;; Author: David O'Toole <dto@gnu.org>
;; Maintainer: Bastien Guerry <bzg AT altern DOT org>
;; Keywords: hypermedia, outlines, wp
;; Version: 6.19e
;; Version: 6.20c
;; This file is part of GNU Emacs.
;;

View file

@ -6,7 +6,7 @@
;; Author: Carsten Dominik <carsten at orgmode dot org>
;; Keywords: outlines, hypermedia, calendar, wp
;; Homepage: http://orgmode.org
;; Version: 6.19e
;; Version: 6.20c
;;
;; This file is part of GNU Emacs.
;;

View file

@ -6,7 +6,7 @@
;; Author: Carsten Dominik <carsten at orgmode dot org>
;; 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"))

View file

@ -6,7 +6,7 @@
;; Author: Carsten Dominik <carsten at orgmode dot org>
;; Keywords: outlines, hypermedia, calendar, wp
;; Homepage: http://orgmode.org
;; Version: 6.19e
;; Version: 6.20c
;;
;; This file is part of GNU Emacs.
;;

View file

@ -5,7 +5,7 @@
;; Author: Carsten Dominik <carsten at orgmode dot org>
;; Keywords: outlines, hypermedia, calendar, wp
;; Homepage: http://orgmode.org
;; Version: 6.19e
;; Version: 6.20c
;;
;; This file is part of GNU Emacs.
;;

View file

@ -6,7 +6,7 @@
;; Author: Carsten Dominik <carsten at orgmode dot org>
;; Keywords: outlines, hypermedia, calendar, wp
;; Homepage: http://orgmode.org
;; Version: 6.19e
;; Version: 6.20c
;;
;; This file is part of GNU Emacs.
;;

View file

@ -5,7 +5,7 @@
;; Author: Andy Stewart <lazycat dot manatee at gmail dot com>
;; Keywords: outlines, hypermedia, calendar, wp
;; Homepage: http://orgmode.org
;; Version: 6.19e
;; Version: 6.20c
;;
;; This file is part of GNU Emacs.
;;

View file

@ -6,7 +6,7 @@
;; Author: Tokuya Kameshima <kames at fa2 dot so-net dot ne dot jp>
;; Keywords: outlines, hypermedia, calendar, wp
;; Homepage: http://orgmode.org
;; Version: 6.19e
;; Version: 6.20c
;;
;; This file is part of GNU Emacs.
;;

View file

@ -6,7 +6,7 @@
;; Author: Carsten Dominik <carsten at orgmode dot org>
;; 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 @@ Lisp variable `state'."
: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 @@ this is nil.")
(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 @@ For calling through lisp, arg is also interpreted in the following way:
(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 @@ Returns the new TODO keyword, or nil if no state change should occur."
(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))