;; ;; form.scm ;; ;; Interface and support functions for forminput.c ; (form-ask-for-str prompt value) ; Does the same as the C implementation of ask-for-str (define (form-ask-for-str prompt value) (form-begin) (form-label prompt) (form-newline) (form-text "text") (form-property XtNwidth 400) (form-property XtNstring value) (form-newline) (form-okbutton "OK") (form-property XtNwidth 80) (form-cancelbutton "Cancel") (form-property XtNwidth 80) (cdr (assoc "text" (form-end)))) ; (form-properties property value property value ...) ; Set properties for the most recently added control (define (form-properties . plist) (while plist (form-property (car plist) (cadr plist)) (set! plist (cddr plist)))) ; A simple example (define (form-test) (form-begin) (form-label "Enter user data") (form-newline) (form-label "First name") (form-properties XtNwidth 100 XtNshadowWidth 1) (form-text "First name") (form-properties XtNwidth 200 XtNstring "Ulric") (form-newline) (form-label "Last name") (form-properties XtNwidth 100 XtNshadowWidth 1) (form-text "Last name") (form-properties XtNwidth 200 XtNstring "Eriksson") (form-newline) (form-label "Address") (form-properties XtNwidth 100 XtNshadowWidth 1) (form-text "Address") (form-properties XtNwidth 200 XtNstring "Balders Hage 27") (form-newline) (form-okbutton "OK") (form-property XtNwidth 80) (form-cancelbutton "Cancel") (form-property XtNwidth 80) (form-end)) ; (form-withprompt prompt value width) ; A convenience function to create a label followed by a text field (define (form-withprompt prompt value width) (form-label prompt) (form-properties XtNshadowWidth 1) (form-text prompt) (form-properties XtNwidth width XtNstring value)) ; Create input field with a label and a text field with default value (define (input-field label w1 text w2 default) (form-label label) (form-properties XtNwidth w1) (form-text text) (form-properties XtNwidth w2 XtNstring (if (number? default) (number->string default) default)) (form-newline)) ; s is a tag ; n is an associative list: ((tag . value) (tag . value) (tag . value)) ; returns value as a number, converts string if necessary (define (extract-number s n) (let ((x (cdr (assoc s n)))) (if (number? x) x (string->number x)))) (define (extract-string s n) (let ((x (cdr (assoc s n)))) (if (number? x) (number->string x) x))) ; Another example (define (form-test2) (form-begin) (form-withprompt "Förnamn" "Ulric" 100) (form-withprompt "Efternamn" "Eriksson" 200) (form-newline) (form-withprompt "Gatuadress" "Balders Hage" 200) (form-withprompt "Nummer" "27" 100) (form-newline) (form-withprompt "Postnummer" "610 71" 100) (form-withprompt "Postadress" "Vagnhärad" 200) (form-newline) (form-withprompt "Land" "SWEDEN" 100) (form-newline) (form-okbutton "OK") (form-property XtNwidth 80) (form-cancelbutton "Cancel") (form-property XtNwidth 80) (form-end)) ; (form-record name name ...) ; Creates a form with one label and one text field per line (define (form-record . elist) (form-begin) (while elist (form-label (car elist)) (form-properties XtNwidth 120 XtNshadowWidth 1) (form-text (car elist)) (form-properties XtNwidth 300) (form-newline) (set! elist (cdr elist))) (form-okbutton "OK") (form-property XtNwidth 80) (form-cancelbutton "Cancel") (form-property XtNwidth 80) (form-end)) ; Yet another example (define (form-test3) (form-record "Förnamn" "Efternamn" "Gatuadress" "Nummer" "Postnummer" "Postadress")) (define (form-test4) (form-begin) (form-menu "Choose colour") (form-property XtNwidth 120) (form-menuentry "Red") (form-menuentry "Orange") (form-menuentry "Green") (form-menuentry "Cyan") (form-menuentry "Black") (form-menuentry "White") (form-menuentry "Yellow") (form-newline) (form-okbutton "OK") (form-property XtNwidth 80) (form-cancelbutton "Cancel") (form-property XtNwidth 80) (form-end)) (define (form-test4) (form-begin) (form-label "Enter text") (form-newline) (form-text "test4") (form-properties) (form-newline) (form-okbutton "OK") (form-property XtNwidth 80) (form-cancelbutton "Cancel") (form-property XtNwidth 80) (form-end))