
(provide 'zlog)

(defvar zlog-mode-map nil)
(defvar zlog-mode-hook nil)

(defun zlog-mode ()
"Major mode for browsing past sent zephyrgrams, and optionally
resending them.  Commands are:

   n    Next zephyrgram
   p    Previous zephyrgram
   q    Quit
   h    Help
   s    Send (or SPC or RET)
   c    Clear"
  (interactive)
  (setq major-mode 'zlog-mode)
  (setq mode-name "ZLog")
  (or zlog-mode-map 
      (progn
	(setq zlog-mode-map (make-keymap))
	(suppress-keymap zlog-mode-map)
	(define-key zlog-mode-map "n" 'zlog-next)
	(define-key zlog-mode-map "p" 'zlog-previous)
	(define-key zlog-mode-map "q" 'zlog-quit)
	(define-key zlog-mode-map "h" 'describe-mode)
	(define-key zlog-mode-map "s" 'zlog-send)
	(define-key zlog-mode-map " " 'zlog-send)
	(define-key zlog-mode-map "\C-m" 'zlog-send)
	))
  (use-local-map zlog-mode-map)
  (run-hooks 'zlog-mode-hook))

(defun zlog-buffer ()
  (set-buffer (get-buffer-create "*ZLog*"))
  (if (not (eq major-mode 'zlog-mode))
      (zlog-mode)))

(defun zlog-goto ()
  (interactive)
  (zlog-buffer)
  (switch-to-buffer-other-window (current-buffer)))

(defun zlog-quit ()
  (interactive)
  (let ((b (current-buffer)))
    (switch-to-buffer nil)
    (bury-buffer b)))

(defun zlog-add (class instance recipient body)
  (save-excursion
    (zlog-buffer)
    (goto-char (point-max))
    (or (bobp) (insert "\n"))
    (insert (format "\C-message %s\n%s"
		    (prin1-to-string (list class instance recipient))
		    body))))

(defun zlog-next (arg)
  (interactive "p")
  (while (> arg 0)
    (setq arg (1- arg))
    (end-of-line)
    (if (search-forward "\C-message" nil t)
	(beginning-of-line)
      (error "End of message list"))))

(defun zlog-previous (arg)
  (interactive "p")
  (while (> arg 0)
    (setq arg (1- arg))
    (backward-char 1)
    (if (search-backward "\C-message" nil t)
	(beginning-of-line)
      (error "End of message list"))))

(defun zlog-send ()
  (interactive)
  (let (arglist body)
    (save-excursion
      (end-of-line)
      (if (not (search-backward "\C-message" nil t))
	  (error "Can't find message to send"))
      (forward-word 1)
      (setq arglist (read (current-buffer)))
      (forward-line 1)
      (let ((start (point)))
	(if (search-forward "\C-message" nil 'foo)
	    (beginning-of-line))
	(setq body (buffer-substring start (point)))))
    (apply 'zwrite-triple arglist)
    (insert body)))


