(FILECREATED " 8-Jun-87 18:23:32" {QV}<NOTECARDS>1.3K>NEXT>NCGRAPHCARD.;44 44479  

      changes to:  (FNS NC.GraphDeleteNodeFn NC.AddGraphCard)

      previous date: "24-Apr-87 14:27:26" {QV}<NOTECARDS>1.3K>NEXT>NCGRAPHCARD.;43)


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

(PRETTYCOMPRINT NCGRAPHCARDCOMS)

(RPAQQ NCGRAPHCARDCOMS ([DECLARE: COPY FIRST (P (NC.LoadFileFromDirectories (QUOTE GRAPHER)
									      (QUOTE 
									     LISPUSERSDIRECTORIES))
						  (NC.LoadFileFromDirectories (QUOTE GRAPHERPATCH]
	(FILES NCTYPESMECH)
	(GLOBALVARS NC.GraphCardIcon NC.ShrunkenGraphIconBM NC.ShrunkenGraphIconMask 
		    NC.ShrunkenGraphIconTemplate NC.UseDeletedLinkIconIndicatorsFlg TEDIT.ICON.FONT)
	[VARS (ScalableLinkParameters (QUOTE (LINEWIDTH]
	(* * Basic functions.)
	(FNS NC.MakeGraphCard NC.BringUpGraphCard NC.RelayoutGraphCard NC.CollectReferencesInGraph 
	     NC.GraphCardCloseFn NC.GraphCardLeftButtonFn NC.GraphCardMiddleButtonFn 
	     NC.GraphCopySubstance NC.MarkGraphDirty NC.GraphDirtyP NC.GraphNodeLinkIconUpdate 
	     NC.GetGraphSubstance NC.PutGraphSubstance NC.UpdateLinkImagesInGraph 
	     NC.DelReferencesToCardFromGraph)
	(* * Hooks into Grapher for NoteCards applications)
	(FNS NC.GRAPHERCOPYBUTTONEVENTFN NC.InsideGrapherNodeP NC.GraphAddNodeFn NC.GraphDeleteNodeFn 
	     NC.GraphAddLinkFn NC.GraphDeleteLinkFn NC.GraphMoveNodeFn NC.GraphFontChangeFn 
	     NC.GraphRemoveNode NC.TrackCursorInGrapherWindow)
	(* * This stuff supports the "push-copy" method of copying links in NC)
	(FNS NC.TranslateWindowPositionToGraphPosition NC.InsertLinkInGraph)
	(* * Stuff for shrinking graphs and browsers.)
	(BITMAPS NC.ShrunkenGraphIconBM NC.ShrunkenGraphIconMask NC.GraphCardIcon)
	(FNS NC.GraphCardShrinkFn)
	[VARS (NC.ShrunkenGraphIconTemplate (create TITLEDICON ICON ← NC.ShrunkenGraphIconBM MASK ← 
						    NC.ShrunkenGraphIconMask TITLEREG ←
						    (QUOTE (16 4 64 77]
	(* * Stuff for making copies of graphs for making imageobj's.)
	(FNS NC.MakeExternalGraphCopy)
	(* * Add the Graph card to the cardtypes list.)
	(FNS NC.AddGraphCard)
	(P (NC.AddGraphCard))
	(FNS NCAddStub.GraphCard)))
(DECLARE: COPY FIRST 
(NC.LoadFileFromDirectories (QUOTE GRAPHER)
			    (QUOTE LISPUSERSDIRECTORIES))
(NC.LoadFileFromDirectories (QUOTE GRAPHERPATCH))
)
(FILESLOAD NCTYPESMECH)
(DECLARE: DOEVAL@COMPILE DONTCOPY

(GLOBALVARS NC.GraphCardIcon NC.ShrunkenGraphIconBM NC.ShrunkenGraphIconMask 
	    NC.ShrunkenGraphIconTemplate NC.UseDeletedLinkIconIndicatorsFlg TEDIT.ICON.FONT)
)

(RPAQQ ScalableLinkParameters (LINEWIDTH))
(* * Basic functions.)

(DEFINEQ

(NC.MakeGraphCard
  [LAMBDA (Card Title NoDisplayFlg)                          (* Randy.Gobbel "10-Dec-86 16:57")

          (* * Creates a StructEdit card. Alot like a graph card except that it allows editing of underlying NC structure, 
	  and doesn't allow an "insertlink" operation in title bar menu.)



          (* * fgh 11/14/85 Updated to handle Card object.)



          (* * rht 5/5/86: Replaced call to NC.SetupTitleBarMenu with Install calls.)



          (* * fgh 6/30/86 Added NC.GRAPHERCOPYBUTTONEVENTFN to SHOWGRAPH call)



          (* * rht 9/19/86: Mod to above fix. Now calls NC.MakeNewCardWindow a new fn that creates window and hangs Card off 
	  windowprop.)


    (LET (Window Graph CardType)
         (SETQ Graph (create GRAPH
				 GRAPH.ADDNODEFN ← (FUNCTION NC.GraphAddNodeFn)
				 GRAPH.DELETENODEFN ← (FUNCTION NC.GraphDeleteNodeFn)
				 GRAPH.ADDLINKFN ← (FUNCTION NC.GraphAddLinkFn)
				 GRAPH.DELETELINKFN ← (FUNCTION NC.GraphDeleteLinkFn)
				 GRAPH.MOVENODEFN ← (FUNCTION NC.GraphMoveNodeFn)
				 GRAPH.FONTCHANGEFN ← (FUNCTION NC.GraphFontChangeFn)))
         (NC.SetSubstance Card Graph)
         (COND
	   ((NOT NoDisplayFlg)
	     (SETQ Window (NC.MakeNewCardWindow Card (OR Title "Untitled")))
	     (SETQ CardType (NC.RetrieveType Card))
	     (SHOWGRAPH Graph Window (FUNCTION NC.GraphCardLeftButtonFn)
			  (FUNCTION NC.GraphCardMiddleButtonFn)
			  T T (FUNCTION NC.GRAPHERCOPYBUTTONEVENTFN))
	     (WINDOWADDPROP Window (QUOTE SHRINKFN)
			      (FUNCTION NC.GraphCardShrinkFn))
	     (NC.InstallTitleBarButtonEventFn Window (FUNCTION NC.TitleBarButtonEventFn))
	     (NC.InstallTitleBarLeftMenu Window CardType)
	     (NC.InstallTitleBarMiddleMenu Window CardType)))
         (OR Window Card])

(NC.BringUpGraphCard
  [LAMBDA (Card Substance RegionOrPosition)                  (* Randy.Gobbel "10-Dec-86 16:57")

          (* * Given a graph (or browser) Substance, open a grapher (browser) window and set it up to be a NoteCard with ID.)



          (* * fgh 11/14/85 Updated to handle Card object.)



          (* * rht 5/5/86: Now calls NC.InstallTitleBarButtonEventFn, NC.InstallTitleBarLeftMenu, and 
	  NC.InstallTitleBarMiddleMenu instead of NC.SetupTitleBarMenu.)



          (* * fgh 6/30/86 Added NC.GRAPHERCOPYBUTTONEVENTFN to SHOWGRAPH call)



          (* * rht 11/16/86: Now moves window to RegionOrPosition if already up.)


    (LET (Region Title GraphWindow IconWindow CardType)
         (COND
	   ((SETQ GraphWindow (NC.FetchWindow Card))
	     (AND (WINDOWP (WINDOWPROP GraphWindow (QUOTE ICONFOR)))
		    (SETQ GraphWindow (EXPANDW GraphWindow)))
	     (TOTOPW GraphWindow)
	     (if RegionOrPosition
		 then (SHAPEW GraphWindow (NC.DetermineDisplayRegion Card RegionOrPosition)))
	     (RPTQ 2 (FLASHW GraphWindow)))
	   (T (SETQ GraphWindow (SHOWGRAPH Substance (CREATEW (NC.DetermineDisplayRegion
								      Card RegionOrPosition)
								    (NC.RetrieveTitle Card))
					       (FUNCTION NC.GraphCardLeftButtonFn)
					       (FUNCTION NC.GraphCardMiddleButtonFn)
					       NIL T (FUNCTION NC.GRAPHERCOPYBUTTONEVENTFN)))
	      (SETQ CardType (NC.RetrieveType Card))
	      (WINDOWADDPROP GraphWindow (QUOTE SHRINKFN)
			       (FUNCTION NC.GraphCardShrinkFn))
	      (NC.InstallTitleBarButtonEventFn GraphWindow (FUNCTION NC.TitleBarButtonEventFn))
	      (NC.InstallTitleBarLeftMenu GraphWindow CardType)
	      (NC.InstallTitleBarMiddleMenu GraphWindow CardType)))
     GraphWindow])

(NC.RelayoutGraphCard
  [LAMBDA (Win)                                              (* Randy.Gobbel " 4-Mar-87 14:24")

          (* * Relayout the graph by making roots out of all nodes without FROMNODES.)



          (* * rht 8/15/86: Now uses proper COPYBUTTONEVENTFN in the SHOWGRAPH call.)



          (* * rht 11/1/86: Added NC.ProtectedCardOperation wrapper and check for ops in progress.)



          (* * rg 3/4/87 rewritten for new version of NC.ProtectedCardOperation)


    (LET ((Card (NC.CoerceToCard Win)))
         (NC.ProtectedCardOperation Card "Relayout Graph Card" NIL
				    (LET ((Graph (WINDOWPROP Win (QUOTE GRAPH)))
					  GraphNodes)
				         (if (SETQ GraphNodes (fetch (GRAPH GRAPHNODES)
								     of Graph))
					     then
					      (SETQ Graph
						(LAYOUTGRAPH
						  GraphNodes
						  (OR (for Node in GraphNodes
							   when (NULL (fetch (GRAPHNODE 
											FROMNODES)
									     of Node))
							   collect (fetch (GRAPHNODE NODEID)
									of Node))
							(fetch (GRAPHNODE NODEID)
							   of (CAR GraphNodes)))
						  (QUOTE Lattice)))
					      (replace (GRAPH GRAPH.ADDNODEFN) of Graph
						 with (FUNCTION NC.GraphAddNodeFn))
					      (replace (GRAPH GRAPH.DELETENODEFN) of Graph
						 with (FUNCTION NC.GraphDeleteNodeFn))
					      (replace (GRAPH GRAPH.ADDLINKFN) of Graph
						 with (FUNCTION NC.GraphAddLinkFn))
					      (replace (GRAPH GRAPH.DELETELINKFN) of Graph
						 with (FUNCTION NC.GraphDeleteLinkFn))
					      (replace (GRAPH GRAPH.MOVENODEFN) of Graph
						 with (FUNCTION NC.GraphMoveNodeFn))
					      (replace (GRAPH GRAPH.FONTCHANGEFN) of Graph
						 with (FUNCTION NC.GraphFontChangeFn))
					      (SHOWGRAPH Graph Win (FUNCTION 
							     NC.GraphCardLeftButtonFn)
							   (FUNCTION NC.GraphCardMiddleButtonFn)
							   NIL T (FUNCTION 
							     NC.GRAPHERCOPYBUTTONEVENTFN))
					      (NC.InstallTitleBarButtonEventFn
						Win
						(FUNCTION NC.TitleBarButtonEventFn])

(NC.CollectReferencesInGraph
  (LAMBDA (Card CheckAndDeleteFlg ReturnLinkIconsFlg ReturnLocationsFlg)
                                                             (* fgh: "17-Nov-85 16:20")

          (* * Return a list of all links or link icons in graph substance Substance. If CheckAndDeleteFlg, then delete any 
	  links found that are not valid links.)



          (* * fgh 11/14/85 Updated to handle Card object.)


    (LET ((Substance (NC.FetchSubstance Card))
	  ActualLink DirtyFlg Links LinkIcon CollectItem)
         (SETQ Links (for GraphNode in (fetch (GRAPH GRAPHNODES) of Substance)
			  when (COND
				   ((NC.LinkIconImageObjP (SETQ LinkIcon (fetch (GRAPHNODE
											NODELABEL)
										of GraphNode)))
				     (SETQ ActualLink (NC.FetchLinkFromLinkIcon LinkIcon))
				     (COND
				       ((NULL CheckAndDeleteFlg))
				       ((AND (LISTP CheckAndDeleteFlg)
					       (FMEMB (fetch (Link DestinationCard) of 
										       ActualLink)
							CheckAndDeleteFlg)))
				       ((NC.ValidLinkP ActualLink))
				       (T (replace (GRAPHNODE NODELABEL) of GraphNode
					     with NC.DeletedLinkImageObject)
					  (SETQ DirtyFlg T)
					  NIL)))
				   (T NIL))
			  collect (PROGN (SETQ CollectItem (COND
						 (ReturnLinkIconsFlg LinkIcon)
						 (T ActualLink)))
					     (COND
					       ((NULL ReturnLocationsFlg)
						 CollectItem)
					       (T (CONS CollectItem (fetch (GRAPHNODE NODELABEL)
									 of GraphNode)))))))
         (CONS Links DirtyFlg))))

(NC.GraphCardCloseFn
  [LAMBDA (CardIdentifier)                                   (* rht: "16-Oct-86 16:56")
                                                             (* Called when a grapher-based note card is being 
							     closed. Writes graph to database and does other clean 
							     up functions)

          (* * fgh 11/14/85 Updated to handle Card object.)



          (* * rht 10/16/86: Removed call to NC.DeactivateCard.)


    (LET (Window (Card (NC.CoerceToCard CardIdentifier)))
         (SETQ Window (NC.FetchWindow Card))
         (AND Window (for AttachedWindow in (ALLATTACHEDWINDOWS Window)
			  do (DETACHWINDOW AttachedWindow)
			       (CLOSEW AttachedWindow)))
         (AND Window (REMOVEPROMPTWINDOW Window])

(NC.GraphCardLeftButtonFn
  [LAMBDA (GraphNode GraphWindow)                            (* Randy.Gobbel "14-Nov-86 16:42")

          (* * If this is a node containing a link icon, then do: IF Selection in progress, then pressing a node gets its 
	  destination ID if its actually a note card node. Otherwise, bring up the note card pointed to by the node.)



          (* * fgh 11/14/85 Updated to handle Card object.)



          (* * fgh 11/14/85 Isn't this obsolete??????)



          (* * rht&pmi 11/14/86: No longer does stupid pushcopy stuff.)


    (LET ((LinkIcon (fetch (GRAPHNODE NODELABEL) of GraphNode)))
         (if [AND (NC.LinkIconImageObjP LinkIcon)
		      (NOT (OR (KEYDOWNP (QUOTE LSHIFT))
				   (KEYDOWNP (QUOTE RSHIFT))
				   (KEYDOWNP (QUOTE CTRL))
				   (KEYDOWNP (QUOTE COPY))
				   (KEYDOWNP (QUOTE DELETE))
				   (KEYDOWNP (QUOTE MOVE]
	     then (NC.EditNoteCard (fetch (Link DestinationCard) of (
									 NC.FetchLinkFromLinkIcon
									      LinkIcon)))
	   else NIL])

(NC.GraphCardMiddleButtonFn
  [LAMBDA (GraphNode GraphWindow)                            (* Randy.Gobbel "14-Nov-86 16:42")

          (* IF Selection in progress, then pressing a node gets its destination ID if its actually a note card node.
	  Otherwise, jump to normal button processing for an link icon)



          (* * fgh 11/14/85 Updated to handle Card object.)



          (* * fgh 11/14/85 Isn't this obsolete????????)



          (* * rht&pmi 11/14/86: No longer does stupid NC.SpecialBrowserMiddleButtonFn stuff.)


    (LET ((LinkIcon (fetch (GRAPHNODE NODELABEL) of GraphNode)))
         (if [AND (NC.LinkIconImageObjP LinkIcon)
		      (NOT (OR (KEYDOWNP (QUOTE LSHIFT))
				   (KEYDOWNP (QUOTE RSHIFT))
				   (KEYDOWNP (QUOTE CTRL))
				   (KEYDOWNP (QUOTE COPY))
				   (KEYDOWNP (QUOTE DELETE))
				   (KEYDOWNP (QUOTE MOVE]
	     then (NC.LinkIconMiddleButtonFn LinkIcon GraphWindow)
	   else NIL])

(NC.GraphCopySubstance
  (LAMBDA (Card FromStream ToStream Length)                  (* rht: "23-Jan-86 12:12")

          (* * Copy a graph substance from FromStream to ToStream.)



          (* * fgh 11/14/85 Updated to handle Card object.)



          (* * fgh 11/20/85 NoteCards now handles the start and end ptrs -- passing the from ptrs as args and properly 
	  setting the to ptrs.)



          (* * fgh 11/21/85 Now passes length instead of start and end ptrs.)



          (* * Copy the bytes)


    (LET* ((FromStartPtr (GETFILEPTR FromStream))
	   (FromEndPtr (PLUS Length FromStartPtr)))
          (COPYBYTES FromStream ToStream FromStartPtr FromEndPtr))
    T))

(NC.MarkGraphDirty
  (LAMBDA (Card ResetFlg)                                    (* fgh: "14-Nov-85 21:25")

          (* * Mark or unmark graph as having been changed -- Sorry no can do!!!)


    NIL))

(NC.GraphDirtyP
  (LAMBDA (Graph)                                            (* rht: " 1-Feb-85 15:39")

          (* * A graph is always considered to be dirty since we can't tell whether its changed or not.)



          (* * rht 2/1/85: For now we can't tell by looking at graph substance whether we're dirty or not.
	  Leave it up to the SubstanceDirtyFlg on the card.)


    NIL))

(NC.GraphNodeLinkIconUpdate
  [LAMBDA (Window GraphNode)                                 (* rht: " 6-Feb-87 15:56")

          (* * Check whether the image box size agrees with graphnode size. If not, update graph node.
	  REDISPLAYW should eventually happen to the graph after calling this.)



          (* * rht&pmi 2/6/87: Now includes BorderSize in calculation of graph node label size. This is important for virtual
	  nodes.)


    (LET ((LinkIcon (fetch (GRAPHNODE NODELABEL) of GraphNode))
	  [BorderSize (TIMES 2 (GRAPHNODE/BORDER/WIDTH (fetch (GRAPHNODE NODEBORDER)
							      of GraphNode]
	  (GraphNodeWidth (fetch (GRAPHNODE NODEWIDTH) of GraphNode))
	  (GraphNodeHeight (fetch (GRAPHNODE NODEHEIGHT) of GraphNode))
	  ImageBox XSize YSize)
         (if (NC.LinkIconImageObjP LinkIcon)
	     then [SETQ ImageBox (NC.LinkIconImageBoxFn LinkIcon (WINDOWPROP Window
										     (QUOTE DSP]
		    (SETQ XSize (fetch (IMAGEBOX XSIZE) of ImageBox))
		    (SETQ YSize (fetch (IMAGEBOX YSIZE) of ImageBox))
		    (if [AND GraphNodeWidth (NOT (EQUAL XSize (DIFFERENCE GraphNodeWidth 
										    BorderSize]
			then (replace (GRAPHNODE NODEWIDTH) of GraphNode
				  with (PLUS XSize BorderSize)))
		    (if [AND GraphNodeHeight (NOT (EQUAL YSize (DIFFERENCE GraphNodeHeight 
										     BorderSize]
			then (replace (GRAPHNODE NODEHEIGHT) of GraphNode
				  with (PLUS YSize BorderSize])

(NC.GetGraphSubstance
  (LAMBDA (Card Length Stream VersionNum)                    (* fgh: "25-May-86 18:04")

          (* * Read the Graph)



          (* * fgh 11/14/85 Updated to handle Card object.)



          (* * fgh 11/20/85 NoteCards now passes start and end ptrs down.)



          (* * fgh 11/21/85 Now passes length instead of start and end ptrs.)



          (* * rht 1/23/86: Now takes Stream as arg instead of computing from Card.)



          (* * rht 2/7/86: Now uses READGRAPH instead of HREAD)



          (* * rht 2/28/86: Added special handling for old version -1 style. I.e. pre 1.3k.)



          (* * fgh 5/1/86 Can't have negative version numbers, so changed old style versions to be 255.0)



          (* * fgh 5/25/86 Undid preceeding change. Turns out -1 never came from file only passed as Arg from converter.)


    (if (EQP VersionNum -1)
	then (HREAD Stream)
      else (READGRAPH Stream))))

(NC.PutGraphSubstance
  (LAMBDA (Card Stream)                                      (* rht: "14-Feb-86 18:09")
                                                             (* Put Graph in card ID onto DatabaseStream)

          (* * fgh 11/14/85 Updated to handle Card object.)



          (* * fgh 11/20/85 NoteCards now takes care of setting the start and end pointers for the substance.)



          (* * rht 1/23/86: Now takes Stream as arg instead of computing from Card.)



          (* * fgh 2/6/86 Now returns a version number)



          (* * rht 2/7/86: Now uses DUMPGRAPH rather than HPRINT)


    (LET ((Graph (NC.FetchSubstance Card)))                (* Clean up BITMAPS in Graph data structure)
         (for GraphNode in (fetch GRAPHNODES of Graph) do (replace (GRAPHNODE 
										  NODELABELBITMAP)
								       of GraphNode with NIL))
                                                             (* Write data stucture)
         (DUMPGRAPH Graph Stream)
     0)))

(NC.UpdateLinkImagesInGraph
  (LAMBDA (SourceCard DestinationCard)                       (* rht: "20-Feb-86 16:44")
                                                             (* Update all the NoteCard links that point to 
							     DestinationID from the graph card specified by 
							     SourceCardID)

          (* * rht 2/15/85: Added hack to redraw links into and out of the affected node. This is in case it has changed 
	  size. Note the calls to internal grapher functions!)



          (* * rht 10/3/85: Threw away above mentioned code. It was screwing up the link-params info for the affected nodes.)



          (* * fgh 11/17/85 Updated to handle card object.)


    (LET (Window Graph GraphNodes LinkIcon OldAddLinkFn OldDeleteLinkFn)
         (SETQ Window (NC.FetchWindow SourceCard))
         (SETQ Graph (NC.FetchSubstance SourceCard))
         (for GraphNode in (SETQ GraphNodes (fetch (GRAPH GRAPHNODES) of Graph))
	    when (AND (NC.LinkIconImageObjP (SETQ LinkIcon (fetch (GRAPHNODE NODELABEL)
								      of GraphNode)))
			  (NC.SameCardP DestinationCard (fetch (Link DestinationCard)
							     of (NC.FetchLinkFromLinkIcon 
											 LinkIcon))))
	    do                                             (* Update the size of the graph node if doesn't agree 
							     with image box.)
		 (NC.GraphNodeLinkIconUpdate Window GraphNode))
         (REDISPLAYW Window))))

(NC.DelReferencesToCardFromGraph
  [LAMBDA (SourceCard LinkOrDestinationCard Don'tCreateDeletedImageObjFlg)
                                                             (* rht: " 4-Nov-86 20:58")
                                                             (* Delete from the graph specified by Graph all link 
							     icon nodes whose DESTINATIONID is eq to DestinationID)

          (* * rht 11/17/84: Now only redisplays graph if ID is both active *and* has a window.)



          (* * kirk 14Nov85: deleted use of LinkID)



          (* * rht 4/30/86: Now uses value of NC.UseDeletedLinkIconIndicators to determine whether to delete node or replace 
	  with Deleted indicator.)



          (* * rht 11/4/86: Now takes Don'tCreateDeletedImageObjFlg arg.)


    (DECLARE (GLOBALVARS NC.UseDeletedLinkIconIndicatorsFlg NC.DeletedLinkImageObject))
    (LET ((ImageBox (NC.DeletedLinkImageBoxFn NC.DeletedLinkImageObject))
	  LinkIcon
	  (LinkFlg (type? Link LinkOrDestinationCard))
	  DestinationCard Graph)
         (COND
	   [LinkFlg (OR (NC.CardP SourceCard)
			  (SETQ SourceCard (fetch (Link SourceCard) of LinkOrDestinationCard]
	   (T (SETQ DestinationCard LinkOrDestinationCard)))
         (SETQ Graph (NC.FetchSubstance SourceCard))
         (for GraphNode in (fetch (GRAPH GRAPHNODES) of Graph)
	    when [AND (NC.LinkIconImageObjP (SETQ LinkIcon (fetch (GRAPHNODE NODELABEL)
								      of GraphNode)))
			  (COND
			    (LinkFlg (NC.SameLinkP LinkOrDestinationCard (NC.FetchLinkFromLinkIcon
						       LinkIcon)))
			    (T (NC.SameCardP (fetch (Link DestinationCard) of (
									 NC.FetchLinkFromLinkIcon
										      LinkIcon))
					       DestinationCard]
	    do (if (AND NC.UseDeletedLinkIconIndicatorsFlg (NOT Don'tCreateDeletedImageObjFlg)
			      )
		     then (replace (GRAPHNODE NODELABEL) of GraphNode with 
									NC.DeletedLinkImageObject)
			    (replace (GRAPHNODE NODEWIDTH) of GraphNode
			       with (fetch (IMAGEBOX XSIZE) of ImageBox))
			    (replace (GRAPHNODE NODEHEIGHT) of GraphNode
			       with (fetch (IMAGEBOX YSIZE) of ImageBox))
		   else (NC.GraphRemoveNode GraphNode Graph (NC.FetchWindow SourceCard)
						T)))
         (COND
	   ((AND (NC.ActiveCardP SourceCard)
		   (NC.FetchWindow SourceCard))
	     (REDISPLAYGRAPH (NC.FetchWindow SourceCard])
)
(* * Hooks into Grapher for NoteCards applications)

(DEFINEQ

(NC.GRAPHERCOPYBUTTONEVENTFN
  (LAMBDA (Window)                                           (* rht: "15-Jul-86 18:12")

          (* * Handle a COPYBUTTONEVENT in a NC Grapher window. If the button is down over a node and the TTY PROCESS is a 
	  selecting cards process, process it as such, otherwise do the standard grapher copy button event fn of 
	  copyinserting he whole graph.)



          (* * fgh 6/30/86 First created.)



          (* * rht 7/15/86: Now calls NC.MakeExternalGraphCopy to smash NC links.)


    (LET ((Graph (WINDOWPROP Window (QUOTE GRAPH)))
	  InNode PositionAndLastState TTYWindow (Position (CONS 0 0)))
         (if (NOT (AND (WINDOWP (SETQ TTYWindow (PROCESSPROP (TTY.PROCESS)
									 (QUOTE WINDOW))))
			     (WINDOWPROP TTYWindow (QUOTE SelectingCards))))
	     then 

          (* * The current TTY PROCESS is not a selecting cards process -- insert a copy of the graph with the nc links 
	  smashed.)


		    (COPYINSERT (GRAPHEROBJ (NC.MakeExternalGraphCopy Graph)))
	   else 

          (* * We want to handle this special for NoteCards to allow shift-select of link icons in the graph)



          (* * First track the cursor until its let up)


		  (SETQ PositionAndLastState (NC.TrackCursorInGrapherWindow Window Graph)) 

          (* * Cursor up -- determine what to do)


		  (if (NULL (CAR PositionAndLastState))
		      then 

          (* * Let up outside the window -- get out of here)


			     NIL
		    else 

          (* * Find the node the mouse was when the buttons were let up -- if any)


			   (SETQ InNode (for GraphNode in (fetch (GRAPH GRAPHNODES)
								   of Graph)
					     thereis (NC.InsideGrapherNodeP
							 (PROGN (replace (POSITION XCOORD)
								     of Position
								     with (LASTMOUSEX Window))
								  (replace (POSITION YCOORD)
								     of Position
								     with (LASTMOUSEY Window))
								  Position)
							 GraphNode)))
			   (if (OR (NULL InNode)
				       (NULL (NC.LinkIconImageObjP (fetch (GRAPHNODE NODELABEL)
									  of InNode))))
			       then 

          (* * Let up innside the window, but not in a node. Or the Node is not a LinkIcon node. Do the standard COPYINSERTFN
	  for GRAPHER)


				      (COPYINSERT (GRAPHEROBJ (NC.MakeExternalGraphCopy Graph)))
			     else 

          (* * Let up inside a node, must want to select it.)


				    (COPYINSERT (fetch (GRAPHNODE NODELABEL) of InNode))))))))

(NC.InsideGrapherNodeP
  [LAMBDA (Position Node)                                    (* Randy.Gobbel "19-Nov-86 14:31")

          (* * Is position inside of graphernode Node)



          (* * fgh 6/30/86 First created.)



          (* * rg 11/19/86 Bug fix: Node was being referred to as GraphNode)


    (LET ((Left (GN/LEFT Node))
	  (Bottom (GN/BOTTOM Node)))
         (AND (GEQ (fetch (POSITION XCOORD) of Position)
		       Left)
		(LEQ (fetch (POSITION XCOORD) of Position)
		       (PLUS Left (fetch (GRAPHNODE NODEWIDTH) of Node)))
		(GEQ (fetch (POSITION YCOORD) of Position)
		       Bottom)
		(LEQ (fetch (POSITION YCOORD) of Position)
		       (PLUS Bottom (fetch (GRAPHNODE NODEHEIGHT) of Node)))
		Node])

(NC.GraphAddNodeFn
  (LAMBDA (Graph Window)                                     (* fgh: "18-Nov-85 00:19")

          (* * Add a node, normal or link, to a graph)



          (* * rht 11/9/84: Now checks result of NC.MakeLink before building link.)


    (PROG (LinkLabel Link (GraphCard (NC.CoerceToCard Window)))
	    (RETURN (COND
			((NULL (SETQ Link (WINDOWPROP Window (QUOTE NoteCardInsertingLink)
							    NIL)))
			  (NC.MarkCardDirty GraphCard)
			  (DEFAULT.ADDNODEFN Graph Window))
			((OR (type? Link Link)
			       (AND (SETQ LinkLabel (NC.AskLinkLabel Window NIL NIL T T))
				      (SETQ Link (NC.MakeLink Window LinkLabel))))
			  (NC.MarkCardDirty GraphCard)
			  (NODECREATE (for bind NodeID unless (FASSOC (SETQ NodeID
										  (GENSYM))
										(fetch
										  (GRAPH GRAPHNODES)
										   of Graph))
					   do (RETURN NodeID))
					(NC.MakeLinkIcon Link)
					(CURSORPOSITION NIL Window))))))))

(NC.GraphDeleteNodeFn
  [LAMBDA (Node Graph Window)                                (* rht: "13-May-87 12:32")

          (* * Just mark the card as dirty.)



          (* * rht 4/30/86: Now makes sure there's a window first.)



          (* * rht 5/13/87: Now deletes link if node is a link icon.)


    (LET ((GraphNodeLabel (fetch (GRAPHNODE NODELABEL) of Node)))
         (AND Window (NC.MarkCardDirty (NC.CoerceToCard Window)))
         (if (NC.LinkIconImageObjP GraphNodeLabel)
	     then (NC.DeleteLink (NC.FetchLinkFromLinkIcon GraphNodeLabel)
				     NIL T])

(NC.GraphAddLinkFn
  (LAMBDA (From To Graph Window)                             (* rht: "15-Nov-85 16:05")

          (* * Just mark the card as dirty.)


    (PROG ((GraphID (NC.CoerceToCard Window)))
	    (NC.MarkCardDirty GraphID))))

(NC.GraphDeleteLinkFn
  (LAMBDA (From To Graph Window)                             (* rht: "30-Apr-86 15:04")

          (* * Just mark the card as dirty.)



          (* * rht 4/30/86: Now makes sure there's a window first.)


    (AND Window (NC.MarkCardDirty (NC.CoerceToCard Window)))))

(NC.GraphMoveNodeFn
  (LAMBDA (Node Newpos Graph Window)                         (* rht: "15-Nov-85 16:05")

          (* * Just mark the card as dirty.)


    (PROG ((GraphID (NC.CoerceToCard Window)))
	    (NC.MarkCardDirty GraphID))))

(NC.GraphFontChangeFn
  (LAMBDA (How Node Graph Window)                            (* rht: "15-Nov-85 16:05")

          (* * Just mark the card as dirty.)


    (PROG ((GraphID (NC.CoerceToCard Window)))
	    (NC.MarkCardDirty GraphID))))

(NC.GraphRemoveNode
  (LAMBDA (Node Graph Window QuietFlg)                       (* rht: "30-Apr-86 16:19")

          (* * Remove this node from the graph. This code taken from Grapher's EDITDELETENODE)



          (* * rht 4/30/86: Added QuietFlg and other minor fixes.)


    (for ToNode in (TOLINKS Node) bind OtherNode
       do                                                  (* Undisplay links.)
	    (SETQ OtherNode (GETNODEFROMID (if (EQ (CAR ToNode)
							   LINKPARAMS)
						   then (CADR ToNode)
						 else ToNode)
					       (fetch (GRAPH GRAPHNODES) of Graph)))
	    (AND Window (NC.DisplayGraphLinksBetween Node OtherNode Window Graph))
	    (GRAPHDELETELINK Node OtherNode Graph Window))
    (for FromNode in (FROMLINKS Node) bind OtherNode
       do                                                  (* Undisplay links.)
	    (SETQ OtherNode (GETNODEFROMID (if (EQ (CAR FromNode)
							   LINKPARAMS)
						   then (CADR FromNode)
						 else FromNode)
					       (fetch (GRAPH GRAPHNODES) of Graph)))
	    (AND Window (NC.DisplayGraphLinksBetween OtherNode Node Window Graph))
	    (GRAPHDELETELINK OtherNode Node Graph Window))
    (AND Window (DISPLAYNODE Node (CONSTANT (create POSITION
							    XCOORD ← 0
							    YCOORD ← 0))
				 Window Graph))
    (GRAPHDELETENODE Node Graph Window)
    (OR QuietFlg (NC.PrintMsg NIL T "Node " (fetch (GRAPHNODE NODELABEL) of Node)
				  " removed."))
    Node))

(NC.TrackCursorInGrapherWindow
  (LAMBDA (Window Graph)                                     (* fgh: "30-Jun-86 13:44")

          (* * Follow the cursor around a graph window inverting nodes that its in until the mouse buttons are let up.)



          (* * fgh 6/30/86 First created.)


    (LET (Buttons NewInNode InNode (Position (CONS 0 0))
		  (DS (WINDOWPROP Window (QUOTE DSP))))
         (until (MOUSESTATE UP)
	    do 

          (* * Track the cursor until the mouse is up)


		 (SETQ Buttons LASTMOUSEBUTTONS)
		 (SETQ InNode NewInNode) 

          (* * Figure out if in a node)


		 (SETQ NewInNode (for GraphNode in (fetch (GRAPH GRAPHNODES) of Graph)
				      thereis (NC.InsideGrapherNodeP (PROGN
									   (replace (POSITION
											XCOORD)
									      of Position
									      with (LASTMOUSEX
										       Window))
									   (replace (POSITION
											YCOORD)
									      of Position
									      with (LASTMOUSEY
										       Window))
									   Position)
									 GraphNode)))

          (* * Uninvert the old node, invert the new node.)


		 (if (NEQ InNode NewInNode)
		     then (AND InNode (FLIPNODE InNode DS))
			    (AND NewInNode (FLIPNODE NewInNode DS))))

          (* * Univert anything that needs it)


         (AND NewInNode (FLIPNODE NewInNode DS))

          (* * Return a record of the mouse location at button up and the last mouse button that were dowen before let up)


         (CONS (CONS (LASTMOUSEX Window)
			 (LASTMOUSEY Window))
		 Buttons))))
)
(* * This stuff supports the "push-copy" method of copying links in NC)

(DEFINEQ

(NC.TranslateWindowPositionToGraphPosition
  (LAMBDA (Card Window WindowPositionX WindowPositionY)      (* fgh: " 6-Feb-86 22:15")

          (* * fgh 2/6/86 Added Card argument.)


    (create POSITION
	      XCOORD ← WindowPositionX
	      YCOORD ← WindowPositionY)))

(NC.InsertLinkInGraph
  (LAMBDA (Card GraphWindow Link Position)                   (* fgh: " 6-Feb-86 22:14")

          (* * Insert a Link in GraphWindow at Position)



          (* * fgh 2/6/86 Added Card argument)


    (PROG (Node (Graph (WINDOWPROP GraphWindow (QUOTE GRAPH))))
	    (WINDOWPROP GraphWindow (QUOTE NoteCardInsertingLink)
			  Link)
	    (OR (SETQ Node (GRAPHADDNODE Graph GraphWindow))
		  (RETURN))
	    (replace (GRAPHNODE NODEPOSITION) of Node with Position)
	    (MEASUREGRAPHNODE Node)
	    (PRINTDISPLAYNODE Node (CONSTANT (create POSITION
							   XCOORD ← 0
							   YCOORD ← 0))
				GraphWindow
				(DSPCLIPPINGREGION NIL GraphWindow))
	    (WINDOWPROP GraphWindow (QUOTE NoteCardInsertingLink)
			  NIL))))
)
(* * Stuff for shrinking graphs and browsers.)


(RPAQ NC.ShrunkenGraphIconBM (READBITMAP))
(87 95
"AOOOOOOOOOOOOOOOOOOOOL@@"
"GOOOOOOOOOOOOOOOOOOOOL@@"
"OKMHOHNCHNCHNCHNCHNCHN@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"ONJJCLGALGALGALGALGALF@@"
"LOOOOOOOOOOOOOOOOOOOON@@"
"LCOJCLGALGALGALGALGALF@@"
"L@OOOOOOOOOOOOOOOOOOON@@"
"L@COOOOOOOOOOOOOOOOOON@@"
"L@@NGALGALGALGALGALGAL@@"
"L@@GOCLOCLOCLOCLOCLOCN@@"
"L@@ANAHFAHFAHFAHFAHFAN@@"
"LCH@L@@@@@@@@@@@@@@@@N@@"
"LCH@L@@@@@@@@@@@@@@@@N@@"
"LCH@L@@@@@@@@@@@@@@@@N@@"
"LCH@L@@@@@@@@@@@@@@@@N@@"
"LCH@L@@@@@@@@@@@@@@@@N@@"
"LCH@L@@@@@@@@@@@@@@@@N@@"
"LCH@L@@@@@@@@@@@@@@@@N@@"
"LCH@L@@@@@@@@@@@@@@@@N@@"
"LCH@L@@@@@@@@@@@@@@@@N@@"
"LCH@L@@@@@@@@@@@@@@@@N@@"
"LCH@L@@@@@@@@@@@@@@@@N@@"
"LCH@L@@@@@@@@@@@@@@@@N@@"
"LCH@L@@@@@@@@@@@@@@@@N@@"
"LCH@L@@@@@@@@@@@@@@@@N@@"
"LA@@L@@@@@@@@@@@@@@@@N@@"
"L@H@L@@@@@@@@@@@@@@@@N@@"
"L@D@L@@@@@@@@@@@@@@@@N@@"
"L@B@L@@@@@@@@@@@@@@@@N@@"
"L@B@L@@@@@@@@@@@@@@@@N@@"
"MLGHL@@@@@@@@@@@@@@@@N@@"
"MLGHL@@@@@@@@@@@@@@@@N@@"
"MLGHL@@@@@@@@@@@@@@@@N@@"
"MLGHL@@@@@@@@@@@@@@@@N@@"
"MLGHL@@@@@@@@@@@@@@@@N@@"
"MLGHL@@@@@@@@@@@@@@@@N@@"
"MLGHL@@@@@@@@@@@@@@@@N@@"
"MLGHL@@@@@@@@@@@@@@@@N@@"
"MLGHL@@@@@@@@@@@@@@@@N@@"
"MLGHL@@@@@@@@@@@@@@@@N@@"
"MLGHL@@@@@@@@@@@@@@@@N@@"
"MLGHL@@@@@@@@@@@@@@@@N@@"
"MLGHL@@@@@@@@@@@@@@@@N@@"
"MLGHL@@@@@@@@@@@@@@@@N@@"
"LHB@L@@@@@@@@@@@@@@@@N@@"
"LHB@L@@@@@@@@@@@@@@@@N@@"
"LDD@L@@@@@@@@@@@@@@@@N@@"
"LDD@L@@@@@@@@@@@@@@@@N@@"
"LBH@L@@@@@@@@@@@@@@@@N@@"
"LBH@L@@@@@@@@@@@@@@@@N@@"
"LA@@L@@@@@@@@@@@@@@@@N@@"
"LA@@L@@@@@@@@@@@@@@@@N@@"
"LGINL@@@@@@@@@@@@@@@@N@@"
"LGINL@@@@@@@@@@@@@@@@N@@"
"LGINL@@@@@@@@@@@@@@@@N@@"
"LGINL@@@@@@@@@@@@@@@@N@@"
"LGINL@@@@@@@@@@@@@@@@N@@"
"LGINL@@@@@@@@@@@@@@@@N@@"
"LGINL@@@@@@@@@@@@@@@@N@@"
"LGINL@@@@@@@@@@@@@@@@N@@"
"LGINL@@@@@@@@@@@@@@@@N@@"
"LGINL@@@@@@@@@@@@@@@@N@@"
"LGINL@@@@@@@@@@@@@@@@N@@"
"LGINL@@@@@@@@@@@@@@@@N@@"
"LGINL@@@@@@@@@@@@@@@@N@@"
"LGINL@@@@@@@@@@@@@@@@N@@"
"LB@DL@@@@@@@@@@@@@@@@N@@"
"LA@DL@@@@@@@@@@@@@@@@N@@"
"LA@HL@@@@@@@@@@@@@@@@N@@"
"L@HHL@@@@@@@@@@@@@@@@N@@"
"L@HHL@@@@@@@@@@@@@@@@N@@"
"L@E@L@@@@@@@@@@@@@@@@N@@"
"L@E@L@@@@@@@@@@@@@@@@N@@"
"L@B@L@@@@@@@@@@@@@@@@N@@"
"L@G@L@@@@@@@@@@@@@@@@N@@"
"L@G@L@@@@@@@@@@@@@@@@N@@"
"L@G@L@@@@@@@@@@@@@@@@N@@"
"L@G@L@@@@@@@@@@@@@@@@N@@"
"L@G@L@@@@@@@@@@@@@@@@N@@"
"L@G@L@@@@@@@@@@@@@@@@N@@"
"L@G@L@@@@@@@@@@@@@@@@N@@"
"L@G@L@@@@@@@@@@@@@@@@N@@"
"L@G@L@@@@@@@@@@@@@@@@N@@"
"N@G@L@@@@@@@@@@@@@@@@N@@"
"O@G@L@@@@@@@@@@@@@@@@N@@"
"GHG@L@@@@@@@@@@@@@@@@N@@"
"CLG@L@@@@@@@@@@@@@@@@N@@"
"AN@@L@@@@@@@@@@@@@@@@N@@"
"@O@@L@@@@@@@@@@@@@@@@N@@"
"@GH@L@@@@@@@@@@@@@@@@N@@"
"@CL@L@@@@@@@@@@@@@@@@N@@"
"@AN@OOOOOOOOOOOOOOOOON@@"
"@@OOOOOOOOOOOOOOOOOOON@@"
"@@COOOOOOOOOOOOOOOOOON@@")

(RPAQ NC.ShrunkenGraphIconMask (READBITMAP))
(87 95
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"OOOOOOOOOOOOOOOOOOOOON@@"
"GOOOOOOOOOOOOOOOOOOOON@@"
"COOOOOOOOOOOOOOOOOOOON@@"
"AOOOOOOOOOOOOOOOOOOOON@@"
"@OOOOOOOOOOOOOOOOOOOON@@"
"@GOOOOOOOOOOOOOOOOOOON@@"
"@COOOOOOOOOOOOOOOOOOON@@"
"@AOOOOOOOOOOOOOOOOOOON@@"
"@@OOOOOOOOOOOOOOOOOOON@@"
"@@COOOOOOOOOOOOOOOOOON@@")

(RPAQ NC.GraphCardIcon (READBITMAP))
(21 18
"OOOOOH@@"
"H@@@@H@@"
"H@@@@H@@"
"H@N@@H@@"
"H@J@@H@@"
"HAJ@@H@@"
"HBO@@H@@"
"HD@KHH@@"
"KH@FHH@@"
"JH@BHH@@"
"JH@CHH@@"
"KL@@@H@@"
"HBN@@H@@"
"HAJ@@H@@"
"H@J@@H@@"
"H@N@@H@@"
"H@@@@H@@"
"OOOOOH@@")
(DEFINEQ

(NC.GraphCardShrinkFn
  [LAMBDA (W)                                                (* Randy.Gobbel "19-Nov-86 15:02")

          (* * Check to make sure that icon's title agrees with card title. If not, retitle the icon.
	  If this is first shrink then create a new icon and fill in title.)



          (* * rg 11/19/86 Added GLOBALVARS declaration)


    (DECLARE (GLOBALVARS TEDIT.ICON.FONT NC.ShrunkenGraphIconTemplate))
    (LET ((OldIconTitle (WINDOWPROP W (QUOTE GRAPH.ICON.TITLE)))
	  (Icon (WINDOWPROP W (QUOTE ICON)))
	  (Card (NC.CoerceToCard W))
	  IconTitle BM IconTemplate BMHeight BMHalfHeight TitleRegion)
         (SETQ IconTitle (CONCAT "NC: " (NC.RetrieveTitle Card)))
         [COND
	   ((NOT Icon)
	     (WINDOWPROP W (QUOTE ICON)
			   (SETQ Icon (TITLEDICONW NC.ShrunkenGraphIconTemplate IconTitle 
						       TEDIT.ICON.FONT NIL T]
         (COND
	   ((NOT (EQUAL OldIconTitle IconTitle))
	     (WINDOWPROP W (QUOTE GRAPH.ICON.TITLE)
			   IconTitle)
	     (ICONTITLE IconTitle TitleRegion NIL Icon])
)

(RPAQ NC.ShrunkenGraphIconTemplate (create TITLEDICON ICON ← NC.ShrunkenGraphIconBM MASK ← 
					     NC.ShrunkenGraphIconMask TITLEREG ←
					     (QUOTE (16 4 64 77))))
(* * Stuff for making copies of graphs for making imageobj's.)

(DEFINEQ

(NC.MakeExternalGraphCopy
  (LAMBDA (Graph)                                            (* rht: "24-Mar-86 15:50")

          (* * Make a copy of Graph in which each link icon nodelabel has been replaced by a copy of itself and MoveNodeFn, 
	  etc. are replaced by NIL.)



          (* * rht 3/24/86: Now creates new graphnodes via "using" instead of "copying" to preserve EQness of UIDs.)


    (create GRAPH
	      DIRECTEDFLG ← (fetch (GRAPH DIRECTEDFLG) of Graph)
	      SIDESFLG ← (fetch (GRAPH SIDESFLG) of Graph)
	      GRAPHNODES ← (for GraphNode in (fetch (GRAPH GRAPHNODES) of Graph)
				bind Box NewNode Label
				collect (LET (NewLinkIcon)
					       (PROG1 (SETQ NewNode
							  (create GRAPHNODE
							     using
							      GraphNode NODELABEL ←
							      (if (NC.LinkIconImageObjP
								      (SETQ Label
									(fetch (GRAPHNODE NODELABEL)
									   of GraphNode)))
								  then (SETQ NewLinkIcon
									   (NC.LinkIconCopyFn
									     Label))
								else (COPY Label))))
							(if NewLinkIcon
							    then (SETQ Box
								     (
								 NC.ExternalPutLinkIconImageBoxFn
								       NewLinkIcon NIL NIL NIL))
								   (replace (GRAPHNODE NODEHEIGHT)
								      of NewNode
								      with (fetch (IMAGEBOX
											YSIZE)
										of Box))
								   (replace (GRAPHNODE NODEWIDTH)
								      of NewNode
								      with (fetch (IMAGEBOX
											XSIZE)
										of Box)))))))))
)
(* * Add the Graph card to the cardtypes list.)

(DEFINEQ

(NC.AddGraphCard
  [LAMBDA NIL                                                (* pmi: "26-May-87 10:59")

          (* * fgh 11/14/85: Updated to conform to merge of substance and card types.)



          (* * fgh 2/17/86 Added attached bitmap field.)



          (* * rht 4/7/86: Added middle button menu items.)



          (* * pmi 5/26/87: Changed default card size as requested by Cathy Marshall.)


    (NC.AddCardType (QUOTE Graph)
		      (QUOTE NoteCard)
		      [BQUOTE ((MakeFn , (FUNCTION NC.MakeGraphCard))
				 (EditFn , (FUNCTION NC.BringUpGraphCard))
				 (QuitFn , (FUNCTION NC.GraphCardCloseFn))
				 (GetFn , (FUNCTION NC.GetGraphSubstance))
				 (PutFn , (FUNCTION NC.PutGraphSubstance))
				 (CopyFn , (FUNCTION NC.GraphCopySubstance))
				 (MarkDirtyFn , (FUNCTION NC.MarkGraphDirty))
				 (DirtyPFn , (FUNCTION NC.GraphDirtyP))
				 (CollectLinksFn , (FUNCTION NC.CollectReferencesInGraph))
				 (DeleteLinksFn , (FUNCTION NC.DelReferencesToCardFromGraph))
				 (UpdateLinkIconsFn , (FUNCTION NC.UpdateLinkImagesInGraph))
				 (InsertLinkFn , (FUNCTION NC.InsertLinkInGraph))
				 (TranslateWindowPositionFn , (FUNCTION 
							NC.TranslateWindowPositionToGraphPosition]
		      (BQUOTE ((LinkDisplayMode Title)
				 (DisplayedInMenuFlg , T)
				 (DefaultWidth 500)
				 (DefaultHeight 330)
				 (LinkAnchorModesSupported T)
				 (LinkIconAttachedBitMap , NC.GraphCardIcon)
				 (MiddleButtonMenuItems , (QUOTE ((Relayout% Graph
								       (FUNCTION 
									 NC.RelayoutGraphCard)
								       
						      "Re-layout the graph, but keep same nodes."])
)
(NC.AddGraphCard)
(DEFINEQ

(NCAddStub.GraphCard
  [LAMBDA NIL                                                (* rht: " 7-Nov-86 16:33")

          (* * kirk 18Jun86 Add the Graph card stub)



          (* * rht 11/7/86: Fixed typo, changing a QUOTE to BQUOTE.)


    (DECLARE (GLOBALVARS NC.GraphCardIcon))
    (NC.AddCardTypeStub (QUOTE Graph)
			  (QUOTE NoteCard)
			  (QUOTE NCGRAPHCARD)
			  NIL
			  (BQUOTE ((DisplayedInMenuFlg T)
				     (LinkIconAttachedBitMap , NC.GraphCardIcon])
)
(PUTPROPS NCGRAPHCARD COPYRIGHT ("Xerox Corporation" 1985 1986 1987))
(DECLARE: DONTCOPY
  (FILEMAP (NIL (2635 22473 (NC.MakeGraphCard 2645 . 4535) (NC.BringUpGraphCard 4537 . 6426) (
NC.RelayoutGraphCard 6428 . 8651) (NC.CollectReferencesInGraph 8653 . 10313) (NC.GraphCardCloseFn 
10315 . 11134) (NC.GraphCardLeftButtonFn 11136 . 12278) (NC.GraphCardMiddleButtonFn 12280 . 13317) (
NC.GraphCopySubstance 13319 . 14040) (NC.MarkGraphDirty 14042 . 14255) (NC.GraphDirtyP 14257 . 14662) 
(NC.GraphNodeLinkIconUpdate 14664 . 16270) (NC.GetGraphSubstance 16272 . 17272) (NC.PutGraphSubstance 
17274 . 18342) (NC.UpdateLinkImagesInGraph 18344 . 19878) (NC.DelReferencesToCardFromGraph 19880 . 
22471)) (22532 32277 (NC.GRAPHERCOPYBUTTONEVENTFN 22542 . 25260) (NC.InsideGrapherNodeP 25262 . 26102)
 (NC.GraphAddNodeFn 26104 . 27175) (NC.GraphDeleteNodeFn 27177 . 27806) (NC.GraphAddLinkFn 27808 . 
28068) (NC.GraphDeleteLinkFn 28070 . 28389) (NC.GraphMoveNodeFn 28391 . 28652) (NC.GraphFontChangeFn 
28654 . 28917) (NC.GraphRemoveNode 28919 . 30564) (NC.TrackCursorInGrapherWindow 30566 . 32275)) (
32356 33503 (NC.TranslateWindowPositionToGraphPosition 32366 . 32659) (NC.InsertLinkInGraph 32661 . 
33501)) (39037 40183 (NC.GraphCardShrinkFn 39047 . 40181)) (40429 42090 (NC.MakeExternalGraphCopy 
40439 . 42088)) (42145 43847 (NC.AddGraphCard 42155 . 43845)) (43866 44387 (NCAddStub.GraphCard 43876
 . 44385)))))
STOP