(FILECREATED "30-Oct-84 10:01:24" {PHYLUM}<BLUEBONNET>ORIGINAL>DESCRIBEJOB.;13 52172  

      changes to:  (FNS ResolveNewJobValue)

      previous date: " 3-Oct-84 15:03:23" {PHYLUM}<BLUEBONNET>ORIGINAL>DESCRIBEJOB.;10)


(* Copyright (c)  by NIL. All rights reserved.)

(PRETTYCOMPRINT DESCRIBEJOBCOMS)

(RPAQQ DESCRIBEJOBCOMS ((VARS (NumberOfCopiesTimer 0) (NumberOfOriginalsTimer 0)) (RECORDS * 
DESCRIBEJOBRECORDS) (FNS * DESCRIBEJOBFNS) (DECLARE: EVAL@COMPILE (P (LOADCOMP? (QUOTE LOADBLUEBONNET)
)))))

(RPAQQ NumberOfCopiesTimer 0)

(RPAQQ NumberOfOriginalsTimer 0)

(RPAQQ DESCRIBEJOBRECORDS (Derivation JobPanelField SelectableItem))
[DECLARE: EVAL@COMPILE 

(DATATYPE Derivation (resultField resultValue constraint givens))

(DATATYPE JobPanelField (queryItem valueItems internalUnionRegion selectedItem field visibleFlg) (
ACCESSFNS ((unionRegion (OR (fetch internalUnionRegion of DATUM) (replace internalUnionRegion of DATUM
 with (APPLY (QUOTE UNIONREGIONS) (CONS (fetch itemRegion of (fetch queryItem of DATUM)) (for i in (
fetch valueItems of DATUM) collect (fetch itemRegion of i)))))) (replace internalUnionRegion of DATUM 
with NEWVALUE)))))

(DATATYPE SelectableItem (itemRegion jobPanelField itemValue invertedFlg) jobPanelField ← (create 
JobPanelField))
]
(/DECLAREDATATYPE (QUOTE Derivation) (QUOTE (POINTER POINTER POINTER POINTER)))
(/DECLAREDATATYPE (QUOTE JobPanelField) (QUOTE (POINTER POINTER POINTER POINTER POINTER POINTER)))
(/DECLAREDATATYPE (QUOTE SelectableItem) (QUOTE (POINTER POINTER POINTER POINTER)))

