(FILECREATED "17-Oct-86 15:08:15" {QV}<NOTECARDS>1.3K>NEXT>RHTPATCH123.;2 17005  

      changes to:  (FNS NC.SeverAllLinks NC.DeleteNoteCards NC.SmartDeleteLinks NC.QuitWithoutSaving 
			NC.FileBoxCollectChildren)
		   (VARS RHTPATCH123COMS)

      previous date: "16-Oct-86 18:46:50" {QV}<NOTECARDS>1.3K>NEXT>RHTPATCH123.;1)


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

(PRETTYCOMPRINT RHTPATCH123COMS)

(RPAQQ RHTPATCH123COMS ((* * Fix to bug #193: Quit w/o saving on card that's never been saved to 
			     notefile should do a delete.)
			  (* * Change to NCCARDS)
			  (FNS NC.QuitWithoutSaving)
			  (* * Change to NCDATABASE)
			  (FNS NC.GetNoteCard)
			  (* * Change to NCLINKS)
			  (FNS NC.SmartDeleteLinks)
			  (* * Change to NCFILEBOXCARD)
			  (FNS NC.FileBoxCollectChildren)))
(* * Fix to bug #193: Quit w/o saving on card that's never been saved to notefile should do a 
delete.)

(* * Change to NCCARDS)

