(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