(DEFINE-FILE-INFO READTABLE "INTERLISP" PACKAGE "INTERLISP" BASE 10)
(FILECREATED "22-Oct-87 11:54:12" "{FireFS:CS:Univ Rochester}<koomen>LispUsers>Lyric>TILED-SEDIT.;8" 11661  

      changes to%:  (VARS TILED-SEDITCOMS)
                    (FNS TILED.SEDIT.RESET)

      previous date%: "23-Sep-87 16:58:56" 
"{FireFS:CS:Univ Rochester}<koomen>LispUsers>Lyric>TILED-SEDIT.;7")


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

(PRETTYCOMPRINT TILED-SEDITCOMS)

(RPAQQ TILED-SEDITCOMS (

(* ;;; "Provides a similar facility for SEdit as the LispUsers package TILEDEDIT provides for DEdit, i.e., instead of prompting the user for regions, generates successive regions in a circular fashion, eachtime throught the full window loop offsetting the next window by 12,-12.  Users can select their preference through the TILING-ORDER  argument to the function TILED.SEDIT.RESET, which must be either NIL (no tiling), T (default tiling order) or a list of the symbols TL (top-left) TR (top-right) BL (bottom-left) and BR (bottom-right)")

                        
          
          (* ;; "User Interface")

                        (FNS TILED.SEDIT.RESET)
                        
          
          (* ;; "Support ")

                        (PROP MAKEFILE-ENVIRONMENT TILED-SEDIT)
                        (LOCALVARS . T)
                        (INITVARS (*TiledSEditMargin* 25)
                               (*TiledSEditXShift* 15)
                               (*TiledSEditYShift* 15)
                               (*TiledSEditRegions* NIL))
                        (RECORDS TILED.SEDIT.REGION)
                        (FNS POST.TILED.SEDIT.GET.WINDOW.REGION POST.TILED.SEDIT.SAVE.WINDOW.REGION 
                             TILED.SEDIT.NEW.REGION TILED.SEDIT.SWITCHFN)
                        (GLOBALVARS *TiledSEditXShift* *TiledSEditYShift* *TiledSEditRegions* 
                               *TiledSEditRegionWidth* *TiledSEditRegionHeight* *TiledSEditCorners* 
                               *TiledSEditNextCornerPtr* *TiledSEditNextTopLeftRegion* 
                               *TiledSEditNextBottomLeftRegion* *TiledSEditNextTopRightRegion* 
                               *TiledSEditNextBottomRightRegion*)
                        (P (TILED.SEDIT.RESET T))))



(* ;;; 
"Provides a similar facility for SEdit as the LispUsers package TILEDEDIT provides for DEdit, i.e., instead of prompting the user for regions, generates successive regions in a circular fashion, eachtime throught the full window loop offsetting the next window by 12,-12.  Users can select their preference through the TILING-ORDER  argument to the function TILED.SEDIT.RESET, which must be either NIL (no tiling), T (default tiling order) or a list of the symbols TL (top-left) TR (top-right) BL (bottom-left) and BR (bottom-right)"
)




(* ;; "User Interface")

