;;; -*- Mode:Lisp; Readtable:ZL; Package:USER; Base:8; Patch-File:T -*-
;;; Patch file for System version 123.232
;;; Reason:
;;;  (:method tv:sheet :string-out) has direct-to-screen code.
;;;  (tv:sheet-string-out) calls the :string-out method.
;;;  This is exactly backwards -- things like MORE processing
;;;  expect (tv:sheet-string-out) to go directly to the screen.
;;;  Finally, zwei:editor-stream-mixin has a hope of doing MORE
;;;  processing correctly -- except that its :set-cursorpos and
;;;  :increment-cursorpos methods were broken.  Fixed....
;;; Written 12-Apr-88 13:09:47 by pld at site Gigamos Cambridge
;;; while running on Jack Flanders from band 2
;;; with Experimental System 123.231, Experimental Local-File 73.4, Experimental FILE-Server 22.2, Experimental Unix-Interface 11.0, Experimental KERMIT 34.3, Experimental ZMail 71.0, Experimental Lambda-Diag 15.0, Experimental Tape 21.6, microcode 1755, SDU Boot Tape 3.14, SDU ROM 8, WKF PFC.



; From file DJ: L.WINDOW; SHWARM.LISP#371 at 12-Apr-88 13:09:48
#8R TV#: 
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "TV")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: WINDOW; SHWARM  "

(DEFUN SHEET-STRING-OUT (SHEET STRING &OPTIONAL (START 0) (STOP NIL))
  "Output STRING or portion thereof on SHEET."
  (WHEN (SYMBOLP STRING) (SETQ STRING (SYMBOL-NAME STRING)))
  (WHEN (NULL START) (SETQ START 0))
  (WHEN (NULL STOP) (SETQ STOP (ARRAY-ACTIVE-LENGTH STRING)))
  (DO ((XLIM (IF (ZEROP (SHEET-RIGHT-MARGIN-CHARACTER-FLAG sheet))
		 (SHEET-INSIDE-RIGHT sheet)
	       (- (SHEET-INSIDE-RIGHT sheet) (sheet-CHAR-WIDTH sheet))))
       (new-x)
       (STOPPED))
      (())
    (PREPARE-SHEET (SHEET)
      (SHEET-HANDLE-EXCEPTIONS-IF-NECESSARY sheet)
      (MULTIPLE-VALUE-SETQ (STOPPED new-X)
	(%DRAW-STRING SHEET (sheet-CHAR-ALUF sheet) (sheet-CURSOR-X sheet) (sheet-CURSOR-Y sheet)
		      STRING (sheet-CURRENT-FONT sheet) START STOP XLIM))
      (setf (sheet-cursor-x sheet) new-x)
      (COND ((> STOPPED STOP)			       ;All characters drawn.
	     (RETURN NIL))
	    ((EQ (ZL:AREF STRING STOPPED) #/NEWLINE)	;Stopped at newline.
	     (SEND SHEET :END-OF-LINE-EXCEPTION)
	     (SETQ START (1+ STOPPED)))
	    (T					       ;Stopped at horizontal limit.
	     (SEND SHEET :END-OF-LINE-EXCEPTION)
	     (SETQ START STOPPED))))))

))

; From file DJ: L.WINDOW; SHWARM.LISP#371 at 12-Apr-88 13:09:57
#8R TV#: 
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "TV")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: WINDOW; SHWARM  "

(DEFMETHOD (SHEET :STRING-OUT) (STRING &OPTIONAL START STOP)
  (sheet-string-out self string start stop))

))

; From modified file DJ: L.ZWEI; STREAM.LISP#182 at 12-Apr-88 16:44:00
#8R ZWEI#: 
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "ZWEI")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: ZWEI; STREAM  "


(DEFMETHOD (EDITOR-STREAM-MIXIN :SET-CURSORPOS) (X Y &OPTIONAL (UNITS ':PIXEL))
  (SELECTQ UNITS
    (:PIXEL)
    (:CHARACTER
      (AND X (SETQ X (* X (TV:SHEET-CHAR-WIDTH (WINDOW-SHEET *STREAM-SHEET*)))))
      (AND Y (SETQ Y (* Y (TV:SHEET-LINE-HEIGHT (WINDOW-SHEET *STREAM-SHEET*))))))
    (OTHERWISE
      (FERROR NIL "~S is not a known unit." UNITS)))
  (STREAM-REDISPLAY)
  (let ((*window* *stream-sheet*))
    (MOVE-BP *STREAM-BP* (BP-FROM-COORDS *STREAM-SHEET* X Y)))
  (MUST-REDISPLAY *STREAM-SHEET* DIS-TEXT)
  (STREAM-REDISPLAY))

))

; From modified file DJ: L.ZWEI; STREAM.LISP#182 at 12-Apr-88 16:44:00
#8R ZWEI#: 
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "ZWEI")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: ZWEI; STREAM  "


(DEFMETHOD (EDITOR-STREAM-MIXIN :INCREMENT-CURSORPOS) (DX DY &OPTIONAL (UNITS ':PIXEL))
  (when (plusp (tv:sheet-more-flag *stream-sheet*))
    (send *stream-sheet* :more-exception))
  (multiple-value-bind (x y)
      (send self :read-cursorpos units)
    (send self :set-cursorpos (+ x dx) (+ y dy) units)))

))
