(FILECREATED "22-May-85 13:19:48" {PHYLUM}<NOTECARDS>RELEASE1.2>NCGRAPHSUBSTANCE.;6 14237  

      changes to:  (VARS NCGRAPHSUBSTANCECOMS)

      previous date: "13-Mar-85 01:12:20" {PHYLUM}<NOTECARDS>RELEASE1.2>NCGRAPHSUBSTANCE.;5)


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

(PRETTYCOMPRINT NCGRAPHSUBSTANCECOMS)

(RPAQQ NCGRAPHSUBSTANCECOMS ((E (SETQ NC.SystemDate (DATE))
				(UNMARKASCHANGED (QUOTE NC.SystemDate)
						 (QUOTE VARS)))
			     (VARS NC.SystemDate)
			     (P (UNMARKASCHANGED (QUOTE NC.SystemDate)
						 (QUOTE VARS)))
			     (FILES NCTYPESMECH)
			     (GLOBALVARS NC.GraphTitleBarMenu NC.GraphTitleBarMiddleButtonMenu)
			     (FNS NC.BringUpGraphCard NC.CollectRefrencesInGraph NC.GraphCardCloseFn 
				  NC.GraphCardLeftButtonFn NC.GraphCardMiddleButtonFn 
				  NC.GraphCopySubstance NC.MarkGraphDirty NC.GraphDirtyP 
				  NC.GrapherBasedP)
			     (* * Hooks into Grapher for NoteCards applications)
			     (FNS NC.GraphAddNodeFn NC.GraphDeleteNodeFn NC.GraphAddLinkFn 
				  NC.GraphDeleteLinkFn NC.GraphMoveNodeFn NC.GraphFontChangeFn)
			     (* * This stuff supports the "push-copy" method of copying links in NC)
			     (FNS NC.TranslateWindowPositionToGraphPosition NC.InsertLinkInGraph)
			     (* * Add graph substance)
			     (FNS NC.AddGraphSubstance)
			     (P (NC.AddGraphSubstance))))

(RPAQQ NC.SystemDate "22-May-85 13:19:49")
(UNMARKASCHANGED (QUOTE NC.SystemDate)
		 (QUOTE VARS))
(FILESLOAD NCTYPESMECH)
(DECLARE: DOEVAL@COMPILE DONTCOPY

(GLOBALVARS NC.GraphTitleBarMenu NC.GraphTitleBarMiddleButtonMenu)
)
(DEFINEQ

(NC.BringUpGraphCard
  (LAMBDA (ID Substance Region/Position)                     (* fgh: " 4-Feb-85 22:40")

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


    (PROG (Region Title GraphWindow IconWindow)
          (COND
	    ((SETQ GraphWindow (NC.FetchWindow ID))
	      (AND (WINDOWP (WINDOWPROP GraphWindow (QUOTE ICONFOR)))
		   (SETQ GraphWindow (EXPANDW GraphWindow)))
	      (TOTOPW GraphWindow)
	      (RPTQ 2 (FLASHW GraphWindow))
	      (RETURN GraphWindow)))
          (SETQ GraphWindow (SHOWGRAPH Substance (CREATEW (NC.DetermineDisplayRegion ID 
										  Region/Position)
							  (GETPROP ID (QUOTE NoteCardTitle)))
				       (FUNCTION NC.GraphCardLeftButtonFn)
				       (FUNCTION NC.GraphCardMiddleButtonFn)
				       NIL T))
          (NC.SetupTitleBarMenu GraphWindow ID)
          (RETURN GraphWindow))))

(NC.CollectReferencesInGraph
  (LAMBDA (ID CheckAndDeleteFlg DatabaseStream ReturnLinkIconsFlg ReturnLocationsFlg)
                                                             (* fgh: "23-Oct-84 16:18")

          (* * 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.)


    (PROG ((Substance (NC.FetchSubstance ID))
	   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 (NOTECARDLINK DESTINATIONID) of ActualLink)
						 CheckAndDeleteFlg)))
				    ((NC.ValidLinkP ActualLink DatabaseStream))
				    (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)))))))
          (RETURN (CONS Links DirtyFlg)))))

(NC.GraphCardCloseFn
  (LAMBDA (WindowOrID)                                       (* rht: " 9-Feb-85 21:50")
                                                             (* Called when a grapher-based note card is being 
							     closed. Writes graph to database and does other clean 
							     up functions)
    (PROG (Window (ID (NC.CoerceToID WindowOrID)))
          (SETQ Window (NC.FetchWindow ID))
          (AND Window (for AttachedWindow in (ALLATTACHEDWINDOWS Window)
			 do (DETACHWINDOW AttachedWindow)
			    (CLOSEW AttachedWindow)))
          (AND Window (REMOVEPROMPTWINDOW Window))
          (NC.DeactivateCard ID))))

