changeset 93492:2fe1b51b8771

(calendar-mode-map): Use calendar-mark-holidays rather than obsolete alias. (mark-visible-calendar-date): Also use overlay for mark characters. (calendar-unmark): Unmark by removing all overlays, rather than redrawing. (calendar-starred-day): Remove. (calendar-mode): Disable undo. Don't make calendar-starred-day local. (calendar-cursor-to-date): No need for special star handling now using overlays. (calendar-star-date): Use overlays.
author Glenn Morris <rgm@gnu.org>
date Tue, 01 Apr 2008 02:46:29 +0000
parents 15b2492faf63
children ef849082f38b
files lisp/calendar/calendar.el
diffstat 1 files changed, 48 insertions(+), 53 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/calendar/calendar.el	Tue Apr 01 02:45:47 2008 +0000
+++ b/lisp/calendar/calendar.el	Tue Apr 01 02:46:29 2008 +0000
@@ -48,32 +48,35 @@
 ;; Islamic calendar, to the Baha'i calendar, to the French
 ;; Revolutionary calendar, to the Mayan calendar, to the Chinese
 ;; calendar, to the Coptic calendar, to the Ethiopic calendar, and to
-;; the astronomical (Julian) day number.  When floating point is
-;; available, times of sunrise/sunset can be displayed, as can the
-;; phases of the moon.  Appointment notification for diary entries is
-;; available.  Calendar printing via LaTeX is available.
+;; the astronomical (Julian) day number.  Times of sunrise/sunset can
+;; be displayed, as can the phases of the moon.  Appointment
+;; notification for diary entries is available.  Calendar printing via
+;; LaTeX is available.
 
 ;; The following files are part of the calendar/diary code:
 
-;;       appt.el                       Appointment notification
-;;       cal-china.el                  Chinese calendar
-;;       cal-coptic.el                 Coptic/Ethiopic calendars
-;;       cal-dst.el                    Daylight saving time rules
-;;       cal-hebrew.el                 Hebrew calendar
-;;       cal-islam.el                  Islamic calendar
-;;       cal-bahai.el                  Baha'i calendar
-;;       cal-iso.el                    ISO calendar
-;;       cal-julian.el                 Julian/astronomical calendars
-;;       cal-mayan.el                  Mayan calendars
-;;       cal-menu.el                   Menu support
-;;       cal-move.el                   Movement in the calendar
-;;       cal-persia.el                 Persian calendar
-;;       cal-tex.el                    Calendars in LaTeX
-;;       cal-x.el                      X-windows dedicated frame functions
-;;       diary-lib.el                  Diary functions
-;;       holidays.el                   Holiday functions
-;;       lunar.el                      Phases of the moon
-;;       solar.el                      Sunrise/sunset, equinoxes/solstices
+;;    appt.el                    Appointment notification
+;;    cal-bahai.el               Baha'i calendar
+;;    cal-china.el               Chinese calendar
+;;    cal-coptic.el              Coptic/Ethiopic calendars
+;;    cal-dst.el                 Daylight saving time rules
+;;    cal-french.el              French revolutionary calendar
+;;    cal-hebrew.el              Hebrew calendar
+;;    cal-html.el                Calendars in HTML
+;;    cal-islam.el               Islamic calendar
+;;    cal-iso.el                 ISO calendar
+;;    cal-julian.el              Julian/astronomical calendars
+;;    cal-mayan.el               Mayan calendars
+;;    cal-menu.el                Menu support
+;;    cal-move.el                Movement in the calendar
+;;    cal-persia.el              Persian calendar
+;;    cal-tex.el                 Calendars in LaTeX
+;;    cal-x.el                   Dedicated frame functions
+;;    calendar.el                This file
+;;    diary-lib.el               Diary functions
+;;    holidays.el                Holiday functions
+;;    lunar.el                   Phases of the moon
+;;    solar.el                   Sunrise/sunset, equinoxes/solstices
 
 ;; Technical details of all the calendrical calculations can be found in
 ;; ``Calendrical Calculations: The Millennium Edition'' by Edward M. Reingold