(DEFINEQ

(TILED.SEDIT.RESET
  [LAMBDA (TILING-ORDER XSHIFT YSHIFT SCREEN)               (* ; "Edited 22-Oct-87 11:35 by Koomen")

    [if (NULL TILING-ORDER)
        then 
          
          (* ;; "Reset the world")

             (SETQ *TiledSEditRegions*)
      else 
          
          (* ;; "Determine new order")
                                                             (* ; "BEWARE!!! INFINITE LIST!!!")

           [LET [(ORDER (if (EQ TILING-ORDER T)
                            then (LIST :TL :BL :TR :BR)
                          else (for CORNER inside TILING-ORDER
                                  collect (SELECTQ CORNER
                                              ((:TL :TOPLEFT :TOP-LEFT :TOP.LEFT) 
                                                   :TL)
                                              ((:BL :BOTTOMLEFT :BOTTOM-LEFT :BOTTOM.LEFT) 
                                                   :BL)
                                              ((:TR :TOPRIGHT :TOP-RIGHT :TOP.RIGHT) 
                                                   :TR)
                                              ((:BR :BOTTOMRIGHT :BOTTOM-RIGHT :BOTTOM.RIGHT) 
                                                   :BR)
                                              (ERROR "Unsupported TILING-ORDER spec:" CORNER]
                (SETQ TILING-ORDER (COPY ORDER))
                (SETQ *TiledSEditNextCornerPtr* (SETQ *TiledSEditCorners* (NCONC ORDER ORDER] 
          
          (* ;; "Determine starting placements")

           (SETQ *TiledSEditXShift* (OR (FIXP XSHIFT)
                                        15))
           (SETQ *TiledSEditYShift* (OR (FIXP YSHIFT)
                                        15))
           [if (NOT (REGIONP SCREEN))
               then (SETQ SCREEN (LET ((MARGIN (OR (FIXP SCREEN)
                                                   25)))
                                      (CREATEREGION MARGIN MARGIN (IDIFFERENCE SCREENWIDTH MARGIN)
                                             (IDIFFERENCE SCREENHEIGHT MARGIN]
           (LET* ((WIDTH (LRSH (IDIFFERENCE (fetch (REGION WIDTH) of SCREEN)
                                      (LLSH *TiledSEditXShift* 2))
                               1))
                  (HEIGHT (LRSH (IDIFFERENCE (fetch (REGION HEIGHT) of SCREEN)
                                       (LLSH *TiledSEditYShift* 2))
                                1))
                  (TL-LEFT (fetch (REGION LEFT) of SCREEN))
                  (BL-LEFT TL-LEFT)
                  (BL-BOTTOM (IPLUS *TiledSEditYShift* *TiledSEditYShift* (fetch (REGION BOTTOM)
                                                                             of SCREEN)))
                  (BR-BOTTOM BL-BOTTOM)
                  (TL-BOTTOM (IPLUS BL-BOTTOM HEIGHT *TiledSEditYShift* *TiledSEditYShift*))
                  (TR-BOTTOM TL-BOTTOM)
                  (TR-LEFT (IPLUS TL-LEFT WIDTH *TiledSEditXShift* *TiledSEditXShift*))
                  (BR-LEFT TR-LEFT))
                 (SETQ *TiledSEditNextTopLeftRegion* (CREATEREGION TL-LEFT TL-BOTTOM WIDTH HEIGHT))
                 (SETQ *TiledSEditNextBottomLeftRegion* (CREATEREGION BL-LEFT BL-BOTTOM WIDTH HEIGHT)
                  )
                 (SETQ *TiledSEditNextTopRightRegion* (CREATEREGION TR-LEFT TR-BOTTOM WIDTH HEIGHT))
                 (SETQ *TiledSEditNextBottomRightRegion* (CREATEREGION BR-LEFT BR-BOTTOM WIDTH HEIGHT
                                                                ))) 
          
          (* ;; 
        "Move currently open SEdit windows (keep relative order), and recompute Tiled SEdit  regions")

           (LET ((OLDREGIONS (CAR *TiledSEditRegions*))
                 CONTEXT OTHERS)
                (SETQ *TiledSEditRegions* (CONS))
                [for W in (OPENWINDOWS) when (SETQ CONTEXT (WINDOWPROP W 'EditContext))
                   do (for TSR in OLDREGIONS when (EQ (fetch TSR.CONTEXT of TSR)
                                                      CONTEXT)
                         do (replace TSR.REGION of TSR with W)
                            (RETURN) finally (push OTHERS (CONS W CONTEXT]
                (for TSR in OLDREGIONS when (WINDOWP (fetch TSR.REGION of TSR))
                   do (SHAPEW (fetch TSR.REGION of TSR)
                             (POST.TILED.SEDIT.GET.WINDOW.REGION (fetch TSR.CONTEXT of TSR)
                                    :CREATE)))
                (for PAIR in OTHERS do (SHAPEW (CAR PAIR)
                                              (POST.TILED.SEDIT.GET.WINDOW.REGION (CDR PAIR)
                                                     :CREATE]
    (TILED.SEDIT.SWITCHFN (NULL TILING-ORDER)
           'SEDIT.GET.WINDOW.REGION
           'PRE.TILED.SEDIT.GET.WINDOW.REGION
           'POST.TILED.SEDIT.GET.WINDOW.REGION)
    (TILED.SEDIT.SWITCHFN (NULL TILING-ORDER)
           'SEDIT.SAVE.WINDOW.REGION
           'PRE.TILED.SEDIT.SAVE.WINDOW.REGION
           'POST.TILED.SEDIT.SAVE.WINDOW.REGION)
    TILING-ORDER])
)



(* ;; "Support ")


(PUTPROPS TILED-SEDIT MAKEFILE-ENVIRONMENT (:READTABLE "INTERLISP" :PACKAGE "INTERLISP" :BASE 10))
(DECLARE%: DOEVAL@COMPILE DONTCOPY

(LOCALVARS . T)
)

(RPAQ? *TiledSEditMargin* 25)

(RPAQ? *TiledSEditXShift* 15)

(RPAQ? *TiledSEditYShift* 15)

(RPAQ? *TiledSEditRegions* NIL)
(DECLARE%: EVAL@COMPILE

(RECORD TILED.SEDIT.REGION (TSR.CONTEXT . TSR.REGION))
)
(DEFINEQ

(POST.TILED.SEDIT.GET.WINDOW.REGION
  [LAMBDA (CONTEXT REASON)                                  (* ; "Edited 16-Sep-87 14:19 by Koomen")
          
          (* ;; "REASON ignored")

    (for TSR in (CAR *TiledSEditRegions*) unless (fetch TSR.CONTEXT of TSR)
       do (replace TSR.CONTEXT of TSR with CONTEXT)
          (RETURN (fetch TSR.REGION of TSR)) finally (SETQ TSR (TILED.SEDIT.NEW.REGION CONTEXT))
                                                   (TCONC *TiledSEditRegions* TSR)
                                                   (RETURN (fetch TSR.REGION of TSR])

(POST.TILED.SEDIT.SAVE.WINDOW.REGION
  [LAMBDA (CONTEXT REASON)                                  (* ; "Edited 16-Sep-87 15:15 by Koomen")
          
          (* ;; "REASON ignored")

    (for TSR in (CAR *TiledSEditRegions*) when (EQ (fetch TSR.CONTEXT of TSR)
                                                   CONTEXT)
       do (RETURN (replace TSR.CONTEXT of TSR with NIL])

(TILED.SEDIT.NEW.REGION
  [LAMBDA (CONTEXT)                                         (* ; "Edited 17-Sep-87 12:51 by Koomen")

    (LET* ((NEXTREGION (SELECTQ (pop *TiledSEditNextCornerPtr*)
                           (:TL *TiledSEditNextTopLeftRegion*)
                           (:BL *TiledSEditNextBottomLeftRegion*)
                           (:TR *TiledSEditNextTopRightRegion*)
                           (:BR *TiledSEditNextBottomRightRegion*)
                           (SHOULDNT "Bad corner spec!")))
           (THISREGION (COPY NEXTREGION)))
          (replace (REGION LEFT) of NEXTREGION with (IPLUS (fetch (REGION LEFT) of NEXTREGION)
                                                           *TiledSEditXShift*))
          (replace (REGION BOTTOM) of NEXTREGION with (IDIFFERENCE (fetch (REGION BOTTOM)
                                                                      of NEXTREGION)
                                                             *TiledSEditYShift*))
          (create TILED.SEDIT.REGION
                 TSR.CONTEXT ← CONTEXT
                 TSR.REGION ← THISREGION])

(TILED.SEDIT.SWITCHFN
  [LAMBDA (RESTOREFLG FN SAVEFN REPLFN)                     (* ; "Edited 16-Sep-87 11:18 by Koomen")

    (if (NOT (DEFINEDP SAVEFN))
        then (PUTD SAVEFN (GETD FN)))
    (PUTD FN (GETD (if (OR RESTOREFLG (NOT (DEFINEDP REPLFN)))
                       then SAVEFN
                     else REPLFN])
)
(DECLARE%: DOEVAL@COMPILE DONTCOPY

(GLOBALVARS *TiledSEditXShift* *TiledSEditYShift* *TiledSEditRegions* *TiledSEditRegionWidth* 
       *TiledSEditRegionHeight* *TiledSEditCorners* *TiledSEditNextCornerPtr* 
       *TiledSEditNextTopLeftRegion* *TiledSEditNextBottomLeftRegion* *TiledSEditNextTopRightRegion* 
       *TiledSEditNextBottomRightRegion*)
)
(TILED.SEDIT.RESET T)
(PUTPROPS TILED-SEDIT COPYRIGHT ("Johannes A. G. M. Koomen" 1987))
(DECLARE%: DONTCOPY
  (FILEMAP (NIL (2912 8152 (TILED.SEDIT.RESET 2922 . 8150)) (8565 11193 (
POST.TILED.SEDIT.GET.WINDOW.REGION 8575 . 9227) (POST.TILED.SEDIT.SAVE.WINDOW.REGION 9229 . 9659) (
TILED.SEDIT.NEW.REGION 9661 . 10831) (TILED.SEDIT.SWITCHFN 10833 . 11191)))))
STOP