#lang racket/base
(require racket/class
racket/list
mrlib/name-message
framework)
(provide button-with-alternatives%)
(define button-with-alternatives%
(class name-message%
(init-field parent)
(init-field choices-thunk)
(define currently-selected
(let ([choices (choices-thunk)])
(cond
[(empty? choices)
#f]
[else
(first (choices-thunk))])))
(define/public (get-selection)
currently-selected)
(define/public (get-choices)
(choices-thunk))
(define/override (fill-popup menu reset)
(for ([ch (choices-thunk)])
(make-menu-item menu ch)))
(define (make-menu-item menu ch)
(define item
(new (if (and currently-selected
(string=? ch currently-selected))
menu:can-restore-checkable-menu-item%
menu:can-restore-menu-item%)
[label (gui-utils:quote-literal-label ch)]
[parent menu]
[callback (lambda (menu-item control-event)
(set! currently-selected ch))]))
(when (string=? ch currently-selected)
(send item check #t))
item)
(super-new [parent parent]
[label ""])))