; GUI Demo
(define (go)
  (set! *resdb*
    (dm-open-db "GUIdemo" 1))
  (frm-popup 10 1777 
    (let ((f 1000)) 
      (lambda (e . a)
	(case e
	  ((frm-open)
		(ctl-set-val 1101 #t))
	  ((lst-select)
	    (fld-set-text 1002 
	    (lst-get-text 1100 (cadr a))))
	  ((timeout) 
	    (fld-set-text 1004
		(current-ticks)))
	  ((menu)
	      (case (car a)
		((2223)
		  (lst-set-sel 1100
		  (string->object
		    (fld-get-text 1001))))
		((2224)
		 (fld-set-text 1001
			(lst-get-sel 1100)))))
	  ((ctl-repeat)
	      (case (car a)
		((1600)
		  (sound (integer (set! f 
			(/ f 1.03))) 50) #f)
		((1601)
		  (sound (integer (set! f 
			(* f 1.03))) 50) #f)))
	  ((ctl-select)
	      (case (car a)
		((1801) (scroller))
		((1900)
		  (fld-set-text 1002 
			(fld-get-text 1001)))
		((1901)
		  (ctl-set-val 1102
		   (not (ctl-get-val 1102))))
		((1902)
		  (frm-return
			(fld-get-text 1002)))
		((1903)
		  (fld-set-text 1001
		    (nested)))
		((1101)
		  (frm-show 1903 (cadr a)))
		(else #f)))
	  ((pop-select) (write a) #f)
	  ((frm-close) (message "Bye")
		#f)
	  ((scl-repeat) (sound (+ 100 (* 100 (caddr a))) 50) #f)
	  (else #f))))))

(define (nested)
  (frm-popup 1888 
      (lambda (e . a)
	(case e
	  ((ctl-select)
	      (case (car a)
		((1001) (frm-return
			(fld-get-text 1000)))
		((1002) (frm-return 42))))
	  (else #f)))))

(define (chain . hs)
  (lambda a
    (if (null? hs) #f
      (or (apply (car hs) a)
	(apply (apply chain (cdr hs))
		     a)))))

(define (scroller)
  (frm-popup 1666 (chain
    (scroll-handler 2000 2050)
    (scroll-handler 2100 2150)
      (lambda (e . a)
	(case e
	  ((frm-open)
		(fld-set-text 2000
		"The quick brown fox jumped over the lazy dog.")
		(fld-set-text 2100
		"Ein Neger mit Gazelle zagt im Regen nie."))
	  ((ctl-select) (frm-return #n))
	  (else #f))))))

; a generic scroll handler
(define (scroll-handler fld-id scl-id)
  (define (max a b) (if (>= a b) a b))
  (define (update-scroll) 
    (let ((p (fld-get-scroll fld-id)))
      (scl-set-val scl-id (list (car p)
	0 (max 0 (- (cadr p) (caddr p)))
	(caddr p)))))
  (lambda (event . args)
    (case event
      ((key-down) 
	(if (eq? fld-id (frm-get-focus))
	  (begin
	    (case (car args)
	      ((##0b) ; hw up button
		(fld-scroll fld-id -1))
	      ((##0c) ; hw down button
		(fld-scroll fld-id 1))
	      (else #n))
	    (update-scroll) #f)
	  #f))
      ((scl-repeat) 
	(if (eq? scl-id (car args))
	   (fld-scroll fld-id 
	       (- (cadr args) (caddr args))) 
	    #f)
	#f) ; to make repeat work
      ((fld-changed) 
	(if (eq? fld-id (car args))
	  (update-scroll)
	  #f))
      (else #f))))
