(FILECREATED "17-Mar-86 12:54:44" {DSK}<LISPFILES2>DCOMS>TEDITMODE.;2 12900 changes to: (VARS TEDITMODECOMS) (ADVICE \TEDIT.WINDOW.SETUP) previous date: " 8-Feb-86 16:07:04" {DSK}<LISPFILES2>DCOMS>TEDITMODE.;1) (* Copyright (c) 1986 by Quintus Computer Systems, Inc. All rights reserved.) (PRETTYCOMPRINT TEDITMODECOMS) (RPAQQ TEDITMODECOMS ((SCCS) (RECORDS TEDITMODEREC) (INITVARS (TEDITMODE.DEFAULTMODE.VAR (QUOTE Text)) (TEDITMODE.MODELIST (LIST (create TEDITMODEREC MODE ← (QUOTE Text) IN-MENU? ← T EXTENSION-LIST ← (QUOTE (tedit TEDIT)) TEXTPROPS ← NIL WINDOWPROPS ← NIL INITTEXTPROPS ← NIL))) TEDITMODE.MENU) (GLOBALVARS TEDITMODE.DEFAULTMODE.VAR TEDITMODE.MENU TEDITMODE.MODELIST) (FNS TEDITMODE.CHANGEDEFAULTMODE TEDITMODE.CHANGEMODE TEDITMODE.COPY.MENU TEDITMODE.DEFAULTMODE TEDITMODE.FIX.TEDIT.PROPS TEDITMODE.MODE TEDITMODE.NEWMODE TEDITMODE.SET.MODE.AFTER.GET.OR.PUT TEDITMODE.SET.MODE.INITIALLY) (P (if (NOT (ASSOC "Mode" (fetch (MENU ITEMS) of TEDIT.DEFAULT.MENU))) then (TEDIT.ADD.MENUITEM TEDIT.DEFAULT.MENU (QUOTE ("Mode" (FUNCTION TEDITMODE.CHANGEMODE)))))) (ADVISE TEDIT.GET TEDIT.PUT \TEDIT.WINDOW.SETUP) (P (* * Don't want to use filepkg ADVISE com, since Prolog system code advises TEDIT, also. The two sets of advice need to be separated.) (ADVISE (QUOTE TEDIT) (QUOTE BEFORE) NIL (QUOTE (SETQ PROPS (TEDITMODE.FIX.TEDIT.PROPS TEXT PROPS))))))) (* %%G% %%W% ) [DECLARE: EVAL@COMPILE (RECORD TEDITMODEREC (MODE IN-MENU? EXTENSION-LIST TEXTPROPS WINDOWPROPS INITTEXTPROPS)) ] (RPAQ? TEDITMODE.DEFAULTMODE.VAR (QUOTE Text)) (RPAQ? TEDITMODE.MODELIST (LIST (create TEDITMODEREC MODE ← (QUOTE Text) IN-MENU? ← T EXTENSION-LIST ← (QUOTE (tedit TEDIT)) TEXTPROPS ← NIL WINDOWPROPS ← NIL INITTEXTPROPS ← NIL))) (RPAQ? TEDITMODE.MENU NIL) (DECLARE: DOEVAL@COMPILE DONTCOPY (GLOBALVARS TEDITMODE.DEFAULTMODE.VAR TEDITMODE.MENU TEDITMODE.MODELIST) ) (DEFINEQ (TEDITMODE.CHANGEDEFAULTMODE (LAMBDA NIL (* pds: " 2-Feb-86 19:05") (* * Pops up a menu to allow the user to see what the default TEdit mode is now, and optionally to change it.) (* * Any changes to this function should probably also be made to TEDITMODE.CHANGEMODE) (if (NULL TEDITMODE.MENU) then (SETQ TEDITMODE.MENU (create MENU ITEMS ← (for REC in TEDITMODE.MODELIST when (fetch (TEDITMODEREC IN-MENU?) of REC) collect (fetch ( TEDITMODEREC MODE) of REC)) CENTERFLG ← T TITLE ← "TEdit Mode"))) (LET ((CURRENTMODE ( TEDITMODE.DEFAULTMODE))) (replace (MENU SHADEDITEMS) of TEDITMODE.MENU with (for ITM in (fetch (MENU ITEMS) of TEDITMODE.MENU) as I from 1 when (EQUAL ITM CURRENTMODE) do (RETURN (LIST (CONS I BLACKSHADE ))))) (replace (MENU IMAGE) of TEDITMODE.MENU with NIL) (LET ((NEWMODE (MENU TEDITMODE.MENU))) (if ( AND NEWMODE (NEQ NEWMODE CURRENTMODE)) then (TEDITMODE.DEFAULTMODE NEWMODE) (if (EQUAL NEWMODE ( TEDITMODE.DEFAULTMODE)) then (PROMPTPRINT (CONCAT "Default TEdit mode changed to '" NEWMODE "'")) else (PROMPTPRINT "Couldn't change mode")) else (PROMPTPRINT (CONCAT "Default TEdit mode is still '" CURRENTMODE "'"))))))) (TEDITMODE.CHANGEMODE (LAMBDA (TEXTSTREAM) (* pds: " 2-Feb-86 18:57") (* * Pops up a menu to allow the user to see what mode the TEdit window is in now, and optionally to change it.) (* * Any changes to this function should probably also be made to TEDITMODE.CHANGEDEFAULTMODE) (if (NULL TEDITMODE.MENU) then (SETQ TEDITMODE.MENU (create MENU ITEMS ← (for REC in TEDITMODE.MODELIST when (fetch (TEDITMODEREC IN-MENU?) of REC) collect (fetch (TEDITMODEREC MODE) of REC)) CENTERFLG ← T TITLE ← "TEdit Mode"))) (LET (( CURRENTMODE (TEDITMODE.MODE TEXTSTREAM))) (replace (MENU SHADEDITEMS) of TEDITMODE.MENU with (for ITM in (fetch (MENU ITEMS) of TEDITMODE.MENU) as I from 1 when (EQUAL ITM CURRENTMODE) do (RETURN (LIST ( CONS I BLACKSHADE))))) (replace (MENU IMAGE) of TEDITMODE.MENU with NIL) (LET ((NEWMODE (MENU TEDITMODE.MENU))) (if (AND NEWMODE (NEQ NEWMODE CURRENTMODE)) then (TEDITMODE.MODE TEXTSTREAM NEWMODE) (if (EQUAL NEWMODE (TEDITMODE.MODE TEXTSTREAM)) then (TEDIT.PROMPTPRINT TEXTSTREAM (CONCAT "TEdit mode changed to '" NEWMODE "'") T) else (TEDIT.PROMPTPRINT TEXTSTREAM "Couldn't change mode" T) ) else (TEDIT.PROMPTPRINT TEXTSTREAM (CONCAT "TEdit mode is still '" CURRENTMODE "'") T)))))) (TEDITMODE.COPY.MENU (LAMBDA (MENU) (* pds: "30-Jan-86 16:00") (create MENU ITEMS ← (fetch (MENU ITEMS) of MENU) CENTERFLG ← (fetch (MENU CENTERFLG) of MENU) CHANGEOFFSETFLG ← (fetch (MENU CHANGEOFFSETFLG) of MENU) MENUFONT ← (fetch (MENU MENUFONT) of MENU) TITLE ← (fetch (MENU TITLE) of MENU) MENUOFFSET ← (fetch (MENU MENUOFFSET) of MENU) WHENSELECTEDFN ← (fetch (MENU WHENSELECTEDFN) of MENU) MENUBORDERSIZE ← (fetch ( MENU MENUBORDERSIZE) of MENU) MENUOUTLINESIZE ← (fetch (MENU MENUOUTLINESIZE) of MENU) WHENHELDFN ← ( fetch (MENU WHENHELDFN) of MENU) MENUPOSITION ← (fetch (MENU MENUPOSITION) of MENU) WHENUNHELDFN ← ( fetch (MENU WHENUNHELDFN) of MENU) MENUUSERDATA ← (fetch (MENU MENUUSERDATA) of MENU) MENUTITLEFONT ← (fetch (MENU MENUTITLEFONT) of MENU) SUBITEMFN ← (fetch (MENU SUBITEMFN) of MENU) MENUFEEDBACKFLG ← ( fetch (MENU MENUFEEDBACKFLG) of MENU) SHADEDITEMS ← (fetch (MENU SHADEDITEMS) of MENU)))) (TEDITMODE.DEFAULTMODE (LAMBDA (NEWMODE) (* pds: " 2-Feb-86 18:14") (* * Return the current default TEdit mode. If NEWMODE is non-NIL, then make it be the new default TEdit mode.) (PROG1 TEDITMODE.DEFAULTMODE.VAR (if NEWMODE then (if (SASSOC NEWMODE TEDITMODE.MODELIST) then (if (NOT (EQUAL NEWMODE TEDITMODE.DEFAULTMODE.VAR)) then (SETQ TEDITMODE.DEFAULTMODE.VAR NEWMODE) (LET ((BGMENUITEM (ASSOC (QUOTE TEdit) BackgroundMenuCommands))) (change (CADDR BGMENUITEM) (CONCAT "Opens a TEdit window in '" NEWMODE "' mode.")) (SETQ BackgroundMenu NIL))) else (ERROR "Unknown mode" NEWMODE)))))) (TEDITMODE.FIX.TEDIT.PROPS (LAMBDA (TEXT PROPS) (* pds: " 2-Feb-86 21:55") (* * Called before TEDIT (TEDIT is advised) to fix up the PROPS supplied to TEDIT and make them appropriate for the mode. Returns a new PROPS list.) (LET* ( (SPECIFIEDMODE (LISTGET PROPS (QUOTE TEDIT.MODE))) (FILENAME (AND (NOT SPECIFIEDMODE) TEXT (INFILEP TEXT)) (* * No need to get file name if user specified mode explicitly.)) (MODEREC (OR (AND SPECIFIEDMODE (SASSOC SPECIFIEDMODE TEDITMODE.MODELIST)) (AND FILENAME (bind (EXT ← (FILENAMEFIELD FILENAME (QUOTE EXTENSION))) for REC in TEDITMODE.MODELIST thereis (MEMB EXT (fetch (TEDITMODEREC EXTENSION-LIST) of REC)))) (SASSOC (TEDITMODE.DEFAULTMODE) TEDITMODE.MODELIST)))) (* * MODEREC should never be NIL.) (APPEND (if (NOT (EQUAL SPECIFIEDMODE (fetch (TEDITMODEREC MODE) of MODEREC))) then ( LIST (QUOTE TEDIT.MODE) (fetch (TEDITMODEREC MODE) of MODEREC)) else NIL) PROPS (LET ((TEXTPROPS ( APPEND (fetch (TEDITMODEREC INITTEXTPROPS) of MODEREC) (fetch (TEDITMODEREC TEXTPROPS) of MODEREC)))) (APPEND (LIST (QUOTE TEDITMODE.OLDPROPS) (for PROP in TEXTPROPS by (CDDR PROP) collect (CONS PROP NIL) )) TEXTPROPS)))))) (TEDITMODE.MODE (LAMBDA (TEXTOBJ-OR-STREAM-OR-WINDOW NEWMODE DONTBREAK?) (* pds: " 2-Feb-86 22:05") (* * Returns current mode of TEXTOBJ-OR-STREAM. If NEWMODE is non-NIL, then also changes TEXTOBJ-OR-STREAM-OR-WINDOW to NEWMODE. Modes are listed in TEDITMODE.MODELIST, which is a list of TEDITMODEREC, which are of the form (mode in-menu? extension-list textprops windowprops enterfn exitfn ) %. Mode is the name of the mode; if in-menu? is non-NIL, then this mode will automatically be included in the menu of modes presented when you select MODE from the modified default TEdit menu; extension-list is a list of file extensions that automatically switch a TEdit window to that mode. Textprops is a property list of TEXTOBJ properties and their values. These properties will be set when a TEdit window is put into the mode, and unset when taken out of that mode. Similarly for windowprops. A menu placed on the TEdit window's TEDIT.MENU prop will be used instead of the default TEdit menu. Enterfn, if non-NIL, and not the atom DON'T, will be applied to the TEXTOBJ before it is changed to this mode. Similarly for exitfn. If either of them is, or returns, the atom DON'T, then the mode will not be entered (exited) %.) (PROG1 (TEXTPROP (TEXTOBJ TEXTOBJ-OR-STREAM-OR-WINDOW) (QUOTE TEDIT.MODE)) (if NEWMODE then (* * N.B.: In the LET below, I use SASSOC to find the appropriate mode record since I know that the mode is the first entry in the record. I know this is unclean, but I'm doing it anyway.) (LET* ((MODEREC (SASSOC NEWMODE TEDITMODE.MODELIST)) (TXTOB (TEXTOBJ TEXTOBJ-OR-STREAM-OR-WINDOW)) (WIN (CAR (fetch (TEXTOBJ \WINDOW) of TXTOB)))) (if MODEREC then (with TEDITMODEREC MODEREC (if (AND (LET ((EXITFN (TEXTPROP TXTOB (QUOTE EXITMODEFN)))) (OR (NULL EXITFN) ( NEQ (APPLY* EXITFN TXTOB NEWMODE) (QUOTE DON'T)))) (LET ((ENTERFN (LISTGET TEXTPROPS (QUOTE ENTERMODEFN)))) (OR (NULL ENTERFN) (NEQ (APPLY* ENTERFN TXTOB NEWMODE) (QUOTE DON'T))))) then (for PAIR in (TEXTPROP TXTOB (QUOTE TEDITMODE.OLDPROPS)) do (TEXTPROP TXTOB (CAR PAIR) (CDR PAIR))) (for PAIR in (WINDOWPROP WIN (QUOTE TEDITMODE.OLDPROPS)) do (WINDOWPROP WIN (CAR PAIR) (CDR PAIR))) ( TEXTPROP TXTOB (QUOTE TEDITMODE.OLDPROPS) (for PTR on TEXTPROPS by (CDDR PTR) collect (CONS (CAR PTR) (PROG1 (TEXTPROP TXTOB (CAR PTR)) (TEXTPROP TXTOB (CAR PTR) (CADR PTR)))))) (WINDOWPROP WIN (QUOTE TEDITMODE.OLDPROPS) (for PTR on WINDOWPROPS by (CDDR PTR) collect (CONS (CAR PTR) (WINDOWPROP WIN (CAR PTR) (CADR PTR))))) (TEXTPROP TXTOB (QUOTE TEDIT.MODE) NEWMODE) elseif (NOT DONTBREAK?) then (ERROR "Unknown TEdit mode" NEWMODE))))))))) (TEDITMODE.NEWMODE (LAMBDA (TEDITMODERECORD) (* pds: " 2-Feb-86 23:18") (LET ((NEWMODE (fetch (TEDITMODEREC MODE) of TEDITMODERECORD))) (if (NOT (SASSOC NEWMODE TEDITMODE.MODELIST)) then (NCONC1 TEDITMODE.MODELIST TEDITMODERECORD) (if (fetch (TEDITMODEREC IN-MENU?) of TEDITMODERECORD) then (SETQ TEDITMODE.MENU NIL) (LET ((BGMENUITEM (ASSOC (QUOTE TEdit) BackgroundMenuCommands))) (if (NULL (CDDDR BGMENUITEM)) then ( * Add submenu to TEdit item) (NCONC1 BGMENUITEM (LIST (QUOTE SUBITEMS) (LIST "<change default>" (KWOTE (LIST (FUNCTION TEDITMODE.CHANGEDEFAULTMODE))) "Allows you to choose the default TEdit mode") (LIST ( QUOTE Text) (KWOTE (LIST (FUNCTION TEDIT) NIL NIL NIL (KWOTE (LIST (QUOTE TEDIT.MODE) (QUOTE Text))))) "Opens a TEdit window in 'Text' mode."))) (change (CADDR BGMENUITEM) "Opens a TEdit window in 'Text' mode.")) (NCONC1 (CADDDR BGMENUITEM) (LIST NEWMODE (KWOTE (LIST ( FUNCTION TEDIT) NIL NIL NIL (KWOTE (LIST (QUOTE TEDIT.MODE) NEWMODE)))) (CONCAT "Opens a TEdit window in '" NEWMODE "' mode.")))) (SETQ BackgroundMenu NIL)) NEWMODE else NIL)))) (TEDITMODE.SET.MODE.AFTER.GET.OR.PUT (LAMBDA (TEXTOBJ) (* pds: " 2-Feb-86 20:52") (LET* ((NEWMODEREC (bind (EXT ← (FILENAMEFIELD ( \TEXTSTREAM.FILENAME TEXTOBJ) (QUOTE EXTENSION))) for MODE in TEDITMODE.MODELIST thereis (MEMB EXT ( fetch (TEDITMODEREC EXTENSION-LIST) of MODE)))) (NEWMODE (AND NEWMODEREC (fetch (TEDITMODEREC MODE) of NEWMODEREC)))) (if NEWMODE then (LET ((OLDMODE (TEDITMODE.MODE TEXTOBJ NEWMODE))) (if (AND (NOT ( EQUAL NEWMODE OLDMODE)) (EQUAL NEWMODE (TEDITMODE.MODE TEXTOBJ))) then (TEDIT.PROMPTPRINT TEXTOBJ ( CONCAT "Tedit mode is '" NEWMODE "'")))))))) (TEDITMODE.SET.MODE.INITIALLY (LAMBDA (TEXTOBJ) (* pds: " 2-Feb-86 22:05") (LET ((WIN (CAR (fetch (TEXTOBJ \WINDOW) of TEXTOBJ)))) ( WINDOWPROP WIN (QUOTE TEDITMODE.OLDPROPS) (for PTR on (fetch (TEDITMODEREC WINDOWPROPS) of (SASSOC ( TEXTPROP TEXTOBJ (QUOTE TEDIT.MODE)) TEDITMODE.MODELIST)) by (CDDR PTR) collect (CONS (CAR PTR) ( WINDOWPROP WIN (CAR PTR) (CADR PTR)))))) (if (NOT (TEXTPROP TEXTOBJ (QUOTE DONT.ANNOUNCE.MODE))) then (TEDIT.PROMPTPRINT TEXTOBJ (CONCAT "TEdit mode is '" (TEDITMODE.MODE TEXTOBJ) "'"))) TEXTOBJ)) ) (if (NOT (ASSOC "Mode" (fetch (MENU ITEMS) of TEDIT.DEFAULT.MENU))) then (TEDIT.ADD.MENUITEM TEDIT.DEFAULT.MENU (QUOTE ("Mode" (FUNCTION TEDITMODE.CHANGEMODE))))) (PUTPROPS TEDIT.GET READVICE (NIL (AFTER NIL (TEDITMODE.SET.MODE.AFTER.GET.OR.PUT TEXTOBJ FILE)))) (PUTPROPS TEDIT.PUT READVICE (NIL (AFTER NIL (TEDITMODE.SET.MODE.AFTER.GET.OR.PUT TEXTOBJ FILE)))) (PUTPROPS \TEDIT.WINDOW.SETUP READVICE (NIL (AFTER NIL (TEDITMODE.SET.MODE.INITIALLY TEXTOBJ)))) (READVISE TEDIT.GET TEDIT.PUT \TEDIT.WINDOW.SETUP) (* * Don't want to use filepkg ADVISE com, since Prolog system code advises TEDIT, also. The two sets of advice need to be separated.) (ADVISE (QUOTE TEDIT) (QUOTE BEFORE) NIL (QUOTE (SETQ PROPS (TEDITMODE.FIX.TEDIT.PROPS TEXT PROPS)))) (PUTPROPS TEDITMODE COPYRIGHT ("Quintus Computer Systems, Inc" 1986)) (DECLARE: DONTCOPY (FILEMAP (NIL (2118 12023 (TEDITMODE.CHANGEDEFAULTMODE 2128 . 3280) (TEDITMODE.CHANGEMODE 3282 . 4498) (TEDITMODE.COPY.MENU 4500 . 5427) (TEDITMODE.DEFAULTMODE 5429 . 6027) (TEDITMODE.FIX.TEDIT.PROPS 6029 . 7186) (TEDITMODE.MODE 7188 . 9818) (TEDITMODE.NEWMODE 9820 . 10902) ( TEDITMODE.SET.MODE.AFTER.GET.OR.PUT 10904 . 11486) (TEDITMODE.SET.MODE.INITIALLY 11488 . 12021))))) STOP