(FILECREATED "15-JAN-83 16:03:58" {DSK}GRTREE.LSP;11 7426   

      changes to:  (FNS STRINGDATA-DRAW TREEELEMENT-DRAWIN BOXTYPE-DRAW BOXTYPE-ERASE DRAWRECTANGLE 
			GRAPHICSBOX-DRAWIN GRAPHICSBOX-ERASEIN MATCHTREE RECTANGLESIZE 
			BOXTYPE-SETSIZE GRAPHICSTREE-BOXTYPE GRAPHICSTREE-WIDTH)
		   (VARS GRTREECOMS GRAPHICSBOXTYPES)
		   (PROPS (RECTANGLE SIZEPROGRAM)
			  (RECTANGLE DRAWPROGRAM))

      previous date: "13-JAN-83 10:32:08" {DSK}GRTREE.LSP;1)


(PRETTYCOMPRINT GRTREECOMS)

(RPAQQ GRTREECOMS [(GLISPOBJECTS BOXTYPE GRAPHICSBOX GRAPHICSTREE LISPGRAPHICSTREE LISPNODEDISPLAY 
				 TREEELEMENT)
		   (FNS BOXTYPE-DRAW BOXTYPE-ERASE BOXTYPE-SETSIZE DRAWRECTANGLE GRAPHICSBOX-DRAWIN 
			GRAPHICSBOX-ERASEIN MATCHTREE RECTANGLESIZE STRINGDATA-DRAW 
			TREEELEMENT-DRAWIN)
		   (GLISPGLOBALS GRAPHICSBOXTYPES)
		   (PROP DRAWPROGRAM RECTANGLE)
		   (PROP SIZEPROGRAM RECTANGLE)
		   (VARS GRAPHICSBOXTYPES)
		   (GLOBALVARS GRAPHICSBOXTYPES)
		   (P (LOAD? (QUOTE VECTOR.LSP])


[GLISPOBJECTS


(BOXTYPE

   (ATOM (PROPLIST (DRAWPROGRAM ATOM)
		   (SIZEPROGRAM ATOM)))

   MSG    ((DRAW BOXTYPE-DRAW OPEN T)
	   (ERASE BOXTYPE-ERASE OPEN T)
	   (SETSIZE BOXTYPE-SETSIZE OPEN T))  )

(GRAPHICSBOX

   (LISTOBJECT (BOXTYPE BOXTYPE)
	       (START VECTOR)
	       (SIZE VECTOR)
	       (CONTENTSOFFSET VECTOR)
	       (DISPLAYCONTENTS ANYTHING)
	       (CONTENTSSIZE VECTOR))

   MSG    [(DRAWIN GRAPHICSBOX-DRAWIN OPEN T)
	   (ERASEIN GRAPHICSBOX-ERASEIN OPEN T)
	   (SETSIZE ((SEND BOXTYPE SETSIZE self]

   SUPERS (REGION)  )

(GRAPHICSTREE

   ANYTHING

   PROP   ((BOXTYPE (BOXTYPENAME)
		    RESULT BOXTYPE))

   MSG    ((MAKEGRAPHICSTREE MATCHTREE)
	   (DRAW GRAPHICSTREE-DRAW)
	   (TERMINAL? (self IS TERMINAL)))  )

(LISPGRAPHICSTREE

   (LISTOBJECT (EXPR ANYTHING))

   PROP   ((BOXTYPENAME ((QUOTE RECTANGLE)))
	   [BOXCONTENTS ((IF EXPR IS ATOMIC THEN EXPR ELSE (CAR EXPR]
	   (BOXDISPLAYCONTENTS ((A LISPNODEDISPLAY WITH CONTENTS = BOXCONTENTS)))
	   (SUCCESSORS [(IF EXPR IS ATOMIC THEN NIL ELSE (FOR X IN (CDR EXPR)
							      COLLECT
							      (A LISPGRAPHICSTREE WITH EXPR = X]
		       RESULT
		       (LISTOF LISPGRAPHICSTREE)))

   ADJ    ((TERMINAL (EXPR IS ATOMIC)))

   SUPERS (GRAPHICSTREE)  )

(LISPNODEDISPLAY

   (LISTOBJECT (CONTENTS ANYTHING))

   PROP   [(DISPLAYSIZE ((A VECTOR WITH X = (NCHARS CONTENTS)
			    *8 Y = 12]

   MSG    ((DRAW STRINGDATA-DRAW))  )

(TREEELEMENT

   (LISTOBJECT (BOX GRAPHICSBOX)
	       (ORIGINALNODE ANYTHING)
	       (SUCCESSORS (LISTOF TREEELEMENT))
	       (DISPLAYSIZE VECTOR))

   PROP   ((DISPLAYWIDTH (DISPLAYSIZE:X))
	   (DISPLAYHEIGHT (DISPLAYSIZE:Y)))

   MSG    ((DRAWIN TREEELEMENT-DRAWIN))  )
]

(DEFINEQ

(BOXTYPE-DRAW
  (GLAMBDA (BOXTYPE:BOXTYPE BOX:GRAPHICSBOX W:WINDOW)        (* GSN "14-JAN-83 12:58")
	   (APPLY* BOXTYPE:DRAWPROGRAM BOX (QUOTE PAINT)
		   W)))

(BOXTYPE-ERASE
  (GLAMBDA (BOXTYPE:BOXTYPE BOX:GRAPHICSBOX W:WINDOW)        (* GSN "14-JAN-83 12:58")
	   (APPLY* BOXTYPE:DRAWPROGRAM BOX (QUOTE ERASE)
		   W)))

(BOXTYPE-SETSIZE
  (GLAMBDA (BOXTYPE:BOXTYPE BOX:GRAPHICSBOX)                 (* GSN "14-JAN-83 09:52")
	   (BOX:CONTENTSSIZE _(SEND BOX:DISPLAYCONTENTS DISPLAYSIZE))
	   (APPLY* BOXTYPE:SIZEPROGRAM BOX)))

(DRAWRECTANGLE
  (GLAMBDA (BOX:GRAPHICSBOX DSPOP:ATOM W:WINDOW)             (* GSN "14-JAN-83 13:01")
	   (PROG (OLDDS)
	         (OLDDS _(CURRENTDISPLAYSTREAM W))
	         (DSPOPERATION DSPOP)
	         (MOVETO BOX:LEFT BOX:BOTTOM)
	         (DRAWTO BOX:LEFT BOX:TOP)
	         (DRAWTO BOX:RIGHT BOX:TOP)
	         (DRAWTO BOX:RIGHT BOX:BOTTOM)
	         (DRAWTO BOX:LEFT BOX:BOTTOM)
	         (CURRENTDISPLAYSTREAM OLDDS))))

(GRAPHICSBOX-DRAWIN
  (GLAMBDA (BOX:GRAPHICSBOX W:WINDOW)                        (* GSN "14-JAN-83 12:55")
	   (SEND BOX:BOXTYPE DRAW BOX W)))

(GRAPHICSBOX-ERASEIN
  (GLAMBDA (BOX:GRAPHICSBOX W:WINDOW)                        (* GSN "14-JAN-83 12:55")
	   (SEND BOX:BOXTYPE ERASE BOX W)))

(MATCHTREE
  (GLAMBDA (TR)                                              (* GSN "14-JAN-83 10:46")
                                                             (* Build a TREEELEMENT structure to match the given tree
							     TR.)
	   (RESULT TREEELEMENT)
	   (PROG (TE SUM)
	         [TE _(A TREEELEMENT WITH ORIGINALNODE = TR BOX =(A GRAPHICSBOX WITH BOXTYPE =(SEND
								      TR BOXTYPE)
								    DISPLAYCONTENTS =(SEND TR 
									       BOXDISPLAYCONTENTS))
			 SUCCESSORS =(FOR X IN (SEND TR SUCCESSORS) COLLECT (SEND X MAKEGRAPHICSTREE]
	         (SEND TE:BOX SETSIZE)
	         (TE:DISPLAYWIDTH _(IF (SEND TR TERMINAL?)
				       THEN TE:BOX:WIDTH + 10
				     ELSE (SUM_0)
					  (FOR X IN TE:SUCCESSORS DO SUM_+X:DISPLAYWIDTH)
					  (MAX (TE:BOX:WIDTH + 10)
					       SUM)))
	         [TE:DISPLAYHEIGHT _(IF (SEND TR TERMINAL?)
					THEN TE:BOX:HEIGHT
				      ELSE TE:BOX:HEIGHT + 20 +(APPLY (FUNCTION MAX)
								      (FOR X IN TE:SUCCESSORS
									 COLLECT X:BOX:HEIGHT]
	         (RETURN TE))))

(RECTANGLESIZE
  (GLAMBDA (BOX:GRAPHICSBOX)                                 (* GSN "14-JAN-83 10:28")
	   (BOX:SIZE _ BOX:CONTENTSSIZE +(A VECTOR WITH X = 10 Y = 10))
	   (BOX:CONTENTSOFFSET _(A VECTOR WITH X = 5 Y = 5))))

(STRINGDATA-DRAW
  (GLAMBDA (self:LISPNODEDISPLAY POS:VECTOR W:WINDOW)        (* GSN "14-JAN-83 14:35")
	   (SEND W PRINTAT self:CONTENTS POS)))

(TREEELEMENT-DRAWIN
  [GLAMBDA (TREE:TREEELEMENT AREA:REGION W:WINDOW)           (* GSN "14-JAN-83 14:42")
                                                             (* Draw the subtree beginning with TREE inside area AREA
							     in window W.)
	   (PROG (NEWX NEWY SUM FSPN (TB TREE:BOX))
	         (IF TREE:DISPLAYSIZE>AREA:SIZE
		     THEN (ERROR "Area is too small for tree."))
	         (TB:START _(A VECTOR WITH X =(AREA:LEFT + AREA:RIGHT - TB:SIZE:X)/2 Y = AREA:TOP - 
			       TB:SIZE:Y))
	         (SEND TB DRAWIN W)
	         (SEND TB:DISPLAYCONTENTS DRAW TB:START+TB:CONTENTSOFFSET W)
                                                             (* Now compute positions for successors of top node.)
	         (IF TREE:SUCCESSORS
		     THEN (NEWY _ AREA:TOP - TB:SIZE:Y - 20)
			  (SUM_0)
			  (FOR S IN TREE:SUCCESSORS DO SUM_+S:DISPLAYSIZE:X) 
                                                             (* Calculate free space for each box.)
			  (FSPN _(AREA:SIZE:X - SUM)/(LENGTH SUCCESSORS))
			  (NEWX _ AREA:START:X + FSPN/2)     (* Draw each subtree.)
			  (FOR S IN TREE:SUCCESSORS
			     DO                              (* Draw arc to new subtree.)
				(SEND W DRAWLINE TB:BOTTOMCENTER
				      (A VECTOR WITH X = NEWX+S:DISPLAYSIZE:X/2 Y = NEWY))
				(SEND S DRAWIN
				      (AN AREA WITH START =(A VECTOR WITH X = NEWX Y = AREA:START:Y)
					  SIZE =(A VECTOR WITH X = S:DISPLAYSIZE:X Y = NEWY - 
						   AREA:START:Y))
				      W)
				(NEWX_+S:DISPLAYSIZE:X+FSPN])
)


[GLISPGLOBALS

(GRAPHICSBOXTYPES   (LISTOF BOXTYPE)  )
]


(PUTPROPS RECTANGLE DRAWPROGRAM DRAWRECTANGLE)

(PUTPROPS RECTANGLE SIZEPROGRAM RECTANGLESIZE)

(RPAQQ GRAPHICSBOXTYPES (RECTANGLE))
(DECLARE: DOEVAL@COMPILE DONTCOPY

(ADDTOVAR GLOBALVARS GRAPHICSBOXTYPES)
)
(LOAD? (QUOTE VECTOR.LSP))
(DECLARE: DONTCOPY
  (FILEMAP (NIL (2714 7091 (BOXTYPE-DRAW 2724 . 2892) (BOXTYPE-ERASE 2894 . 3063) (BOXTYPE-SETSIZE 3065
 . 3278) (DRAWRECTANGLE 3280 . 3715) (GRAPHICSBOX-DRAWIN 3717 . 3867) (GRAPHICSBOX-ERASEIN 3869 . 4021
) (MATCHTREE 4023 . 5126) (RECTANGLESIZE 5128 . 5358) (STRINGDATA-DRAW 5360 . 5512) (
TREEELEMENT-DRAWIN 5514 . 7089)))))
STOP
