(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10)

(FILECREATED "18-Mar-2022 21:45:55" {DSK}<Users>kaplan>Local>medley3.5>my-medley>sources>WINDOWOBJ.;8 28006  

      :CHANGES-TO (FNS READIMAGEOBJ)

      :PREVIOUS-DATE "17-Mar-2022 22:48:26" 
{DSK}<Users>kaplan>Local>medley3.5>my-medley>sources>WINDOWOBJ.;7)


(* ; "
Copyright (c) 1986-1987, 1990-1991, 1993 by Venue & Xerox Corporation.
")

(PRETTYCOMPRINT WINDOWOBJCOMS)

(RPAQQ WINDOWOBJCOMS
       [(COMS                                                (* ; 
           "Image object support - here so that DEDIT can use it without needing TEDIT to be loaded.")
              (RECORDS IMAGEOBJ IMAGEFNS IMAGEBOX)
              (FNS COPYINSERT IMAGEBOX IMAGEFNSCREATE IMAGEFNSP IMAGEOBJCREATE IMAGEOBJP IMAGEOBJPROP
                   \IMAGEUSERPROP HPRINT.IMAGEOBJ COPYIMAGEOBJ READIMAGEOBJ WRITEIMAGEOBJ)
              (ADDVARS (HPRINTMACROS (IMAGEOBJ . WRITEIMAGEOBJ)))
              (GLOBALVARS (IMAGEOBJTYPES NIL)
                     (IMAGEOBJGETFNS NIL)))
        (COMS                                                (* ; 
                                                          "For encapsulating unknown-type IMAGEOBJs.")
              (FNS ENCAPSULATEDOBJ.BUTTONEVENTINFN ENCAPSULATEDOBJ.PUTFN ENCAPSULATEDOBJ.DISPLAYFN 
                   ENCAPSULATEDOBJ.IMAGEBOXFN ENCAPSULATEDIMAGEFNS)
              (INITVARS ENCAPSULATEDIMAGEFNS)
              (GLOBALVARS ENCAPSULATEDIMAGEFNS))
        (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDVARS (NLAMA)
                                                                             (NLAML)
                                                                             (LAMA IMAGEOBJPROP])



(* ; "Image object support - here so that DEDIT can use it without needing TEDIT to be loaded.")

(DECLARE%: EVAL@COMPILE

(DATATYPE IMAGEOBJ (OBJECTDATUM IMAGEOBJPLIST IMAGEOBJFNS)
                   (SYSTEM))

(DATATYPE IMAGEFNS (DISPLAYFN                                (* ; 
                                                            "FN called to display the object's image")
                          IMAGEBOXFN                         (* ; "To tell how big it is")
                          PUTFN                              (* ; "To write it onto a file")
                          GETFN                              (* ; "To read it back from the file")
                          COPYFN                             (* ; "To make a copy of the object")
                          BUTTONEVENTINFN                    (* ; 
                                                    "Called when the mouse goes down over the object")
                          COPYBUTTONEVENTINFN                (* ; 
                                      "Called when the MIDDLE mouse button goes down over the object")
                          WHENMOVEDFN                        (* ; 
                             "Called when the object is moved within a document or other environment")
                          WHENINSERTEDFN                     (* ; 
                                                  "Called when the object is inserted into a context")
                          WHENDELETEDFN                      (* ; 
                                                   "Called when the object is removed from a context")
                          WHENCOPIEDFN                       (* ; 
                                                  "Called when the object is copied within a context")
                          WHENOPERATEDONFN                   (* ; 
                                            "Called when something interesting happens to the object")
                          PREPRINTFN IMAGECLASSNAME          (* ; 
                    "LITATOM unique name by which this kind of IMAGEOBJ is to be known to the world.")
                          )
                   (SYSTEM))

(RECORD IMAGEBOX (XSIZE YSIZE YDESC XKERN)
                 (SYSTEM))
)

(/DECLAREDATATYPE 'IMAGEOBJ '(POINTER POINTER POINTER)
       '((IMAGEOBJ 0 POINTER)
         (IMAGEOBJ 2 POINTER)
         (IMAGEOBJ 4 POINTER))
       '6)

(/DECLAREDATATYPE 'IMAGEFNS
       '(POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER 
               POINTER POINTER POINTER)
       '((IMAGEFNS 0 POINTER)
         (IMAGEFNS 2 POINTER)
         (IMAGEFNS 4 POINTER)
         (IMAGEFNS 6 POINTER)
         (IMAGEFNS 8 POINTER)
         (IMAGEFNS 10 POINTER)
         (IMAGEFNS 12 POINTER)
         (IMAGEFNS 14 POINTER)
         (IMAGEFNS 16 POINTER)
         (IMAGEFNS 18 POINTER)
         (IMAGEFNS 20 POINTER)
         (IMAGEFNS 22 POINTER)
         (IMAGEFNS 24 POINTER)
         (IMAGEFNS 26 POINTER))
       '28)
(DEFINEQ

(COPYINSERT
  [LAMBDA (IMAGEOBJ)

    (* ;; "Edited 20-Dec-2021 23:47 by rmk: IMAGEOBJ can now also be a list of objects in the COPYINSERTFN case")

    (* ;; "Edited 17-Sep-90 13:19 by jds")

(* ;;; "inserts IMAGEOBJ into the window that currently has the tty.  If this window has a COPYINSERTFN property, that is called, otherwise BKSYSBUF is called.")

    (PROG ([TTYW (\INSUREWINDOW (WFROMDS (PROCESS.TTY (TTY.PROCESS]
           INSERTFN)
          (COND
             ((SETQ INSERTFN (WINDOWPROP TTYW 'COPYINSERTFN))
              (for IMOBJ inside IMAGEOBJ do (APPLY* INSERTFN IMOBJ TTYW)))
             (T                                              (* ; 
                                                             "IMAGEOBJ can be a list of things too.")
                (for IMOBJ inside IMAGEOBJ
                   do (BKSYSBUF (OR (COND
                                       [(IMAGEOBJP IMOBJ)
                                        (COND
                                           ((SETQ INSERTFN (IMAGEOBJPROP IMOBJ 'PREPRINTFN))
                                            (APPLY* INSERTFN IMOBJ))
                                           (T (IMAGEOBJPROP IMOBJ 'OBJECTDATUM]
                                       (T IMOBJ))
                                    "")
                             T
                             (PROCESS.EVAL (TTY.PROCESS)
                                    '(GETREADTABLE)
                                    T])

(IMAGEBOX
  [LAMBDA (OBJ STREAM MODE)                              (* jds " 8-Feb-84 10:48")
    (APPLY* (IMAGEOBJPROP OBJ 'IMAGEBOXFN)
           OBJ STREAM MODE])

(IMAGEFNSCREATE
  [LAMBDA (DISPLAYFN IMAGEBOXFN PUTFN GETFN COPYFN BUTTONEVENTINFN COPYBUTTONEVENTINFN WHENMOVEDFN 
                 WHENINSERTEDFN WHENDELETEDFN WHENCOPIEDFN WHENOPERATEDONFN PREPRINTFN CLASSNAME)
                                                             (* jds "19-Feb-85 09:33")

    (* ;; "returns a structure which contains the image functions for a type of image object.")

    [COND
       (GETFN 
              (* ;; "If a GETFN was specified, add it to the list of known GETFNs, so that people who verify them will know about it.")

              (OR (ASSOC GETFN IMAGEOBJGETFNS)
                  (push IMAGEOBJGETFNS (LIST GETFN]
    (create IMAGEFNS
           DISPLAYFN _ DISPLAYFN
           IMAGEBOXFN _ IMAGEBOXFN
           PUTFN _ PUTFN
           GETFN _ GETFN
           COPYFN _ COPYFN
           BUTTONEVENTINFN _ BUTTONEVENTINFN
           COPYBUTTONEVENTINFN _ COPYBUTTONEVENTINFN
           WHENMOVEDFN _ WHENMOVEDFN
           WHENINSERTEDFN _ WHENINSERTEDFN
           WHENDELETEDFN _ WHENDELETEDFN
           WHENCOPIEDFN _ WHENCOPIEDFN
           WHENOPERATEDONFN _ WHENOPERATEDONFN
           PREPRINTFN _ PREPRINTFN])

(IMAGEFNSP
  [LAMBDA (X)                                            (* rrb " 1-Feb-84 11:13")
                                                             (* ; "is X an IMAGEFNS?")
    (AND (type? IMAGEFNS X)
         X])

(IMAGEOBJCREATE
  [LAMBDA (OBJECTDATUM IMAGEFNS)                         (* jds " 8-Feb-84 10:20")
                                                             (* ; "returns an image object")
    (OR (IMAGEFNSP IMAGEFNS)
        (\ILLEGAL.ARG IMAGEFNS))                             (* ; 
                                              "Make sure he handed us a valid set of fn references")
    (create IMAGEOBJ
           OBJECTDATUM _ OBJECTDATUM
           IMAGEOBJPLIST _ NIL
           IMAGEOBJFNS _ IMAGEFNS])

(IMAGEOBJP
  [LAMBDA (X)                                            (* rrb " 1-Feb-84 16:22")
                                                             (* ; "is X an IMAGEOBJ?")
    (AND (type? IMAGEOBJ X)
         X])

(IMAGEOBJPROP
  [LAMBDA NARGS                                          (* jds "18-Feb-85 18:22")

    (* ;; "accesses and sets properties of an IMAGEOBJ.")

    (SELECTQ NARGS
        ((0 1) 
             (\ILLEGAL.ARG NIL))
        (PROG ((IMAGEOBJ (ARG NARGS 1))
               (PROP (ARG NARGS 2))
               (VAL (AND (IGREATERP NARGS 2)
                         (ARG NARGS 3)))
               (SET? (NEQ NARGS 2))
               IMAGEFNS)
              (COND
                 ((NOT (IMAGEOBJP IMAGEOBJ))
                  (\ILLEGAL.ARG IMAGEOBJ)))
              (SETQ IMAGEFNS (fetch (IMAGEOBJ IMAGEOBJFNS) of IMAGEOBJ))
              (RETURN (SELECTQ PROP
                          (OBJECTDATUM (PROG1 (fetch (IMAGEOBJ OBJECTDATUM) of IMAGEOBJ)
                                           (COND
                                              (SET? (replace (IMAGEOBJ OBJECTDATUM) of 
                                                                                             IMAGEOBJ
                                                       with VAL)))))
                          (DISPLAYFN (PROG1 (fetch (IMAGEFNS DISPLAYFN) of IMAGEFNS)
                                         (COND
                                            (SET? (replace (IMAGEFNS DISPLAYFN) of IMAGEFNS
                                                     with VAL)))))
                          (IMAGEBOXFN (PROG1 (fetch (IMAGEFNS IMAGEBOXFN) of IMAGEFNS)
                                          (COND
                                             (SET? (replace (IMAGEFNS IMAGEBOXFN) of IMAGEFNS
                                                      with VAL)))))
                          (PUTFN (PROG1 (fetch (IMAGEFNS PUTFN) of IMAGEFNS)
                                     (COND
                                        (SET? (replace (IMAGEFNS PUTFN) of IMAGEFNS
                                                 with VAL)))))
                          (GETFN (PROG1 (fetch (IMAGEFNS GETFN) of IMAGEFNS)
                                     (COND
                                        (SET? (replace (IMAGEFNS GETFN) of IMAGEFNS
                                                 with VAL)))))
                          (COPYFN (PROG1 (fetch (IMAGEFNS COPYFN) of IMAGEFNS)
                                      (COND
                                         (SET? (replace (IMAGEFNS COPYFN) of IMAGEFNS
                                                  with VAL)))))
                          (BUTTONEVENTINFN 
                               (PROG1 (fetch (IMAGEFNS BUTTONEVENTINFN) of IMAGEFNS)
                                   (COND
                                      (SET? (replace (IMAGEFNS BUTTONEVENTINFN) of IMAGEFNS
                                               with VAL)))))
                          (COPYBUTTONEVENTINFN 
                               (PROG1 (fetch (IMAGEFNS COPYBUTTONEVENTINFN) of IMAGEFNS)
                                   (COND
                                      (SET? (replace (IMAGEFNS COPYBUTTONEVENTINFN) of 
                                                                                             IMAGEFNS
                                               with VAL)))))
                          (WHENMOVEDFN (PROG1 (fetch (IMAGEFNS WHENMOVEDFN) of IMAGEFNS)
                                           (COND
                                              (SET? (replace (IMAGEFNS WHENMOVEDFN) of 
                                                                                             IMAGEFNS
                                                       with VAL)))))
                          (WHENINSERTEDFN 
                               (PROG1 (fetch (IMAGEFNS WHENINSERTEDFN) of IMAGEFNS)
                                   (COND
                                      (SET? (replace (IMAGEFNS WHENINSERTEDFN) of IMAGEFNS
                                               with VAL)))))
                          (WHENDELETEDFN (PROG1 (fetch (IMAGEFNS WHENDELETEDFN) of IMAGEFNS)
                                             (COND
                                                (SET? (replace (IMAGEFNS WHENDELETEDFN)
                                                         of IMAGEFNS with VAL)))))
                          (WHENCOPIEDFN (PROG1 (fetch (IMAGEFNS WHENCOPIEDFN) of IMAGEFNS)
                                            (COND
                                               (SET? (replace (IMAGEFNS WHENCOPIEDFN)
                                                        of IMAGEFNS with VAL)))))
                          (WHENOPERATEDONFN 
                               (PROG1 (fetch (IMAGEFNS WHENOPERATEDONFN) of IMAGEFNS)
                                   (COND
                                      (SET? (replace (IMAGEFNS WHENOPERATEDONFN) of IMAGEFNS
                                               with VAL)))))
                          (PREPRINTFN (PROG1 (fetch (IMAGEFNS PREPRINTFN) of IMAGEFNS)
                                          (COND
                                             (SET? (replace (IMAGEFNS PREPRINTFN) of IMAGEFNS
                                                      with VAL)))))
                          (IMAGECLASSNAME 
                               (PROG1 (fetch (IMAGEFNS IMAGECLASSNAME) of IMAGEFNS)
                                   (COND
                                      (SET? (replace (IMAGEFNS IMAGECLASSNAME) of IMAGEFNS
                                               with VAL)))))
                          (\IMAGEUSERPROP IMAGEOBJ PROP VAL SET?])

(\IMAGEUSERPROP
  [LAMBDA (IMAGEOBJ PROP VAL SET?)                       (* rrb " 1-Feb-84 11:44")

    (* ;; "reads and sets the values of properties on an IMAGEOBJ")

    (PROG ((PLIST (fetch (IMAGEOBJ IMAGEOBJPLIST) of IMAGEOBJ)))
          (RETURN (PROG1 (LISTGET PLIST PROP)
                      [COND
                         (SET? (COND
                                  (PLIST (LISTPUT PLIST PROP VAL))
                                  (T (replace (IMAGEOBJ IMAGEOBJPLIST) of IMAGEOBJ
                                        with (LIST PROP VAL])])

(HPRINT.IMAGEOBJ
  [LAMBDA (IMAGEOBJ STREAM)                              (* rrb "19-Dec-84 16:22")

    (* ;; "HPRINT function for writing out IMAGE OBJECTS")

    (* ;; "write out the name of the function to read things back in with.")

    (PRIN2 (LIST (fetch (IMAGEFNS GETFN) of (fetch (IMAGEOBJ IMAGEOBJFNS) of IMAGEOBJ
                                                           )))
           STREAM HPRINTRDTBL)
    (APPLY* (fetch (IMAGEFNS PUTFN) of (fetch (IMAGEOBJ IMAGEOBJFNS) of IMAGEOBJ))
           IMAGEOBJ STREAM)
    T])

(COPYIMAGEOBJ
  [LAMBDA (FROM TO)                              (* jds "19-Feb-85 09:59")

    (* ;; 
"Copis the contents of one IMAGEOBJ nto another, effectively making TO be the same object as FROM.")

    (replace (IMAGEOBJ OBJECTDATUM) of TO with (fetch (IMAGEOBJ OBJECTDATUM)
                                                              of FROM))
    (replace (IMAGEOBJ IMAGEOBJPLIST) of TO with (fetch (IMAGEOBJ IMAGEOBJPLIST)
                                                                of FROM))
    (replace (IMAGEOBJ IMAGEOBJFNS) of TO with (fetch (IMAGEOBJ IMAGEOBJFNS)
                                                              of FROM])

(READIMAGEOBJ
  [LAMBDA (STREAM GETFN NOERROR DATANBYTES)

    (* ;; "Edited 18-Mar-2022 21:45 by rmk: Added WHEREIS as a last resort.")
                                                             (* rrb "18-Mar-86 11:35")
    (DECLARE (SPECVARS UNDERREADIMAGEOBJ))

    (* ;; "Reads an IMAGEOBJ, using GETFN.  Verifies that the GETFN is legitimate")

    (* ;; "the variable UNDERREADIMAGEOBJ is used in HVBAKREAD to determine if it should do a validity check on the function which is read from the file.")

    (* ;; "rmk:  I'm not sure that it makes sense for GETFN to be NIL, as 86 code allowed.  Presumably an image object without a GETFN should never have been written.")

    (LET (SUPPORTFILE (UNDERREADIMAGEOBJ T))
         (DECLARE (SPECVARS UNDERREADIMAGEOBJ))

         (* ;; "Typically,the file containing the GETFN has already been loaded.  If not, it could be the case that the GETFN and its file were pushed on the list for future reference (now), but the file wasn't loaded then. We need to download it.  Or if not there or not there with a file, and we can find the file  containing the GETFN in the WHEREIS database, load that file.")

         (* ;; "If we find the file with the GETFN but that file doesn't also contain the IMAGEFNS variable, we're screwed.  That's why we apply the GETFN under an NLSETQ")

         (CL:WHEN (AND GETFN (NOT (GETD GETFN))
                       [SETQ SUPPORTFILE (OR (LISTGET (CDR (ASSOC GETFN IMAGEOBJGETFNS))
                                                    'FILE)
                                             (CAR (WHEREIS GETFN 'FNS T))
                                             (CAR (WHEREIS GETFN 'FUNCTIONS T]
                       (MOUSECONFIRM (CONCAT "Trying to read an IMAGEOBJ with GETFN " GETFN 
                                            ". Shall I load the support file, " SUPPORTFILE "?")
                              NIL NIL NIL))
             (DOFILESLOAD (LIST '(SYSLOAD)
                                SUPPORTFILE)))
         (COND
            [(AND GETFN (GETD GETFN)
                  (CAR (NLSETQ (APPLY* GETFN STREAM]
            (NOERROR NIL)
            (T                                               (* ; 
                     "Still no support for this kind of IMAGEOBJ.  Encapsulate it in something safe.")
               (LET [(OBJ (IMAGEOBJCREATE NIL (ENCAPSULATEDIMAGEFNS GETFN]
                    (IMAGEOBJPROP OBJ 'FILE (FULLNAME STREAM)
                           STREAM)                           (* ; 
                             "Remember which file it came from so that it could be written back out.")
                    (IMAGEOBJPROP OBJ 'FILEPTR (GETFILEPTR STREAM))
                                                             (* ; "And where on the file")
                    (IMAGEOBJPROP OBJ 'OBJSIZE DATANBYTES)
                    (IMAGEOBJPROP OBJ 'UNKNOWNGETFN GETFN)   (* ; "And the name of its GETFN")
                    (AND DATANBYTES (SETFILEPTR STREAM (PLUS (GETFILEPTR STREAM)
                                                             DATANBYTES)))
                    OBJ])

(WRITEIMAGEOBJ
  [LAMBDA (IMAGEOBJ STREAM)                              (* jds "19-Feb-85 09:36")

    (* ;; "HPRINT function for writing out IMAGE OBJECTS")

    (* ;; "write out the name of the function to read things back in with.")

    (COND
       ((NOT (fetch (IMAGEFNS GETFN) of (fetch (IMAGEOBJ IMAGEOBJFNS) of IMAGEOBJ)))
                                                             (* ; 
                                                           "This IMAGEOBJ has no GETFN.  Complain!")
        (HELP "No GETFN for IMAGEOBJ " IMAGEOBJ)))
    (PRIN2 [LIST 'READIMAGEOBJ NIL (KWOTE (fetch (IMAGEFNS GETFN) of (fetch (IMAGEOBJ
                                                                                         IMAGEOBJFNS)
                                                                                of IMAGEOBJ]
           STREAM HPRINTRDTBL)                               (* ; 
    "Write out a call to READIMAGEOBJ, which takes the input stream and a GETFN name as arguments.")
    (APPLY* (fetch (IMAGEFNS PUTFN) of (fetch (IMAGEOBJ IMAGEOBJFNS) of IMAGEOBJ))
           IMAGEOBJ STREAM)                                  (* ; 
                                                  "Then write out the guts of the IMAGEOBJ itself.")
    T])
)

(ADDTOVAR HPRINTMACROS (IMAGEOBJ . WRITEIMAGEOBJ))
(DECLARE%: DOEVAL@COMPILE DONTCOPY

(GLOBALVARS (IMAGEOBJTYPES NIL)
       (IMAGEOBJGETFNS NIL))
)



(* ; "For encapsulating unknown-type IMAGEOBJs.")

(DEFINEQ

(ENCAPSULATEDOBJ.BUTTONEVENTINFN
  [LAMBDA (IMAGEOBJ WINDOW)                              (* ; "Edited  2-Apr-87 15:33 by bvm:")

(* ;;; "The user hit a button inside this object.  Try loading it now.")

    (CL:WITH-OPEN-FILE (STREAM (IMAGEOBJPROP IMAGEOBJ 'FILE))
           (SETFILEPTR STREAM (IMAGEOBJPROP IMAGEOBJ 'FILEPTR))
                                                             (* ; 
                     "Move to where the IMAGEOBJ's description started in the file we read it from")
           (LET [(OBJ (READIMAGEOBJ STREAM (IMAGEOBJPROP IMAGEOBJ 'UNKNOWNGETFN)
                             T
                             (IMAGEOBJPROP IMAGEOBJ 'ENDOFOBJFILEPTR]
                (COND
                   (OBJ                                      (* ; 
               "We succeeded in reading the object this time.  Copy its guts over the placeholder.")
                        (COPYIMAGEOBJ OBJ IMAGEOBJ)
                        'CHANGED)
                   (T (PRIN1 "Still no support for this image object." (GETPROMPTWINDOW WINDOW))
                      NIL])

(ENCAPSULATEDOBJ.PUTFN
  [LAMBDA (IMAGEOBJ STREAM)                              (* ; "Edited 24-Aug-91 14:57 by jds")

(* ;;; "image object put function for unknown image objects.  It copies the bytes from the source file to the output file if the range of the object is known.  If not, it errors because nothing else I could think of makes sense.  Since the name of the GETFN has already been written out and we don't know what format it is expecting we can't write out anything that wouldn't cause an error when read in so erroring now is better.")

    (PROG ((DATANBYTES (IMAGEOBJPROP IMAGEOBJ 'OBJSIZE))
           (FILE (IMAGEOBJPROP IMAGEOBJ 'FILE))
           (BEGOFOBJ (IMAGEOBJPROP IMAGEOBJ 'FILEPTR))
           INSTREAM)
          (OR (NUMBERP DATANBYTES)
              (ERROR "No length information for this image object.
Either delete this image object or load its support files." IMAGEOBJ)
              (RETURN))
          (CL:WITH-OPEN-STREAM (INSTREAM (OPENSTREAM FILE 'INPUT))
                 (COPYBYTES INSTREAM STREAM BEGOFOBJ (PLUS BEGOFOBJ DATANBYTES)))
      T])

(ENCAPSULATEDOBJ.DISPLAYFN
  [LAMBDA (OBJ STREAM)                                   (* jds "19-Feb-85 10:37")

    (* ;; "Display function for an IMAGEOBJ that has been encapsulated for safety")

    (* ;; 
 "Displays as a box containing text saying 'Unknown IMAGEOBJ type' , and naming the unknown GETFN.")

    (LET* ((CURX (DSPXPOSITION NIL STREAM))
           (CURY (DSPYPOSITION NIL STREAM))
           (FONT (FONTCREATE 'HELVETICA 8 'BOLD NIL STREAM))
           (OLDFONT (DSPFONT FONT STREAM))
           (GETFN (IMAGEOBJPROP OBJ 'UNKNOWNGETFN))
           (TYPE (IMAGEOBJPROP OBJ 'TYPE))
           (OBJBOX (IMAGEOBJPROP OBJ 'BOUNDBOX))
           (XSIZE (IDIFFERENCE (fetch XSIZE of OBJBOX)
                         4))
           (YSIZE (IDIFFERENCE (fetch YSIZE of OBJBOX)
                         4)))
          (RELMOVETO 3 (IPLUS (FONTPROP FONT 'HEIGHT)
                              3)
                 STREAM)
          (PRIN1 "Unknown IMAGEOBJ type" STREAM)
          (MOVETO (IPLUS CURX 3)
                 (IPLUS CURY 3)
                 STREAM)
          (printout STREAM "GETFN:  " GETFN)
          (MOVETO CURX (IDIFFERENCE CURY (fetch YDESC of OBJBOX))
                 STREAM)
          (RELDRAWTO XSIZE 0 2 'PAINT STREAM NIL '(16 8 8 8))
          (RELDRAWTO 0 YSIZE 2 'PAINT STREAM NIL '(16 8 8 8))
          (RELDRAWTO (IMINUS XSIZE)
                 0 2 'PAINT STREAM NIL '(16 8 8 8))
          (RELDRAWTO 0 (IMINUS YSIZE)
                 2
                 'PAINT STREAM NIL '(16 8 8 8))
          (DSPFONT OLDFONT STREAM])

(ENCAPSULATEDOBJ.IMAGEBOXFN
  [LAMBDA (OBJ STREAM)                                   (* jds "19-Feb-85 10:05")
                                                             (* ; 
                                                          "IMAGEOBXFN for an encapsulated IMAGEOBJ")
    (PROG ((FONT (FONTCREATE 'HELVETICA 8 'BOLD NIL STREAM))
           (GETFN (IMAGEOBJPROP OBJ 'UNKNOWNGETFN))
           WIDTH HEIGHT)
          [SETQ HEIGHT (ITIMES 2 (FONTPROP FONT 'HEIGHT]
          (SETQ WIDTH (IMAX (STRINGWIDTH "Unknown IMAGEOBJ type" FONT)
                            (STRINGWIDTH (CONCAT "GETFN:  " GETFN)
                                   FONT)))
          (RETURN (create IMAGEBOX
                         XSIZE _ (IPLUS WIDTH 6)
                         YSIZE _ (IPLUS HEIGHT 6)
                         YDESC _ 0
                         XKERN _ 0])

(ENCAPSULATEDIMAGEFNS
  [LAMBDA (GETFN)                                        (* rrb " 3-Feb-86 18:31")

(* ;;; "Set up the IMAGEFNS for the encapsulated-IMAGEOBJ type: The way to protect TEdit and friends from unfriendly IMAGEOBJs.  The GETFN is used as the GETFN for the imagefns so that is can be written out.  The imagefns are cached so that a new set doesn't have to be created for each instance of an unknown image object type.")

    (OR (CDR (ASSOC GETFN ENCAPSULATEDIMAGEFNS))
        (PROG [(IMAGEFNS (IMAGEFNSCREATE (FUNCTION ENCAPSULATEDOBJ.DISPLAYFN)
                                (FUNCTION ENCAPSULATEDOBJ.IMAGEBOXFN)
                                (FUNCTION ENCAPSULATEDOBJ.PUTFN)
                                GETFN
                                (FUNCTION NIL)
                                (FUNCTION ENCAPSULATEDOBJ.BUTTONEVENTINFN)
                                (FUNCTION NILL)
                                (FUNCTION NILL)
                                (FUNCTION NILL)
                                (FUNCTION NILL)
                                (FUNCTION NILL)
                                (FUNCTION NILL)
                                (FUNCTION NILL)
                                (FUNCTION NILL]
              (SETQ ENCAPSULATEDIMAGEFNS (CONS (CONS GETFN IMAGEFNS)
                                               ENCAPSULATEDIMAGEFNS))
              (RETURN IMAGEFNS])
)

(RPAQ? ENCAPSULATEDIMAGEFNS NIL)
(DECLARE%: DOEVAL@COMPILE DONTCOPY

(GLOBALVARS ENCAPSULATEDIMAGEFNS)
)
(DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS 

(ADDTOVAR NLAMA )

(ADDTOVAR NLAML )

(ADDTOVAR LAMA IMAGEOBJPROP)
)
(PUTPROPS WINDOWOBJ COPYRIGHT ("Venue & Xerox Corporation" 1986 1987 1990 1991 1993))
(DECLARE%: DONTCOPY
  (FILEMAP (NIL (4897 21221 (COPYINSERT 4907 . 6434) (IMAGEBOX 6436 . 6616) (IMAGEFNSCREATE 6618 . 7813)
 (IMAGEFNSP 7815 . 8056) (IMAGEOBJCREATE 8058 . 8603) (IMAGEOBJP 8605 . 8846) (IMAGEOBJPROP 8848 . 
14740) (\IMAGEUSERPROP 14742 . 15336) (HPRINT.IMAGEOBJ 15338 . 15927) (COPYIMAGEOBJ 15929 . 16672) (
READIMAGEOBJ 16674 . 19867) (WRITEIMAGEOBJ 19869 . 21219)) (21435 27642 (
ENCAPSULATEDOBJ.BUTTONEVENTINFN 21445 . 22581) (ENCAPSULATEDOBJ.PUTFN 22583 . 23698) (
ENCAPSULATEDOBJ.DISPLAYFN 23700 . 25313) (ENCAPSULATEDOBJ.IMAGEBOXFN 25315 . 26203) (
ENCAPSULATEDIMAGEFNS 26205 . 27640)))))
STOP
