(FILECREATED "20-Nov-87 22:35:50" {QV}<NOTECARDS>1.3KNEXT>RHTPATCH296.;3 14637  

      changes to:  (VARS RHTPATCH296COMS)
		   (FNS NC.MakeLink NC.AssignTitle)

      previous date: "20-Nov-87 16:39:30" {QV}<NOTECARDS>1.3KNEXT>RHTPATCH296.;1)


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

(PRETTYCOMPRINT RHTPATCH296COMS)

(RPAQQ RHTPATCH296COMS ((* * Fixes several cases left out of the ShowLinks fixes in RHTPATCH289, 
			     namely when title of card A is changed and there's a link, possibly 
			     cross-file, to card B which has a ShowLinks menu. Also now automatically 
			     recomputes visible ShowLinks menus when links are first created.)
			  (* * Change to NCCARDS)
			  (FNS NC.AssignTitle)
			  (* * Change to NCLINKS)
			  (FNS NC.MakeLink)))
(* * Fixes several cases left out of the ShowLinks fixes in RHTPATCH289, namely when title of 
card A is changed and there's a link, possibly cross-file, to card B which has a ShowLinks 
menu. Also now automatically recomputes visible ShowLinks menus when links are first created.)

(* * Change to NCCARDS)

(DEFINEQ

(NC.AssignTitle
  (LAMBDA (CardIdentifier NoClearMsgFlg NewTitle InterestedWindow)
                                                             (* rht: "20-Nov-87 22:14")

          (* * Change the title of the card specified by the WindowOrTextStreamOrID)



          (* * rht 2/1/85: Changed from NC.PutTitle to NC.SetTitleDirtyFlg, unless card is not active.
	  We shouldn't be writing to the notefile until save time.)



          (* * fgh 11/11/85: Added support for CardID, CardInfo and noteFile objects. Also entered call to Nc.StoreTitle.)



          (* * fgh 6/9/86 Added code to check to make sure that another operation is not in progress on this card when this 
	  fn is called.)



          (* * fgh 6/13/86 Now spawns mouse in case called under MOUSE process.)



          (* * fgh 6/27/86 returns T if completed okay.)



          (* * rht 7/4/86: Added check for readonly card.)



          (* * kef 7/16/86: Added obtain write permission.)



          (* * kef 7/24/86: Doesn't release the write lock if this is a new card.)



          (* * kef 7/30/86: Modified to check for Client's concept of whether he owns the write lock or not, thus deciding 
	  whether or not to setup the release of the write lock afterwards.)



          (* * fgh 8/30/86 Converted to use NC.IfCardPartNotBusy.)



          (* * rg 3/3/87 Enlarged scope of NC.ProtectedCardOperation)



          (* * rht 3/23/87: Now takes InterestedWindow arg.)



          (* * rht 3/24/87: Now calls NC.CoerceToInterestedWindow)



          (* * rht 5/27/87: Now passes title through cross-file link card if dest notefile is open.)



          (* * rht 5/29/87: Now uncaches links if they weren't cached when we came in.)



          (* * rht 11/20/87: Now updates ShowLinks menus if any for destinations of ToLinks from this card.)


    (ALLOW.BUTTON.EVENTS)
    (LET ((Card (NC.CoerceToCard CardIdentifier))
	  OldTitle Window)
         (NC.ProtectedCardOperation
	   Card "Assign Title" NIL
	   (NC.IfCardPartNotBusy Card (QUOTE TITLE)
				 (OR InterestedWindow (SETQ InterestedWindow (
					   NC.CoerceToInterestedWindow Card)))
				 (if (NC.CheckForNotReadOnly Card InterestedWindow 
							      "Can't change titles for cards in ")
				     then
				      (COND
					((SETQ NewTitle
					    (OR (STRINGP NewTitle)
						  (AND NewTitle (OR (LITATOM NewTitle)
									(NUMBERP NewTitle))
							 (MKSTRING NewTitle))
						  (NC.AskUser (CONCAT 
								  "Enter the title for this card"
									  (CHARACTER 13))
								"-->  "
								(COND
								  ((AND (STREQUAL (SETQ 
											OldTitle
											(
										 NC.RetrieveTitle
											  Card))
										      "Untitled")
									  (NC.FetchNewCardFlg
									    Card))
								    NIL)
								  (T OldTitle))
								(NULL NoClearMsgFlg)
								InterestedWindow)))
					  (NC.SetTitle Card NewTitle)

          (* * Now do a PutTitle so that anyone else coming along will pick up on the new title. The only exception is if 
	  this card hasn't been written to the NoteFile yet, which is true when the NewCardFlg is T. In that case, we can't 
	  put the title down yet, so just mark it dirty.)


					  (COND
					    ((fetch (Card NewCardFlg) of Card)
					      (NC.SetTitleDirtyFlg Card T))
					    (T (NC.PutTitle Card)
					       (NC.SetTitleDirtyFlg Card NIL)))
					  (AND (WINDOWP (SETQ Window (NC.FetchWindow Card)))
						 (WINDOWPROP Window (QUOTE TITLE)
							       NewTitle))
					  (LET ((LinksWereCachedFlg (NC.LinksCachedP Card)))
					       (if (NOT LinksWereCachedFlg)
						   then (NC.GetLinks Card))
					       (for FromLink in (NC.FetchFromLinks Card)
						  do (LET ((ContainingCard (fetch (Link 
										       SourceCard)
										of FromLink))
							     RemoteCrossFileLinkCard)
							    (if (AND (NC.CrossFileLinkCardP
									   ContainingCard)
									 (SETQ 
									  RemoteCrossFileLinkCard
									   (
								  NC.FetchRemoteCrossFileLinkCard
									     ContainingCard)))
								then (
								   NC.CheckCrossFileLinkCardTitle
									 RemoteCrossFileLinkCard Card)
							      else (AND (NC.ActiveCardP 
										   ContainingCard)
									    (WINDOWP (
										   NC.FetchWindow
											 
										   ContainingCard))
									    (NC.UpdateLinkImages
									      ContainingCard Card)))))
					       (for ToLink in (NC.FetchToLinks Card)
						  do (LET ((ContainingCard (fetch (Link 
										  DestinationCard)
										of ToLink))
							     RemoteCrossFileLinkCard)
							    (if (AND (NC.CrossFileLinkCardP
									   ContainingCard)
									 (SETQ 
									  RemoteCrossFileLinkCard
									   (
								  NC.FetchRemoteCrossFileLinkCard
									     ContainingCard)))
								then (
								   NC.CheckCrossFileLinkCardTitle
									 RemoteCrossFileLinkCard Card)
							      else (NC.UpdateLinkImagesInShowLinks
								       ContainingCard Card))))
					       (if (NOT LinksWereCachedFlg)
						   then (NC.UncacheLinks Card)))
					  T))
				   else NIL))))))
)
(* * Change to NCLINKS)

(DEFINEQ

(NC.MakeLink
  (LAMBDA (Window LinkLabel DestinationCard SourceCard DisplayMode AnchorMode Message NoDisplayFlg 
		  LinkToInsertAfter CrossFileLinksMode)      (* rht: "20-Nov-87 22:27")

          (* * Make a link from (OR Window SourceCard) to DestinationCard with linklabel of LinkLabel)



          (* * rht 1/12/85: If need to create a new card, then now shows card type menu near window of SourceID.)



          (* * rht 1/13/85: Added extra args Message and NoDisplayFlg.)



          (* * rht 3/26/85: Added LinkToInsertAfter arg which should be NIL or a link to insert the new To link after.
	  If NIL, then insert at front of ToLinks.)



          (* * kirk 9/23/85: took out GETPROMPTWINDOW call for asknotecardtype)



          (* * kirk: 14Nov85: changed NC.CoerceToID to to NC.CoerceToCard)



          (* * fgh 11/16/85 Changed from PROG to LET and used COND to contyrol returnmed value.)



          (* * fgh 2/5/86 Changed call DefaultLinkDisplayMode to FetchLinkDisplayMode)



          (* * fgh 6/5/86 Now calls AskLinkLabel if LinkLabel arg is NIL)



          (* * rht 7/4/86: Added check for readonly card.)



          (* * kef 7/17/86: Added calls to grab the write permission on the appropriate card parts.)



          (* * kef 7/22/86: Saves the links on the Destination Card now right away, while still holding onto the FROMLINKS 
	  write lock.)



          (* * fgh 8/30/86 Adpated to use NC.IfCardPartNotBusy.)



          (* * rht 9/29/86: Tossed Ken's call to NC.PutFromLinks; It was the cause of too many nasty breaks.
	  Also made syntactic fixes.)



          (* * rht 10/4/86: Now handles cross file links. New arg CrossFileLinksMode determines whether cross-file link will 
	  be two-way, i.e. will destination card know it's being linked to.)



          (* * rht 11/10/86: Now creates new crossfile link if Destination card is a CrossFileLink card that we didn't just 
	  create.)



          (* * rht 11/14/86: Now checks if non-nil DestinationCard before trying to do cross-filelink stuff.)



          (* * pmi 12/5/86: Modified message to NC.SelectNoteCards to mention SHIFT-selection.)



          (* * rht 12/9/86: Throws out JustCreatedFlg marker stuff.)



          (* * pmi 12/12/86: Removed obsolete ReturnLinksFlg argument in call to NC.SelectNoteCards.)



          (* * rht 12/16/86: Fixed bug whereby electing not to open notefile containing crossfilelink dest card caused 
	  break.)



          (* * rht 12/16/86: Now passes Window down to NC.GetCrossFileLinkDestCard.)



          (* * rg 3/18/87 added NCP.WithLockedCards wrapper)



          (* * rht 5/25/87: No longer tries to make two way cross-file links when dest notefile is open read-only.
	  Also assumes that CrossFileLinksMode is one of TWOWAY, ONEWAY or ASK. Now fills in the new 
	  RemoteCrossFileLinkCardUID field of cross file link cards.)



          (* * rht 11/20/87: Now recomputes ShowLinks menus if they're visible.)


    (DECLARE (GLOBALVARS NC.SelectingSingleCardMenu NC.NewCrossFileLinksMode))
    (OR SourceCard (SETQ SourceCard (NC.CoerceToCard Window)))
    (AND
      (NC.CheckForNotReadOnly SourceCard Window "Can't make links in ")
      (NCP.WithLockedCards
	(LET (Link Type)
	     (OR Window (SETQ Window (NC.FetchWindow SourceCard)))
	     (OR Message (SETQ Message "Please shift-select the Card or Box to be linked to."))
	     (OR LinkLabel (SETQ LinkLabel (NC.AskLinkLabel Window NIL NIL T NIL)))
	     (OR DestinationCard (SETQ DestinationCard (NC.SelectNoteCards
		       T
		       (FUNCTION (LAMBDA (Card)
			   (COND
			     ((NOT (NC.SameCardP Card SourceCard))
			       T)
			     (T (NC.PrintMsg Window T "A Card/Box cannot link to itself. "
					       (CHARACTER 13)
					       "Selection ignored."
					       (CHARACTER 13))
				NIL))))
		       NC.SelectingSingleCardMenu SourceCard Message)))
	     (if (EQ DestinationCard (QUOTE *New% Card*))
		 then (SETQ DestinationCard (AND (SETQ Type (NC.AskNoteCardType
							   (WINDOWREGION Window)))
						       (NC.CoerceToCard (NC.MakeNoteCard
									    Type
									    (fetch (Card NoteFile)
									       of SourceCard)
									    NIL NoDisplayFlg)))))

          (* * If we're trying to link to a CrossFileLink card, then check whether card was just created.
	  If so, then it's the first link, otherwise we make a new CrossFileLink.)


	     (AND DestinationCard (NC.CrossFileLinkCardP DestinationCard)
		    (SETQ DestinationCard (NC.GetCrossFileLinkDestCard DestinationCard Window))
		    (NC.SetUserDataProp DestinationCard (QUOTE JustCreatedFlg)
					  NIL))
	     (if DestinationCard
		 then
		  (NC.IfCardPartNotBusy
		    DestinationCard
		    (QUOTE FROMLINKS)
		    (NC.IfCardPartNotBusy
		      SourceCard
		      (QUOTE TOLINKS)

          (* * If have cross-file link, then make two new crossfilelink cards, one per notefile. Make global link over there 
	  from crossfilelink card to DestinationCard and local link here from SourceCard to crossfilelink card.)


		      (if (NOT (NC.SameNoteFileP (fetch (Card NoteFile) of SourceCard)
						       (fetch (Card NoteFile) of DestinationCard))
				   )
			  then (LET ((CrossFileLinksTwoWayFlg
					 (OR (EQ CrossFileLinksMode (QUOTE TWOWAY))
					       (AND (NULL CrossFileLinksMode)
						      (EQ NC.NewCrossFileLinksMode (QUOTE TWOWAY))
						      )
					       (AND (OR (EQ CrossFileLinksMode (QUOTE ASK))
							    (AND (NULL CrossFileLinksMode)
								   (EQ NC.NewCrossFileLinksMode
									 (QUOTE ASK))))
						      (NC.AskCrossFileLinkMode DestinationCard 
										 Window))))
				       RemoteSourceCard)
				      (if CrossFileLinksTwoWayFlg
					  then (AND (SETQ RemoteSourceCard
							  (NC.CreateCrossFileLinkCard 
										  DestinationCard 
										       SourceCard T))
							(NC.MakeGlobalLink Window LinkLabel 
									     DestinationCard 
									     RemoteSourceCard 
									     DisplayMode)))
				      (SETQ DestinationCard (NC.CreateCrossFileLinkCard 
										       SourceCard 
										  DestinationCard 
									  CrossFileLinksTwoWayFlg))
				      (if RemoteSourceCard
					  then             (* Make the two crossfile link cards know about each 
							     other's UIDs.)
						 (replace (CrossFileLinkSubstance 
								       RemoteCrossFileLinkCardUID)
						    of (NC.FetchSubstance RemoteSourceCard)
						    with (fetch (Card UID) of DestinationCard))
						 (replace (CrossFileLinkSubstance 
								       RemoteCrossFileLinkCardUID)
						    of (NC.FetchSubstance DestinationCard)
						    with (fetch (Card UID) of RemoteSourceCard))
					    )))
		      (SETQ Link (create Link
					     UID ←(NC.MakeUID)
					     SourceCard ← SourceCard
					     DestinationCard ← DestinationCard
					     AnchorMode ← AnchorMode
					     Label ← LinkLabel
					     DisplayMode ←(OR DisplayMode (NC.FetchLinkDisplayMode
								  SourceCard))))
		      (NC.AddToLink Link LinkToInsertAfter)
		      (NC.AddFromLink Link)                (* Recompute ShowLinks menus if they're up.)
		      (if (NC.FetchShowLinksWindow SourceCard)
			  then (NC.ShowLinks SourceCard))
		      (if (NC.FetchShowLinksWindow DestinationCard)
			  then (NC.ShowLinks DestinationCard))
		      Link))
	       else NIL))))))
)
(PUTPROPS RHTPATCH296 COPYRIGHT ("Xerox Corporation" 1987))
(DECLARE: DONTCOPY
  (FILEMAP (NIL (1116 6632 (NC.AssignTitle 1126 . 6630)) (6663 14555 (NC.MakeLink 6673 . 14553)))))
STOP