(* Mode: Interlisp *)

(* Fix up the background menu. *)


(GLOBALVARS BackgroundMenuCommands BackgroundMenu
    MODE.MENU MODE.MENU.COMMANDS)

(DEFINEQ (UPDATE.BACKGROUND.MENU (LAMBDA ()
  (PROG ()
    (SETQ MODE.MENU NIL)
    (SETQ MODE.MENU.COMMANDS 
       '((Text (SET.MODE.TEXT) "Simple text.")))
    (SETQ BackgroundMenu NIL)
    (PUTASSOC 'TEdit 
          '((SPAWN.TEDIT.PROCESS) 
            "Spawns a process that opens a Tedit window for use.")
          BackgroundMenuCommands) )
)))


(UPDATE.BACKGROUND.MENU)


(DEFINEQ (SPAWN.TEDIT.PROCESS (LAMBDA ()
   (ADD.PROCESS 
       '(TOP.LEVEL.TEDITOR) 
       'NAME 
       'TEDIT
       'INFOHOOK 'TEDITOR.INFORMER
       ))))

(DEFINEQ (DISPLAY.MODE.MENU (LAMBDA ()
   (IF (NULL MODE.MENU) THEN
         (SETQ MODE.MENU 
             (CREATE MENU
                ITEMS ← MODE.MENU.COMMANDS
                TITLE ← "Language mode"
                CENTERFLG ← T)) )
   (MENU MODE.MENU))))


(DEFINEQ (TOP.LEVEL.TEDITOR (LAMBDA ()
   (PROG ()
     (TTY.PROCESS (THIS.PROCESS))
     (TEDIT NIL NIL T 
         (LIST 'TEDITTOPLEVEL T 
              'READTABLE (COPYREADTABLE TEDIT.READTABLE)
              'MENU
             (APPEND (FETCH ITEMS OF TEDIT.DEFAULT.MENU)
                '(("Change Mode" (DISPLAY.MODE.MENU))))))))))


(DEFINEQ (ADD.EDITOR.MODE (LAMBDA (NAME EXPR BLURB)
   (PROG ()
     (PUTASSOC NAME (LIST EXPR BLURB) MODE.MENU.COMMANDS)
     (SETQ MODE.MENU NIL)))))

(DEFINEQ (TEDITOR.INFORMER (LAMBDA (PROCESS BUTTON)
   (SELECTQ BUTTON
     (LEFT 
       (PRINTOUT PROMPTWINDOW 
           "This is a process that is running tedit." T))
     (MIDDLE 
       (PRINTOUT PROMPTWINDOW 
           "No comment." T))
     (RIGHT 
       (PRINTOUT PROMPTWINDOW 
           "How did you manage that?" T))
     (NIL)) )))


(* Standard Teditor modes: *)

(DEFINEQ (SET.MODE.TEXT (LAMBDA ()
  (PROG (PROCESS WINDOW TEXTOBJ READ-TABLE)
    (SETQ PROCESS (THIS.PROCESS))
    (SETQ WINDOW (PROCESSPROP PROCESS 'WINDOW))
    (SETQ TEXTOBJ (TEXTOBJ WINDOW))
    (SETQ READ-TABLE (FETCH (TEXTOBJ TXTRTBL) OF TEXTOBJ))

    (WINDOWPROP WINDOW 'EDITMODE 'N-LISP)

    (* Turn off paren. balancing, etc. *)
    (TEDIT.SETSYNTAX (CHARCODE ")") 'NONE READ-TABLE)
    (TEDIT.SETSYNTAX (CHARCODE "]") 'NONE READ-TABLE)
    (TEDIT.SETSYNTAX (CHARCODE "~") 'NONE READ-TABLE)
    (TEDIT.SETSYNTAX 10 'NONE READ-TABLE)

))))


(ADD.EDITOR.MODE 'Interlisp '(SET.MODE.INTERLISP) 
     "Interlisp in mixed case that should be read as is.")

(DEFINEQ (SET.MODE.INTERLISP (LAMBDA ()
  (PROG (PROCESS WINDOW TEXTOBJ READ-TABLE)
    (SETQ PROCESS (THIS.PROCESS))
    (SETQ WINDOW (PROCESSPROP PROCESS 'WINDOW))
    (SETQ TEXTOBJ (TEXTOBJ WINDOW))
    (SETQ READ-TABLE (FETCH (TEXTOBJ TXTRTBL) OF TEXTOBJ))

    (WINDOWPROP WINDOW 'EDITMODE 'INTERLISP)

    (* Turn on paren. balancing, etc. *)
    (PB.ENABLE.BALANCING READ-TABLE)
    (PB.ENABLE.COPY.WHITESPACE READ-TABLE)
    (PB.ENABLE.EVAL READ-TABLE) 
))))

(ADD.EDITOR.MODE 'InTeRlIsP '(SET.MODE.INTERLISPU)
   "Interlisp code that must be converted to uppercase.")


(DEFINEQ (SET.MODE.INTERLISPU (LAMBDA ()
  (* Basically the same as SET.MODE.INTERLISP except that it
     is the case that the text in the window in NOT of the
     correct case, and should therefore be converted to
     uppercase before being executed.   Note that this means
     that the only variables/functions that can be references
     are ones whose name is strictly all caps. *)

  (PROG (PROCESS WINDOW TEXTOBJ READ-TABLE)
    (SETQ PROCESS (THIS.PROCESS))
    (SETQ WINDOW (PROCESSPROP PROCESS 'WINDOW))
    (SETQ TEXTOBJ (TEXTOBJ WINDOW))
    (SETQ READ-TABLE (FETCH (TEXTOBJ TXTRTBL) OF TEXTOBJ))

    (WINDOWPROP WINDOW 'EDITMODE 'INTERLISP-U)

    (* Turn on paren. balancing, etc. *)
    (PB.ENABLE.BALANCING READ-TABLE)
    (PB.ENABLE.COPY.WHITESPACE READ-TABLE)
    (PB.ENABLE.EVAL.UPPER READ-TABLE) 
))))


STOP