(DEFINEQ

(NC.QuitWithoutSaving
  (LAMBDA (CardIdentifier)                                   (* rht: "17-Oct-86 12:56")

          (* Quit from a note card without saving its contents on the database. But must make sure that any updates that 
	  would have been done to this card even if it had been on the database are carried out on the old image currently on
	  the database)



          (* * rht 2/1/85: Now only writes out links if it has to. Also resets dirty flags and calls normal quit procedure.
	  I think we've still got possible problems with recently changed titles, both ours and those of cards we point to.)



          (* * rht 2/3/85: Now handles title changes properly. Also fixed so that changes to from links will force links to 
	  be written.)



          (* * rht 2/9/85: Now accepts IDs as arg.)



          (* * fgh 11/12/85: Updated to handle Card objects. Removed DatabaseStream argument.)



          (* * fgh 6/4/86 No longer asks for confirmation if no changes have been made.)



          (* * kef 8/7/86: Now compares ToLinks by NC.SameUIDP rather than EQ. Situation comes up in Server, when the same 
	  UIDs may not be EQ. Also, now obtains write lock on FROMLINKS before deleting FROMLINKS on the DestinationCard of a
	  changed FROMLINK.)



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



          (* * rht 10/16/86: Changed NC.ProtectedCardOperation wrapper placement so that card deletion could still happen for
	  new cards.)


    (LET (Window Card NewFromLinks ToLinks DeletedLinks Process TextObj MadeNewLinksP 
		 ChangedFromLinksP OldFromLinks OldToLinks OperationInProgress)
         (SETQ Card (NC.CoerceToCard CardIdentifier))
         (SETQ Window (NC.FetchWindow Card))
         (if (SETQ OperationInProgress (NC.OperationInProgress Card))
	     then 

          (* * Another interaction operation is in progress on this card and we have to interact with the user.
	  Can't do.)


		    (NC.PrintOperationInProgressMsg Window "Close w/o Saving" OperationInProgress)
	   else (SETQ NewFromLinks (NC.FetchFromLinks Card))
		  (SETQ ToLinks (NC.FetchToLinks Card))
		  (if (OR (NULL (OR (NC.CardDirtyP Card)
					    (NC.FetchLinksDirtyFlg Card)
					    (NC.FetchTitleDirtyFlg Card)
					    (NC.FetchPropListDirtyFlg Card)))
			      (NC.AskYesOrNo "Are you sure you want to flush your changes?" " -- " 
					       "Yes"
					       T Window NIL NIL))
		      then 

          (* * EIther no changes have been made or the user has confirmed.)


			     (if (EQ (fetch (Card Status) of Card)
					 (QUOTE ACTIVE))
				 then (NC.ProtectedCardOperation
					  Card Close% wo% Saving 
                                                             (* Read old card parts off notefile.)
					  (NC.GetNoteCard Card)
                                                             (* If from links have changed then we'll have to write
							     the new ones out.)
					  (SETQ OldFromLinks (NC.FetchFromLinks Card))
					  (if (NOT (NC.SameLinksP NewFromLinks OldFromLinks))
					      then (NC.SetFromLinks Card NewFromLinks)
						     (SETQ ChangedFromLinksP T))
                                                             (* Delete the back links from all links that are not 
							     in the old to link set.)
					  (SETQ OldToLinks (NC.FetchToLinks Card))
					  (for ToLink in ToLinks
					     unless (for Link in OldToLinks eachtime
										   (BLOCK)
							 thereis (NC.SameLinkP Link ToLink))
					     do (LET ((DestinationCard (fetch (Link 
										  DestinationCard)
									    of ToLink)))
                                                             (* Grab the writelock on the FROMLINKS before trying 
							     to write out the change.)
						       (NC.WithWritePermission DestinationCard
									       (QUOTE FROMLINKS)
									       (NC.DelFromLink
										 ToLink)
									       (SETQ MadeNewLinksP 
										 T))))
                                                             (* Check to make sure none of the old To links point 
							     to a deleted card. If so, replace with a deleted 
							     marker.)
					  (SETQ DeletedLinks
					    (bind DestinationCard for Link in OldToLinks
					       eachtime (BLOCK)
					       when (PROGN (SETQ DestinationCard
								 (fetch (Link DestinationCard)
								    of Link))
							       (AND (NOT (NC.ActiveCardP 
										  DestinationCard))
								      (EQ (QUOTE DELETED)
									    (NC.FetchStatus 
										  DestinationCard))))
					       collect (NC.DelReferencesToCard Card 
										  DestinationCard)
							 Link))
					  (NC.SetToLinks Card (LDIFFERENCE OldToLinks 
									       DeletedLinks))
                                                             (* Mark links dirty if we had to delete any to links 
							     or if the from links changed.)
					  (NC.SetLinksDirtyFlg Card (OR DeletedLinks 
									    ChangedFromLinksP))
                                                             (* Mark the substance dirty if had to delete any to 
							     links.)
					  (if DeletedLinks
					      then (NC.MarkCardDirty Card)
					    else (NC.MarkCardDirty Card (QUOTE RESET)))
					  (NC.SetPropListDirtyFlg Card NIL)
					  (if (NC.FetchTitleDirtyFlg Card)
					      then 

          (* If we've changed title and any of the cards pointing to this one are up on the screen, then we need to update 
	  their images.)


						     (for FromLink in OldFromLinks bind 
										       SourceCard
							eachtime (BLOCK)
							when (AND (NC.ActiveCardP
									(SETQ SourceCard
									  (fetch (Link SourceCard)
									     of FromLink)))
								      (WINDOWP (NC.FetchWindow
										   SourceCard)))
							do (NC.UpdateLinkImages SourceCard Card))
						     (NC.SetTitleDirtyFlg Card NIL)))
					(NC.QuitCard Card T NIL NIL T)
			       else                        (* If the card has never been written to the database 
							     quit w/o saving is equivalent to deleting the card.)
				      (NC.PrintMsg Window T "This card has never been saved."
						     (CHARACTER 13)
						     "It will be deleted from the database."
						     (CHARACTER 13))
				      (NC.DeleteNoteCards Card NIL T)))))))
)
(* * Change to NCDATABASE)

(DEFINEQ

(NC.GetNoteCard
  (LAMBDA (Card)                                             (* rht: "16-Oct-86 18:07")

          (* * Get a note card from the database.)



          (* * kirk 27Nov85 Changed to call NC.GetMainCardData)



          (* * rht 10/16/86: Now checks that card is active before doing Get.)


    (if (EQ (fetch (Card Status) of Card)
		(QUOTE ACTIVE))
	then (WITH.MONITOR (NC.FetchMonitor (fetch (Card NoteFile) of Card))
			     (PROGN (NC.GetMainCardData Card)
				      (NC.GetLinks Card)
				      (NC.GetTitle Card)
				      (NC.GetPropList Card)
				      (NC.ActivateCard Card)
				      Card)))))
)
(* * Change to NCLINKS)

(DEFINEQ

(NC.SmartDeleteLinks
  (LAMBDA (ListOfLinks QuietFlg InterestedWindow Don'tPutToBeDeletedCardsFlg)
                                                             (* rht: "17-Oct-86 11:51")

          (* * Delete a bunch of links efficiently. Sort so that links with same source bunch together.
	  This way, only read and write each source card once. If a card has the AboutToBeDeletedFlg UID prop set and 
	  Don'tPutToBeDeletedCardsFlg is non-nil, then don't put it down to the file even if changes were made.
	  Just throw away its cache.)



          (* * rht 10/17/86: Now passes non-nil NoOrphanHookFlg to NC.DeleteLink unless destination card is marked as about 
	  to be deleted.)


    (LET (DestCardsw/oLinksCached NumLinksToDelete)

          (* * For each destination card, make sure its links are cached. At the same time, collect these cards for future 
	  uncaching.)


         (SETQ DestCardsw/oLinksCached (for Link in ListOfLinks bind DestCard
					    when (NOT (NC.LinksCachedP (SETQ DestCard
									       (fetch (Link 
										  DestinationCard)
										  of Link))))
					    collect (NC.GetLinks DestCard)
						      DestCard))

          (* * Sort the List of links so that links with same source cards bunch together.)


         (OR QuietFlg (NC.PrintMsg InterestedWindow T "Sorting " (SETQ NumLinksToDelete
					 (LENGTH ListOfLinks))
				       " links prior to deletion."))
         (SORT ListOfLinks (FUNCTION (LAMBDA (Link1 Link2)
		     (LESSP (fetch (Card IndexLoc) of (fetch (Link SourceCard) of Link1))
			      (fetch (Card IndexLoc) of (fetch (Link SourceCard) of Link2)))))
		 )

          (* * Now bring up source cards one at a time and do the delete of the links.)


         (OR QuietFlg (NC.PrintMsg InterestedWindow T "Deleting links: 1 out of " 
				       NumLinksToDelete " ..."))
         (for Link in ListOfLinks as i from 1 bind PreviousSourceCard WasNotActiveFlg 
							     SavedFromLinks HadLinksCachedFlg
	    eachtime (BLOCK)
	    do (OR QuietFlg (if (ZEROP (REMAINDER i 10))
				    then (NC.PrintMsg InterestedWindow T "Deleting links: " i 
							  " out of "
							  NumLinksToDelete " ...")))
		 (LET ((SourceCard (fetch (Link SourceCard) of Link)))
		      (if (NOT (NC.SameCardP SourceCard PreviousSourceCard))
			  then                             (* Write down changes to previous card's substance.)
				 (if WasNotActiveFlg
				     then                  (* Have to call NC.CardSaveFn first and then 
							     NC.QuitCard with Don'tSaveFlg to avoid 
							     insureProperFiling check.)
					    (if (AND Don'tPutToBeDeletedCardsFlg
							 (NC.UIDGetProp (fetch (Card UID)
									     of PreviousSourceCard)
									  (QUOTE 
									      AboutToBeDeletedFlg)))
						then       (* Throw away cache if card about to be deleted.)
						       (NC.DeactivateCard PreviousSourceCard)
					      else (NC.CardSaveFn PreviousSourceCard T)
						     (NC.QuitCard PreviousSourceCard NIL T NIL NIL 
								    NIL NIL T))
                                                             (* Recache links for previous card if they were cached
							     before.)
					    (if HadLinksCachedFlg
						then (NC.GetLinks PreviousSourceCard)))
                                                             (* Cache card and overwrite from links with previously
							     cached ones.)
				 (if (SETQ WasNotActiveFlg (NOT (NC.ActiveCardP SourceCard)))
				     then                  (* Save cached from links for this card.)
					    (SETQ SavedFromLinks (if (SETQ HadLinksCachedFlg
									   (NC.LinksCachedP 
										       SourceCard))
								       then (NC.FetchFromLinks
										SourceCard)))
					    (NC.GetNoteCard SourceCard)
					    (if HadLinksCachedFlg
						then (NC.SetFromLinks SourceCard SavedFromLinks)))
			    )
		      (NC.DeleteLink Link (NC.UIDGetProp (fetch (Card UID)
								of (fetch (Link DestinationCard)
									of Link))
							     (QUOTE AboutToBeDeletedFlg)))
		      (SETQ PreviousSourceCard SourceCard))
	    finally (if WasNotActiveFlg
			  then                             (* Have to call NC.CardSaveFn first and then 
							     NC.QuitCard with Don'tSaveFlg to avoid 
							     insureProperFiling check.)
				 (if (AND Don'tPutToBeDeletedCardsFlg (NC.UIDGetProp
						(fetch (Card UID) of PreviousSourceCard)
						(QUOTE AboutToBeDeletedFlg)))
				     then                  (* Throw away cache if card about to be deleted.)
					    (NC.DeactivateCard PreviousSourceCard)
				   else (NC.CardSaveFn PreviousSourceCard T)
					  (NC.QuitCard PreviousSourceCard NIL T NIL NIL NIL NIL T))
                                                             (* Recache links for previous card if they were cached
							     before.)
				 (if HadLinksCachedFlg
				     then (NC.GetLinks PreviousSourceCard))))

          (* * Finally, write down links for cards whose links have changed and whose links weren't cached when this function
	  was called.)


         (for DestCard in DestCardsw/oLinksCached eachtime (BLOCK) when (
									    NC.FetchLinksDirtyFlg
										    DestCard)
	    do (NC.PutLinks DestCard))
         (OR QuietFlg (NC.ClearMsg InterestedWindow T)))))
)
(* * Change to NCFILEBOXCARD)

(DEFINEQ

(NC.FileBoxCollectChildren
  (LAMBDA (WindowOrTextStream Card NewChildren NoDisplayFlg)
                                                             (* rht: "17-Oct-86 15:03")

          (* * Ask user for new children (either cards or fileboxes) for this filebox. Check to make sure that no 
	  circularities are introduced. This code is sort of the inverse of the NC.AddParents code and thus looks quite 
	  similar.)



          (* * rht 10/29/84: Added NoDisplayFlg to prevent error message when no appropriate elements exist.
	  Also now returns ID if at least one child was added, NIL otherwise.)



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



          (* * rht 7/5/86: Now checks for readonly cards.)



          (* * rht 8/11/86: Added code to check to make sure that another operation is not in progress on this card when this
	  fn is called.)



          (* * rht 10/17/86: Made successful filing operations NOT do dismiss.)


    (OR Card (SETQ Card (NC.CoerceToCard WindowOrTextStream)))
    (LET ((Window (NC.FetchWindow Card))
	  OperationInProgress)
         (if (NC.CheckForNotReadOnly Card Window "Can't do filing in ")
	     then (if (SETQ OperationInProgress (NC.OperationInProgress Card))
			then 

          (* * Another interaction operation is in progress on this card and we have to interact with the user.
	  Can't do.)


			       (NC.PrintOperationInProgressMsg Window "Put Cards Here" 
								 OperationInProgress)
		      else (NC.ProtectedCardOperation Card Put% Cards% Here
							(OR NewChildren
							      (SETQ NewChildren
								(NC.SelectNoteCards NIL NIL 
								  NC.SelectingFileBoxChildrenMenu 
										      Card NIL 
								   " Please select new children.")))
							(COND
							  ((AND NewChildren Card
								  (for NewChild in NewChildren
								     bind OneHook
								     when (NC.MakeChildLink
									      NewChild Card Window)
								     do (SETQ OneHook T)
								     finally (RETURN OneHook)))
							    Card)
							  ((NULL NoDisplayFlg)
							    (NC.PrintMsg Window NIL 
						  "No appropriate NoteCards or FileBoxes chosen."
									   (CHARACTER 13)
									   "Hence no children added."
									   (CHARACTER 13))
							    (DISMISS 1000)
							    (NC.ClearMsg Window T)
							    NIL)
							  (T NIL))))))))
)
(PUTPROPS RHTPATCH123 COPYRIGHT ("Xerox Corporation" 1986))
(DECLARE: DONTCOPY
  (FILEMAP (NIL (969 7798 (NC.QuitWithoutSaving 979 . 7796)) (7832 8544 (NC.GetNoteCard 7842 . 8542)) (
8575 14364 (NC.SmartDeleteLinks 8585 . 14362)) (14401 16923 (NC.FileBoxCollectChildren 14411 . 16921))
)))
STOP