(NC.GraphCardLeftButtonFn
  (LAMBDA (GraphNode GraphWindow)                            (* fgh: "16-Feb-85 00:18")

          (* * 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.)


    (PROG (ID (LinkIcon (fetch (GRAPHNODE NODELABEL) of GraphNode)))
          (AND (NC.LinkIconImageObjP LinkIcon)
	       (COND
		 (NC.SelectionInProgress (AND (SETQ ID (fetch (NOTECARDLINK DESTINATIONID)
							  of (NC.FetchLinkFromLinkIcon LinkIcon)))
					      (NOT (FMEMB ID NC.SelectedCards))
					      (SETQ NC.SelectedCards (CONS ID NC.SelectedCards))))
		 ((KEYDOWNP (QUOTE LSHIFT))
		   (NC.PushCopyLinkIcon LinkIcon GraphWindow)
		   (RETURN NIL))
		 (T (NC.EditNoteCard (fetch (NOTECARDLINK DESTINATIONID) of (NC.FetchLinkFromLinkIcon
									      LinkIcon)))))))))

(NC.GraphCardMiddleButtonFn
  (LAMBDA (GraphNode GraphWindow)                            (* fgh: " 2-Oct-84 18:25")

          (* 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)


    (PROG (ID (LinkIcon (fetch (GRAPHNODE NODELABEL) of GraphNode)))
          (AND (NC.LinkIconImageObjP LinkIcon)
	       (COND
		 (NC.SelectionInProgress (AND (SETQ ID (fetch (NOTECARDLINK DESTINATIONID)
							  of (NC.FetchLinkFromLinkIcon LinkIcon)))
					      (NOT (FMEMB ID NC.SelectedCards))
					      (SETQ NC.SelectedCards (CONS ID NC.SelectedCards))))
		 ((AND NC.SpecialBrowserMiddleButtonFn (EQ (NC.FetchType (NC.IDFromWindow GraphWindow)
									 )
							   (QUOTE BROWSER)))
		   (APPLY* NC.SpecialBrowserMiddleButtonFn GraphNode GraphWindow))
		 (T (NC.LinkIconMiddleButtonFn LinkIcon GraphWindow)))))))

(NC.GraphCopySubstance
  (LAMBDA (ID FromStream ToStream)                           (* fgh: "23-Oct-84 11:43")

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


    (PROG (FromStartPtr FromEndPtr ToEndPtrLoc ToEndPtr ToStartPtr)

          (* * Set up start/end pointers on ToStream)


          (SETQ ToStartPtr (IPLUS (GETFILEPTR ToStream)
				  6))
          (NC.PutPtr ToStream ToStartPtr)
          (SETQ ToEndPtrLoc (GETFILEPTR ToStream))
          (NC.PutPtr ToStream 0)

          (* * Get FromStream start/end pointers)


          (SETQ FromStartPtr (NC.GetPtr FromStream 3))
          (SETQ FromEndPtr (NC.GetPtr FromStream 3))

          (* * Copy the bytes)


          (COPYBYTES FromStream ToStream FromStartPtr FromEndPtr)

          (* * Set up the ned ptr on the ToStream)


          (SETQ ToEndPtr (GETFILEPTR ToStream))
          (SETFILEPTR ToStream ToEndPtrLoc)
          (NC.PutPtr ToStream ToEndPtr)
          (RETURN T))))

