[mcclim-cvs] CVS mcclim/Drei

thenriksen thenriksen at common-lisp.net
Sat Dec 9 23:55:40 UTC 2006


Update of /project/mcclim/cvsroot/mcclim/Drei
In directory clnet:/tmp/cvs-serv15428/Drei

Modified Files:
	packages.lisp drei.lisp 
Log Message:
Added ever-so-slightly more flexible system for handling conditions.


--- /project/mcclim/cvsroot/mcclim/Drei/packages.lisp	2006/11/24 22:43:03	1.8
+++ /project/mcclim/cvsroot/mcclim/Drei/packages.lisp	2006/12/09 23:55:37	1.9
@@ -219,7 +219,7 @@
 
            ;; DREI interface stuff.
            #:drei #:drei-pane #:drei-gadget-pane #:drei-area
-           #:handling-drei-conditions
+           #:handling-drei-conditions #:handle-drei-condition
            #:execute-drei-command #:display-drei-contents #:display-drei-cursor
            #:with-drei-options
            #:performing-drei-operations #:invoke-performing-drei-operations
--- /project/mcclim/cvsroot/mcclim/Drei/drei.lisp	2006/12/07 15:02:45	1.11
+++ /project/mcclim/cvsroot/mcclim/Drei/drei.lisp	2006/12/09 23:55:39	1.12
@@ -690,35 +690,65 @@
 ;;;
 ;;; Some standard building block machinery.
 
+(defgeneric handle-drei-condition (drei condition)
+  (:documentation "When an unhandled condition that is a subtype
+of `user-condition-mixin' (and some other hardcoded condition
+types) is signalled during execution of a Drei command, this
+generic function will be called with the Drei instance as the
+first argument, and the condition as the second argument."))
+
+(defmethod handle-drei-condition (drei (condition offset-before-beginning))
+  (beep) (display-message "Beginning of buffer"))
+
+(defmethod handle-drei-condition (drei (condition offset-after-end))
+  (beep) (display-message "End of buffer"))
+
+(defmethod handle-drei-condition (drei (condition motion-before-beginning))
+  (beep) (display-message "Beginning of buffer"))
+
+(defmethod handle-drei-condition (drei (condition motion-after-end))
+  (beep) (display-message "End of buffer"))
+
+(defmethod handle-drei-condition (drei (condition no-expression))
+  (beep) (display-message "No expression around point"))
+
+(defmethod handle-drei-condition (drei (condition no-such-operation))
+  (beep) (display-message "Operation unavailable for syntax"))
+
+(defmethod handle-drei-condition (drei (condition buffer-read-only))
+  (beep) (display-message "Buffer is read only"))
+
+(defmethod handle-drei-condition (drei (condition user-condition-mixin))
+  (beep) (with-minibuffer-stream (minibuffer)
+           (let ((*print-escape* nil))
+             (princ condition minibuffer))))
+
 (defmacro handling-drei-conditions (&body body)
   "Evaluate `body' while handling Drei user notification
 signals. The handling consists of displaying their meaning to the
 user in the minibuffer. This is the macro that ensures conditions
 such as `motion-before-end' does not land the user in the
 debugger."
+  ;; Perhaps a DREI-CONDITION class should be added so we could more
+  ;; easily catch all these. `User-condition-mixin' isn't available
+  ;; at, for example, the buffer level, after all.
   `(handler-case (progn , at body)
-     (offset-before-beginning ()
-       (beep) (display-message "Beginning of buffer"))
-     (offset-after-end ()
-       (beep) (display-message "End of buffer"))
-     (motion-before-beginning ()
-       (beep) (display-message "Beginning of buffer"))
-     (motion-after-end ()
-       (beep) (display-message "End of buffer"))
-     (no-expression ()
-       (beep) (display-message "No expression around point"))
-     (no-such-operation ()
-       (beep) (display-message "Operation unavailable for syntax"))
-     (buffer-read-only ()
-       (beep) (display-message "Buffer is read only"))
-     ;; I'd like a situation where all conditions that should result
-     ;; in the user being informed of something just inherit from
-     ;; `user-condition-mixin'. Enumerating all possible conditions
-     ;; where is not scaleable.
      (user-condition-mixin (c)
-       (beep) (with-minibuffer-stream (minibuffer)
-                (let ((*print-escape* nil))
-                  (princ c minibuffer))))))
+       (handle-drei-condition *current-window* c))
+     (offset-before-beginning (c)
+       (handle-drei-condition *current-window* c))
+     (offset-after-end (c)
+       (handle-drei-condition *current-window* c))
+     (motion-before-beginning (c)
+       (handle-drei-condition *current-window* c))
+     (motion-after-end (c)
+       (handle-drei-condition *current-window* c))
+     (no-expression (c)
+       (handle-drei-condition *current-window* c))
+     (no-such-operation (c)
+       (handle-drei-condition *current-window* c))
+     (buffer-read-only (c)
+       (handle-drei-condition *current-window* c))))
 
 (defmacro with-bound-drei-special-variables ((drei-instance &key
                                               (current-buffer nil current-buffer-p)
@@ -879,5 +909,5 @@
                                         :update-syntax t
                                         :with-undo t)
         (handling-drei-conditions
-          (apply (command-name command) (command-arguments command))
-          (setf (previous-command drei) command))))))
+          (apply (command-name command) (command-arguments command)))
+        (setf (previous-command drei) command)))))




More information about the Mcclim-cvs mailing list