[mcclim-cvs] CVS mcclim/Drei

thenriksen thenriksen at common-lisp.net
Thu Jan 31 16:50:08 UTC 2008


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

Modified Files:
	drei-clim.lisp input-editor.lisp 
Log Message:
Added new and cooler with-input-editor-typeout implementation for Drei.

Still not used for anything inside McCLIM, but I hope to change input
completion to use it instead of menu-choose for some cases. The
biggest problem, I think, is that Goatee doesn't support
with-input-editor-typeout.


--- /project/mcclim/cvsroot/mcclim/Drei/drei-clim.lisp	2008/01/31 12:14:05	1.38
+++ /project/mcclim/cvsroot/mcclim/Drei/drei-clim.lisp	2008/01/31 16:50:07	1.39
@@ -389,14 +389,20 @@
 
 (defmethod* (setf output-record-position) ((new-x number) (new-y number)
                                            (record drei-area))
-  (setf (area-position record) (list new-x new-y)))
+  (multiple-value-bind (old-x old-y) (output-record-position record)
+    (setf (area-position record) (list new-x new-y))
+    (dolist (cursor (cursors record))
+      (multiple-value-bind (cursor-x cursor-y) (output-record-position cursor)
+        (setf (output-record-position cursor)
+              (values (+ (- cursor-x old-x) new-x)
+                      (+ (- cursor-y old-y) new-y)))))))
 
 (defmethod output-record-start-cursor-position ((record drei-area))
   (output-record-position record))
 
 (defmethod* (setf output-record-start-cursor-position) ((new-x number) (new-y number)
                                                        (record drei-area))
-  (setf (output-record-position record) (list new-x new-y)))
+  (setf (output-record-position record) (values new-x new-y)))
 
 (defmethod output-record-hit-detection-rectangle* ((record drei-area))
   (bounding-rectangle* record))
--- /project/mcclim/cvsroot/mcclim/Drei/input-editor.lisp	2008/01/31 11:19:35	1.32
+++ /project/mcclim/cvsroot/mcclim/Drei/input-editor.lisp	2008/01/31 16:50:07	1.33
@@ -46,7 +46,13 @@
                         :initform nil
                         :documentation "After a command has been
 executed, the contents of the Drei area instance shall be
-replaced by the contents of this array, if non-NIL."))
+replaced by the contents of this array, if non-NIL.")
+   (%typeout-record :accessor typeout-record
+                    :initform nil
+                    :documentation "The output record (if any)
+that is the typeout information for this Drei-based
+input-editing-stream. `With-input-editor-typeout' manages this
+output record."))
   (:documentation "An mixin that helps in implementing Drei-based
 input-editing streams. This class should not be directly
 instantiated."))
@@ -763,12 +769,39 @@
   (:documentation "Call `continuation' with a single argument, a
 stream to do input-editor-typeout on."))
 
-(defmethod invoke-with-input-editor-typeout ((stream drei-input-editing-mixin)
+(defmethod invoke-with-input-editor-typeout ((editing-stream drei-input-editing-mixin)
                                              (continuation function) &key erase)
-  (declare (ignore erase))
-  (with-bound-drei-special-variables ((drei-instance stream))
-    (with-minibuffer-stream (minibuffer)
-      (funcall continuation minibuffer))))
+  (let* ((encapsulated-stream (encapsulating-stream-stream editing-stream))
+         (new-typeout-record (with-output-to-output-record (encapsulated-stream)
+                               (funcall continuation encapsulated-stream)))
+         (editor-record (drei-instance editing-stream)))
+    (with-accessors ((stream-typeout-record typeout-record)) editing-stream
+      (with-sheet-medium (medium encapsulated-stream)
+        (with-bounding-rectangle* (x1 y1 x2 y2) editor-record
+          ;; Clear the input-editor display.
+          (draw-rectangle* medium x1 y1 x2 y2 :ink +background-ink+)
+          (setf (output-record-position new-typeout-record)
+                (output-record-position (or stream-typeout-record editor-record))
+                (output-record-position editor-record)
+                (values x1 (+ y1 (- (bounding-rectangle-height new-typeout-record)
+                                    (if stream-typeout-record
+                                        (bounding-rectangle-height stream-typeout-record)
+                                        0)))))
+          (when erase
+            (with-bounding-rectangle* (x1 y1 x2 y2) new-typeout-record
+              (draw-rectangle* medium x1 y1 x2 y2 :ink +background-ink+)))
+          ;; Reuse the old stream-typeout-record, if any.
+          (cond (stream-typeout-record
+                 ;; Blank the old one.
+                 (with-bounding-rectangle* (x1 y1 x2 y2) stream-typeout-record
+                   (draw-rectangle* medium x1 y1 (1+ x2) y2 :ink +background-ink+))
+                 (clear-output-record stream-typeout-record)
+                 (add-output-record new-typeout-record stream-typeout-record))
+                (t
+                 (stream-add-output-record encapsulated-stream new-typeout-record)
+                 (setf stream-typeout-record new-typeout-record)))
+          ;; Now, let there be light!
+          (replay new-typeout-record encapsulated-stream))))))
 
 (defmacro with-input-editor-typeout ((&optional (stream t) &rest args
                                                 &key erase)
@@ -778,12 +811,12 @@
 to an `extended-output-stream' while `body' is being evaluated."
   (declare (ignore erase))
   (check-type stream symbol)
-  (let ((stream (if (eq stream t) *standard-input* stream)))
-    `(apply #'invoke-with-input-editor-typeout
-            ,stream
-            #'(lambda (,stream)
-                , at body)
-            ,args)))
+  (let ((stream (if (eq stream t) '*standard-output* stream)))
+    `(invoke-with-input-editor-typeout
+      ,stream
+      #'(lambda (,stream)
+          , at body)
+      , at args)))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; 




More information about the Mcclim-cvs mailing list