(DEFINE-FILE-INFO PACKAGE "IL" READTABLE "INTERLISP" BASE 10)
(FILECREATED "13-Oct-88 19:19:35" {QV}<NOTECARDS>1.3MNEXT>NCSKETCHCARD.;1 36264  

      changes to%:  (VARS NCSKETCHCARDCOMS)

      previous date%: "13-Aug-88 15:15:46" {QV}<NOTECARDS>1.3LNEXT>NCSKETCHCARD.;6)


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

(PRETTYCOMPRINT NCSKETCHCARDCOMS)

(RPAQQ NCSKETCHCARDCOMS
       (

(* ;;; "Definition of the Sketch card type.")

        [DECLARE%: COPY FIRST (P (NC.LoadFileFromDirectories 'SKETCH 'LISPUSERSDIRECTORIES]
        (FNS NCAddStub.SketchCard)
        (GLOBALVARS NC.SketchCardIcon NC.SketchTitleBarMenu NC.DeletedLinkImageObject 
               NC.UseDeletedLinkIconIndicatorsFlg)
        (BITMAPS NC.SketchCardIcon)
        

(* ;;; "Basic functions")

        (FNS NC.MakeSketchCard NC.BringUpSketchCard NC.SketchDirtyP NC.SketchTitleBarButtonEventFn 
             NC.SketchCardCloseFn NC.SketchCardShrinkFn NC.SketchCopySubstance NC.MarkSketchDirty 
             NC.CollectReferencesInSketch NC.GetSketchSubstance NC.PutSketchSubstance NC.PutCachedMap
             NC.GetCachedMap NC.UpdateLinkImagesInSketch NC.DelReferencesToCardFromSketch 
             NC.ExternalizeLinkIconsInSketch NC.MakeExternalSketchCopy NC.SK.COPY.BUTTONEVENTFN)
        [INITADVISE (CREATE.SKETCHW.COMMANDMENU (NIL (AFTER NIL (NC.RemoveSketchMenuItems !VALUE]
        

(* ;;; "This stuff supports the push-copy method of copying links in NC")

        (FNS NC.TranslateWindowPositionToSketchPosition)
        

(* ;;; "Special stuff for autoloading maps")

        (FNS NC.FakeMapInputFn NC.FakeMapInsideFn)
        [DECLARE%: DONTEVAL@LOAD (P (NC.StoreAutoloadFnFile (FUNCTION SK.MAP.INPUTFN)
                                           'NCMAPS
                                           'NOTECARDSDIRECTORIES)
                                    (NC.StoreAutoloadFnFile (FUNCTION SK.MAP.INSIDEFN)
                                           'NCMAPS
                                           'NOTECARDSDIRECTORIES)
                                    (NC.StoreAutoloadFnFile (FUNCTION SetCachedBitMap)
                                           'NCMAPS
                                           'NOTECARDSDIRECTORIES)
                                    (OR (FMEMB 'MAP SKETCH.ELEMENT.TYPE.NAMES)
                                        (CREATE.SKETCH.ELEMENT.TYPE 'MAP "Map" 
                                               "Forces autoload of MAP package." NIL NIL NIL NIL
                                               (FUNCTION NC.FakeMapInputFn)
                                               (FUNCTION NC.FakeMapInsideFn]
        

(* ;;; "Add sketch card type to CardType list")

        (FNS NC.AddSketchCard)
        (DECLARE%: DONTEVAL@LOAD (P (NC.AddSketchCard)))
        (PROP (FILETYPE MAKEFILE-ENVIRONMENT)
              NCSKETCHCARD)))



(* ;;; "Definition of the Sketch card type.")

(DECLARE%: COPY FIRST 

(NC.LoadFileFromDirectories 'SKETCH 'LISPUSERSDIRECTORIES)
)
(DEFINEQ

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

    (DECLARE (GLOBALVARS NC.SketchCardIcon))
    (NC.AddCardTypeStub 'Sketch 'NoteCard 'NCSKETCHCARD NIL `((DisplayedInMenuFlg T)
                                                              (LinkIconAttachedBitMap ,
                                                                     NC.SketchCardIcon)))))
)
(DECLARE%: DOEVAL@COMPILE DONTCOPY

(GLOBALVARS NC.SketchCardIcon NC.SketchTitleBarMenu NC.DeletedLinkImageObject 
       NC.UseDeletedLinkIconIndicatorsFlg)
)

(RPAQQ NC.SketchCardIcon #*(21 18)OOOOOH@@H@@@@H@@HGO@@H@@HH@H@H@@H@@G@H@@HC@@HH@@HDH@DH@@HHD@BH@@I@B@@H@@I@B@@H@@HHDONH@@HDHHBH@@HC@HBH@@H@@HBH@@H@@HBH@@H@@ONH@@H@@@@H@@OOOOOH@@
)



(* ;;; "Basic functions")

(DEFINEQ

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

    (* ;; "rht 2/1/85: Added windowprop to prevent sketch asking about saving changes.")

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

    (* ;; "rht 5/6/86 Replaced call to NC.SetupTitleBarMenu with calls to NC.InstallTitleBarButtonEventFn and NC.InstallTitleBarLeftMenu and NC.InstallSketchTitleBarMiddleMenu.")

    (* ;; "fgh 6/30/86 Added NC.SK.COPY.BUTTONEVENTFN on Sketch Window.  Added SKETCH.ADD.ELEMENT call when NoDisplayFlg")

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

    (if NoDisplayFlg
        then (NC.SetSubstance Card (SKETCH.ADD.ELEMENT NIL NIL))
             Card
      else (LET (Window CardType)
                (SETQ CardType (NC.RetrieveType Card))
                [SETQ Window (SKETCHW.CREATE NIL NIL (NC.DetermineDisplayRegion Card RegionOrPosition
                                                            )
                                    (OR Title "Untitled")
                                    NIL
                                    (SKETCH.COMMANDMENU (NC.GetCardTypeField MiddleButtonMenuItems 
                                                               CardType]
                (WINDOWPROP Window 'DONTQUERYCHANGES T)
                (WINDOWPROP Window 'COPYBUTTONEVENTFN (FUNCTION NC.SK.COPY.BUTTONEVENTFN))
                (WINDOWPROP Window 'SHRINKFN (FUNCTION NC.SketchCardShrinkFn))
                (NC.InstallTitleBarButtonEventFn Window (FUNCTION NC.SketchTitleBarButtonEventFn))
                (NC.InstallTitleBarLeftMenu Window CardType)
                (NC.SetSubstance Card (INSURE.SKETCH Window))
                Window])

(NC.BringUpSketchCard
  [LAMBDA (Card Substance RegionOrPosition)                  (* ; "Edited 18-Feb-88 18:01 by pmi")
                                                             (* ; 
                                    "Bring up a sketch card containing substance in specified region")

    (* ;; "rht 2/1/85: Added windowprop to prevent sketch asking about saving changes.")

    (* ;; "rht 10/10/85: Now sets substance if was nil.")

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

    (* ;; "rht 5/5/86: Replaced call to NC.SetupTitleBarMenu with calls to NC.InstallTitleBarButtonEventFn and NC.InstallTitleBarLeftMenu and NC.InstallSketchTitleBarMiddleMenu.")

    (* ;; "fgh 6/30/86 Added NC.SK.COPY.BUTTONEVENTFN to sketch window.  Made Substance to be INSURE.SKETCH of the sketch window.")

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

    (* ;; "rht 3/2/87: No longer passes RegionViewed and Scale to SKETCHW.CREATE.  SKETCHW.CREATE will extract them from the imageobj.")

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

    (LET ([SketchName (AND (NULL Substance)
                           (MKATOM (fetch (Card UID) of Card]
          WindowRegion Title SketchViewer CardType)
         [COND
            [(SETQ SketchViewer (NC.FetchWindow Card))
             (TOTOPW SketchViewer)
             [if RegionOrPosition
                 then (if (REGIONP RegionOrPosition)
                          then (if [NOT (EQUAL RegionOrPosition (WINDOWPROP SketchViewer 'REGION]
                                   then (SHAPEW SketchViewer (NC.DetermineDisplayRegion Card 
                                                                    RegionOrPosition)))
                        elseif (POSITIONP RegionOrPosition)
                          then (SETQ WindowRegion (WINDOWPROP SketchViewer '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 SketchViewer (NC.DetermineDisplayRegion Card 
                                                                    RegionOrPosition]
             (FLASHW SketchViewer)
             (TTY.PROCESS (WINDOWPROP SketchViewer 'PROCESS]
            (T (SETQ CardType (NC.RetrieveType Card))
               [SETQ SketchViewer (SKETCHW.CREATE (OR Substance SketchName)
                                         NIL
                                         (NC.DetermineDisplayRegion Card RegionOrPosition)
                                         (NC.RetrieveTitle Card)
                                         NIL
                                         (SKETCH.COMMANDMENU (NC.GetCardTypeField 
                                                                    MiddleButtonMenuItems CardType]
               (WINDOWPROP SketchViewer 'DONTQUERYCHANGES T)
               (WINDOWPROP SketchViewer 'COPYBUTTONEVENTFN (FUNCTION NC.SK.COPY.BUTTONEVENTFN))
               (WINDOWPROP SketchViewer 'SHRINKFN (FUNCTION NC.SketchCardShrinkFn))
               (NC.InstallTitleBarButtonEventFn SketchViewer (FUNCTION NC.SketchTitleBarButtonEventFn
                                                              ))
               (NC.InstallTitleBarLeftMenu SketchViewer CardType)
               (OR Substance (NC.SetSubstance Card (INSURE.SKETCH SketchViewer]
         SketchViewer])

(NC.SketchDirtyP
  (LAMBDA (Card)                                             (* rht%: " 2-Mar-87 21:10")
          
          (* * rht 2/1/85%: No longer checks FILEPKGCHANGES.
          Now uses window prop. Note that we really should have a flag on the sketch 
          object itself.)
          
          (* * fgh |11/14/85| Updated to handle Card object.)
          
          (* * rht 3/2/87%: Took out calls to NC.FetchSavedRegion and NC.FetchScale.
          Also fixed bug |#419:| sketch doing needless save after Put.)

    (EQ (WINDOWPROP (NC.FetchWindow Card)
               'SKETCHCHANGED)
        T)))

(NC.SketchTitleBarButtonEventFn
  (LAMBDA (Window)                                           (* rht%: " 6-May-86 12:12")
          
          (* * if inside title region and left button down, bringup left button title 
          menu, otherwise just call the oldbuttoneventfn)

    (LET (LeftButtonMenu)
         (if (OR (INSIDEP (DSPCLIPPINGREGION NIL Window)
                        (LASTMOUSEX Window)
                        (LASTMOUSEY Window))
                 (LASTMOUSESTATE MIDDLE))
             then (APPLY* (WINDOWPROP Window 'OLDBUTTONEVENTFN)
                         Window)
           elseif (type? MENU (SETQ LeftButtonMenu (WINDOWPROP Window 'TitleBarLeftButtonMenu)))
             then (APPLY* (OR (MENU LeftButtonMenu)
                              (FUNCTION NILL))
                         Window)))))

(NC.SketchCardCloseFn
  (LAMBDA (CardIdentifier)                                   (* rht%: "16-Oct-86 17:01")
          
          (* Quit from a sketch card, saving information on the database)
          
          (* * rht 12/20/84%: Added ugly kludge, setting SKETCHCHANGED to nil, to keep 
          sketch from asking whether to save changes or not.)
          
          (* * rht 2/1/85%: Removed above mentioned ugly kludge.
          It's now taken care of by a windowprop. Now closes all sketch viewers for this 
          sketch.)
          
          (* * fgh |11/14/85| Updated to handle Card object.)
          
          (* * rht 10/16/86%: Removed call to NC.DeactivateCard.)

    (LET (Card Window OldRegion NewRegion)
         (SETQ Card (NC.CoerceToCard CardIdentifier))
         (SETQ Window (NC.FetchWindow Card))
         (COND
            (Window (for Viewer in (ALL.SKETCH.VIEWERS (NC.FetchSubstance Card))
                       do (SKETCHW.CLOSEFN Viewer))
                   (SKED.CLEAR.SELECTION Window)
                   (for AttachedWindow in (ATTACHEDWINDOWS Window) do (DETACHWINDOW AttachedWindow)
                                                                      (CLOSEW AttachedWindow))))
         (COND
            (Window (REMOVEPROMPTWINDOW Window)
                   (WINDOWPROP Window 'SKETCHOPMENU NIL)))
         (TTY.PROCESS T))))

(NC.SketchCardShrinkFn
  [LAMBDA (W)                                                (* ; "Edited 14-Jan-88 17:02 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.")
          
          (* ;; "fgh 11/14/85 Updated to handle Card object.")
          
          (* ;; 
          "rht 1/14/88: Now passes an icon position to SK.SHRINK.ICONCREATE if we had stashed one.")

    (PROG ((OldIconTitle (WINDOWPROP W 'SKETCH.ICON.TITLE))
           (Icon (WINDOWPROP W 'ICON))
           (Card (NC.CoerceToCard W))
           IconTitle)
          [COND
             ((NOT Icon)
              [SK.SHRINK.ICONCREATE W (POSITIONP (WINDOWPROP W 'SHRUNKENWINPOS]
              (SETQ Icon (WINDOWPROP W 'ICON]
          (COND
             ([NOT (EQUAL OldIconTitle (SETQ IconTitle (CONCAT "NC: " (NC.RetrieveTitle Card]
              (WINDOWPROP W 'SKETCH.ICON.TITLE IconTitle)
              (ICONTITLE IconTitle NIL NIL Icon])

(NC.SketchCopySubstance
  (LAMBDA (Card FromStream ToStream Length)                  (* fgh%: "21-Nov-85 21:12")
          
          (* * Copy a sketch 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.MarkSketchDirty
  (LAMBDA (Card ResetFlg)                                    (* fgh%: "14-Nov-85 20:52")
          
          (* * Mark or unmark sketch as having been changed.)
          
          (* * rht 2/1/85%: Now goes through window prop rather than FILEPKG.)
          
          (* * fgh |11/14/85| Updated to handle Card object.)

    (WINDOWPROP (NC.FetchWindow Card)
           'SKETCHCHANGED ResetFlg)))

(NC.CollectReferencesInSketch
  (LAMBDA (Card CheckAndDeleteFlg ReturnLinkIconsFlg ReturnLocationsFlg)
                                                             (* rht%: "26-May-87 11:55")
          
          (* * Return a list of all links in sketch substance Substance.
          If CheckAndDeleteFlg, then delete any links found that are not valid links.)
          
          (* * rht 8/20/85%: Rewritten to use Richard's sketch programmer's interface.
          Eliminates references to sketch records.)
          
          (* * 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.)

    (LET ((SketchSubstance (NC.FetchSubstance Card))
          DirtyFlg)
         (CONS (for SketchElt in (SKETCH.LIST.OF.ELEMENTS SketchSubstance (FUNCTION 
                                                                           NC.LinkIconSketchElementP)
                                        ) bind LinkIcon CollectItem ActualLink
                  when (PROGN (SETQ ActualLink (NC.FetchLinkFromLinkIcon (SETQ LinkIcon (
                                                                           SKETCH.IMAGEOBJ.OF.ELEMENT
                                                                                         SketchElt)))
                               )
                              (COND
                                 ((NULL CheckAndDeleteFlg)   (* No checking required)
                                  T)
                                 ((AND (LISTP CheckAndDeleteFlg)
                                       (FMEMB (fetch (Link DestinationCard) of ActualLink)
                                              CheckAndDeleteFlg))
                                                             (* Already checked since ID cached on 
                                                             CheckAndDeleteFlg list)
                                  T)
                                 ((AND (NC.ValidLinkP ActualLink)
                                       (NC.ValidCardP (fetch (Link DestinationCard) of ActualLink)))
                                                             (* Link is valid)
                                  T)
                                 (T 
          
          (* Link is bad. Replace it with the DeletedLink image object.)

                                    (NC.DeleteLinkIconSketchElement SketchElt Card)
                                    (SETQ DirtyFlg T)
                                    NIL))) collect (SETQ CollectItem (COND
                                                                        (ReturnLinkIconsFlg LinkIcon)
                                                                        (T ActualLink)))
                                                 (COND
                                                    (ReturnLocationsFlg (CONS CollectItem
                                                                              (
                                                                           SKETCH.POSITION.OF.ELEMENT
                                                                               SketchElt)))
                                                    (T CollectItem)))
               DirtyFlg))))

(NC.GetSketchSubstance
  (LAMBDA (Card Length Stream SubstanceVersion)              (* rht%: "28-Feb-87 21:40")
          
          (* Get sketch substance from Database stream.
          Database stream is positioned. READ the global sketch description, the locasl 
          sketch scale and region viewed. Also read in any cached bit maps for the MAPS 
          system.)
          
          (* * fgh |11/14/85| Updated to handle Card and NoteFile objects.)
          
          (* * fgh |11/20/85| NoteCards now passes start and enptrs down.)
          
          (* * fgh |11/21/85| Now passed Length instead of start and end ptrs.)
          
          (* * rht 1/23/86%: Now takes Stream as arg instead of computing from Card.)
          
          (* * rht 11/1/86%: Now uses our readtable when reading.)
          
          (* * rht 2/28/87%: Now uses new style of storing sketch on file whereby we 
          package as imageobj.)

    (DECLARE (GLOBALVARS NC.OrigReadTable))
          
          (* * Get the substance)

    (SELECTQ SubstanceVersion
        ((0 -1) 
          
          (* * Old style wrote down Scale and RegionViewed separately.)

             (LET ((Sketch (HREAD Stream)))
                  (NC.SetScale Card (READ Stream NC.OrigReadTable))
                  (NC.SetRegionViewed Card (READ Stream NC.OrigReadTable))
                  (while (EQ (READ Stream NC.OrigReadTable)
                             '%###CACHEDMAP###) do (NC.GetCachedMap Stream))
                  Sketch))
        (1 
          
          (* * New style expects sketch to be packaged as imageobj.)

           (LET ((Sketch (HREAD Stream)))
                (while (EQ (READ Stream NC.OrigReadTable)
                           '%###CACHEDMAP###) do (NC.GetCachedMap Stream))
                Sketch))
        NIL)))

(NC.PutSketchSubstance
  (LAMBDA (Card Stream)                                      (* rht%: " 2-Mar-87 20:42")
          
          (* Put the sketch substance for card ID to the database.
          Store the global sketch descriptor, the scale and region viewed for ID and any 
          cached bit maps.)
          
          (* * 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 version number.)
          
          (* * fgh&rht |8/25/86| Changed call to NC.PutCachedMap to remove use of 
          SCREENELT record.)
          
          (* * rht&pmi 10/15/86%: Changed outdated SK.REGION.VIEWED call to 
          SKETCH.REGION.VIEWED.)
          
          (* * rht 11/1/86%: Now uses our readtable when printing.)
          
          (* * rht 2/28/87%: Writes out sketches by first packaging as imageobject.
          This changes the format on the file, since we no longer need to write down 
          region and scale separately.)

    (DECLARE (GLOBALVARS NC.OrigReadTable))
    (LET ((Substance (NC.FetchSubstance Card))
          (Window (NC.FetchWindow Card)))
         (HPRINT (if (OPENWP Window)
                     then (MAKE.IMAGE.OBJECT.OF.SKETCH Window)
                   else Substance)
                Stream NIL T)
         (AND Window (for Element in (SKETCH.LIST.OF.ELEMENTS (INSURE.SKETCH Substance)
                                            (FUNCTION (LAMBDA (Element)
                                                        (EQ (GETSKETCHELEMENTPROP Element
                                                                   'TYPE)
                                                            'MAP)))
                                            T) do (NC.PutCachedMap Element Window Stream)))
         (PRINT '%###ENDSKETCH### Stream NC.OrigReadTable)
         1)))

(NC.PutCachedMap
  (LAMBDA (SketchMapElement SketchWindow Stream)             (* rht%: " 1-Nov-86 15:52")
          
          (* Put a cached bit map corresponding to MapScreenElt onto database file)
          
          (* * |8/25/86| fgh&rht Removed use of SCREENELT record and replaced with call 
          to CacheSpecsFromMapSketchElement which is defined in the MAP package.)
          
          (* * rht 11/1/86%: Now uses our readtable when printing.)

    (DECLARE (GLOBALVARS NC.OrigReadTable))
    (LET (CacheSpecs BitMap)
         (AND (LISTP (SETQ CacheSpecs (CacheSpecsFromMapSketchElement SketchMapElement SketchWindow))
                     )
              (for CacheSpec in CacheSpecs do (BITMAPP (SETQ BitMap (APPLY (FUNCTION 
                                                                            FetchCachedBitMap)
                                                                           CacheSpec)))
                                              (PRINT '%###CACHEDMAP### Stream NC.OrigReadTable)
                                              (PRINT CacheSpec Stream NC.OrigReadTable)
                                              (HPRINT BitMap Stream T T))))))

(NC.GetCachedMap
  (LAMBDA (Stream)                                           (* rht%: " 1-Nov-86 15:54")
          
          (* Read a bit map from the file and then put it onto the cached maps list)
          
          (* * FGH |9/28/85| Updated to handle new map changes.
          In particular, caching now done on the map resolution and noit on the x and y 
          offsets.)
          
          (* * rht 10/10/86%: Replaced APPLY of SetCachedBitMap with NC.AutoloadApply so 
          that NCMAPS will get autoloaded.)
          
          (* * rht 11/1/86%: Now uses our readtable when reading.)

    (DECLARE (GLOBALVARS NC.OrigReadTable))
    (LET (CacheSpecs BitMap)
         (SETQ CacheSpecs (READ Stream NC.OrigReadTable))
         (COND
            ((EQ (LENGTH CacheSpecs)
                 8)
          
          (* * Old Scheme for cahcing)

             (SETQ CacheSpecs (CONS 'HIGH (CDDR CacheSpecs)))))
         (SETQ BitMap (HREAD Stream))
         (AND CacheSpecs BitMap (NC.AutoloadApply (FUNCTION SetCachedBitMap)
                                       (CONS BitMap CacheSpecs))))))

(NC.UpdateLinkImagesInSketch
  (LAMBDA (SourceCard DestinationCard)                       (* fgh%: "17-Nov-85 16:32")
          
          (* For now do nothing since Link Images in Sketch have no titles.)
          
          (* * rht 8/20/85%: Rigged this to use Richard's new sketch programmer's 
          interface.)
          
          (* * fgh |11/17/85| Updated to handle card object.)

    (LET ((SketchWin (NC.FetchWindow SourceCard)))
         (for SketchElement in (SKETCH.LIST.OF.ELEMENTS SketchWin (FUNCTION NC.LinkIconSketchElementP
                                                                   )) bind FoundAtLeastOneFlg
            when (NC.SameCardP DestinationCard (fetch (Link DestinationCard)
                                                  of (NC.FetchLinkFromLinkIcon (
                                                                           SKETCH.IMAGEOBJ.OF.ELEMENT
                                                                                SketchElement))))
            do (SKETCH.ELEMENT.CHANGED SketchWin SketchElement)
               (SETQ FoundAtLeastOneFlg T) finally (COND
                                                      (FoundAtLeastOneFlg (NC.MarkCardDirty 
                                                                                 SourceCard)))))))

(NC.DelReferencesToCardFromSketch
  (LAMBDA (SourceCard LinkOrDestinationCard Don'tCreateDeletedImageObjFlg)
                                                             (* rht%: " 4-Nov-86 14:52")
          
          (* * Remove all Link Icons pointing to Destination from the sketch Substance.)
          
          (* * rht 8/20/85%: Rewritten to use Richard's sketch programmer's interface.
          Eliminates references to sketch records.
          I'm changing the innards of the affected link icons rather than deleting them 
          and reinserting. That's because deleting the icon would cause a recursive call.)
          
          (* * kirk 14Nov85%: deleted use of LinkID)
          
          (* * rht 11/4/86%: Now takes Don'tCreateDeletedImageObjFlg arg.)

    (PROG ((LinkFlg (type? Link LinkOrDestinationCard))
           DestinationCard SketchSubstance)
          (COND
             (LinkFlg (OR (NC.CardP SourceCard)
                          (SETQ SourceCard (fetch (Link SourceCard) of LinkOrDestinationCard))))
             (T (SETQ DestinationCard LinkOrDestinationCard)))
          (SETQ SketchSubstance (NC.FetchSubstance SourceCard))
          (for SketchElement in (SKETCH.LIST.OF.ELEMENTS SketchSubstance (FUNCTION 
                                                                          NC.LinkIconSketchElementP))
             bind LinkIcon when (PROGN (SETQ LinkIcon (SKETCH.IMAGEOBJ.OF.ELEMENT SketchElement))
                                       (COND
                                          (LinkFlg (NC.SameLinkP LinkOrDestinationCard (
                                                                             NC.FetchLinkFromLinkIcon
                                                                                        LinkIcon)))
                                          (T (NC.SameCardP DestinationCard (fetch (Link 
                                                                                      DestinationCard
                                                                                        )
                                                                              of (
                                                                             NC.FetchLinkFromLinkIcon
                                                                                  LinkIcon))))))
             do (NC.DeleteLinkIconSketchElement SketchElement SourceCard 
                       Don'tCreateDeletedImageObjFlg)))))

(NC.ExternalizeLinkIconsInSketch
  (LAMBDA (Sketch)                                           (* rht%: "26-Mar-86 12:26")
          
          (* * Smashes all link icons in Sketch with external link icons.)

    (for SketchElement in (SKETCH.LIST.OF.ELEMENTS Sketch (FUNCTION NC.LinkIconSketchElementP)
                                 T) do (LET* ((LinkIcon (SKETCH.IMAGEOBJ.OF.ELEMENT SketchElement))
                                              (Link (NC.FetchLinkFromLinkIcon LinkIcon)))
                                             (NC.CoerceToExternalPutLinkIcon LinkIcon
                                                    (fetch (Link SourceCard) of Link)
                                                    (fetch (Link DestinationCard) of Link)
                                                    (fetch (Link Label) of Link))))
    Sketch))

(NC.MakeExternalSketchCopy
  [LAMBDA (SketchViewerOrImageObj)                           (* ; "Edited 22-Jan-88 22:32 by Trigg")

(* ;;; "Make a copy of the sketch smashing any link icons.")
          
          (* ;; "rht 4/22/87: Now installs proper grid, scale and region viewed in the copy.  Now returns a sketch imageobj.")
          
          (* ;; "rht 1/22/88: Changed call of SKETCH.REGION.VIEWED to SKETCH.REGION.OF.SKETCH.")

    (LET ((SketchCopy (SKETCH.ADD.ELEMENT NIL NIL)))
         (SKETCH.COPY.ELEMENTS (SKETCH.ELEMENTS.OF.SKETCH (INSURE.SKETCH SketchViewerOrImageObj))
                SketchCopy)
         (NC.ExternalizeLinkIconsInSketch SketchCopy)
         (MAKE.IMAGE.OBJECT.OF.SKETCH SketchCopy (SKETCH.REGION.OF.SKETCH SketchViewerOrImageObj)
                (SKETCH.VIEWER.SCALE SketchViewerOrImageObj)
                (SKETCH.VIEWER.GRID SketchViewerOrImageObj])

(NC.SK.COPY.BUTTONEVENTFN
  (LAMBDA (Window)                                           (* fgh%: "30-Jun-86 23:50")
          
          (* * Check to see if the TTY PROCESS is a Select NoteCards, if so then ask get 
          user to choose a link icon and pass it back.
          Otherwise, just call the normal sketch copybuttoneventfn.)

    (if (AND (WINDOWP (PROCESSPROP (TTY.PROCESS)
                             'WINDOW))
             (WINDOWPROP (PROCESSPROP (TTY.PROCESS)
                                'WINDOW)
                    'SelectingCards))
        then 
          
          (* * Okay, TTY is a select NC process.)

             (LET ((ChosenElement (SKETCH.GET.ELEMENTS Window T
                                         (SKETCH.LIST.OF.ELEMENTS
                                          (INSURE.SKETCH Window)
                                          (FUNCTION (LAMBDA (Element)
                                                      (AND (EQ (GETSKETCHELEMENTPROP Element
                                                                      'TYPE)
                                                               'SKIMAGEOBJ)
                                                           (NC.LinkIconImageObjP (
                                                                                 GETSKETCHELEMENTPROP
                                                                                  Element
                                                                                  'DATA)))))))))
                  (if ChosenElement
                      then (COPYINSERT (GETSKETCHELEMENTPROP ChosenElement 'DATA))))
      else 
          
          (* * TTY is not select NC, do what sketch does.)

           (SK.COPY.BUTTONEVENTFN Window))))
)

[LOADINITADVISE NC-ADVICE0297 (CREATE.SKETCHW.COMMANDMENU (NIL (AFTER NIL (NC.RemoveSketchMenuItems
                                                                           !VALUE]



(* ;;; "This stuff supports the push-copy method of copying links in NC")

(DEFINEQ

(NC.TranslateWindowPositionToSketchPosition
  (LAMBDA (Card Window WindowPositionX WindowPositionY)      (* fgh%: " 6-Feb-86 22:10")
          
          (* * fgh |2/6/86| Added Card argument.)

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



(* ;;; "Special stuff for autoloading maps")

(DEFINEQ

(NC.FakeMapInputFn
  (LAMBDA (SketchWin)                                        (* rht%: " 9-Oct-86 14:55")
          
          (* * This just to force autoload of the NCMAPS library package.)

    (NC.AutoloadApply* (FUNCTION SK.MAP.INPUTFN)
           SketchWin)))

(NC.FakeMapInsideFn
  (LAMBDA (Elem Region)                                      (* rht%: " 9-Oct-86 18:03")
          
          (* * This just to force autoload of the NCMAPS library package.)

    (NC.AutoloadApply* (FUNCTION SK.MAP.INSIDEFN)
           Elem Region)))
)
(DECLARE%: DONTEVAL@LOAD 

(NC.StoreAutoloadFnFile (FUNCTION SK.MAP.INPUTFN)
       'NCMAPS
       'NOTECARDSDIRECTORIES)

(NC.StoreAutoloadFnFile (FUNCTION SK.MAP.INSIDEFN)
       'NCMAPS
       'NOTECARDSDIRECTORIES)

(NC.StoreAutoloadFnFile (FUNCTION SetCachedBitMap)
       'NCMAPS
       'NOTECARDSDIRECTORIES)

(OR (FMEMB 'MAP SKETCH.ELEMENT.TYPE.NAMES)
    (CREATE.SKETCH.ELEMENT.TYPE 'MAP "Map" "Forces autoload of MAP package." NIL NIL NIL NIL
           (FUNCTION NC.FakeMapInputFn)
           (FUNCTION NC.FakeMapInsideFn)))
)



(* ;;; "Add sketch card type to CardType list")

(DEFINEQ

(NC.AddSketchCard
  (LAMBDA NIL                                                (* ; "Edited  3-Dec-87 19:01 by rht:")
          
          (* * fgh 11/14/85%: Updated to conform to merging of cardTypes and 
          SubstanceTypes.)
          
          (* * Added LinkIconAttachedBitMap field.)
          
          (* * rht 2/28/87%: Ripped out old LAMBDA wrapper around GetFn.)

    (DECLARE (GLOBALVARS NC.SketchCardIcon))
    (NC.AddCardType 'Sketch 'NoteCard `((MakeFn ,(FUNCTION NC.MakeSketchCard))
                                        (EditFn ,(FUNCTION NC.BringUpSketchCard))
                                        (QuitFn ,(FUNCTION NC.SketchCardCloseFn))
                                        (GetFn ,(FUNCTION NC.GetSketchSubstance))
                                        (PutFn ,(FUNCTION NC.PutSketchSubstance))
                                        (CopyFn ,(FUNCTION NC.SketchCopySubstance))
                                        (MarkDirtyFn ,(FUNCTION NC.MarkSketchDirty))
                                        (DirtyPFn ,(FUNCTION NC.SketchDirtyP))
                                        (CollectLinksFn ,(FUNCTION NC.CollectReferencesInSketch))
                                        (DeleteLinksFn ,(FUNCTION NC.DelReferencesToCardFromSketch))
                                        (UpdateLinkIconsFn ,(FUNCTION NC.UpdateLinkImagesInSketch))
                                        (InsertLinkFn ,(FUNCTION NC.InsertLinkInSketch))
                                        (TranslateWindowPositionFn ,(FUNCTION 
                                                           NC.TranslateWindowPositionToSketchPosition
                                                                     ))
                                        (MiddleButtonMenuItems ,(SKETCH.COMMANDMENU.ITEMS NIL T)))
           `((DefaultWidth 400)
             (DefaultHeight 350)
             (LinkAnchorModesSupported T)
             (LinkDisplayMode Title)
             (DisplayedInMenuFlg T)
             (LinkIconAttachedBitMap ,NC.SketchCardIcon)))))
)
(DECLARE%: DONTEVAL@LOAD 

(NC.AddSketchCard)
)

(PUTPROPS NCSKETCHCARD FILETYPE :TCOMPL)

(PUTPROPS NCSKETCHCARD MAKEFILE-ENVIRONMENT (:PACKAGE "IL" :READTABLE "INTERLISP" :BASE 10))
(PUTPROPS NCSKETCHCARD COPYRIGHT ("Xerox Corporation" 1985 1986 1987 1988))
(DECLARE%: DONTCOPY
  (FILEMAP (NIL (3051 3649 (NCAddStub.SketchCard 3061 . 3647)) (4030 32092 (NC.MakeSketchCard 4040 . 
5997) (NC.BringUpSketchCard 5999 . 9805) (NC.SketchDirtyP 9807 . 10428) (
NC.SketchTitleBarButtonEventFn 10430 . 11275) (NC.SketchCardCloseFn 11277 . 12683) (
NC.SketchCardShrinkFn 12685 . 13745) (NC.SketchCopySubstance 13747 . 14491) (NC.MarkSketchDirty 14493
 . 14918) (NC.CollectReferencesInSketch 14920 . 18316) (NC.GetSketchSubstance 18318 . 20174) (
NC.PutSketchSubstance 20176 . 22292) (NC.PutCachedMap 22294 . 23505) (NC.GetCachedMap 23507 . 24626) (
NC.UpdateLinkImagesInSketch 24628 . 25977) (NC.DelReferencesToCardFromSketch 25979 . 28503) (
NC.ExternalizeLinkIconsInSketch 28505 . 29398) (NC.MakeExternalSketchCopy 29400 . 30297) (
NC.SK.COPY.BUTTONEVENTFN 30299 . 32090)) (32359 32669 (NC.TranslateWindowPositionToSketchPosition 
32369 . 32667)) (32723 33283 (NC.FakeMapInputFn 32733 . 33004) (NC.FakeMapInsideFn 33006 . 33281)) (
33878 35961 (NC.AddSketchCard 33888 . 35959)))))
STOP