@@ -1666,7 +1669,7 @@
     (define-key map "q"   'exit-calendar)
     (define-key map "a"   'calendar-list-holidays)
     (define-key map "h"   'calendar-cursor-holidays)
-    (define-key map "x"   'mark-calendar-holidays)
+    (define-key map "x"   'calendar-mark-holidays)
     (define-key map "u"   'calendar-unmark)
     (define-key map "m"   'mark-diary-entries)
     (define-key map "d"   'diary-view-entries)
@@ -1837,9 +1840,6 @@
 (defvar calendar-mark-ring nil
   "Used by `calendar-set-mark'.")
 
-(defvar calendar-starred-day nil
-  "Stores the value of the last date that `calendar-star-date' replaced.")
-
 (defun calendar-mode ()
   "A major mode for the calendar window.
 
@@ -1851,11 +1851,11 @@
   (setq major-mode 'calendar-mode
         mode-name "Calendar"
         buffer-read-only t
+        buffer-undo-list t
         indent-tabs-mode nil)
   (use-local-map calendar-mode-map)
   (update-calendar-mode-line)
   (make-local-variable 'calendar-mark-ring)
-  (make-local-variable 'calendar-starred-day)
   (make-local-variable 'displayed-month) ; month in middle of window
   (make-local-variable 'displayed-year)  ; year in middle of window
   ;; Most functions only work if displayed-month and displayed-year are set,
@@ -1984,12 +1984,7 @@
           (list month
                 (string-to-number (buffer-substring (1+ (point)) (+ 4 (point))))
                 year))
-      (if (and (looking-at "\\*")
-               (save-excursion
-                 (re-search-backward "[^*]")
-                 (looking-at ".\\*\\*")))
-          (list month calendar-starred-day year)
-        (if error (error "Not on a date!"))))))
+      (if error (error "Not on a date!")))))
 
 (add-to-list 'debug-ignored-errors "Not on a date!")
 
@@ -2316,7 +2311,8 @@
   (interactive)
   (setq mark-holidays-in-calendar nil
         mark-diary-entries-in-calendar nil)
-  (redraw-calendar))
+  (with-current-buffer calendar-buffer
+    (mapc 'delete-overlay (overlays-in (point-min) (point-max)))))
 
 (defun calendar-date-is-visible-p (date)
   "Return non-nil if DATE is valid and is visible in the calendar window."
@@ -2370,14 +2366,10 @@
            ((facep mark)
             (overlay-put
              (make-overlay (1- (point)) (1+ (point))) 'face mark))
-           ;; Single-character.
+           ;; Single-character mark, goes after the date.
            ((and (stringp mark) (= (length mark) 1))
-            (let ((inhibit-read-only t))
-              (forward-char 1)
-              ;; Insert before delete so as to better preserve markers.
-              (insert mark)
-              (delete-char 1)
-              (forward-char -2)))
+            (overlay-put
+             (make-overlay (1+ (point)) (+ 2 (point))) 'display mark))
            (t                           ; attr list
             (let ((temp-face
                    (make-symbol
@@ -2392,6 +2384,7 @@
               (make-face temp-face)
               ;; Remove :face info from mark, copy the face info into temp-face.
               (while (setq faceinfo (memq :face faceinfo))
+                ;; FIXME not read.
                 (copy-face (read (nth 1 faceinfo)) temp-face)
                 (setcar faceinfo nil)
                 (setcar (cdr faceinfo) nil))
@@ -2404,17 +2397,19 @@
 (defun calendar-star-date ()
   "Replace the date under the cursor in the calendar window with asterisks.
 You might want to add this function to `today-visible-calendar-hook'."
-  (let ((inhibit-read-only t)
-        (modified (buffer-modified-p)))
-    (forward-char 1)
-    (setq calendar-starred-day
-          (string-to-number (buffer-substring (point) (- (point) 2))))
-    ;; Insert before deleting, to better preserve markers.
-    (insert "**")
-    (forward-char -2)
-    (delete-char -2)
-    (forward-char 1)
-    (restore-buffer-modified-p modified)))
+  (unless (catch 'found
+            (dolist (ol (overlays-at (point)))
+              (and (overlay-get ol 'calendar-star)
+                   (throw 'found t))))
+    (let ((ol (make-overlay (1- (point)) (point))))
+      (overlay-put ol 'display "*")
+      (overlay-put ol 'calendar-star t)
+      ;; Use copy-sequence to avoid merging of identical 'display props.
+      ;; Use two overlays so as not to mess up
+      ;; calendar-cursor-to-nearest-date (and calendar-forward-day).
+      (overlay-put (setq ol (make-overlay (point) (1+ (point))))
+                   'display (copy-sequence "*"))
+      (overlay-put ol 'calendar-star t))))
 
 (defun calendar-mark-today ()
   "Mark the date under the cursor in the calendar window.