(RPAQQ DESCRIBEJOBFNS (AddAssertion AddDerivation Advise1To2 Advise2To1WithMaster AdviseBdaWithMaster 
ApplyHelpUnits CommentOnJob CopyCopyJob CopyingTime CreateFieldItems DefineDefaultJob DeriveValue 
DeriveValuesForGenerators DerivedResult? DeselectItem EraseJobPanelField FindEnabledGenerators 
FlashQuery FlipItem FlipRegion GeneratorsTimeEstimate GetGeneratorParameters GiveUserQueryHelp 
HelpFromPanel InItem? InitiateDescriptionPanel JobFieldValue JobPanelButtonHandler JobPanelHelpHandler
 PrintAndBox PrintComment ProceedFromPanel RedisplayJobPanelField RedisplayMenu RedisplayMenuTitle 
RefreshPanel RelevantField? RemoveDerivationsOf RemoveValue ResolveNewJobValue SecondsToRoundedMinutes
 SelectItem SelectPlanGenerator SetJobField ShowTimeEstimate Subset? SupportsForDerivation 
TimeEstimateForJob TimeFor1To1 TimeFor1To2 TimeFor2To1WithMaster TimeForBdaNoMaster 
TimeForBdaWithMaster TimeForPlanners TimeForTooThick TimeToCollate TimeToReverseOriginals TimeToStaple
 UpdateJobField UpdateJobDescriptionPanel WhenNumberOfCopiesMenuSelected WhenOriginalsMenuSelected 
WhenPadMenuSelected))
(DEFINEQ

(AddAssertion
  [LAMBDA (job field value)                                  (* edited: "10-MAR-83 13:34")
                                                             (* Give field a new value in job.
							     If field had a value, then use RemoveValue to first 
							     remove it. Return the new value.)
    (if (JobFieldValue field job)
	~=value
	then (\TraceIt BluebonnetTrace "Assertion: " field " ← " value)
	     (RemoveValue field job)
	     (SetJobField job field value)
      else (RemoveDerivationsOf field job))
    value])

(AddDerivation
  [LAMBDA (derivation job)                                   (* JG "25-Sep-84 17:08")

          (* Assign the result value to the result field as specified by the derivation and add the derivation to job.
	  Use RemoveValue to remove any existing value for the result field. Return derivation.)


    (if (JobFieldValue derivation:resultField job)
	~=derivation:resultValue
	then (\TraceIt BluebonnetTrace "Derivation: " derivation:resultField " ← " 
		       derivation:resultValue))
    (RemoveValue derivation:resultField job)
    (if derivation:resultValue
	then (SetJobField job derivation:resultField derivation:resultValue)
	     job:derivations← <derivation ! job:derivations> derivation])

(Advise1To2
  [LAMBDA (job)                                              (* edited: " 1-FEB-83 11:52")
                                                             (* Provide an advise comment to the user about doing 1 
							     to 2 sided copying.)
    T])

(Advise2To1WithMaster
  [LAMBDA NIL                                                (* edited: "11-MAR-83 13:52")
    NIL])

(AdviseBdaWithMaster
  [LAMBDA (job)                                              (* edited: " 7-FEB-83 13:49")
                                                             (* Provide an advise comment to the user about using the
							     BDA to make a master.)
    (PROG (difference minutes hours subJobTime (collate? (AND job:Collate=(QUOTE Yes)
							      job:NumberOfCopies 
							      job:NumberOfCopies~=1))
		      (staple? (AND job:Staple=(QUOTE Yes)
				    job:CopiesTooThickToStaple=(QUOTE No)))
		      (twoSidedCopies? (job:TwoSidedCopies=(QUOTE Yes)))
		      (subJob (CopyCopyJob job)))
          (subJob:Collate←(QUOTE No))
          (subJob:Staple←(QUOTE No))
          (subJob:TwoSidedCopies←(QUOTE No))
          (subJobTime←(TimeForBdaNoMaster subJob)+(TimeToCollate job)+(TimeToStaple job))
          (difference←job:timeEstimate-subJobTime)
          (if difference gt 120 or (FQUOTIENT difference job:timeEstimate) gt .2
	      then subJobTime←(SecondsToRoundedMinutes subJobTime)
		   hours←subJobTime/60
		   minutes←(IREMAINDER subJobTime 60)
		   (PrintComment [BQUOTE (You could save yourself ,@ [COND
						((IGREATERP difference 120)
						  (BQUOTE (about , (SecondsToRoundedMinutes 
										       difference)
								 minutes)))
						(T (QUOTE (some time]
					      by ,@ [COND
						(twoSidedCopies?
						  (BQUOTE (making one-sided ,@
								  (COND
								    ((OR collate? staple?)
								      (QUOTE (copies, and)))
								    (T (QUOTE (copies.]
					      ,@
					      [COND
						(staple? (QUOTE (stapling]
					      ,@
					      [COND
						(collate? (BQUOTE (,@ [COND
									(staple? (QUOTE (and]
								      collating]
					      ,@
					      (COND
						((OR collate? staple?)
						  (QUOTE (the copies yourself.]
				 T])

(ApplyHelpUnits
  [LAMBDA (job)                                              (* edited: " 1-FEB-83 10:37")
                                                             (* Test each help unit for applicability and apply those
							     whose wff is true.)
    (for unit in HelpUnits when (EvalWff unit:HelpUnit.wff job)
       do (PrintComment unit:HelpUnit.text)
	  (for ch on unit:HelpUnit.changes
	     do (FlashQuery job ch:1:1)
		(if ch::1
		    then (AddAssertion job ch:1:1 ch:1::1)
			 (push job:relevantFields ch:1:1)
		  else (ResolveNewJobValue job ch:1:1 ch:1::1)))
	  (RETURN])

(CommentOnJob
  [LAMBDA (job)                                              (* edited: "14-JAN-83 14:55")
                                                             (* Display in the comment window the messages of any 
							     comment wff that is true.)
    (CLEARW CommentWindow)
    (for w in CommentWffs when (EvalWff w:Constraint.wff job) do (PrintComment w:Constraint.text T])

(CopyCopyJob
  [LAMBDA (job)                                              (* edited: " 4-FEB-83 13:28")
                                                             (* Make a copy of a copy job.
							     Do not copy any of the field values.)
    (PROG ((newJob (create CopyJob)))
          (for f in (RECORDFIELDNAMES (QUOTE CopyJob)) do (RECORDACCESS f newJob CopyJobRecord
									(QUOTE replace)
									(JobFieldValue f job)))
          (RETURN newJob])

(CopyingTime
  [LAMBDA (job)                                              (* edited: " 2-FEB-83 13:50")
                                                             (* Estimate the copying time in seconds for this job.)
    job:NumberOfCopies*job:#OfOriginalSheets*.86])

(CreateFieldItems
  [LAMBDA (field job window indentation)                     (* edited: " 2-FEB-83 10:50")
                                                             (* Create the items for copy job field for job in 
							     window. Return the list of items.)
    (PROG (vItem qItem jpf)
          (TERPRI window)
          (TERPRI window)
          (qItem←(create SelectableItem
			 itemRegion ←(PrintAndBox (GETP field (QUOTE query))
						  window indentation)))
          (jpf←qItem:jobPanelField)
          (WINDOWPROP window field jpf)
          (jpf:queryItem←qItem)
          (jpf:JobPanelField.field←field)
          (jpf:valueItems←(for v in (GETP field (QUOTE valueRange))
			     collect (SPACES 4 window)
				     (vItem←(create SelectableItem
						    itemRegion ←(PrintAndBox v window)
						    jobPanelField ← jpf
						    itemValue ← v))
				     (if v=(RECORDACCESS field job (RECLOOK (QUOTE CopyJob)))
					 then (SelectItem vItem window))
				     vItem))
          (jpf:visibleFlg←T)
          (if ~(RelevantField? field job)
	      then (EraseJobPanelField jpf window))
          (RETURN (COPY jpf:valueItems])

(DefineDefaultJob
  [LAMBDA (job)                                              (* edited: "31-JAN-83 13:37")
                                                             (* Assert the values that define a default copy job.
							     If job is NIL, then create a copy job.
							     Return the job.)
    (if job
	then (job:relevantFields←NIL)
      else job←(create CopyJob))
    job:relevantFields←(for spec in (QUOTE (#OfOriginalSheets CopiesOnStandardPaper CopyBrightness 
							      NumberOfCopies OriginalsBound 
							      OriginalsOnStandardPaper 
							      OriginalsStandardSize Staple 
							      TwoSidedCopies TwoSidedOriginals))
			  collect (AddAssertion job spec (GETPROP spec (QUOTE defaultValue)))
				  spec)
    (ResolveNewJobValue job (QUOTE Reduction)
			(GETPROP (QUOTE Reduction)
				 (QUOTE defaultValue)))
    job])

(DeriveValue
  [LAMBDA (field job fieldsBeingDerived)                     (* JG "25-Sep-84 16:20")

          (* Use field%'s derivers to derive a value for field in job. If successful, return the support list for the 
	  derivation. If not, return the shortest support list for all of the deriver evaluations. Assume field is unvalued in
	  job. fieldsBeingDerived is a list of fields that DeriveValue is being used to derive. It acts as a goal stack for 
	  recursive calls to DeriveValue and is used to prevent looping.)


    (PROG (val support unprocessedDerivers)
          (for deriver in (GETPROP field 'derivers)
	     do (if (for f in (fetch otherFields of deriver) always (JobFieldValue f job))
		    then (SETQ val (EvalCompactOr (fetch compactOr of deriver)
						  job T))
			 (if (CAR val)
			     then (push support (CDR val))
			   else (AddDerivation (create Derivation
						       resultField ← field
						       resultValue ← (EvalWff (fetch value
										 of deriver)
									      job)
						       constraint ← (fetch (Deriver constraint)
								       of deriver)
						       givens ← (fetch otherFields of deriver))
					       job)
				(RETFROM 'DeriveValue (SupportsForDerivation field job)))
		  else (push unprocessedDerivers deriver)))
          (RETURN (for deriver in unprocessedDerivers bind (newGoalStack ←
									 < field ! fieldsBeingDerived 
									   >)
		     do (for f in deriver:otherFields unless (JobFieldValue f job)
							       or f MEMB fieldsBeingDerived
			   do (DeriveValue f job newGoalStack))
			(val← (EvalCompactOr deriver:compactOr job T))
			(if val:1
			    then (push support val::1)
			  elseif (for f in deriver:otherFields always (JobFieldValue f job))
			    then (AddDerivation (create Derivation
							resultField ← field
							resultValue ← (EvalWff deriver:value job)
							constraint ← deriver:Deriver.constraint
							givens ← deriver:otherFields)
						job)
				 (RETURN (SupportsForDerivation field job)))
		     finally (RETURN (ShortestSupport (CombineSupports
							(for struc in support
							   collect (for sList in struc
								      collect (for s in sList
										 join (
SupportsForDerivation s job) or <s>])

(DeriveValuesForGenerators
  [LAMBDA (job)                                              (* edited: " 4-FEB-83 15:08")

          (* Determine the enabled generators for this job and use the derivation constraints to determine values for 
	  unvalued fields relevant to the generator determination. If the constraints do not provide a value for a field 
	  assign its previous value or if none its default value. Return a dotted pair, the first element of which is a list
	  of enabled generators, and the second element is a list of relevant fields.)


    (PROG (gens unprocessedFields newValue? newSupportValue? relevantFields supports)
          [repeatwhile newValue?
	     do (newValue?←relevantFields←NIL)
		(gens←(FindEnabledGenerators job))
		(unprocessedFields←gens::1)
		(for f in unprocessedFields
		   do (if (JobFieldValue f job)
			  then (pushlist relevantFields (SupportsForDerivation f job))
			else (repeatwhile newSupportValue?
				do (newSupportValue?←NIL)
				   (supports←(DeriveValue f job))
				   (if (JobFieldValue f job)
				       then newValue?←(pushlist relevantFields supports)
				     else (for s in supports unless (JobFieldValue s job)
					     do newSupportValue?←([AddAssertion
						   job s (OR (LISTGET job:removedAssertions s)
							     (GETPROP s (QUOTE defaultValue]
						   or newSupportValue?))
					  (if ~newSupportValue?
					      then (push relevantFields f)
						   (if [AddAssertion job f
								     (OR (LISTGET 
									    job:removedAssertions f)
									 (GETPROP f (QUOTE 
										     defaultValue]
						       then newValue?←T
						     else (pushlist relevantFields supports]
          [for f in (for g in gens:1 join (GetGeneratorParameters g job))
	     do (if (JobFieldValue f job)
		    then (pushlist relevantFields (SupportsForDerivation f job))
		  else (repeatwhile newSupportValue?
			  do (newSupportValue?←NIL)
			     (supports←(DeriveValue f job))
			     (if (JobFieldValue f job)
				 then (pushlist relevantFields supports)
			       else (for s in supports unless (JobFieldValue s job)
				       do newSupportValue?←([AddAssertion job s
									  (OR (LISTGET 
									    job:removedAssertions s)
									      (GETPROP s
										       (QUOTE 
										     defaultValue]
					     or newSupportValue?))
				    (if ~newSupportValue?
					then (push relevantFields f)
					     (if ~[AddAssertion job f (OR (LISTGET 
									    job:removedAssertions f)
									  (GETPROP f (QUOTE 
										     defaultValue]
						 then (pushlist relevantFields supports]
          (RETURN <gens:1 ! relevantFields>])

(DerivedResult?
  [LAMBDA (field job)                                        (* ref: " 9-JUN-82 10:48")
                                                             (* Determine whether field is a result field of any 
							     derivations in job. Return the list of derivations.)
    (for d in job:derivations when d:resultField=field collect d])

(DeselectItem
  [LAMBDA (item window)                                      (* ref: "26-MAY-82 15:57")
                                                             (* deselects item from window)
    (if item and item:jobPanelField:selectedItem=item
	then (FlipItem item window)
	     item:jobPanelField:selectedItem←NIL])

(EraseJobPanelField
  [LAMBDA (jpField window)                                   (* ref: " 1-JUN-82 15:44")
                                                             (* White out the regions of the given job panel field in
							     window.)
    (if jpField and jpField:visibleFlg
	then (DSPFILL jpField:unionRegion WHITESHADE 'REPLACE window)
	     jpField:visibleFlg←NIL
	     jpField:selectedItem←NIL])

(FindEnabledGenerators
  [LAMBDA (job)                                              (* edited: " 2-FEB-83 11:37")

          (* Return a dotted pair the first element of which is a list of plan generators whose enabling conditions are 
	  satisfied by job, the second of which is a list of fields that support the evaluation of the enabling conditions.)


    (PROG (support generators val)
          (for gen in PlanGenerators
	     do (val←(EvalWff gen:enablingCondition job T))
		(if val:1
		    then (push generators gen))
		(push support val::1))
          (RETURN <generators !(ShortestSupport (CombineSupports support))
		    >])

(FlashQuery
  [LAMBDA (job field)                                        (* JG "28-Jan-84 23:26")
                                                             (* Flash the field%'s query on the job description 
							     panel.)
    (for i to 5 bind ((panel ← (fetch descriptionPanel of job))
		      item)
       first (SETQ item (fetch queryItem of (WINDOWPROP panel field)))
       do (FlipItem item panel)
	  (DISMISS 250])

(FlipItem
  [LAMBDA (item ds)                                          (* ref: "30-AUG-82 17:59")
                                                             (* flips the region of an item)
    (FlipRegion item:itemRegion ds)
    item:invertedFlg←~(item : invertedFlg])

(FlipRegion
  [LAMBDA (reg ds)                                           (* ref: "16-JUN-82 14:20")
                                                             (* flips a region.)
    (BITBLT NIL NIL NIL ds reg:LEFT reg:BOTTOM reg:WIDTH reg:HEIGHT 'TEXTURE 'INVERT BLACKSHADE])

(GeneratorsTimeEstimate
  [LAMBDA (gen job)                                          (* edited: "13-MAR-83 22:52")
                                                             (* Use the plan generator's time estimator to determine 
							     a time estimate for doing the job.)
    (if gen:timeEstimator
	then (APPLY* gen:timeEstimator job)
      else 0])

(GetGeneratorParameters
  [LAMBDA (gen job)                (* edited: " 4-FEB-83 07:49")
                                   (* Return a list of copy job fields that this plan generator uses to construct 
				   its plan.)
    (OR (LISTP gen:parameters)
	(APPLY* gen:parameters job])

(GiveUserQueryHelp
  [LAMBDA (job field queryItem)                              (* edited: "28-JAN-83 15:52")
                                                             (* Print a help message for the given field in the 
							     comment window.)
    (PrintComment (OR (GETPROP field (QUOTE helpMessage))
		      DefaultQueryHelpMessage))
    (WINDOWPROP job:descriptionPanel (QUOTE BUTTONEVENTFN)
		(QUOTE JobPanelButtonHandler])

(HelpFromPanel
  [LAMBDA (panel)                                            (* edited: "28-JAN-83 15:37")
                                                             (* Help function for the job description panel.)
    (PrintComment (QUOTE (Select the question you would like help with.)))
    (WINDOWPROP panel (QUOTE BUTTONEVENTFN)
		(QUOTE JobPanelHelpHandler])

(InItem?
  [LAMBDA (items pos)                                        (* ref: "20-MAY-82 12:34")
    (PROG ((XPOS (pos:XCOORD))
	   (YPOS (pos:YCOORD)))
          (RETURN (for ITEM in items when ITEM:itemRegion and (INSIDE? ITEM:itemRegion XPOS YPOS)
		     do (RETURN ITEM])

(InitiateDescriptionPanel
  [LAMBDA (copyJob)                                          (* JG "28-Jan-84 20:59")
                                                             (* Create a job description panel and comment window for
							     copyJob. Return the description panel.)
    (PROG [originalsItem yPos numberItem padMenu originalsMenu font jpField
			 (w (CREATEW (create REGION
					     LEFT ← 10
					     BOTTOM ← 0
					     WIDTH ← 700
					     HEIGHT ← 808]
          (WINDOWPROP w 'RIGHTBUTTONFN (FUNCTION [LAMBDA NIL NIL]))
          (DSPFONT TimesRomanD24 w)                          (* *JG DSPFONT moved before MOVETOUPPERLEFT)
          (MOVETOUPPERLEFT w)
          (printout w "Describe the document to be copied:")
          (DSPFONT Gacha12Bold w)
          (WINDOWPROP w 'SelectableItems (for f in OriginalsFields join (CreateFieldItems f copyJob w 
											  5)))
          (printout w T T)
          (font← (DSPFONT Gacha12Bold WindowTitleDisplayStream))
          (yPos← (DSPYPOSITION NIL w))
          (originalsMenu← (create MENU
				  MENUFONT ← Gacha12Bold
				  ITEMS ←
				  '(1 2 3 4 5 6 7 8 9 "" 0 Clear)
				  CENTERFLG ← T
				  MENUCOLUMNS ← 3
				  ITEMHEIGHT ← 25
				  ITEMWIDTH ← 40
				  TITLE ← (GETPROP '#OfOriginalSheets 'defaultValue)
				  WHENSELECTEDFN ← 'WhenOriginalsMenuSelected))
          (WINDOWPROP w '#OfOriginalSheetsMenu originalsMenu)
          (RELMOVETO 0 (- (originalsMenu:IMAGEHEIGHT/2))
		     w)
          (originalsItem← (create SelectableItem
				  itemRegion ← (PrintAndBox (GETPROP '#OfOriginalSheets 'query)
							    w 5)))
          (originalsItem:jobPanelField:JobPanelField.field← '#OfOriginalSheets)
          (originalsItem:jobPanelField:queryItem←originalsItem)
          (originalsItem:jobPanelField:visibleFlg←T)
          (WINDOWPROP w '#OfOriginalSheets originalsItem:jobPanelField)
          (originalsMenu:MENUPOSITION← (create POSITION
					       XCOORD ← (
				  originalsItem:itemRegion:LEFT+originalsItem:itemRegion:WIDTH+10)
					       YCOORD ← (yPos-originalsMenu:IMAGEHEIGHT)))
          (ADDMENU originalsMenu w)
          (MOVETO 0 originalsMenu:MENUGRID:REGION.BOTTOM-5 w)
          (DSPFONT TimesRomanD24 w)
          (printout w T "Describe the desired copies:")
          (DSPFONT Gacha12Bold w)
          (printout w T)
          (yPos← (DSPYPOSITION NIL w))
          (padMenu← (create MENU
			    MENUFONT ← Gacha12Bold
			    ITEMS ←
			    '(1 2 3 4 5 6 7 8 9 "" 0 Clear)
			    CENTERFLG ← T
			    MENUCOLUMNS ← 3
			    ITEMHEIGHT ← 25
			    ITEMWIDTH ← 40
			    TITLE ← (GETPROP 'NumberOfCopies 'defaultValue)
			    WHENSELECTEDFN ← 'WhenNumberOfCopiesMenuSelected))
          (WINDOWPROP w 'NumberOfCopiesMenu padMenu)
          (RELMOVETO 0 (- (padMenu:IMAGEHEIGHT/2))
		     w)
          (numberItem← (create SelectableItem
			       itemRegion ← (PrintAndBox (GETPROP 'NumberOfCopies 'query)
							 w 5)))
          (numberItem:jobPanelField:JobPanelField.field← 'NumberOfCopies)
          (numberItem:jobPanelField:queryItem←numberItem)
          (numberItem:jobPanelField:visibleFlg←T)
          (WINDOWPROP w 'NumberOfCopies numberItem:jobPanelField)
          (padMenu:MENUPOSITION← (create POSITION
					 XCOORD ← (
					numberItem:itemRegion:LEFT+numberItem:itemRegion:WIDTH+10)
					 YCOORD ← (yPos-padMenu:IMAGEHEIGHT)))
          (ADDMENU padMenu w)
          (DSPFONT font WindowTitleDisplayStream)
          (MOVETO 0 padMenu:MENUGRID:REGION.BOTTOM-5 w)
          (WINDOWPROP w 'SelectableItems < ! (WINDOWPROP w 'SelectableItems)
					   ! (for f in CopiesFields
						join (CreateFieldItems f copyJob w 5))
					   >)
          (printout w .SKIP 4)
          (ADDMENU [create MENU
			   MENUFONT ← Gacha12Bold
			   ITEMS ← '("" % HELP%  "")
			   WHENSELECTEDFN ← (FUNCTION (LAMBDA (item menu)
			       (HelpFromPanel (WFROMMENU menu]
		   w
		   (create POSITION
			   XCOORD ← 400
			   YCOORD ← (DSPYPOSITION NIL w)))
          (ADDMENU [create MENU
			   MENUFONT ← Gacha12Bold
			   ITEMS ← '("" PROCEED "")
			   WHENSELECTEDFN ← (FUNCTION (LAMBDA (item menu)
			       (ProceedFromPanel (WFROMMENU menu]
		   w
		   (create POSITION
			   XCOORD ← 160
			   YCOORD ← (DSPYPOSITION NIL w)))
          (WINDOWPROP w 'BUTTONEVENTFN (FUNCTION JobPanelButtonHandler))
          (WINDOWPROP w 'SelectableQueryItems (for f in CopyJobFields when jpField← (WINDOWPROP
									     w f)
						 collect jpField:queryItem))
          (RETURN w])

(JobFieldValue
  [LAMBDA (field job)                                        (* edited: " 7-FEB-83 12:40")
                                                             (* Fetch the value of field in job.)
    (SELECTQ field
	     (#OfCopySheets job:#OfCopySheets)
	     (#OfOriginalSheets job:#OfOriginalSheets)
	     (Collate job:Collate)
	     (CopiesOnStandardPaper job:CopiesOnStandardPaper)
	     (CopiesTooThickToStaple job:CopiesTooThickToStaple)
	     (CopyBrightness job:CopyBrightness)
	     (InputProcessor job:InputProcessor)
	     (NumberOfCopies job:NumberOfCopies)
	     (OriginalTooThick job:OriginalTooThick)
	     (OriginalsBound job:OriginalsBound)
	     (OriginalsOnStandardPaper job:OriginalsOnStandardPaper)
	     (OriginalsPaperTooFragileOrThick job:OriginalsPaperTooFragileOrThick)
	     (OriginalsStandardSize job:OriginalsStandardSize)
	     (OriginalsTooLarge job:OriginalsTooLarge)
	     (OriginalsTooSmall job:OriginalsTooSmall)
	     (Reduction job:CopyJob.Reduction)
	     (Staple job:Staple)
	     (TwoSidedCopies job:TwoSidedCopies)
	     (TwoSidedOriginals job:TwoSidedOriginals)
	     (Unbindable job:Unbindable)
	     (RECORDACCESS field job CopyJobRecord])

(JobPanelButtonHandler
  [LAMBDA (window)                                           (* edited: " 6-FEB-83 20:05")
                                                             (* selects a SelectableItem from the window.
							     If there is an item selected already, it is deselected.)
    (PROG [now previous oldValue cursor (SelectableItems (WINDOWPROP window (QUOTE SelectableItems)))
	       (reg (WINDOWPROP window (QUOTE REGION]
          (while (LASTMOUSESTATE (OR LEFT MIDDLE)) and (INSIDE? reg LASTMOUSEX LASTMOUSEY)
	     do (TOTOPW window)
		(MENUBUTTONFN window)
		(now←(InItem? SelectableItems (CURSORPOSITION NIL window)))
		(if now and ~previous
		    then previous←now:jobPanelField:selectedItem)
		(if previous and previous~=now
		    then (DeselectItem previous window)
			 oldValue←(JobFieldValue previous:jobPanelField:JobPanelField.field
						 (WINDOWPROP window (QUOTE CopyJob)))
			 (if oldValue and (~now or now:jobPanelField~=previous:jobPanelField)
			     then (SelectItem (for i in previous:jobPanelField:valueItems
						 thereis i:itemValue=oldValue)
					      window)))
		(if now and now~=previous
		    then (SelectItem now window))
		(previous←now)
		(GETMOUSESTATE))
          (if now
	      then cursor←(CURSOR WAITINGCURSOR)
		   (UpdateJobField (WINDOWPROP window (QUOTE CopyJob))
				   now:jobPanelField:JobPanelField.field now:itemValue)
		   (CURSOR cursor))
          (RETURN])

(JobPanelHelpHandler
  [LAMBDA (window)                                           (* edited: " 6-FEB-83 20:10")
                                                             (* selects a SelectableItem from the window.
							     If there is an item selected already, it is deselected.)
    (PROG [now previous oldValue (SelectableItems (WINDOWPROP window (QUOTE SelectableQueryItems)))
	       (reg (WINDOWPROP window (QUOTE REGION)))
	       (relevantFields (fetch relevantFields of (WINDOWPROP window (QUOTE CopyJob]
          (while (LASTMOUSESTATE (OR LEFT MIDDLE)) and (INSIDE? reg LASTMOUSEX LASTMOUSEY)
	     do (TOTOPW window)
		(now←(InItem? SelectableItems (CURSORPOSITION NIL window)))
		(now←(if now and now:jobPanelField:JobPanelField.field MEMB relevantFields
			 then now))
		(if previous and previous~=now
		    then (FlipItem previous window))
		(if now and now~=previous and ~(now : invertedFlg)
		    then (FlipItem now window))
		(previous←now)
		(GETMOUSESTATE))
          (if now
	      then (GiveUserQueryHelp (WINDOWPROP window (QUOTE CopyJob))
				      now:jobPanelField:JobPanelField.field now))
          (RETURN])

(PrintAndBox
  [LAMBDA (exp window indentation)                           (* edited: "20-SEP-83 22:18")
                                                             (* Indents indentation spaces, prints exp on window, and
							     returns the box taken by the characters.)
    (PROG (left dsfont)
          (SPACES (OR indentation 0)
		  window)
          (left←(DSPXPOSITION NIL window))
          (DSPRIGHTMARGIN 50000 window)                      (* so that it won't auto carrage return.
							     This should be resetsaved.)
          (PRIN1 exp window)
          (dsfont←(DSPFONT NIL window))
          (RETURN (create REGION
			  LEFT ← left
			  BOTTOM ←(IDIFFERENCE (DSPYPOSITION NIL window)
					       (FONTPROP dsfont (QUOTE DESCENT)))
			  HEIGHT ←(FONTPROP dsfont (QUOTE HEIGHT))
			  WIDTH ←((DSPXPOSITION NIL window)
			   -left])

(PrintComment
  [LAMBDA (text dontClearFlg)                                (* edited: "14-JAN-83 13:35")

          (* Print the text in the comment window. Clear the window first when dontClearFlg is NIL. text can be text for a 
	  paragraph or a paragraph.)


    (if ~dontClearFlg
	then (CLEARW CommentWindow))
    (PrintParagraph CommentWindow (if (type? Paragraph text)
				      then text
				    else (create Paragraph
						 text ← text])

(ProceedFromPanel
  [LAMBDA (panel)                                            (* JG "17-Sep-84 17:31")
                                                             (* Respond to the user pushing the "PROCEED" button on 
							     the job description panel.)
    (PROG [planGenerator unvaluedFields plan (job (WINDOWPROP panel 'CopyJob]
          (SETQ unvaluedFields (for f in (fetch relevantFields of job) unless (JobFieldValue f job)
				  collect f))
          (RETURN (COND
		    [unvaluedFields (PrintComment '(Answer the indicated questions.))
				    (for f in unvaluedFields do (AND (WINDOWPROP panel f)
                                                             (* *JG Skip fields like InputProcessor which do not have
							     a JobPanelField)
								     (FlashQuery job f]
		    (T [SETQ planGenerator (OR (fetch planGenerator of job)
					       (ResolveNewJobValue job 'NumberOfCopies
								   (fetch (CopyJob NumberOfCopies)
								      of job]
		       (COND
			 [(AND planGenerator (fetch generator of planGenerator))
			   (\TraceIt BluebonnetTrace "Create Procedure for Job.")
			   (SETQ plan (APPLY* (fetch generator of planGenerator)
					      job))
			   (COND
			     ((type? Plan plan)
			       (\TraceIt BluebonnetTrace "Perform the procedure.")
			       (replace (CopyJob plan) of job with plan)
			       (CLOSEW (fetch descriptionPanel of CopyJob))
			       (CLOSEW CommentWindow)
			       (SPAWN.MOUSE)
			       (DoPlan plan job)
			       (CLOSEW UserInstructionWindow)
			       (CLOSEW StatusWindow)
			       (AND Simulate8200 (WINDOWP SimulationStatusWindow)
				    (CLOSEW SimulationStatusWindow))
                                                             (* HelpWindow is NIL if the Help System is not 
							     loaded...)
			       (COND
				 (HelpWindow (CLOSEW HelpWindow)))
			       (COND
				 (HelpWindow (DELETEMENU (WINDOWPROP HelpWindow 'HelpMenu)
							 T)))
			       (DELETEMENU (CAR (WINDOWPROP Simulate8200Menu 'MENU))
					   T)
			       (StartBluebonnet)
			       (CARET T]
			 (T (PrintComment '(Bluebonnet does not have a procedure for doing the job 
						       you described. Please check the job 
						       description
							 and try again.))
			    (if in.Trillium (StartBluebonnet])

(RedisplayJobPanelField
  [LAMBDA (jpField window)                                   (* edited: " 2-FEB-83 10:55")
                                                             (* Redisplay in window the query and values for the 
							     given job panel field.)
    (if jpField and [~(jpField : visibleFlg) or jpField:queryItem:invertedFlg
			or ~(jpField : selectedItem) and (JobFieldValue jpField:JobPanelField.field
									(WINDOWPROP window
										    (QUOTE CopyJob]
	then (PROG [[fieldValue (JobFieldValue jpField:JobPanelField.field (WINDOWPROP window
										       (QUOTE CopyJob]
		    (region (jpField:queryItem:itemRegion))
		    (fontDescent (FONTPROP (DSPFONT NIL window)
					   (QUOTE DESCENT]
	           (MOVETO region:LEFT region:BOTTOM+fontDescent window)
	           (printout window (GETPROP jpField:JobPanelField.field (QUOTE query)))
	           (jpField:queryItem:invertedFlg←NIL)
	           (jpField:selectedItem←NIL)
	           (for item in jpField:valueItems
		      do (region←item:itemRegion)
			 (MOVETO region:LEFT region:BOTTOM+fontDescent window)
			 (printout window item:itemValue)
			 (if item:itemValue=fieldValue
			     then (SelectItem item window)))
	           (jpField:visibleFlg←T])

(RedisplayMenu
  [LAMBDA (menu window)                                      (* ref: " 1-JUN-82 14:23")
                                                             (* Redisplay menu in window.)
    (PROG ((x (menu:MENU.MENUGRID:REGION.LEFT))
	   (y (menu:MENU.MENUGRID:REGION.BOTTOM)))
          (UPDATE/MENU/IMAGE menu)
          (menu:MENUGRID:REGION.LEFT←x)
          (menu:MENUGRID:REGION.BOTTOM←y)
          (BLTMENUIMAGE menu (WINDOWPROP window 'DSP])

(RedisplayMenuTitle
  [LAMBDA (menu title font)                                  (* edited: " 1-FEB-83 13:02")
                                                             (* Redisplay the menu with the new title in the given 
							     font. Return title.)
    (PROG ((oldFont (DSPFONT font WindowTitleDisplayStream)))
          (menu:MENU.TITLE←title)
          (RedisplayMenu menu (WFROMMENU menu))
          (DSPFONT oldFont WindowTitleDisplayStream)
          (RETURN title])

(RefreshPanel
  [LAMBDA NIL                                                (* ref: "10-JUN-82 14:32")
                                                             (* Redisplay the relevant queries for CopyJob's 
							     description panel.)
    (UpdateJobDescriptionPanel CopyJob:descriptionPanel T])

(RelevantField?
  [LAMBDA (field job)                                        (* JG "20-Sep-84 17:18")
    (FMEMB field (fetch relevantFields of job])

(RemoveDerivationsOf
  [LAMBDA (field job)                                        (* ref: " 9-JUN-82 10:51")
                                                             (* Remove all derivations from job that have field as 
							     their result field. Return the new list of derivations.)
    job:derivations←(for d in job:derivations unless d:resultField=field collect d])

(RemoveValue
  [LAMBDA (field job)                                        (* edited: " 4-FEB-83 13:26")
                                                             (* Remove the current value of field from job.
							     Also, remove any values derived using the removed value.
							     Return the removed value.)
    (PROG ((value (JobFieldValue field job)))
          (if value
	      then (SetJobField job field)
		   (RemoveDerivationsOf field job)
		   (for d in (for d1 in job:derivations when field MEMB d1:givens collect d1)
		      do (RemoveValue d:resultField job)))
          (RETURN value])

(ResolveNewJobValue
(LAMBDA (job field value) (* JG "13-Oct-84 23:17") (* A new value has been assigned to a field of a 
copy job via the job description panel. Make values of all fields that were relevant before assignment
 of the new value be assertions, and remove any underived values of irrelevant fields. Check on 
enabled plan generators and attempt to derive values for the fields relevant to that check and for 
those fields that are parameters to any enabled generators. Assign those fields as relevant and any 
that supported the attempted derivations. If all the relevant fields have values, and no generator is 
enabled, then apply any applicable help units. Before returning, assign previous values or default 
values to unvalued fields that became relevant after the assignment of the new value. Return a list of
 the currently enabled generators.) (PROG (dList consistent? gens unprocessedFields (newValue? T) 
relevantFields) (for f in CopyJobFields do (if (RelevantField? f job) then (AddAssertion job f (
JobFieldValue f job)) elseif (NOT (DerivedResult? f job)) then (if (JobFieldValue f job) then (LISTPUT
 (fetch removedAssertions of job) f (JobFieldValue f job))) (RemoveValue f job))) (AddAssertion job 
field value) (SETQ gens (DeriveValuesForGenerators job)) (for gen in (CAR gens) do (\TraceIt 
BluebonnetTrace "Procedure " (fetch generator of gen) " enabled.")) (replace relevantFields of job 
with (CDR gens)) (SETQ generator (replace planGenerator of job with (SelectPlanGenerator (CAR gens))))
 (if (NOT in.Trillium) then (CLEARW CommentWindow) (if generator then (ShowTimeEstimate generator job)
 (if (fetch advisor of generator) then (APPLY* (fetch advisor of generator) job)) elseif (for f in (
CDR gens) always (JobFieldValue f job)) then (ApplyHelpUnits job))) (RETURN (fetch planGenerator of 
job)))))

(SecondsToRoundedMinutes
  [LAMBDA (seconds)                                          (* edited: " 1-FEB-83 15:29")
                                                             (* Convert seconds to minutes and round off the result.)
    (FIX seconds/60.0+.5])

(SelectItem
  [LAMBDA (item window)                                      (* ref: "26-MAY-82 15:58")
                                                             (* selects an item in window)
    (if item and item:jobPanelField:selectedItem~=item
	then (FlipItem item window)
	     item:jobPanelField:selectedItem←item])

(SelectPlanGenerator
  [LAMBDA (generators)                                       (* edited: " 1-FEB-83 13:18")
                                                             (* Select a generator from generators and return it.
							     If there is an obviously faster one, then select it.
							     Otherwise, ask the user.)
                                                             (* Dummy definition for now.)
    generators:1])

(SetJobField
  [LAMBDA (job field value)                                  (* edited: " 4-FEB-83 13:26")
                                                             (* Set the value of field in copy job)
    (RECORDACCESS field job CopyJobRecord (QUOTE replace)
		  value])

(ShowTimeEstimate
  [LAMBDA (generator job)                                    (* edited: " 4-MAR-83 16:49")
                                                             (* Print a time estimate for the plan to be produced by 
							     the generator in the comment window.)
    (PROG [hours (time (MAX 1 (SecondsToRoundedMinutes job:timeEstimate←(GeneratorsTimeEstimate
							 generator job]
          [PrintComment (BQUOTE (The currently described job will take about ,@
				     [COND
				       ((ILESSP time 60)
					 (LIST time))
				       (T (BQUOTE (, (SETQ hours (IQUOTIENT time 60))
						     ,
						     (COND
						       ((EQ hours 1)
							 (QUOTE hour))
						       (T (QUOTE hours)))
						     and , (IREMAINDER time 60]
				     ,
				     (COND
				       ((EQ time 1)
					 (QUOTE minute.))
				       ((IGREATERP time 60)
					 (QUOTE minutes!))
				       (T (QUOTE minutes.]
          (printout CommentWindow T T])

(Subset?
  [LAMBDA (x y)                                              (* edited: "19-JAN-83 15:59")
                                                             (* Test whether list x is a subset of list y.)
    (for xi in x always xi MEMB y])

(SupportsForDerivation
  [LAMBDA (field job)                                        (* edited: " 4-FEB-83 13:27")

          (* Return the list of fields that supports the value of field in job. Return NIL if the field has no value.
	  The field supports itself if it is an assertion.)


    (if (JobFieldValue field job)
	then (for d in job:derivations when d:resultField=field join (for g in d:givens
									join (SupportsForDerivation
									       g job)))
	       or <field>])

(TimeEstimateForJob
  [LAMBDA (job)                                              (* edited: "14-MAR-83 12:23")

          (* Return a time estimate for the job. Do so by determining an enabled generator for the job and calling its time 
	  estimating function. If no generators are enabled, return NIL.)


    (PROG (bestTime time (gens (DeriveValuesForGenerators job)))
          (for gen in gens:1
	     do (time←(GeneratorsTimeEstimate gen job))
		(if ~bestTime or time lt bestTime
		    then bestTime←time))
          (RETURN (OR bestTime 0])

(TimeFor1To1
  [LAMBDA (job)                                              (* edited: " 6-FEB-83 11:38")
                                                             (* Time estimator for Plan1To1.)
    (TimeForPlanners [BQUOTE (MakeReady SetPanel LoadRDH MakeCopies UnloadRdh UnloadOutputTray 
					SayThankUser ,@ (COND
					  ((EQ (fetch CopiesOnStandardPaper of job)
					       (QUOTE No))
					    (QUOTE (LoadTopPaperTray UnloadTopPaperTray 
								     SelectBottomTray]
		     job])

(TimeFor1To2
  [LAMBDA (job)                                              (* edited: " 4-FEB-83 16:01")
                                                             (* Time estimator for Plan1To2.)
    (TimeForPlanners [BQUOTE (MakeReady SetPanel ReverseOriginals LoadRDH MakeCopies ReverseOriginals 
					TransferToTopTray MakeCopies UnloadOutputTray SayThankYou ,@
					(COND
					  ((EQ (fetch CopiesOnStandardPaper of job)
					       (QUOTE No))
					    (QUOTE (LoadTopPaperTray UnloadTopPaperTray 
								     SelectBottomTray]
		     job])

(TimeFor2To1WithMaster
  [LAMBDA NIL                                                (* edited: "11-MAR-83 13:50")
    0])

(TimeForBdaNoMaster
  [LAMBDA (job)                                              (* edited: " 6-FEB-83 12:21")
                                                             (* Time estimator for PlanBdaNoMaster.)
    (PROG1 5                                                 (* Pull BDA latch and raise the RDH.))+(
      TIMES job:#OfOriginalSheets (PROG1 3                   (* Place original on glass and close cover.)
					 )+(PROG1 1          (* Press Start.))+(PROG1 13 
                                                             (* Copier overhead.))+(PROG1
	      (TIMES job:NumberOfCopies .8)                  (* Making the copies.)
	      )+(PROG1 2                                     (* Open cover and remove original.)))+(
      PROG1 5                                                (* Close the RDH.))+(PROG1 2 
                                                             (* Unload the output tray.))+(
      TimeForPlanners [BQUOTE (MakeReady SetPanel SayThankYou ,@ (COND
					   ((EQ (fetch CopiesOnStandardPaper of job)
						(QUOTE No))
					     (QUOTE (LoadTopPaperTray UnloadTopPaperTray 
								      SelectBottomTray]
		      job])

(TimeForBdaWithMaster
  [LAMBDA (job)                                              (* edited: " 6-FEB-83 12:20")
                                                             (* Time estimator for PlanBdaWithMaster.)
    (PROG ((subJob1 (CopyCopyJob job))
	   (subJob2 (CopyCopyJob job)))
          (subJob1:CopiesOnStandardPaper←(QUOTE Yes))
          (subJob1:NumberOfCopies←1)
          (subJob1:TwoSidedCopies←(QUOTE No))
          (subJob1:Staple←(QUOTE No))
          (subJob2:CopyBrightness←(QUOTE normal))
          (subJob2:InputProcessor←(QUOTE RDH))
          (subJob2:NumberOfCopies←(if job:CopiesOnStandardPaper=(QUOTE Yes) and job:Staple=(QUOTE
										  No)
					and job:TwoSidedCopies=(QUOTE No)
				      then job:NumberOfCopies-1
				    else job:NumberOfCopies))
          (subJob2:OriginalsBound←(QUOTE No))
          (subJob2:OriginalsOnStandardPaper←(QUOTE Yes))
          (subJob2:OriginalsStandardSize←(QUOTE Yes))
          (subJob2:CopyJob.Reduction←(QUOTE FullSize))
          (subJob2:TwoSidedOriginals←(QUOTE No))
          (RETURN (PROG1 5                                   (* Connect step.))+(TimeForBdaNoMaster
		    subJob1)+(TimeEstimateForJob subJob2)+(-(TimeForPlanners (QUOTE (SayThankYou])

(TimeForPlanners
  [LAMBDA (planners job)                                     (* edited: " 1-FEB-83 16:24")

          (* Determine a time estimate for doing all the steps produced by planners on job. Planners is a list of atoms that
	  have timeEstimate properties. If the property is NIL, assume 0.0 If the property is an integer, assume that many 
	  seconds. If the property is an atom, call that function with the job as an argument.)


    (for p in planners bind time
       sum (time←(GETPROP p (QUOTE timeEstimate)))
	   (if time
	       then (if (FIXP time)
			then time
		      else (APPLY* time job))
	     else 0])

(TimeForTooThick
  [LAMBDA (job)                                              (* edited: " 6-FEB-83 11:31")
                                                             (* Time estimator for PlanTooThick.)
    (PROG (sheetsPerSubjob #OfSubjobs (totalSheets (job:#OfOriginalSheets/(if job:TwoSidedOriginals=(
										QUOTE Yes)
									      then 2
									    else 1)))
			   (subjob (CopyCopyJob job)))
          (#OfSubjobs←(totalSheets+49)/50)
          (sheetsPerSubjob←totalSheets/#OfSubjobs)
          (subjob:#OfOriginalSheets←totalSheets/#OfSubjobs)
          (subjob:OriginalTooThick←(QUOTE No))
          (RETURN (PROG1 #OfSubjobs                          (* Divide originals into #OfSubjobs sections.)
			 )+(PROG1 #OfSubjobs*(TimeEstimateForJob subjob)
                                                             (* Do the subjobs.)
				  )+(PROG1 (if job:Collate
					       then #OfSubjobs*job:NumberOfCopies
					     else 0])

(TimeToCollate
  [LAMBDA (job)                                              (* edited: "16-MAR-83 11:55")
                                                             (* Estimate the time need to collate the copies for this
							     job by hand.)
    (if job:Collate=(QUOTE Yes)
	then (if ~(job:#OfCopySheets)
		 then (DeriveValue (QUOTE #OfCopySheets)
				   job))
	     job:NumberOfCopies*(job:#OfCopySheets or 2)
      else 0])

(TimeToReverseOriginals
  [LAMBDA (job)                                              (* edited: " 4-FEB-83 16:03")
                                                             (* The time estimating function to reverse a set of 
							     originals.)
    job:#OfOriginalSheets/(if job:TwoSidedOriginals=(QUOTE Yes)
			      then 2
			    else 1])

(TimeToStaple
  [LAMBDA (job)                                              (* edited: "16-MAR-83 11:54")
                                                             (* Time estimator for stapling the copies made in this 
							     job.)
    (if job:Staple=(QUOTE Yes)
	then 5+job:NumberOfCopies*3
      else 0])

(UpdateJobField
  [LAMBDA (job field value)                                  (* edited: "19-JAN-83 17:07")
                                                             (* Put the new values into the copy job and make the 
							     implied changes to the job description panel.)
    (ResolveNewJobValue job field value)
    (UpdateJobDescriptionPanel job:descriptionPanel])

(UpdateJobDescriptionPanel
  [LAMBDA (window refreshFlg)                                (* edited: " 1-FEB-83 15:17")
                                                             (* Redisplay relevant queries and erase all irrelevant 
							     queries. If refreshFlg is NIL, then redisplay only 
							     previously invisible relevant queries.)
    (for f in CopyJobFields bind [(job ←(WINDOWPROP window (QUOTE CopyJob]
       do (if (RelevantField? f job)
	      then (if refreshFlg
		       then (EraseJobPanelField (WINDOWPROP window f)
						window))
		   (RedisplayJobPanelField (WINDOWPROP window f)
					   window)
	    else (EraseJobPanelField (WINDOWPROP window f)
				     window))
       finally (if refreshFlg
		   then (RedisplayMenuTitle (WINDOWPROP window (QUOTE #OfOriginalSheetsMenu))
					    job:#OfOriginalSheets Gacha12Bold)
			(RedisplayMenuTitle (WINDOWPROP window (QUOTE NumberOfCopiesMenu))
					    job:NumberOfCopies Gacha12Bold])

(WhenNumberOfCopiesMenuSelected
  [LAMBDA (item menu)                                        (* edited: "16-MAR-83 12:51")
                                                             (* WhenSelectedFn for the numberOfCopies menu.)
    (WhenPadMenuSelected item menu (QUOTE NumberOfCopies)
			 (QUOTE NumberOfCopiesTimer])

(WhenOriginalsMenuSelected
  [LAMBDA (item menu)                                        (* edited: "16-MAR-83 13:06")
                                                             (* WhenSelectedFn for the #OfOriginals menu.)
    (WhenPadMenuSelected item menu (QUOTE #OfOriginalSheets)
			 (QUOTE NumberOfOriginalsTimer])

(WhenPadMenuSelected
  [LAMBDA (item menu field timerVar)                         (* edited: "16-MAR-83 12:56")
                                                             (* WhenSelectedFn for a number pad menu for field.)
    (if item~= ""
	then (PROG [cursor (job (WINDOWPROP (WFROMMENU menu)
					    (QUOTE CopyJob]
	           (RedisplayMenuTitle menu (if item=(QUOTE Clear)
						then 0
					      elseif (GREATERP (ABS (CLOCK 0)
								    -(EVAL timerVar))/1000.0 30)
						then item
					      else menu:MENU.TITLE*10+item)
				       Gacha12Bold)
	           (if menu:MENU.TITLE=0
		       then (UpdateJobDescriptionPanel job:descriptionPanel)
		     else cursor←(CURSOR WAITINGCURSOR)
			  (UpdateJobField job field menu:MENU.TITLE)
			  (CURSOR cursor))
	           (SET timerVar (CLOCK 0])
)
(DECLARE: EVAL@COMPILE 
(LOADCOMP? (QUOTE LOADBLUEBONNET))
)
(DECLARE: DONTCOPY
  (FILEMAP (NIL (2683 52089 (AddAssertion 2693 . 3281) (AddDerivation 3283 . 4044) (Advise1To2 4046 . 
4322) (Advise2To1WithMaster 4324 . 4454) (AdviseBdaWithMaster 4456 . 6317) (ApplyHelpUnits 6319 . 6986
) (CommentOnJob 6988 . 7410) (CopyCopyJob 7412 . 7910) (CopyingTime 7912 . 8194) (CreateFieldItems 
8196 . 9411) (DefineDefaultJob 9413 . 10320) (DeriveValue 10322 . 12868) (DeriveValuesForGenerators 
12870 . 15772) (DerivedResult? 15774 . 16155) (DeselectItem 16157 . 16505) (EraseJobPanelField 16507
 . 16945) (FindEnabledGenerators 16947 . 17627) (FlashQuery 17629 . 18114) (FlipItem 18116 . 18402) (
FlipRegion 18404 . 18694) (GeneratorsTimeEstimate 18696 . 19082) (GetGeneratorParameters 19084 . 19382
) (GiveUserQueryHelp 19384 . 19839) (HelpFromPanel 19841 . 20222) (InItem? 20224 . 20527) (
InitiateDescriptionPanel 20529 . 25158) (JobFieldValue 25160 . 26364) (JobPanelButtonHandler 26366 . 
27910) (JobPanelHelpHandler 27912 . 29159) (PrintAndBox 29161 . 30039) (PrintComment 30041 . 30531) (
ProceedFromPanel 30533 . 32957) (RedisplayJobPanelField 32959 . 34274) (RedisplayMenu 34276 . 34745) (
RedisplayMenuTitle 34747 . 35249) (RefreshPanel 35251 . 35574) (RelevantField? 35576 . 35745) (
RemoveDerivationsOf 35747 . 36157) (RemoveValue 36159 . 36844) (ResolveNewJobValue 36846 . 38688) (
SecondsToRoundedMinutes 38690 . 38962) (SelectItem 38964 . 39311) (SelectPlanGenerator 39313 . 39775) 
(SetJobField 39777 . 40062) (ShowTimeEstimate 40064 . 41045) (Subset? 41047 . 41318) (
SupportsForDerivation 41320 . 41865) (TimeEstimateForJob 41867 . 42465) (TimeFor1To1 42467 . 42982) (
TimeFor1To2 42984 . 43556) (TimeFor2To1WithMaster 43558 . 43687) (TimeForBdaNoMaster 43689 . 44907) (
TimeForBdaWithMaster 44909 . 46193) (TimeForPlanners 46195 . 46882) (TimeForTooThick 46884 . 47882) (
TimeToCollate 47884 . 48357) (TimeToReverseOriginals 48359 . 48735) (TimeToStaple 48737 . 49079) (
UpdateJobField 49081 . 49480) (UpdateJobDescriptionPanel 49482 . 50537) (
WhenNumberOfCopiesMenuSelected 50539 . 50877) (WhenOriginalsMenuSelected 50879 . 51216) (
WhenPadMenuSelected 51218 . 52087)))))
STOP