(FILECREATED "20-Aug-87 15:29:55" {QV}<NOTECARDS>1.3KNEXT>PMIPATCH058.;11 54194 changes to: (FNS NC.NoticedNoteFileNamesMenu) (VARS PMIPATCH058COMS) previous date: "18-Aug-87 12:37:50" {QV}<NOTECARDS>1.3KNEXT>PMIPATCH058.;7) (* Copyright (c) 1987 by Xerox Corporation. All rights reserved.) (PRETTYCOMPRINT PMIPATCH058COMS) (RPAQQ PMIPATCH058COMS ((DECLARE: FIRST (P (NC.LoadFileFromDirectories (QUOTE NCCOMPACT)))) (* * pmi 8/18/87: Changed menu of noticed notefiles to come up faster by caching it whenever possible.) (* * Changed in NCDATABASE) (FNS NC.NoticedNoteFileNamesMenu NC.RemoveNoteFileName NC.NoticeNoteFileName NC.AbortSession NC.CloseNoteFile NC.CompactNoteFile) (* * New for NCDATABASE) (* * The function NC.CreateNoteFileMenuItems replaces NC.CreateMenuBitmaps which should be removed.) (FNS NC.CreateNoteFileMenuItems) (GLOBALVARS NC.NoticedNoteFilesMenu NC.NoticedNoteFilesMenuNewItem) (VARS (NC.NoticedNoteFilesMenu) (NC.NoticedNoteFilesMenuNewItem)) (* * Changed in NCINTERFACE) (FNS NC.DoNoteFileOp) (* * Changed in NCCOMPACT) (FNS NC.CompactNoteFileToTarget))) (DECLARE: FIRST (NC.LoadFileFromDirectories (QUOTE NCCOMPACT)) ) (* * pmi 8/18/87: Changed menu of noticed notefiles to come up faster by caching it whenever possible.) (* * Changed in NCDATABASE) (DEFINEQ (NC.NoticedNoteFileNamesMenu (LAMBDA (IncludeNewNoteFileFlg AllowedOperations InterestedWindow Operation) (* pmi: "20-Aug-87 15:27") (* * Bring up a menu of all notefiles found in the notefiles hash array. Also allow user to open a new notefile.) (* * kirk 23Jan86 Added AskYesOrNo and InterestedWindow parameter) (* * fgh 6/8/86 Added check to make sure NoteFile is open if it has a menu on the screen. Needed to handle case of liongering NF menus.) (* * fgh 6/24/86 Changed to be a general function rather than one specific for opening. Now just returns the chosen name. Also, added IncludeNewNoteFileFlg and ShowOnlyOpenNFsFlg. Removed InterestedWindow arg.) (* * fgh 6/27/86 Added InterestedWindow & Operation args and call to NC.DatabaseFileName.) (* * pmi 12/4/86: Added version numbers to rootnames on list of known files. Also cleaned up help string for menu items. It was giving a bogus message about opening the selected file, even though this function is used for many operations and not just for Open.) (* * pmi 2/18/87: Added GLOBALVARS declaration for NC.MenuFont) (* * pmi 5/15/87: Used to be NC.ListOfNoteFilesMenu. Changed symbol for open notefile to o. Now uses NC.NoticedNoteFileNames instead of hash array to build menu. Returns a NoteFile name instead of a NoteFile object.) (* * pmi 5/21/87: Replaced each NoteFile menu item with a bitmap of its name in a large font and its full filename in a small font.) (* * pmi 8/20/87: Made modifications to speed up this menu: cache it when possible, only recompute the shading, etc.) (DECLARE (GLOBALVARS NC.FileNameFont NC.NoticedNoteFileNames NC.NoticedNoteFilesMenu NC.NoticedNoteFilesMenuNewItem WHITESHADE GRAYSHADE)) (LET (Result) (SETQ Result (PROG (Items) (if (NULL NC.NoticedNoteFilesMenu) then (SETQ Items (BQUOTE (,@(for NoteFileName in NC.NoticedNoteFileNames bind NoteFile collect (SELECTQ (GETPROP NoteFileName (QUOTE LastKnownStatus)) (OPEN (GETPROP NoteFileName (QUOTE OpenMenuItem))) (CLOSED (GETPROP NoteFileName (QUOTE ClosedMenuItem))) NIL)) ,@(if NC.NoticedNoteFilesMenuNewItem then (LIST NC.NoticedNoteFilesMenuNewItem) else (LIST (SETQ NC.NoticedNoteFilesMenuNewItem (QUOTE ("-- Other NoteFile --" (QUOTE NEW) "Select some other notefile - you'll be prompted for the name."))))) ))) (if (NULL Items) then (SELECTQ AllowedOperations (OPEN (NC.PrintMsg InterestedWindow NIL "No open NoteFiles." (CHARACTER 13))) (CLOSED (NC.PrintMsg InterestedWindow NIL "No closed NoteFiles." (CHARACTER 13))) (EITHER (NC.PrintMsg InterestedWindow NIL "No NoteFiles." (CHARACTER 13))) (NC.PrintMsg InterestedWindow NIL "No NoteFiles." (CHARACTER 13))) (RETURN NIL) elseif (AND (EQ (LENGTH Items) 1) (EQUAL (CADAR Items) (QUOTE (QUOTE NEW)))) then (RETURN (QUOTE NEW)) else (SETQ NC.NoticedNoteFilesMenu (create MENU ITEMS ← Items TITLE ← "NoteFiles" MENUFONT ← NC.FileNameFont ITEMHEIGHT ←(IPLUS (BITMAPHEIGHT (CAAR Items)) 1))))) (* * Shade either the open or closed files, depending on the type allowed by this operation.) (SELECTQ AllowedOperations (OPEN (for NoteFileName in NC.NoticedNoteFileNames do (SELECTQ (GETPROP NoteFileName (QUOTE LastKnownStatus)) (OPEN (SHADEITEM (GETPROP NoteFileName (QUOTE OpenMenuItem)) NC.NoticedNoteFilesMenu WHITESHADE)) (CLOSED (SHADEITEM (GETPROP NoteFileName (QUOTE ClosedMenuItem)) NC.NoticedNoteFilesMenu GRAYSHADE)) (SHADEITEM (GETPROP NoteFileName (QUOTE OpenMenuItem)) NC.NoticedNoteFilesMenu WHITESHADE)))) (CLOSED (for NoteFileName in NC.NoticedNoteFileNames do (SELECTQ (GETPROP NoteFileName (QUOTE LastKnownStatus)) (OPEN (SHADEITEM (GETPROP NoteFileName (QUOTE OpenMenuItem) ) NC.NoticedNoteFilesMenu GRAYSHADE)) (CLOSED (SHADEITEM (GETPROP NoteFileName (QUOTE ClosedMenuItem)) NC.NoticedNoteFilesMenu WHITESHADE)) (SHADEITEM (GETPROP NoteFileName (QUOTE OpenMenuItem)) NC.NoticedNoteFilesMenu WHITESHADE)))) (for NoteFileName in NC.NoticedNoteFileNames do (SHADEITEM (GETPROP NoteFileName (QUOTE OpenMenuItem)) NC.NoticedNoteFilesMenu WHITESHADE))) (* * Shade the new notefile item if a new notefile is allowed.) (if IncludeNewNoteFileFlg then (SHADEITEM NC.NoticedNoteFilesMenuNewItem NC.NoticedNoteFilesMenu WHITESHADE) else (SHADEITEM NC.NoticedNoteFilesMenuNewItem NC.NoticedNoteFilesMenu GRAYSHADE)) (replace (MENU IMAGE) of NC.NoticedNoteFilesMenu with NIL) (RETURN (MENU NC.NoticedNoteFilesMenu)))) (if (EQ Result (QUOTE NEW)) then (if IncludeNewNoteFileFlg then (SETQ Result (NC.DatabaseFileName (CONCAT "Name of NoteFile to " (SUBSTRING Operation 1 -9) (CHARACTER 13)) " -- " T T NIL InterestedWindow)) else (NC.PrintMsg InterestedWindow T "Can't " Operation " a new notefile." (CHARACTER 13)) (DISMISS 500) (SETQ Result NIL))) Result))) (NC.RemoveNoteFileName (LAMBDA (NoteFileOrFileName) (* pmi: "13-Aug-87 17:50") (* * pmi 5/19/87: Created to keep track of noticed NoteFiles) (* * pmi 8/13/87: Added trashing of NC.NoticedNoteFilesMenu to force its recomputation.) (DECLARE (GLOBALVARS NC.NoticedNoteFileNames NC.NoticedNoteFilesMenu)) (LET (FullFileName) (if (type? NoteFile NoteFileOrFileName) then (SETQ FullFileName (fetch (NoteFile FullFileName) of NoteFileOrFileName)) else (SETQ FullFileName (OR (FULLNAME NoteFileOrFileName) NoteFileOrFileName))) (* * If the filename is a valid or invalid file, remove it from the list of noticed files. If the resulting list is empty, set it to NIL (DREMOVE can't set a list to NIL)) (if (DREMOVE FullFileName NC.NoticedNoteFileNames) else (SETQ NC.NoticedNoteFileNames NIL)) (* * Trash the menu of noticed notefiles so that it will be recomputed.) (SETQ NC.NoticedNoteFilesMenu NIL)))) (NC.NoticeNoteFileName (LAMBDA (NoteFileOrFileName) (* pmi: "13-Aug-87 18:35") (* * pmi 5/14/87: Created to keep track of noticed NoteFiles) (* * pmi 5/21/87: Now creates a menu item bitmap for this notefile.) (* * pmi 8/13/87: Overhauled stuff for menu of noticed notefiles.) (DECLARE (GLOBALVARS NC.NoticedNoteFileNames NC.NoticedNoteFilesMenu)) (LET (FullFileName NoteFile) (if (type? NoteFile NoteFileOrFileName) then (SETQ FullFileName (fetch (NoteFile FullFileName) of NoteFileOrFileName)) (SETQ NoteFile NoteFileOrFileName) else (SETQ FullFileName (FULLNAME NoteFileOrFileName)) (SETQ NoteFile (NC.NoteFileFromFileName FullFileName))) (* * If the filename is a valid file, add it to the list of noticed files. If the filename is not a valid file, remove it from the list of noticed files. If the resulting list is empty, set it to NIL (DREMOVE can't set a list to NIL)) (if FullFileName then (if NC.NoticedNoteFileNames then (MERGEINSERT FullFileName NC.NoticedNoteFileNames T) else (SETQ NC.NoticedNoteFileNames (MERGEINSERT FullFileName NC.NoticedNoteFileNames T))) (SELECTQ (GETPROP FullFileName (QUOTE LastKnownStatus)) (OPEN (if (NULL (NC.NoteFileOpenP NoteFile)) then (PUTPROP FullFileName (QUOTE LastKnownStatus) (QUOTE CLOSED)) (SETQ NC.NoticedNoteFilesMenu NIL))) (CLOSED (if (NC.NoteFileOpenP NoteFile) then (PUTPROP FullFileName (QUOTE LastKnownStatus) (QUOTE OPEN)) (SETQ NC.NoticedNoteFilesMenu NIL))) (PROGN (if (NC.NoteFileOpenP NoteFile) then (PUTPROP FullFileName (QUOTE LastKnownStatus) (QUOTE OPEN)) else (PUTPROP FullFileName (QUOTE LastKnownStatus) (QUOTE CLOSED))) (SETQ NC.NoticedNoteFilesMenu NIL))) (* * Constuct menu items for this notefile.) (NC.CreateNoteFileMenuItems FullFileName) else (if (DREMOVE NoteFileOrFileName NC.NoticedNoteFileNames) else (SETQ NC.NoticedNoteFileNames NIL)))))) (NC.AbortSession (LAMBDA (NoteFile InterestedWindow Don'tConfirmFlg QuietFlg) (* pmi: "18-Aug-87 12:34") (* * Kill the current notecards session. Work lost since last checkpoint.) (* * rht 7/14/85: Replaced the call to reset the main menu with call to NC.ResetMainMenu. Also took out redundant reset of PSA.Database, since NC.ForceDatabaseClose is doing that.) (* * fgh & rht 10/16/85 Update with new cacheing mechanism.) (* * fkr 11/8/85 Updated to handle noteFile object and new CardID scheme.) (* * kirk 20Jan86 Added Don'tCloseFlg to leave NoteFile open after done deleting changes.) (* * kirk 23Jan86 Changed to use NC.AskYesOrNo) (* * rht 7/2/86: No longer bugs you if no changes were made since last checkpoint. Removed Don'tCloseFlg arg and added InterestedWindow arg.) (* * rht 7/6/86: Now clears InterestedWindow of final truncating message.) (* * rht 7/13/86: Added Don'tConfirmFlg and QuietFlg args. Note that Don'tConfirmFlg non-nil stops questioning of user as to losing all changes.) (* * kirk 11/17/86 Changed call on SETFILEINFO to pass stream instead of filename.) (* * pmi 12/22/86 Made test for open notefile consistent with other NoteFile operations (ie. Checkpoint, Close)) (* * rht 2/19/87: Added DEL.PROCESS call to kill caching process.) (* * rg 3/6/87 added NC.ProtectedSessionOperation wrapper) (* * rht 3/25/87: Now calls NC.CoerceToInterestedWindow.) (* * rg 3/31/87 changed ProtectedSessionOp to ProtectedNoteFileOp) (* * pmi 8/7/87: Now asks for confirm no matter what work was done.) (* * pmi 8/14/87: Now calls NC.NoticeNoteFile to make sure the file has been noticed.) (* * pmi 8/18/87: No longer asks for confirm if notefile was open read-only.) (DECLARE (GLOBALVARS NC.MsgDelay)) (OR InterestedWindow (SETQ InterestedWindow (NC.CoerceToInterestedWindow NoteFile))) (NC.ProtectedNoteFileOperation NoteFile "Abort Session" InterestedWindow (PROG ((Stream (fetch (NoteFile Stream) of NoteFile)) (FullFileName (fetch (NoteFile FullFileName) of NoteFile)) (LastChkptPtr (fetch (NoteFile CheckptPtr) of NoteFile)) EndPtr CardTotal NewBytes ReturnValue) (if (NULL (ERSETQ (SETQ ReturnValue (NC.NoteFileOpenP NoteFile)))) then (SETQ ReturnValue (QUOTE OpenPFailed))) (if (NULL ReturnValue) then (* * NoteFile is not open.) (NC.PrintMsg InterestedWindow T "Can't abort a closed notefile." (CHARACTER 13)) (DISMISS NC.MsgDelay) (NC.ClearMsg InterestedWindow T) (RETURN NIL) elseif (NOT (type? NoteFile ReturnValue)) then (* * Error return from NoteFileOpenPFn) (if (NULL (ERSETQ (NC.ReportError NIL (CONCAT "OpenP test on " FullFileName "failed because " ReturnValue (CHARACTER 13) "OK to continue Abort. ↑ to abort Abort.")))) then (RETURN ReturnValue))) (* * Delete the types and titles caching process if still alive. Have to do it now in order to make checking operations that follow suitably efficient. Note its a bit too early since we can still cancel this close. But any harm done is loss of speed if NoteFile remains open when close iss cancelled.) (DEL.PROCESS (fetch (NoteFile CachingProcess) of NoteFile)) (* * Removed old confirm question based on amount of stuff written past the checkpoint.) (SETQ EndPtr (GETEOFPTR Stream)) (* * (SETQ NewBytes (IDIFFERENCE EndPtr LastChkptPtr))) (* * This was in the if below: (OR (ZEROP NewBytes) Don'tConfirmFlg (NC.AskYesOrNo (CONCAT "Do you wish to lose all changes since" (CHARACTER 13) "the last checkpoint (" NewBytes " bytes) of " FullFileName) "--" "Yes" T InterestedWindow NIL T))) (if (OR Don'tConfirmFlg (NC.ReadOnlyNoteFileP NoteFile) (NC.AskYesOrNo (CONCAT "Do you wish to lose all changes since" (CHARACTER 13) "the open or last checkpoint of " FullFileName) "--" "No" T InterestedWindow NIL T)) then (LET ((CardNumber 0) (CardTotal (fetch (NoteFile HashArraySize) of NoteFile))) (NC.MapCards NoteFile (FUNCTION (LAMBDA (Card) (LET (Win) (SETQ CardNumber (ADD1 CardNumber)) (OR QuietFlg (COND ((ZEROP (IREMAINDER CardNumber 100)) (NC.PrintMsg InterestedWindow T "Quitting from active cards ... " (CHARACTER 13) "Processing item number " CardNumber " out of " CardTotal "." (CHARACTER 13))))) (COND ((NC.ActiveCardP Card) (SETQ Win (NC.FetchWindow Card)) (NC.AbortCard Card QuietFlg) (COND (Win (bind (Process ←(WINDOWPROP Win (QUOTE PROCESS))) until (OR (NULL Process) (PROCESS.FINISHEDP Process)) do (BLOCK)) (CLOSEW Win)))))))))) (COND ((LESSP LastChkptPtr EndPtr) (OR QuietFlg (NC.PrintMsg InterestedWindow T "Truncating file " FullFileName " ...")) (COND ((NOT (SETFILEINFO Stream (QUOTE LENGTH) LastChkptPtr)) (NC.PrintMsg InterestedWindow NIL "Couldn't truncate " FullFileName "." (CHARACTER 13)))))) (NC.ResetNoteFileInterface NoteFile) (NC.ForceDatabaseClose NoteFile) (NC.NoticeNoteFile NoteFile)) (NC.ClearMsg InterestedWindow T))))) (NC.CloseNoteFile (LAMBDA (NoteFile InterestedWindow QuietFlg AutoConfirmFlg) (* pmi: "14-Aug-87 10:57") (* * Close a NoteFIle) (* * rht 10/23/84: Now gives user option of closing and saving all open cards on the screen.) (* * rht 11/8/84: Put RESETLST around NC.CacheTitles call.) (* * rht 1/9/85: Clear the NC.UncachingNotCompleted variable when close successfully completes.) (* * rht 1/31/85: Added call to checkpoint database. That in turn dumps the next nodeID and next linkID.) (* * rht 7/14/85: Replaced the call to reset the main menu with call to NC.ResetMainMenu. Also took out redundant reset of PSA.Database, since NC.ForceDatabaseClose is doing that.) (* * fgh 10/16/85 removed call to CacheTypesAndTitles because uncacheing now done automatically by cache mechanism.) (* * fkr 10/29/85: Now kills caching process from database streamprop.) (* * fkr 11/8/85 Updated to handle new NoteFile object and new CardID scheme.) (* * kirk 23Jan86 Changed to use NC.AskYesOrNo) (* * rht 3/26/86: Now searches for active cards over whole notefile not just among cards up on screen. Uses NC.MapCards.) (* * kirk 28Apr86 Now returns NoteFile if successful.) (* * fgh 5/2/86 Cleaned up. Ask user to confirm only if there are cards on the screen, not if there are active, but not displayed ones. Added calls to the NC.CloseNoteFileFns before and after the closeing.) (* * fgh 5/26/86 Revamp for device vector implementation.) (* * kef 7/24/86: Changed the last expression at the end that smashes the NoteFile device out of the NoteFile data structure. This is so that the Interface will not bomb trying to apply an OPENP function with a NIL Device.) (* * kef 8/4/86: Added something to obtain the write lock on the parts of the active NoteCards that deactivating will release. This is also so that any changes may be written to the server.) (* * fgh 8/31/86 Reimplemented changes in system made since 5/23/86 conversion. Reimplemented changes include: (* * fgh 6/4/86 Fixed so that shrunken cards are counted as open when asking for confirmation when there are open cards on screen.) (* * fgh 6/13/86 Now checks for card operations in progress and kills them if necessary.) (* * fgh 6/25/86 Added NC.ProtectedNoteFileOperation macro call. Added Don'tCheckOperationInProgressFlg args.) (* * rht 7/4/86: Added check for readonly notefile.) (* * rht 7/13/86: Added QuietFlg arg. Note that this will cause open cards on the screen to be closed and saved without asking user for confirmation.) (* * rpr 11/13/86: After closing active cards, checks to see if any special cards were made active and closes them.)) (* * pmi 12/22/86 Made test for open notefile consistent with other NoteFile operations (ie. Abort Checkpoint,)) (* * rht 2/16/87: Added AutoConfirmFlg argument to prevent user having to confirm whether to close and save open cards. Note that QuietFlg is stronger than AutoConfirmFlg in that other messages are suppressed as well.) (* * rg 3/4/87 changes for new concurrency machinery) (* * rht 3/25/87: Now calls NC.CoerceToInterestedWindow.) (* * rg 3/27/87 redid concurrency wrapper) (* * pmi 8/14/87: Added call to NC.NoticeNoteFile to make sure this file has been noticed. Also, added parameters in call to NC.AbortSession to stop confirmation and pass on the QuietFlg.) (DECLARE (GLOBALVARS NC.MsgDelay NC.CloseNoteFileFns)) (NC.ProtectedNoteFileOperation NoteFile "Close NoteFile" InterestedWindow (OR (OPENWP InterestedWindow) (SETQ InterestedWindow ( NC.CoerceToInterestedWindow NoteFile))) (if (NC.ReadOnlyNoteFileP NoteFile) then (NC.AbortSession NoteFile InterestedWindow T QuietFlg) else (ALLOW.BUTTON.EVENTS) (PROG ((FullFileName (fetch (NoteFile FullFileName) of NoteFile)) CardTotal ActiveCards ReturnValue (OperationMsg "")) (* * Make sure NF is open) (if (NULL (ERSETQ (SETQ ReturnValue (NC.NoteFileOpenP NoteFile)))) then (SETQ ReturnValue (QUOTE OpenPFailed))) (if (NULL ReturnValue) then (* * NoteFile is not open.) (NC.PrintMsg InterestedWindow T "Can't close a closed notefile." (CHARACTER 13)) (DISMISS NC.MsgDelay) (NC.ClearMsg InterestedWindow T) (RETURN NIL) elseif (NOT (type? NoteFile ReturnValue)) then (* * Error return from NoteFileOpenPFn) (if (NULL (ERSETQ (NC.ReportError NIL (CONCAT "OpenP test on " FullFileName "failed because " ReturnValue (CHARACTER 13) "OK to continue Close. ↑ to abort Close.")))) then (RETURN ReturnValue))) (RETURN (PROG NIL (RESETSAVE NIL (BQUOTE (NC.ClearMsg , InterestedWindow T))) (* * Delete the types and titles caching process if still alive. Have to do it now in order to make checking operations that follow suitably efficient. Note its a bit too early since we can still cancel this close. But any harm done is loss of speed if NoteFile remains open when close iss cancelled.) (DEL.PROCESS (fetch (NoteFile CachingProcess) of NoteFile)) (* * See if any cards have operations in progress. If so, kill them after confirming with user.) (OR QuietFlg (NC.PrintMsg InterestedWindow T (OR OperationMsg "") "Checking for card operations in progress ..." (CHARACTER 13))) (if (EQ (QUOTE ABORT) (NC.CardOperationsInProgress NoteFile T)) then (RETURN NIL)) (NC.ClearMsg InterestedWindow NIL) (* * If NULL QuietFlg then look for cards on the screen. If there are active cards ask the user if they still want to close. When there's a non-NIL QuietFlg we just close the active cards.) (if (AND (NULL QuietFlg) (NULL AutoConfirmFlg) (for Window in (OPENWINDOWS) thereis (LET (Card) (AND (SETQ Card (OR (NC.CardFromWindow Window) (AND (WINDOWP (WINDOWPROP Window (QUOTE ICONFOR))) (NC.CardFromWindow (WINDOWPROP Window (QUOTE ICONFOR))) ))) (NC.SameNoteFileP NoteFile (fetch (Card NoteFile) of Card))))) (NULL (NC.AskYesOrNo (CONCAT "There are still cards on the screen from this NoteFile " FullFileName "." (CHARACTER 13) "Want to close and save them? ") " -- " (QUOTE Yes) NIL InterestedWindow NIL NIL))) then (RETURN NIL)) (* * Run through CloseNoteFileFns with param of BEFORE. Exit if any returns DON'T) (if (for Function in NC.CloseNoteFileFns thereis (OR (EQ Function (QUOTE DON'T)) (EQ (QUOTE DON'T) (APPLY* Function NoteFile (QUOTE BEFORE) )))) then (RETURN NIL)) (* * Close all the active cards) (OR QuietFlg (NC.PrintMsg InterestedWindow T (OR OperationMsg "") "Checking for active cards ..." (CHARACTER 13))) (if (SETQ ActiveCards (NC.MapCards NoteFile (FUNCTION (LAMBDA (Card) Card)) (FUNCTION NC.ActiveCardP))) then (if (NULL QuietFlg) then (NC.PrintMsg InterestedWindow T "Closing and saving active cards ... ")) (RESETLST (RESETSAVE NC.ForceSourcesFlg NIL) (RESETSAVE NC.ForceFilingFlg NIL) (RESETSAVE NC.ForceTitlesFlg NIL) (NC.CloseListOfActiveCards ActiveCards InterestedWindow QuietFlg) (NC.CloseListOfActiveCards (for Card in ( NC.FetchSpecialCards NoteFile) when (NC.ActiveCardP Card) collect Card) InterestedWindow QuietFlg)) (OR QuietFlg (NC.PrintMsg InterestedWindow NIL "Done." (CHARACTER 13)))) (* * Checkpoint the NoteFile.) (OR QuietFlg (NC.PrintMsg InterestedWindow T "Closing Notefile ... " (CHARACTER 13))) (if (NULL (CAR (ERSETQ (SETQ ReturnValue (NC.CheckpointNoteFile NoteFile QuietFlg T InterestedWindow OperationMsg))))) then (SETQ ReturnValue (QUOTE CheckpointFailed))) (* * Process error returns from in NC.CheckpointNoteFile) (if (NOT (type? NoteFile ReturnValue)) then (if (NULL (ERSETQ (NC.ReportError NIL (CONCAT "Checkpoint of NoteFile " FullFileName " failed because " ReturnValue "." (CHARACTER 13) "OK to continue Close. ↑ to abort Close.")))) then (RETURN ReturnValue))) (* * Close the file.) (if (NULL (CAR (ERSETQ (SETQ ReturnValue (APPLY* (fetch (NoteFile CloseNoteFileFn) of NoteFile) NoteFile InterestedWindow))))) then (SETQ ReturnValue (QUOTE CloseFailed))) (* * Process error returns from the close.) (if (NOT (type? NoteFile ReturnValue)) then (SELECTQ ReturnValue (NoteFileNotOpen (if (NULL (ERSETQ (NC.ReportError NIL (CONCAT "NoteFile" FullFileName " is not open." (CHARACTER 13) "OK to continue Close. ↑ to abort Close.")))) then (RETURN ReturnValue))) (PROGN (ERSETQ (NC.ReportError NIL (CONCAT "Close of NoteFile " FullFileName " failed because " ReturnValue "." (CHARACTER 13)))) (RETURN ReturnValue)))) (* * Run through CloseNoteFileFns with param of AFTER. Stop if any returns DON'T) (for Function in NC.CloseNoteFileFns thereis (EQ (QUOTE DON'T) (APPLY* Function NoteFile (QUOTE AFTER)))) (* * Reset the interface, make sure the notefile has been noticed, and notify the user.) (NC.ResetNoteFileInterface NoteFile) (NC.NoticeNoteFile NoteFile) (OR QuietFlg (NC.PrintMsg InterestedWindow T FullFileName " closed.")) (* * * Cleanup a bit.) (* Clean off the card cache's) (ADD.PROCESS (LIST (FUNCTION NC.CleanupCardObjects) (fetch (NoteFile HashArray) of NoteFile))) (* Clean off the NoteFile object to remove any circularities.) (create NoteFile smashing NoteFile Stream ← NIL UID ←(fetch (NoteFile UID) of NoteFile) FullFileName ← FullFileName Menu ←(fetch (NoteFile Menu) of NoteFile) NoteFileDevice ←(fetch (NoteFile NoteFileDevice) of NoteFile)) (* * Return the NF) (RETURN NoteFile)))))))) (NC.CompactNoteFile (LAMBDA (FromNoteFileOrName ToFileName InPlaceFlg InterestedWindow) (* pmi: "13-Aug-87 19:00") (* * Compact a NoteFile. If InPlaceFlg is T calls NC.CompactNoteFileInPlace. Otherwise if ToFileName is NIL, asks for a new file name.) (* * fkr 11/8/85 Updated to handle new CardID scheme and NoteFile object.) (* * kirk 19Nov85: Created from NC.CompactDatabaseInPlace to handle new NoteFile format) (* * fgh 5/186 Totally rewritten to get rid of numerous bugs. Added new InterestedWindow parameter.) (* * rht 7/2/86: Fixed bug in call to NC.CompactToTarget and NC.CompactInPlace. They were being called with FromNoteFile instead of (OR FromNoteFile FromFileName).) (* * kirk 3Jul86 Added SETQ NC.DatabaseFileNameSuggestion) (* * fgh 9/1/86 Now just a wrapper that calls the device specific compact fn. Old CompactNoteFile is now NCLocalDevice.CompactNoteFile.) (* * pmi 12/19/86 Added test for open notefile so we can abort if it is open. Made consistent with other NoteFile operations in the way it checks for valid NoteFile, gets msg window, etc.) (* * pmi 5/29/87: Added call to NC.NoticeNoteFile to make sure this NoteFile is noticed. Cleaned up case where notefilename is valid, but a notefile object does not exist. Now creates an interface menu for the target of compaction if NC.NoteFileMenuLingerFlg is T. This menu for the new notefile is positioned slightly offset from the original notefile's menu.) (* * pmi 8/13/87: Moved call to NC.NoticeNoteFile for the new notefile (for compact to target) to this function from NC.CompactNoteFileToTarget.) (DECLARE (GLOBALVARS NC.MsgDelay NC.NoteFileMenuLingerFlg NC.NoteCardsIconWindow)) (PROG ((MsgWindow InterestedWindow) FromNoteFile FromFileName FullFromFileName ReturnValue Menu MenuWindowRegion NewMenu) (* * Get the name of the file to be compacted) (if (type? NoteFile FromNoteFileOrName) then (SETQ FromNoteFile FromNoteFileOrName) (SETQ FromFileName (fetch (NoteFile FullFileName) of FromNoteFile)) elseif (SETQ FromFileName (OR FromNoteFileOrName (NC.DatabaseFileName "Name of NoteFile to be compacted:" " -- " T NIL NIL MsgWindow))) else (RETURN NIL)) (* * Check for existence of file to be compacted.) (if (SETQ FullFromFileName (FULLNAME FromFileName)) then (if (OR FromNoteFile (SETQ FromNoteFile (NC.NoteFileFromFileName FullFromFileName))) then (SETQ MsgWindow (OR MsgWindow (NC.CoerceToInterestedWindow FromNoteFile)))) else (NC.RemoveAccessToNoteFile FromFileName) (SETQ MsgWindow (NC.CoerceToInterestedWindow MsgWindow)) (NC.PrintMsg MsgWindow T FromFileName " does not exist." (CHARACTER 13) "Compact cancelled." (CHARACTER 13)) (DISMISS NC.MsgDelay) (NC.ClearMsg MsgWindow T) (RETURN NIL)) (* * Check to see if the notefile is open, abort if it is.) (if (NC.NoteFileOpenP FromNoteFile) then (NC.PrintMsg MsgWindow T "Can't compact an open notefile." (CHARACTER 13) "Compact cancelled." (CHARACTER 13)) (DISMISS NC.MsgDelay) (NC.ClearMsg MsgWindow T) (RETURN NIL)) (* * Apply the device specific comnpact notefile fn for the file's host.) (if (SETQ ReturnValue (APPLY* (fetch (NoteFileDevice CompactNoteFileFn) of (NC.DeviceVectorForHost (FILENAMEFIELD FullFromFileName (QUOTE HOST)) (QUOTE PRIVATE))) FullFromFileName ToFileName InPlaceFlg MsgWindow)) then (* * Add the From notefile to the Hash Array and the list of noticed notefiles, in case it isn't already there.) (NC.NoticeNoteFile FullFromFileName) (if (NULL InPlaceFlg) then (* * Add the To notefile to the Hash Array and the list of noticed notefiles.) (NC.NoticeNoteFile ReturnValue) (if NC.NoteFileMenuLingerFlg then (if (SETQ Menu (OR (AND (type? NoteFile FromNoteFile) (fetch (NoteFile Menu) of FromNoteFile)) (GETPROP FullFromFileName (QUOTE Menu)))) then (SETQ MenuWindowRegion (WINDOWPROP (WFROMMENU Menu) (QUOTE REGION))) (SETQ NewMenu (NC.SetUpNoteFileInterface ReturnValue (create POSITION XCOORD ←(fetch (REGION LEFT) of MenuWindowRegion) YCOORD ←(fetch (REGION BOTTOM) of MenuWindowRegion)) MsgWindow)) (RELMOVEW NewMenu (create POSITION XCOORD ← 6 YCOORD ←(MINUS (PLUS (FONTHEIGHT (fetch (MENU MENUTITLEFONT) of Menu)) 6))))))) else (NC.PrintMsg MsgWindow T "Compact cancelled." (CHARACTER 13)) (DISMISS NC.MsgDelay) (NC.ClearMsg MsgWindow T)) (RETURN ReturnValue)))) ) (* * New for NCDATABASE) (* * The function NC.CreateNoteFileMenuItems replaces NC.CreateMenuBitmaps which should be removed.) (DEFINEQ (NC.CreateNoteFileMenuItems (LAMBDA (FullFileName) (* pmi: "18-Aug-87 12:23") (* * pmi 5/21/87: creates a menu item bitmap for this notefile.) (* * pmi 8/18/87: Renamed from NC.CreateMenuBitmaps to construct the entire menu item instead of just the bitmap. Also changed "o" (for open) to print in BOLD face.) (DECLARE (GLOBALVARS NC.FileNameFont NC.FullFileNameFont NC.MaxFileNameChars)) (PROG (FileNameString FullFileNameString NameWidth MaxNameWidth SpaceWidth oWidth FullNameWidth FullNameMargin FontDescent OpenMenuBitmap MenuBitmap DisplayStream OpenDisplayStream (NC.BoldFullFileNameFont (FONTCOPY NC.FullFileNameFont (QUOTE WEIGHT) (QUOTE BOLD)))) (if (OR (NULL FullFileName) (AND (GETPROP FullFileName (QUOTE OpenMenuItem)) (GETPROP FullFileName (QUOTE ClosedMenuItem)))) then (RETURN)) (SETQ FileNameString (MKSTRING (PACKFILENAME (QUOTE HOST) NIL (QUOTE DIRECTORY) NIL (QUOTE EXTENSION) NIL (QUOTE BODY) FullFileName))) (SETQ FullFileNameString (MKSTRING (L-CASE FullFileName))) (SETQ NameWidth (STRINGWIDTH FileNameString NC.FileNameFont)) (SETQ FullNameWidth (STRINGWIDTH FullFileNameString NC.FullFileNameFont)) (SETQ MaxNameWidth (STRINGWIDTH (ALLOCSTRING NC.MaxFileNameChars "X") NC.FileNameFont)) (SETQ SpaceWidth (STRINGWIDTH " " NC.FullFileNameFont)) (SETQ oWidth (STRINGWIDTH "o" NC.BoldFullFileNameFont)) (if (GREATERP NameWidth MaxNameWidth) then (SETQ FullNameMargin (PLUS SpaceWidth oWidth SpaceWidth NameWidth SpaceWidth)) else (SETQ FullNameMargin (PLUS SpaceWidth oWidth SpaceWidth MaxNameWidth SpaceWidth))) (SETQ FontDescent (FONTDESCENT NC.FileNameFont)) (* * Create the bitmap for the open notefile.) (SETQ OpenMenuBitmap (BITMAPCREATE (PLUS FullNameMargin FullNameWidth SpaceWidth) (FONTHEIGHT NC.FileNameFont))) (SETQ OpenDisplayStream (DSPCREATE OpenMenuBitmap)) (MOVETO SpaceWidth FontDescent OpenDisplayStream) (DSPFONT NC.BoldFullFileNameFont OpenDisplayStream) (PRIN1 "o" OpenDisplayStream) (RELMOVETO SpaceWidth 0 OpenDisplayStream) (DSPFONT NC.FileNameFont OpenDisplayStream) (PRIN1 FileNameString OpenDisplayStream) (MOVETO FullNameMargin FontDescent OpenDisplayStream) (DSPFONT NC.FullFileNameFont OpenDisplayStream) (PRIN1 FullFileNameString OpenDisplayStream) (* * Construct the full menu item.) (PUTPROP FullFileName (QUOTE OpenMenuItem) (LIST OpenMenuBitmap (BQUOTE (QUOTE , FullFileName)) (CONCAT "Selects NoteFile " FullFileName))) (* * Create bitmap for the closed notefile.) (SETQ MenuBitmap (BITMAPCREATE (PLUS FullNameMargin FullNameWidth SpaceWidth) (FONTHEIGHT NC.FileNameFont))) (SETQ DisplayStream (DSPCREATE MenuBitmap)) (MOVETO (PLUS SpaceWidth oWidth SpaceWidth) FontDescent DisplayStream) (DSPFONT NC.FileNameFont DisplayStream) (PRIN1 FileNameString DisplayStream) (MOVETO FullNameMargin FontDescent DisplayStream) (DSPFONT NC.FullFileNameFont DisplayStream) (PRIN1 FullFileNameString DisplayStream) (* * Construct the full menu item.) (PUTPROP FullFileName (QUOTE ClosedMenuItem) (LIST MenuBitmap (BQUOTE (QUOTE , FullFileName)) (CONCAT "Selects NoteFile " FullFileName))) (RETURN FullFileName)))) ) (DECLARE: DOEVAL@COMPILE DONTCOPY (GLOBALVARS NC.NoticedNoteFilesMenu NC.NoticedNoteFilesMenuNewItem) ) (RPAQQ NC.NoticedNoteFilesMenu NIL) (RPAQQ NC.NoticedNoteFilesMenuNewItem NIL) (* * Changed in NCINTERFACE) (DEFINEQ (NC.DoNoteFileOp (LAMBDA (Op) (* pmi: "14-Aug-87 09:33") (* * Do a NoteFile op chosen from NC icon menu) (* * rht 7/2/86: Now calls NC.AbortSession with NC.NoteCardsIconWindow arg.) (* * rht 7/5/86: Added Read-only% Open entry.) (* * rht 7/17/86: Now calls NC.InspectAndRepairNoteFile instead of NC.ScavengerPhase1.) (* * pmi 12/4/86: Added NC.NoteCardsIconWindow argument to calls to NC.ListOfNoteFilesMenu for "Delete" and "Rename" operations) (* * rht 2/11/87: Now handles case when Op has unexpected value.) (* * rht 2/16/87: Added Close% w/o% confirm case.) (* * pmi 5/15/87: overhauled to use NC.NoticedNoteFileNamesMenu instead of NC.ListOfNoteFilesMenu. Added "Create and Open" and "Create and Read-only Open" options.) (DECLARE (GLOBALVARS NC.NoteCardsIconWindow NC.MsgDelay)) (SELECTQ Op (Open% NoteFile (LET ((NoteFileName (NC.NoticedNoteFileNamesMenu T (QUOTE CLOSED) NC.NoteCardsIconWindow (QUOTE Open% NoteFile)))) (if (NULL NoteFileName) then NIL else (if (EQ NoteFileName (QUOTE NEW)) then (SETQ NoteFileName NIL)) (NC.OpenDatabaseFile NoteFileName NIL NIL NIL NIL NIL NIL NIL NIL NIL NC.NoteCardsIconWindow)))) (Read-only% Open (LET ((NoteFileName (NC.NoticedNoteFileNamesMenu T (QUOTE CLOSED) NC.NoteCardsIconWindow (QUOTE Open% NoteFile)))) (if (NULL NoteFileName) then NIL else (if (EQ NoteFileName (QUOTE NEW)) then (SETQ NoteFileName NIL)) (NC.OpenDatabaseFile NoteFileName (QUOTE INPUT) NIL NIL NIL NIL NIL NIL NIL NIL NC.NoteCardsIconWindow)))) (Checkpoint% NoteFile (LET ((NoteFileName (NC.NoticedNoteFileNamesMenu NIL (QUOTE OPEN) NC.NoteCardsIconWindow (QUOTE Checkpoint% NoteFile)))) (if NoteFileName then (NC.CheckpointDatabase ( NC.NoteFileFromFileName NoteFileName) NIL NIL NC.NoteCardsIconWindow) else (NC.PrintMsg NC.NoteCardsIconWindow NIL "Checkpoint cancelled." (CHARACTER 13)) (DISMISS NC.MsgDelay) (NC.ClearMsg NC.NoteCardsIconWindow T)))) (Close% NoteFile (LET ((NoteFileName (NC.NoticedNoteFileNamesMenu NIL (QUOTE OPEN) NC.NoteCardsIconWindow (QUOTE Close% NoteFile)))) (if NoteFileName then (NC.CloseNoteFile (NC.NoteFileFromFileName NoteFileName) NC.NoteCardsIconWindow) else (NC.PrintMsg NC.NoteCardsIconWindow NIL "Close cancelled." (CHARACTER 13)) (DISMISS NC.MsgDelay) (NC.ClearMsg NC.NoteCardsIconWindow T)))) (Close% w/o% confirm (LET ((NoteFileName (NC.NoticedNoteFileNamesMenu NIL (QUOTE OPEN) NC.NoteCardsIconWindow (QUOTE Close% NoteFile)))) (if NoteFileName then (NC.CloseNoteFile (NC.NoteFileFromFileName NoteFileName) NC.NoteCardsIconWindow NIL T) else (NC.PrintMsg NC.NoteCardsIconWindow NIL "Close w/o confirm cancelled." (CHARACTER 13)) (DISMISS NC.MsgDelay) (NC.ClearMsg NC.NoteCardsIconWindow T)))) (Abort% NoteFile (LET ((NoteFileName (NC.NoticedNoteFileNamesMenu NIL (QUOTE OPEN) NC.NoteCardsIconWindow (QUOTE Abort% NoteFile)))) (if NoteFileName then (NC.AbortSession (NC.NoteFileFromFileName NoteFileName) NC.NoteCardsIconWindow) else (NC.PrintMsg NC.NoteCardsIconWindow NIL "Abort cancelled." (CHARACTER 13)) (DISMISS NC.MsgDelay) (NC.ClearMsg NC.NoteCardsIconWindow T)))) (Compact% NoteFile (LET ((NoteFileName (NC.NoticedNoteFileNamesMenu T (QUOTE CLOSED) NC.NoteCardsIconWindow (QUOTE Compact% NoteFile)))) (if (NULL NoteFileName) then NIL else (if (EQ NoteFileName (QUOTE NEW)) then (SETQ NoteFileName NIL)) (NC.CompactNoteFile NoteFileName NIL NIL NIL)))) (Compact% In% Place (LET ((NoteFileName (NC.NoticedNoteFileNamesMenu T (QUOTE CLOSED) NC.NoteCardsIconWindow (QUOTE Compact% NoteFile)))) (if (NULL NoteFileName) then NIL else (if (EQ NoteFileName (QUOTE NEW)) then (SETQ NoteFileName NIL)) (NC.CompactNoteFile NoteFileName NIL T NIL)))) (Inspect&Repair% NoteFile (LET ((NoteFileName (NC.NoticedNoteFileNamesMenu T (QUOTE CLOSED) NC.NoteCardsIconWindow (QUOTE Inspect&Repair% NoteFile)))) (if (NULL NoteFileName) then NIL else (if (EQ NoteFileName (QUOTE NEW)) then (SETQ NoteFileName NIL)) (NC.InspectAndRepairNoteFile NoteFileName NIL NC.NoteCardsIconWindow)))) (Read% Substances (LET ((NoteFileName (NC.NoticedNoteFileNamesMenu T (QUOTE CLOSED) NC.NoteCardsIconWindow (QUOTE Inspect&Repair% NoteFile)))) (if (NULL NoteFileName) then NIL else (if (EQ NoteFileName (QUOTE NEW)) then (SETQ NoteFileName NIL)) (NC.InspectAndRepairNoteFile NoteFileName T NC.NoteCardsIconWindow)))) (Copy% NoteFile (LET ((NoteFileName (NC.NoticedNoteFileNamesMenu T (QUOTE CLOSED) NC.NoteCardsIconWindow (QUOTE Copy% NoteFile)))) (if (NULL NoteFileName) then NIL else (if (EQ NoteFileName (QUOTE NEW)) then (SETQ NoteFileName NIL)) (NC.CopyNoteFile NoteFileName NIL NC.NoteCardsIconWindow)))) (Rename% NoteFile (LET ((NoteFileName (NC.NoticedNoteFileNamesMenu T (QUOTE CLOSED) NC.NoteCardsIconWindow (QUOTE Rename% NoteFile)))) (if (NULL NoteFileName) then NIL else (if (EQ NoteFileName (QUOTE NEW)) then (SETQ NoteFileName NIL)) (NC.RenameNoteFile NoteFileName NIL NC.NoteCardsIconWindow)))) (Delete% NoteFile (LET ((NoteFileName (NC.NoticedNoteFileNamesMenu T (QUOTE CLOSED) NC.NoteCardsIconWindow (QUOTE Delete% NoteFile)))) (if (NULL NoteFileName) then NIL else (if (EQ NoteFileName (QUOTE NEW)) then (SETQ NoteFileName NIL)) (NC.DeleteDatabaseFile NoteFileName NC.NoteCardsIconWindow)))) (Create% NoteFile (NC.CreateDatabaseFile NIL NIL NIL NIL NIL NIL NC.NoteCardsIconWindow NIL NIL NIL NIL NIL NIL)) (Create% and% Open (NC.CreateDatabaseFile NIL NIL NIL NIL NIL NIL NC.NoteCardsIconWindow NIL NIL T NIL NIL NIL)) (LET ((NoteFileName (NC.NoticedNoteFileNamesMenu NIL (QUOTE EITHER) NC.NoteCardsIconWindow))) (if NoteFileName then (APPLY* Op (NC.NoteFileFromFileName NoteFileName) NC.NoteCardsIconWindow)))))) ) (* * Changed in NCCOMPACT) (DEFINEQ (NC.CompactNoteFileToTarget (LAMBDA (FromNoteFile ToFileName InterestedWindow) (* pmi: "13-Aug-87 18:58") (* * In sorted order, copy card parts to lower addresses in the file.) (* * fgh 5/1/86 Now returns the ToNoteFile in order to be compatible with compact in place.) (* * rht 11/3/86: Now opens FromNoteFile read-only. Also now takes InterestedWindow arg.) (* * rht 1/22/87: Slight change to computation of new index size.) (* * rht 3/17/87: Added RESETLST to make sure notefiles get closed in case of bombing out.) (* * rht 5/15/87: No longer calls NC.ComputeNewDatabaseIndexSize. Target notefile's index will be same size as source notefile's.) (* * pmi 5/27/87: Removed HashArray argument in calls to NC.OpenNoteFile. Added call to NC.NoticeNoteFile to notice the original and target notefiles. Also stopped creation of a notefile interface for the target notefile before compaction - it should be done at the end of compaction instead.) (* * pmi 6/24/87: Now returns NIL if can't create the target notefile.) (* * pmi 6/25/87: Now passes NIL for Can'tTruncateFlg in call to NC.OpenNoteFile.) (* * pmi 8/13/87: Removed calls to NC.NoticeNoteFile; they are now done further up in NC.CompactNoteFile.) (PROG (ToNoteFile OperationMsg) (if (SETQ FromNoteFile (NC.OpenNoteFile FromNoteFile T T T NIL NIL T T InterestedWindow NIL NIL NIL T)) then (SETQ OperationMsg (CONCAT "Compacting " (fetch (NoteFile FullFileName) of FromNoteFile) (CHARACTER 13))) (SETQ ToNoteFile (NC.CreateDatabaseFile ToFileName (fetch (NoteFile HashArraySize) of FromNoteFile) OperationMsg T NIL T InterestedWindow NIL NIL NIL NIL T) ) (if (EQ ToNoteFile (QUOTE CreateCancelled)) then (RETURN NIL) else (SETQ ToNoteFile (NC.OpenNoteFile ToNoteFile T T T T T T T InterestedWindow NIL NIL NIL NIL NIL T))) (RESETLST (RESETSAVE NIL (BQUOTE (NC.ForceDatabaseClose , FromNoteFile) )) (RESETSAVE NIL (BQUOTE (NC.ForceDatabaseClose , ToNoteFile))) (LET ((OriginalStream (fetch (NoteFile Stream) of FromNoteFile) ) (TargetStream (fetch (NoteFile Stream) of ToNoteFile)) FromFileLength TargetFileLength BytesRecovered) (replace (NoteFile NextIndexNum) of ToNoteFile with (fetch (NoteFile NextIndexNum) of FromNoteFile)) (SETFILEPTR TargetStream (NC.TotalIndexSize (fetch (NoteFile HashArraySize) of ToNoteFile))) (* truncate ToNoteFile after the index) (if (NC.CopySortedCardParts (NC.SortIndexEntries FromNoteFile) ToNoteFile NIL NIL NIL InterestedWindow OperationMsg) then (* all useable card parts got copied) (SETQ FromFileLength (GETEOFPTR OriginalStream) ) (* * fool NC.PutHashArray into writing out the index for the new NoteFile) (replace (NoteFile Stream) of FromNoteFile with TargetStream) (NCLocalDevice.PutHashArray FromNoteFile InterestedWindow T OperationMsg) (replace (NoteFile Stream) of FromNoteFile with OriginalStream) (* * Put out the new ChkptPtr to the file.) (replace (NoteFile CheckptPtr) of ToNoteFile with (SETQ TargetFileLength (GETEOFPTR TargetStream))) (* * Steal the UID from the original file so links will work. Write out the header.) (replace (NoteFile UID) of ToNoteFile with (fetch (NoteFile UID) of FromNoteFile)) (NC.PutNoteFileHeader ToNoteFile) (SETQ BytesRecovered (DIFFERENCE FromFileLength TargetFileLength)) (NC.PrintMsg NIL T (fetch (NoteFile FullFileName) of FromNoteFile) " compacted to " (fetch (NoteFile FullFileName) of ToNoteFile) (CHARACTER 13) "Recovered " BytesRecovered " bytes (" (FIX (TIMES 100 (FQUOTIENT BytesRecovered FromFileLength))) "%%)" (CHARACTER 13)) (NC.ClearMsg InterestedWindow T)))) (RETURN ToNoteFile))))) ) (PUTPROPS PMIPATCH058 COPYRIGHT ("Xerox Corporation" 1987)) (DECLARE: DONTCOPY (FILEMAP (NIL (1435 36299 (NC.NoticedNoteFileNamesMenu 1445 . 8115) (NC.RemoveNoteFileName 8117 . 9253 ) (NC.NoticeNoteFileName 9255 . 11674) (NC.AbortSession 11676 . 17949) (NC.CloseNoteFile 17951 . 30646 ) (NC.CompactNoteFile 30648 . 36297)) (36439 40461 (NC.CreateNoteFileMenuItems 36449 . 40459)) (40691 49144 (NC.DoNoteFileOp 40701 . 49142)) (49178 54112 (NC.CompactNoteFileToTarget 49188 . 54110))))) STOP