(FILECREATED "22-Oct-85 15:58:30" {QV}<NOTECARDS>RELEASE1.2I>NCINTERFACE.;21 72459  

      changes to:  (FNS NC.AskLinkLabel)

      previous date: "11-Oct-85 16:43:58" {QV}<NOTECARDS>RELEASE1.2I>NCINTERFACE.;20)


(* Copyright (c) 1984, 1985 by Xerox Corporation. All rights reserved.)

(PRETTYCOMPRINT NCINTERFACECOMS)

(RPAQQ NCINTERFACECOMS ((E (SETQ NC.SystemDate (DATE))
			   (PUTPROP (QUOTE NC.SystemDate)
				    (QUOTE NewestFile)
				    (ROOTFILENAME (FULLNAME (OUTPUT)))))
	(* * Internal variables)
	(GLOBALVARS NC.SelectionInProgress NC.SelectedCards NC.MainMenu NC.SelectingSourcesMenu 
		    NC.SelectingContentsMenu NC.SelectingSingleCardMenu NC.SelectingMultipleCardsMenu 
		    NC.DeleteSelectingMenu NC.SelectingParentsMenu NC.SelectingBrowserSourceMenu 
		    NC.SelectingFileBoxChildrenMenu NC.SelectingCardsMenu NC.SelectingCardMenu 
		    NC.TEditMenus NC.NoteCardTypeMenu NC.DatabaseOperationsMenu NC.LinkLabelMenu 
		    NC.TopLevelCards NC.MainMenuInProgress NC.WindowRightButtonMenu 
		    NC.StructEditTitleBarMenu NC.SketchTitleBarMenu NC.BrowserTitleBarMenu 
		    NC.BrowserTitleBarMiddleButtonMenu NC.GraphTitleBarMenu 
		    NC.GraphTitleBarMiddleButtonMenu NC.MainMenuWindow NC.LogoWindow LOGOW ExecWindow 
		    PROCESS.STATUS.WINDOW QUADTREE.HIGHRES NC.BrowseOrSearchMenu FONTDIRECTORIES 
		    NC.DatabaseFileNameSuggestion PSA.Database NC.UncachingNotCompleted 
		    NC.UnspecifiedLinkLabel NC.UCASESystemLinkLabels NC.UnclassifiedID 
		    NC.MainMenuPosition)
	(VARS (NC.VersionNumber 1)
	      (NC.LinkLabelMenu NIL)
	      (NC.LinkDisplayModesMenu NIL)
	      (NC.UnclassifiedID (QUOTE NC00003))
	      (NC.TopLevelCards (QUOTE (NC00001 NC00002 NC00003)))
	      (NC.MainMenuInProgress NIL)
	      (NC.DatabaseFileNameSuggestion NIL)
	      (NC.TEditMenus NIL))
	(* * Setup and top level interaction)
	(FNS NC.MakeMainMenu NC.SetupScreen NC.MainMenuWhenSelectedFn NC.CacheTitles 
	     NC.CacheTypesAndTitles NC.CloseDatabaseFile NC.CompactDatabase NC.DatabaseOperations 
	     NC.LogoutAdvice NC.DatabaseFileName NC.DeleteDatabaseFile INSTALL NC.ForceDatabaseClose 
	     NC.ListDatabaseFiles NC.MakeFloppies NC.MakeSysout NC.AdjustCloseF NC.AdvisedCloseF 
	     NC.CloseNoteCards NC.SetMainMenuTitle)
	(* * Menus of all sorts)
	(FNS NC.AskLinkLabel NC.AskNoteCardType NC.ChooseTopLevelCard NC.DisplayMainMenu 
	     NC.RemoveSketchMenuItems NC.SelectionMenusWhenSelectedFn NC.SetupTitleBarMenu 
	     NC.TitleBarButtonEventFn NC.ChooseCloseOrDelete NC.ResetMainMenu)
	(* * Selection Mechanism)
	(VARS NC.SelectionInProgress)
	(FNS NC.SelectNoteCards)
	(* * Fix up Lisp)
	(ADVISE LOGOUT)
	(* * Set the modification date)
	(E (SETQ NC.SystemDate (DATE)))
	(VARS NC.SystemDate)))
(* * Internal variables)

(DECLARE: DOEVAL@COMPILE DONTCOPY

(GLOBALVARS NC.SelectionInProgress NC.SelectedCards NC.MainMenu NC.SelectingSourcesMenu 
	    NC.SelectingContentsMenu NC.SelectingSingleCardMenu NC.SelectingMultipleCardsMenu 
	    NC.DeleteSelectingMenu NC.SelectingParentsMenu NC.SelectingBrowserSourceMenu 
	    NC.SelectingFileBoxChildrenMenu NC.SelectingCardsMenu NC.SelectingCardMenu NC.TEditMenus 
	    NC.NoteCardTypeMenu NC.DatabaseOperationsMenu NC.LinkLabelMenu NC.TopLevelCards 
	    NC.MainMenuInProgress NC.WindowRightButtonMenu NC.StructEditTitleBarMenu 
	    NC.SketchTitleBarMenu NC.BrowserTitleBarMenu NC.BrowserTitleBarMiddleButtonMenu 
	    NC.GraphTitleBarMenu NC.GraphTitleBarMiddleButtonMenu NC.MainMenuWindow NC.LogoWindow 
	    LOGOW ExecWindow PROCESS.STATUS.WINDOW QUADTREE.HIGHRES NC.BrowseOrSearchMenu 
	    FONTDIRECTORIES NC.DatabaseFileNameSuggestion PSA.Database NC.UncachingNotCompleted 
	    NC.UnspecifiedLinkLabel NC.UCASESystemLinkLabels NC.UnclassifiedID NC.MainMenuPosition)
)

(RPAQQ NC.VersionNumber 1)

(RPAQQ NC.LinkLabelMenu NIL)

(RPAQQ NC.LinkDisplayModesMenu NIL)

(RPAQQ NC.UnclassifiedID NC00003)

(RPAQQ NC.TopLevelCards (NC00001 NC00002 NC00003))

(RPAQQ NC.MainMenuInProgress NIL)

(RPAQQ NC.DatabaseFileNameSuggestion NIL)

(RPAQQ NC.TEditMenus NIL)
(* * Setup and top level interaction)

