(FILECREATED "24-May-84 20:15:07" {DSK}TEDITWINDOW.;7 89592  

      changes to:  (FNS TEDIT.GETINPUT \TEDIT.WINDOW.SETUP \TEDIT.UNSPLITW \TEDIT.SCROLLFN)

      previous date: "24-May-84 13:55:47" {DSK}TEDITWINDOW.;4)


(PRETTYCOMPRINT TEDITWINDOWCOMS)

(RPAQQ TEDITWINDOWCOMS [(FILES TEXTOFD TEDITLOOKS ATTACHEDWINDOW)
	(FNS TEDIT.CREATEW TEDIT.CURSORMOVEDFN TEDIT.CURSOROUTFN TEDIT.GETINPUT TEDIT.PROMPTPRINT 
	     TEXTSTREAM.TITLE \TEDIT.ACTIVE.WINDOWP \TEDIT.BUTTONEVENTFN \TEDIT.EXPANDFN \TEDIT.MAINW 
	     \TEDIT.ORIGINAL.WINDOW.TITLE \TEDIT.CARET \TEDIT.NEWREGIONFN \TEDIT.SET.WINDOW.EXTENT 
	     \TEDIT.SHRINK.ICONCREATE \TEDIT.SHRINKFN \TEDIT.SPLITW \TEDIT.UNSPLITW 
	     \TEDIT.WINDOW.SETUP \TEDIT.WINDOW.TITLE \SAFE.FIRST)
	(CURSORS BXCARET BXHICARET TEDIT.LINECURSOR)
	(INITVARS (TEDIT.DEFAULT.WINDOW NIL)
		  (TEDIT.PROMPT.FONT (FONTCREATE 'GACHA 10)))
	(GLOBALVARS TEDIT.DEFAULT.WINDOW TEDIT.PROMPT.FONT)
	(COMS (* Screen updating utilities)
	      (FNS TEDIT.DEACTIVATE.WINDOW \TEDIT.REPAINTFN \TEDIT.RESHAPEFN \TEDIT.SET.WINDOW.TITLE 
		   \TEDIT.SCROLLFN))
	(COMS (* Process-world interfaces)
	      (FNS \TEDIT.PROCIDLEFN \TEDIT.PROCENTRYFN \TEDIT.PROCEXITFN))
	(COMS (INITVARS (\CARETRATE 333))
	      (* Caret handler; stolen from CHAT.)
	      (FNS \EDIT.DOWNCARET \EDIT.FLIPCARET TEDIT.FLASHCARET \EDIT.UPCARET 
		   TEDIT.NORMALIZECARET \SETCARET)
	      (DECLARE: EVAL@COMPILE DONTCOPY (RECORDS TEDITCARET)))
	[COMS (* Menu interfacing)
	      (FNS TEDIT.ADD.MENUITEM TEDIT.DEFAULT.MENUFN TEDIT.REMOVE.MENUITEM \TEDIT.CREATEMENU 
		   \TEDIT.MENU.WHENHELDFN \TEDIT.MENU.WHENSELECTEDFN)
	      (GLOBALVARS TEDIT.DEFAULT.MENU)
	      [DECLARE: DONTEVAL@LOAD DOCOPY
			(INITVARS (TEDIT.DEFAULT.MENU (\TEDIT.CREATEMENU (QUOTE (Put Get Include Find 
										     Looks Substitute 
										     Quit Hardcopy 
										     Press% File]
	      (DECLARE: DONTEVAL@LOAD DOCOPY (P [OR (SASSOC (QUOTE TEdit)
							    BackgroundMenuCommands)
						    (NCONC1 BackgroundMenuCommands
							    (QUOTE (TEdit (QUOTE (TEDIT))
									  
								  "Opens a TEdit window for use."]
						(SETQ BackgroundMenu NIL]
	(INITRECORDS TEDITCARET)
	(FILES IMAGEOBJ)
	(COMS (* titled icon info)
	      (FILES ICONW)
	      (BITMAPS TEDITICON TEDITMASK)
	      (INITVARS (TEDIT.ICON.FONT (FONTCREATE (QUOTE HELVETICA)
						     8
						     (QUOTE BOLD)))
			(TEDIT.ICON.TITLE.REGION (CREATE REGION BOTTOM ← 11 LEFT ← 23 WIDTH ← 64 
							 HEIGHT ← 77))
			(TEDIT.TITLED.ICON.TEMPLATE (CREATE TITLEDICON ICON←TEDITICON MASK←TEDITMASK 
							    TITLEREG←TEDIT.ICON.TITLE.REGION])
(FILESLOAD TEXTOFD TEDITLOOKS ATTACHEDWINDOW)
(DEFINEQ

(TEDIT.CREATEW
  [LAMBDA (PROMPT FILE)                                      (* gbn "19-Apr-84 11:24")
    (CLRPROMPT)
    (printout PROMPTWINDOW PROMPT T)
    (SETQ TEDIT.DEFAULT.WINDOW (CREATEW (GETREGION)
					(\TEDIT.ORIGINAL.WINDOW.TITLE FILE)))
    (CLRPROMPT)
    (DSPFONT TEDIT.DEFAULT.FONT TEDIT.DEFAULT.WINDOW)
    (WINDOWPROP TEDIT.DEFAULT.WINDOW (QUOTE TEDITCREATED)
		T)
    TEDIT.DEFAULT.WINDOW])

(TEDIT.CURSORMOVEDFN
  [LAMBDA (W)                                                (* jds " 9-Dec-83 18:04")
                                                             (* Watch the mouse and change the cursor to reflect the 
							     region of the window it's in 
							     (line select, window split eventually?))
    (PROG ((X (LASTMOUSEX W))
	   (Y (LASTMOUSEY W))
	   (TEXTOBJ (WINDOWPROP W (QUOTE TEXTOBJ)))
	   (CURSORREG (WINDOWPROP W (QUOTE TEDIT.CURSORREGION)))
	   LINE LEFT RIGHT)
          (COND
	    ((INSIDE? CURSORREG X Y)                         (* Do nothing)
	      NIL)
	    (T (SETQ LINE (\TEDIT.FIND.OVERLAPPING.LINE (fetch LINES of TEXTOBJ)
							Y))
	       [COND
		 (LINE (replace BOTTOM of CURSORREG with (fetch YBOT of LINE))
		       (replace HEIGHT of CURSORREG with (fetch LHEIGHT of LINE]
	       (SELECTQ (fetch MOUSEREGION of TEXTOBJ)
			[TEXT (COND
				([ILESSP X (SETQ LEFT (OR (AND LINE (fetch LEFTMARGIN of LINE))
							  (IPLUS (fetch WLEFT of TEXTOBJ)
								 8]
                                                             (* In left margin; switch to the line-select cursor)
				  (CURSOR TEDIT.LINECURSOR)
				  (replace MOUSEREGION of TEXTOBJ with (QUOTE LINE))
				  (replace LEFT of CURSORREG with 0)
				  (replace WIDTH of CURSORREG with LEFT))
				(T (replace LEFT of CURSORREG with LEFT)
				   (replace WIDTH of CURSORREG with (fetch WRIGHT of TEXTOBJ]
			[LINE (COND
				([IGEQ X (SETQ LEFT (OR (AND LINE (fetch LEFTMARGIN of LINE))
							(IPLUS (fetch WLEFT of TEXTOBJ)
							       8]
				  (CURSOR T)
				  (replace MOUSEREGION of TEXTOBJ with (QUOTE TEXT))
				  (replace LEFT of CURSORREG with LEFT)
				  (replace WIDTH of CURSORREG with (fetch WRIGHT of TEXTOBJ)))
				(T (replace LEFT of CURSORREG with 0)
				   (replace WIDTH of CURSORREG with LEFT]
			NIL])

(TEDIT.CURSOROUTFN
  [LAMBDA (W)                                                (* jds "28-Mar-84 11:30")
                                                             (* Cursor leaves edit window;
							     make sure we think we're in the text region.)
    (PROG [(TEXTOBJ (WINDOWPROP W (QUOTE TEXTOBJ]
          (COND
	    ((AND TEXTOBJ (EQ (fetch MOUSEREGION of TEXTOBJ)
			      (QUOTE LINE)))
	      (CURSOR T)
	      (replace MOUSEREGION of TEXTOBJ with (QUOTE TEXT])

(TEDIT.GETINPUT
  [LAMBDA (STREAM PROMPTSTRING DEFAULTSTRING DELIMITER.LIST)
                                                             (* jds "24-May-84 20:11")
                                                             (* Ask for input (file names, &c) for TEdit, perhaps 
							     with a default.)
    (PROG ((TEXTOBJ (TEXTOBJ STREAM)))
          (FRESHLINE (OR TEXTOBJ:PROMPTWINDOW PROMPTWINDOW))
          (RETURN (PROMPTFORWORD PROMPTSTRING DEFAULTSTRING NIL (OR (fetch PROMPTWINDOW of TEXTOBJ)
								    PROMPTWINDOW)
				 NIL NIL (OR DELIMITER.LIST (CHARCODE (EOL LF TAB ESCAPE)))
				 NIL])

(TEDIT.PROMPTPRINT
  [LAMBDA (TEXTOBJ MSG CLEAR?)                               (* jds "21-May-84 16:48")
    (PROG [(WINDOW (AND TEXTOBJ (fetch PROMPTWINDOW of TEXTOBJ]
          (COND
	    (WINDOW (COND
		      (CLEAR? (CLEARW WINDOW)))
		    (PRIN3 MSG WINDOW))
	    (T (FRESHLINE PROMPTWINDOW)
	       (printout PROMPTWINDOW MSG])

(TEXTSTREAM.TITLE
  [LAMBDA (STREAM)                                           (* gbn "19-Apr-84 13:26")
                                                             (* returns a string with which you can talk to the user 
							     about this stream)
    (PROG ((TEXTOBJ (TEXTOBJ STREAM))
	   TXTFILE)
          (SETQ TXTFILE (fetch TXTFILE of TEXTOBJ))
          (RETURN (OR (SELECTQ (TYPENAME TXTFILE)
			       (STRINGP TXTFILE)
			       (STREAM (fetch FULLNAME of TXTFILE))
			       (ATOMP TXTFILE)
			       TXTFILE)
		      ""])

(\TEDIT.ACTIVE.WINDOWP
  [LAMBDA (W)                                                (* gbn "27-Jan-84 06:31")
    (PROG [(TEXTOBJ (OR (WINDOWPROP W (QUOTE TEXTOBJ))
			(AND (WINDOWPROP W (QUOTE TEXTSTREAM))
			     (TEXTOBJ (WINDOWPROP W (QUOTE TEXTSTREAM]
          (RETURN (COND
		    (TEXTOBJ (AND (NOT (fetch EDITFINISHEDFLG of TEXTOBJ))
				  (PROCESSP (WINDOWPROP W (QUOTE PROCESS])

(\TEDIT.BUTTONEVENTFN
  [LAMBDA (W STREAM)                                         (* jds " 4-May-84 10:25")
                                                             (* Handle button events for a TEdit window)
    (AND STREAM (SETQ STREAM (TEXTOBJ STREAM)))
    (PROG ((OSEL NIL)
	   (SEL NIL)
	   [TEXTOBJ (OR STREAM (WINDOWPROP W (QUOTE TEXTOBJ]
	   (DS (WINDOWPROP W (QUOTE DSP)))
	   USERFN
	   (GLOBALSEL TEDIT.SELECTION)
	   (X (LASTMOUSEX W))
	   (Y (LASTMOUSEY W))
	   (CLIPREGION (DSPCLIPPINGREGION NIL W))
	   (SELOPERATION (QUOTE NORMAL))
	   (SELFN (WINDOWPROP W (QUOTE TEDIT.CMD.SELFN)))
	   (EXTENDFLG NIL)
	   SELFINALFN PROC NOSEL)
          (COND
	    ((NOT (MOUSESTATE (OR LEFT MIDDLE RIGHT)))       (* No button is down -- we got control on button-up 
							     transition, so ignore it.)
	      (RETURN)))
          (replace CH# of TEDIT.SCRATCHSELECTION with 0)     (* Mark the user-visible scratch selection fresh, so 
							     changes can be detected...)
          (COND
	    [[OR (NOT TEXTOBJ)
		 (fetch EDITFINISHEDFLG of TEXTOBJ)
		 (AND (NOT (WINDOWPROP W (QUOTE PROCESS)))
		      (NOT (KEYDOWNP (QUOTE LSHIFT)))
		      (NOT (KEYDOWNP (QUOTE RSHIFT)))
		      (NOT (KEYDOWNP (QUOTE CTRL)))
		      (NOT (KEYDOWNP (QUOTE COPY)))
		      (NOT (KEYDOWNP (QUOTE MOVE]            (* There's no edit session behind this window.
							     You can only do window ops, or re-establish a session.)
	      (TOTOPW W)
	      (COND
		((\TEDIT.MOUSESTATE RIGHT)                   (* Right button gets the window command menu)
		  (DOWINDOWCOM W))
		((AND TEXTOBJ [NOT (PROCESSP (WINDOWPROP W (QUOTE PROCESS]
		      (\TEDIT.MOUSESTATE MIDDLE))            (* Middle button on a dead window gives a menu for 
							     re-starting TEDIT)
		  (COND
		    ((EQ (MENU TEDIT.RESTART.MENU)
			 (QUOTE NewEditProcess))
		      (replace EDITOPACTIVE of TEXTOBJ with NIL)
		      (TEDIT (fetch STREAMHINT of TEXTOBJ)
			     W]
	    [[OR (IGREATERP Y (fetch TOP of CLIPREGION))
		 (AND (fetch TXTREADONLY of TEXTOBJ)
		      (NOT (KEYDOWNP (QUOTE LSHIFT)))
		      (NOT (KEYDOWNP (QUOTE RSHIFT)))
		      (NOT (KEYDOWNP (QUOTE CTRL)))
		      (NOT (KEYDOWNP (QUOTE COPY)))
		      (NOT (KEYDOWNP (QUOTE MOVE]            (* It's not inside the window's REAL region, so call on 
							     a menu.)
	      (TOTOPW W)
	      (COND
		((\TEDIT.MOUSESTATE RIGHT)
		  (DOWINDOWCOM W))
		((MOUSESTATE (OR LEFT MIDDLE))
		  (AND TEXTOBJ (SETQ USERFN (WINDOWPROP W (QUOTE TEDIT.TITLEMENUFN)))
		       (NEQ USERFN (QUOTE DON'T))
		       (COND
			 ((AND (SETQ PROC (WINDOWPROP W (QUOTE PROCESS)))
			       (PROCESSP PROC))              (* This window has a live process behind it;
							     go evaluate the button fn there.)
			   (PROCESS.APPLY PROC USERFN (LIST W)))
			 (T (ADD.PROCESS (LIST USERFN (KWOTE W]
	    ((AND TEXTOBJ (NOT (fetch EDITOPACTIVE of TEXTOBJ)))
                                                             (* Usual case -- he's really selecting something.)
	      (TOTOPW W)
	      (OR (fetch TCUP of (fetch CARET of TEXTOBJ))
		  (\EDIT.FLIPCARET (fetch CARET of TEXTOBJ)
				   T))                       (* Make sure the caret isn't being displayed.)
	      (RESETLST (RESETSAVE TEDIT.SELPENDING TEXTOBJ)

          (* Tell all TEdits not to run, since there is a selection in progress. This is reset to NIL on return from here, 
	  to re-enable TEdit runs.)


			(RESETSAVE (replace TCCURSORBM of (fetch CARET of TEXTOBJ) with BXHICARET)
				   (LIST (QUOTE \TEDIT.CARET)
					 (fetch CARET of TEXTOBJ)))
                                                             (* Then make the caret be the special, tall one so he 
							     can see it.)
			(COND
			  ((OR (fetch TXTREADONLY of TEXTOBJ)
			       (KEYDOWNP (QUOTE COPY)))      (* In a read-only document, you can only copy.)
			    (SETQ GLOBALSEL TEDIT.SHIFTEDSELECTION)
			    (SETQ OSEL (fetch SHIFTEDSEL of TEXTOBJ))
			    (SETQ SELOPERATION (QUOTE COPY)))
			  ((KEYDOWNP (QUOTE MOVE))           (* The MOVE key is down, so set MOVE mode.)
			    (SETQ GLOBALSEL TEDIT.MOVESELECTION)
			    (SETQ OSEL (fetch MOVESEL of TEXTOBJ))
			    (SETQ SELOPERATION (QUOTE MOVE)))
			  [(OR (KEYDOWNP (QUOTE LSHIFT))
			       (KEYDOWNP (QUOTE RSHIFT)))    (* the SHIFT key is down; mark this selection for COPY 
							     or MOVE.)
			    (COND
			      ((KEYDOWNP (QUOTE CTRL))       (* CTRL-SHIFT select means MOVE.)
				(SETQ GLOBALSEL TEDIT.MOVESELECTION)
				(SETQ OSEL (fetch MOVESEL of TEXTOBJ))
				(SETQ SELOPERATION (QUOTE MOVE)))
			      (T (SETQ GLOBALSEL TEDIT.SHIFTEDSELECTION)
				 (SETQ OSEL (fetch SHIFTEDSEL of TEXTOBJ))
				 (SETQ SELOPERATION (QUOTE COPY]
			  ((KEYDOWNP (QUOTE CTRL))           (* He's holding the control key down;
							     note the fact.)
			    (\SHOWSEL (fetch SEL of TEXTOBJ)
				      NIL NIL)               (* Turn off the old normal selection.)
			    (replace SET of (fetch SEL of TEXTOBJ) with NIL)
			    (SETQ GLOBALSEL TEDIT.DELETESELECTION)
			    (SETQ OSEL (fetch DELETESEL of TEXTOBJ))
			    (SETQ SELOPERATION (QUOTE DELETE))
			    (replace BLUEPENDINGDELETE of TEXTOBJ with NIL))
			  (T (SETQ OSEL (fetch SEL of TEXTOBJ))
			     (replace BLUEPENDINGDELETE of TEXTOBJ with NIL)
                                                             (* Reset the pending-delete flag.)
			     ))
			(\COPYSEL OSEL GLOBALSEL)
			(bind (OSELOP ← SELOPERATION) while [OR (KEYDOWNP (QUOTE LSHIFT))
								(KEYDOWNP (QUOTE RSHIFT))
								(KEYDOWNP (QUOTE CTRL))
								(KEYDOWNP (QUOTE COPY))
								(KEYDOWNP (QUOTE MOVE))
								(NOT (ZEROP (LOGAND LASTMOUSEBUTTONS 
										    7]
			   do                                (* Poll the selection & display its current state)
			      [OR (ZEROP (LOGAND LASTMOUSEBUTTONS 7))
				  (COND
				    ((fetch TXTREADONLY of TEXTOBJ)
				      (SETQ SELOPERATION (QUOTE COPY)))
				    ((KEYDOWNP (QUOTE COPY))
                                                             (* the COPY key is down; mark this selection for COPY)
				      (SETQ SELOPERATION (QUOTE COPY)))
				    ((KEYDOWNP (QUOTE MOVE))
                                                             (* the MOVE key is down; mark this selection for MOVE.)
				      (SETQ SELOPERATION (QUOTE MOVE)))
				    [(OR (KEYDOWNP (QUOTE LSHIFT))
					 (KEYDOWNP (QUOTE RSHIFT)))
                                                             (* the SHIFT key is down; mark this selection for COPY 
							     or MOVE.)
				      (COND
					((KEYDOWNP (QUOTE CTRL))
					  (SETQ SELOPERATION (QUOTE MOVE)))
					(T (SETQ SELOPERATION (QUOTE COPY]
				    ((KEYDOWNP (QUOTE CTRL))
                                                             (* He's holding the control key down;
							     note the fact.)
				      (SETQ SELOPERATION (QUOTE DELETE)))
				    (T                       (* No key being held down; revert to normal selection.)
				       (SETQ SELOPERATION (QUOTE NORMAL]
			      [COND
				((IN/SCROLL/BAR? W LASTMOUSEX LASTMOUSEY)
                                                             (* If he moves to the scroll bar, let him scroll without
							     trouble)
				  (SCROLL.HANDLER W))
				((INSIDEP CLIPREGION (SETQ X (LASTMOUSEX DS))
					  (SETQ Y (LASTMOUSEY DS)))
                                                             (* Only do selection if the mouse is inside the window 
							     proper)
				  [COND
				    ((\TEDIT.MOUSESTATE LEFT)
                                                             (* Left button is character selection)
				      (SETQ SEL (TEDIT.SELECT X Y TEXTOBJ (fetch MOUSEREGION
									     of TEXTOBJ)
							      NIL SELOPERATION W))
				      (SETQ EXTENDFLG NIL))
				    ((\TEDIT.MOUSESTATE MIDDLE)
                                                             (* Middle button is word selection)
				      (SETQ SEL (TEDIT.SELECT X Y TEXTOBJ (fetch MOUSEREGION
									     of TEXTOBJ)
							      T SELOPERATION W))
				      (SETQ EXTENDFLG NIL))
				    [(\TEDIT.MOUSESTATE RIGHT)
                                                             (* RIght button extends selections)
				      (COND
					((NEQ SELOPERATION OSELOP)

          (* Things changed since the last selection. Grab the prior selection info, so that the extension is taken from the
	  selection NOW being made, rather than the last existing old-type selection.)


					  (\COPYSEL OSEL GLOBALSEL)))
				      (COND
					((fetch SET of GLOBALSEL)
					  (AND TEDIT.EXTEND.PENDING.DELETE (EQ SELOPERATION
									       (QUOTE NORMAL))
					       (SETQ SELOPERATION (QUOTE PENDINGDEL))
					       (replace BLUEPENDINGDELETE of TEXTOBJ with T))
                                                             (* If TeditBluePendingDelete flag is set, then simulate 
							     Laurel's blue-pending-delete feature.)
					  (SETQ SEL (TEDIT.EXTEND.SEL X Y GLOBALSEL TEXTOBJ 
								      SELOPERATION W))
					  (SETQ EXTENDFLG T]
				    (T                       (* The mouse buttons are up, leaving us with a pro-tem 
							     "permanent" selection)
				       (\COPYSEL OSEL GLOBALSEL)
                                                             (* And SEL is NOT SET ANY LONGER, so it won't get copied
							     into OSEL down below)
				       (AND SEL (replace SET of SEL with NIL]
				  [COND
				    ((AND SEL (fetch SET of SEL)
					  SELFN)             (* The selection was set, but there's a SELFN that has 
							     veto authority)
				      (COND
					((EQ (APPLY* SELFN TEXTOBJ GLOBALSEL SELOPERATION
						     (QUOTE FINAL))
					     (QUOTE DON'T))
                                                             (* The selfn vetoed this selection, so mark it un-set.)
					  (replace SET of SEL with NIL]
				  (COND
				    [[AND SEL (fetch SET of SEL)
					  (NOT (AND (fetch SET of OSEL)
						    (EQ (fetch SET of OSEL)
							(fetch SET of SEL))
						    (EQUAL (fetch CH# of SEL)
							   (fetch CH# of OSEL))
						    (EQUAL (fetch CHLIM of SEL)
							   (fetch CHLIM of OSEL))
						    (EQ (fetch \TEXTOBJ of SEL)
							(fetch \TEXTOBJ of OSEL))
						    (IEQP (fetch DX of SEL)
							  (fetch DX of OSEL))
						    (EQ (fetch POINT of SEL)
							(fetch POINT of OSEL))
						    (EQ (fetch HOW of SEL)
							(fetch HOW of OSEL))
						    (EQ (fetch HOWHEIGHT of SEL)
							(fetch HOWHEIGHT of OSEL))
						    (EQ OSELOP SELOPERATION]
                                                             (* Something interesting about the selection changed.
							     We have to re-display its image.)
				      (COND
					((OR (EQ SELOPERATION (QUOTE NORMAL))
					     (EQ SELOPERATION (QUOTE PENDINGDEL)))
                                                             (* For a normal selection, set the 
							     "window last selected in" for the TEXTOBJ)
					  (replace SELWINDOW of TEXTOBJ with W)))
				      (COND
					((AND EXTENDFLG (EQ OSELOP SELOPERATION))
                                                             (* If we're extending a selection and the looks haven't 
							     changed, we can do it the fast way, to prevent flicker.)
					  (\TEDIT.UPDATE.SHOWSEL SEL OSEL)
					  (\COPYSEL SEL OSEL)
					  (replace ONFLG of OSEL with T))
					(T                   (* Otherwise, we have to turn the old one off, change 
							     things, and turn the new one on.)
					   (\SHOWSEL OSEL NIL NIL)
					   (COND
					     ((NEQ OSELOP SELOPERATION)
                                                             (* He changed his mind about copying, deleting, or 
							     whatever -- change the kind of selection it is.)
					       (SELECTQ SELOPERATION
							((NORMAL PENDINGDEL)
							  (SETQ GLOBALSEL TEDIT.SELECTION)
							  (SETQ NOSEL (fetch SEL of TEXTOBJ)))
							(COPY (SETQ GLOBALSEL TEDIT.SHIFTEDSELECTION)
							      (SETQ NOSEL (fetch SHIFTEDSEL
									     of TEXTOBJ)))
							(MOVE (SETQ GLOBALSEL TEDIT.MOVESELECTION)
							      (SETQ NOSEL (fetch MOVESEL
									     of TEXTOBJ)))
							(DELETE (SETQ GLOBALSEL TEDIT.DELETESELECTION)
								(SETQ NOSEL (fetch DELETESEL
									       of TEXTOBJ)))
							NIL)
					       (SETQ OSELOP SELOPERATION)
                                                             (* Remember the new operation type.)
					       (replace SET of OSEL with NIL)
                                                             (* Turn off the old kind of selection, so it doesn't 
							     reappear to haunt us.)
					       (AND (fetch SET of NOSEL)
						    (\SHOWSEL NOSEL NIL NIL))
                                                             (* If there was a new-type selection around, turn it 
							     off.)
					       (SETQ OSEL NOSEL)
                                                             (* Now cut over to the new selection)
					       (TEDIT.SET.SEL.LOOKS OSEL SELOPERATION)
                                                             (* And set it up looking right.)
					       ))
					   (\COPYSEL SEL OSEL)
					   (replace ONFLG of OSEL with NIL)
                                                             (* Make sure we can turn the highlighting on.)
					   (\SHOWSEL OSEL NIL T]
				    ([AND OSEL (fetch SET of OSEL)
					  (EQ (fetch SELKIND of OSEL)
					      (QUOTE VOLATILE))
					  (OR (NOT SEL)
					      (NOT (fetch SET of SEL]

          (* There is an old selection around, but it is VOLATILE -- i.e., it shouldn't last longer than something is 
	  pointing at it. Turn it off.)


				      (\SHOWSEL OSEL NIL NIL)
				      (replace SET of OSEL with NIL]
			      (BLOCK)                        (* Give other processes a chance)
			      (GETMOUSESTATE)                (* And get the new mouse info)
			      (TEDIT.CURSORMOVEDFN W))
			(\COPYSEL OSEL GLOBALSEL)
			(COND
			  ((fetch SET of OSEL)               (* Only if a selection REALLY got made should we do 
							     this....)
			    (SELECTQ SELOPERATION
				     (COPY                   (* A COPY selection -- set the copy flag, and see if 
							     this is a copy to a non-TEdit window)
					   (SETQ TEDIT.COPY.PENDING T)
					   (replace SET of OSEL with NIL)
                                                             (* And turn off OSEL, to avoid spurious highlighting)
					   (\TEDIT.FOREIGN.COPY? GLOBALSEL)
                                                             (* Maybe copy into the SYSBUF, if the recipient isn't a 
							     TEdit window.)
					   )
				     (MOVE                   (* A MOVE selection -- set the flag to signal the TEdit 
							     command loop,)
					   (SETQ TEDIT.MOVE.PENDING T)
                                                             (* And turn off OSEL, to avoid spurious highlighting)
					   (replace SET of OSEL with NIL))
				     (DELETE (SETQ TEDIT.DEL.PENDING T)
					     (replace SET of OSEL with NIL)
                                                             (* And turn off OSEL, to avoid spurious highlighting)
					     )
				     (NORMAL                 (* This is a normal selection;
							     set the caret looks)
					     (replace CARETLOOKS of TEXTOBJ with (
\TEDIT.GET.INSERT.CHARLOOKS TEXTOBJ OSEL)))
				     NIL)))
			(AND SELFN (APPLY* SELFN TEXTOBJ GLOBALSEL SELOPERATION (QUOTE FINAL)))
                                                             (* Give a user exit routine control, perhaps for logging
							     of selections.)
			(OR (fetch TCUP of (fetch CARET of TEXTOBJ))
			    (\EDIT.FLIPCARET (fetch CARET of TEXTOBJ)
					     T))
			(AND OSEL (fetch SET of OSEL)
			     (fetch SELOBJ of OSEL)
			     (SETQ SELFINALFN (IMAGEOBJPROP (fetch SELOBJ of OSEL)
							    (QUOTE WHENOPERATEDONFN)))
			     (APPLY* SELFINALFN (fetch SELOBJ of OSEL)
				     (WINDOWPROP W (QUOTE DSP))
				     (QUOTE SELECTED)
				     OSEL
				     (fetch STREAMHINT of TEXTOBJ])

(\TEDIT.EXPANDFN
  [LAMBDA (W)                                                (* jds " 2-Feb-84 14:42")
                                                             (* steals back the tty for us!)
    (AND (WINDOWPROP W (QUOTE PROCESS))
	 (TTY.PROCESS (WINDOWPROP W (QUOTE PROCESS])

(\TEDIT.MAINW
  [LAMBDA (TEXTOBJ)                                          (* jds "16-Jan-84 12:34")
                                                             (* Get the MAIN edit window for this edit session 
							     (i.e., the one with the title, and all the props & 
							     stuff))
    (PROG ((WINDOWS (fetch \WINDOW of TEXTOBJ)))
          (RETURN (COND
		    ((LISTP WINDOWS)
		      (CAR WINDOWS))
		    (T WINDOWS])

(\TEDIT.ORIGINAL.WINDOW.TITLE
  [LAMBDA (FILE)                                             (* gbn "25-Apr-84 22:17")
                                                             (* Given a file name, derive a title for the TEdit 
							     window that is editing it.)
    (PROG (TITLE)
          (RETURN (COND
		    ((NULL FILE)                             (* Just calling (TEDIT) should give a 
							     "Text Editor Window")
		      "Text Editor Window")
		    ((ZEROP (NCHARS (MKSTRING FILE)))        (* So should editing an empty string)
		      "Text Editor Window")
		    ((WINDOWP FILE)
		      (if (SETQ TITLE (WINDOWPROP FILE (QUOTE TITLE)))
			  then                               (* if \TEDIT.WINDOW.SETUP has assigned a title, use it)
			       TITLE
			else "Text Editor Window"))
		    (T                                       (* Strings use the string itself, otherwise grab the 
							     full file name.)
		       (CONCAT "Edit Window for:  " (SELECTQ (TYPENAME FILE)
							     (STRINGP FILE)
							     (STREAM (fetch FULLNAME of FILE))
							     (ATOMP FILE)
							     FILE])

(\TEDIT.CARET
  [LAMBDA (CARET)                                            (* jds "20-Apr-84 22:01")
                                                             (* Reset the caret to its normal state state, from the 
							     selection caret)
    (replace (TEDITCARET TCCURSORBM) of CARET with BXCARET])

(\TEDIT.NEWREGIONFN
  [LAMBDA (FIXEDPOINT MOVINGPOINT WINDOW)                    (* jds "24-FEB-83 17:43")

          (* This function is called whenever a new region for the window is needed. It constrains the size of the window so
	  that the menu and/or titles will fit)


    (COND
      ((NULL MOVINGPOINT)                                    (* This is true only the first time the function is 
							     called)
	FIXEDPOINT)
      (T (PROG (#OFMENUITEMS MENUWIDTH XDELTA YDELTA)

          (* The NEWREGIONFNARG can be either a window or a list consisting of the number of items in the menu and the 
	  minimum width of the window neede to hold the menu an titles)


	       (SETQ XDELTA (IDIFFERENCE (fetch (POSITION XCOORD) of MOVINGPOINT)
					 (fetch (POSITION XCOORD) of FIXEDPOINT)))
	       (SETQ YDELTA (IDIFFERENCE (fetch (POSITION YCOORD) of MOVINGPOINT)
					 (fetch (POSITION YCOORD) of FIXEDPOINT)))
	       [COND
		 [(IGEQ XDELTA 0)
		   (replace (POSITION XCOORD) of MOVINGPOINT with (IPLUS (fetch (POSITION XCOORD)
									    of FIXEDPOINT)
									 (IMAX 32 XDELTA]
		 (T (replace (POSITION XCOORD) of MOVINGPOINT with (IPLUS (fetch (POSITION XCOORD)
									     of FIXEDPOINT)
									  (IMIN -32 XDELTA]
	       [COND
		 [(IGEQ YDELTA 0)
		   (replace (POSITION YCOORD) of MOVINGPOINT with (IPLUS (fetch (POSITION YCOORD)
									    of FIXEDPOINT)
									 (IMAX 32 YDELTA]
		 (T (replace (POSITION YCOORD) of MOVINGPOINT with (IPLUS (fetch (POSITION YCOORD)
									     of FIXEDPOINT)
									  (IMIN -32 YDELTA]
	       (RETURN MOVINGPOINT])

(\TEDIT.SET.WINDOW.EXTENT
  [LAMBDA (TEXTOBJ WINDOW)                                   (* jds "23-Jan-84 16:28")
                                                             (* Set the window's EXTENT property according to 1st and
							     last char on screen.)
    (PROG ((WHEIGHT (fetch HEIGHT of (DSPCLIPPINGREGION NIL WINDOW)))
	   (LINES (WINDOWPROP WINDOW (QUOTE LINES)))
	   (TEXTLEN (fetch TEXTLEN of TEXTOBJ))
	   TOPCHAR BOTCHAR PREVLINE EXTHEIGHT EXTBOT)
          (OR WINDOW (RETURN))                               (* Do nothing if there's no window to do it in.)
          (while (AND LINES (IGEQ (fetch YBOT of LINES)
				  WHEIGHT))
	     do (SETQ LINES (fetch NEXTLINE of LINES)))
          (OR LINES (RETURN))
          (SETQ TOPCHAR (fetch CHAR1 of LINES))
          (while (AND LINES (IGREATERP (fetch YBOT of LINES)
				       0))
	     do (SETQ PREVLINE LINES)
		(SETQ LINES (fetch NEXTLINE of LINES)))
          (OR PREVLINE (RETURN))
          (SETQ BOTCHAR (IMIN TEXTLEN (fetch CHARLIM of PREVLINE)))
          (AND (IEQP BOTCHAR TOPCHAR)
	       (RETURN))
          [SETQ EXTHEIGHT (FIXR (FQUOTIENT (ITIMES (IDIFFERENCE WHEIGHT (fetch YBOT of PREVLINE))
						   TEXTLEN)
					   (IDIFFERENCE BOTCHAR TOPCHAR]
          [SETQ EXTBOT (IDIFFERENCE (fetch YBOT of PREVLINE)
				    (FIXR (FQUOTIENT (ITIMES (IDIFFERENCE WHEIGHT
									  (fetch YBOT of PREVLINE))
							     (IDIFFERENCE TEXTLEN BOTCHAR))
						     (IDIFFERENCE BOTCHAR TOPCHAR]
          (WINDOWPROP WINDOW (QUOTE EXTENT)
		      (create REGION
			      BOTTOM ← EXTBOT
			      HEIGHT ← EXTHEIGHT
			      WIDTH ←(fetch WIDTH of (DSPCLIPPINGREGION NIL WINDOW))
			      LEFT ← 0])

(\TEDIT.SHRINK.ICONCREATE
  [LAMBDA (W ICON ICONW)                                     (* jds "13-Apr-84 15:25")
                                                             (* Create the icon that represents this window.)
    (PROG ((ICON (WINDOWPROP W (QUOTE ICON)))
	   ICONTITLE)
          (SETQ ICONTITLE (WINDOWPROP W (QUOTE TEDIT.ICON.TITLE)))
          (COND
	    ((OR [AND ICONTITLE (EQUAL ICONTITLE (TEXTSTREAM.TITLE (TEXTSTREAM W]
		 (AND (NOT ICONTITLE)
		      ICON))                                 (* we built this and the title is the same, or he has 
							     already put an icon on this. Do nothing)
	      NIL)
	    (ICON                                            (* There's an existing icon window;
							     change the title in it)
		  [WINDOWPROP W (QUOTE TEDIT.ICON.TITLE)
			      (SETQ ICONTITLE (TEXTSTREAM.TITLE (TEXTSTREAM W]
		  (ICONTITLE ICONTITLE NIL NIL ICON))
	    (T                                               (* install a new icon)
	       [WINDOWPROP W (QUOTE TEDIT.ICON.TITLE)
			   (SETQ ICONTITLE (TEXTSTREAM.TITLE (TEXTSTREAM W]
	       (WINDOWPROP W (QUOTE ICON)
			   (TITLEDICONW TEDIT.TITLED.ICON.TEMPLATE ICONTITLE TEDIT.ICON.FONT NIL T])

(\TEDIT.SHRINKFN
  [LAMBDA (W ICON ICONW)                                     (* jds "13-Apr-84 15:25")
                                                             (* hands off the tty to the exec process)
    (COND
      ((AND (EQ (WINDOWPROP W (QUOTE PROCESS))
		(TTY.PROCESS)))
	(TTY.PROCESS (QUOTE EXEC])

(\TEDIT.SPLITW
  [LAMBDA (WINDOW Y)                                         (* gbn "18-Apr-84 20:08")
                                                             (* SPLIT WINDOW W AT W-RELATIVE Y.)
    (PROG ((WREG (WINDOWPROP WINDOW (QUOTE REGION)))
	   (TEXTOBJ (WINDOWPROP WINDOW (QUOTE TEXTOBJ)))
	   NEWW OLDW OTITLE)
          (SETQ Y (OR Y (LASTMOUSEY WINDOW)))
          (SHAPEW WINDOW (create REGION using WREG BOTTOM ←(IPLUS (fetch BOTTOM of WREG)
								  Y)
					      HEIGHT ←(IDIFFERENCE (fetch HEIGHT of WREG)
								   Y)))
          (ATTACHWINDOW (SETQ NEWW (CREATEW (create REGION using WREG HEIGHT ← Y)
					    NIL NIL NIL))
			WINDOW
			(QUOTE BOTTOM)
			(QUOTE JUSTIFY)
			(QUOTE MAIN))
          (WINDOWPROP NEWW (QUOTE TEDITCREATED)
		      T)
          (SETQ OLDW (fetch \WINDOW of TEXTOBJ))
          (SETQ OTITLE (\TEDIT.WINDOW.TITLE TEXTOBJ))
          (\TEDIT.WINDOW.SETUP NEWW TEXTOBJ (fetch STREAMHINT of TEXTOBJ)
			       (fetch EDITPROPS of TEXTOBJ))
          (replace WINDOWTITLE of TEXTOBJ with OTITLE)       (* John, I'm not sure how you would like to do this, 
							     this is probably not what we want *********)
          [replace \WINDOW of TEXTOBJ with (COND
					     ((LISTP OLDW)
					       (NCONC1 OLDW NEWW))
					     (T (LIST OLDW NEWW]
          (WINDOWPROP NEWW (QUOTE PROCESS)
		      (WINDOWPROP WINDOW (QUOTE PROCESS])

(\TEDIT.UNSPLITW
  [LAMBDA (WINDOW Y)                                         (* jds "24-May-84 17:07")
                                                             (* SPLIT WINDOW W AT W-RELATIVE Y.)
    (PROG ([WREG (COPY (WINDOWPROP WINDOW (QUOTE REGION]
	   (MAINW (WINDOWPROP WINDOW (QUOTE MAINWINDOW)))
	   (TEXTOBJ (WINDOWPROP WINDOW (QUOTE TEXTOBJ)))
	   NEWW OLDW OTITLE)
          (COND
	    ((NOT MAINW)
	      (TEDIT.PROMPTPRINT TEXTOBJ "Can't UNSPLIT the main window." T)
	      (RETURN)))
          (DETACHWINDOW WINDOW)
          (TEDIT.DEACTIVATE.WINDOW WINDOW T)
          (CLOSEW WINDOW)
          (SHAPEW MAINW (UNIONREGIONS WREG (WINDOWPROP MAINW (QUOTE REGION])

(\TEDIT.WINDOW.SETUP
  [LAMBDA (WINDOW TEXTOBJ TEXTSTREAM PROPS)                  (* jds "24-May-84 17:18")
                                                             (* Set up the window and TEXTOBJ so they correspond, and
							     the window is a TEDIT window.)
    (PROG ((SEL (fetch SEL of TEXTOBJ))
	   TEDITPROMPTWINDOW DS PROP TWIDTH THEIGHT)
          (OR WINDOW (\ILLEGAL.ARG WINDOW))
          (replace SELWINDOW of TEXTOBJ with WINDOW)
          (WINDOWPROP WINDOW (QUOTE PROCESS)
		      NIL)                                   (* For the moment, this window has no process)
          (WINDOWPROP WINDOW (QUOTE TEDIT.PROPS)
		      PROPS)                                 (* Put the props on the window for others ...
							     **this should go**)
          (WINDOWPROP WINDOW (QUOTE BUTTONEVENTFN)
		      (QUOTE \TEDIT.BUTTONEVENTFN))          (* Set the window up with the right mouse interfaces for
							     TEDIT.)
          (WINDOWPROP WINDOW (QUOTE RIGHTBUTTONFN)
		      (QUOTE \TEDIT.BUTTONEVENTFN))
          (WINDOWADDPROP WINDOW (QUOTE RESHAPEFN)
			 (QUOTE \TEDIT.RESHAPEFN))
          (WINDOWADDPROP WINDOW (QUOTE NEWREGIONFN)
			 (QUOTE \TEDIT.NEWREGIONFN))
          (OR (WINDOWPROP WINDOW (QUOTE SCROLLFN))
	      (WINDOWPROP WINDOW (QUOTE SCROLLFN)
			  (QUOTE \TEDIT.SCROLLFN)))
          (WINDOWPROP WINDOW (QUOTE REPAINTFN)
		      (QUOTE \TEDIT.REPAINTFN))
          [OR (WINDOWPROP WINDOW (QUOTE TEDIT.TITLEMENUFN))
	      (WINDOWPROP WINDOW (QUOTE TEDIT.TITLEMENUFN)
			  (OR (LISTGET PROPS (QUOTE TITLEMENUFN))
			      (QUOTE TEDIT.DEFAULT.MENUFN]
          (WINDOWADDPROP WINDOW (QUOTE CLOSEFN)
			 (QUOTE TEDIT.DEACTIVATE.WINDOW))
          (WINDOWPROP WINDOW (QUOTE WINDOWENTRYFN)
		      (QUOTE \TEDIT.PROCIDLEFN))
          (OR (WINDOWPROP WINDOW (QUOTE SHRINKFN))
	      (WINDOWPROP WINDOW (QUOTE SHRINKFN)
			  (FUNCTION \TEDIT.SHRINK.ICONCREATE)))
                                                             (* ONLY CREATE ICONS IF NOBODY ELSE IS INTERESTED IN 
							     IT.)
          (WINDOWADDPROP WINDOW (QUOTE SHRINKFN)
			 (QUOTE \TEDIT.SHRINKFN))
          (WINDOWADDPROP WINDOW (QUOTE EXPANDFN)
			 (QUOTE \TEDIT.EXPANDFN))
          (WINDOWPROP WINDOW (QUOTE TEXTSTREAM)
		      TEXTSTREAM)                            (* Save the text stream for the user to get at via the 
							     window.)
          (WINDOWPROP WINDOW (QUOTE TEXTOBJ)
		      TEXTOBJ)                               (* Give a handle on the TEXTOBJ for the text being 
							     edited.)
          (WINDOWPROP WINDOW (QUOTE TEDIT.CURSORREGION)
		      (LIST 0 0 0 0))                        (* Used by CursorMovedFn)
          (WINDOWPROP WINDOW (QUOTE CURSORMOVEDFN)
		      (QUOTE TEDIT.CURSORMOVEDFN))
          (WINDOWPROP WINDOW (QUOTE CURSOROUTFN)
		      (QUOTE TEDIT.CURSOROUTFN))
          (\TEDIT.WINDOW.TITLE TEXTOBJ (\TEDIT.ORIGINAL.WINDOW.TITLE WINDOW))
          [SETQ DS (replace DS of TEXTOBJ with (WINDOWPROP WINDOW (QUOTE DSP]
          (DSPRIGHTMARGIN 32767 DS)                          (* So we don't get spurious RETURNs printed out by the 
							     system)
          (replace \WINDOW of TEXTOBJ with WINDOW)
          (COND
	    ((AND (NOT (LISTGET PROPS (QUOTE READONLY)))
		  [NOT (replace PROMPTWINDOW of TEXTOBJ with (LISTGET PROPS (QUOTE PROMPTWINDOW]
		  (NOT (fetch MENUFLG of TEXTOBJ)))          (* The window is read-write, so give it a feedback 
							     region)
	      (SETQ TEDITPROMPTWINDOW (GETPROMPTWINDOW WINDOW 1 TEDIT.PROMPT.FONT))
	      (replace PROMPTWINDOW of TEXTOBJ with TEDITPROMPTWINDOW)
	      (WINDOWPROP TEDITPROMPTWINDOW (QUOTE TEDIT.PROMPTWINDOW)
			  T)))
          (AND (fetch PROMPTWINDOW of TEXTOBJ)
	       (CLEARW (fetch PROMPTWINDOW of TEXTOBJ)))
          [replace LINECACHE of TEXTOBJ with (CAR (replace LINECACHES of TEXTOBJ with (
\TEDIT.CREATE.LINECACHE 2]                                   (* CACHE for screen updates)
          (replace DISPLAYCACHE of TEXTOBJ with (CAR (\TEDIT.CREATE.LINECACHE 1)))
                                                             (* and a CACHE for creating line images for display)
          [replace DISPLAYCACHEDS of TEXTOBJ with (DSPCREATE (fetch LCBITMAP
								of (fetch DISPLAYCACHE of TEXTOBJ]
          [COND
	    ((SETQ PROP (LISTGET PROPS (QUOTE REGION)))      (* The caller wants to set a region.
							     Use his)
	      (replace WTOP of TEXTOBJ with (fetch TOP of PROP))
	      (replace WRIGHT of TEXTOBJ with (fetch RIGHT of PROP))
	      (replace WBOTTOM of TEXTOBJ with (fetch BOTTOM of PROP))
	      (replace WLEFT of TEXTOBJ with (fetch LEFT of PROP)))
	    (T                                               (* Otherwise, default to the whole window)
	       (replace WLEFT of TEXTOBJ with 0)
	       (replace WBOTTOM of TEXTOBJ with 0)
	       (replace WTOP of TEXTOBJ with (fetch HEIGHT of (DSPCLIPPINGREGION NIL DS)))
	       (replace WRIGHT of TEXTOBJ with (fetch WIDTH of (DSPCLIPPINGREGION NIL DS]
          (WINDOWPROP WINDOW (QUOTE LINES)
		      (replace LINES of TEXTOBJ with (\SHOWTEXT TEXTOBJ)))
                                                             (* Display the text in the window, for later use.)
          (AND (SETQ PROP (LISTGET PROPS (QUOTE QUITFN)))
	       (WINDOWPROP WINDOW (QUOTE TEDIT.QUITFN)
			   PROP))                            (* What to do when user QUITs)
          (AND (SETQ PROP (LISTGET PROPS (QUOTE AFTERQUITFN)))
	       (WINDOWPROP WINDOW (QUOTE TEDIT.AFTERQUITFN)
			   PROP))                            (* What to do after the QUIT takes effect)
          (AND (SETQ PROP (LISTGET PROPS (QUOTE LOOPFN)))
	       (WINDOWPROP WINDOW (QUOTE TEDIT.CMD.LOOPFN)
			   PROP))                            (* FN to execute each time thru command loop)
          (AND (SETQ PROP (LISTGET PROPS (QUOTE CHARFN)))
	       (WINDOWPROP WINDOW (QUOTE TEDIT.CMD.CHARFN)
			   PROP))                            (* FN to execute per character typed.)
          (AND (SETQ PROP (LISTGET PROPS (QUOTE SELFN)))
	       (WINDOWPROP WINDOW (QUOTE TEDIT.CMD.SELFN)
			   PROP))                            (* FN to execute per selection made.)
          (SETQ PROP (LISTGET PROPS (QUOTE MENU)))           (* The Command menu, or list of items for it)
          (COND
	    ((type? MENU PROP)                               (* It's a menu. just use it.)
	      (WINDOWPROP WINDOW (QUOTE TEDIT.MENU)
			  PROP))
	    (PROP                                            (* It's a list of menu items.
							     Force a new menu on next middle button.)
		  (WINDOWPROP WINDOW (QUOTE TEDIT.MENU.COMMANDS)
			      PROP)
		  (WINDOWPROP WINDOW (QUOTE TEDIT.MENU)
			      NIL)))
          (\FIXSEL SEL TEXTOBJ)
          (TEDIT.NORMALIZECARET TEXTOBJ SEL)
          (\SHOWSEL SEL NIL T)
          (\TEDIT.SET.WINDOW.EXTENT TEXTOBJ WINDOW)
          (\COPYSEL SEL TEDIT.SELECTION])

(\TEDIT.WINDOW.TITLE
  [LAMBDA (TEXTSTREAM NEW.TITLE)                             (* gbn " 7-May-84 22:09")
    (PROG ((TEXTSTREAM (TEXTOBJ TEXTSTREAM))
	   W)
          (RETURN (if (SETQ W (\TEDIT.MAINW TEXTSTREAM))
		      then (if NEW.TITLE
			       then (WINDOWPROP W (QUOTE TITLE)
						NEW.TITLE)
			     else (WINDOWPROP W (QUOTE TITLE])

(\SAFE.FIRST
  [LAMBDA (LIST.OR.ATOM)                                     (* gbn "18-Apr-84 21:13")
                                                             (* gives the first element whether the arg is a list or 
							     an atom. Should be a macro eventually)
    (SELECTQ (TYPENAME LIST.OR.ATOM)
	     (LISTP (CAR LIST.OR.ATOM))
	     LIST.OR.ATOM])
)
(RPAQ BXCARET (CURSORCREATE (READBITMAP) 4 7))
(16 16
"@@@@"
"@@@@"
"@@@@"
"@@@@"
"@@@@"
"@@@@"
"@@@@"
"A@@@"
"CH@@"
"GL@@"
"FL@@"
"LF@@"
"@@@@"
"@@@@"
"@@@@"
"@@@@")(RPAQ BXHICARET (CURSORCREATE (READBITMAP) 4 7))
(16 16
"A@@@"
"A@@@"
"A@@@"
"A@@@"
"A@@@"
"A@@@"
"A@@@"
"A@@@"
"CH@@"
"GL@@"
"FL@@"
"LF@@"
"HB@@"
"@@@@"
"@@@@"
"@@@@")(RPAQ TEDIT.LINECURSOR (CURSORCREATE (READBITMAP) 15 15))
(16 16
"@@@A"
"@@@C"
"@@@G"
"@@@O"
"@@AO"
"@@CO"
"@@GO"
"@@@O"
"@@AK"
"@@AI"
"@@C@"
"@@C@"
"@@F@"
"@@F@"
"@@L@"
"@@L@")
(RPAQ? TEDIT.DEFAULT.WINDOW NIL)

(RPAQ? TEDIT.PROMPT.FONT (FONTCREATE 'GACHA 10))
(DECLARE: DOEVAL@COMPILE DONTCOPY

(ADDTOVAR GLOBALVARS TEDIT.DEFAULT.WINDOW TEDIT.PROMPT.FONT)
)



(* Screen updating utilities)

(DEFINEQ

(TEDIT.DEACTIVATE.WINDOW
  [LAMBDA (W FORCEFLG)                                       (* jds "15-May-84 11:28")
                                                             (* Deactivate the various button fns for this window)
    (PROG [(TEXTOBJ (WINDOWPROP W (QUOTE TEXTOBJ]            (* Can't be a call to TEXTOBJ, since window may NOT have
							     a textobj on it.)
          [COND
	    ((AND TEXTOBJ (PROCESSP (WINDOWPROP W (QUOTE PROCESS)))
		  (NOT (fetch EDITFINISHEDFLG of TEXTOBJ))
		  (NOT (fetch TXTREADONLY of TEXTOBJ))
		  (NOT FORCEFLG))
	      (\TEDIT.QUIT W)
	      (OR (fetch EDITFINISHEDFLG of TEXTOBJ)
		  (RETURN (QUOTE DON'T]
          (COND
	    ([AND TEXTOBJ (OR FORCEFLG (fetch EDITFINISHEDFLG of TEXTOBJ)
			      (NOT (PROCESSP (WINDOWPROP W (QUOTE PROCESS]
                                                             (* Only do this if it's a TEdit window, and has been 
							     QUIT out of.)
	      (COND
		((\TEDIT.WINDOW.TITLE TEXTOBJ)
		  (\TEDIT.WINDOW.TITLE TEXTOBJ "Edit Window [Inactive]")))
                                                             (* Reset the window's title to a known "inactive" value)
	      (WINDOWPROP W (QUOTE TEXTOBJ)
			  NIL)                               (* Detach the edit data structures from the window)
	      (WINDOWPROP W (QUOTE TEXTSTREAM)
			  NIL)
	      (WINDOWPROP W (QUOTE LINES)
			  NIL)
	      (WINDOWPROP W (QUOTE THISLINE)
			  NIL)
	      (WINDOWPROP W (QUOTE PROCESS.EXITFN)
			  NIL)
	      (WINDOWPROP W (QUOTE PROCESS.IDLEFN)
			  NIL)
	      (WINDOWPROP W (QUOTE CURSOROUTFN)
			  NIL)
	      (WINDOWPROP W (QUOTE CURSORMOVEDFN)
			  NIL)
	      (WINDOWPROP W (QUOTE BUTTONEVENTFN)
			  (QUOTE TOTOPW))                    (* And the button functions)
	      (WINDOWPROP W (QUOTE RIGHTBUTTONFN)
			  (QUOTE DOWINDOWCOM))
	      (WINDOWPROP W (QUOTE SCROLLFN)
			  NIL)
	      (WINDOWDELPROP W (QUOTE RESHAPEFN)
			     (QUOTE \EDITRESHAPEFN))
	      (\TEDIT.INTERRUPT.SETUP W T)                   (* Make sure any disarmed interrupts are restored.)
	      (for MENUW in (ATTACHEDWINDOWS W) when (WINDOWPROP MENUW (QUOTE TEDITMENU))
		 do                                          (* Detach all the TEDITMENU windows that belong to this 
							     window.)
		    (GIVE.TTY.PROCESS MENUW)
		    (DISMISS 20))
	      [replace \WINDOW of TEXTOBJ with (COND
						 ((LISTP (fetch \WINDOW of TEXTOBJ))
                                                             (* It's a list; remove this window)
						   (DREMOVE W (fetch \WINDOW of TEXTOBJ]
                                                             (* Disconnect the window from the edit data structures 
							     as well.)
	      ])

(\TEDIT.REPAINTFN
  [LAMBDA (W)                                                (* jds "20-Jan-84 13:06")
                                                             (* Redisplay the proper text in the window.)
    (PROG ((LINES (WINDOWPROP W (QUOTE LINES)))
	   (TEXTOBJ (WINDOWPROP W (QUOTE TEXTOBJ)))
	   WHEIGHT SEL)
          (SETQ WHEIGHT (fetch HEIGHT of (DSPCLIPPINGREGION NIL W)))
          (SETQ SEL (fetch SEL of TEXTOBJ))
          (AND (fetch SET of SEL)
	       (\SHOWSEL SEL NIL NIL))                       (* Turn off the selection, ifn there was one.)
          (DSPFILL NIL WHITESHADE (QUOTE REPLACE)
		   W)
          (bind (LINE ← LINES) while (AND LINE (IGREATERP (fetch YBOT of LINE)
							  0))
	     do (COND
		  ((ILESSP (fetch YBOT of LINE)
			   WHEIGHT)
		    (\DISPLAYLINE TEXTOBJ LINE W)))
		(SETQ LINE (fetch NEXTLINE of LINE)))
          (AND (fetch SET of SEL)
	       (\SHOWSEL SEL NIL T])

(\TEDIT.RESHAPEFN
  [LAMBDA (W BITS OLDREGION LEFT BOTTOM WIDTH HEIGHT)        (* jds " 7-Mar-84 15:56")
                                                             (* Will eventually do the right thing w/r/t text 
							     margins. For now, it's a place holder.)
    (PROG ((TEXTOBJ (WINDOWPROP W (QUOTE TEXTOBJ)))
	   (TEXTSTREAM (WINDOWPROP W (QUOTE TEXTSTREAM)))
	   [NEWWHEIGHT (OR HEIGHT (fetch HEIGHT of (DSPCLIPPINGREGION NIL W]
	   [NEWWWIDTH (OR WIDTH (fetch WIDTH of (DSPCLIPPINGREGION NIL W]
	   (NEWLEFT (OR LEFT 0))
	   (NEWBOTTOM (OR BOTTOM 0))
	   (CH# 0)
	   WHEIGHT FIRSTCH# LINES LINE WWIDTH)
          (OR TEXTOBJ (RETURN))                              (* If this window has no TEXTOBJ on it yet, just leave.)
          (\SHOWSEL (fetch SEL of TEXTOBJ)
		    NIL NIL)                                 (* Turn off the selection while we make changes)
          (SETQ WHEIGHT (fetch HEIGHT of OLDREGION))         (* Old window height)
          (replace WTOP of TEXTOBJ with NEWWHEIGHT)          (* Save new height/width for later use)
          (replace WRIGHT of TEXTOBJ with NEWWWIDTH)
          (replace WBOTTOM of TEXTOBJ with NEWBOTTOM)
          (replace WLEFT of TEXTOBJ with NEWLEFT)
          (OR (SETQ LINES (WINDOWPROP W (QUOTE LINES)))
	      (RETURN))                                      (* If no text has been displayed yet, just leave)
          (SETQ LINE LINES)
          (while LINE
	     do 

          (* Now hunt for the first line that had been visible, so we can find the CH# that has to appear at the top of the 
	  window.)


		(COND
		  ((ILESSP (fetch YBOT of LINE)
			   WHEIGHT)                          (* This line was visible)
		    (SETQ FIRSTCH# (fetch CHAR1 of LINE))    (* Note its first character #)
		    (RETURN))
		  (T (replace YBOT of LINE with NEWWHEIGHT)))
		(SETQ LINE (fetch NEXTLINE of LINE)))
          (AND FIRSTCH# (SETQ LINE (\TEDIT.FIND.FIRST.LINE TEXTOBJ NEWWHEIGHT FIRSTCH# W)))
          (COND
	    ((NEQ LINE LINES)
	      (replace NEXTLINE of LINES with LINE)))        (* Forget the old chain of line descriptors)
          (COND
	    (LINE                                            (* You can only do this if there IS text on the screen 
							     to start with.)
		  (replace YBOT of LINE with (IDIFFERENCE NEWWHEIGHT (fetch LHEIGHT of LINE)))
                                                             (* Fix the line to appear at the top of the window)
		  (replace YBASE of LINE with (IPLUS (fetch YBOT of LINE)
						     (fetch DESCENT of LINE)))
		  (\DISPLAYLINE TEXTOBJ LINE W)              (* Actually display it)
		  (\FILLWINDOW (fetch YBOT of LINE)
			       LINE TEXTOBJ NIL W)           (* Fill out the window with more lines, to fill or to 
							     EOF)
		  ))
          (\FIXSEL (fetch SEL of TEXTOBJ)
		   TEXTOBJ)                                  (* Fix up the selection to account for the line 
							     shuffling)
          (\SHOWSEL (fetch SEL of TEXTOBJ)
		    NIL T)                                   (* And highlight it)
      ])

(\TEDIT.SET.WINDOW.TITLE
  [LAMBDA (TEXTOBJ)                                          (* jds "21-Feb-84 14:21")
                                                             (* Given a text obj, create a title for the window in 
							     it.)
                                                             (* If the window has a fixed title, use it;
							     otherwise, derive a title from the name of the file 
							     being edited.)
    (OR (fetch WINDOWTITLE of TEXTOBJ)
	(\TEDIT.WINDOW.TITLE (fetch TXTFILE of TEXTOBJ])

(\TEDIT.SCROLLFN
  [LAMBDA (W DX DY)                                          (* jds "24-May-84 17:08")
                                                             (* Handle scrolling of the edit window)
    (PROG (WHEIGHT (TEXTOBJ (WINDOWPROP W (QUOTE TEXTOBJ)))
		   (PRIORCR 0)
		   SELWASON SHIFTEDSELWASON MOVESELWASON DELETESELWASON (WREG (DSPCLIPPINGREGION
										NIL W))
		   LINES TRUEY TRUEX WWIDTH SEL (PREVLINE NIL)
		   (PRESCROLLFN (WINDOWPROP W (QUOTE TEDIT.PRESCROLLFN)))
		   (POSTSCROLLFN (WINDOWPROP W (QUOTE TEDIT.POSTSCROLLFN)))
		   TEXTLEN THEIGHT TOPLINE RHEIGHT LOWESTY YBOT LINE CH# CHNO CH)
          (COND
	    ((ZEROP (SETQ TEXTLEN (fetch TEXTLEN of TEXTOBJ)))
                                                             (* Don't scroll a zero-length file)
	      (RETURN))
	    ((fetch EDITOPACTIVE of TEXTOBJ)                 (* Don't scroll while something interesting is 
							     happening!)
	      (TEDIT.PROMPTPRINT TEXTOBJ "Edit operation in progress." T)
	      (RETURN)))                                     (* Displaystream for the window)
          (SETQ WHEIGHT (fetch HEIGHT of WREG))              (* Height of the window)
          (SETQ LOWESTY WHEIGHT)                             (* Lowest Y of a line-bottom yet seet)
          (SETQ WWIDTH (fetch WIDTH of WREG))                (* Width of the window)
          (SETQ LINES (WINDOWPROP W (QUOTE LINES)))          (* List of formatted lines)
          (AND PRESCROLLFN (DOUSERFNS PRESCROLLFN W))        (* If there's a pre-scroll fn, execute it now.)
          (COND
	    ((fetch SET of (SETQ SEL (fetch SEL of TEXTOBJ)))
                                                             (* Turn off the selection during the scroll.)
	      (SETQ SELWASON (fetch ONFLG of SEL))
	      (\SHOWSEL SEL NIL NIL)))
          (SETQ SHIFTEDSELWASON (fetch ONFLG of (fetch SHIFTEDSEL of TEXTOBJ)))
          (\SHOWSEL (fetch SHIFTEDSEL of TEXTOBJ)
		    NIL NIL)
          (SETQ MOVESELWASON (fetch ONFLG of (fetch MOVESEL of TEXTOBJ)))
          (\SHOWSEL (fetch MOVESEL of TEXTOBJ)
		    NIL NIL)
          (SETQ DELETESELWASON (fetch ONFLG of (fetch DELETESEL of TEXTOBJ)))
          (\SHOWSEL (fetch DELETESEL of TEXTOBJ)
		    NIL NIL)
          (COND
	    [(AND (FIXP DY)
		  (NOT (ZEROP DY)))                          (* Regular up/down scrolling)
	      (SETQ TRUEY (IDIFFERENCE WHEIGHT (IABS DY)))
	      (COND
		[(ILESSP 0 DY)                               (* Scroll text up)
		  (SETQ LINE LINES)
		  (while (AND LINE (IGEQ (fetch YBOT of LINE)
					 WHEIGHT))
		     do (SETQ LINE (fetch NEXTLINE of LINE)))
		  (first [COND
			   ((AND LINE (ILESSP (fetch YBOT of LINE)
					      TRUEY))        (* Make sure we scroll up at least one line.)
			     (replace YBASE of LINE with (IPLUS (fetch DESCENT of LINE)
								(replace YBOT of LINE with WHEIGHT)))
			     (SETQ LINE (fetch NEXTLINE of LINE]
		     while LINE
		     do                                      (* Find the line whose top is to move to the top of the 
							     window)
			[COND
			  ((ILESSP (fetch YBOT of LINE)
				   TRUEY)
			    (RETURN))
			  (T (replace YBASE of LINE with (IPLUS (fetch DESCENT of LINE)
								(replace YBOT of LINE with WHEIGHT]
			(SETQ PREVLINE LINE)
			(SETQ LINE (fetch NEXTLINE of LINE)))
		  [COND
		    (LINE                                    (* There is a line to go to the top)
			  (SETQ RHEIGHT (IPLUS (fetch YBASE of LINE)
					       (fetch ASCENT of LINE)))
                                                             (* Find the Ypos of the top of the line's image)
			  (BITBLT W 0 0 W 0 (IDIFFERENCE WHEIGHT RHEIGHT)
				  WWIDTH RHEIGHT (QUOTE INPUT)
				  (QUOTE REPLACE))
			  (BITBLT NIL 0 0 W 0 0 WWIDTH (IDIFFERENCE WHEIGHT RHEIGHT)
				  (QUOTE TEXTURE)
				  (QUOTE REPLACE)
				  WHITESHADE)
			  [bind NL (PL ← PREVLINE) for I from 1 to 50 while PL
			     do                              (* Let him keep 50 lines above what he can see on the 
							     screen)
				(SETQ PL (fetch PREVLINE of PL))
			     finally (COND
				       ((AND PL (NEQ PL LINES))
                                                             (* There were more than 50 lines 
							     (and we aren't pointing at the root), so lop the spare 
							     ones off.)
					 (SETQ NL (fetch NEXTLINE of LINES))
					 (UNINTERRUPTABLY
                                             (replace NEXTLINE of LINES with PL)
					     (replace PREVLINE of PL with LINES))
					 (bind NNL while (AND NL (NEQ NL PL))
					    do (SETQ NNL NL)
					       (SETQ NL (fetch NEXTLINE of NL))
					       (replace NEXTLINE of NNL with NIL]
			  (while (AND LINE (IGREATERP (fetch YBOT of LINE)
						      (fetch WBOTTOM of TEXTOBJ)))
			     do                              (* Update the bottom and baseline)
				(replace YBOT of LINE with (IPLUS (fetch YBOT of LINE)
								  (IDIFFERENCE WHEIGHT RHEIGHT)))
				(replace YBASE of LINE with (IPLUS (fetch YBOT of LINE)
								   (fetch DESCENT of LINE)))
				(SETQ PREVLINE LINE)
				(SETQ LINE (fetch NEXTLINE of LINE]
		  (COND
		    ((AND LINE (IGREATERP (fetch YBOT of LINE)
					  (fetch WBOTTOM of TEXTOBJ)))
                                                             (* Fill the rest of the window)
		      (\FILLWINDOW (fetch YBOT of LINE)
				   LINE TEXTOBJ NIL W))
		    (PREVLINE (\FILLWINDOW (fetch YBOT of PREVLINE)
					   PREVLINE TEXTOBJ NIL W]
		(T                                           (* Scroll text down in window, adding lines at top to 
							     fill.)
		   (SETQ PREVLINE (SETQ TOPLINE LINES))      (* Find the top line on the screen:)
		   [while TOPLINE do (COND
				       ((ILESSP (fetch YBOT of TOPLINE)
						WHEIGHT)
					 (RETURN))
				       (T (SETQ PREVLINE TOPLINE)
					  (SETQ TOPLINE (fetch NEXTLINE of TOPLINE]
		   [COND
		     ((EQ PREVLINE LINES)                    (* There's nothing between us and start of file that's 
							     formatted; start by making some.)
		       (SETQ PREVLINE (\BACKFORMAT LINES TEXTOBJ]
		   (SETQ THEIGHT 0)
		   [while (AND (ILESSP THEIGHT (IABS DY))
			       (IGEQ (fetch CHAR1 of PREVLINE)
				     1))
		      do                                     (* Starting with PREVLINE, accumulate LHEIGHTs until we 
							     hit top of text or have accumulated enough lines to fill
							     the screen)
			 (add THEIGHT (fetch LHEIGHT of PREVLINE))
			 (SETQ PREVLINE (fetch PREVLINE of PREVLINE))
			 (COND
			   ((ILESSP (fetch CHAR1 of PREVLINE)
				    1)                       (* We need to format some lines above where we are -- go
							     do it.)
			     (SETQ PREVLINE (\BACKFORMAT LINES TEXTOBJ]
		   [COND
		     ((ILESSP (IABS DY)
			      THEIGHT)                       (* BACK UP ONE LINE TO GET TO THE ONE WHICH PUSHED US 
							     OVER TOP)
		       (SETQ PREVLINE (fetch NEXTLINE of PREVLINE))
		       (SETQ THEIGHT (IDIFFERENCE THEIGHT (fetch LHEIGHT of PREVLINE]
		   (SETQ PREVLINE (fetch NEXTLINE of PREVLINE))
                                                             (* Move to the first line to be formatted.-)
		   (BITBLT W 0 THEIGHT W 0 0 WWIDTH (IDIFFERENCE WHEIGHT THEIGHT)
			   (QUOTE INPUT)
			   (QUOTE REPLACE))
		   (BITBLT NIL 0 0 W 0 (IDIFFERENCE WHEIGHT THEIGHT)
			   WWIDTH THEIGHT (QUOTE TEXTURE)
			   (QUOTE REPLACE)
			   WHITESHADE)
		   (bind (LINE ← TOPLINE) while LINE
		      do (COND
			   ((IGREATERP (fetch YBOT of LINE)
				       (IPLUS (fetch WBOTTOM of TEXTOBJ)
					      THEIGHT))      (* This line will be on screen.
							     Adjust its YBOT/YBASE)
			     (replace YBOT of LINE with (IDIFFERENCE (fetch YBOT of LINE)
								     THEIGHT))
			     (replace YBASE of LINE with (IDIFFERENCE (fetch YBASE of LINE)
								      THEIGHT))
			     (SETQ LOWESTY (fetch YBOT of LINE)))
			   (T (replace YBOT of LINE with 0)
			      (replace NEXTLINE of (fetch PREVLINE of LINE) with NIL)
			      (SETQ LINE (fetch PREVLINE of LINE))
			      (RETURN)))
			 (SETQ LINE (fetch NEXTLINE of LINE)) 
                                                             (* Clear anything below us))
		   (BITBLT NIL 0 0 W 0 0 WWIDTH LOWESTY (QUOTE TEXTURE)
			   (QUOTE REPLACE)
			   WHITESHADE)
		   (SETQ YBOT WHEIGHT)
		   (while (AND PREVLINE (NEQ PREVLINE TOPLINE))
		      do                                     (* Move down lines to be added, adjusting YBOT/YBASE and
							     DISPALYLINE-ing them, until the next line to do EQ 
							     TOPLINE)
			 [replace YBOT of PREVLINE with (SETQ YBOT (IDIFFERENCE YBOT
										(fetch LHEIGHT
										   of PREVLINE]
			 (replace YBASE of PREVLINE with (IPLUS (fetch YBOT of PREVLINE)
								(fetch DESCENT of PREVLINE)))
			 (\DISPLAYLINE TEXTOBJ PREVLINE W)
			 (SETQ PREVLINE (fetch NEXTLINE of PREVLINE]
	    ((FLOATP DY)                                     (* Do a thumbing-type scroll)
	      (SETQ CH# (IMAX (IMIN (SUB1 TEXTLEN)
				    (FIXR (FTIMES TEXTLEN DY)))
			      1))
	      (SETQ LINE (fetch NEXTLINE of LINES))
	      [while (AND LINE (ILESSP (fetch CHARLIM of LINE)
				       CH#))
		 do (SETQ LINE (fetch NEXTLINE of LINE))
		 finally (COND
			   ((AND LINE (IGREATERP (fetch CHAR1 of LINE)
						 CH#))
			     (SETQ LINE NIL]                 (* find out if any line currently formatted includes the
							     target char)
	      (COND
		((AND LINE (fetch NEXTLINE of LINE))         (* If so, let's do this as a fast scroll, rather than a 
							     complete repaint of the screen)
		  [SETQ DY (COND
		      [(EQUAL WHEIGHT (fetch YBOT of LINE))
                                                             (* this line is off the top of the window)
			(IMINUS (for (DESCENDLINE ←(fetch NEXTLINE of LINE))
				   by (fetch NEXTLINE of DESCENDLINE)
				   while (AND DESCENDLINE (EQ (fetch YBOT of DESCENDLINE)
							      WHEIGHT))
				   sum                       (* sum the heights of all the lines in between the new 
							     top line and the present top line)
				       (fetch LHEIGHT of DESCENDLINE]
		      (T (IDIFFERENCE (IDIFFERENCE WHEIGHT (fetch YBOT of LINE))
				      (fetch LHEIGHT of LINE]
		  (\TEDIT.SCROLLFN W 0 DY)                   (* recurse telling to normally scroll instead of thumb 
							     scroll so that the screen is not blanked and reformatted
							     unnecessarily)
		  )
		(T (AND (fetch L1 of SEL)
			(replace YBOT of (fetch L1 of SEL) with 0))
                                                             (* Make sure it thinks the old selection is off-screen 
							     for now)
		   (AND (fetch LN of SEL)
			(replace YBOT of (fetch LN of SEL) with 0))
		   (BITBLT NIL 0 0 W 0 0 WWIDTH WHEIGHT (QUOTE TEXTURE)
			   (QUOTE REPLACE)
			   WHITESHADE)
		   (SETQ LINE (\TEDIT.FIND.FIRST.LINE TEXTOBJ WHEIGHT CH# W))
                                                             (* Find the first line to go in the window)
		   (replace YBOT of LINE with (IDIFFERENCE WHEIGHT (fetch LHEIGHT of LINE)))
                                                             (* Set it up as the top line.)
		   (replace YBASE of LINE with (IPLUS (fetch YBOT of LINE)
						      (fetch DESCENT of LINE)))
		   (\DISPLAYLINE TEXTOBJ LINE W)
		   (\FILLWINDOW (fetch YBOT of LINE)
				LINE TEXTOBJ NIL W)))        (* And fill out the window from there.)
	      ))
          (AND POSTSCROLLFN (DOUSERFNS POSTSCROLLFN W))      (* For user subsystem cleanup)
          [COND
	    ((fetch SET of SEL)
	      (\FIXSEL SEL TEXTOBJ)
	      (AND SELWASON (\SHOWSEL SEL NIL T]
          [COND
	    ((fetch SET of (fetch SHIFTEDSEL of TEXTOBJ))
	      (\FIXSEL (fetch SHIFTEDSEL of TEXTOBJ)
		       TEXTOBJ)
	      (AND SHIFTEDSELWASON (\SHOWSEL (fetch SHIFTEDSEL of TEXTOBJ)
					     NIL T]
          [COND
	    ((fetch SET of (fetch MOVESEL of TEXTOBJ))
	      (\FIXSEL (fetch MOVESEL of TEXTOBJ)
		       TEXTOBJ)
	      (AND MOVESELWASON (\SHOWSEL (fetch MOVESEL of TEXTOBJ)
					  NIL T]
          [COND
	    ((fetch SET of (fetch DELETESEL of TEXTOBJ))
	      (\FIXSEL (fetch DELETESEL of TEXTOBJ)
		       TEXTOBJ)
	      (AND DELETESELWASON (\SHOWSEL (fetch DELETESEL of TEXTOBJ)
					    NIL T]
          (\TEDIT.SET.WINDOW.EXTENT TEXTOBJ W])
)



(* Process-world interfaces)

(DEFINEQ

(\TEDIT.PROCIDLEFN
  [LAMBDA (WINDOW)                                           (* jds "20-Apr-84 20:52")
                                                             (* TEDIT's PROC.IDLEFN for regaining control.
							     If the shift key is down, we're not trying to restart 
							     this window, just to copy from it.)
    (GETMOUSESTATE)
    (COND
      [[AND (INSIDE? (DSPCLIPPINGREGION NIL WINDOW)
		     (LASTMOUSEX WINDOW)
		     (LASTMOUSEY WINDOW))
	    [NOT (OR (KEYDOWNP (QUOTE LSHIFT))
		     (KEYDOWNP (QUOTE RSHIFT))
		     (KEYDOWNP (QUOTE COPY))
		     (KEYDOWNP (QUOTE MOVE]
	    (PROCESSP (WINDOWPROP WINDOW (QUOTE PROCESS]     (* No SHIFT key down; let's regain control.)
	(TTY.PROCESS (WINDOWPROP WINDOW (QUOTE PROCESS)))
	(COND
	  ((fetch MENUFLG of (WINDOWPROP (WHICHW)
					 (QUOTE TEXTOBJ)))   (* This is a MENU -- always select.)
	    (\TEDIT.BUTTONEVENTFN WINDOW]
      (T                                                     (* Otherwise, let him select.)
	 (\TEDIT.BUTTONEVENTFN WINDOW])

(\TEDIT.PROCENTRYFN
  [LAMBDA (NEWPROCESS OLDPROCESS)                            (* jds "15-Feb-84 16:59")
                                                             (* TEDIT's PROCESS.ENTRYFN, which disarms any dangerous 
							     interrupts within the editing world)
    (\TEDIT.INTERRUPT.SETUP NEWPROCESS])

(\TEDIT.PROCEXITFN
  [LAMBDA (THISP NEWP)                                       (* jds " 5-Apr-84 10:40")
                                                             (* Re-arm any interrupts that TEdit turned off, so the 
							     poor user has them available in other parts of the 
							     system.)
    (AND (WINDOWPROP (PROCESSPROP THISP (QUOTE WINDOW))
		     (QUOTE TEXTOBJ))
	 (\TEDIT.INTERRUPT.SETUP THISP T])
)

(RPAQ? \CARETRATE 333)



(* Caret handler; stolen from CHAT.)

(DEFINEQ

(\EDIT.DOWNCARET
  [LAMBDA (CARET)                                            (* jds "20-Apr-84 21:50")
                                                             (* Put the caret down -- i.e., MAKE IT VISIBLE -- as 
							     fast as possible)
    (AND (fetch TCUP of CARET)
	 (\EDIT.FLIPCARET CARET T))                          (* CARET:FORCEDDOWN is set so that caret will come up 
							     quickly.)
    (replace TCFORCEDDOWN of CARET with T])

(\EDIT.FLIPCARET
  [LAMBDA (CARET FORCE)                                      (* jds "10-Apr-84 15:15")
                                                             (* changes the caret from on to off or off to on.)
    (COND
      ([OR FORCE (fetch TCFORCEDDOWN of CARET)
	   (AND (IGREATERP (CLOCK0 (fetch TCNOWTIME of CARET))
			   (fetch TCTHENTIME of CARET))
		(NOT (fetch TCFORCEUP of CARET]
	(UNINTERRUPTABLY                                     (* note the time of the next change.)
                                                             (* must be done without creating boxes because happens 
							     during keyboard wait.)
	    (\BOXIPLUS (CLOCK0 (fetch TCTHENTIME of CARET))
		       (fetch TCCARETRATE of CARET))
	    (replace TCUP of CARET with (NOT (fetch TCUP of CARET)))
                                                             (* CARET:DOWN indicates whether caret is on or off.
							     necessary so it can be turned off before the character 
							     is echoed)
                                                             (* CARET:FORCEDDOWN indicates that the caret was taken 
							     down so that it will go back up quickly.)
	    (replace TCFORCEDDOWN of CARET with NIL)
	    (replace TCFORCEUP of CARET with NIL)
	    (PROG ((DS (fetch TCCARETDS of CARET))
		   (CURS (fetch TCCURSORBM of CARET)))
	          [COND
		    ((fetch TCUP of CARET))
		    (T (replace TCCARETX of CARET with (DSPXPOSITION NIL DS))
		       (replace TCCARETY of CARET with (DSPYPOSITION NIL DS]
	          (BITBLT (fetch CURSORBITMAP of CURS)
			  0 0 DS (IDIFFERENCE (fetch TCCARETX of CARET)
					      (fetch CURSORHOTSPOTX of CURS))
			  (IDIFFERENCE (fetch TCCARETY of CARET)
				       (fetch CURSORHOTSPOTY of CURS))
			  CURSORWIDTH CURSORHEIGHT (QUOTE INPUT)
			  (QUOTE INVERT))))])

(TEDIT.FLASHCARET
  [LAMBDA (CARET)                                            (* jds "20-Apr-84 22:00")
                                                             (* Unless the caret is constrained to be INVISIBLE, give
							     it a chance to flash.)
    (COND
      ((NOT (fetch TCFORCEUP of CARET))                      (* The caret need not stay invisible.)
	(\EDIT.FLIPCARET CARET])

(\EDIT.UPCARET
  [LAMBDA (CARET)                                            (* jds "20-Apr-84 21:51")
                                                             (* Take the caret up -- i.e., MAKE IT INVISIBLE -- and 
							     keep it up)
    (OR (fetch TCUP of CARET)
	(\EDIT.FLIPCARET CARET T))                           (* CARET:FORCEUP is set so that caret will stay up.)
    (replace TCFORCEUP of CARET with T])

(TEDIT.NORMALIZECARET
  [LAMBDA (TEXTOBJ SEL)                                      (* jds "20-Feb-84 14:30")
                                                             (* Scroll the text window so that the caret is visible 
							     in it.)
    (SETQ TEXTOBJ (TEXTOBJ TEXTOBJ))
    (PROG ((SEL (OR SEL (fetch SEL of TEXTOBJ)))
	   WHEIGHT
	   (WINDOW (fetch SELWINDOW of TEXTOBJ))
	   WREG CH# Y LINE)                                  (* First, find where the caret is)
          (OR (fetch SET of SEL)
	      (RETURN))                                      (* If there is no selection set, don't bother.)
          (SETQ WREG (DSPCLIPPINGREGION NIL WINDOW))
          (SETQ WHEIGHT (fetch HEIGHT of WREG))
          (SELECTQ (fetch POINT of SEL)
		   (LEFT (SETQ CH# (fetch CH# of SEL))
			 (SETQ Y (fetch Y0 of SEL)))
		   (RIGHT (SETQ CH# (SUB1 (fetch CHLIM of SEL)))
			  (SETQ Y (fetch YLIM of SEL)))
		   NIL)
          (COND
	    ((OR (IGEQ Y WHEIGHT)
		 (ILEQ Y 0))                                 (* The caret is off-screen. Scroll to get it on)
	      (AND (fetch L1 of SEL)
		   (replace YBOT of (fetch L1 of SEL) with 0))
                                                             (* Make sure it thinks the old selection is off-screen 
							     for now)
	      (AND (fetch LN of SEL)
		   (replace YBOT of (fetch LN of SEL) with 0))
	      (SETQ LINE (\TEDIT.FIND.FIRST.LINE TEXTOBJ WHEIGHT (IMIN CH# (fetch TEXTLEN
									      of TEXTOBJ))
						 WINDOW))    (* Find the first line to go in the window)
	      (replace YBOT of LINE with (IDIFFERENCE WHEIGHT (fetch LHEIGHT of LINE)))
                                                             (* Set it up as the top line.)
	      (replace YBASE of LINE with (IPLUS (fetch YBOT of LINE)
						 (fetch DESCENT of LINE)))
	      (\DISPLAYLINE TEXTOBJ LINE WINDOW)
	      (\FILLWINDOW (fetch YBOT of LINE)
			   LINE TEXTOBJ NIL WINDOW)          (* And fill out the window from there.)
	      (\FIXSEL SEL TEXTOBJ)
	      (\TEDIT.SET.WINDOW.EXTENT TEXTOBJ WINDOW])

(\SETCARET
  [LAMBDA (X Y DS TEXTOBJ)                                   (* jds "27-MAY-83 13:36")
    (PROG NIL
          [COND
	    ((AND (ILESSP Y (fetch WTOP of TEXTOBJ))
		  (IGREATERP Y 0)
		  (NOT (fetch TXTREADONLY of TEXTOBJ)))
	      (MOVETO X Y DS)
	      (\EDIT.DOWNCARET (fetch CARET of TEXTOBJ]      (* Only put down the caret the line it points to is 
							     on-screen)
      ])
)
(DECLARE: EVAL@COMPILE DONTCOPY 
[DECLARE: EVAL@COMPILE 

(DATATYPE TEDITCARET (TCNOWTIME                              (* Used to hold the current time, when checking to see 
							     if a transition is due)
				TCTHENTIME                   (* Time when the next transition is to take place)
				TCFORCEDDOWN                 (* TCFORCEDOWN = T means (Make the caret visible at the 
							     next call to \EDIT.FLIPCARET.))
				TCUP                         (* TCUP = T => The caret is NOT VISIBLE.
							     Used to track the current state of the caret)
				TCCARETDS                    (* The display stream that the caret appears in)
				TCCURSORBM                   (* The CURSOR representing the caret)
				TCCARETRATE                  (* # of MSEC between caret up/down transitions)
				TCFORCEUP                    (* T => The caret is not allowed to become visible.
							     Used to keep the caret up during screen updates)
				TCCARETX                     (* X position in the window that the caret appears at)
				TCCARETY                     (* Y position in the window where the caret appears)
				)
		     TCNOWTIME ←(CREATECELL \FIXP)
		     TCTHENTIME ←(CREATECELL \FIXP)
		     TCCURSORBM ← BXCARET TCCARETRATE ← \CARETRATE TCUP ← T)
]
(/DECLAREDATATYPE (QUOTE TEDITCARET)
		  (QUOTE (POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER 
				  POINTER)))
)



(* Menu interfacing)

(DEFINEQ

(TEDIT.ADD.MENUITEM
  [LAMBDA (MENU ITEM)                                        (* jds " 9-AUG-83 09:55")
                                                             (* Adds ITEM to the MENU, and updates all the stuff.)
    (PROG (OLDITM)
          (COND
	    ((MEMBER ITEM (fetch ITEMS of MENU))             (* Do nothing--it's already in the menu)
	      )
	    ([AND (LISTP ITEM)
		  (SETQ OLDITM (SASSOC (CAR ITEM)
				       (fetch ITEMS of MENU]
                                                             (* The menu item exists. Make sure the thing behind it 
							     is right.)
	      (RPLACD OLDITM (CDR ITEM)))
	    (T                                               (* It isn't in the menu, so go ahead and add it.)
	       (replace ITEMS of MENU with (NCONC1 (fetch ITEMS of MENU)
						   ITEM))
	       (COND
		 ((EQ (fetch MENUCOLUMNS of MENU)
		      1)                                     (* If there is only one column, force a re-figuring of 
							     the number of rows)
		   (replace MENUROWS of MENU with NIL))
		 ((EQ (fetch MENUROWS of MENU)
		      1)                                     (* There's only one row, so recompute # of columns.)
		   (replace MENUCOLUMNS of MENU with NIL)))
	       (replace ITEMWIDTH of MENU with 10000)
	       (replace ITEMHEIGHT of MENU with 10000)
	       (replace IMAGE of MENU with NIL)              (* Force it to create a new menu image.)
	       (UPDATE/MENU/IMAGE MENU])

(TEDIT.DEFAULT.MENUFN
  [LAMBDA (W)                                                (* jds "21-May-84 17:01")
                                                             (* Default User Fn for editor windows--displays a menu 
							     of items & acts on the commands received.)
    (PROG ((TEXTOBJ (WINDOWPROP W (QUOTE TEXTOBJ)))
	   (WMENU (WINDOWPROP W (QUOTE TEDIT.MENU)))
	   THISMENU CH OFILE OCURSOR PCTB LINES SEL ITEM)
          (COND
	    ((EQ (fetch EDITOPACTIVE of TEXTOBJ)
		 T)
	      (TEDIT.PROMPTPRINT TEXTOBJ "Edit operation in progress; please wait." T)
	      (RETURN))
	    ((fetch EDITOPACTIVE of TEXTOBJ)
	      (TEDIT.PROMPTPRINT TEXTOBJ (CONCAT (fetch EDITOPACTIVE of TEXTOBJ)
						 " in progress; please wait.")
				 T)
	      (RETURN)))
          (SETQ PCTB (fetch PCTB of TEXTOBJ))
          (SETQ THISMENU (COND
	      (WMENU)
	      ((SETQ WMENU (WINDOWPROP W (QUOTE TEDIT.MENU.COMMANDS)))
		(PROG1 (SETQ WMENU (\TEDIT.CREATEMENU WMENU))
		       (WINDOWPROP W (QUOTE TEDIT.MENU)
				   WMENU)))
	      (TEDIT.DEFAULT.MENU)))
          (SETQ ITEM (MENU THISMENU))
          (ERSETQ (RESETLST [RESETSAVE (\TEDIT.MARKACTIVE TEXTOBJ)
				       (QUOTE (AND (\TEDIT.MARKINACTIVE OLDVALUE]
			    (replace EDITOPACTIVE of TEXTOBJ with (OR (CAR ITEM)
								      T))
                                                             (* So we ca ntell the guy WHAT op is active.)
			    (SELECTQ (CAR ITEM)
				     (Put                    (* If the guy was editing a file, make a new updated 
							     version; else, ask for a file name)
					  (TEDIT.PUT TEXTOBJ))
				     (Get                    (* Get a new file (overwriting the one being edited.))
					  (TEDIT.GET TEXTOBJ))
				     (Include                (* Insert a file where the caret is)
					      (TEDIT.INCLUDE TEXTOBJ))
				     (Quit                   (* Stop this session.)
					   (\TEDIT.QUIT W))
				     [Substitute             (* Search-and-replace)
						 (RESETLST (RESETSAVE (CURSOR WAITINGCURSOR))
							   (TEDIT.SUBSTITUTE (fetch STREAMHINT
										of TEXTOBJ]
				     (Find                   (* Case sensitive search, with * and # wildcards)
					   [SETQ OFILE (TEDIT.GETINPUT TEXTOBJ "Text to find: "
								       (WINDOWPROP W (QUOTE 
									   TEDIT.LAST.FIND.STRING))
								       (CHARCODE (EOL LF ESC]
					   [COND
					     (OFILE (SETQ SEL (fetch SEL of TEXTOBJ))
						    (\SHOWSEL SEL NIL NIL)
						    (TEDIT.PROMPTPRINT TEXTOBJ "Searching..." T)
						    (SETQ CH (TEDIT.FIND TEXTOBJ (MKSTRING OFILE)
									 NIL NIL T))
						    (COND
						      (CH    (* We found the target text.)
							  (TEDIT.PROMPTPRINT TEXTOBJ "Done.")
							  (replace CH# of SEL with (CAR CH))
                                                             (* Set up SELECTION to be the found text)
							  (replace CHLIM of SEL with (CADR CH))
							  [replace DCH of SEL
							     with (ADD1 (IDIFFERENCE (CADR CH)
										     (CAR CH]
							  (replace POINT of SEL with (QUOTE RIGHT))
							  (TEDIT.RESET.EXTEND.PENDING.DELETE SEL)
                                                             (* And never pending a deletion.)
							  (\FIXSEL SEL TEXTOBJ)
							  (TEDIT.NORMALIZECARET TEXTOBJ)
							  (\SHOWSEL SEL NIL T)
							  (WINDOWPROP W (QUOTE TEDIT.LAST.FIND.STRING)
								      OFILE)
                                                             (* And get it into the window)
							  )
						      (T (TEDIT.PROMPTPRINT TEXTOBJ "(not found)")
							 (\SHOWSEL SEL NIL T]
					   (replace \INSERTNEXTCH of TEXTOBJ with -1))
				     (Looks                  (* He wants to set the font for the current selection)
					    (\TEDIT.LOOKS TEXTOBJ))
				     (Hardcopy               (* Print this document)
					       (TEDIT.HARDCOPY TEXTOBJ))
				     (Press% File            (* Print this document)
						  (TEDIT.HCPYFILE TEXTOBJ))
				     (AND (CAR ITEM)
					  (APPLY* (CAR ITEM)
						  (fetch STREAMHINT of TEXTOBJ])

(TEDIT.REMOVE.MENUITEM
  [LAMBDA (MENU ITEM)                                        (* gbn "26-Apr-84 04:06")
    (PROG (ITEMLIST)
          [COND
	    ((OR (LITATOM ITEM)
		 (STRINGP ITEM))
	      (for X in (fetch ITEMS of MENU) do (COND
						   ((AND (LISTP X)
							 (EQUAL (CAR X)
								ITEM))
						     (RETURN (SETQ ITEM X]
          (RETURN (COND
		    ((MEMBER ITEM (SETQ ITEMLIST (fetch ITEMS of MENU)))
		      (replace ITEMS of MENU with (REMOVE ITEM ITEMLIST))
		      (replace MENUCOLUMNS of MENU with NIL)
		      (replace MENUROWS of MENU with NIL)
		      (UPDATE/MENU/IMAGE MENU))
		    (T NIL])

(\TEDIT.CREATEMENU
  [LAMBDA (ITEMS)                                            (* jds " 3-AUG-83 10:23")
                                                             (* Create a TEdit command menu, given a list of menu 
							     items.)
    (create MENU
	    ITEMS ← ITEMS
	    CENTERFLG ← T
	    MENUFONT ←(FONTCREATE (QUOTE HELVETICA)
				  10
				  (QUOTE BOLD))
	    WHENHELDFN ←(QUOTE \TEDIT.MENU.WHENHELDFN)
	    WHENSELECTEDFN ←(QUOTE \TEDIT.MENU.WHENSELECTEDFN])

(\TEDIT.MENU.WHENHELDFN
  [LAMBDA (ITEM MENU BUTTON)                                 (* jds "10-Apr-84 15:14")
    (COND
      ((ATOM ITEM)
	(CLRPROMPT)
	(PROMPTPRINT (SELECTQ ITEM
			      (Put "Sends the document to a file")
			      (Get "Gets a new file as the document to edit.")
			      (Looks "Changes the font/size/etc. of characters")
			      (Find "Searches for a string")
			      (Quit "Ends the edit session")
			      (Hardcopy "Formats and sends the file to a printer.")
			      (Press% File "Creates a PRESS or INTERPRESS file of the document.")
			      "")))
      (T (DEFAULTMENUHELDFN ITEM])

(\TEDIT.MENU.WHENSELECTEDFN
  [LAMBDA (ITEM MENU BUTTON)                                 (* jds "28-APR-83 18:09")
                                                             (* A Selection fn for preserving the button pressed, for
							     special handling in PUT, e.g.)
    (CONS (DEFAULTWHENSELECTEDFN ITEM MENU BUTTON)
	  BUTTON])
)
(DECLARE: DOEVAL@COMPILE DONTCOPY

(ADDTOVAR GLOBALVARS TEDIT.DEFAULT.MENU)
)
(DECLARE: DONTEVAL@LOAD DOCOPY 

(RPAQ? TEDIT.DEFAULT.MENU (\TEDIT.CREATEMENU (QUOTE (Put Get Include Find Looks Substitute Quit 
							 Hardcopy Press% File))))
)
(DECLARE: DONTEVAL@LOAD DOCOPY 
[OR (SASSOC (QUOTE TEdit)
	    BackgroundMenuCommands)
    (NCONC1 BackgroundMenuCommands (QUOTE (TEdit (QUOTE (TEDIT))
						 "Opens a TEdit window for use."]
(SETQ BackgroundMenu NIL)
)
(/DECLAREDATATYPE (QUOTE TEDITCARET)
		  (QUOTE (POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER 
				  POINTER)))
(FILESLOAD IMAGEOBJ)



(* titled icon info)

(FILESLOAD ICONW)

(RPAQ TEDITICON (READBITMAP))
(99 105
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
"@AOOOOOOOOOOOOOOOOOL@@@@@@@@"
"@AOOOOOOOOOOOOOOOOOL@@@@@@@@"
"@AOOOOOOOOOOOOOOOOOL@@@@@@@@"
"@AN@BB@@G@@@A@A@@@@N@@@@@@@@"
"@AOOOOOOOOOOOOOOOOOO@@@@@@@@"
"@AO@AKE@@@L@@@@@@@DAL@@@@@@@"
"@AOOOOOOOOOOO@OOOOOOO@@@@@@@"
"@AKN@@@@@L@@AOH@@F@@AO@@@@@@"
"@AIOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AHOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AHCOOOOOOOOOOOOOOOOOOOL@@@@"
"@AH@GL@@@@@@@@@@@@@@@@AL@@@@"
"@AH@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AH@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AH@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AH@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AH@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AH@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AH@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AH@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AH@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AH@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AH@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AH@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AH@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AH@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AH@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AH@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AH@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AH@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AH@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AH@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AH@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AHHAL@@@@@@@@@@@@@@@@AL@@@@"
"@AKHIL@@@@@@@@@@@@@@@@AL@@@@"
"@AHNEL@@@@@@@@@@@@@@@@AL@@@@"
"@AHIML@@@@@@@@@@@@@@@@AL@@@@"
"@AH@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AJ@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AHNEL@@@@@@@@@@@@@@@@AL@@@@"
"@AHIML@@@@@@@@@@@@@@@@AL@@@@"
"@AH@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AH@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AK@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AJLEL@@@@@@@@@@@@@@@@AL@@@@"
"@AHKIL@@@@@@@@@@@@@@@@AL@@@@"
"@AHHEL@@@@@@@@@@@@@@@@AL@@@@"
"@AHDEL@@@@@@@@@@@@@@@@AL@@@@"
"@AHCIL@@@@@@@@@@@@@@@@AL@@@@"
"@AH@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AK@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AJ@IL@@@@@@@@@@@@@@@@AL@@@@"
"@AJHEL@@@@@@@@@@@@@@@@AL@@@@"
"@AJFEL@@@@@@@@@@@@@@@@AL@@@@"
"@AKLEL@@@@@@@@@@@@@@@@AL@@@@"
"@AJGEL@@@@@@@@@@@@@@@@AL@@@@"
"@AH@ML@@@@@@@@@@@@@@@@AL@@@@"
"@AH@EL@@@@@@@@@@@@@@@@AL@@@@"
"@AH@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AK@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AJ@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AJ@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AKHAL@@@@@@@@@@@@@@@@AL@@@@"
"@AJGEL@@@@@@@@@@@@@@@@AL@@@@"
"@AJ@ML@@@@@@@@@@@@@@@@AL@@@@"
"@AK@EL@@@@@@@@@@@@@@@@AL@@@@"
"@AH@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AH@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AH@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AH@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AH@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AH@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AH@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AH@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AH@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AH@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AH@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AH@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AH@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AH@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AH@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AH@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AH@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AH@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AH@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AH@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AH@AL@@@@@@@@@@@@@@@@AL@@@@"
"@AL@AL@@@@@@@@@@@@@@@@AL@@@@"
"@@N@AL@@@@@@@@@@@@@@@@AL@@@@"
"@@O@AL@@@@@@@@@@@@@@@@AL@@@@"
"@@GLAL@@@@@@@@@@@@@@@@AL@@@@"
"@@COAL@@@@@@@@@@@@@@@@AL@@@@"
"@@@OOOOOOOOOOOOOOOOOOOOL@@@@"
"@@@COOOOOOOOOOOOOOOOOOOL@@@@"
"@@@@GOOOOOOOOOOOOOOOOOOL@@@@"
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@")

(RPAQ TEDITMASK (READBITMAP))
(99 108
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
"@AOOOOOOOOOOOOOOOOOL@@@@@@@@"
"@AOOOOOOOOOOOOOOOOOL@@@@@@@@"
"@AOOOOOOOOOOOOOOOOOL@@@@@@@@"
"@AOOOOOOOOOOOOOOOOON@@@@@@@@"
"@AOOOOOOOOOOOOOOOOOO@@@@@@@@"
"@AOOOOOOOOOOOOOOOOOOL@@@@@@@"
"@AOOOOOOOOOOOOOOOOOOO@@@@@@@"
"@AOOOOOOOOOOOOOOOOOOOO@@@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@AOOOOOOOOOOOOOOOOOOOOOL@@@@"
"@@OOOOOOOOOOOOOOOOOOOOOL@@@@"
"@@OOOOOOOOOOOOOOOOOOOOOL@@@@"
"@@GOOOOOOOOOOOOOOOOOOOOL@@@@"
"@@COOOOOOOOOOOOOOOOOOOOL@@@@"
"@@@OOOOOOOOOOOOOOOOOOOOL@@@@"
"@@@COOOOOOOOOOOOOOOOOOOL@@@@"
"@@@@GOOOOOOOOOOOOOOOOOOL@@@@"
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@")

(RPAQ? TEDIT.ICON.FONT (FONTCREATE (QUOTE HELVETICA)
				   8
				   (QUOTE BOLD)))

(RPAQ? TEDIT.ICON.TITLE.REGION (CREATE REGION BOTTOM ← 11 LEFT ← 23 WIDTH ← 64 HEIGHT ← 77))

(RPAQ? TEDIT.TITLED.ICON.TEMPLATE (CREATE TITLEDICON ICON←TEDITICON MASK←TEDITMASK 
					  TITLEREG←TEDIT.ICON.TITLE.REGION))
(DECLARE: DONTCOPY
  (FILEMAP (NIL (2649 42209 (TEDIT.CREATEW 2659 . 3084) (TEDIT.CURSORMOVEDFN 3086 . 5167) (
TEDIT.CURSOROUTFN 5169 . 5679) (TEDIT.GETINPUT 5681 . 6313) (TEDIT.PROMPTPRINT 6315 . 6669) (
TEXTSTREAM.TITLE 6671 . 7242) (\TEDIT.ACTIVE.WINDOWP 7244 . 7648) (\TEDIT.BUTTONEVENTFN 7650 . 24551) 
(\TEDIT.EXPANDFN 24553 . 24847) (\TEDIT.MAINW 24849 . 25311) (\TEDIT.ORIGINAL.WINDOW.TITLE 25313 . 
26481) (\TEDIT.CARET 26483 . 26818) (\TEDIT.NEWREGIONFN 26820 . 28546) (\TEDIT.SET.WINDOW.EXTENT 28548
 . 30361) (\TEDIT.SHRINK.ICONCREATE 30363 . 31600) (\TEDIT.SHRINKFN 31602 . 31923) (\TEDIT.SPLITW 
31925 . 33414) (\TEDIT.UNSPLITW 33416 . 34118) (\TEDIT.WINDOW.SETUP 34120 . 41451) (
\TEDIT.WINDOW.TITLE 41453 . 41830) (\SAFE.FIRST 41832 . 42207)) (42949 64270 (TEDIT.DEACTIVATE.WINDOW 
42959 . 45800) (\TEDIT.REPAINTFN 45802 . 46810) (\TEDIT.RESHAPEFN 46812 . 50159) (
\TEDIT.SET.WINDOW.TITLE 50161 . 50739) (\TEDIT.SCROLLFN 50741 . 64268)) (64308 66166 (
\TEDIT.PROCIDLEFN 64318 . 65387) (\TEDIT.PROCENTRYFN 65389 . 65719) (\TEDIT.PROCEXITFN 65721 . 66164))
 (66240 72417 (\EDIT.DOWNCARET 66250 . 66752) (\EDIT.FLIPCARET 66754 . 68794) (TEDIT.FLASHCARET 68796
 . 69221) (\EDIT.UPCARET 69223 . 69687) (TEDIT.NORMALIZECARET 69689 . 71972) (\SETCARET 71974 . 72415)
) (73909 81895 (TEDIT.ADD.MENUITEM 73919 . 75519) (TEDIT.DEFAULT.MENUFN 75521 . 79726) (
TEDIT.REMOVE.MENUITEM 79728 . 80417) (\TEDIT.CREATEMENU 80419 . 80913) (\TEDIT.MENU.WHENHELDFN 80915
 . 81537) (\TEDIT.MENU.WHENSELECTEDFN 81539 . 81893)))))
STOP