(NC.MarkGraphDirty
  (LAMBDA (ID ResetFlg)                                      (* fgh: "24-Oct-84 18:33")

          (* * 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.GrapherBasedP
  (LAMBDA (NoteCardType)                                     (* fgh: "20-Aug-84 01:56")

          (* * Returns T if NoteCardType is a note card type that is based on Grapher or else an ID of such a note card.
	  NIL otherise.)


    (PROG ((GrapherType (QUOTE (GRAPH BROWSER))))
          (RETURN (OR (FMEMB NoteCardType GrapherType)
		      (AND (NC.IDP NoteCardType)
			   (FMEMB (NC.FetchType NoteCardType)
				  GrapherType)))))))
)
(* * Hooks into Grapher for NoteCards applications)

(DEFINEQ

(NC.GraphAddNodeFn
  (LAMBDA (Graph Window)                                     (* fgh: "15-Feb-85 22:40")

          (* * 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 (GraphID (NC.IDFromWindow Window)))
          (RETURN (COND
		    ((NULL (SETQ Link (WINDOWPROP Window (QUOTE NoteCardInsertingLink)
						  NIL)))
		      (NC.MarkCardDirty GraphID)
		      (DEFAULT.ADDNODEFN Graph Window))
		    ((OR (type? NOTECARDLINK Link)
			 (AND (SETQ LinkLabel (NC.AskLinkLabel Window NIL NIL T T))
			      (SETQ Link (NC.MakeLink Window LinkLabel))))
		      (NC.MarkCardDirty GraphID)
		      (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: " 3-Feb-85 23:49")

          (* * Just mark the card as dirty.)


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

(NC.GraphAddLinkFn
  (LAMBDA (From To Graph Window)                             (* rht: " 3-Feb-85 23:49")

          (* * Just mark the card as dirty.)


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

(NC.GraphDeleteLinkFn
  (LAMBDA (From To Graph Window)                             (* rht: " 3-Feb-85 23:50")

          (* * Just mark the card as dirty.)


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

(NC.GraphMoveNodeFn
  (LAMBDA (Node Newpos Graph Window)                         (* rht: " 3-Feb-85 23:45")

          (* * Just mark the card as dirty.)


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

(NC.GraphFontChangeFn
  (LAMBDA (How Node Graph Window)                            (* rht: " 3-Feb-85 23:50")

          (* * Just mark the card as dirty.)


    (PROG ((GraphID (NC.IDFromWindow Window)))
          (NC.MarkCardDirty GraphID))))
)
(* * This stuff supports the "push-copy" method of copying links in NC)

(DEFINEQ

(NC.TranslateWindowPositionToGraphPosition
  (LAMBDA (Window WindowPositionX WindowPositionY)           (* fgh: "15-Feb-85 22:01")
    (create POSITION
	    XCOORD ← WindowPositionX
	    YCOORD ← WindowPositionY)))

(NC.InsertLinkInGraph
  (LAMBDA (GraphWindow Link Position)                        (* fgh: "15-Feb-85 22:50")

          (* * Insert a Link in GraphWindow at Position)


    (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))))
)
(* * Add graph substance)

(DEFINEQ

(NC.AddGraphSubstance
  (LAMBDA NIL                                                (* fgh: "16-Feb-85 00:02")
    (NC.AddSubstanceType (QUOTE GRAPH)
			 (BQUOTE ((CreateSubstanceFn (LAMBDA NIL
						       (create GRAPH)))
				  (EditSubstanceFn , (FUNCTION NC.BringUpGraphCard))
				  (QuitSubstanceFn , (FUNCTION NC.GraphCardCloseFn))
				  (GetSubstanceFn , (FUNCTION NC.GetGraphSubstance))
				  (PutSubstanceFn , (FUNCTION NC.PutGraphSubstance))
				  (CopySubstanceFn , (FUNCTION NC.GraphCopySubstance))
				  (MarkSubstanceDirtyFn , (FUNCTION NC.MarkGraphDirty))
				  (SubstanceDirtyPFn , (FUNCTION NC.GraphDirtyP))
				  (CollectLinksInSubstanceFn , (FUNCTION NC.CollectReferencesInGraph))
				  (DeleteLinksInSubstanceFn , (FUNCTION 
							      NC.DelReferencesToCardFromGraph))
				  (UpdateLinkIconsInSubstanceFn , (FUNCTION 
								  NC.UpdateLinkImagesInGraph))
				  (InsertLinkInSubstanceFn , (FUNCTION NC.InsertLinkInGraph))
				  (TranslateWindowPositionToSubstancePositionFn
				    ,
				    (FUNCTION NC.TranslateWindowPositionToGraphPosition))))
			 (QUOTE ((SubstanceDefaultWidth 300)
				  (SubstanceDefaultHeight 200)
				  (SubstanceLinkAnchorModesSupported T))))))
)
(NC.AddGraphSubstance)
(PUTPROPS NCGRAPHSUBSTANCE COPYRIGHT ("Xerox Corporation" 1985))
(DECLARE: DONTCOPY
  (FILEMAP (NIL (1601 9191 (NC.BringUpGraphCard 1611 . 2630) (NC.CollectReferencesInGraph 2632 . 4217) (
NC.GraphCardCloseFn 4219 . 4933) (NC.GraphCardLeftButtonFn 4935 . 5977) (NC.GraphCardMiddleButtonFn 
5979 . 7009) (NC.GraphCopySubstance 7011 . 8060) (NC.MarkGraphDirty 8062 . 8275) (NC.GraphDirtyP 8277
 . 8682) (NC.GrapherBasedP 8684 . 9189)) (9250 11672 (NC.GraphAddNodeFn 9260 . 10325) (
NC.GraphDeleteNodeFn 10327 . 10595) (NC.GraphAddLinkFn 10597 . 10862) (NC.GraphDeleteLinkFn 10864 . 
11132) (NC.GraphMoveNodeFn 11134 . 11400) (NC.GraphFontChangeFn 11402 . 11670)) (11751 12812 (
NC.TranslateWindowPositionToGraphPosition 11761 . 11987) (NC.InsertLinkInGraph 11989 . 12810)) (12845 
14127 (NC.AddGraphSubstance 12855 . 14125)))))
STOP