(DEFINEQ

(NC.MakeMainMenu
  (LAMBDA (DatabaseTitle)                                    (* rht: "27-Aug-85 01:01")

          (* * Create the NoteCards menus)



          (* * rht 8/1/84: Added def'n for new menu: NC.SelectingFileBoxChildrenMenu)



          (* * rht 2/4/85: The browser source menu now accepts multiple selections.)


    (PROG (X (Font (FONTCREATE (QUOTE HELVETICA)
			       12
			       (QUOTE BOLD)))
	     (TitleFont (FONTCREATE (QUOTE HELVETICA)
				    10
				    (QUOTE BOLD)))
	     (Position (OR (POSITIONP NC.MainMenuPosition)
			   (create POSITION
				   XCOORD ← 350
				   YCOORD ← 650))))          (* Main Menu)
          (COND
	    ((type? MENU NC.MainMenu)
	      (WINDOWPROP (WFROMMENU NC.MainMenu)
			  (QUOTE CLOSEFN)
			  NIL)
	      (DELETEMENU NC.MainMenu T)))
          (SETQ NC.MainMenuWindow (WFROMMENU
	      (SETQ NC.MainMenu (create MENU
					ITEMS ←(QUOTE ((Close/Delete NIL 
						       "Close or delete note cards or file boxes")
							(NoteFile% Ops NIL 
							 "Brings up menu of NoteFile operations.")
							(Create NIL 
		       "Create a new Text card (left button) or other card type (middle button).")
							(Show% Box NIL 
							"Bring up one of the standard FileBoxes.")))
					WHENSELECTEDFN ←(FUNCTION NC.MainMenuWhenSelectedFn)
					CENTERFLG ← T
					MENUBORDERSIZE ← 1
					MENUOUTLINESIZE ← 2
					MENUCOLUMNS ← 2
					MENUFONT ← Font
					TITLE ←(OR (AND (BOUNDP (QUOTE PSA.Database))
							PSA.Database
							(OPENP PSA.Database)
							(CONCAT "NoteFile: "
								(LISTGET (UNPACKFILENAME
									   (FULLNAME PSA.Database))
									 (QUOTE NAME))))
						   "No Open NoteFile")
					MENUPOSITION ← Position
					ITEMHEIGHT ←(IPLUS 10 (FONTPROP Font (QUOTE HEIGHT)))
					ITEMWIDTH ←(IPLUS (STRINGWIDTH (QUOTE Close% Database)
								       Font)
							  20)
					MENUTITLEFONT ← Font))))
          (NC.DisplayMainMenu)
          (SETQ X (create MENU
			  ITEMS ←(QUOTE ((NoSource NIL "Indicates that this note card has no source.")
					  (Undo NIL "Backup over last selection.")
					  (Done NIL "Indicates that selection is completed.")))
			  WHENSELECTEDFN ←(FUNCTION NC.SelectionMenusWhenSelectedFn)
			  TITLE ← "Selecting Source(s)"
			  CENTERFLG ← T
			  MENUBORDERSIZE ← 1
			  MENUOUTLINESIZE ← 1
			  MENUCOLUMNS ← 3
			  MENUFONT ← Font
			  ITEMHEIGHT ←(IPLUS 10 (FONTPROP Font (QUOTE HEIGHT)))
			  MENUPOSITION ← Position
			  MENUTITLEFONT ← TitleFont))
          (SETQ NC.SelectingSourcesMenu X)
          (SETQ X (create MENU
			  ITEMS ←(QUOTE ((Cancel NIL "Cancel card closing.")
					  (Undo NIL "Backup over last selection.")
					  (Done NIL "Indicates that selection is completed.")))
			  WHENSELECTEDFN ←(FUNCTION NC.SelectionMenusWhenSelectedFn)
			  TITLE ← "Selecting File Box(es)"
			  CENTERFLG ← T
			  MENUBORDERSIZE ← 1
			  MENUOUTLINESIZE ← 1
			  MENUCOLUMNS ← 3
			  MENUFONT ← Font
			  ITEMHEIGHT ←(IPLUS 10 (FONTPROP Font (QUOTE HEIGHT)))
			  MENUPOSITION ← Position
			  MENUTITLEFONT ← TitleFont))
          (SETQ NC.SelectingContentsMenu X)
          (SETQ X (create MENU
			  ITEMS ←(QUOTE ((New% Card NIL "Make a new note card.")
					  (Cancel NIL "Cancel this selection.")))
			  WHENSELECTEDFN ←(FUNCTION NC.SelectionMenusWhenSelectedFn)
			  TITLE ← "Selecting Note Card"
			  CENTERFLG ← T
			  MENUBORDERSIZE ← 1
			  MENUOUTLINESIZE ← 1
			  MENUCOLUMNS ← 2
			  MENUFONT ← Font
			  ITEMHEIGHT ←(IPLUS 10 (FONTPROP Font (QUOTE HEIGHT)))
			  MENUPOSITION ← Position
			  MENUTITLEFONT ← TitleFont))
          (SETQ NC.SelectingSingleCardMenu X)
          (SETQ X (create MENU
			  ITEMS ←(QUOTE ((Cancel NIL "Cancel this selection.")))
			  WHENSELECTEDFN ←(FUNCTION NC.SelectionMenusWhenSelectedFn)
			  TITLE ← "Selecting Single Card"
			  CENTERFLG ← T
			  MENUBORDERSIZE ← 1
			  MENUOUTLINESIZE ← 1
			  MENUCOLUMNS ← 1
			  MENUFONT ← Font
			  ITEMHEIGHT ←(IPLUS 10 (FONTPROP Font (QUOTE HEIGHT)))
			  MENUPOSITION ← Position
			  MENUTITLEFONT ← TitleFont))
          (SETQ NC.SelectingCardMenu X)
          (SETQ X (create MENU
			  ITEMS ←(QUOTE ((Cancel NIL "Cancel this selection.")
					  (Undo NIL "Backup over last selection.")
					  (Done NIL "Indicates that selection is completed.")))
			  WHENSELECTEDFN ←(FUNCTION NC.SelectionMenusWhenSelectedFn)
			  TITLE ← "Selecting Note Cards"
			  CENTERFLG ← T
			  MENUBORDERSIZE ← 1
			  MENUOUTLINESIZE ← 1
			  MENUCOLUMNS ← 3
			  MENUFONT ← Font
			  ITEMHEIGHT ←(IPLUS 10 (FONTPROP Font (QUOTE HEIGHT)))
			  MENUPOSITION ← Position
			  MENUTITLEFONT ← TitleFont))
          (SETQ NC.SelectingMultipleCardsMenu X)
          (SETQ X (create MENU
			  ITEMS ←(QUOTE ((Cancel NIL "Cancel this selection.")
					  (Undo NIL "Backup over last selection.")
					  (Done NIL "Indicates that selection is completed.")))
			  WHENSELECTEDFN ←(FUNCTION NC.SelectionMenusWhenSelectedFn)
			  TITLE ← "Selecting cards to close or delete"
			  CENTERFLG ← T
			  MENUBORDERSIZE ← 1
			  MENUOUTLINESIZE ← 1
			  MENUCOLUMNS ← 3
			  MENUFONT ← Font
			  ITEMHEIGHT ←(IPLUS 10 (FONTPROP Font (QUOTE HEIGHT)))
			  MENUPOSITION ← Position
			  MENUTITLEFONT ← TitleFont))
          (SETQ NC.DeleteSelectingMenu X)
          (SETQ X (create MENU
			  ITEMS ←(QUOTE ((Cancel NIL "Cancel this selection.")
					  (Undo NIL "Backup over last selection.")
					  (Done NIL "Indicates that selection is completed.")))
			  WHENSELECTEDFN ←(FUNCTION NC.SelectionMenusWhenSelectedFn)
			  TITLE ← "Selecting FileBox(s)"
			  CENTERFLG ← T
			  MENUBORDERSIZE ← 1
			  MENUOUTLINESIZE ← 1
			  MENUCOLUMNS ← 3
			  MENUFONT ← Font
			  ITEMHEIGHT ←(IPLUS 10 (FONTPROP Font (QUOTE HEIGHT)))
			  MENUPOSITION ← Position
			  MENUTITLEFONT ← TitleFont))
          (SETQ NC.SelectingParentsMenu X)
          (SETQ X (create MENU
			  ITEMS ←(QUOTE ((Cancel NIL "Cancel this selection.")
					  (Undo NIL "Backup over last selection.")
					  (Done NIL "Indicates that this operation is completed.")))
			  WHENSELECTEDFN ←(FUNCTION NC.SelectionMenusWhenSelectedFn)
			  TITLE ← "Selecting Starting Card(s)/Box(s)"
			  CENTERFLG ← T
			  MENUBORDERSIZE ← 1
			  MENUOUTLINESIZE ← 1
			  MENUCOLUMNS ← 3
			  MENUFONT ← Font
			  ITEMHEIGHT ←(IPLUS 10 (FONTPROP Font (QUOTE HEIGHT)))
			  MENUPOSITION ← Position
			  MENUTITLEFONT ← TitleFont))
          (SETQ NC.SelectingBrowserSourceMenu X)
          (SETQ X (create MENU
			  ITEMS ←(QUOTE ((Cancel NIL "Cancel this operation.")
					  (Undo NIL "Backup over last selection.")
					  (Done NIL "Indicates that this operation is completed.")))
			  WHENSELECTEDFN ←(FUNCTION NC.SelectionMenusWhenSelectedFn)
			  TITLE ← "Selecting cards to file"
			  CENTERFLG ← T
			  MENUBORDERSIZE ← 1
			  MENUOUTLINESIZE ← 1
			  MENUCOLUMNS ← 3
			  MENUFONT ← Font
			  ITEMHEIGHT ←(IPLUS 10 (FONTPROP Font (QUOTE HEIGHT)))
			  MENUPOSITION ← Position
			  MENUTITLEFONT ← TitleFont))
          (SETQ NC.SelectingFileBoxChildrenMenu X)
          (SETQ X (create MENU
			  ITEMS ←(QUOTE ((Cancel NIL "Cancel this operation.")
					  (Undo NIL "Backup over last selection.")
					  (Done NIL "Indicates that this operation is completed.")))
			  WHENSELECTEDFN ←(FUNCTION NC.SelectionMenusWhenSelectedFn)
			  TITLE ← "Selecting Cards"
			  CENTERFLG ← T
			  MENUBORDERSIZE ← 1
			  MENUOUTLINESIZE ← 1
			  MENUCOLUMNS ← 3
			  MENUFONT ← Font
			  ITEMHEIGHT ←(IPLUS 10 (FONTPROP Font (QUOTE HEIGHT)))
			  MENUPOSITION ← Position
			  MENUTITLEFONT ← TitleFont))
          (SETQ NC.SelectingCardsMenu X))))

(NC.SetupScreen
  (LAMBDA NIL                                                (* fgh: " 3-Jan-85 14:09")

          (* * Setup the standard NoteCards screen)


    (AND (BOUNDP (QUOTE LOGOW))
	 (WINDOWP LOGOW)
	 (CLOSEW LOGOW))
    (AND (BOUNDP (QUOTE NC.LogoWindow))
	 (WINDOWP NC.LogoWindow)
	 (CLOSEW NC.LogoWindow))
    (NC.MakeLogoWindow)
    (MOVEW NC.LogoWindow 5 605)
    (TTY.PROCESS T)
    (SETQ ExecWindow (WFROMDS (TTYDISPLAYSTREAM)))
    (WINDOWPROP ExecWindow (QUOTE TITLE)
		NIL)
    (SHAPEW ExecWindow (CREATEREGION 608 650 267 66))
    (WINDOWPROP PROMPTWINDOW (QUOTE TITLE)
		NIL)
    (SHAPEW PROMPTWINDOW (CREATEREGION 350 721 526 78))
    (CROCK (CREATEREGION 882 650 127 147))
    (CLEARW PROMPTWINDOW)
    (CLEARW ExecWindow)
    (LAFITE (QUOTE OFF))
    (AND (BOUNDP (QUOTE PROCESS.STATUS.WINDOW))
	 (WINDOWP PROCESS.STATUS.WINDOW)
	 (CLOSEW PROCESS.STATUS.WINDOW))))

(NC.MainMenuWhenSelectedFn
  (LAMBDA (Item Menu Button)                                 (* rht: "15-Feb-85 16:47")
                                                             (* Function called when one of the items in the top 
							     level menu is chosen.)
    (COND
      ((NULL NC.MainMenuInProgress)
	(RESETLST (RESETSAVE NC.MainMenuInProgress T)
		  (RESETSAVE (SHADEITEM Item Menu GRAYSHADE)
			     (LIST (QUOTE SHADEITEM)
				   Item Menu WHITESHADE))
		  (COND
		    ((AND (NEQ (CAR Item)
			       (QUOTE NoteFile% Ops))
			  (OR (NULL PSA.Database)
			      (NOT (OPENP PSA.Database))))
		      (NC.PrintMsg NIL T "There is no open NoteFile." (CHARACTER 13)
				   
			    "A NoteFile must be opened before any operations can be carried out."
				   (CHARACTER 13)
				   
			      "Press NoteFile Ops to initiate the process of opening a database."
				   (CHARACTER 13)))
		    (T (SETQ NC.MainMenuInProgress (CAR Item))
		       (SELECTQ (CAR Item)
				(Create (COND
					  ((EQ Button (QUOTE LEFT))
					    (NC.MakeNoteCard NC.DefaultCardType))
					  (T (NC.MakeNoteCard))))
				(Show% Box (COND
					     ((EQ Button (QUOTE LEFT))
					       (NC.EditNoteCard NC.RootID))
					     (T (NC.ChooseTopLevelCard))))
				(Close/Delete (COND
						((EQ Button (QUOTE LEFT))
						  (NC.CloseNoteCards))
						(T (NC.ChooseCloseOrDelete))))
				(NoteFile% Ops (NC.DatabaseOperations))
				NIL)))))
      (T (NC.PrintMsg NIL NIL (CHARACTER 13)
		      NC.MainMenuInProgress " in progress.  Please wait.")))))

(NC.CacheTitles
  (LAMBDA (DatabaseStream UncacheFlg QuietFlg OperationMsg)
                                                             (* rht: "27-Jul-85 22:51")
                                                             (* Cache or uncache all of the titles on DatabaseSteam 
							     onto the prop lists of the NoteCard IDs)
    (PROG (CardTotal Title ID)
          (for CardNumber from 1 to (SETQ CardTotal (SUB1 (SUBATOM (NC.GetNewID DatabaseStream T)
								   3)))
	     do (BLOCK)
		(COND
		  ((AND (NULL QuietFlg)
			(ZEROP (IREMAINDER CardNumber 10)))
		    (NC.PrintMsg NIL T (COND
				   (OperationMsg (CONCAT OperationMsg (CHARACTER 13)))
				   (T ""))
				 "Processing item number " CardNumber " out of " CardTotal "."
				 (CHARACTER 13))))
		(SETQ ID (NC.IDFromNumber CardNumber))
		(COND
		  (UncacheFlg (REMPROP ID (QUOTE NoteCardTitle)))
		  (T (SETQ Title (NC.GetTitle ID DatabaseStream T))
		     (AND (NOT (FMEMB Title (QUOTE (FREE DELETED SPECIAL))))
			  (NC.SetTitle ID Title))))))))

(NC.CacheTypesAndTitles
  (LAMBDA (DatabaseStream UncacheFlg QuietFlg OperationMsg)
                                                             (* rht: "27-Jul-85 22:48")
                                                             (* Cache or uncache all of the titles on DatabaseSteam 
							     onto the prop lists of the NoteCard IDs)

          (* * rht 7/27/85: Added BLOCK call to cut down CPU hogging.)


    (LET (CardTotal)
      (for CardNumber from 1 to (SETQ CardTotal (SUB1 (STREAMPROP DatabaseStream (QUOTE NCNEXTIDNUM)))
				  )
	 bind Pair ID
	 do (BLOCK)
	    (COND
	      ((AND (NULL QuietFlg)
		    (ZEROP (IREMAINDER CardNumber 10)))
		(NC.PrintMsg NIL T (COND
			       (OperationMsg (CONCAT OperationMsg (CHARACTER 13)))
			       (T ""))
			     "Processing item number " CardNumber " out of " CardTotal "."
			     (CHARACTER 13))))
	    (SETQ ID (NC.IDFromNumber CardNumber))
	    (COND
	      (UncacheFlg (AND (NC.ActiveCardP ID)
			       (NC.QuitCard ID T))
			  (SETPROPLIST ID NIL))
	      (T (SETQ Pair (NC.GetTypeAndTitle ID DatabaseStream T))
		 (COND
		   ((NOT (FMEMB Pair (QUOTE (FREE DELETED SPECIAL))))
		     (NC.SetTitle ID (CDR Pair))
		     (NC.SetType ID (CAR Pair))))))))))

(NC.CloseDatabaseFile
  (LAMBDA NIL                                                (* rht: "14-Jul-85 21:03")
                                                             (* Close the currently open database file.)

          (* * 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.)


    (PROG (File CardTotal ID OpenWindows)
          (COND
	    ((OR (NULL PSA.Database)
		 (NOT (OPENP PSA.Database)))
	      (NC.PrintMsg NIL T "There is no open NoteFile!!!" (CHARACTER 13)))
	    (T (COND
		 ((SETQ OpenWindows (for Window in (OPENWINDOWS)
				       when (NC.ActiveCardP (OR (NC.IDFromWindow Window)
								(NC.IDFromWindow (WINDOWPROP
										   Window
										   (QUOTE ICONFOR)))))
				       collect Window))
		   (NC.PrintMsg NIL T "There are cards still active on the screen." (CHARACTER 13))
		   (COND
		     ((NC.YesP (NC.AskUser "Want to close and save them? " " -- " (QUOTE Yes)
					   NIL NIL NIL NIL T))
		       (NC.PrintMsg NIL T "Closing and saving active cards ... ")
		       (RESETLST (RESETSAVE NC.ForceSourcesFlg NIL)
				 (RESETSAVE NC.ForceFilingFlg NIL)
				 (RESETSAVE NC.ForceTitlesFlg NIL)
				 (for Window in OpenWindows
				    do (COND
					 ((WINDOWPROP Window (QUOTE ICONFOR))
					   (SETQ Window (EXPANDW Window))))
				       (NC.QuitCard (NC.IDFromWindow Window)
						    T)
				       (bind (Process ←(WINDOWPROP Window (QUOTE PROCESS)))
					  until (OR (NULL Process)
						    (PROCESS.FINISHEDP Process))
					  do (BLOCK))))
		       (NC.PrintMsg NIL NIL "Done." (CHARACTER 13)))
		     (T (RETURN NIL)))))
	       (NC.PrintMsg NIL T "Closing Notefile ... " (CHARACTER 13))
	       (RESETLST (RESETSAVE NC.ForceSourcesFlg NIL)
			 (RESETSAVE NC.ForceFilingFlg NIL)
			 (RESETSAVE NC.ForceTitlesFlg NIL)
			 (NC.CacheTypesAndTitles PSA.Database T NIL "Closing NoteFile."))
	       (NC.CheckpointDatabase PSA.Database)
	       (SETQ File (FULLNAME PSA.Database))

          (* * Set PSA.Database GlobalVar to NIL so that the advise to CLOSEF will not refuse to close this file.)


	       (NC.ForceDatabaseClose PSA.Database)
	       (NC.ResetMainMenu)
	       (NC.PrintMsg NIL T File " closed."))))))

(NC.CompactDatabase
  (LAMBDA (FromFileName ToFileName)                          (* rht: " 1-Mar-85 19:29")
                                                             (* Top-level call to the database compactor.)

          (* * rht 8/7/84: Changes NC.DatabaseFileNameSuggestion to the name of the compacted file.)



          (* * rht 3/1/85: New arg. compacts from FromFileName to ToFileName. If either is nil, then asks user.)


    (PROG (Result)
          (COND
	    ((AND PSA.Database (OPENP PSA.Database))
	      (NC.PrintMsg NIL T "There is an open NoteFile." (CHARACTER 13)
			   "The NoteFile must be closed before any NoteFile can be compacted."
			   (CHARACTER 13)))
	    ((AND (OR FromFileName (SETQ FromFileName (NC.DatabaseFileName 
							      "Name of NoteFile to be compacted:"
									   " -- " T)))
		  (OR ToFileName (SETQ ToFileName (NC.DatabaseFileName 
								  "Name of target of compaction:"
								       " -- " T))))
	      (NC.ClearMsg)
	      (COND
		((SETQ Result (NC.FastCompactDatabase FromFileName ToFileName))
		  (NC.PrintMsg NIL T (CAR Result)
			       " compacted to "
			       (CADR Result)
			       "."
			       (CHARACTER 13))
		  (SETQ NC.DatabaseFileNameSuggestion (PACKFILENAME (QUOTE VERSION)
								    NIL
								    (QUOTE BODY)
								    (CADR Result))))))))))

(NC.DatabaseOperations
  (LAMBDA NIL                                                (* rht: " 7-Oct-85 21:06")
                                                             (* Ask usere to choose which database operation.
							     Called from main menu whenselected fn.)
    (PROG (Menu W Z (Font (FONTCREATE (QUOTE HELVETICA)
				      10
				      (QUOTE BOLD))))
          (SPAWN.MOUSE)
          (SETQ Menu (OR (AND (BOUNDP (QUOTE NC.DatabaseOperationsMenu))
			      (type? MENU NC.DatabaseOperationsMenu)
			      NC.DatabaseOperationsMenu)
			 (SETQ NC.DatabaseOperationsMenu
			   (create MENU
				   ITEMS ←(QUOTE ((Change% Parameters (NC.BuildInspector)
								      
						"Bring up editor to change NoteCards parameters.")
						   (Open% NoteFile (NC.OpenDatabaseFile)
								   "Opens a NoteFile.")
						   (Close% NoteFile (NC.CloseDatabaseFile)
								    
							    "Closes the currently open NoteFile.")
						   (Checkpoint% Session (NC.CheckpointDatabase)
									
				    "Checkpoint the currently open NoteFile, saving dirty cards.")
						   (Abort% Session (NC.AbortSession)
								   
				  "Aborts the current session losing work since last checkpoint.")
						   (List% NoteFiles (NC.ListDatabaseFiles)
								    
				    "Lists all of the NoteFiles stored in the current directory.")
						   (Create% New% NoteFile (NC.CreateDatabaseFile)
									  
								"Creates a new (empty) NoteFile.")
						   (Compact% NoteFile (NC.CompactDatabase)
								      
							  "Compacts a NoteFile to a target file."
								      (SUBITEMS (
Compact% To% Target% File (NC.CompactDatabase)
			  "Compacts a NoteFile to a target file.")
										(Compact% In% Place
										  (
NC.CompactDatabaseInPlace)
										  
								  "Compacts a NoteFile in place.")))
						   (Inspect&Repair% NoteFile
						     (NC.ScavengerPhase1)
						     "Inspects and optionally repairs a NoteFile."
						     (SUBITEMS (Read% Substances (NC.ScavengerPhase1
										   NIL T)
										 
"Inspects and optionally repairs a Notefile, but reads every substance.  This slows it WAY down.")))
						   (Delete% NoteFile (NC.DeleteDatabaseFile NIL)
								     
						      "Deletes the oldest version of a NoteFile.")
						   (Copy% NoteFile (NC.CopyDatabase)
								   
							    "Copies a notefile to a target file.")))
				   CENTERFLG ← T
				   TITLE ← "Operation?"
				   MENUFONT ← Font
				   ITEMHEIGHT ←(IPLUS (FONTPROP Font (QUOTE HEIGHT))
						      1)))))
          (SETQ W (MENUITEMREGION (CAR (NTH (fetch (MENU ITEMS) of NC.MainMenu)
					    2))
				  NC.MainMenu))
          (SETQ Z (WINDOWPROP (WFROMMENU NC.MainMenu)
			      (QUOTE REGION)))
          (replace MENUPOSITION of NC.DatabaseOperationsMenu
	     with (CONS (IPLUS (fetch (REGION LEFT) of W)
			       (fetch (REGION LEFT) of Z))
			(IPLUS (fetch (REGION TOP) of W)
			       (fetch (REGION BOTTOM) of Z)
			       (IMINUS (fetch (MENU IMAGEHEIGHT) of NC.DatabaseOperationsMenu)))))
          (MENU NC.DatabaseOperationsMenu))))

(NC.LogoutAdvice
  (LAMBDA NIL                                                (* fgh: "13-Aug-84 23:41")
                                                             (* Advice attached to logout to prevent logging out 
							     with an open database.)
    (COND
      ((AND (BOUNDP (QUOTE PSA.Database))
	    (STREAMP PSA.Database)
	    (OPENP PSA.Database))
	(NC.PrintMsg NIL T "There is an open NoteFile: " (FULLNAME PSA.Database)
		     (CHARACTER 13)
		     "It must be closed before you can logout!!!"
		     (CHARACTER 13))
	(RPTQ 1 (PROGN (VIDEOCOLOR T)
		       (DISMISS 100)
		       (VIDEOCOLOR NIL)
		       (DISMISS 100)))
	(RPTQ 3 (FLASHW PROMPTWINDOW))
	(RETFROM (QUOTE LOGOUT))))))

(NC.DatabaseFileName
  (LAMBDA (Msg Prompt ClearFirstFlg NoSuggestFlg Name)       (* rht: "18-Dec-84 15:35")
                                                             (* Make a NoteCards database file name on the base 
							     specified by the user. Basically, add the NOTEFILE 
							     extension)

          (* * rht 8/7/84: Now provides file name suggestion for user (unless NoSuggestFlg is non-nil.) The suggestion is in 
	  the global var NC.DatabaseFileNameSuggestion which is reset to the new file name before returning.)


    (PROG NIL
          (OR Name (SETQ Name (MKATOM (NC.AskUser Msg Prompt (AND (NOT NoSuggestFlg)
								  NC.DatabaseFileNameSuggestion)
						  ClearFirstFlg NIL T))))
          (AND (NULL Name)
	       (RETURN NIL))
          (SETQ Name (PACKFILENAME (QUOTE BODY)
				   Name
				   (QUOTE EXTENSION)
				   (QUOTE NOTEFILE)))
          (SETQ NC.DatabaseFileNameSuggestion (PACKFILENAME (QUOTE VERSION)
							    NIL
							    (QUOTE BODY)
							    (FULLNAME Name)))
          (RETURN Name))))

(NC.DeleteDatabaseFile
  (LAMBDA (FileName)                                         (* rht: "30-May-85 22:29")
                                                             (* Delete file FileName)
    (PROG (FullFileName)                                     (* Make sure no open databases)

          (* * rht 8/7/84: If delete happens, clear NC.DatabaseFileNameSuggestion.)



          (* * rht 3/17/85: Fixed for case when user specifies version number of file to delete.)


          (COND
	    ((AND PSA.Database (OPENP PSA.Database))
	      (NC.PrintMsg NIL T "There is an open NoteFile." (CHARACTER 13)
			   "The NoteFile must be closed" " before any NoteFile can be " "deleted."
			   (CHARACTER 13))
	      (RETURN)))                                     (* Get file name)
          (AND (NULL FileName)
	       (NULL (SETQ FileName (NC.DatabaseFileName "Name of Notefile to be deleted:" " -- " T)))
	       (RETURN NIL))                                 (* make sure to be deleted file exists)
          (SETQ FullFileName (if (FILENAMEFIELD FileName (QUOTE VERSION))
				 then (FULLNAME FileName)
			       else (CAR (FILDIR-EARLIEST FileName))))
          (COND
	    ((NULL FullFileName)
	      (NC.PrintMsg NIL T FileName " does not exist." (CHARACTER 13)
			   "Delete cancelled."
			   (CHARACTER 13))
	      (RETURN)))                                     (* Ask user to confirm twice.)
          (COND
	    ((NOT (NC.YesP (NC.AskUser (CONCAT "Are you sure you want to delete " FullFileName "?")
				       " -- " "No" T NIL T NIL T)))
	      (NC.ClearMsg NIL NIL)
	      (RETURN)))
          (NC.PrintMsg NIL T "Deleteing " FullFileName (CHARACTER 13))
          (DISMISS 2500)
          (COND
	    ((NOT (NC.YesP (NC.AskUser (CONCAT "Are you STILL sure you want to delete " FullFileName 
					       "?")
				       " -- " "No" T NIL T NIL T)))
	      (NC.ClearMsg NIL NIL)
	      (RETURN)))                                     (* Delete the file)
          (SETQ FullFileName (DELFILE FullFileName))
          (SETQ NC.DatabaseFileNameSuggestion NIL)
          (NC.PrintMsg NIL T FullFileName " deleted." (CHARACTER 13)))))

(INSTALL
  (LAMBDA NIL                                                (* fgh: "13-Aug-84 23:41")

          (* NoteCards system installatiuon routine. For DLions only. Basically to a MKDIR on DLION disk and copy the font 
	  files from floppy to local disk. To be run only after the DLion local disk has been repartitioned.)


    (COND
      ((EQ (MACHINETYPE)
	   (QUOTE DANDELION))
	(RESETLST (RESETSAVE NIL (LIST (QUOTE WINDOWPROP)
				       ExecWindow
				       (QUOTE PAGEFULLFN)
				       (WINDOWPROP ExecWindow (QUOTE PAGEFULLFN)
						   (FUNCTION NILL))))
		  (COND
		    ((NOT (DFSLISPVOLUMEP (QUOTE DSK)))
		      (MKDIR (QUOTE DSK))))
		  (PROG (Files FloppyName)
		        (NC.ClearMsg NIL NIL)
		    Loop(NC.PrintMsg NIL NIL "Please insert the Lisp Library #2" 
				     " diskette in the floppy disk drive."
				     (CHARACTER 13))
		        (FLOPPY.WAIT.FOR.FLOPPY)
		        (NC.PrintMsg NIL T "NoteCards Initialization." (CHARACTER 13)
				     "Examining files on the Lisp Library #2" " diskette."
				     (CHARACTER 13)
				     "Please wait ... "
				     (CHARACTER 13))
		        (COND
			  ((AND (NEQ (SETQ FloppyName (FLOPPY.NAME))
				     (QUOTE LispLibrary2))
				(NEQ FloppyName (QUOTE LispPackages)))
			    (NC.PrintMsg NIL T "The floppy currently in the drive is named: " 
					 FloppyName (CHARACTER 13)
					 "Please insert the correct diskette."
					 (CHARACTER 13))
			    (GO Loop))
			  (T (SETQ Files (FILDIR (QUOTE {FLOPPY}*.STRIKE)))
			     (COND
			       ((NULL Files)
				 (NC.PrintMsg NIL T "There are no font files on this diskette."
					      (CHARACTER 13)
					      "Please insert the correct diskette."
					      (CHARACTER 13))
				 (GO Loop))
			       (T (NC.PrintMsg NIL T "NoteCards Initialization." (CHARACTER 13)
					       "Copying files from the Lisp Library #2" 
					       " diskette to hard disk."
					       (CHARACTER 13)
					       "Please wait ... "
					       (CHARACTER 13))
				  (for File in Files do (COPYFILE File (PACKFILENAME (QUOTE HOST)
										     (QUOTE DSK)
										     (QUOTE VERSION)
										     NIL
										     (QUOTE BODY)
										     File)))
				  (COPYFILE (QUOTE {FLOPPY}FONTS.WIDTHS)
					    (QUOTE {DSK}FONTS.WIDTHS))))))))))
    (NC.PrintMsg NIL T "NoteCards System Installation Completed." (CHARACTER 13))
    (QUOTE Done)))

(NC.ForceDatabaseClose
  (LAMBDA (DatabaseStream)                                   (* rht: " 9-Jul-85 18:44")

          (* * Really close the database, i.e.. bypass the ADVISE on CLOSEF that prevents closing of the database.)



          (* * rht 1/10/85: Note new kludgey call to \UPDATEOF recommended by Tayloe to avoid truncation problems.)



          (* * rht 2/5/85: Added resetting of NC.UncachingNotCompleted here so it will happen after compact, repair, etc.)



          (* * rht 7/9/85: Added resetting of NC.LinkLabelsDate.)


    (\UPDATEOF DatabaseStream)
    (SETQ PSA.Database NIL)
    (SETQ NC.UncachingNotCompleted NIL)
    (SETQ NC.LinkLabelsDate NIL)
    (CLOSEF DatabaseStream)))

(NC.ListDatabaseFiles
  (LAMBDA NIL                                                (* rht: "23-May-85 13:21")
                                                             (* Do a DIR on all of the NoteFiles on the current 
							     connected directory.)

          (* * rht 5/22/85: Now prompts user with search pattern based on current connected directory.)


    (PROG (Files SearchPattern)
          (RESETLST (RESETSAVE (TTYDISPLAYSTREAM PROMPTWINDOW))
		    (RESETSAVE NIL (LIST (QUOTE WINDOWPROP)
					 PROMPTWINDOW
					 (QUOTE PAGEFULLFN)
					 (WINDOWPROP PROMPTWINDOW (QUOTE PAGEFULLFN)
						     NIL)))
		    (GIVE.TTY.PROCESS PROMPTWINDOW)
		    (SETQ SearchPattern (NC.AskUser "Search pattern: " NIL (CONCAT (DIRECTORYNAME
										     T)
										   "*.NoteFile")
						    T NIL))
		    (CLEARBUF T)
		    (NC.PrintMsg NIL T "Searching ...")
		    (if (AND SearchPattern (SETQ Files (FILDIR SearchPattern)))
			then (NC.ClearMsg NIL)
			     (for File in Files do (printout PROMPTWINDOW File T))
		      else (NC.PrintMsg NIL T "There are no files matching the pattern: " 
					SearchPattern))))))

(NC.MakeFloppies
  (LAMBDA NIL                                                (* NoteCards% User "12-Jun-84 23:09")
                                                             (* Make sysout on floppies for loading by NoteCards 
							     installation Prometheus script)
    (RESETLST (RESETSAVE (FLOPPY.MODE (QUOTE SYSOUT)))
	      (RESETSAVE (ADVISE (QUOTE \PFLOPPY.FORMAT)
				 (QUOTE BEFORE)
				 (QUOTE (SETQ NAME (CONCAT "NoteCards Sysout #"
							   (SUBSTRING NAME -1 -1)))))
			 (QUOTE (UNADVISE \PFLOPPY.FORMAT)))
	      (COPYFILE (QUOTE {PHYLUM}<PSA>NOTECARDS>NOTECARDS.SYSOUT)
			(QUOTE {FLOPPY})))))

(NC.MakeSysout
  (LAMBDA NIL                                                (* NoteCards% User "13-Jun-84 00:03")
                                                             (* Make the NoteCards sysout -
							     making sure that the correct logion, etc is done on 
							     coming back from the sysout)
    (PROG (OldPageFullFn)
          (AND (BOUNDP (QUOTE LOGOW))
	       (WINDOWP LOGOW)
	       (CLOSEW LOGOW))
          (COND
	    ((OR (NOT (BOUNDP (QUOTE QUADTREE.HIGHRES)))
		 (NLISTP (QUOTE QUADTREE.HIGHRES)))
	      (SETQ QUADTREE.HIGHRES (GET.QUAD.TREE (QUOTE WORLD5)))))
          (SETQ World5File (QUOTE {DSK}WORLD5.MAPDATA))
          (SETQ FONTDIRECTORIES (LIST (QUOTE {DSK})))
          (NC.MakeLogoWindow)
          (MOVEW NC.LogoWindow 5 605)
          (TTY.PROCESS T)
          (SETQ ExecWindow (WFROMDS (TTYDISPLAYSTREAM)))
          (SETQ OldPageFullFn (WINDOWPROP ExecWindow (QUOTE PAGEFULLFN)
					  (FUNCTION NILL)))
          (WINDOWPROP ExecWindow (QUOTE TITLE)
		      NIL)
          (SHAPEW ExecWindow (CREATEREGION 608 650 267 66))
          (WINDOWPROP PROMPTWINDOW (QUOTE TITLE)
		      NIL)
          (SHAPEW PROMPTWINDOW (CREATEREGION 350 721 526 78))
          (CROCK (CREATEREGION 882 650 127 147))
          (CLEARW PROMPTWINDOW)
          (CLEARW ExecWindow)
          (SYSOUT (QUOTE {DSK4}NOTECARDS.SYSOUT;1))
          (CLEARW ExecWindow)
          (WINDOWPROP ExecWindow (QUOTE PAGEFULLFN)
		      OldPageFullFn)
          (LOGIN)
          (USERNAME)
          (RETURN (QUOTE NoteCards)))))

(NC.AdjustCloseF
  (LAMBDA NIL                                                (* fgh: "28-Oct-84 22:25")

          (* * Essentially Advise CLOSEF buit do it in a way that can be compiled)


    (COND
      ((NOT (EQUAL (GETD (QUOTE CLOSEF))
		   (GETD (QUOTE NC.AdvisedCloseF))))
	(MOVD (QUOTE CLOSEF)
	      (QUOTE NC.OldCloseF))
	(MOVD (QUOTE NC.AdvisedCloseF)
	      (QUOTE CLOSEF))))))

(NC.AdvisedCloseF
  (LAMBDA (FILE)                                             (* fgh: "28-Oct-84 22:15")

          (* * Essentially CLOSEF but prevent PSA.Databse from being closed!!! A compiled advise kludge this is.)


    (AND (NEQ FILE PSA.Database)
	 (NC.OldCloseF FILE))))

(NC.CloseNoteCards
  (LAMBDA (CardTextStreamWindowOrID NoCheckFlg DontClearFlg)
                                                             (* kirk: "19-Sep-85 15:21")

          (* * Close note acrds on the screen)


    (PROG (ID Cards Window)
          (SETQ Cards (OR CardTextStreamWindowOrID (NC.SelectNoteCards NIL NIL NC.DeleteSelectingMenu 
								       NIL NIL 
							  "Please select the cards to be closed.")))
          (SPAWN.MOUSE)
          (for Card in (MKLIST Cards)
	     do (SETQ ID (COND
		    ((WINDOWP Card)
		      (NC.IDFromWindow Card))
		    ((NC.IDP Card)
		      Card)
		    ((TEXTSTREAMP Card)
		      (NC.IDFromWindow (WINDOW.FROM.TEDIT.THING Card)))))
		(COND
		  ((AND (NC.ActiveCardP ID)
			(SETQ Window (NC.FetchWindow ID)))
		    (if (NEQ (NC.QuitCard ID T)
			     (QUOTE DON'T))
			then (while (OPENWP Window) do (BLOCK)))))))))

(NC.SetMainMenuTitle
  (LAMBDA (Stream)                                           (* rht: " 4-Oct-85 00:05")

          (* * Replace the NC main menu title with the name of current notefile.)


    (replace (MENU TITLE) of NC.MainMenu with (CONCAT "NoteFile: " (LISTGET (UNPACKFILENAME
									      (FULLNAME Stream))
									    (QUOTE NAME))))
    (replace (MENU IMAGE) of NC.MainMenu with NIL)
    (NC.DisplayMainMenu)))
)
(* * Menus of all sorts)

(DEFINEQ

(NC.AskLinkLabel
  (LAMBDA (MainWindow MultipleFlg SystemLinksFlg NewLinkFlg CancelOkayFlg ReverseLinksFlg 
		      OldLinkLabels ReturnListOfListFlg)     (* rht: "22-Oct-85 14:41")
                                                             (* Asks for label on notecard links)

          (* * rht 8/2/84: Added double columns for when called by the browser, i.e. ReverseLinksFlg=T.
	  Reverse links have prefix "←".)



          (* * rht 11/19/84: Changed strings from "pointer" to "link" and from "label" to "type".)



          (* * rht 2/14/85: Added extra arg OldLinkLabels in the Multiple selection case to display previous choices.)



          (* * rht 10/11/85: Took out printing to prompt window. It's a waste of screen space.)



          (* * rht 10/22/85: Added ReturnListOfListFlg so caller can tell difference between aborting from Stylesheet and 
	  choosing NULL set of links.)


    (PROG (Menu Choice Choices LabelsList (LinkLabels (NC.RetrieveLinkLabels PSA.Database 
									     SystemLinksFlg))
		Position)
          (SETQ Position (AND (WINDOWP MainWindow)
			      (create POSITION
				      XCOORD ←(fetch (REGION LEFT) of (WINDOWPROP MainWindow
										  (QUOTE REGION)))
				      YCOORD ←(fetch (REGION TOP) of (WINDOWREGION MainWindow)))))
          (if MultipleFlg
	      then (SETQ Choices (STYLESHEET (CREATE.STYLE
					       (QUOTE ITEMS)
					       (if ReverseLinksFlg
						   then (LIST (create MENU
								      ITEMS ← LinkLabels)
							      (create MENU
								      ITEMS ←(for Link in LinkLabels
										collect
										 (PACK* (QUOTE ←)
											Link))))
						 else (LIST (create MENU
								    ITEMS ← LinkLabels)))
					       (QUOTE NEED.NOT.FILL.IN)
					       (QUOTE MULTI)
					       (QUOTE POSITION)
					       Position
					       (QUOTE TITLE)
					       "Link Types?"
					       (QUOTE SELECTIONS)
					       (LIST (for Label in OldLinkLabels
							when (NEQ (NTHCHAR Label 1)
								  (QUOTE ←))
							collect Label)
						     (for Label in OldLinkLabels
							when (EQ (NTHCHAR Label 1)
								 (QUOTE ←))
							collect Label)))))
		   (RETURN (COND
			     ((NULL Choices)                 (* User aborted from stylesheet.)
			       NIL)
			     ((AND ReverseLinksFlg ReturnListOfListFlg)
			       (LIST (NCONC (CAR Choices)
					    (CADR Choices))))
			     (ReverseLinksFlg (NCONC (CAR Choices)
						     (CADR Choices)))
			     (ReturnListOfListFlg Choices)
			     (T (CAR Choices)))))
          (SETQ Menu (create MENU
			     TITLE ← "Link Type?"
			     ITEMS ←(NCONC (COND
					     (ReverseLinksFlg (for Link in LinkLabels
								 join (LIST Link (CONCAT "←" Link))))
					     (T (COPY LinkLabels)))
					   (AND NewLinkFlg (LIST (QUOTE --New% Link% Type--)))
					   (AND CancelOkayFlg (LIST (QUOTE **CANCEL**))))
			     MENUPOSITION ← Position
			     MENUCOLUMNS ←(AND ReverseLinksFlg 2)))
          (SETQ Choice (OR (MKATOM (MENU Menu))
			   NC.UnspecifiedLinkLabel))
          (COND
	    ((EQ Choice (QUOTE **CANCEL**))
	      (SETQ Choice))
	    ((EQ Choice (QUOTE --New% Link% Type--))
	      (NC.ClearMsg MainWindow NIL)
	      (until (COND
		       ((NOT (FMEMB (U-CASE (SETQ Choice (MKATOM (NC.AskUser "Enter new link type: " 
									     NIL NIL NIL MainWindow 
									     NIL))))
				    NC.UCASESystemLinkLabels))
			 T)
		       (T (NC.PrintMsg MainWindow T Choice " is a system reserved link type."
				       (CHARACTER 13)
				       "Please choose another link type."
				       (CHARACTER 13))
			  NIL)))
	      (OR Choice (SETQ Choice NC.UnspecifiedLinkLabel))
	      (AND (NOT (FMEMB Choice LinkLabels))
		   (NC.PutLinkLabels PSA.Database (CONS Choice LinkLabels)))))
          (RETURN Choice))))

(NC.AskNoteCardType
  (LAMBDA (Region)                                           (* fgh: " 1-Apr-85 11:50")
                                                             (* Ask user to choose a note card type)

          (* * rht 1/12/85: Now takes an optional Region argument dictating where to place the NoteCardTypeMenu.
	  If NIL, then uses MainMenu.)


    (PROG (W Z (Font (FONTCREATE (QUOTE HELVETICA)
				 10
				 (QUOTE BOLD))))
          (OR (AND (BOUNDP (QUOTE NC.NoteCardTypeMenu))
		   (type? MENU NC.NoteCardTypeMenu))
	      (SETQ NC.NoteCardTypeMenu (create MENU
						ITEMS ←(NC.ListOfCardTypes T)
						CENTERFLG ← T
						TITLE ← "Type?"
						MENUFONT ← Font
						ITEMHEIGHT ←(IPLUS (FONTPROP Font (QUOTE HEIGHT))
								   1))))
          (replace MENUPOSITION of NC.NoteCardTypeMenu
	     with (COND
		    (Region (CONS (fetch (REGION LEFT) of Region)
				  (IPLUS (fetch (REGION BOTTOM) of Region)
					 (fetch (REGION HEIGHT) of Region)
					 (IMINUS (fetch (MENU IMAGEHEIGHT) of NC.NoteCardTypeMenu)))))
		    (T (CONS (IPLUS (fetch (REGION LEFT) of (SETQ Z (WINDOWPROP (WFROMMENU 
										      NC.MainMenu)
										(QUOTE REGION))))
				    (fetch (REGION LEFT)
				       of (SETQ W (MENUITEMREGION (CAR (NTH (fetch (MENU ITEMS)
									       of NC.MainMenu)
									    3))
								  NC.MainMenu))))
			     (IPLUS (fetch (REGION BOTTOM) of Z)
				    (fetch (REGION TOP) of W)
				    (IMINUS (fetch (MENU IMAGEHEIGHT) of NC.NoteCardTypeMenu)))))))
          (RETURN (MENU NC.NoteCardTypeMenu)))))

(NC.ChooseTopLevelCard
  (LAMBDA NIL                                                (* rht: "16-Nov-84 10:24")

          (* Let the user choose one of the top level cards. Top level cards are specified by globalvar NC.TopLevelCards which
	  is a list of IDs)


    (PROG (ID Menu W Z)
          (SETQ Menu (create MENU
			     ITEMS ←(for CardID in NC.TopLevelCards collect (LIST (NC.RetrieveTitle
										    CardID 
										    PSA.Database)
										  CardID))
			     CENTERFLG ← T
			     MENUFONT ←(FONTCREATE (QUOTE HELVETICA)
						   10
						   (QUOTE BOLD))
			     WHENSELECTEDFN ←(FUNCTION (LAMBDA (Item Button Menu)
				 (NC.EditNoteCard (CADR Item))))
			     TITLE ← "FileBox?"))
          (SETQ W (MENUITEMREGION (CAR (NTH (fetch (MENU ITEMS) of NC.MainMenu)
					    4))
				  NC.MainMenu))
          (SETQ Z (WINDOWPROP (WFROMMENU NC.MainMenu)
			      (QUOTE REGION)))
          (replace (MENU MENUPOSITION) of Menu with (create POSITION
							    XCOORD ←(IPLUS (fetch (REGION LEFT)
									      of W)
									   (fetch (REGION LEFT)
									      of Z))
							    YCOORD ←(IPLUS
							      (fetch (REGION TOP) of W)
							      (fetch (REGION BOTTOM) of Z)
							      (IMINUS (fetch (MENU IMAGEHEIGHT)
									 of Menu)))))
          (SETQ ID (MENU Menu)))))

(NC.DisplayMainMenu
  (LAMBDA NIL                                                (* fgh: " 8-Aug-84 17:10")
                                                             (* Displays the main NoteCards menu)
    (PROG (W)
          (COND
	    ((SETQ W (WFROMMENU NC.MainMenu))
	      (WINDOWPROP W (QUOTE CLOSEFN)
			  NIL)
	      (DELETEMENU NC.MainMenu T)))
          (SETQ NC.MainMenuWindow (SETQ W (ADDMENU NC.MainMenu NIL (AND W (LOWERLEFT
									  (WINDOWPROP W (QUOTE REGION)
										      ))))))
          (WINDOWPROP W (QUOTE RESHAPEFN)
		      (QUOTE DON'T))
          (WINDOWPROP W (QUOTE SHRINKFN)
		      (QUOTE DON'T))
          (WINDOWPROP W (QUOTE CLOSEFN)
		      (FUNCTION (LAMBDA (Window)
			  (COND
			    (NC.FixedMenuFlg (QUOTE DON'T))
			    (T NIL)))))
          (WINDOWPROP W (QUOTE MOVEFN)
		      (FUNCTION (LAMBDA (Window)
			  (COND
			    (NC.FixedMenuFlg (QUOTE DON'T))
			    (T NIL))))))))

(NC.RemoveSketchMenuItems
  (LAMBDA (SketchMenu)                                       (* fgh: "13-Aug-84 18:40")

          (* * Remove unwanted items from Sketch Card SKetch Menu. Called from ADVISE on CREATE.SKETCHW.COMMANDMENU.
	  NOTE: SKETCHW refers to SK.INSURE.MENU)


    (PROG ((ItemsToBeRemoved (QUOTE (LINK New% View locator inspect))))
          (AND (NULL NC.AnnoFlg)
	       (SETQ ItemsToBeRemoved (CONS (QUOTE Annotate)
					    ItemsToBeRemoved)))
          (AND (NC.IDFromWindow SKETCHW)
	       (RETURN (replace (MENU ITEMS) of SketchMenu with (for Item in (fetch (MENU ITEMS)
										of SketchMenu)
								   when (NOT (FMEMB (CAR Item)
										    ItemsToBeRemoved))
								   collect Item)))))))

(NC.SelectionMenusWhenSelectedFn
  (LAMBDA (Item Menu Button)                                 (* rht: "19-Aug-85 17:45")

          (* * rht 2/15/85: Added handler for Undo.)


    (SELECTQ (CAR Item)
	     ((Done)
	       (SETQ NC.SelectionInProgress))
	     ((Abort Cancel)
	       (SETQ NC.SelectionInProgress)
	       (SETQ NC.SelectedCards (QUOTE CANCELLED)))
	     (New% Card (SETQ NC.SelectedCards (CONS (QUOTE *New% Card*)
						     NC.SelectedCards)))
	     (NoSource (SETQ NC.SelectedCards (LIST (QUOTE NC00000)))
		       (SETQ NC.SelectionInProgress))
	     (Undo (SETQ NC.SelectedCards (CONS (QUOTE *Undo% Selection*)
						NC.SelectedCards)))
	     NIL)))

(NC.SetupTitleBarMenu
  (LAMBDA (Window ID NoteCardType)                           (* rht: " 1-Oct-85 17:28")
                                                             (* Setup the title bar menu for the window Window 
							     pertaining to Card specified by ID)

          (* * rht 1/3/85: Now takes optional NoteCardType arg in case need to override the ID's type.
	  Like when ID is of type that inherits from Browser. Also changed "pointer" to "link" everywhere.)



          (* * rht 1/12/85: Added menu for StructEdit type. Just the same except has no InsertLink operation.
	  This needs to be cleaned up and interfaced to Types mechanism.)



          (* * rht 1/15/85: Added "Relayout" item to the browser title bar middle button menu, and made graph and structedit 
	  cards contain only that item on their middle button menus.)



          (* * rht 5/22/85: Took out structedit and structeditbrowser junk.)


    (PROG NIL
          (OR NoteCardType (SETQ NoteCardType (NC.FetchType ID)))
          (OR (EQ (WINDOWPROP Window (QUOTE BUTTONEVENTFN))
		  (FUNCTION NC.TitleBarButtonEventFn))
	      (WINDOWPROP Window (QUOTE OLDBUTTONEVENTFN)
			  (WINDOWPROP Window (QUOTE BUTTONEVENTFN)
				      (FUNCTION NC.TitleBarButtonEventFn))))
          (WINDOWPROP
	    Window
	    (QUOTE TitleBarLeftButtonMenu)
	    (SELECTQ NoteCardType
		     (Graph (OR (AND (BOUNDP (QUOTE NC.GraphTitleBarMenu))
				     (type? MENU NC.GraphTitleBarMenu))
				(SETQ NC.GraphTitleBarMenu
				  (create MENU
					  ITEMS ←(QUOTE
					    ((Edit% Property% List (FUNCTION NC.EditProperties)
								   
					"Brings up an editor for the property list of this card.")
					      (Show% Links (FUNCTION NC.ShowPointers)
							   
					   "Brings up a list of the links to and from this card.")
					      (Title/Sources/FileBoxes
						(FUNCTION (LAMBDA (TextStream)
						    (NC.AssignTitle TextStream)
						    (NC.AssignSources TextStream)
						    (NC.AddParents TextStream)))
						
		       "Do all of the operations necessary to file this note card in a file box."
						(SUBITEMS (Assign% Title (FUNCTION NC.AssignTitle)
									 
						       "Assigns a (new) title to this note card.")
							  (Designate% Sources (FUNCTION 
										NC.AssignSources)
									      
				       "Designate the source(s) of the information in this card.")
							  (File% in% FileBoxes
							    (FUNCTION NC.AddParents)
							    
						 "File this note card in one or more file boxes.")
							  (Unfile% from% FileBoxes
							    (FUNCTION NC.UnfileNoteCard)
							    
					   "Remove this card from one or more of its file boxes.")
							  (Delete% Source (FUNCTION NC.DeleteSource)
									  
							"Delete one of the sources of this card.")))
					      (Insert% Link (FUNCTION NC.AddLinkToGraphCard)
							    
						   "Add a node that points to another note card."
							    (SUBITEMS (Insert% Link
									(FUNCTION 
									  NC.AddLinkToGraphCard)
									
						   "Add a node that points to another note card.")
								      (Add% Global% Link
									(FUNCTION 
									  NC.AddGlobalLinkToCard)
									
						    "Add a global link emanating from this card.")
								      (Add% Global% Links
									(FUNCTION 
									  NC.AddGlobalLinksToCard)
									
						     "Add global links emanating from this card.")))
					      (Close% and% Save (FUNCTION CLOSEW)
								
					  "Close this note card after saving it in the NoteFile."
								(SUBITEMS
								  (Close% and% Save
								    (FUNCTION CLOSEW)
								    
					  "Close this note card after saving it in the NoteFile.")
								  (Close% w/o% Saving
								    (FUNCTION NC.QuitWithoutSaving)
								    
		      "Close this note card without saving any changes made since the last Save.")
								  (Save% in% NoteFile
								    (FUNCTION NC.CardSaveFn)
								    
				       "Save this card in the NoteFile but don't close the card.")
								  (Delete% Card
								    (FUNCTION NC.DeleteNoteCards)
								    
						"Permenantly delete this card from the NoteFile.")))))
					  CENTERFLG ← T
					  MENUFONT ←(FONTCREATE (QUOTE HELVETICA)
								10
								(QUOTE BOLD)))))
			    NC.GraphTitleBarMenu)
		     (Browser (OR (AND (BOUNDP (QUOTE NC.BrowserTitleBarMenu))
				       (type? MENU NC.BrowserTitleBarMenu))
				  (SETQ NC.BrowserTitleBarMenu
				    (create MENU
					    ITEMS ←(QUOTE
					      ((Edit% Property% List (FUNCTION NC.EditProperties)
								     
					"Brings up an editor for the property list of this card.")
						(Show% Links (FUNCTION NC.ShowPointers)
							     
					   "Brings up a list of the links to and from this card.")
						(Title/Sources/FileBoxes
						  (FUNCTION (LAMBDA (TextStream)
						      (NC.AssignTitle TextStream)
						      (NC.AssignSources TextStream)
						      (NC.AddParents TextStream)))
						  
		       "Do all of the operations necessary to file this note card in a file box."
						  (SUBITEMS (Assign% Title (FUNCTION NC.AssignTitle)
									   
						       "Assigns a (new) title to this note card.")
							    (Designate% Sources
							      (FUNCTION NC.AssignSources)
							      
				       "Designate the source(s) of the information in this card.")
							    (File% in% FileBoxes
							      (FUNCTION NC.AddParents)
							      
						 "File this note card in one or more file boxes.")
							    (Unfile% from% FileBoxes
							      (FUNCTION NC.UnfileNoteCard)
							      
					   "Remove this card from one or more of its file boxes.")
							    (Delete% Source (FUNCTION NC.DeleteSource)
									    
							"Delete one of the sources of this card.")))
						(Add% Global% Link
						  (FUNCTION NC.AddGlobalLinkToCard)
						  "Add a global link emanating from this card."
						  (SUBITEMS (Add% Global% Link
							      (FUNCTION NC.AddGlobalLinkToCard)
							      
						    "Add a global link emanating from this card.")
							    (Add% Global% Links
							      (FUNCTION NC.AddGlobalLinksToCard)
							      
						     "Add global links emanating from this card.")))
						(Close% and% Save
						  (FUNCTION CLOSEW)
						  
					  "Close this note card after saving it in the NoteFile."
						  (SUBITEMS (Close% and% Save (FUNCTION CLOSEW)
									      
					  "Close this note card after saving it in the NoteFile.")
							    (Close% w/o% Saving
							      (FUNCTION NC.QuitWithoutSaving)
							      
		      "Close this note card without saving any changes made since the last Save.")
							    (Save% in% NoteFile
							      (FUNCTION NC.CardSaveFn)
							      
				       "Save this card in the NoteFile but don't close the card.")
							    (Delete% Card (FUNCTION 
									    NC.DeleteNoteCards)
									  
						"Permenantly delete this card from the NoteFile.")))))
					    CENTERFLG ← T
					    MENUFONT ←(FONTCREATE (QUOTE HELVETICA)
								  10
								  (QUOTE BOLD)))))
			      NC.BrowserTitleBarMenu)
		     (Sketch (OR (AND (BOUNDP (QUOTE NC.SketchTitleBarMenu))
				      (type? MENU NC.SketchTitleBarMenu))
				 (SETQ NC.SketchTitleBarMenu
				   (create MENU
					   ITEMS ←(QUOTE
					     ((Edit% Property% List (FUNCTION NC.EditProperties)
								    
					"Brings up an editor for the property list of this card.")
					       (Show% Links (FUNCTION NC.ShowPointers)
							    
					   "Brings up a list of the links to and from this card.")
					       (Title/Sources/FileBoxes
						 (FUNCTION (LAMBDA (TextStream)
						     (NC.AssignTitle TextStream)
						     (NC.AssignSources TextStream)
						     (NC.AddParents TextStream)))
						 
		       "Do all of the operations necessary to file this note card in a file box."
						 (SUBITEMS (Assign% Title (FUNCTION NC.AssignTitle)
									  
						       "Assigns a (new) title to this note card.")
							   (Designate% Sources
							     (FUNCTION NC.AssignSources)
							     
				       "Designate the source(s) of the information in this card.")
							   (File% in% FileBoxes
							     (FUNCTION NC.AddParents)
							     
						 "File this note card in one or more file boxes.")
							   (Unfile% from% FileBoxes
							     (FUNCTION NC.UnfileNoteCard)
							     
					   "Remove this card from one or more of its file boxes.")
							   (Delete% Source (FUNCTION NC.DeleteSource)
									   
							"Delete one of the sources of this card.")))
					       (Insert% Link (FUNCTION NC.AddLinkToSketchCard)
							     
						 "Add a link to another card to this sketch/map."
							     (SUBITEMS (Insert% Link
									 (FUNCTION 
									   NC.AddLinkToSketchCard)
									 
						 "Add a link to another card to this sketch/map.")
								       (Add% Global% Link
									 (FUNCTION 
									   NC.AddGlobalLinkToCard)
									 
						    "Add a global link emanating from this card.")
								       (Add% Global% Links
									 (FUNCTION 
									  NC.AddGlobalLinksToCard)
									 
						     "Add global links emanating from this card.")))
					       (Close% and% Save
						 (FUNCTION CLOSEW)
						 
					  "Close this note card after saving it in the NoteFile."
						 (SUBITEMS (Close% and% Save (FUNCTION CLOSEW)
									     
					  "Close this note card after saving it in the NoteFile.")
							   (Close% w/o% Saving
							     (FUNCTION NC.QuitWithoutSaving)
							     
		      "Close this note card without saving any changes made since the last Save.")
							   (Save% in% NoteFile
							     (FUNCTION NC.CardSaveFn)
							     
				       "Save this card in the NoteFile but don't close the card.")
							   (Delete% Card (FUNCTION NC.DeleteNoteCards)
									 
						"Permenantly delete this card from the NoteFile.")))))
					   CENTERFLG ← T
					   MENUFONT ←(FONTCREATE (QUOTE HELVETICA)
								 10
								 (QUOTE BOLD)))))
			     NC.SketchTitleBarMenu)
		     NIL))
          (COND
	    ((EQ NoteCardType (QUOTE Browser))
	      (WINDOWPROP Window (QUOTE TitleBarMiddleButtonMenu)
			  (OR (AND (BOUNDP (QUOTE NC.BrowserTitleBarMiddleButtonMenu))
				   (type? MENU NC.BrowserTitleBarMiddleButtonMenu)
				   NC.BrowserTitleBarMiddleButtonMenu)
			      (SETQ NC.BrowserTitleBarMiddleButtonMenu
				(create MENU
					ITEMS ←(QUOTE ((Recompute% Browser (FUNCTION 
									     NC.UpdateBrowserCard)
									   
			     "Recomputes this browser to show the current state of the NoteFile.")
							(Relayout% Graph (FUNCTION 
									   NC.RelayoutBrowserCard)
									 
						    "Re-layout the browser, but keep same nodes.")
							(Reconnect% Nodes (FUNCTION 
									 NC.ConnectNodesInBrowser)
									  
	   "Draw all possible links, from currently selected link types, between pairs of nodes.")
							(Unconnect% Nodes (FUNCTION 
								       NC.UnconnectNodesInBrowser)
									  
							       "Undraw all links in the browser.")
							(Expand% Browser% Node
							  (FUNCTION NC.ExpandBrowserNode)
							  
					      "Expand the graph under one node to a given depth.")
							(Graph% Edit% Menu (FUNCTION 
									     NC.GetGraphEditMenu)
									   
								"Bring up the graph editor menu.")
							(Change% Browser% Specs
							  (FUNCTION NC.ChangeBrowserSpecs)
							  
		 "Make changes to some or all of the browser specs, e.g. link types, depth, etc.")))
					CENTERFLG ← T
					MENUFONT ←(FONTCREATE (QUOTE HELVETICA)
							      10
							      (QUOTE BOLD)))))))
	    ((EQ NoteCardType (QUOTE Graph))
	      (WINDOWPROP Window (QUOTE TitleBarMiddleButtonMenu)
			  (OR (AND (BOUNDP (QUOTE NC.GraphTitleBarMiddleButtonMenu))
				   (type? MENU NC.GraphTitleBarMiddleButtonMenu)
				   NC.GraphTitleBarMiddleButtonMenu)
			      (SETQ NC.GraphTitleBarMiddleButtonMenu
				(create MENU
					ITEMS ←(QUOTE ((Relayout% Graph (FUNCTION 
									  NC.RelayoutGraphCard)
									
						      "Re-layout the graph, but keep same nodes.")))
					CENTERFLG ← T
					MENUFONT ←(FONTCREATE (QUOTE HELVETICA)
							      10
							      (QUOTE BOLD)))))))))))

(NC.TitleBarButtonEventFn
  (LAMBDA (Window)                                           (* fgh: " 5-Oct-84 18:35")
                                                             (* if inside title region, bringup title menu, 
							     otherwise just call the oldbuttoneventfn)
    (PROG ((MiddleButtonMenu (WINDOWPROP Window (QUOTE TitleBarMiddleButtonMenu)))
	   LeftButtonMenu)
          (COND
	    ((OR (INSIDEP (DSPCLIPPINGREGION NIL Window)
			  (LASTMOUSEX Window)
			  (LASTMOUSEY Window))
		 (AND (NULL MiddleButtonMenu)
		      (LASTMOUSESTATE MIDDLE)))
	      (APPLY* (WINDOWPROP Window (QUOTE OLDBUTTONEVENTFN))
		      Window))
	    ((AND (LASTMOUSESTATE MIDDLE)
		  (type? MENU MiddleButtonMenu))
	      (APPLY* (OR (MENU MiddleButtonMenu)
			  (FUNCTION NILL))
		      Window))
	    (T (COND
		 ((SETQ LeftButtonMenu (WINDOWPROP Window (QUOTE TitleBarLeftButtonMenu)))
		   (APPLY* (OR (MENU LeftButtonMenu)
			       (FUNCTION NILL))
			   Window))))))))

(NC.ChooseCloseOrDelete
  (LAMBDA NIL                                                (* rht: " 7-Aug-85 13:08")

          (* * Asks the user whether a delete or close is desired an calls the appropriate function to do the work.)


    (PROG (Menu W Z (Font (FONTCREATE (QUOTE HELVETICA)
				      12
				      (QUOTE BOLD))))
          (SETQ Menu (OR (AND (BOUNDP (QUOTE NC.BrowseOrSearchMenu))
			      (type? MENU NC.BrowseOrSearchMenu)
			      NC.BrowseOrSearchMenu)
			 (SETQ NC.BrowseOrSearchMenu (create MENU
							     ITEMS ←(QUOTE ((Close% Cards
									       (QUOTE Close% Cards)
									       
									  "Close selected cards.")
									     (Delete% Cards
									       (QUOTE Delete% Cards)
									       
									 "Delete selected cards.")))
							     MENUFONT ← Font
							     ITEMHEIGHT ←(IPLUS 2
										(FONTPROP
										  Font
										  (QUOTE HEIGHT)))
							     TITLE ← "Which?"))))
          (SETQ W (MENUITEMREGION (CAR (NTH (fetch (MENU ITEMS) of NC.MainMenu)
					    1))
				  NC.MainMenu))
          (SETQ Z (WINDOWPROP (WFROMMENU NC.MainMenu)
			      (QUOTE REGION)))
          (replace MENUPOSITION of Menu with (CONS (IPLUS (fetch (REGION LEFT) of W)
							  (fetch (REGION LEFT) of Z))
						   (IPLUS (fetch (REGION TOP) of W)
							  (fetch (REGION BOTTOM) of Z)
							  (IMINUS (fetch (MENU IMAGEHEIGHT)
								     of Menu)))))
          (RETURN (SELECTQ (MENU Menu)
			   (Close% Cards (NC.CloseNoteCards))
			   (Delete% Cards (NC.DeleteNoteCards NIL T))
			   NIL)))))

(NC.ResetMainMenu
  (LAMBDA NIL                                                (* rht: "14-Jul-85 20:58")

          (* * Reset the Notecards main menu to indicate no open file.)


    (replace (MENU TITLE) of NC.MainMenu with "No Open NoteFile")
    (replace (MENU IMAGE) of NC.MainMenu with NIL)
    (WINDOWPROP (WFROMMENU NC.MainMenu)
		(QUOTE CLOSEFN)
		NIL)
    (NC.DisplayMainMenu)))
)
(* * Selection Mechanism)


(RPAQQ NC.SelectionInProgress NIL)
(DEFINEQ

(NC.SelectNoteCards
  (LAMBDA (SingleCardFlg SelectionPredicate Menu InstigatingIDorWindow ReturnLinksFlg Msg 
			 CheckForCancelFlg)                  (* rht: " 3-Oct-85 19:48")

          (* Select a set of note cards or a single note card, depending on SingleCardFlg. Works by interpreting all mouse 
	  presses until a card has been chosen (if SingleCardFlg is T) or until the Done button has been pressed 
	  (if SingleCardFlg is NIL). If the mouse press occus within a Title bar of a notecard, add that note card to the 
	  selected list. Otherwise, if you are pointing into a note card, call the BUTTONEVENTFN for that note card.
	  The Selection in Progress flag has been set, so all note card BUTTONEVENTFNs should know to ignore all presses 
	  except those that occur on link icons. Link icon presses should simply add the desination of that link to the 
	  selected note cards list.)



          (* * rht 8/1/84: Changed second RESETSAVE call to give NC.ClearMsg a NIL argument.)



          (* * rht 1/9/85: Fixed so now prints name of selected item even it's a link.)



          (* * rht 2/15/85: Now can backspace over last selection chosen. Added new arg Msg so that when we reprint the list, 
	  we can reprint the message as well.)



          (* * rht 3/23/85: Added the CheckForCancelFlg arg, which if non-nil causes Cancel to be handled differently then 
	  Done after no selections. Namely, Cancel will return the atom CANCELLED whereas Done with no selections returns NIL.
	  If CheckForCancelFlg is NIL then NIL is returned in both cases.)


    (PROG (Window WinRegion ID ButtonEventFn (OldLength 0)
		  InstigatingWindow MenuWindow SelectedCard LinkOrID TextObj)
          (OR SelectionPredicate (SETQ SelectionPredicate (FUNCTION TRUE)))
          (SETQ NC.SelectedCards)
          (COND
	    ((NC.IDP InstigatingIDorWindow)
	      (SETQ InstigatingWindow (NC.FetchWindow InstigatingIDorWindow)))
	    ((WINDOWP InstigatingIDorWindow)
	      (SETQ InstigatingWindow InstigatingIDorWindow))
	    (T (SETQ InstigatingWindow NIL)))
          (SETQ WinRegion (WINDOWREGION (OR InstigatingWindow (WFROMMENU NC.MainMenu))))
          (NC.PrintMsg InstigatingWindow T (COND
			 (Msg (CONCAT Msg (CHARACTER 13)))
			 (T ""))
		       "Items selected:  ")
          (RESETLST
	    (RESETSAVE NIL (BQUOTE (NC.ClearMsg , InstigatingWindow T)))
	    (RESETSAVE NC.SelectionInProgress (COND
			 (ReturnLinksFlg (QUOTE Links))
			 (T T)))
	    (RESETSAVE (ADDMENU Menu NIL (create POSITION
						 XCOORD ←(fetch (REGION LEFT) of WinRegion)
						 YCOORD ←(COND
						   (InstigatingWindow (fetch (REGION TOP)
									 of WinRegion))
						   (T (fetch (REGION BOTTOM) of WinRegion)))))
		       (LIST (QUOTE PROGN)
			     (LIST (QUOTE DETACHWINDOW)
				   (LIST (QUOTE WFROMMENU)
					 Menu))
			     (LIST (QUOTE DELETEMENU)
				   Menu T)))                 (* If there is an instigating window, make sure it and 
							     all its attachments are visible on the screen.)
	    (COND
	      (InstigatingWindow (ATTACHWINDOW (WFROMMENU Menu)
					       InstigatingWindow
					       (QUOTE TOP)
					       (QUOTE LEFT))
				 (NC.MoveWindowOntoScreen InstigatingWindow)))
	    (until (COND
		     (SingleCardFlg (OR NC.SelectedCards (NULL NC.SelectionInProgress)))
		     (T (NULL NC.SelectionInProgress)))
	       do (until (MOUSESTATE LEFT))
		  (SETQ Window (WHICHW LASTMOUSEX LASTMOUSEY))
		  (AND Window (SETQ ID (NC.IDFromWindow Window)))
		  (COND
		    (Window (SETQ ButtonEventFn (WINDOWPROP Window (QUOTE BUTTONEVENTFN)))
			    (COND
			      ((AND (NOT (INSIDEP (DSPCLIPPINGREGION NIL (WINDOWPROP Window
										     (QUOTE DSP)))
						  (LASTMOUSEX Window)
						  (LASTMOUSEY Window))))
				(AND ID (NOT (FMEMB ID NC.SelectedCards))
				     (SETQ NC.SelectedCards (CONS ID NC.SelectedCards))))
			      (T (COND
				   (ButtonEventFn (RESETLST
						    (COND
						      ((AND (EQ InstigatingWindow Window)
							    (SETQ TextObj (WINDOWPROP Window
										      (QUOTE TEXTOBJ))
							      ))
							(RESETSAVE (replace (TEXTOBJ EDITOPACTIVE)
								      of TextObj with NIL)
								   (LIST (FUNCTION (LAMBDA (TextObj
									       OldValue)
									     (replace (TEXTOBJ 
										     EDITOPACTIVE)
										of TextObj
										with OldValue)))
									 TextObj
									 (fetch (TEXTOBJ EDITOPACTIVE)
									    of TextObj)))))
						    (APPLY* ButtonEventFn Window))))))))
		  (COND
		    ((IGREATERP (LENGTH NC.SelectedCards)
				OldLength)
		      (COND
			((EQ (CAR NC.SelectedCards)
			     (QUOTE *Undo% Selection*))      (* Chop off two elements from the list -
							     the indicator and the previous item.)
			  (SETQ NC.SelectedCards (CDDR NC.SelectedCards))
			  (SETQ OldLength (LENGTH NC.SelectedCards))
			  (NC.ClearMsg InstigatingWindow NIL)
                                                             (* Reprint the titles of the selections.)
			  )
			((NULL (APPLY* SelectionPredicate (CAR NC.SelectedCards)))
                                                             (* Selection was not valid.)
			  (NC.PrintMsg InstigatingWindow T "*** Invalid selection. ***" (CHARACTER
					 13))
			  (SETQ NC.SelectedCards (CDR NC.SelectedCards)))
			(T                                   (* A valid selection.)
			   (SETQ OldLength (LENGTH NC.SelectedCards))
			   (NC.ClearMsg InstigatingWindow NIL)))
		      (NC.PrintMsg InstigatingWindow NIL (COND
				     (Msg (CONCAT Msg (CHARACTER 13)))
				     (T ""))
				   "Items selected:  ")
		      (for LinkOrID in (REVERSE NC.SelectedCards)
			 do (NC.PrintMsg InstigatingWindow NIL (NC.FetchTitle
					   (COND
					     ((type? NOTECARDLINK LinkOrID)
					       (fetch (NOTECARDLINK SOURCEID) of LinkOrID))
					     (T LinkOrID)))
					 ",  "))))
		  (until (MOUSESTATE UP))
		  (TOTOPW (WFROMMENU Menu)))                 (* Allow TEdit to finish any outstanding Selections 
							     caused by buttoning off of the Notecard link objects)
	    (BLOCK))
          (UNTILMOUSESTATE UP)
          (RETURN (PROG1 (COND
			   ((EQ NC.SelectedCards (QUOTE CANCELLED))
			     (COND
			       (CheckForCancelFlg (QUOTE CANCELLED))
			       (T NIL)))
			   (SingleCardFlg (CAR NC.SelectedCards))
			   (T (DREVERSE NC.SelectedCards)))
			 (SETQ NC.SelectedCards))))))
)
(* * Fix up Lisp)


(PUTPROPS LOGOUT READVICE (NIL (BEFORE NIL (NC.LogoutAdvice))))
(READVISE LOGOUT)
(* * Set the modification date)


(RPAQQ NC.SystemDate "22-Oct-85 15:58:52")
(PUTPROPS NCINTERFACE COPYRIGHT ("Xerox Corporation" 1984 1985))
(DECLARE: DONTCOPY
  (FILEMAP (NIL (4130 38944 (NC.MakeMainMenu 4140 . 12170) (NC.SetupScreen 12172 . 13213) (
NC.MainMenuWhenSelectedFn 13215 . 14927) (NC.CacheTitles 14929 . 16089) (NC.CacheTypesAndTitles 16091
 . 17480) (NC.CloseDatabaseFile 17482 . 20479) (NC.CompactDatabase 20481 . 21934) (
NC.DatabaseOperations 21936 . 25229) (NC.LogoutAdvice 25231 . 26026) (NC.DatabaseFileName 26028 . 
27183) (NC.DeleteDatabaseFile 27185 . 29569) (INSTALL 29571 . 32193) (NC.ForceDatabaseClose 32195 . 
32944) (NC.ListDatabaseFiles 32946 . 34201) (NC.MakeFloppies 34203 . 34903) (NC.MakeSysout 34905 . 
36673) (NC.AdjustCloseF 36675 . 37129) (NC.AdvisedCloseF 37131 . 37439) (NC.CloseNoteCards 37441 . 
38446) (NC.SetMainMenuTitle 38448 . 38942)) (38976 65074 (NC.AskLinkLabel 38986 . 43208) (
NC.AskNoteCardType 43210 . 45001) (NC.ChooseTopLevelCard 45003 . 46501) (NC.DisplayMainMenu 46503 . 
47559) (NC.RemoveSketchMenuItems 47561 . 48396) (NC.SelectionMenusWhenSelectedFn 48398 . 49144) (
NC.SetupTitleBarMenu 49146 . 61763) (NC.TitleBarButtonEventFn 61765 . 62862) (NC.ChooseCloseOrDelete 
62864 . 64621) (NC.ResetMainMenu 64623 . 65072)) (65147 72175 (NC.SelectNoteCards 65157 . 72173)))))
STOP