(module initial-ones mzscheme
  ;; Instead of using the "slideshow.ss" language module,
  ;;  we can use mzscheme and import "slide.ss"
  (require (lib "slide.ss" "fta" "slideshow")
	   (lib "code.ss" "fta" "slideshow")
	   (all-except (lib "mred.ss" "mred") send-event)
	   (lib "class.ss")
	   (lib "etc.ss"))

  (provide do-initial-slides)

  (define (do-initial-slides)
       "Title Slide"
       (titlet "Slideshow Tutorial")
	(bitmap (build-path (collection-path "icons") "PLT-206.png")))
       (colorize (it "Press the spacebar to continue") blue)
       (comment "Welcome to Slideshow"))

       "About Slideshow"
       (page-para (bt "Slideshow")
		  "is a library for creating slide presentations")
       (page-item "A Slideshow presentation is a PLT Scheme program")
       (page-item "Instead of a WYSIWYG interface,"
		  "you get the power of Scheme"))
      (define (symbol n)
	(text (string (integer->char n)) 'symbol font-size))
      (define sym:rightarrow (symbol 174))
      (define sym:leftarrow (symbol 172))

      (define (meta key)
	(hbl-append (t "Alt-") 
		    (if (pict? key) key (tt key))
		    (t ", Cmd-") 
		    (if (pict? key) key (tt key))
		    (t ", or Meta-") 
		    (if (pict? key) key (tt key))))

       "How to Control this Viewer"
	(table 3
		(map (lambda (s)
		       (list (apply page-para* (car s)) (t ":") (t (cadr s))))
		     `(((,(meta "q")) "end show")
		       (("Esc") "if confirmed, end show")
		       ((,sym:rightarrow ", Space," ,(tt "f") "," ,(tt "n") ", or click") "next slide")
		       ((,sym:leftarrow ", Backspace, Delete, or" ,(tt "b")) "previous slide")
		       ((,(tt "g")) "last slide")
		       ((,(tt "1")) "first slide")
		       ((,(meta "g")) "select a slide")
		       ((,(meta "p")) "show/hide slide number")
		       ((,(meta "c")) "show/hide commentary")
		       ((,(meta "d")) "show/hide preview")
		       ((,(meta "m")) "show/hide mouse cursor")
		       ((,(hbl-append (t "Shift-") sym:rightarrow) ", etc.") "move window 1 pixel")
		       ((,(meta sym:rightarrow) ", etc.") "move window 10 pixels"))))
	       lbl-superimpose lbl-superimpose
	       gap-size (/ gap-size 2))
       (comment "This window shows comments for each slide. "
		"The comments are typically fill in the details of what "
		"the slide presenter says when giving the talk."))

      (define mytalk.scm (tt "mytalk.scm"))

       "Slideshow Programs"
       (page-para "A Slideshow program has the form")
	(code (module mytalk (lib "slideshow.ss" "fta" "slideshow")
		... #,(it "code to generate slide content") ...))
       (page-para "in a file named" mytalk.scm)
       (colorize (hline (* 3/4 client-w) gap-size) "green")
       (list (list (page-para "To run a Slideshow program,")
		   (page-item "Double-click the" (bt "Slideshow") "executable or run" 
			      (tt "slideshow") "on the command line")
		   (page-item "Click the" (bt "Open File...") "link and select the"
			      "Slideshow program file, such as" mytalk.scm))
	     (list (page-para "Alternately, run a Slideshow program in DrScheme:")
		   (page-item "Open" mytalk.scm "in DrScheme")
		   (page-item "Select" (bt "Choose Language") "from the" (bt "Language") "menu")
		   (page-item "Choose the" (tt "(module ...)") "language")
		   (page-item "Click" (bt "Execute"))
		   (colorize (bt "Use DrScheme only if you trust the program") "red"))
	     (list (page-para (colorize (bt "Important security information:") "red"))
		   (page-item "A slideshow program has access to the"
			      (it "full") (it "Scheme") (it "language"))
		   (page-item "If you don't know the creator of a slide program"
			      "(or if you don't trust them), run the slides through the"
			      (bt "Slideshow") "executable or"
			      (tt "slideshow") "command line")
		     (ghost bullet)
		     "When run in" (bt "Slideshow") "instead of DrScheme,"
		     "a slide program cannot write files"
		     "or make network connections")
	     (list (page-para "When using a command line, you can specify the program directly:")
		   (hbl-append (tt "slideshow ") mytalk.scm)
		   (page-para "To print the talk:")
		   (hbl-append (tt "slideshow --print ") mytalk.scm)
		    (page-para/r (it "Run") (tt "slideshow --help") (it "for more options"))

      (define (sub-para . l)
	(colorize (apply para (* 3/4 client-w) l) "blue"))

       "Slides and Picts"
       (page-para "The body of a Slideshow program")
       (page-item/bullet (bt " 1.")
			 "Makes and combines" (hbl-append (bit "pict") (t "s")))
       (sub-para "For example,")
       (code (t "Hello"))
       (sub-para "creates a pict like this:")
       (colorize (t "Hello") "black")
       (page-item/bullet (bt " 2.") "Registers certain picts as slides")
       (sub-para "For example,")
       (code (slide (t "Hello")))
       (sub-para "registers a slide containing only" (colorize (t "Hello") "black")))

       "Slides versus Picts"
       (page-para "Technically, the pict concept comes from the"
		  (tt "\"texpict\"") "collection, and the"
		  (tt "\"slideshow\"") "collection builds on it")
       (page-item "The distinction between"
		  "Slideshow and texpict matters when you"
		  "use Help Desk to find information")
       (page-item "For now, we ignore the distinction"))

       "The Rest of the Tutorial"
       (page-para "The rest of this tutorial (starting with the next slide) is meant to"
		  "be viewed while reading the program source")
       (page-para "The source is")
       (let ([s (path->string (build-path (this-expression-source-directory) "tutorial-show.ss"))])
	   (let ([p (tt s)])
	      (place-over p 0 (pict-height p)
			  (linewidth 2 (hline (pict-width p) 2)))
	   (min 1 (/ (* 0.8 client-w ) (pict-width (tt s)))))
	  (lambda ()
	    (let* ([f (new frame% 
			   [label "tutorial-show.ss"]
			   [width 600]
			   [height 400])]
		   [e (new text%)]
		   [c (new editor-canvas% 
			   [parent f]
			   [editor e])])
	      (send e load-file s)
	      (send e change-style 
		    (make-object style-delta% 'change-family 'modern)
		    0 'end)
	      (send f show #t))))))