changeset 93270:639cd5027418

(diary-face-attrs): Fix type of `width'. (list-diary-entries-hook, mark-diary-entries-hook) (include-other-diary-files, mark-included-diary-files): Doc fixes. (diary-set-header): New function. (diary-header-line-flag, diary-header-line-format): Use diary-set-header for custom :set function. (diary-set-maybe-redraw): Use symbol-value rather than eval. (diary-attrtype-convert): Use intern-soft rather than read. (diary-display-no-entries): New function. (simple-diary-display, fancy-diary-display): Use it. (fancy-diary-display): Doc fix. Remove unneeded local entry-list.
author Glenn Morris <rgm@gnu.org>
date Thu, 27 Mar 2008 02:50:38 +0000
parents da37495d5c85
children b5f8f750271f
files lisp/calendar/diary-lib.el
diffstat 1 files changed, 110 insertions(+), 113 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/calendar/diary-lib.el	Thu Mar 27 02:48:08 2008 +0000
+++ b/lisp/calendar/diary-lib.el	Thu Mar 27 02:50:38 2008 +0000
@@ -84,7 +84,7 @@
 (defcustom diary-face-attrs
   '((" *\\[foreground:\\([-a-z]+\\)\\]$" 1 :foreground string)
     (" *\\[background:\\([-a-z]+\\)\\]$" 1 :background string)
-    (" *\\[width:\\([-a-z]+\\)\\]$" 1 :width symbol)
+    (" *\\[width:\\([-a-z]+\\)\\]$" 1 :width int)
     (" *\\[height:\\([-0-9a-z]+\\)\\]$" 1 :height int)
     (" *\\[weight:\\([-a-z]+\\)\\]$" 1 :weight symbol)
     (" *\\[slant:\\([-a-z]+\\)\\]$" 1 :slant symbol)
@@ -139,25 +139,11 @@
   :type 'string
   :group 'diary)
 
-;; FIXME
 (defcustom list-diary-entries-hook nil
   "List of functions called after diary file is culled for relevant entries.
-It is to be used for diary entries that are not found in the diary file.
-
-A function `include-other-diary-files' is provided for use as the value of
-this hook.  This function enables you to use shared diary files together
-with your own.  The files included are specified in the diary file by lines
-of the form
-
-        #include \"filename\"
-
-This is recursive; that is, #include directives in files thus included are
-obeyed.  You can change the \"#include\" to some other string by changing
-the variable `diary-include-string'.  When you use `include-other-diary-files'
-as part of the list-diary-entries-hook, you will probably also want to use the
-function `mark-included-diary-files' as part of `mark-diary-entries-hook'.
-
-For example, you could use
+You might wish to add `include-other-diary-files', in which case
+you will probably also want to add `mark-included-diary-files' to
+`mark-diary-entries-hook'.  For example, you could use
 
      (add-hook 'list-diary-entries-hook 'include-other-diary-files)
      (add-hook 'list-diary-entries-hook 'sort-diary-entries)
@@ -170,20 +156,11 @@
   :options '(include-other-diary-files sort-diary-entries)
   :group 'diary)
 
-;; FIXME
 (defcustom mark-diary-entries-hook nil
   "List of functions called after marking diary entries in the calendar.
-
-A function `mark-included-diary-files' is also provided for use as the
-`mark-diary-entries-hook'; it enables you to use shared diary files together
-with your own.  The files included are specified in the diary file by lines
-of the form
-        #include \"filename\"
-This is recursive; that is, #include directives in files thus included are
-obeyed.  You can change the \"#include\" to some other string by changing the
-variable `diary-include-string'.  When you use `mark-included-diary-files' as
-part of the mark-diary-entries-hook, you will probably also want to use the
-function `include-other-diary-files' as part of `list-diary-entries-hook'."
+You might wish to add `mark-included-diary-files', in which case
+you will probably also want to add `include-other-diary-files' to
+`list-diary-entries-hook'."
   :type 'hook
   :options '(mark-included-diary-files)
   :group 'diary)
@@ -306,6 +283,49 @@
   :group 'diary)
 
 
+(defun diary-set-header (symbol value)
+  "Set SYMBOL's value to VALUE, and redraw the diary header if necessary."
+  (let ((oldvalue (symbol-value symbol))
+        (dbuff (and diary-file
+                    (find-buffer-visiting
+                     (substitute-in-file-name diary-file)))))
+    (custom-set-default symbol value)
+    (and dbuff
+         (not (equal value oldvalue))
+         (with-current-buffer dbuff
+           (if (eq major-mode 'diary-mode)
+               (setq header-line-format (and diary-header-line-flag
+                                             diary-header-line-format)))))))
+
+;; This can be removed once the kill/yank treatment of invisible text
+;; (see etc/TODO) is fixed. -- gm
+(defcustom diary-header-line-flag t
+  "Non-nil means `simple-diary-display' will show a header line.
+The format of the header is specified by `diary-header-line-format'."
+  :group   'diary
+  :type    'boolean
+  :initialize 'custom-initialize-default
+  :set 'diary-set-header
+  :version "22.1")
+
+(defvar diary-selective-display nil
+  "Internal diary variable; non-nil if some diary text is hidden.")
+
+(defcustom diary-header-line-format
+  '(:eval (calendar-string-spread
+           (list (if diary-selective-display
+                     "Some text is hidden - press \"s\" in calendar \
+before edit/copy"
+                   "Diary"))
+           ?\s (frame-width)))
+  "Format of the header line displayed by `simple-diary-display'.
+Only used if `diary-header-line-flag' is non-nil."
+  :group 'diary
+  :type 'sexp
+  :initialize 'custom-initialize-default
+  :set 'diary-set-header
+  :version "22.1")
+
 ;; The first version of this also checked for diary-selective-display
 ;; in the non-fancy case. This was an attempt to distinguish between
 ;; displaying the diary and just visiting the diary file. However,
@@ -329,45 +349,13 @@
   "Set SYMBOL's value to VALUE, and redraw the diary if necessary.
 Redraws the diary if it is being displayed (note this is not the same as
 just visiting the `diary-file'), and SYMBOL's value is to be changed."
