(FILECREATED "30-Jan-86 15:16:09" {PHYLUM}<LISPUSERS>KOTO>SLIDEPROJECTOR.;2 54076  

      changes to:  (VARS SLIDEPROJECTORCOMS)
		   (FNS LoadedProjectorRightButtonFn SlideProjectorButtonPushed)

      previous date: "13-Jan-86 14:07:05" {PHYLUM}<LISPUSERS>KOTO>SLIDEPROJECTOR.;1)


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

(PRETTYCOMPRINT SLIDEPROJECTORCOMS)

(RPAQQ SLIDEPROJECTORCOMS [[INITVARS (OpenSlides NIL)
				       (ShrunkenSlides NIL)
				       (ProjectorScreenPos (QUOTE (900 . 10)))
				       (SlideFiles (QUOTE ("*.TEDIT;" "*.TED;"]
	[VARS (PromptForWordLock (CREATE.MONITORLOCK (QUOTE PromptForWord)))
	      (MaxSlideWidth 750)
	      (SlideBorderSize 4)
	      (SlidePromptWindowFont (FONTCREATE (QUOTE HELVETICA)
						 6))
	      (SlideTitleWindowFont (FONTCREATE (QUOTE HELVETICA)
						10
						(QUOTE BOLD]
	(GLOBALVARS OpenSlides ShrunkenSlides ProjectorScreenPos PromptForWordLock MaxSlideWidth 
		    SlideBorderSize SlideMarginWidth SlideProjectionScreen SlidePromptWindowFont 
		    SlideTitleWindowFont SlideFiles)
	(FNS CacheSlide CreateSlideProjector InitSlideProjector LoadedProjectorRightButtonFn 
	     ProjectionScreenButtonEventFn ProjectorIconButtonEventFn ReshapeSlideProjectors 
	     ShapeWindowToMaxSize ShowSlideFile SlideProjectorButtonPushed SlideRandAccessMenuFn 
	     SlideScreenCloseFn SlideScreenOpenFn SlideTitle UpdateSlideProjectorTitleWindow 
	     ViewParticularSlide)
	(COMS (* * Bitmaps for all the cute icons)
	      (BITMAPS SlideProjectorBackButtonBM SlideProjectorNextButtonBM SlideProjectorIcon 
		       SlideProjectorIconMask EmptySlideProjectorIcon EmptySlideProjectorIconMask 
		       ProjectionScreenIcon ProjectionScreenIconMask RolledUpScreenIcon 
		       RolledUpScreenMask)
	      (GLOBALVARS SlideProjectorBackButtonBM SlideProjectorNextButtonBM SlideProjectorIcon 
			  SlideProjectorIconMask EmptySlideProjectorIcon EmptySlideProjectorIconMask 
			  ProjectionScreenIcon ProjectionScreenIconMask RolledUpScreenIcon 
			  RolledUpScreenMask))
	(COMS (* * Big pointers)
	      (FILES (SYSLOAD FROM LISPUSERS)
		     ANIMATE)
	      (GLOBALVARS Hand HandShadow BigArrowIcon BigArrowShadow))
	(COMS (* * Initialization)
	      (P (InitSlideProjector])

(RPAQ? OpenSlides NIL)

(RPAQ? ShrunkenSlides NIL)

(RPAQ? ProjectorScreenPos (QUOTE (900 . 10)))

(RPAQ? SlideFiles (QUOTE ("*.TEDIT;" "*.TED;")))

(RPAQ PromptForWordLock (CREATE.MONITORLOCK (QUOTE PromptForWord)))

(RPAQQ MaxSlideWidth 750)

(RPAQQ SlideBorderSize 4)

(RPAQ SlidePromptWindowFont (FONTCREATE (QUOTE HELVETICA)
					  6))

(RPAQ SlideTitleWindowFont (FONTCREATE (QUOTE HELVETICA)
					 10
					 (QUOTE BOLD)))
(DECLARE: DOEVAL@COMPILE DONTCOPY

(GLOBALVARS OpenSlides ShrunkenSlides ProjectorScreenPos PromptForWordLock MaxSlideWidth 
	    SlideBorderSize SlideMarginWidth SlideProjectionScreen SlidePromptWindowFont 
	    SlideTitleWindowFont SlideFiles)
)
(DEFINEQ

(CacheSlide
  [LAMBDA (slideWindow restOfSlides displayWindow)           (* smL "13-Jan-86 11:26")

          (* * Set up the slide in the reserve window)


    [if (AND (WINDOWPROP displayWindow (QUOTE TEXTSTREAM))
		 (EQ (WINDOWPROP displayWindow (QUOTE cachedSlide))
		       restOfSlides))
	then                                               (* already cached)
	       NIL
      elseif [NOT (AND (NUMBERP (CAR restOfSlides))
			     (NUMBERP (CADR restOfSlides]
	then                                               (* not really a slide, just an empty window.
							     Make sure any previously cached slide is wiped out.)
	       (WINDOWPROP displayWindow (QUOTE cachedSlide)
			     NIL)
	       (if (WINDOWPROP displayWindow (QUOTE TEXTSTREAM))
		   then (TEDIT.QUIT (TEXTSTREAM displayWindow))
			  (WINDOWPROP displayWindow (QUOTE TEXTSTREAM)
					NIL))
      else (RESETLST (RESETSAVE (CURSOR WAITINGCURSOR))
			 (LET [(sourceTextStream (WINDOWPROP slideWindow (QUOTE sourceTextStream))
						 )
			       (textStream (OPENTEXTSTREAM "" displayWindow NIL NIL
							     (QUOTE (PROMPTWINDOW DON'T LEAVETTY T 
										    NOTITLE T]
			      (TEDIT.SETSEL textStream 0 0 (QUOTE LEFT))
			      (TEDIT.SETSEL sourceTextStream (ADD1 (CAR restOfSlides))
					      (DIFFERENCE (CADR restOfSlides)
							    (PLUS 2 (CAR restOfSlides)))
					      (QUOTE LEFT))
			      (TEDIT.COPY (TEDIT.GETSEL sourceTextStream)
					    (TEDIT.GETSEL textStream))
			      (WINDOWPROP displayWindow (QUOTE cachedSlide)
					    restOfSlides]

          (* * Return the first line of text in the slide)


    (if (WINDOWPROP displayWindow (QUOTE TEXTSTREAM))
	then [SlideTitle (TEXTSTREAM displayWindow)
			     1
			     (ADD1 (fetch TEXTLEN of (TEXTOBJ (TEXTSTREAM displayWindow]
      else "{empty}"])

(CreateSlideProjector
  [LAMBDA NIL                                                (* smL "13-Jan-86 13:15")

          (* * Create a new slide window, putting it to the right of any current slide windows)


    (LET [(projectorControlMenu (create MENU
					  ITEMS ←[BQUOTE ((, SlideProjectorNextButtonBM Next NIL
							       (SUBITEMS Next Flip Last))
							    (, SlideProjectorBackButtonBM Prev NIL
							       (SUBITEMS Prev Flip First]
					  CENTERFLG ← T
					  WHENSELECTEDFN ←(FUNCTION SlideProjectorButtonPushed)
					  WHENHELDFN ←(FUNCTION NILL)
					  WHENUNHELDFN ←(FUNCTION NILL)))
	  (projectorItemMenu (create MENU
				       ITEMS ←[QUOTE (HardCopy Paint Remote
								 (Quit Quit NIL (SUBITEMS Quit Shrink]
				       MENUROWS ← 2
				       CENTERFLG ← T
				       WHENSELECTEDFN ←(FUNCTION SlideProjectorButtonPushed)
				       WHENHELDFN ←(FUNCTION NILL)
				       WHENUNHELDFN ←(FUNCTION NILL]
         (LET ((newSlide (CREATEW (create REGION
					      LEFT ← SCREENWIDTH
					      BOTTOM ← 0
					      WIDTH ← MaxSlideWidth
					      HEIGHT ← SCREENHEIGHT)
				    NIL SlideBorderSize))
	       (attachedWindow (CREATEW (create REGION
						    LEFT ← SCREENWIDTH
						    BOTTOM ← 0
						    WIDTH ← MaxSlideWidth
						    HEIGHT ←(MAX (PLUS
								     (HEIGHTIFWINDOW
								       (FONTPROP 
									    SlidePromptWindowFont
										   (QUOTE HEIGHT))
								       NIL 1)
								     (HEIGHTIFWINDOW
								       (FONTPROP 
									     SlideTitleWindowFont
										   (QUOTE HEIGHT))
								       NIL 1))
								   (fetch IMAGEHEIGHT of 
									     projectorControlMenu)
								   (fetch IMAGEHEIGHT of 
										projectorItemMenu)))
					  NIL 0)))

          (* * Attach the sub-window to the bottom of the main slide window)


	      (ATTACHWINDOW attachedWindow newSlide (QUOTE BOTTOM)
			      (QUOTE LEFT))
	      (WINDOWPROP attachedWindow (QUOTE TOTOPFN)
			    NIL)

          (* * None of the windows should have a RIGHTBUTTONFN)


	      (WINDOWPROP attachedWindow (QUOTE RIGHTBUTTONFN)
			    (FUNCTION NILL))
	      (WINDOWPROP newSlide (QUOTE RIGHTBUTTONFN)
			    (FUNCTION NILL))
	      (WINDOWPROP newSlide (QUOTE BUTTONEVENTFN)
			    (FUNCTION NILL))

          (* * Remember all the menus and windows on the main window)


	      (WINDOWPROP newSlide (QUOTE attachedWindow)
			    attachedWindow)
	      (WINDOWPROP newSlide (QUOTE projectorItemMenu)
			    projectorItemMenu)
	      (WINDOWPROP newSlide (QUOTE projectorControlMenu)
			    projectorControlMenu)

          (* * Set up the limits to shaping the windows -
	  this fixes the height of both windows)


	      [WINDOWPROP attachedWindow (QUOTE MINSIZE)
			    (CONS 0 (fetch HEIGHT of (WINDOWPROP attachedWindow (QUOTE
									   REGION]
	      [WINDOWPROP attachedWindow (QUOTE MAXSIZE)
			    (CONS MaxSlideWidth (fetch HEIGHT of (WINDOWPROP attachedWindow
										     (QUOTE REGION]
	      [WINDOWPROP newSlide (QUOTE MINSIZE)
			    (CONS 0 (DIFFERENCE SCREENHEIGHT (fetch HEIGHT
								    of (WINDOWPROP attachedWindow
										       (QUOTE
											 REGION]
	      [WINDOWPROP newSlide (QUOTE MAXSIZE)
			    (CONS MaxSlideWidth (DIFFERENCE SCREENHEIGHT
								(fetch HEIGHT
								   of (WINDOWPROP attachedWindow
										      (QUOTE REGION]

          (* * Expanding should bring back the current display window and adjust the shape of all others to fit)


	      [WINDOWADDPROP newSlide (QUOTE EXPANDFN)
			       (FUNCTION (LAMBDA (slideWindow)
				   (SETQ ShrunkenSlides (DREMOVE slideWindow ShrunkenSlides))
				   (ReshapeSlideProjectors)
				   (ViewParticularSlide slideWindow (WINDOWPROP slideWindow
										    (QUOTE 
										currentSlideStart))
							  (WINDOWPROP slideWindow (QUOTE 
										    currentWindow))
							  (WINDOWPROP slideWindow (QUOTE 
										    reserveWindow]

          (* * Add to the list of slide windows and reshape them all to fit)


	      (SETQ OpenSlides (NCONC1 OpenSlides newSlide))
	      (ReshapeSlideProjectors)

          (* * Paint them all black)


	      (DSPTEXTURE BLACKSHADE newSlide)
	      (DSPRESET newSlide)
	      (CLEARW newSlide)
	      (DSPTEXTURE BLACKSHADE attachedWindow)
	      (DSPRESET attachedWindow)
	      (REDISPLAYW attachedWindow)

          (* * That's all)


	  newSlide])

(InitSlideProjector
  [LAMBDA NIL                                                (* smL "13-Jan-86 10:56")

          (* * Create the backdrop slide window, then shrink it down to its icon)


    (LET ((projectionScreenIcon (ICONW ProjectionScreenIcon ProjectionScreenIconMask 
					 ProjectorScreenPos)))

          (* * Init some globals)


         [SETQ SlideMarginWidth (PLUS 10 (MAX (BITMAPWIDTH HandShadow)
						    (BITMAPWIDTH BigArrowShadow)
						    (BITMAPWIDTH EmptySlideProjectorIconMask)
						    (BITMAPWIDTH RolledUpScreenIcon]
         (SETQ SlideProjectionScreen
	   (CREATEW (create REGION
				LEFT ← 0
				BOTTOM ← 0
				WIDTH ← SCREENWIDTH
				HEIGHT ← SCREENHEIGHT)
		      NIL 0))

          (* * Initialize the background)


         (DSPTEXTURE GRAYSHADE SlideProjectionScreen)
         (DSPRESET SlideProjectionScreen)

          (* * Add the various icons)

                                                             (* First a couple of pointers)
         (WINDOWADDPROP SlideProjectionScreen (QUOTE iconWindows)
			  (BIGCW [create POSITION
					     XCOORD ←(PLUS (DIFFERENCE SCREENWIDTH 
									   SlideMarginWidth)
							     (QUOTIENT (DIFFERENCE 
										 SlideMarginWidth
										       (BITMAPWIDTH
											 HandShadow))
									 2))
					     YCOORD ←(DIFFERENCE SCREENHEIGHT (PLUS 5
											(
										     BITMAPHEIGHT
											  HandShadow]
				   Hand HandShadow))
         (WINDOWADDPROP SlideProjectionScreen (QUOTE iconWindows)
			  (BIGCW [create POSITION
					     XCOORD ←(PLUS (DIFFERENCE SCREENWIDTH 
									   SlideMarginWidth)
							     (QUOTIENT (DIFFERENCE 
										 SlideMarginWidth
										       (BITMAPWIDTH
											 
										   BigArrowShadow))
									 2))
					     YCOORD ←(DIFFERENCE SCREENHEIGHT (PLUS 10
											(
										     BITMAPHEIGHT
											  HandShadow)
											(
										     BITMAPHEIGHT
											  
										   BigArrowShadow]
				   BigArrowIcon BigArrowShadow))
                                                             (* Then an empty slide projector icon)
         (WINDOWADDPROP SlideProjectionScreen (QUOTE iconWindows)
			  (LET [(projectorIcon (ICONW EmptySlideProjectorIcon 
							EmptySlideProjectorIconMask
							(create POSITION
								  XCOORD ←(PLUS
								    (DIFFERENCE SCREENWIDTH 
										 SlideMarginWidth)
								    (QUOTIENT (DIFFERENCE
										  SlideMarginWidth
										  (BITMAPWIDTH
										    
								      EmptySlideProjectorIconMask))
										2))
								  YCOORD ← 5]
			       (WINDOWPROP projectorIcon (QUOTE BUTTONEVENTFN)
					     (FUNCTION ProjectorIconButtonEventFn))
			   projectorIcon))                   (* And an icon for rolling up the screen)
         (WINDOWADDPROP SlideProjectionScreen (QUOTE iconWindows)
			  (LET [(rollUpIcon (ICONW RolledUpScreenIcon RolledUpScreenMask
						     (create POSITION
							       XCOORD ←(PLUS
								 (DIFFERENCE SCREENWIDTH 
									       SlideMarginWidth)
								 (QUOTIENT (DIFFERENCE
									       SlideMarginWidth
									       (BITMAPWIDTH 
									       RolledUpScreenIcon))
									     2))
							       YCOORD ←(PLUS 10 (BITMAPHEIGHT
										 
								      EmptySlideProjectorIconMask]
			       [WINDOWPROP rollUpIcon (QUOTE BUTTONEVENTFN)
					     (FUNCTION (LAMBDA (window)
						 (if (MOUSESTATE LEFT)
						     then (MOVEW window)
						   elseif (MOUSESTATE MIDDLE)
						     then (while (NOT (MOUSESTATE UP))
							       do (BLOCK))
							    (SHRINKW SlideProjectionScreen)
							    (for w in (OPENWINDOWS)
							       do
								(MOVEW w
									 (fetch LEFT
									    of (WINDOWPROP
										   w
										   (QUOTE REGION)))
									 (fetch BOTTOM
									    of (WINDOWPROP
										   w
										   (QUOTE REGION]
			   rollUpIcon))

          (* * Glue the various windows to the top of the backdrop)


         (WINDOWADDPROP SlideProjectionScreen (QUOTE SHRINKFN)
			  (FUNCTION SlideScreenCloseFn))
         (WINDOWADDPROP SlideProjectionScreen (QUOTE CLOSEFN)
			  (FUNCTION SlideScreenCloseFn))
         (WINDOWADDPROP SlideProjectionScreen (QUOTE OPENFN)
			  (FUNCTION SlideScreenOpenFn))
         (WINDOWADDPROP SlideProjectionScreen (QUOTE EXPANDFN)
			  (FUNCTION SlideScreenOpenFn))

          (* * The background should have no button events)


         (WINDOWPROP SlideProjectionScreen (QUOTE BUTTONEVENTFN)
		       (FUNCTION NILL))
         (WINDOWPROP SlideProjectionScreen (QUOTE RIGHTBUTTONFN)
		       (FUNCTION NILL))

          (* * Shrink it down to its cute icon)


         (WINDOWPROP SlideProjectionScreen (QUOTE ICON)
		       projectionScreenIcon)
         (SHRINKW SlideProjectionScreen)
     SlideProjectionScreen])

(LoadedProjectorRightButtonFn
  [LAMBDA (window)                                           (* smL "30-Jan-86 15:09")

          (* * Replaces the standard fn DOWINDOWCOM for the loaded projector icon)


    (SELECTQ [MENU (create MENU
				 CENTERFLG ← T
				 ITEMS ←(QUOTE (Close Move Expand]
	       (Expand (EXPANDW window))
	       (Move (MOVEW window))
	       [Close (LET [(mainMenu (WINDOWPROP window (QUOTE mainMenu]
		           (EXPANDW window)
		           (DOSELECTEDITEM mainMenu (QUOTE Quit)
					     (QUOTE LEFT]
	       NIL])

(ProjectionScreenButtonEventFn
  [LAMBDA (window)                                           (* smL " 9-Dec-85 15:08")
                                                             (* Comment)
    (if (MOUSESTATE LEFT)
	then (MOVEW window)
      elseif (MOUSESTATE MIDDLE)
	then (OpenProjectorScreen window)
      else NIL])

(ProjectorIconButtonEventFn
  [LAMBDA (icon)                                             (* smL " 8-Jan-86 13:09")

          (* * The empty projector was buttoned -- so load up the projector)


    (DECLARE (GLOBALVARS UNSCHEDULEDPROMPTREGION))
    (if (MOUSESTATE LEFT)
	then (MOVEW icon)
      elseif (AND (MOUSESTATE MIDDLE)
		      (OBTAIN.MONITORLOCK PromptForWordLock T))
	then
	 (CLOSEW icon)
	 (LET [(file
		 (MENU (create
			   MENU
			   ITEMS ←[CONS
			     (QUOTE (**other** (QUOTE **other**)
						 "Let you type in a file name"))
			     (SORT (for file in (for fileSpec in SlideFiles
							 join (DIRECTORY fileSpec))
					collect            (* strip off connected directory from from of file 
							     name)
						  (LIST [if (STRPOS (DIRECTORYNAME T)
									  file 1 NIL T NIL (
									    UPPERCASEARRAY))
							      then
							       (SUBSTRING
								 file
								 (ADD1 (NCHARS (DIRECTORYNAME
										     T)))
								 (SUB1 (OR (STRPOS ";" file)
									       0)))
							    else (SUBSTRING
								     file 1
								     (SUB1 (OR (STRPOS ";" file)
										   0]
							  (KWOTE file]
			   CENTERFLG ← T
			   TITLE ← "Slide file?"]
	      [if (EQ file (QUOTE **other**))
		  then (SETQ file (LET ((promptWindow (CREATEW UNSCHEDULEDPROMPTREGION NIL 15)))
				           (PROG1 (PROMPTFORFILENAME promptWindow NIL 
								     "Slide file (CR to abort): ")
						    (CLOSEW promptWindow]
	      (if (NULL file)
		  then NIL
		elseif (FINDFILE file)
		  then (ShowSlideFile (CreateSlideProjector)
					  file)
		else (RINGBELLS)))
	 (OPENW icon])

(ReshapeSlideProjectors
  [LAMBDA NIL                                                (* smL "11-Dec-85 17:34")

          (* * Shape the slide projectors to tile the screen)


    (LET ((currentUsedProjectors (for w in OpenSlides when (OPENWP w) collect w)))
         (if currentUsedProjectors
	     then (for slide in currentUsedProjectors as i from 0
		       bind width offset attachedWindow projectorItemMenu projectorControlMenu 
			      currentDisplay
		       first [SETQ width (MIN MaxSlideWidth (QUOTIENT (DIFFERENCE 
										      SCREENWIDTH 
										 SlideMarginWidth)
									      (LENGTH 
									    currentUsedProjectors]
			       (SETQ offset (QUOTIENT (DIFFERENCE (DIFFERENCE SCREENWIDTH 
										 SlideMarginWidth)
									(TIMES width (LENGTH
										   
									    currentUsedProjectors)))
							  2))
		       do (SETQ attachedWindow (WINDOWPROP slide (QUOTE attachedWindow)))
			    (SETQ projectorItemMenu (WINDOWPROP slide (QUOTE projectorItemMenu))
			      )
			    (SETQ projectorControlMenu (WINDOWPROP slide (QUOTE 
									     projectorControlMenu)))
			    (SETQ currentDisplay (WINDOWPROP slide (QUOTE currentWindow))) 
                                                             (* Change the min and max width of the windows to the 
							     new width)
			    [WINDOWPROP slide (QUOTE MINSIZE)
					  (CONS width (CDR (WINDOWPROP slide (QUOTE MINSIZE]
			    [WINDOWPROP slide (QUOTE MAXSIZE)
					  (CONS width (CDR (WINDOWPROP slide (QUOTE MAXSIZE]
			    [WINDOWPROP attachedWindow (QUOTE MINSIZE)
					  (CONS width (CDR (WINDOWPROP attachedWindow
									     (QUOTE MINSIZE]
			    [WINDOWPROP attachedWindow (QUOTE MAXSIZE)
					  (CONS width (CDR (WINDOWPROP attachedWindow
									     (QUOTE MAXSIZE]
                                                             (* Take off the menus for now so the attached window 
							     can be reshaped)
			    (DELETEMENU projectorItemMenu)
			    (DELETEMENU projectorControlMenu) 
                                                             (* Reshape the window sets)
			    (SHAPEW slide (create REGION
						      LEFT ← (PLUS offset (TIMES width i))
						      WIDTH ← width
						      BOTTOM ← 0
						      HEIGHT ← SCREENHEIGHT))
			    [if (AND currentDisplay (OPENWP currentDisplay))
				then (SHAPEW currentDisplay
						 (CREATEREGION [PLUS (WINDOWPROP slide
										       (QUOTE
											 BORDER))
									 (fetch LEFT
									    of (WINDOWPROP
										   slide
										   (QUOTE REGION]
								 [PLUS (WINDOWPROP slide
										       (QUOTE
											 BORDER))
									 (fetch BOTTOM
									    of (WINDOWPROP
										   slide
										   (QUOTE REGION]
								 (WINDOWPROP slide (QUOTE WIDTH))
								 (WINDOWPROP slide (QUOTE HEIGHT]
			    [SHAPEW attachedWindow (create REGION
							       LEFT ← (PLUS offset
									      (TIMES width i))
							       WIDTH ← width
							       BOTTOM ← 0
							       HEIGHT ← (CDR (WINDOWPROP
										 attachedWindow
										 (QUOTE MAXSIZE]
                                                             (* Put the menus back)
			    (CLEARW attachedWindow)
			    (ADDMENU projectorItemMenu attachedWindow
				       (create POSITION
						 XCOORD ← 0
						 YCOORD ← (QUOTIENT (DIFFERENCE
									(WINDOWPROP attachedWindow
										      (QUOTE HEIGHT)
										      )
									(fetch IMAGEHEIGHT
									   of projectorItemMenu))
								      2)))
			    (ADDMENU projectorControlMenu attachedWindow
				       (create POSITION
						 XCOORD ← (DIFFERENCE width (fetch IMAGEWIDTH
										 of 
									     projectorControlMenu))
						 YCOORD ← (QUOTIENT (DIFFERENCE
									(WINDOWPROP attachedWindow
										      (QUOTE HEIGHT)
										      )
									(fetch IMAGEHEIGHT
									   of projectorControlMenu))
								      2)))
                                                             (* Note the areas to be used for the file and slide 
							     names)
			    [LET [(left (fetch IMAGEWIDTH of projectorItemMenu))
				  (width (DIFFERENCE width (PLUS (fetch IMAGEWIDTH
									of projectorControlMenu)
								     (fetch IMAGEWIDTH
									of projectorItemMenu]
			         [WINDOWPROP attachedWindow (QUOTE titleRegion)
					       (CREATEREGION left (DIFFERENCE
								 (WINDOWPROP attachedWindow
									       (QUOTE HEIGHT))
								 (FONTPROP SlideTitleWindowFont
									     (QUOTE HEIGHT)))
							       width
							       (FONTPROP SlideTitleWindowFont
									   (QUOTE HEIGHT]
			         (WINDOWPROP attachedWindow (QUOTE slideNameRegion)
					       (CREATEREGION left 0 width (FONTPROP 
									    SlidePromptWindowFont
											(QUOTE
											  HEIGHT]
                                                             (* Update the info in the attached window)
			    (UpdateSlideProjectorTitleWindow slide])

(ShapeWindowToMaxSize
  [LAMBDA (window)                                           (* smL "10-Dec-85 17:56")

          (* * Shape the window to the MAXSIZE property)


    (SHAPEW window (create REGION
			copying (WINDOWPROP window (QUOTE REGION))
				  WIDTH ← (CAR (WINDOWPROP window (QUOTE MAXSIZE)))
				  HEIGHT ← (CDR (WINDOWPROP window (QUOTE MAXSIZE])

(ShowSlideFile
  [LAMBDA (slideWindow file)                                 (* smL "13-Jan-86 13:13")

          (* * Start the given slide window viewing the given file -
	  this may take a while, so change the cursor)


    (RESETLST (RESETSAVE (CURSOR WAITINGCURSOR))
		(RESETSAVE (PRIN1 "Opening and formating slide stream..." slideWindow)
			     (LIST (FUNCTION CLEARW)
				     slideWindow))
		(LET* ((fileStream (OPENSTREAM file (QUOTE INPUT)))
		       (slideTextStream (OPENTEXTSTREAM fileStream)))

          (* * Remember the beginning of each slide in the file)


		      (TERPRI slideWindow)
		      (PRINT 1 slideWindow)
		      [WINDOWPROP
			slideWindow
			(QUOTE slideStarts)
			(NCONC1 [CONS 0 (for slideNumber from 2 bind (slideStart ← 1)
					       while
						(NUMBERP
						  (SETQ slideStart
						    (TEDIT.FIND slideTextStream
								  [CONSTANT
								    (MKSTRING (CHARACTER
										  (CHARCODE FF]
								  slideStart)))
					       collect (PRINT slideNumber slideWindow)
							 (SETQ slideStart (PLUS slideStart 1]
				  (PLUS 2 (fetch TEXTLEN of (TEXTOBJ slideTextStream]
		      (WINDOWPROP slideWindow (QUOTE sourceTextStream)
				    slideTextStream)

          (* * Remember the file)


		      (WINDOWPROP slideWindow (QUOTE slideFile)
				    fileStream)

          (* * Remember what slide we are looking at -
	  The ugly NIL hack is just to get things started)


		      [WINDOWPROP slideWindow (QUOTE currentSlideStart)
				    (CONS NIL (WINDOWPROP slideWindow (QUOTE slideStarts]

          (* * Create and remember a couple of display windows for the projector)


		      (WINDOWPROP slideWindow (QUOTE currentWindow)
				    (CREATEW (create REGION
							 LEFT ← SCREENWIDTH
							 BOTTOM ← 0
							 WIDTH ← MaxSlideWidth
							 HEIGHT ← SCREENHEIGHT)
					       NIL 0 T))
		      (WINDOWPROP slideWindow (QUOTE reserveWindow)
				    (CREATEW (create REGION
							 LEFT ← SCREENWIDTH
							 BOTTOM ← 0
							 WIDTH ← MaxSlideWidth
							 HEIGHT ← SCREENHEIGHT)
					       NIL 0 T))

          (* * Cache a rand-access menu of the various slides)


		      [WINDOWPROP slideWindow (QUOTE flipMenu)
				    (create MENU
					      CENTERFLG ← T
					      TITLE ← "Which slide?"
					      ITEMS ←(for i on (WINDOWPROP slideWindow
										 (QUOTE slideStarts)
										 )
							when (CDR i)
							collect (LIST (SlideTitle
									    (WINDOWPROP
									      slideWindow
									      (QUOTE 
										 sourceTextStream))
									    (ADD1 (CAR i))
									    (CADR i))
									  (KWOTE i]

          (* * Show the title of the file in the title area)


		      [WINDOWPROP slideWindow (QUOTE nextSlideTitle)
				    (CacheSlide slideWindow (WINDOWPROP slideWindow (QUOTE
									      slideStarts))
						  (WINDOWPROP slideWindow (QUOTE reserveWindow]
		      (UpdateSlideProjectorTitleWindow slideWindow])

(SlideProjectorButtonPushed
  [LAMBDA (item menu button)                                 (* smL "30-Jan-86 15:04")

          (* * Act on a selected menu item)


    (DECLARE (GLOBALVARS HIGHLIGHTSHADE))
    (RESETLST
      (RESETSAVE (SHADEITEM item menu HIGHLIGHTSHADE)
		   (LIST (FUNCTION SHADEITEM)
			   item menu WHITESHADE))
      (LET [(slideWindow (WINDOWPROP (WFROMMENU menu)
				       (QUOTE MAINWINDOW]
           (SELECTQ (if (LISTP item)
			  then (CADR item)
			else item)
		      [Paint (if (OPENWP (WINDOWPROP slideWindow (QUOTE currentWindow)))
				 then (PAINTW (WINDOWPROP slideWindow (QUOTE currentWindow]
		      (Shrink (SHADEITEM item menu WHITESHADE)
			      [if (WINDOWPROP slideWindow (QUOTE currentWindow))
				  then (CLOSEW (WINDOWPROP slideWindow (QUOTE currentWindow]
			      [SHRINKW
				slideWindow
				(OR (WINDOWPROP slideWindow (QUOTE ICONWINDOW))
				      (TITLEDICONW (create TITLEDICON
							       ICON ← SlideProjectorIcon
							       MASK ← SlideProjectorIconMask
							       TITLEREG ←(CREATEREGION
								 2 2 (DIFFERENCE (BITMAPWIDTH
										     
									       SlideProjectorIcon)
										   4)
								 12))
						     (OR (FILENAMEFIELD
							     [AND (WINDOWPROP slideWindow
										  (QUOTE slideFile))
								    (OPENP (WINDOWPROP
									       slideWindow
									       (QUOTE slideFile]
							     (QUOTE NAME))
							   "")
						     (FONTCREATE (QUOTE HELVETICA)
								   6)
						     (GETBOXPOSITION (BITMAPWIDTH 
									       SlideProjectorIcon)
								       (BITMAPHEIGHT 
									       SlideProjectorIcon]
			      (WINDOWPROP (WINDOWPROP slideWindow (QUOTE ICONWINDOW))
					    (QUOTE CLOSEFN)
					    NIL)
			      (WINDOWPROP (WINDOWPROP slideWindow (QUOTE ICONWINDOW))
					    (QUOTE RIGHTBUTTONFN)
					    (FUNCTION LoadedProjectorRightButtonFn))
			      (WINDOWPROP (WINDOWPROP slideWindow (QUOTE ICONWINDOW))
					    (QUOTE mainMenu)
					    menu)
			      (push ShrunkenSlides slideWindow)
			      (ReshapeSlideProjectors))
		      (Quit (TEDIT.QUIT (WINDOWPROP slideWindow (QUOTE sourceTextStream)))
			    (CLOSEF? (WINDOWPROP slideWindow (QUOTE slideFile)))
			    (CLOSEW (WINDOWPROP slideWindow (QUOTE reserveWindow)))
			    (CLOSEW (WINDOWPROP slideWindow (QUOTE currentWindow)))
			    (CLOSEW slideWindow)
			    (SETQ OpenSlides (DREMOVE slideWindow OpenSlides))
			    (ReshapeSlideProjectors))
		      [Next (if (CDDR (WINDOWPROP slideWindow (QUOTE currentSlideStart)))
				then (ViewParticularSlide slideWindow (CDR (WINDOWPROP
										   slideWindow
										   (QUOTE 
										currentSlideStart)))
							      (WINDOWPROP slideWindow (QUOTE
									      reserveWindow))
							      (WINDOWPROP slideWindow (QUOTE
									      currentWindow)))
			      else                         (* at the last slide)
				     (ViewParticularSlide slideWindow (CONS NIL
										(WINDOWPROP
										  slideWindow
										  (QUOTE 
										      slideStarts)))
							    (WINDOWPROP slideWindow (QUOTE 
										    reserveWindow))
							    (WINDOWPROP slideWindow (QUOTE 
										    currentWindow]
		      [Prev (if [NULL (CAR (WINDOWPROP slideWindow (QUOTE currentSlideStart]
				then                       (* at the blank slide between the first and last)
				       (DOSELECTEDITEM menu (QUOTE Last)
							 button)
			      elseif (EQ (WINDOWPROP slideWindow (QUOTE slideStarts))
					     (WINDOWPROP slideWindow (QUOTE currentSlideStart)))
				then                       (* at the first slide)
				       (ViewParticularSlide slideWindow (CONS
								NIL
								(WINDOWPROP slideWindow
									      (QUOTE slideStarts)))
							      (WINDOWPROP slideWindow (QUOTE
									      reserveWindow))
							      (WINDOWPROP slideWindow (QUOTE
									      currentWindow)))
			      else (ViewParticularSlide slideWindow
							    [for remaining
							       on (WINDOWPROP slideWindow
										  (QUOTE 
										      slideStarts))
							       thereis (EQ (CDR remaining)
									       (WINDOWPROP
										 slideWindow
										 (QUOTE 
										currentSlideStart]
							    (WINDOWPROP slideWindow (QUOTE 
										    reserveWindow))
							    (WINDOWPROP slideWindow (QUOTE 
										    currentWindow]
		      (Remote                                (* Clobber the right button fn for the background)
			      [RESETSAVE (WINDOWPROP SlideProjectionScreen (QUOTE RIGHTBUTTONFN)
							 (FUNCTION NULL))
					   (LIST (FUNCTION WINDOWPROP)
						   SlideProjectionScreen
						   (QUOTE RIGHTBUTTONFN)
						   (WINDOWPROP SlideProjectionScreen (QUOTE
								   RIGHTBUTTONFN]
			      (until (MOUSESTATE MIDDLE)
				 do (if (MOUSESTATE LEFT)
					  then             (* next slide)
						 (until (MOUSESTATE UP) do NIL)
						 (DOSELECTEDITEM menu (QUOTE Next)
								   (QUOTE LEFT))
					elseif (MOUSESTATE RIGHT)
					  then             (* prev)
						 (until (MOUSESTATE UP) do NIL)
						 (DOSELECTEDITEM menu (QUOTE Prev)
								   (QUOTE LEFT)))
                                                             (* don't keep triggering on this button)
				      
				 finally (until (MOUSESTATE UP) do NIL)))
		      [Last (ViewParticularSlide slideWindow (NLEFT (WINDOWPROP slideWindow
										      (QUOTE 
										      slideStarts))
									2)
						   (WINDOWPROP slideWindow (QUOTE reserveWindow))
						   (WINDOWPROP slideWindow (QUOTE currentWindow]
		      [First (ViewParticularSlide slideWindow (WINDOWPROP slideWindow
									      (QUOTE slideStarts))
						    (WINDOWPROP slideWindow (QUOTE reserveWindow))
						    (WINDOWPROP slideWindow (QUOTE currentWindow]
		      [Flip (LET [(slide (MENU (WINDOWPROP slideWindow (QUOTE flipMenu]
			         (if slide
				     then (ViewParticularSlide slideWindow slide
								   (WINDOWPROP slideWindow
										 (QUOTE 
										    reserveWindow))
								   (WINDOWPROP slideWindow
										 (QUOTE 
										    currentWindow]
		      [HardCopy (HARDCOPYW (WINDOWPROP slideWindow (QUOTE currentWindow]
		      (NIL NIL)
		      (SHOULDNT (CONS "Unknown menu item" item])

(SlideRandAccessMenuFn
  [LAMBDA (item menu button)                                 (* smL "13-Jan-86 12:44")

          (* * The WHENSELECTEDFN for the slide rand-access menu)


    (LET [(slideWindow (GETMENUPROP menu (QUOTE slideWindow]
         (ViewParticularSlide slideWindow (CADR item)
				(WINDOWPROP slideWindow (QUOTE reserveWindow))
				(WINDOWPROP slideWindow (QUOTE currentWindow])

(SlideScreenCloseFn
  [LAMBDA (projectionScreen)                                 (* smL " 7-Jan-86 16:49")

          (* * The CLOSE method for the projector screen)


    (for w in (WINDOWPROP projectionScreen (QUOTE iconWindows)) do (CLOSEW w))
    (for w in OpenSlides do (if (MEMB w ShrunkenSlides)
				      then (CLOSEW (WINDOWPROP w (QUOTE ICONWINDOW)))
				    else (CLOSEW (WINDOWPROP w (QUOTE currentWindow)))
					   (CLOSEW w)))    (* Bring back all the original windows)
    (for windowDescr in (WINDOWPROP projectionScreen (QUOTE screenWindows))
       do (MOVEW (CAR windowDescr)
		     (CDR windowDescr)))
    (WINDOWPROP projectionScreen (QUOTE screenWindows)
		  NIL])

(SlideScreenOpenFn
  [LAMBDA (projectionScreen)                                 (* smL " 7-Jan-86 16:45")

          (* * The OPEN method for the projector screen)

                                                             (* Get rid of all the existing windows)
    [for window in (OPENWINDOWS) when (AND (NEQ window projectionScreen)
						     [NOT (MEMB window (WINDOWPROP
								      projectionScreen
								      (QUOTE iconWindows]
						     (EQ window (MAINWINDOW window T)))
       do (WINDOWADDPROP projectionScreen (QUOTE screenWindows)
			     (CONS window (create POSITION
						      XCOORD ←(fetch LEFT
								 of (WINDOWPROP window
										    (QUOTE REGION)))
						      YCOORD ←(fetch BOTTOM
								 of (WINDOWPROP window
										    (QUOTE REGION]
    (for window in (OPENWINDOWS) when [AND (NEQ window projectionScreen)
						     [NOT (MEMB window (WINDOWPROP
								      projectionScreen
								      (QUOTE iconWindows]
						     (EQ window (MAINWINDOW window T))
						     (REGIONSINTERSECTP (WINDOWPROP window
											(QUOTE
											  REGION))
									  (CONSTANT (CREATEREGION
											0 0 
										      SCREENWIDTH 
										     SCREENHEIGHT]
       do (MOVEW window (TIMES 2 SCREENHEIGHT)
		     (TIMES 2 SCREENWIDTH)))               (* Open the icon windows on the screen)
    (for w in (WINDOWPROP projectionScreen (QUOTE iconWindows)) do (OPENW w))
                                                             (* Open any existing slides)
    (for w in OpenSlides do (if (MEMB w ShrunkenSlides)
				      then (OPENW (WINDOWPROP w (QUOTE ICONWINDOW)))
				    else (OPENW w)
					   (ViewParticularSlide w (WINDOWPROP w (QUOTE 
										currentSlideStart))
								  (WINDOWPROP w (QUOTE 
										    currentWindow))
								  (WINDOWPROP w (QUOTE 
										    reserveWindow])

(SlideTitle
  [LAMBDA (textStream startPos endPos)                       (* smL "13-Jan-86 11:25")

          (* * Return the first line of text in the slide)


    (OR (bind (start ← startPos)
		  end line while (AND [SETQ end (TEDIT.FIND textStream
								    (CONSTANT (CHARACTER
										  (CHARCODE EOL)))
								    start
								    (fetch TEXTLEN
								       of (TEXTOBJ textStream]
					  (LEQ end endPos))
	     do                                            (* get the next full line)
		  (TEDIT.SETSEL textStream start (ADD1 (DIFFERENCE end start))
				  (QUOTE LEFT))            (* Ugh -- then NLSETQ is needed in case there is an 
							     imageobject in the slide)
		  [SETQ line (CAR (OR (NLSETQ (TEDIT.SEL.AS.STRING textStream))
					    (QUOTE ("{image object}"]
		  (TEDIT.SETSEL textStream 1 0 (QUOTE LEFT)) 
                                                             (* Strip off any trailing white space)
		  (while [MEMB (NTHCHARCODE line (NCHARS line))
				   (CONSTANT (LIST (CHARCODE NULL)
						       (CHARCODE SP)
						       (CHARCODE TAB)
						       (CHARCODE LF)
						       (CHARCODE CR)
						       (CHARCODE EOL]
		     do (GLC line))                      (* Strip off any leading white space)
		  (while [MEMB (CHCON1 line)
				   (CONSTANT (LIST (CHARCODE NULL)
						       (CHARCODE SP)
						       (CHARCODE TAB)
						       (CHARCODE LF)
						       (CHARCODE CR)
						       (CHARCODE EOL]
		     do (GNC line))                      (* If there is anything left, use it it, otherwise try
							     the next line)
		  (if (EQUAL line "")
		      then (SETQ start (ADD1 end))
		    else (RETURN line)))
	  ""])

(UpdateSlideProjectorTitleWindow
  [LAMBDA (slideWindow)                                      (* smL " 7-Jan-86 16:26")
                                                             (* Comment)
    (RESETLST (LET [(attachedWindow (WINDOWPROP slideWindow (QUOTE attachedWindow)))
		      [fileName (AND (WINDOWPROP slideWindow (QUOTE slideFile))
				       (OPENP (WINDOWPROP slideWindow (QUOTE slideFile]
		      (nextSlideTitle (WINDOWPROP slideWindow (QUOTE nextSlideTitle]
		     (REDISPLAYW attachedWindow)
		     (RESETSAVE (DSPSOURCETYPE (QUOTE INVERT)
						   attachedWindow)
				  (LIST (FUNCTION DSPSOURCETYPE)
					  (DSPSOURCETYPE NIL attachedWindow)
					  attachedWindow))
		     (LET [(titleRegion (WINDOWPROP attachedWindow (QUOTE titleRegion)))
			   (slideNameRegion (WINDOWPROP attachedWindow (QUOTE slideNameRegion]
		          (RESETSAVE (DSPFONT SlideTitleWindowFont attachedWindow)
				       (LIST (FUNCTION DSPFONT)
					       (DSPFONT NIL attachedWindow)
					       attachedWindow))
		          (RESETSAVE (DSPCLIPPINGREGION titleRegion attachedWindow)
				       (LIST (FUNCTION DSPCLIPPINGREGION)
					       (DSPCLIPPINGREGION NIL attachedWindow)
					       attachedWindow))
		          (if fileName
			      then (CENTERPRINTINREGION (FILENAMEFIELD fileName (QUOTE NAME))
							    titleRegion attachedWindow))
		          (DSPFONT SlidePromptWindowFont attachedWindow)
		          (DSPCLIPPINGREGION slideNameRegion attachedWindow)
		          (if nextSlideTitle
			      then (CENTERPRINTINREGION (CONCAT "next: " nextSlideTitle)
							    slideNameRegion attachedWindow])

(ViewParticularSlide
  [LAMBDA (slideWindow restOfSlides displayWindow extraWindow)
                                                             (* smL "12-Dec-85 12:01")

          (* * Show the particular slide in the window. displayWindow is the window to use, extraWindow is the currently used
	  window)



          (* * Get rid of the extra display)


    (MOVEW extraWindow SCREENWIDTH 0)
    (CLOSEW extraWindow)
    (WINDOWPROP extraWindow (QUOTE cachedSlide)
		  NIL)
    (WINDOWPROP slideWindow (QUOTE reserveWindow)
		  extraWindow)

          (* * Copy the slide into the new window, making it the current window)


    [SHAPEW displayWindow (create REGION
				      LEFT ← SCREENWIDTH
				      BOTTOM ← 0
				      WIDTH ← (WINDOWPROP slideWindow (QUOTE WIDTH))
				      HEIGHT ← (WINDOWPROP slideWindow (QUOTE HEIGHT]
    (CacheSlide slideWindow restOfSlides displayWindow)
    (WINDOWPROP slideWindow (QUOTE currentWindow)
		  displayWindow)

          (* * Remember where we are in the file)


    (WINDOWPROP slideWindow (QUOTE currentSlideStart)
		  restOfSlides)

          (* * Now that it is formatted, put the window in its visible place)


    (if (WINDOWPROP displayWindow (QUOTE TEXTSTREAM))
	then                                               (* actually viewing a slide)
	       [MOVEW displayWindow [PLUS (WINDOWPROP slideWindow (QUOTE BORDER))
					      (fetch LEFT of (WINDOWPROP slideWindow
									       (QUOTE REGION]
			(PLUS (WINDOWPROP slideWindow (QUOTE BORDER))
				(fetch BOTTOM of (WINDOWPROP slideWindow (QUOTE REGION]
      else                                                 (* an "empty" slide)
	     NIL)

          (* * If there are more slides, cache the next one)


    (if (CDDR restOfSlides)
	then (WINDOWPROP slideWindow (QUOTE nextSlideTitle)
			     (CacheSlide slideWindow (CDR restOfSlides)
					   extraWindow))
      else (WINDOWPROP slideWindow (QUOTE nextSlideTitle)
			   "{no more slides}"))
    (UpdateSlideProjectorTitleWindow slideWindow])
)
(* * Bitmaps for all the cute icons)


(RPAQ SlideProjectorBackButtonBM (READBITMAP))
(16 14
"@@@@"
"@@@@"
"AN@@"
"COCH"
"COBD"
"COBD"
"BACH"
"BABD"
"COBD"
"COBD"
"COCH"
"AN@@"
"@@@@"
"@@@@")

(RPAQ SlideProjectorNextButtonBM (READBITMAP))
(16 14
"@@@@"
"@@@@"
"AN@@"
"COCL"
"COB@"
"COB@"
"COCH"
"COB@"
"COB@"
"COB@"
"COB@"
"AN@@"
"@@@@"
"@@@@")

(RPAQ SlideProjectorIcon (READBITMAP))
(85 69
"@@@@@@@@AOOOOO@@@@@@@@@@"
"@@@@@@@@FHBAAAO@@@@@@@@@"
"@@@@@@@ALDCAACAL@@@@@@@@"
"@@@@@@@F@GOOONCG@@@@@@@@"
"@@@@@@@OOOOOOONAH@@@@@@@"
"@@@@@@A@GOOOOONGL@@@@@@@"
"@@@@@@C@OOOOOOOHL@@@@@@@"
"@@@@@@COOOOOOOOHD@@@@@@@"
"@@@@@@F@OOOOOOOOL@@@@@@@"
"@@@@@@FCOOOOOOOHD@@@@@@@"
"@@@@@@GNCOOOOOO@L@@@@@@@"
"@@@@@@EHGOOOOOLOL@@@@@@@"
"@@@@@@ENLCOOOOHID@@@@@@@"
"@@@@@@ECLFDDDDOIG@@@@@@@"
"@@@@@AMBGLDDDDLIGH@@@@@@"
"@@@@AOEBDGOOOODIFL@@@@@@"
"@@@@O@EBDDDDDDDIFF@@@@@@"
"@@@CH@EBDDDDDDDIFC@@@@@@"
"@@@GH@EBDDDDDDDIDAH@@@@@"
"@@@FL@EBDDDDDDDID@H@@@@@"
"@@@MF@EBDDDDDDDID@L@@@@@"
"@@@JK@GBDDDDDDDIL@F@@@@@"
"@@@MEHANDDDDDDDKHCN@@@@@"
"@@@JJL@GLDDDDDELAOO@@@@@"
"@@@MEF@@OLDDDENAONA@@@@@"
"@@@JJK@@@OOOON@OO@A@@@@@"
"@@@MEEH@@@@@@@OO@CA@@@@@"
"@@@JJJL@@@@@@GOHAMA@@@@@"
"@@@MEEF@@@@@GOHANAA@@@@@"
"@@@JJJK@@@@COL@N@AA@@@@@"
"@@@MEEEH@@COL@O@NAA@@@@@"
"@@@JJJJL@AON@@HCNAA@@@@@"
"@@@MEEEFAON@@@HC@AA@@@@@"
"@@@JJJJKOO@@@@H@@AA@@@@@"
"@@@MEEEEO@@@@@H@@AA@@@@@"
"@@@JJJJK@AOH@@H@@AA@@@@@"
"@@@MEEEE@CON@@H@@AA@@@@@"
"@@@FJJJK@GOO@@H@@AA@@@@@"
"@@@CEEEE@OOOH@H@@CA@@@@@"
"@@@AJJJK@OOOL@H@ALA@@@@@"
"@@@@MEEEAOOON@HAN@A@@@@@"
"@@@@FJJKAOL@C@HN@@O@@@@@"
"@@@@CEEEAOH@AHO@@OO@@@@@"
"@@@@AJJKAO@GHH@@GOH@@@@@"
"@@@@@MEEANAOLH@GOH@@@@@@"
"@@@@@FJKANCONDCOL@@@@@@@"
"@@@@@CEEANCOFOOL@@@@@@@@"
"@@@@@AJKANGOBON@@@@@@@@@"
"@@@@@@ME@NGNBN@@@@@@@@@@"
"@@@@@@FK@NGLFH@@@@@@@@@@"
"@@@@@@CE@GF@DH@@@@@@@@@@"
"@@@@@@AK@GF@MH@@@@@@@@@@"
"@@@@@@@MOOCAIH@@@@@@@@@@"
"@@@@@@@COOIOC@@@@@@@@@@@"
"OOOOOOOOOOHNGOOOOOOOOH@@"
"L@@@@@@@@AN@L@@@@@@@AH@@"
"H@@@@@@@@@CO@@@@@@@@@H@@"
"H@@@@@@@@@@@@@@@@@@@@H@@"
"H@@@@@@@@@@@@@@@@@@@@H@@"
"H@@@@@@@@@@@@@@@@@@@@H@@"
"H@@@@@@@@@@@@@@@@@@@@H@@"
"H@@@@@@@@@@@@@@@@@@@@H@@"
"H@@@@@@@@@@@@@@@@@@@@H@@"
"H@@@@@@@@@@@@@@@@@@@@H@@"
"H@@@@@@@@@@@@@@@@@@@@H@@"
"H@@@@@@@@@@@@@@@@@@@@H@@"
"H@@@@@@@@@@@@@@@@@@@@H@@"
"L@@@@@@@@@@@@@@@@@@@AH@@"
"OOOOOOOOOOOOOOOOOOOOOH@@")

(RPAQ SlideProjectorIconMask (READBITMAP))
(85 69
"@@@@@@@@AOOOOO@@@@@@@@@@"
"@@@@@@@@GOOOOOO@@@@@@@@@"
"@@@@@@@AOOOOOOOL@@@@@@@@"
"@@@@@@@GOOOOOOOO@@@@@@@@"
"@@@@@@@OOOOOOOOOH@@@@@@@"
"@@@@@@AOOOOOOOOOL@@@@@@@"
"@@@@@@COOOOOOOOOL@@@@@@@"
"@@@@@@COOOOOOOOOL@@@@@@@"
"@@@@@@GOOOOOOOOOL@@@@@@@"
"@@@@@@GOOOOOOOOOL@@@@@@@"
"@@@@@@GOOOOOOOOOL@@@@@@@"
"@@@@@@GOOOOOOOOOL@@@@@@@"
"@@@@@@GOOOOOOOOOL@@@@@@@"
"@@@@@@GOOOOOOOOOO@@@@@@@"
"@@@@@AOOOOOOOOOOOH@@@@@@"
"@@@@AOOOOOOOOOOOOL@@@@@@"
"@@@@OOOOOOOOOOOOON@@@@@@"
"@@@COOOOOOOOOOOOOO@@@@@@"
"@@@GOOOOOOOOOOOOOOH@@@@@"
"@@@GOOOOOOOOOOOOOOH@@@@@"
"@@@OOOOOOOOOOOOOOOL@@@@@"
"@@@OOOOOOOOOOOOOOON@@@@@"
"@@@OOOOOOOOOOOOOOON@@@@@"
"@@@OOOOOOOOOOOOOOOO@@@@@"
"@@@OOOOOOOOOOOOOOOO@@@@@"
"@@@OOOOOOOOOOOOOOOO@@@@@"
"@@@OOOOOOOOOOOOOOOO@@@@@"
"@@@OOOOOOOOOOOOOOOO@@@@@"
"@@@OOOOOOOOOOOOOOOO@@@@@"
"@@@OOOOOOOOOOOOOOOO@@@@@"
"@@@OOOOOOOOOOOOOOOO@@@@@"
"@@@OOOOOOOOOOOOOOOO@@@@@"
"@@@OOOOOOOOOOOOOOOO@@@@@"
"@@@OOOOOOOOOOOOOOOO@@@@@"
"@@@OOOOOOOOOOOOOOOO@@@@@"
"@@@OOOOOOOOOOOOOOOO@@@@@"
"@@@OOOOOOOOOOOOOOOO@@@@@"
"@@@GOOOOOOOOOOOOOOO@@@@@"
"@@@COOOOOOOOOOOOOOO@@@@@"
"@@@AOOOOOOOOOOOOOOO@@@@@"
"@@@@OOOOOOOOOOOOOOO@@@@@"
"@@@@GOOOOOOOOOOOOOO@@@@@"
"@@@@COOOOOOOOOOOOOO@@@@@"
"@@@@AOOOOOOOOOOOOOH@@@@@"
"@@@@@OOOOOOOOOOOOH@@@@@@"
"@@@@@GOOOOOOOOOOL@@@@@@@"
"@@@@@COOOOOOOOOL@@@@@@@@"
"@@@@@AOOOOOOOON@@@@@@@@@"
"@@@@@@OOOOOOON@@@@@@@@@@"
"@@@@@@GOOOOOOH@@@@@@@@@@"
"@@@@@@COOOOOOH@@@@@@@@@@"
"@@@@@@AOOOOOOH@@@@@@@@@@"
"@@@@@@@OOOOOOH@@@@@@@@@@"
"@@@@@@@GOOOOO@@@@@@@@@@@"
"OOOOOOOOOOOOOOOOOOOOOH@@"
"OOOOOOOOOOOOOOOOOOOOOH@@"
"OOOOOOOOOOOOOOOOOOOOOH@@"
"OOOOOOOOOOOOOOOOOOOOOH@@"
"OOOOOOOOOOOOOOOOOOOOOH@@"
"OOOOOOOOOOOOOOOOOOOOOH@@"
"OOOOOOOOOOOOOOOOOOOOOH@@"
"OOOOOOOOOOOOOOOOOOOOOH@@"
"OOOOOOOOOOOOOOOOOOOOOH@@"
"OOOOOOOOOOOOOOOOOOOOOH@@"
"OOOOOOOOOOOOOOOOOOOOOH@@"
"OOOOOOOOOOOOOOOOOOOOOH@@"
"OOOOOOOOOOOOOOOOOOOOOH@@"
"OOOOOOOOOOOOOOOOOOOOOH@@"
"OOOOOOOOOOOOOOOOOOOOOH@@")

(RPAQ EmptySlideProjectorIcon (READBITMAP))
(68 54
"@@@@@@@@@@@@@@@@@@@@"
"@@@@@@@@@@@@@@@@@@@@"
"@@@@@@@@@COON@@@@@@@"
"@@@@@@@@AN@@AH@@@@@@"
"@@@@@@@AO@@@@L@@@@@@"
"@@@@@@@O@@@@@F@@@@@@"
"@@@@@AOH@@@@@C@@@@@@"
"@@@@@O@@@@@@@AH@@@@@"
"@@@@OHAOOOON@@L@@@@@"
"@@@GHAOH@@@CN@F@@@@@"
"@@GL@O@@@@@@CHC@@@@@"
"@CL@GH@BDIB@@LAH@@@@"
"@N@@L@@@@@@@@G@L@@@@"
"AN@AH@@HOOA@@A@F@@@@"
"AK@A@@@HOOA@@@HB@@@@"
"CEHA@@@@@@@@@A@C@@@@"
"BJL@L@@BDIB@@A@AH@@@"
"CEF@GH@@@@@@@N@OH@@@"
"BJK@AO@@@@@@G@GOL@@@"
"CEEH@COH@@@OHGOHD@@@"
"BJJL@@AOOOOHCOL@D@@@"
"CEEF@@@@@@@COL@LD@@@"
"BJJK@@@@@@AON@GDD@@@"
"CEEEH@@@@AON@GHDD@@@"
"BJJJL@@@@OO@CH@DD@@@"
"CEEEF@@@OO@CLCHDD@@@"
"BJJJK@@GOH@B@OHDD@@@"
"CEEEEHGOH@@B@L@DD@@@"
"BJJJJOOL@@@B@@@DD@@@"
"CEEEEGL@@@@B@@@DD@@@"
"BJJJJL@GN@@B@@@DD@@@"
"CEEEED@OOH@B@@@DD@@@"
"AJJJJLAOOL@B@@@DD@@@"
"@MEEEDCOON@B@@@LD@@@"
"@FJJJLCOOO@B@@G@D@@@"
"@CEEEDGOOOHB@GH@D@@@"
"@AJJJLGO@@LBCH@CL@@@"
"@@MEEDGN@@FCL@COL@@@"
"@@FJJLGLANB@@AON@@@@"
"@@CEEDGHGOB@AON@@@@@"
"@@AJJLGHOOI@OO@@@@@@"
"@@@MEDGHOMKOO@@@@@@@"
"@@@FJLGIOLKOH@@@@@@@"
"@@@CEDCIOHKH@@@@@@@@"
"@@@AJLCIOAJ@@@@@@@@@"
"@@@@MDAMHAB@@@@@@@@@"
"@@@@FLAMHCF@@@@@@@@@"
"@@@@CGOLLFF@@@@@@@@@"
"@@@@AONNOLL@@@@@@@@@"
"@@@@@@@BCIH@@@@@@@@@"
"@@@@@@@CHC@@@@@@@@@@"
"@@@@@@@@OL@@@@@@@@@@"
"@@@@@@@@@@@@@@@@@@@@"
"@@@@@@@@@@@@@@@@@@@@")

(RPAQ EmptySlideProjectorIconMask (READBITMAP))
(68 54
"@@@@@@@@@@@@@@@@@@@@"
"@@@@@@@@@@@@@@@@@@@@"
"@@@@@@@@@COON@@@@@@@"
"@@@@@@@@AOOOOH@@@@@@"
"@@@@@@@AOOOOOL@@@@@@"
"@@@@@@@OOOOOON@@@@@@"
"@@@@@AOOOOOOOO@@@@@@"
"@@@@@OOOOOOOOOH@@@@@"
"@@@@OOOOOOOOOOL@@@@@"
"@@@GOOOOOOOOOON@@@@@"
"@@GOOOOOOOOOOOO@@@@@"
"@COOOOOOOOOOOOOH@@@@"
"@OOOOOOOOOOOOOOL@@@@"
"AOOOOOOOOOOOOOON@@@@"
"AOOOOOOOOOOOOOON@@@@"
"COOOOOOOOOOOOOOO@@@@"
"COOOOOOOOOOOOOOOH@@@"
"COOOOOOOOOOOOOOOH@@@"
"COOOOOOOOOOOOOOOL@@@"
"COOOOOOOOOOOOOOOL@@@"
"COOOOOOOOOOOOOOOL@@@"
"COOOOOOOOOOOOOOOL@@@"
"COOOOOOOOOOOOOOOL@@@"
"COOOOOOOOOOOOOOOL@@@"
"COOOOOOOOOOOOOOOL@@@"
"COOOOOOOOOOOOOOOL@@@"
"COOOOOOOOOOOOOOOL@@@"
"COOOOOOOOOOOOOOOL@@@"
"COOOOOOOOOOOOOOOL@@@"
"COOOOOOOOOOOOOOOL@@@"
"COOOOOOOOOOOOOOOL@@@"
"COOOOOOOOOOOOOOOL@@@"
"AOOOOOOOOOOOOOOOL@@@"
"@OOOOOOOOOOOOOOOL@@@"
"@GOOOOOOOOOOOOOOL@@@"
"@COOOOOOOOOOOOOOL@@@"
"@AOOOOOOOOOOOOOOL@@@"
"@@OOOOOOOOOOOOOOL@@@"
"@@GOOOOOOOOOOOON@@@@"
"@@COOOOOOOOOOON@@@@@"
"@@AOOOOOOOOOOO@@@@@@"
"@@@OOOOOOOOOO@@@@@@@"
"@@@GOOOOOOOOH@@@@@@@"
"@@@COOOOOOOH@@@@@@@@"
"@@@AOOOOOON@@@@@@@@@"
"@@@@OOOOOON@@@@@@@@@"
"@@@@GOOOOON@@@@@@@@@"
"@@@@COOOOON@@@@@@@@@"
"@@@@AONOOOL@@@@@@@@@"
"@@@@@@@COOH@@@@@@@@@"
"@@@@@@@COO@@@@@@@@@@"
"@@@@@@@@OL@@@@@@@@@@"
"@@@@@@@@@@@@@@@@@@@@"
"@@@@@@@@@@@@@@@@@@@@")

(RPAQ ProjectionScreenIcon (READBITMAP))
(38 53
"@@@@@@@@@@@@"
"@@@@@@@@@@@@"
"@@@AOL@@@@@@"
"@@@AHL@@@@@@"
"COOOOOOOO@@@"
"B@@@@@@@A@@@"
"B@@@@@@@A@@@"
"B@@@@@@@A@@@"
"B@@@@@@@A@@@"
"B@@@@@@@A@@@"
"BANHA@@@A@@@"
"BABHA@@@A@@@"
"BA@JA@@@A@@@"
"BA@HAGKLA@@@"
"BANJODJ@A@@@"
"B@BJIGKLA@@@"
"B@BJID@DA@@@"
"BABJIDJDA@@@"
"BANJOGKLA@@@"
"B@@@@@@@A@@@"
"B@@@@@@@A@@@"
"B@@@@@@@A@@@"
"B@@@@@@@A@@@"
"B@@@@@@@A@@@"
"B@@@@@@@A@@@"
"COOOOOOOO@@@"
"COOOOOOOO@@@"
"COOOOOOOO@@@"
"@@@@B@@@@@@@"
"@@@@B@@@@@@@"
"@@@@B@@@@@@@"
"@@@@B@@@@@@@"
"@@@@B@@@@@@@"
"@@@@B@@@@@@@"
"@@@@B@@@@@@@"
"@@@@B@@@@@@@"
"@@@@G@@@@@@@"
"@@@@OH@@@@@@"
"@@@AOL@@@@@@"
"@@@CFF@@@@@@"
"@@@FFC@@@@@@"
"@@@LFAH@@@@@"
"@@AHF@L@@@@@"
"@@C@F@F@@@@@"
"@@F@F@C@@@@@"
"@@L@F@AH@@@@"
"@AH@F@@L@@@@"
"@C@@F@@F@@@@"
"@F@@F@@C@@@@"
"@L@@F@@AH@@@"
"AH@@F@@@L@@@"
"@@@@@@@@@@@@"
"@@@@@@@@@@@@")

(RPAQ ProjectionScreenIconMask (READBITMAP))
(38 53
"@@@@@@@@@@@@"
"@@@@@@@@@@@@"
"@@@AOL@@@@@@"
"@@@AOL@@@@@@"
"COOOOOOOO@@@"
"COOOOOOOO@@@"
"COOOOOOOO@@@"
"COOOOOOOO@@@"
"COOOOOOOO@@@"
"COOOOOOOO@@@"
"COOOOOOOO@@@"
"COOOOOOOO@@@"
"COOOOOOOO@@@"
"COOOOOOOO@@@"
"COOOOOOOO@@@"
"COOOOOOOO@@@"
"COOOOOOOO@@@"
"COOOOOOOO@@@"
"COOOOOOOO@@@"
"COOOOOOOO@@@"
"COOOOOOOO@@@"
"COOOOOOOO@@@"
"COOOOOOOO@@@"
"COOOOOOOO@@@"
"COOOOOOOO@@@"
"COOOOOOOO@@@"
"COOOOOOOO@@@"
"COOOOOOOO@@@"
"@@@@G@@@@@@@"
"@@@@G@@@@@@@"
"@@@@G@@@@@@@"
"@@@@G@@@@@@@"
"@@@@G@@@@@@@"
"@@@@G@@@@@@@"
"@@@@G@@@@@@@"
"@@@@G@@@@@@@"
"@@@@OH@@@@@@"
"@@@AOL@@@@@@"
"@@@CON@@@@@@"
"@@@GOO@@@@@@"
"@@@OOGH@@@@@"
"@@ANOCL@@@@@"
"@@CLOAN@@@@@"
"@@GHO@O@@@@@"
"@@O@O@GH@@@@"
"@AN@O@CL@@@@"
"@CL@O@AN@@@@"
"@GH@O@@O@@@@"
"@O@@O@@GH@@@"
"AN@@O@@CL@@@"
"CL@@O@@AN@@@"
"@@@@@@@@@@@@"
"@@@@@@@@@@@@")

(RPAQ RolledUpScreenIcon (READBITMAP))
(35 49
"@@@GO@@@@@@@"
"@@@FC@@@@@@@"
"@@@GH@@@@@@@"
"@@@AH@@@@@@@"
"@@@AH@@@@@@@"
"@@@AH@@@@@@@"
"@@@AH@@@@@@@"
"@@@AH@@@@@@@"
"EEAAHBBJH@@@"
"@@@AH@@@@@@@"
"@@@AH@@@@@@@"
"OOOOOOOON@@@"
"H@@@@@@@B@@@"
"H@@@@@@@B@@@"
"ILFDD@IFB@@@"
"IBIDD@IEB@@@"
"IBIDD@IEB@@@"
"INIDDNIFB@@@"
"IDIDD@IDB@@@"
"IBIDD@IDB@@@"
"IBFGG@FDB@@@"
"H@@@@@@@B@@@"
"H@@@@@@@B@@@"
"OOOOOOOON@@@"
"OOOOOOOON@@@"
"OOOOOOOON@@@"
"@@@AH@@@@@@@"
"@@@AH@@@@@@@"
"@@@AH@@@@@@@"
"@@@AH@@@@@@@"
"@@@AH@@@@@@@"
"@@@AH@@@@@@@"
"@@@AH@@@@@@@"
"@@@AH@@@@@@@"
"@@@AL@@@@@@@"
"@@@CN@@@@@@@"
"@@@GO@@@@@@@"
"@@@MIH@@@@@@"
"@@AIHL@@@@@@"
"@@CAHF@@@@@@"
"@@FAHC@@@@@@"
"@@LAHAH@@@@@"
"@AHAH@L@@@@@"
"@C@AH@F@@@@@"
"@F@AH@C@@@@@"
"@L@AH@AH@@@@"
"AH@AH@@L@@@@"
"C@@AH@@F@@@@"
"F@@AH@@C@@@@")

(RPAQ RolledUpScreenMask (READBITMAP))
(35 49
"@@@OOH@@@@@@"
"@@@OO@@@@@@@"
"@@@OL@@@@@@@"
"@@@GL@@@@@@@"
"@@@CL@@@@@@@"
"@@@CL@@@@@@@"
"@@@CL@@@@@@@"
"@@@CL@@@@@@@"
"EEACLBBJH@@@"
"@@@CL@@@@@@@"
"@@@CL@@@@@@@"
"OOOOOOOON@@@"
"OOOOOOOON@@@"
"OOOOOOOON@@@"
"OOOOOOOON@@@"
"OOOOOOOON@@@"
"OOOOOOOON@@@"
"OOOOOOOON@@@"
"OOOOOOOON@@@"
"OOOOOOOON@@@"
"OOOOOOOON@@@"
"OOOOOOOON@@@"
"OOOOOOOON@@@"
"OOOOOOOON@@@"
"OOOOOOOON@@@"
"OOOOOOOON@@@"
"@@@CL@@@@@@@"
"@@@CL@@@@@@@"
"@@@CL@@@@@@@"
"@@@CL@@@@@@@"
"@@@CL@@@@@@@"
"@@@CL@@@@@@@"
"@@@CL@@@@@@@"
"@@@CL@@@@@@@"
"@@@CL@@@@@@@"
"@@@CO@@@@@@@"
"@@@OOH@@@@@@"
"@@AOOL@@@@@@"
"@@COMN@@@@@@"
"@@GKLO@@@@@@"
"@@OCLGH@@@@@"
"@ANCLCL@@@@@"
"@CLCLAN@@@@@"
"@GHCL@O@@@@@"
"@O@CL@GH@@@@"
"AN@CL@CL@@@@"
"CL@CL@AN@@@@"
"GH@CL@@O@@@@"
"G@@CL@@GH@@@")
(DECLARE: DOEVAL@COMPILE DONTCOPY

(GLOBALVARS SlideProjectorBackButtonBM SlideProjectorNextButtonBM SlideProjectorIcon 
	    SlideProjectorIconMask EmptySlideProjectorIcon EmptySlideProjectorIconMask 
	    ProjectionScreenIcon ProjectionScreenIconMask RolledUpScreenIcon RolledUpScreenMask)
)
(* * Big pointers)

(FILESLOAD (SYSLOAD FROM LISPUSERS)
	   ANIMATE)
(DECLARE: DOEVAL@COMPILE DONTCOPY

(GLOBALVARS Hand HandShadow BigArrowIcon BigArrowShadow)
)
(* * Initialization)

(InitSlideProjector)
(PUTPROPS SLIDEPROJECTOR COPYRIGHT ("Xerox Corporation" 1985 1986))
(DECLARE: DONTCOPY
  (FILEMAP (NIL (2983 43445 (CacheSlide 2993 . 5065) (CreateSlideProjector 5067 . 9838) (
InitSlideProjector 9840 . 15070) (LoadedProjectorRightButtonFn 15072 . 15673) (
ProjectionScreenButtonEventFn 15675 . 16037) (ProjectorIconButtonEventFn 16039 . 17905) (
ReshapeSlideProjectors 17907 . 23392) (ShapeWindowToMaxSize 23394 . 23810) (ShowSlideFile 23812 . 
27055) (SlideProjectorButtonPushed 27057 . 34031) (SlideRandAccessMenuFn 34033 . 34472) (
SlideScreenCloseFn 34474 . 35296) (SlideScreenOpenFn 35298 . 37447) (SlideTitle 37449 . 39400) (
UpdateSlideProjectorTitleWindow 39402 . 41194) (ViewParticularSlide 41196 . 43443)))))
STOP