(FILECREATED "11-Feb-87 11:11:52" {FIREFS:CS:UNIV% ROCHESTER}<KOOMEN>LISP>DOC-OBJECTS.;19 25201  

      changes to:  (VARS DOC-OBJECTSCOMS)
		   (FNS DOCOBJ-STRING-IMAGEBOX DOCOBJ-TIMESTAMP-IMAGEBOXFN 
			DOCOBJ-FILESTAMP-IMAGEBOXFN DOCOBJ-INCLUDE-IMAGEBOXFN)

      previous date: " 7-Feb-87 15:36:31" {FIREFS:CS:UNIV% ROCHESTER}<KOOMEN>LISP>DOC-OBJECTS.;17)


(* Copyright (c) 1986, 1987 by Johannes A. G. M. Koomen. All rights reserved.)

(PRETTYCOMPRINT DOC-OBJECTSCOMS)

(RPAQQ DOC-OBJECTSCOMS [(* * This TEdit subsystem implements an extensible facility originally 
			     intended to provide bibliography and citation capabilities. The TEdit 
			     function GET.OBJ.FROM.USER, the one triggered by typing ↑O, calls the 
			     function PROMPTFOREVALED which is redefined by this subsystem to be 
			     equivalent to the function DocObj-Acquire-Object. This function inserts 
			     IMAGEOBJects into the current TEdit, and is driven by the variables 
			     DocObjectsMenu and DocObjectsMenuCommands (analogous to BackgroundMenu 
										  and 
									   BackgroundMenuCommands)
			     %. Each menu entry contains a form that, when EVAL'd, creates and 
			     returns a particular kind of IMAGEOBJ. Note that this form is EVAL'd 
			     under the function DocObj-Acquire-Object, which runs under the function 
			     GET.OBJ.FROM.USER, which gets TEXTSTREAM and TEXTOBJ as arguments. They 
			     can be (and are)
			     used freely to record state or other desired info. The image objects 
			     supplied by this subsystem are "Eval`d Form"
			     (i.e., the original behavior of ↑O)
			     , "Screen Snap"
			     (equivalent to right-buttoning in the background while holding the SHIFT 
					 key down)
			     , etc.)
			  (FILES (SYSLOAD)
				 TEDIT IMAGEOBJ)
			  (VARS (DocObjectsMenu))
			  [INITVARS (DocObjectsMenuCommands)
				    (DocObjectsMenuFont (FONTCREATE (QUOTE (MODERN 12 BOLD]
			  (COMS (* The hook into GET.OBJ.FROM.USER *)
				(FNS DOCOBJ-ACQUIRE-OBJECT DOCOBJ-INIT DOCOBJ-TEDIT-MENU-ENTRY 
				     DOCOBJ-GET-LOOKS DOCOBJ-STRING-IMAGEBOX))
			  [COMS (* "Eval'd Form" *)
				(FNS DOCOBJ-ACQUIRE-EVALED-OBJECT)
				(ADDVARS (DocObjectsMenuCommands ("Eval'd Form" (
DOCOBJ-ACQUIRE-EVALED-OBJECT)
										
						      "Insert the value of a form to be typed in"]
			  [COMS (* "Screen Snap" *)
				(FNS DOCOBJ-ACQUIRE-SNAPPED-OBJECT)
				(ADDVARS (DocObjectsMenuCommands ("Screen Snap" (
DOCOBJ-ACQUIRE-SNAPPED-OBJECT)
										
								  "Insert a snap from the screen"]
			  [COMS (* "Time Stamp" *)
				(RECORDS DOCOBJ-TIMESTAMP)
				(FILES (SYSLOAD)
				       DATEFORMAT-EDITOR)
				(FNS DOCOBJ-EDIT-TIMESTAMP DOCOBJ-MAKE-TIMESTAMP 
				     DOCOBJ-MAKE-TIMESTAMP-IMAGEFNS DOCOBJ-TIMESTAMP-BUTTONEVENTINFN 
				     DOCOBJ-TIMESTAMP-COPYFN DOCOBJ-TIMESTAMP-DISPLAYFN 
				     DOCOBJ-TIMESTAMP-GETFN DOCOBJ-TIMESTAMP-IMAGEBOXFN 
				     DOCOBJ-TIMESTAMP-PUTFN DOCOBJ-TIMESTAMP-TO-STRING)
				(INITVARS (DocObjectsTimeStampFormat)
					  (DOCOBJ-TIMESTAMP-IMAGEFNS (DOCOBJ-MAKE-TIMESTAMP-IMAGEFNS))
					  )
				(ADDVARS (DocObjectsMenuCommands ("Time Stamp" (DOCOBJ-MAKE-TIMESTAMP)
									       
							       "Date & time this document is PUT"]
			  [COMS (* "File Stamp" *)
				(FNS DOCOBJ-MAKE-FILESTAMP DOCOBJ-MAKE-FILESTAMP-IMAGEFNS 
				     DOCOBJ-FILESTAMP-COPYFN DOCOBJ-FILESTAMP-DISPLAYFN 
				     DOCOBJ-FILESTAMP-GETFN DOCOBJ-FILESTAMP-IMAGEBOXFN 
				     DOCOBJ-FILESTAMP-GET-FULLNAME DOCOBJ-FILESTAMP-PUTFN)
				(INITVARS (DOCOBJ-FILESTAMP-IMAGEFNS (DOCOBJ-MAKE-FILESTAMP-IMAGEFNS))
					  )
				(ADDVARS (DocObjectsMenuCommands ("File Stamp" (DOCOBJ-MAKE-FILESTAMP)
									       
					      "Name of file to which this document was last PUT."]
			  (COMS (* HRULE *)
				(FILES (SYSLOAD)
				       HRULE READNUMBER)
				(FNS DOCOBJ-MAKE-HRULE DOCOBJ-EDIT-HRULE DOCOBJ-HRULE-INIT 
				     DOCOBJ-HRULE-GET-WIDTH DOCOBJ-HRULE-BUTTONEVENTINFN)
				(VARS (DOCOBJ-HRULE-RULE-PAD)
				      (DOCOBJ-HRULE-BLANK-PAD))
				(ADDVARS (DocObjectsMenuCommands ("Horizontal Rule" (DOCOBJ-MAKE-HRULE
										      )
										    
								   "One or more horizontal rules")))
				(P (DOCOBJ-HRULE-INIT)))
			  [COMS (* INCLUDE *)
				(FNS DOCOBJ-MAKE-INCLUDE DOCOBJ-MAKE-INCLUDE-IMAGEFNS 
				     DOCOBJ-INCLUDE-DISPLAYFN DOCOBJ-INCLUDE-IMAGEBOXFN)
				(VARS (DOCOBJ-INCLUDE-IMAGEFNS (DOCOBJ-MAKE-INCLUDE-IMAGEFNS)))
				(* ADDVARS (DocObjectsMenuCommands ("Include" (DOCOBJ-MAKE-INCLUDE)
									      
					   "Include another document right here when hardcopying"]
			  (DECLARE: DONTEVAL@LOAD DOCOPY (P (DOCOBJ-INIT])
(* * This TEdit subsystem implements an extensible facility originally intended to provide 
bibliography and citation capabilities. The TEdit function GET.OBJ.FROM.USER, the one triggered
 by typing ↑O, calls the function PROMPTFOREVALED which is redefined by this subsystem to be 
equivalent to the function DocObj-Acquire-Object. This function inserts IMAGEOBJects into the 
current TEdit, and is driven by the variables DocObjectsMenu and DocObjectsMenuCommands (
analogous to BackgroundMenu and BackgroundMenuCommands) %. Each menu entry contains a form 
that, when EVAL'd, creates and returns a particular kind of IMAGEOBJ. Note that this form is 
EVAL'd under the function DocObj-Acquire-Object, which runs under the function 
GET.OBJ.FROM.USER, which gets TEXTSTREAM and TEXTOBJ as arguments. They can be (and are) used 
freely to record state or other desired info. The image objects supplied by this subsystem are 
"Eval`d Form" (i.e., the original behavior of ↑O) , "Screen Snap" (equivalent to 
right-buttoning in the background while holding the SHIFT key down) , etc.)

(FILESLOAD (SYSLOAD)
	   TEDIT IMAGEOBJ)

(RPAQQ DocObjectsMenu NIL)

(RPAQ? DocObjectsMenuCommands )

(RPAQ? DocObjectsMenuFont (FONTCREATE (QUOTE (MODERN 12 BOLD))))



(* The hook into GET.OBJ.FROM.USER *)

(DEFINEQ

(DOCOBJ-ACQUIRE-OBJECT
  [LAMBDA NIL                                                (* Koomen "30-Sep-86 02:10")

          (* * This function is invoked by TEdit's GET.OBJ.FROM.USER (cf. the Library file IMAGEOBJ) after 
	  (CHANGENAME (QUOTE GET.OBJ.FROM.USER) (QUOTE PROMPTFOREVALED) (QUOTE DOCOBJ-ACQUIRE-OBJECT)))



          (* * When adding more items to the DocObjectsMenuCommands, do (SETQ DocObjectsMenu))


    (DECLARE (GLOBALVARS DocObjectsMenu DocObjectsMenuCommands DocObjectsMenuFont))
    (if (NOT (type? MENU DocObjectsMenu))
	then (SETQ DocObjectsMenu
		 (create MENU
			   TITLE ← "Select object type: "
			   CENTERFLG ← T
			   ITEMS ← DocObjectsMenuCommands
			   MENUFONT ← DocObjectsMenuFont)))
    (MENU DocObjectsMenu])

(DOCOBJ-INIT
  [LAMBDA NIL                                                (* Koomen "31-Jan-87 02:05")

          (* * This function changes the behavior of standard TEdit such that ↑O will invoke the DocObjects system;
	  an entry to invoke the DocObjects system is also added to TEdit's middle button menu.)


    (DECLARE (GLOBALVARS TEDIT.DEFAULT.MENU))
    (CHANGENAME (QUOTE GET.OBJ.FROM.USER)
		  (QUOTE PROMPTFOREVALED)
		  (QUOTE DOCOBJ-ACQUIRE-OBJECT))
    (TEDIT.ADD.MENUITEM TEDIT.DEFAULT.MENU (QUOTE (Object (FUNCTION DOCOBJ-TEDIT-MENU-ENTRY)
							      "Insert a Document Object"])

(DOCOBJ-TEDIT-MENU-ENTRY
  [LAMBDA (TEXTSTREAM)                                     (* Koomen "28-Jan-87 16:28")

          (* * This is the entry point into the DocObjects system from TEdit's middle button menu. GET.OBJ.FROM.USER used to 
	  call PROMPTFOREVALED but DocObjects changes this into a call to DOCOBJ-ACQUIRE-OBJECT.)


    (GET.OBJ.FROM.USER TEXTSTREAM (TEXTOBJ TEXTSTREAM])

(DOCOBJ-GET-LOOKS
  [LAMBDA (TEXTOBJ CH#ORCHARLOOKS)                         (* Koomen " 4-Feb-87 23:37")

          (* * Adapted from {ERIS}<TEDIT>TEDITLOOKS.;30 dated "15-Oct-85 16:51:10" to return looks itself, rather than a 
	  proplist.)

                                                             (* jds "10-Jul-85 16:02")
                                                             (* Return a PLIST of character looks)
    (PROG ((TEXTOBJ (TEXTOBJ TEXTOBJ))
	     LOOKS FONT NLOOKS)
	    [COND
	      ((type? CHARLOOKS CH#ORCHARLOOKS)            (* He handed us a CHARLOOKS.
							     Unparse it for him.)
		(SETQ LOOKS CH#ORCHARLOOKS))
	      ((ZEROP (fetch TEXTLEN of TEXTOBJ))      (* There's no text in the document.
							     Use the extant caret looks.)
		(SETQ LOOKS (fetch CARETLOOKS of TEXTOBJ)))
	      [(FIXP CH#ORCHARLOOKS)                       (* He gave us a CH# to geth the looks of.
							     Grab it.)
		(SETQ LOOKS (fetch PLOOKS of (\CHTOPC (IMIN (fetch TEXTLEN of TEXTOBJ)
								      CH#ORCHARLOOKS)
							      (fetch PCTB of TEXTOBJ]
	      [(type? SELECTION CH#ORCHARLOOKS)            (* Get the looks of the selected text)
		(SETQ LOOKS (fetch PLOOKS of (\CHTOPC (IMIN (fetch TEXTLEN of TEXTOBJ)
								      (fetch (SELECTION CH#)
									 of CH#ORCHARLOOKS))
							      (fetch PCTB of TEXTOBJ]
	      ((NULL CH#ORCHARLOOKS)                       (* Get the looks of the selected text)
		(SETQ LOOKS (fetch PLOOKS of (\CHTOPC (IMIN (fetch TEXTLEN of TEXTOBJ)
								      (fetch (SELECTION CH#)
									 of (fetch SEL
										 of TEXTOBJ)))
							      (fetch PCTB of TEXTOBJ]
	    (RETURN LOOKS)

          (* * Now break the looks apart into a PROPLIST)


	    (SETQ NLOOKS (\TEDIT.UNPARSE.CHARLOOKS.LIST LOOKS))
	    (RETURN NLOOKS])

(DOCOBJ-STRING-IMAGEBOX
  [LAMBDA (STRING IMAGESTREAM)                               (* Koomen " 9-Feb-87 17:22")
    (DECLARE (SPECVARS CHNO TEXTOBJ))
    (PROG (LOOKS CLOFFSET FONT DEVICE HEIGHT DESCENT)
	    (SETQ LOOKS (DOCOBJ-GET-LOOKS TEXTOBJ CHNO))
	    (SETQ CLOFFSET (fetch (CHARLOOKS CLOFFSET) of LOOKS))
	    (SETQ FONT (fetch (CHARLOOKS CLFONT) of LOOKS))
	    (if (NEQ (FONTPROP FONT (QUOTE DEVICE))
			 (SETQ DEVICE (IMAGESTREAMTYPE IMAGESTREAM)))
		then (SETQ FONT (FONTCOPY FONT (QUOTE DEVICE)
						DEVICE)))
	    (SETQ HEIGHT (FONTHEIGHT FONT))
	    (SETQ DESCENT (FONTPROP FONT (QUOTE DESCENT)))
	    (RETURN (create IMAGEBOX
				XSIZE ← (STRINGWIDTH STRING FONT)
				YSIZE ← (IPLUS HEIGHT (IABS CLOFFSET))
				YDESC ← (IDIFFERENCE DESCENT CLOFFSET)
				XKERN ← 0])
)



(* "Eval'd Form" *)

(DEFINEQ

(DOCOBJ-ACQUIRE-EVALED-OBJECT
  [LAMBDA NIL                                                (* Koomen "30-Sep-86 02:08")

          (* * This is the original function called under GET.OBJ.FROM.USER * *)


    (PROMPTFOREVALED "Form to eval: "])
)

(ADDTOVAR DocObjectsMenuCommands ("Eval'd Form" (DOCOBJ-ACQUIRE-EVALED-OBJECT)
						  "Insert the value of a form to be typed in"))



(* "Screen Snap" *)

(DEFINEQ

(DOCOBJ-ACQUIRE-SNAPPED-OBJECT
  [LAMBDA NIL                                                (* Koomen "26-Sep-86 16:55")
    (GETREGION])
)

(ADDTOVAR DocObjectsMenuCommands ("Screen Snap" (DOCOBJ-ACQUIRE-SNAPPED-OBJECT)
						  "Insert a snap from the screen"))



(* "Time Stamp" *)

[DECLARE: EVAL@COMPILE 

(RECORD DOCOBJ-TIMESTAMP (IDATE DATESTR FORMAT))
]
(FILESLOAD (SYSLOAD)
	   DATEFORMAT-EDITOR)
(DEFINEQ

(DOCOBJ-EDIT-TIMESTAMP
  [LAMBDA (TIMESTAMP)                                        (* Koomen " 4-Feb-87 14:08")
    (PROG [(FORMAT (EDIT-DATEFORMAT (fetch (DOCOBJ-TIMESTAMP FORMAT) of TIMESTAMP]
	    (if FORMAT
		then (replace (DOCOBJ-TIMESTAMP FORMAT) of TIMESTAMP with FORMAT)
		       (replace (DOCOBJ-TIMESTAMP DATESTR) of TIMESTAMP with NIL)
		       (RETURN TIMESTAMP])

(DOCOBJ-MAKE-TIMESTAMP
  [LAMBDA NIL                                                (* Koomen " 4-Feb-87 13:54")
    (DECLARE (GLOBALVARS DOCOBJ-TIMESTAMP-IMAGEFNS DocObjectsTimeStampFormat))
    (IMAGEOBJCREATE (create DOCOBJ-TIMESTAMP
				IDATE ← (IDATE)
				FORMAT ← DocObjectsTimeStampFormat)
		      DOCOBJ-TIMESTAMP-IMAGEFNS])

(DOCOBJ-MAKE-TIMESTAMP-IMAGEFNS
  [LAMBDA NIL                                                (* Koomen "31-Jan-87 00:35")
    (LET ((DISPLAYFN (FUNCTION DOCOBJ-TIMESTAMP-DISPLAYFN))
	  (IMAGEBOXFN (FUNCTION DOCOBJ-TIMESTAMP-IMAGEBOXFN))
	  (PUTFN (FUNCTION DOCOBJ-TIMESTAMP-PUTFN))
	  (GETFN (FUNCTION DOCOBJ-TIMESTAMP-GETFN))
	  (COPYFN (FUNCTION DOCOBJ-TIMESTAMP-COPYFN))
	  (BUTTONEVENTINFN (FUNCTION DOCOBJ-TIMESTAMP-BUTTONEVENTINFN))
	  (COPYBUTTONEVENTINFN (FUNCTION NILL))
	  (WHENMOVEDFN (FUNCTION NILL))
	  (WHENINSERTEDFN (FUNCTION NILL))
	  (WHENDELETEDFN (FUNCTION NILL))
	  (WHENCOPIEDFN (FUNCTION NILL))
	  (WHENOPERATEDONFN (FUNCTION NILL))
	  (PREPRINTFN (FUNCTION NILL)))
         (IMAGEFNSCREATE DISPLAYFN IMAGEBOXFN PUTFN GETFN COPYFN BUTTONEVENTINFN 
			   COPYBUTTONEVENTINFN WHENMOVEDFN WHENINSERTEDFN WHENDELETEDFN WHENCOPIEDFN 
			   WHENOPERATEDONFN PREPRINTFN])

(DOCOBJ-TIMESTAMP-BUTTONEVENTINFN
  [LAMBDA (IMAGEOBJ WINDOWSTREAM SELECTION RELX RELY WINDOW HOSTSTREAM BUTTON)
                                                             (* Koomen " 4-Feb-87 14:05")
    (if (EQ BUTTON (QUOTE MIDDLE))
	then (ALLOW.BUTTON.EVENTS)
	       (if (DOCOBJ-EDIT-TIMESTAMP (IMAGEOBJPROP IMAGEOBJ (QUOTE OBJECTDATUM)))
		   then (QUOTE CHANGED])

(DOCOBJ-TIMESTAMP-COPYFN
  [LAMBDA (IMAGEOBJ SOURCEHOSTSTREAM TARGETHOSTSTREAM)       (* Koomen "31-Jan-87 00:30")
    (DECLARE (GLOBALVARS DOCOBJ-TIMESTAMP-IMAGEFNS))
    (IMAGEOBJCREATE (COPYALL (IMAGEOBJPROP IMAGEOBJ (QUOTE OBJECTDATUM)))
		      DOCOBJ-TIMESTAMP-IMAGEFNS])

(DOCOBJ-TIMESTAMP-DISPLAYFN
  [LAMBDA (IMAGEOBJ IMAGESTREAM IMAGESTREAMTYPE HOSTSTREAM)
                                                             (* Koomen " 4-Feb-87 14:11")
    (PRINTOUT IMAGESTREAM (DOCOBJ-TIMESTAMP-TO-STRING (IMAGEOBJPROP IMAGEOBJ (QUOTE OBJECTDATUM]
)

(DOCOBJ-TIMESTAMP-GETFN
  [LAMBDA (FILESTREAM)                                       (* Koomen "31-Jan-87 00:19")
    (DECLARE (GLOBALVARS DOCOBJ-TIMESTAMP-IMAGEFNS))
    (IMAGEOBJCREATE (READ FILESTREAM)
		      DOCOBJ-TIMESTAMP-IMAGEFNS])

(DOCOBJ-TIMESTAMP-IMAGEBOXFN
  [LAMBDA (IMAGEOBJ IMAGESTREAM CURRENTX RIGHTMARGIN)        (* Koomen " 9-Feb-87 17:13")
    (LET* ((TIMESTAMP (IMAGEOBJPROP IMAGEOBJ (QUOTE OBJECTDATUM)))
	   (TIMESTRING (DOCOBJ-TIMESTAMP-TO-STRING TIMESTAMP)))
          (DOCOBJ-STRING-IMAGEBOX TIMESTRING IMAGESTREAM])

(DOCOBJ-TIMESTAMP-PUTFN
  [LAMBDA (IMAGEOBJ FILESTREAM)                              (* Koomen " 4-Feb-87 14:08")
    (PROG [(TIMESTAMP (IMAGEOBJPROP IMAGEOBJ (QUOTE OBJECTDATUM]
	    (replace (DOCOBJ-TIMESTAMP IDATE) of TIMESTAMP with (IDATE))
	    (replace (DOCOBJ-TIMESTAMP DATESTR) of TIMESTAMP with NIL)
	    (PRINT TIMESTAMP FILESTREAM])

(DOCOBJ-TIMESTAMP-TO-STRING
  [LAMBDA (TIMESTAMP)                                        (* Koomen " 4-Feb-87 14:12")
    (OR (STRINGP (fetch (DOCOBJ-TIMESTAMP DATESTR) of TIMESTAMP))
	  (replace (DOCOBJ-TIMESTAMP DATESTR) of TIMESTAMP with (GDATE (fetch (
DOCOBJ-TIMESTAMP IDATE) of TIMESTAMP)
									       (fetch (
DOCOBJ-TIMESTAMP FORMAT) of TIMESTAMP])
)

(RPAQ? DocObjectsTimeStampFormat )

(RPAQ? DOCOBJ-TIMESTAMP-IMAGEFNS (DOCOBJ-MAKE-TIMESTAMP-IMAGEFNS))

(ADDTOVAR DocObjectsMenuCommands ("Time Stamp" (DOCOBJ-MAKE-TIMESTAMP)
						 "Date & time this document is PUT"))



(* "File Stamp" *)

(DEFINEQ

(DOCOBJ-MAKE-FILESTAMP
  [LAMBDA NIL                                                (* Koomen "31-Jan-87 04:16")
    (DECLARE (SPECVARS TEXTOBJ)
	       (GLOBALVARS DOCOBJ-FILESTAMP-IMAGEFNS))
    (IMAGEOBJCREATE (DOCOBJ-FILESTAMP-GET-FULLNAME TEXTOBJ)
		      DOCOBJ-FILESTAMP-IMAGEFNS])

(DOCOBJ-MAKE-FILESTAMP-IMAGEFNS
  [LAMBDA NIL                                                (* Koomen "31-Jan-87 03:39")
    (LET ((DISPLAYFN (FUNCTION DOCOBJ-FILESTAMP-DISPLAYFN))
	  (IMAGEBOXFN (FUNCTION DOCOBJ-FILESTAMP-IMAGEBOXFN))
	  (PUTFN (FUNCTION DOCOBJ-FILESTAMP-PUTFN))
	  (GETFN (FUNCTION DOCOBJ-FILESTAMP-GETFN))
	  (COPYFN (FUNCTION DOCOBJ-FILESTAMP-COPYFN))
	  (BUTTONEVENTINFN (FUNCTION NILL))
	  (COPYBUTTONEVENTINFN (FUNCTION NILL))
	  (WHENMOVEDFN (FUNCTION NILL))
	  (WHENINSERTEDFN (FUNCTION NILL))
	  (WHENDELETEDFN (FUNCTION NILL))
	  (WHENCOPIEDFN (FUNCTION NILL))
	  (WHENOPERATEDONFN (FUNCTION NILL))
	  (PREPRINTFN (FUNCTION NILL)))
         (IMAGEFNSCREATE DISPLAYFN IMAGEBOXFN PUTFN GETFN COPYFN BUTTONEVENTINFN 
			   COPYBUTTONEVENTINFN WHENMOVEDFN WHENINSERTEDFN WHENDELETEDFN WHENCOPIEDFN 
			   WHENOPERATEDONFN PREPRINTFN])

(DOCOBJ-FILESTAMP-COPYFN
  [LAMBDA (IMAGEOBJ SOURCEHOSTSTREAM TARGETHOSTSTREAM)       (* Koomen "31-Jan-87 04:10")
    (DECLARE (GLOBALVARS DOCOBJ-FILESTAMP-IMAGEFNS))
    (IMAGEOBJCREATE (IMAGEOBJPROP IMAGEOBJ (QUOTE OBJECTDATUM))
		      DOCOBJ-FILESTAMP-IMAGEFNS])

(DOCOBJ-FILESTAMP-DISPLAYFN
  [LAMBDA (IMAGEOBJ IMAGESTREAM IMAGESTREAMTYPE HOSTSTREAM)
                                                             (* Koomen " 4-Feb-87 14:28")
    (PRINTOUT IMAGESTREAM (IMAGEOBJPROP IMAGEOBJ (QUOTE OBJECTDATUM])

(DOCOBJ-FILESTAMP-GETFN
  [LAMBDA (FILESTREAM)                                       (* Koomen "31-Jan-87 03:38")
    (DECLARE (GLOBALVARS DOCOBJ-FILESTAMP-IMAGEFNS))
    (IMAGEOBJCREATE (READ FILESTREAM)
		      DOCOBJ-FILESTAMP-IMAGEFNS])

(DOCOBJ-FILESTAMP-IMAGEBOXFN
  [LAMBDA (IMAGEOBJ IMAGESTREAM CURRENTX RIGHTMARGIN)        (* Koomen " 9-Feb-87 17:14")
    (LET [(FILESTAMP (IMAGEOBJPROP IMAGEOBJ (QUOTE OBJECTDATUM]
         (DOCOBJ-STRING-IMAGEBOX FILESTAMP IMAGESTREAM])

(DOCOBJ-FILESTAMP-GET-FULLNAME
  [LAMBDA (TEXTOBJ)                                        (* Koomen " 4-Feb-87 14:28")
    (PROG ((FULLNAME (FULLNAME TEXTOBJ)))
	    (RETURN (MKSTRING (if (AND FULLNAME (OR (LITATOM FULLNAME)
							      (STRINGP FULLNAME)))
				      then (COPYALL FULLNAME)
				    else "-- not yet filed --"])

(DOCOBJ-FILESTAMP-PUTFN
  [LAMBDA (IMAGEOBJ FILESTREAM)                              (* Koomen "31-Jan-87 03:55")
    (PROG ((FULLNAME (FULLNAME FILESTREAM)))
	    (IMAGEOBJPROP IMAGEOBJ (QUOTE OBJECTDATUM)
			    FULLNAME)
	    (PRINT FULLNAME FILESTREAM])
)

(RPAQ? DOCOBJ-FILESTAMP-IMAGEFNS (DOCOBJ-MAKE-FILESTAMP-IMAGEFNS))

(ADDTOVAR DocObjectsMenuCommands ("File Stamp" (DOCOBJ-MAKE-FILESTAMP)
						 "Name of file to which this document was last PUT."))



(* HRULE *)

(FILESLOAD (SYSLOAD)
	   HRULE READNUMBER)
(DEFINEQ

(DOCOBJ-MAKE-HRULE
  [LAMBDA NIL                                                (* Koomen " 4-Feb-87 16:12")
    (HRULE.CREATE (bind WIDTH for I from 1 while (AND (SETQ WIDTH
								    (DOCOBJ-HRULE-GET-WIDTH
								      (ODDP I)
								      (EQ I 1)))
								  (GREATERP WIDTH 0))
		       collect WIDTH])

(DOCOBJ-EDIT-HRULE
  [LAMBDA (IMAGEOBJ)                                         (* Koomen " 4-Feb-87 15:45")
    (PROG [NEWWIDTH (OLDWIDTH (MKLIST (IMAGEOBJPROP IMAGEOBJ (QUOTE RULE.WIDTH]
	    (SETQ NEWWIDTH (COPYALL OLDWIDTH))
	    (if (AND (NLSETQ (EDITE NEWWIDTH))
			 (NOT (EQUAL NEWWIDTH OLDWIDTH)))
		then (IMAGEOBJPROP IMAGEOBJ (QUOTE RULE.WIDTH)
				       NEWWIDTH)
		       (RETURN IMAGEOBJ])

(DOCOBJ-HRULE-INIT
  [LAMBDA NIL                                                (* Koomen " 4-Feb-87 16:13")

          (* * provide HRULE editing * *)


    (DECLARE (GLOBALVARS HRULE.IMAGEFNS))
    (replace (IMAGEFNS BUTTONEVENTINFN) of HRULE.IMAGEFNS with (FUNCTION 
								     DOCOBJ-HRULE-BUTTONEVENTINFN))
    NIL])

(DOCOBJ-HRULE-GET-WIDTH
  [LAMBDA (RULE? FIRST?)                                     (* Koomen " 4-Feb-87 16:12")
    (DECLARE (GLOBALVARS DOCOBJ-HRULE-BLANK-PAD DOCOBJ-HRULE-RULE-PAD LASTMOUSEX LASTMOUSEY))
    (if (NULL DOCOBJ-HRULE-RULE-PAD)
	then (SETQ DOCOBJ-HRULE-RULE-PAD (CREATE.NUMBERPAD.READER "Rule width: " NIL NIL NIL T 
									T))
	       (SETQ DOCOBJ-HRULE-BLANK-PAD (CREATE.NUMBERPAD.READER "Blank space: " NIL NIL NIL 
									 T T)))
    (if FIRST?
	then (MOVEW DOCOBJ-HRULE-RULE-PAD LASTMOUSEX LASTMOUSEY)
	       (MOVEW DOCOBJ-HRULE-BLANK-PAD LASTMOUSEX LASTMOUSEY))
    (NUMBERPAD.READ (if RULE?
			  then DOCOBJ-HRULE-RULE-PAD
			else DOCOBJ-HRULE-BLANK-PAD])

(DOCOBJ-HRULE-BUTTONEVENTINFN
  [LAMBDA (IMAGEOBJ WINDOWSTREAM SELECTION RELX RELY WINDOW HOSTSTREAM BUTTON)
                                                             (* Koomen " 4-Feb-87 15:45")
    (if (EQ BUTTON (QUOTE MIDDLE))
	then (ALLOW.BUTTON.EVENTS)
	       (if (DOCOBJ-EDIT-HRULE IMAGEOBJ)
		   then (QUOTE CHANGED])
)

(RPAQQ DOCOBJ-HRULE-RULE-PAD NIL)

(RPAQQ DOCOBJ-HRULE-BLANK-PAD NIL)

(ADDTOVAR DocObjectsMenuCommands ("Horizontal Rule" (DOCOBJ-MAKE-HRULE)
						      "One or more horizontal rules"))
(DOCOBJ-HRULE-INIT)



(* INCLUDE *)

(DEFINEQ

(DOCOBJ-MAKE-INCLUDE
  [LAMBDA NIL                                                (* Koomen " 5-Feb-87 12:11")
    (DECLARE (GLOBALVARS DOCOBJ-INCLUDE-IMAGEFNS))
    (LET ((PROMPT.STR "Enter file name: ")
	  (CANDIDATE.STR)
	  (GENERATE?LIST.FN)
	  (ECHO.CHANNEL PROMPTWINDOW)
	  (DONTECHOTYPEIN.FLG)
	  (URGENCY.OPTION)
	  (TERMINCHARS.LST)
	  (KEYBD.CHANNEL))
         (LET [(SUBFILE (U-CASE (PROMPTFORWORD PROMPT.STR CANDIDATE.STR GENERATE?LIST.FN 
						   ECHO.CHANNEL DONTECHOTYPEIN.FLG URGENCY.OPTION 
						   TERMINCHARS.LST KEYBD.CHANNEL]
	      (if SUBFILE
		  then (IMAGEOBJCREATE SUBFILE DOCOBJ-INCLUDE-IMAGEFNS])

(DOCOBJ-MAKE-INCLUDE-IMAGEFNS
  [LAMBDA NIL                                                (* Koomen " 5-Feb-87 11:56")
    (LET ((DISPLAYFN (FUNCTION DOCOBJ-INCLUDE-DISPLAYFN))
	  (IMAGEBOXFN (FUNCTION DOCOBJ-INCLUDE-IMAGEBOXFN))
	  (PUTFN (OR (FUNCTION NILL)
		       (FUNCTION DOCOBJ-TIMESTAMP-PUTFN)))
	  (GETFN (OR (FUNCTION NILL)
		       (FUNCTION DOCOBJ-TIMESTAMP-GETFN)))
	  (COPYFN (OR (FUNCTION NILL)
			(FUNCTION DOCOBJ-TIMESTAMP-COPYFN)))
	  (BUTTONEVENTINFN (OR (FUNCTION NILL)
				 (FUNCTION DOCOBJ-TIMESTAMP-BUTTONEVENTINFN)))
	  (COPYBUTTONEVENTINFN (FUNCTION NILL))
	  (WHENMOVEDFN (FUNCTION NILL))
	  (WHENINSERTEDFN (FUNCTION NILL))
	  (WHENDELETEDFN (FUNCTION NILL))
	  (WHENCOPIEDFN (FUNCTION NILL))
	  (WHENOPERATEDONFN (FUNCTION NILL))
	  (PREPRINTFN (FUNCTION NILL)))
         (IMAGEFNSCREATE DISPLAYFN IMAGEBOXFN PUTFN GETFN COPYFN BUTTONEVENTINFN 
			   COPYBUTTONEVENTINFN WHENMOVEDFN WHENINSERTEDFN WHENDELETEDFN WHENCOPIEDFN 
			   WHENOPERATEDONFN PREPRINTFN])

(DOCOBJ-INCLUDE-DISPLAYFN
  [LAMBDA (IMAGEOBJ IMAGESTREAM IMAGESTREAMTYPE HOSTSTREAM)
                                                             (* Koomen " 5-Feb-87 12:22")
    (PROG [(SUBFILE (IMAGEOBJPROP IMAGEOBJ (QUOTE OBJECTDATUM]
	    (if (EQ IMAGESTREAMTYPE (QUOTE DISPLAY))
		then (printout IMAGESTREAM "@INCLUDE[" SUBFILE "]")
	      else 

          (* * DON'T KNOW WHAT TO DO HERE YET! * *)

])

(DOCOBJ-INCLUDE-IMAGEBOXFN
  [LAMBDA (IMAGEOBJ IMAGESTREAM CURRENTX RIGHTMARGIN)        (* Koomen " 9-Feb-87 17:16")
    (LET [(SUBFILE (IMAGEOBJPROP IMAGEOBJ (QUOTE OBJECTDATUM]
         (if (EQ (IMAGESTREAMTYPE IMAGESTREAM)
		     (QUOTE DISPLAY))
	     then (LET ((INCLSTR (CONCAT "@INCLUDE[" SUBFILE "]")))
		         (DOCOBJ-STRING-IMAGEBOX INCLSTR IMAGESTREAM))
	   else (create IMAGEBOX
			    XSIZE ← 0
			    YSIZE ← 0
			    YDESC ← 0
			    XKERN ← 0])
)

(RPAQ DOCOBJ-INCLUDE-IMAGEFNS (DOCOBJ-MAKE-INCLUDE-IMAGEFNS))



(* ADDVARS (DocObjectsMenuCommands ("Include" (DOCOBJ-MAKE-INCLUDE) 
"Include another document right here when hardcopying")))

(DECLARE: DONTEVAL@LOAD DOCOPY 
(DOCOBJ-INIT)
)
(PUTPROPS DOC-OBJECTS COPYRIGHT ("Johannes A. G. M. Koomen" 1986 1987))
(DECLARE: DONTCOPY
  (FILEMAP (NIL (5923 10822 (DOCOBJ-ACQUIRE-OBJECT 5933 . 6752) (DOCOBJ-INIT 6754 . 7403) (
DOCOBJ-TEDIT-MENU-ENTRY 7405 . 7821) (DOCOBJ-GET-LOOKS 7823 . 9886) (DOCOBJ-STRING-IMAGEBOX 9888 . 
10820)) (10851 11122 (DOCOBJ-ACQUIRE-EVALED-OBJECT 10861 . 11120)) (11289 11450 (
DOCOBJ-ACQUIRE-SNAPPED-OBJECT 11299 . 11448)) (11733 15946 (DOCOBJ-EDIT-TIMESTAMP 11743 . 12179) (
DOCOBJ-MAKE-TIMESTAMP 12181 . 12549) (DOCOBJ-MAKE-TIMESTAMP-IMAGEFNS 12551 . 13502) (
DOCOBJ-TIMESTAMP-BUTTONEVENTINFN 13504 . 13928) (DOCOBJ-TIMESTAMP-COPYFN 13930 . 14239) (
DOCOBJ-TIMESTAMP-DISPLAYFN 14241 . 14537) (DOCOBJ-TIMESTAMP-GETFN 14539 . 14803) (
DOCOBJ-TIMESTAMP-IMAGEBOXFN 14805 . 15130) (DOCOBJ-TIMESTAMP-PUTFN 15132 . 15527) (
DOCOBJ-TIMESTAMP-TO-STRING 15529 . 15944)) (16206 19234 (DOCOBJ-MAKE-FILESTAMP 16216 . 16532) (
DOCOBJ-MAKE-FILESTAMP-IMAGEFNS 16534 . 17457) (DOCOBJ-FILESTAMP-COPYFN 17459 . 17754) (
DOCOBJ-FILESTAMP-DISPLAYFN 17756 . 18019) (DOCOBJ-FILESTAMP-GETFN 18021 . 18285) (
DOCOBJ-FILESTAMP-IMAGEBOXFN 18287 . 18546) (DOCOBJ-FILESTAMP-GET-FULLNAME 18548 . 18941) (
DOCOBJ-FILESTAMP-PUTFN 18943 . 19232)) (19507 21863 (DOCOBJ-MAKE-HRULE 19517 . 19886) (
DOCOBJ-EDIT-HRULE 19888 . 20363) (DOCOBJ-HRULE-INIT 20365 . 20724) (DOCOBJ-HRULE-GET-WIDTH 20726 . 
21486) (DOCOBJ-HRULE-BUTTONEVENTINFN 21488 . 21861)) (22107 24857 (DOCOBJ-MAKE-INCLUDE 22117 . 22779) 
(DOCOBJ-MAKE-INCLUDE-IMAGEFNS 22781 . 23868) (DOCOBJ-INCLUDE-DISPLAYFN 23870 . 24322) (
DOCOBJ-INCLUDE-IMAGEBOXFN 24324 . 24855)))))
STOP