(DEFINE-FILE-INFO PACKAGE "IL" READTABLE "INTERLISP" BASE 10)
(FILECREATED "14-Oct-88 17:11:35" {QV}<NOTECARDS>1.3MNEXT>NCGRAPHCARD.;2 68109  

      changes to%:  (VARS NCGRAPHCARDCOMS)

      previous date%: "11-Oct-88 16:21:52" {QV}<NOTECARDS>1.3LNEXT>NCGRAPHCARD.;8)


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

(PRETTYCOMPRINT NCGRAPHCARDCOMS)

(RPAQQ NCGRAPHCARDCOMS
       ([DECLARE%: DONTEVAL@LOAD FIRST (P (NC.LoadFileFromDirectories 'GRAPHER 'LISPUSERSDIRECTORIES)
                                          (NC.LoadFileFromDirectories 'GRAPHERPATCH]
        (FNS NCAddStub.GraphCard)
        (GLOBALVARS NC.GraphCardIcon NC.ShrunkenGraphIconBM NC.ShrunkenGraphIconMask 
               NC.ShrunkenGraphIconTemplate NC.UseDeletedLinkIconIndicatorsFlg TEDIT.ICON.FONT)
        

(* ;;; "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 NC.GraphChangeLabelFn NC.MakeGraphCardReadOnly 
             NC.MakeGraphCardReadWrite NC.SaveOrRevertGraphCard)
        

(* ;;; "Hooks into Grapher for NoteCards applications")

        (FNS NC.GRAPHERCOPYBUTTONEVENTFN NC.InsideGrapherNodeP NC.GraphAddNodeFn NC.GraphDeleteNodeFn
             NC.GraphAddLinkFn NC.GraphDeleteLinkFn NC.GraphMoveNodeFn NC.GraphFontChangeFn 
             NC.GraphAddNode NC.GraphRemoveNode NC.GraphAddLabel NC.InsertEdgeInGraph 
             NC.InsertLabelInGraph 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)
        [INITVARS (NC.ShrunkenGraphIconTemplate (create TITLEDICON ICON ← NC.ShrunkenGraphIconBM MASK
                                                       ← NC.ShrunkenGraphIconMask TITLEREG ←
                                                       '(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)
        (DECLARE%: DONTEVAL@LOAD (P (NC.AddGraphCard)))
        (PROP (FILETYPE MAKEFILE-ENVIRONMENT)
              NCGRAPHCARD)))
(DECLARE%: DONTEVAL@LOAD FIRST 

(NC.LoadFileFromDirectories 'GRAPHER 'LISPUSERSDIRECTORIES)

(NC.LoadFileFromDirectories 'GRAPHERPATCH)
)
(DEFINEQ

(NCAddStub.GraphCard
  (LAMBDA NIL                                                (* ; "Edited  3-Dec-87 18:58 by rht:")
          
          (* * kirk 18Jun86 Add the Graph card stub)
          
          (* * rht 11/7/86%: Fixed typo, changing a QUOTE to BQUOTE.)

    (DECLARE (GLOBALVARS NC.GraphCardIcon))
    (NC.AddCardTypeStub 'Graph 'NoteCard 'NCGRAPHCARD NIL `((DisplayedInMenuFlg T)
                                                            (LinkIconAttachedBitMap ,NC.GraphCardIcon
                                                                   )))))
)
(DECLARE%: DOEVAL@COMPILE DONTCOPY

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



(* ;;; "Basic functions.")

(DEFINEQ

(NC.MakeGraphCard
  [LAMBDA (Card Title NoDisplayFlg ParamList InterestedWindow RegionOrPosition)
                                                             (* ; "Edited 11-Jun-88 15:58 by Trigg")

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

    (* ;; "pmi 6/23/87: Added the GRAPH.CHANGELABELFN NC.GraphChangeLabelFn to the Graph being created, which will then mark the substance dirty when a label is changed.")

    (* ;; "pmi 4/5/88: Now passes a NIL TOPJUSTIFYFLG to SHOWGRAPH.  This puts the origin at the lower left, the same as in browsers.")

    (* ;; "rht 6/9/88: Added RegionOrPosition arg and passed to NC.MakeNewCardWindow.  Also added ParamList and InterestedWindow args which we ignore.")

    (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)
                            GRAPH.CHANGELABELFN ← (FUNCTION NC.GraphChangeLabelFn)))
         (NC.SetSubstance Card Graph)
         (COND
            ((NOT NoDisplayFlg)
             (SETQ Window (NC.MakeNewCardWindow Card (OR Title "Untitled")
                                 NIL NIL RegionOrPosition))
             (SETQ CardType (NC.RetrieveType Card))
             (SHOWGRAPH Graph Window (FUNCTION NC.GraphCardLeftButtonFn)
                    (FUNCTION NC.GraphCardMiddleButtonFn)
                    NIL T (FUNCTION NC.GRAPHERCOPYBUTTONEVENTFN))
             (WINDOWADDPROP Window '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)           (* ; "Edited 25-Feb-88 13:52 by Randy.Gobbel")

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

    (* ;; "dwm 1/15/88 added ReadOnliness")

    (* ;; "pmi 2/18/88: Removed one of the two FLASHWs.  Fixed up check for same position to be a little more efficient.")

    (LET (Region Title GraphWindow IconWindow CardType)
         (COND
            ((SETQ GraphWindow (NC.FetchWindow Card))
             (AND (WINDOWP (WINDOWPROP GraphWindow 'ICONFOR))
                  (SETQ GraphWindow (EXPANDW GraphWindow)))
             (TOTOPW GraphWindow)
             [if RegionOrPosition
                 then (if (REGIONP RegionOrPosition)
                          then (if [NOT (EQUAL RegionOrPosition (WINDOWPROP GraphWindow 'REGION]
                                   then (SHAPEW GraphWindow (NC.DetermineDisplayRegion Card 
                                                                   RegionOrPosition)))
                        elseif (POSITIONP RegionOrPosition)
                          then (SETQ WindowRegion (WINDOWPROP GraphWindow 'REGION))
                               (if [NOT (AND (EQUAL (fetch (POSITION XCOORD) of RegionOrPosition)
                                                    (fetch (REGION LEFT) of WindowRegion))
                                             (EQUAL (fetch (POSITION YCOORD) of RegionOrPosition)
                                                    (fetch (REGION BOTTOM) of WindowRegion]
                                   then (SHAPEW GraphWindow (NC.DetermineDisplayRegion Card 
                                                                   RegionOrPosition]
             (FLASHW GraphWindow))
            (T (NC.SetUserDataProp Card 'ReadOnly (NC.CardReadOnlyOpenP Card))
               (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 'SHRINKFN (FUNCTION NC.GraphCardShrinkFn))
               (NC.InstallTitleBarButtonEventFn GraphWindow (FUNCTION NC.TitleBarButtonEventFn))
               (NC.InstallTitleBarLeftMenu GraphWindow CardType)
               (NC.InstallTitleBarMiddleMenu GraphWindow CardType)))
         GraphWindow])

(NC.RelayoutGraphCard
  (LAMBDA (Win)                                              (* pmi%: "21-Jul-87 18:42")
          
          (* * 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)
          
          (* * pmi 7/21/87%: Made sure LAYOUTGRAPH is getting a list for ROOTIDS.)

    (LET ((Card (NC.CoerceToCard Win)))
         (NC.ProtectedCardOperation
          Card "Relayout Graph Card" NIL
          (LET ((Graph (WINDOWPROP Win 'GRAPH))
                GraphNodes)
               (if (SETQ GraphNodes (fetch (GRAPH GRAPHNODES) of Graph))
                   then (SETQ Graph (LAYOUTGRAPH
                                     GraphNodes
                                     (MKLIST (OR (for Node in GraphNodes
                                                    when (NULL (fetch (GRAPHNODE FROMNODES)
                                                                  of Node))
                                                    collect (fetch (GRAPHNODE NODEID) of Node))
                                                 (fetch (GRAPHNODE NODEID) of (CAR GraphNodes))))
                                     '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)
                                                             (* rht%: " 1-Jun-87 22:11")
          
          (* * 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.)
          
          (* * rht 5/26/87%: Changed to match reduced functionality of NC.ValidLinkP, now 
          have to check that destination of ActualLink is a valid card.)

    (DECLARE (GLOBALVARS NC.DeletedLinkImageObject))
    (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)))
                                    ((AND (NC.ValidLinkP ActualLink)
                                          (NC.ValidCardP (fetch (Link DestinationCard) of 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)                            (* ; "Edited 27-Jun-88 12:25 by Trigg")

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

    (* ;; "rg 11/4/87 added ReadOnly to NC.EditNoteCard call")

    (* ;; "jrc 13-jun-88 added the equivalent to RHTPATCH322 -- use the LinkIconLeftButtonFn of the card type, if there is one")

    (* ;; "rht&jrc 6/27/88: Replaced core code with call to NC.LinkIconLeftButtonFn. ")

    (LET ((LinkIcon (fetch (GRAPHNODE NODELABEL) of GraphNode)))
         (if [AND (NC.LinkIconImageObjP LinkIcon)
                  (NOT (OR (KEYDOWNP 'LSHIFT)
                           (KEYDOWNP 'RSHIFT)
                           (KEYDOWNP 'CTRL)
                           (KEYDOWNP 'COPY)
                           (KEYDOWNP 'DELETE)
                           (KEYDOWNP 'MOVE]
             then (NC.LinkIconLeftButtonFn LinkIcon GraphWindow)
           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 'LSHIFT)
                           (KEYDOWNP 'RSHIFT)
                           (KEYDOWNP 'CTRL)
                           (KEYDOWNP 'COPY)
                           (KEYDOWNP 'DELETE)
                           (KEYDOWNP '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%: "29-Oct-87 11:59")
          
          (* * 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.)
          
          (* * rht 10/29/87%: Now handles pointer icons as well as link icons.)

    (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 (OR (AND (NC.LinkIconImageObjP LinkIcon)
                      (SETQ ImageBox (NC.LinkIconImageBoxFn LinkIcon (WINDOWPROP Window 'DSP))))
                 (AND (NC.PointerIconImageObjP LinkIcon)
                      (SETQ ImageBox (NC.PointerIconImageBoxFn LinkIcon (WINDOWPROP Window
                                                                               'DSP)))))
             then (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%: "29-Oct-87 12:02")
          
          (* 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.)
          
          (* * rht 10/29/87%: Now handles pointer icons as well as link icons.)

    (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 (OR (AND (NC.LinkIconImageObjP (SETQ LinkIcon (fetch (GRAPHNODE NODELABEL)
                                                                  of GraphNode)))
                          (NC.SameCardP DestinationCard (fetch (Link DestinationCard)
                                                           of (NC.FetchLinkFromLinkIcon LinkIcon))))
                     (AND (NC.PointerIconImageObjP LinkIcon)
                          (NC.SameCardP DestinationCard (fetch (NCPointer DestinationCard)
                                                           of (NC.FetchPointerFromPointerIcon 
                                                                     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)))))))

(NC.GraphChangeLabelFn
  (LAMBDA (Graph Window Node)                                (* pmi%: "23-Jun-87 17:32")
          
          (* * pmi 6/23/87%: Created to mark the card as dirty and prompt for the node 
          label -
          needed to make sure substance is marked dirty when a label is changed.)

    (LET ((GraphID (NC.CoerceToCard Window)))
         (NC.MarkCardDirty GraphID)
         (PROMPTINWINDOW "Node label?                  "))))

(NC.MakeGraphCardReadOnly
  [LAMBDA (Card)                                         (* ; "Edited 28-Jan-88 07:50 by MacDonald")

         (* * Make a GraphCard Read-Only.)

    (DECLARE (GLOBALVARS NC.ShowPropListMenu))
    (LET ((Window (NC.FetchWindow Card))
          PropListEditor)
         (NC.ProtectedCardOperation Card "Make Read-Only" Window (if (NC.CardSomehowDirtyP Card)
                                                                     then (NC.SaveOrRevertGraphCard
                                                                           Card Window))
                (NC.SetUserDataProp Card 'ReadOnly T)
                (if (WINDOWP (SETQ PropListEditor (NC.PropListEditorOpenP Window)))
                    then (NC.MakeTEditReadOnly PropListEditor)
                         (WINDOWPROP PropListEditor 'TEDIT.MENU NC.ShowPropListMenu))
                (WINDOWPROP Window 'RIGHTBUTTONFN NIL)
                (NC.MakeMenusReadOnly Window '(Show% Links Show% Info Designate% FileBoxes 
                                                     |Close and Save| Relayout% Graph 
                                                     |Edit Property List|)
                       '(Indicate% NoteFile |Close w/o Saving| |Close and Save| |Save in NoteFile|])

(NC.MakeGraphCardReadWrite
  [LAMBDA (Card)                                         (* ; "Edited 28-Jan-88 07:53 by MacDonald")

         (* * Make a GraphCard Read-Write)

    (DECLARE (GLOBALVARS NC.EditPropListMenu))
    (LET ((Window (NC.FetchWindow Card))
          PropListEditor)
         (NC.ProtectedCardOperation Card "Make Read-Write" Window (if (WINDOWP (SETQ PropListEditor
                                                                                (
                                                                               NC.PropListEditorOpenP
                                                                                 Window)))
                                                                      then (NC.MakeTEditReadWrite
                                                                            PropListEditor)
                                                                           (WINDOWPROP PropListEditor
                                                                                  'TEDIT.MENU 
                                                                                  NC.EditPropListMenu
                                                                                  ))
                (WINDOWPROP Window 'RIGHTBUTTONFN (FUNCTION GRAPHEDITEVENTFN))
                (NC.MakeMenusReadWrite Window)
                (NC.SetUserDataProp Card 'ReadOnly NIL])

(NC.SaveOrRevertGraphCard
  [LAMBDA (Card Window)                                  (* ; "Edited 27-Jan-88 08:04 by MacDonald")
    (ALLOW.BUTTON.EVENTS)
    (if (MENU (create MENU
                     TITLE ← "Card has been edited"
                     ITEMS ← '(("Save Changes" T "Save edited version of card in NoteFile")
                               ("Revert" NIL "Discard edits, refetch card contents from NoteFile"))
                     CENTERFLG ← T))
        then (NC.CardSaveFn Card NIL Window)
      else (NC.GetNoteCard Card)
           (SHOWGRAPH (NC.FetchSubstance Card)
                  Window
                  (FUNCTION NC.GraphCardLeftButtonFn)
                  (FUNCTION NC.GraphCardMiddleButtonFn)
                  NIL T (FUNCTION NC.GRAPHERCOPYBUTTONEVENTFN))
           (NC.MarkCardDirty Card T])
)



(* ;;; "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 'GRAPH))
          InNode PositionAndLastState TTYWindow (Position (CONS 0 0)))
         (if (NOT (AND (WINDOWP (SETQ TTYWindow (PROCESSPROP (TTY.PROCESS)
                                                       'WINDOW)))
                       (WINDOWPROP TTYWindow '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 '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.GraphAddNode
  [LAMBDA (Graph GraphWindow)                                (* ; "Edited 12-Apr-88 17:26 by pmi")

    (* ;; "pmi 4/12/88: Called from Grapher to create a new node for Graph.  This is the addnodefn used by NC.InsertLinkInGraph.")

    (* ;; "pmi 8/26/88: fixed typo where Window was used instead of GraphWindow.")

    (DECLARE (GLOBALVARS NC.MsgDelay))
    (NC.ProtectedCardOperation (NC.CoerceToCard GraphWindow)
           "Add Node" GraphWindow
           (NCP.WithLockedCards (PROG (NewNodeData SourceCard LinkOrLinkLabel DestinationCard 
                                             DisplayMode Position GraphNodeID Card Node)

                                 (* ;; "Get information to add a node from the graph's window.")

                                      (SETQ NewNodeData (WINDOWPROP GraphWindow 'NewNodeData))
                                      (SETQ SourceCard (LISTGET NewNodeData 'SourceCard))
                                      (SETQ LinkOrLinkLabel (LISTGET NewNodeData 'LinkOrLinkLabel))
                                      (SETQ DestinationCard (LISTGET NewNodeData 'DestinationCard))
                                      (SETQ DisplayMode (LISTGET NewNodeData 'DisplayMode))
                                      (SETQ Position (LISTGET NewNodeData 'Position))
                                      (if [SETQ Link (COND
                                                        ((type? Link LinkOrLinkLabel)
                                                         LinkOrLinkLabel)
                                                        (T (NC.MakeLink GraphWindow LinkOrLinkLabel 
                                                                  DestinationCard SourceCard 
                                                                  DisplayMode]
                                          then 
                                               (* ;; 
                                      "Check to see if the node has already been added to the graph.")
                                                             (* ; 
                                                             "Create hash array if haven't already.")
                                               (NC.GetBrowserHashArray SourceCard Graph)
                                               [SETQ GraphNodeID (NC.GetBrowserNodeID
                                                                  SourceCard
                                                                  (SETQ Card (fetch (Link 
                                                                                      DestinationCard
                                                                                          )
                                                                                of Link]
                                               (COND
                                                  ((for GraphNode in (fetch (GRAPH GRAPHNODES)
                                                                        of Graph)
                                                      thereis (EQ GraphNodeID (NC.CoerceToGraphNodeID
                                                                               GraphNode)))
                                                   (NC.PrintMsg GraphWindow T "Node for card '"
                                                          (NC.RetrieveTitle Card)
                                                          "' already in graph.")
                                                   (DISMISS NC.MsgDelay)
                                                   (NCP.DeleteLinks Link)
                                                   (RETURN NIL)))
                                               (NC.MarkCardDirty SourceCard)
                                               (SETQ Node
                                                (NODECREATE GraphNodeID (NC.MakeLinkIcon Link)
                                                       (create POSITION
                                                              XCOORD ← -500
                                                              YCOORD ← -500)))
                                               (RETURN Node])

(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.GraphAddLabel
  [LAMBDA (Graph GraphWindow)                                (* ; "Edited  8-Apr-88 15:12 by pmi")

    (* ;; 
    "This builds a label node in the default grapher style except that we force non-boxed nodes.")

    (* ;; "pmi 6/23/87: Added call to NC.MarkCardDirty to make sure substance is marked dirty when nodes are created.")

    (* ;; "pmi 4/8/88: Now called from Grapher to create a new label node for Graph.  This is the addnodefn used by NC.InsertLabelInGraph.")

    (LET ((GraphCard (NCP.CardFromWindow GraphWindow)))
         (NC.ProtectedCardOperation GraphCard "Add Label" GraphWindow
                (NCP.WithLockedCards (LET (NewLabelData Label Position Font Border LabelShade 
                                                 GraphNodes NodeName)
                                          (SETQ NewLabelData (WINDOWPROP GraphWindow 'NewLabelData))
                                          (SETQ Label (LISTGET NewLabelData 'Label))
                                          (SETQ Position (LISTGET NewLabelData 'Position))
                                          (SETQ Font (LISTGET NewLabelData 'Font))
                                          (SETQ Border (LISTGET NewLabelData 'Border))
                                          (SETQ LabelShade (LISTGET NewLabelData 'LabelShade))
                                          (NC.MarkCardDirty (NC.CoerceToCard GraphWindow))
                                          (SETQ GraphNodes (fetch (GRAPH GRAPHNODES) of Graph))
                                          (while (FASSOC (SETQ NodeName (PACK* Label (GENSYM)))
                                                        GraphNodes))
                                          (NODECREATE NodeName Label
                                                 (create POSITION
                                                        XCOORD ← -500
                                                        YCOORD ← -500)
                                                 NIL NIL (OR Font (CHOOSE.GRAPH.FONT Graph))
                                                 Border LabelShade])

(NC.InsertEdgeInGraph
  [LAMBDA (GraphCard FromNode ToNode)                        (* ; "Edited  8-Apr-88 15:25 by pmi")

    (* ;; "Adds a new edge to GraphCard, using FromNode as the source and ToNode as the destination.  Will only allow edge addition if there are currently no edges between the two nodes.")

    (LET* [(Window (NCP.CardWindow GraphCard))
           (Graph (WINDOWPROP Window 'GRAPH]
          (NC.GetBrowserHashArray GraphCard Graph)
          (COND
             ((EQ FromNode ToNode)
              (NC.PrintMsg NIL T "Can't add edge from a node to itself.")
              (FLASHW PROMPTWINDOW))
             ((OR (MEMBTONODES (fetch (GRAPHNODE NODEID) of ToNode)
                         (fetch (GRAPHNODE TONODES) of FromNode))
                  (MEMBTONODES (fetch (GRAPHNODE NODEID) of FromNode)
                         (fetch (GRAPHNODE TONODES) of ToNode)))
              (NC.PrintMsg NIL T "There is already an edge between those two nodes.")
              (FLASHW PROMPTWINDOW))
             (T (NC.MarkCardDirty GraphCard)
                (ADD/AND/DISPLAY/LINK FromNode ToNode Window Graph)))
          NIL])

(NC.InsertLabelInGraph
  [LAMBDA (GraphCard Label Position Font Border LabelShade)  (* ; "Edited  5-Apr-88 17:55 by pmi")

    (* ;; "Insert a Label in GraphWindow at Position")

    (* ;; "Called from NCP.LocalGlobalLink to add a graph label to an existing card at a specified position.  Just sets up the proper ADDNODEFN in graph record, attaches arguments to the graph window, and invokes the grapher editor.")

    (* ;; 
    "pmi 8/26/88: Restores the original GRAPH.ADDNODEFN to this Graph after inserting this label.")

    (LET* [(Window (NCP.CardWindow GraphCard))
           (Graph (WINDOWPROP Window 'GRAPH]
          (WINDOWPROP Window 'NewLabelData (LIST 'Label Label 'Position Position 'Font Font
                                                 'Border Border 'LabelShade LabelShade))
          (RESETLST
              [RESETSAVE NIL `(PROGN (replace (GRAPH GRAPH.ADDNODEFN) of Graph
                                        with (FUNCTION ,(fetch (GRAPH GRAPH.ADDNODEFN) of Graph]
              (replace (GRAPH GRAPH.ADDNODEFN) of Graph with (FUNCTION NC.GraphAddLabel))
              (EDITADDNODE Window Position))])

(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 '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 (GraphCard LinkOrLinkLabel DestinationCard DisplayMode Position)
                                                             (* ; "Edited  8-Apr-88 14:47 by pmi")

    (* ;; "Insert a Link to DestinationCard in GraphCard at Position")

    (* ;; "pmi 4/8/88: Called from NCP.LocalGlobalLink to add a graph node to an existing card at a specified position.  Just sets up the proper ADDNODEFN in graph record, attaches arguments to the graph window, and invokes the grapher editor.")

    (* ;; 
    "pmi 8/26/88: Restores the original GRAPH.ADDNODEFN to this Graph after inserting this link.")

    (LET* [(Window (NCP.CardWindow GraphCard))
           (Graph (WINDOWPROP Window 'GRAPH]
          (WINDOWPROP Window 'NewNodeData (LIST 'SourceCard GraphCard 'LinkOrLinkLabel 
                                                LinkOrLinkLabel 'DestinationCard DestinationCard
                                                'DisplayMode DisplayMode 'Position Position))
          (RESETLST
              [RESETSAVE NIL `(PROGN (replace (GRAPH GRAPH.ADDNODEFN) of Graph
                                        with (FUNCTION ,(fetch (GRAPH GRAPH.ADDNODEFN) of Graph]
              (replace (GRAPH GRAPH.ADDNODEFN) of Graph with (FUNCTION NC.GraphAddNode))
              (EDITADDNODE Window Position))])
)



(* ;;; "Stuff for shrinking graphs and browsers.")


(RPAQQ NC.ShrunkenGraphIconBM #*(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@@
)

(RPAQQ NC.ShrunkenGraphIconMask #*(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@@
)

(RPAQQ NC.GraphCardIcon #*(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)                                                (* ; "Edited 21-Jan-88 23:41 by Trigg")

(* ;;; "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")
          
          (* ;; "rht 1/21/88: Now checks windowprop to see whether default shrunken icon template should be overridden.")

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

(RPAQ? NC.ShrunkenGraphIconTemplate (create TITLEDICON ICON ← NC.ShrunkenGraphIconBM MASK ← 
                                               NC.ShrunkenGraphIconMask TITLEREG ←
                                               '(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                                         (* ; "Edited 25-Feb-88 11:37 by Randy.Gobbel")

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

(* ;;; "dwm 1/6/88: Added ReadOnly/ReadWrite FUNCTIONS")

    (NC.AddCardType 'Graph 'NoteCard `[(MakeFn ,(FUNCTION NC.MakeGraphCard))
                                       (EditFn ,(FUNCTION NC.BringUpGraphCard))
                                       (QuitFn ,(FUNCTION NC.GraphCardCloseFn))
                                       (MakeReadOnlyFn ,(FUNCTION NC.MakeGraphCardReadOnly))
                                       (MakeReadWriteFn ,(FUNCTION NC.MakeGraphCardReadWrite))
                                       (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
                                                                    ]
           `((LinkDisplayMode Title)
             (DisplayedInMenuFlg ,T)
             (DefaultWidth 500)
             (DefaultHeight 330)
             (LinkAnchorModesSupported T)
             (LinkIconAttachedBitMap ,NC.GraphCardIcon)
             (MiddleButtonMenuItems ,'((Relayout% Graph (FUNCTION NC.RelayoutGraphCard)
                                              "Re-layout the graph, but keep same nodes."])
)
(DECLARE%: DONTEVAL@LOAD 

(NC.AddGraphCard)
)

(PUTPROPS NCGRAPHCARD FILETYPE :TCOMPL)

(PUTPROPS NCGRAPHCARD MAKEFILE-ENVIRONMENT (:PACKAGE "IL" :READTABLE "INTERLISP" :BASE 10))
(PUTPROPS NCGRAPHCARD COPYRIGHT ("Xerox Corporation" 1985 1986 1987 1988))
(DECLARE%: DONTCOPY
  (FILEMAP (NIL (2898 3486 (NCAddStub.GraphCard 2908 . 3484)) (3726 33603 (NC.MakeGraphCard 3736 . 6397)
 (NC.BringUpGraphCard 6399 . 9630) (NC.RelayoutGraphCard 9632 . 12450) (NC.CollectReferencesInGraph 
12452 . 15523) (NC.GraphCardCloseFn 15525 . 16395) (NC.GraphCardLeftButtonFn 16397 . 17746) (
NC.GraphCardMiddleButtonFn 17748 . 18849) (NC.GraphCopySubstance 18851 . 19593) (NC.MarkGraphDirty 
19595 . 19820) (NC.GraphDirtyP 19822 . 20249) (NC.GraphNodeLinkIconUpdate 20251 . 22272) (
NC.GetGraphSubstance 22274 . 23349) (NC.PutGraphSubstance 23351 . 24599) (NC.UpdateLinkImagesInGraph 
24601 . 26585) (NC.DelReferencesToCardFromGraph 26587 . 29563) (NC.GraphChangeLabelFn 29565 . 30023) (
NC.MakeGraphCardReadOnly 30025 . 31321) (NC.MakeGraphCardReadWrite 31323 . 32757) (
NC.SaveOrRevertGraphCard 32759 . 33601)) (33668 54487 (NC.GRAPHERCOPYBUTTONEVENTFN 33678 . 37432) (
NC.InsideGrapherNodeP 37434 . 38333) (NC.GraphAddNodeFn 38335 . 39608) (NC.GraphDeleteNodeFn 39610 . 
40253) (NC.GraphAddLinkFn 40255 . 40510) (NC.GraphDeleteLinkFn 40512 . 40826) (NC.GraphMoveNodeFn 
40828 . 41084) (NC.GraphFontChangeFn 41086 . 41344) (NC.GraphAddNode 41346 . 45618) (
NC.GraphRemoveNode 45620 . 47585) (NC.GraphAddLabel 47587 . 49721) (NC.InsertEdgeInGraph 49723 . 50898
) (NC.InsertLabelInGraph 50900 . 52068) (NC.TrackCursorInGrapherWindow 52070 . 54485)) (54570 56246 (
NC.TranslateWindowPositionToGraphPosition 54580 . 54877) (NC.InsertLinkInGraph 54879 . 56244)) (61147 
62633 (NC.GraphCardShrinkFn 61157 . 62631)) (62953 65412 (NC.MakeExternalGraphCopy 62963 . 65410)) (
65473 67810 (NC.AddGraphCard 65483 . 67808)))))
STOP