(FILECREATED "11-Feb-85 14:37:45" {PHYLUM}<NOTECARDS>RELEASE1.1>LIBRARY>NCSCREEN.;6 12871  

      changes to:  (FNS SCREEN.LayoutCardsInSurround SCREEN.SurroundCardWithFileBoxContents)

      previous date: " 4-Jan-85 02:39:32" {PHYLUM}<NOTECARDS>RELEASE1.1>LIBRARY>NCSCREEN.;5)


(* Copyright (c) 1984, 1985 by Xerox Corporation. All rights reserved.)

(PRETTYCOMPRINT NCSCREENCOMS)

(RPAQQ NCSCREENCOMS ((* Functions for laying out cards on the screen.)
		     (FNS SCREEN.LayoutCardsInSquare SCREEN.LayoutCardsInCascade 
			  SCREEN.GetCascadePosition SCREEN.LayoutCardsInSurround 
			  SCREEN.SurroundCardWithFileBoxContents SCREEN.RegroupClusterCards 
			  SCREEN.MoveCardToPos SCREEN.MoveWinToPos SCREEN.WinLLCorner 
			  SCREEN.WinShrinkAndPlace SCREEN.WinLRCorner SCREEN.WinULCorner 
			  SCREEN.WinURCorner)
		     (VARS (SCREEN.CascadeXSpace 3)
			   (SCREEN.CascadeYSpace 8))
		     (GLOBALVARS SCREEN.CascadeXSpace SCREEN.CascadeYSpace)))



(* Functions for laying out cards on the screen.)