-  (let ((oldvalue (eval symbol)))       ; FIXME symbol-value?
+  (let ((oldvalue (symbol-value symbol)))
     (custom-set-default symbol value)
     (and (not (equal value oldvalue))
          (diary-live-p)
          ;; Note this assumes diary was called without prefix arg.
          (diary))))
 
-(defvar diary-selective-display nil
-  "Internal diary variable; non-nil if some diary text is hidden.")
-
-
-;; This can be removed once the kill/yank treatment of invisible text
-;; (see etc/TODO) is fixed. -- gm
-(defcustom diary-header-line-flag t
-  "Non-nil means `simple-diary-display' will show a header line.
-The format of the header is specified by `diary-header-line-format'."
-  :group   'diary
-  :type    'boolean
-  :initialize 'custom-initialize-default
-  ;; FIXME overkill.
-  :set 'diary-set-maybe-redraw
-  :version "22.1")
-
-(defcustom diary-header-line-format
-  '(:eval (calendar-string-spread
-           (list (if diary-selective-display
-                     "Some text is hidden - press \"s\" in calendar \
-before edit/copy"
-                   "Diary"))
-           ?\s (frame-width)))
-  "Format of the header line displayed by `simple-diary-display'.
-Only used if `diary-header-line-flag' is non-nil."
-  :group 'diary
-  :type 'sexp
-  :initialize 'custom-initialize-default
-  ;; FIXME overkill.
-  :set 'diary-set-maybe-redraw
-  :version "22.1")
-
 (defcustom number-of-diary-entries 1
   "Specifies how many days of diary entries are to be displayed initially.
 This variable affects the diary display when the command \\[diary] is used,
@@ -460,7 +448,7 @@
   "Convert string ATTRVALUE to TYPE appropriate for a face description.
 Valid TYPEs are: string, symbol, int, stringtnil, tnil."
   (cond ((eq type 'string) attrvalue)
-        ((eq type 'symbol) (read attrvalue)) ; FIXME intern-soft?
+        ((eq type 'symbol) (intern-soft attrvalue))
         ((eq type 'int) (string-to-number attrvalue))
         ((eq type 'stringtnil)
          (cond ((string-equal "t" attrvalue) t)
@@ -713,7 +701,7 @@
         ;; d-s-p is passed to the diary display function.
         (let ((diary-saved-point (point)))
           (save-excursion
-            ;; FIXME move after goto?
+            ;; FIXME move after goto? Syntax?
             (setq file-glob-attrs (cadr (diary-pull-attrs nil "")))
             (with-syntax-table diary-syntax-table
               (goto-char (point-min))
@@ -754,7 +742,7 @@
 
 (defun include-other-diary-files ()
   "Include the diary entries from other diary files with those of `diary-file'.
-This function is suitable for use in `list-diary-entries-hook';
+This function is suitable for use with `list-diary-entries-hook';
 it enables you to use shared diary files together with your own.
 The files included are specified in the `diary-file' by lines of this form:
         #include \"filename\"
@@ -787,36 +775,58 @@
         (sleep-for 2))))
   (goto-char (point-min)))
 
-;; Bound in diary-list-entries.
-(defvar date-string)
-(defvar diary-saved-point)
+(defvar date-string)                    ; bound in diary-list-entries
 
-;; FIXME common code with fancy-diary-display.
+(defun diary-display-no-entries ()
+  "Common subroutine of `simple-diary-display' and `fancy-diary-display'.
+Handles the case where there are no diary entries.
+Returns a cons (NOENTRIES . HOLIDAY-STRING)."
+    (let* ((holiday-list (if holidays-in-diary-buffer
+                             (calendar-check-holidays original-date)))
+           (hol-string (format "%s%s%s"
+                               date-string
+                               (if holiday-list ": " "")
+                               (mapconcat 'identity holiday-list "; ")))
+           (msg (format "No diary entries for %s" hol-string))
+           ;; Empty list, or single item with no text.
+           ;; FIXME multiple items with no text?
+           (noentries (or (not diary-entries-list)
+                          (and (not (cdr diary-entries-list))
+                               (string-equal "" (cadr
+                                                 (car diary-entries-list)))))))
+      ;; Inconsistency: whether or not the holidays are displayed in a
+      ;; separate buffer depends on if there are diary entries.
+      (when noentries
+        (if (or (< (length msg) (frame-width))
+                (not holiday-list))
+            (message "%s" msg)
+          ;; holiday-list which is too wide for a message gets a buffer.
+          (calendar-in-read-only-buffer holiday-buffer
+            (calendar-set-mode-line (format "Holidays for %s" date-string))
+            (insert (mapconcat 'identity holiday-list "\n")))
+          (message "No diary entries for %s" date-string)))
+      (cons noentries hol-string)))
+
+
+(defvar diary-saved-point)              ; bound in diary-list-entries
+
 (defun simple-diary-display ()
   "Display the diary buffer if there are any relevant entries or holidays."
-  (let* ((holiday-list (if holidays-in-diary-buffer
-                           (calendar-check-holidays original-date)))
-         (hol-string (format "%s%s%s"
-                             date-string
-                             (if holiday-list ": " "")
-                             (mapconcat 'identity holiday-list "; ")))
-         (msg (format "No diary entries for %s" hol-string))
-         ;; If selected window is dedicated (to the calendar),
-         ;; need a new one to display the diary.
-         (pop-up-frames (or pop-up-frames
-                            (window-dedicated-p (selected-window)))))
-    (calendar-set-mode-line (format "Diary for %s" hol-string))
-    (if (or (not diary-entries-list)
-            (and (not (cdr diary-entries-list))
-                 (string-equal (cadr (car diary-entries-list)) "")))
-        (if (< (length msg) (frame-width))
-            (message "%s" msg)
-          (calendar-in-read-only-buffer holiday-buffer
-            (calendar-set-mode-line date-string)
-            (insert (mapconcat 'identity holiday-list "\n")))
-          (message  "No diary entries for %s" date-string))
-      (with-current-buffer
-          (find-buffer-visiting (substitute-in-file-name diary-file))
+  ;; If selected window is dedicated (to the calendar), need a new one
+  ;; to display the diary.
+  (let* ((pop-up-frames (or pop-up-frames
+                            (window-dedicated-p (selected-window))))
+         (dbuff (find-buffer-visiting (substitute-in-file-name diary-file)))
+         (empty (diary-display-no-entries)))
+    ;; This may be too wide, but when simple diary is used there is
+    ;; nowhere else for the holidays to go.  Also, it is documented in
+    ;; holidays-in-diary-buffer that the holidays go in the mode-line.
+    ;; FIXME however if there are no diary entries a separate buffer
+    ;; is displayed - this is inconsistent.
+    (with-current-buffer dbuff
+      (calendar-set-mode-line (format "Diary for %s" (cdr empty))))
+    (unless (car empty)                 ; no entries
+      (with-current-buffer dbuff
         (let ((window (display-buffer (current-buffer))))
           ;; d-s-p is passed from diary-list-entries.
           (set-window-point window diary-saved-point)
@@ -853,33 +863,20 @@
 
 (defun fancy-diary-display ()
   "Prepare a diary buffer with relevant entries in a fancy, noneditable form.
-This function is provided for optional use as the `diary-display-hook'."
+To use this function, add it to `diary-display-hook'."
   ;; Turn off selective-display in the diary file's buffer.
   (with-current-buffer
       (find-buffer-visiting (substitute-in-file-name diary-file))
     (diary-unhide-everything))
-  (if (or (not diary-entries-list)
-          (and (not (cdr diary-entries-list))
-               (string-equal (cadr (car diary-entries-list)) "")))
-      (let* ((holiday-list (if holidays-in-diary-buffer
-                               (calendar-check-holidays original-date)))
-             (msg (format "No diary entries for %s %s"
-                          (concat date-string (if holiday-list ":" ""))
-                          (mapconcat 'identity holiday-list "; "))))
-        (if (<= (length msg) (frame-width))
-            (message "%s" msg)
-          (calendar-in-read-only-buffer holiday-buffer
-            (insert (mapconcat 'identity holiday-list "\n")))
-          (message  "No diary entries for %s" date-string)))
+  (unless (car (diary-display-no-entries)) ; no entries
     ;; Prepare the fancy diary buffer.
     (calendar-in-read-only-buffer fancy-diary-buffer
       (calendar-set-mode-line "Diary Entries")
-      (let ((entry-list diary-entries-list)
-            (holiday-list)
-            (holiday-list-last-month 1)
+      (let ((holiday-list-last-month 1)
             (holiday-list-last-year 1)
-            (date (list 0 0 0)))
-        (dolist (entry entry-list)
+            (date (list 0 0 0))
+            holiday-list)
+        (dolist (entry diary-entries-list)
           (unless (calendar-date-equal date (car entry))
             (setq date (car entry))
             (and holidays-in-diary-buffer
@@ -1305,7 +1302,7 @@
 
 (defun mark-included-diary-files ()
   "Mark the diary entries from other diary files with those of the diary file.
-This function is suitable for use as the `mark-diary-entries-hook'; it enables
+This function is suitable for use with `mark-diary-entries-hook'; it enables
 you to use shared diary files together with your own.  The files included are
 specified in the `diary-file' by lines of this form:
         #include \"filename\"