#lang racket/gui

;;; api1.rkt - Presentation de resultats de calcul (page 319)
;;; Chapitre 14 (Objets et API graphique)
;;; Livre PCPS : "Premiers Cours de Programmation avec Scheme"
;;; Langage determine par le source

(define FRAME (new frame% (label "Factorielle")))

(define VPANEL (new vertical-panel%
                    (parent FRAME)
                    (alignment '(left center))))

(define TEXT-FIELD (new text-field% 
                        (parent VPANEL) 
                        (label "Valeur de n : ")
                        (min-width 140)
                        (init-value "0")
                        (stretchable-width #f)
                        (callback (lambda (obj evt)
                                    (when (equal? (send evt get-event-type) 'text-field-enter)
                                      (let ((n (string->number (send TEXT-FIELD get-value))))
                                        (send MSG set-label 
                                              (format "Factorielle : ~a" (fac n)))))))))

(define MSG (new message% 
                 (parent VPANEL) 
                 (label "Factorielle : 1")
                 (min-width 500)))

(define HPANEL (new horizontal-panel% 
                 (parent VPANEL) 
                 (alignment '(center center))))

(define BUTTON 
  (new button% 
     (parent HPANEL) 
     (label "Random")
     (callback (lambda (obj evt)       ; ici obj et evt ne sont pas utilisés !
                 (let ((n (random 41)))    ; n dans [0,40]
                   (send TEXT-FIELD set-value (number->string n))
                   (send MSG set-label 
                     (format "Factorielle : ~a" (fac n))))))))

(define (fac n)
  (apply * (build-list n add1)))

(send FRAME show #t)