(DEFINEQ

(SCREEN.LayoutCardsInSquare
  (LAMBDA (StartPos Cards)                                   (* rht: " 3-Jan-85 01:07")

          (* * Layout the windows of Cards in a square with the upper left corner of the mess at StartPos.)


    (PROG ((NumCards (LENGTH Cards))
	   NumCols)
          (SETQ NumCols (FIX (SQRT NumCards)))
          (for Card in Cards
	     bind (Pos ← StartPos)
		  (Col ← 1)
		  NextRowPos Win
	     do (SCREEN.MoveCardToPos Card Pos)
		(SETQ Win (NCP.CardWindow Card))
		(if (EQ Col 1)
		    then (SETQ NextRowPos (SCREEN.WinLLCorner Win)))
		(if (EQ Col NumCols)
		    then (SETQ Col 1)
			 (SETQ Pos NextRowPos)
		  else (SETQ Col (ADD1 Col))
		       (SETQ Pos (SCREEN.WinURCorner Win)))
	     finally (GIVE.TTY.PROCESS Win)))))

(SCREEN.LayoutCardsInCascade
  (LAMBDA (StartPos Cards)                                   (* rht: " 3-Jan-85 19:54")

          (* * Layout the windows of Cards in a cascaded, overlapping deck with the upper left corner of the mess at 
	  StartPos.)


    (for Card in Cards bind (Pos ← StartPos)
			    Win
       when (NCP.ValidCard Card)
       do (SCREEN.MoveCardToPos Card Pos)
	  (SETQ Win (NCP.CardWindow Card))
	  (SETQ Pos (SCREEN.GetCascadePosition Win))
	  (GIVE.TTY.PROCESS Win))))

(SCREEN.GetCascadePosition
  (LAMBDA (Window)                                           (* rht: " 3-Jan-85 19:52")

          (* * Returns the position near the upper left corner of Window to place the next window in a cascade.)


    (PROG ((Pos (SCREEN.WinULCorner Window))
	   (Region (WINDOWPROP Window (QUOTE REGION))))
          (RETURN (create POSITION
			  XCOORD ←(IPLUS (fetch (POSITION XCOORD) of Pos)
					 (WINDOWPROP Window (QUOTE BORDER))
					 SCREEN.CascadeXSpace)
			  YCOORD ←(IDIFFERENCE (IPLUS (fetch (REGION HEIGHT) of Region)
						      (fetch (REGION BOTTOM) of Region))
					       (IPLUS (FONTPROP WindowTitleDisplayStream
								(QUOTE HEIGHT))
						      SCREEN.CascadeYSpace)))))))

(SCREEN.LayoutCardsInSurround
  (LAMBDA (CenterCard Cards)                                 (* rht: "11-Feb-85 11:48")

          (* * Arrange the given Cards around the CenterCard CenterCard. Returns the number of cards displayed.)


    (PROG (CenterRegion CenterWindow (RemainingCards Cards))
          (SETQ CenterWindow (OR (NCP.CardWindow CenterCard)
				 (NCP.BringUpCard CenterCard)))
          (SETQ CenterRegion (WINDOWPROP CenterWindow (QUOTE REGION)))
          (for bind Card Window (Pos ←(SCREEN.WinURCorner CenterWindow))
		    Region
		    (RemainingEdge ←(fetch (REGION HEIGHT) of CenterRegion))
	     until (OR (MINUSP RemainingEdge)
		       (NULL RemainingCards))
	     do (SETQ Card (CAR RemainingCards))
		(SETQ RemainingCards (CDR RemainingCards))
		(SCREEN.MoveCardToPos Card Pos (QUOTE UL))
		(SETQ Pos (SCREEN.WinLLCorner (SETQ Window (NCP.CardWindow Card))))
		(SETQ RemainingEdge (IDIFFERENCE RemainingEdge (fetch (REGION HEIGHT)
								  of (WINDOWREGION Window)))))
          (AND (NULL RemainingCards)
	       (RETURN (GIVE.TTY.PROCESS CenterWindow)))
          (for bind Card Window (Pos ←(SCREEN.WinULCorner CenterWindow))
		    Region
		    (RemainingEdge ←(fetch (REGION HEIGHT) of CenterRegion))
	     until (OR (MINUSP RemainingEdge)
		       (NULL RemainingCards))
	     do (SETQ Card (CAR RemainingCards))
		(SETQ RemainingCards (CDR RemainingCards))
		(SCREEN.MoveCardToPos Card Pos (QUOTE UR))
		(SETQ Pos (SCREEN.WinLRCorner (SETQ Window (NCP.CardWindow Card))))
		(SETQ RemainingEdge (IDIFFERENCE RemainingEdge (fetch (REGION HEIGHT)
								  of (WINDOWREGION Window)))))
          (AND (NULL RemainingCards)
	       (RETURN (GIVE.TTY.PROCESS CenterWindow)))
          (for bind Card Window (Pos ←(SCREEN.WinLLCorner CenterWindow))
		    Region
		    (RemainingEdge ←(fetch (REGION WIDTH) of CenterRegion))
	     until (OR (MINUSP RemainingEdge)
		       (NULL RemainingCards))
	     do (SETQ Card (CAR RemainingCards))
		(SETQ RemainingCards (CDR RemainingCards))
		(SCREEN.MoveCardToPos Card Pos (QUOTE UL))
		(SETQ Pos (SCREEN.WinURCorner (SETQ Window (NCP.CardWindow Card))))
		(SETQ RemainingEdge (IDIFFERENCE RemainingEdge (fetch (REGION WIDTH)
								  of (WINDOWREGION Window)))))
          (GIVE.TTY.PROCESS CenterWindow)
          (RETURN (IDIFFERENCE (LENGTH Cards)
			       (LENGTH RemainingCards))))))

(SCREEN.SurroundCardWithFileBoxContents
  (LAMBDA (Card Box)                                         (* rht: "11-Feb-85 14:34")

          (* * Layout the children of Box around Card. If either arg is not present, ask user to select.)


    (PROG (Selection FileBoxChildren NumberOfChildren NumberDisplayed)
          (COND
	    ((AND (NULL Card)
		  (NULL Box))
	      (NCP.PrintMsg NIL T "Select center card and a filebox." (CHARACTER 13))
	      (OR (SETQ Selection (NCP.SelectCards))
		  (RETURN))
	      (SETQ Card (CAR Selection))
	      (SETQ Box (CADR Selection)))
	    ((NULL Card)
	      (NCP.PrintMsg NIL T "Select center card.")
	      (OR (SETQ Card (CAR (NCP.SelectCards)))
		  (RETURN)))
	    ((NULL Box)
	      (NCP.PrintMsg NIL T "Select FileBox.")
	      (OR (SETQ Box (CAR (NCP.SelectCards)))
		  (RETURN))))
          (SETQ FileBoxChildren (NCP.FileBoxChildren Box))
          (SETQ NumberOfChildren (LENGTH FileBoxChildren))
          (SETQ NumberDisplayed (SCREEN.LayoutCardsInSurround Card FileBoxChildren))
          (if (ILESSP NumberDisplayed NumberOfChildren)
	      then (NC.PrintMsg NIL T "Only able to display " NumberDisplayed " out of " 
				NumberOfChildren " total cards." (CHARACTER 13))))))

(SCREEN.RegroupClusterCards
  (LAMBDA (ClusterCard)                                      (* rht: "27-Nov-84 12:12")

          (* * Shrink ClusterCard and pull the children of ClusterCard over under it.)


    (PROG (ShrunkWin)
          (if (SETQ ShrunkWin (CLUSTER.WinShrinkAndPlace (NCP.CardWindow ClusterCard)))
	      then (SCREEN.LayoutCardsInCascade (SCREEN.WinLLCorner ShrunkWin)
						(REVERSE (NCP.CardProp ClusterCard (QUOTE 
										  ClusterChildren))))
	    else (NCP.BringUpCard ClusterCard)))))

(SCREEN.MoveCardToPos
  (LAMBDA (Card Pos Corner)                                  (* rht: " 4-Jan-85 01:54")

          (* * Move a card's window such that its upper left corner is at Pos.)


    (PROG (Win)
          (if (NOT (SETQ Win (NCP.CardWindow Card)))
	      then (SETQ Win (NCP.BringUpCard Card (create POSITION
							   XCOORD ←(fetch (REGION WIDTH)
								      of WHOLESCREEN)
							   YCOORD ←(fetch (REGION HEIGHT)
								      of WHOLESCREEN)))))
          (SCREEN.MoveWinToPos Win Pos Corner))))

(SCREEN.MoveWinToPos
  (LAMBDA (Win Pos Corner)                                   (* rht: " 4-Jan-85 01:54")

          (* * Move a window such that its upper left corner is at Pos. Then possibly move it again to make sure it's all on 
	  the screen. Corner, if present, should be one of the litatoms UL, LL, UR, LR signifying which corner of the card 
	  should wind up at position Pos. Corner defaults to UL.)


    (PROG ((Region (WINDOWREGION Win)))
          (SELECTQ Corner
		   (LL (MOVEW Win (fetch (POSITION XCOORD) of Pos)
			      (fetch (POSITION YCOORD) of Pos)))
		   (UR (MOVEW Win (IDIFFERENCE (fetch (POSITION XCOORD) of Pos)
					       (fetch (REGION WIDTH) of Region))
			      (IDIFFERENCE (fetch (POSITION YCOORD) of Pos)
					   (fetch (REGION HEIGHT) of Region))))
		   (LR (MOVEW Win (IDIFFERENCE (fetch (POSITION XCOORD) of Pos)
					       (fetch (REGION WIDTH) of Region))
			      (fetch (POSITION YCOORD) of Pos)))
		   (MOVEW Win (fetch (POSITION XCOORD) of Pos)
			  (IDIFFERENCE (fetch (POSITION YCOORD) of Pos)
				       (fetch (REGION HEIGHT) of Region))))
          (SETQ Region (MAKEWITHINREGION (COPY (WINDOWREGION Win))
					 WHOLESCREEN))
          (RETURN (MOVEW Win (fetch (REGION LEFT) of Region)
			 (fetch (REGION BOTTOM) of Region))))))

(SCREEN.WinLLCorner
  (LAMBDA (Win)                                              (* rht: "30-Oct-84 19:29")

          (* * Return the position of the lower left corner of Win.)


    (PROG ((Region (WINDOWREGION Win)))
          (RETURN (create POSITION
			  XCOORD ←(fetch (REGION LEFT) of Region)
			  YCOORD ←(fetch (REGION BOTTOM) of Region))))))

(SCREEN.WinShrinkAndPlace
  (LAMBDA (Win)                                              (* rht: "27-Nov-84 12:14")

          (* * Shrink the given window, if not already shrunk, and place in the upper left corner of Win.)


    (PROG (ShrunkWin (WinULCorner (SCREEN.WinULCorner Win)))
          (RETURN (if (AND Win (SETQ ShrunkWin (SHRINKW Win NIL (create POSITION
									XCOORD ←(fetch (REGION WIDTH)
										   of WHOLESCREEN)
									YCOORD ←(fetch (REGION HEIGHT)
										   of WHOLESCREEN)))))
		      then (SCREEN.MoveWinToPos ShrunkWin WinULCorner)
			   ShrunkWin
		    else Win)))))

(SCREEN.WinLRCorner
  (LAMBDA (Win)                                              (* rht: "30-Oct-84 19:30")

          (* * Return the position of the lower right corner of Win.)


    (PROG ((Region (WINDOWREGION Win)))
          (RETURN (create POSITION
			  XCOORD ←(IPLUS (fetch (REGION LEFT) of Region)
					 (fetch (REGION WIDTH) of Region))
			  YCOORD ←(fetch (REGION BOTTOM) of Region))))))

(SCREEN.WinULCorner
  (LAMBDA (Win)                                              (* rht: "30-Oct-84 19:30")

          (* * Return the position of the upper left corner of Win.)


    (PROG ((Region (WINDOWREGION Win)))
          (RETURN (create POSITION
			  XCOORD ←(fetch (REGION LEFT) of Region)
			  YCOORD ←(IPLUS (fetch (REGION BOTTOM) of Region)
					 (fetch (REGION HEIGHT) of Region)))))))

(SCREEN.WinURCorner
  (LAMBDA (Win)                                              (* rht: "30-Oct-84 19:30")

          (* * Return the position of the upper right corner of Win.)


    (PROG ((Region (WINDOWREGION Win)))
          (RETURN (create POSITION
			  XCOORD ←(IPLUS (fetch (REGION LEFT) of Region)
					 (fetch (REGION WIDTH) of Region))
			  YCOORD ←(IPLUS (fetch (REGION BOTTOM) of Region)
					 (fetch (REGION HEIGHT) of Region)))))))
)

(RPAQQ SCREEN.CascadeXSpace 3)

(RPAQQ SCREEN.CascadeYSpace 8)
(DECLARE: DOEVAL@COMPILE DONTCOPY

(GLOBALVARS SCREEN.CascadeXSpace SCREEN.CascadeYSpace)
)
(PUTPROPS NCSCREEN COPYRIGHT ("Xerox Corporation" 1984 1985))
(DECLARE: DONTCOPY
  (FILEMAP (NIL (1020 12623 (SCREEN.LayoutCardsInSquare 1030 . 1910) (SCREEN.LayoutCardsInCascade 1912
 . 2469) (SCREEN.GetCascadePosition 2471 . 3280) (SCREEN.LayoutCardsInSurround 3282 . 6038) (
SCREEN.SurroundCardWithFileBoxContents 6040 . 7438) (SCREEN.RegroupClusterCards 7440 . 8016) (
SCREEN.MoveCardToPos 8018 . 8603) (SCREEN.MoveWinToPos 8605 . 10120) (SCREEN.WinLLCorner 10122 . 10517
) (SCREEN.WinShrinkAndPlace 10519 . 11190) (SCREEN.WinLRCorner 11192 . 11647) (SCREEN.WinULCorner 
11649 . 12104) (SCREEN.WinURCorner 12106 . 12621)))))
STOP