allow radio-box% to have no selected buttons

svn: r17865
This commit is contained in:
Matthew Flatt 2010-01-28 17:51:30 +00:00
parent e1f931038d
commit a09e671f34
15 changed files with 64 additions and 37 deletions

View File

@ -117,7 +117,7 @@
(unless (and (integer? i) (exact? i) (not (negative? i)))
(raise-type-error (who->name who)
(if false-ok?
"non-negative exact integeror #f"
"non-negative exact integer or #f"
"non-negative exact integer" )
i))))

View File

@ -264,40 +264,47 @@
(check-container-parent cwho parent)
(check-callback cwho callback)
(check-orientation cwho style)
(check-non-negative-integer cwho selection)))
(check-non-negative-integer/false cwho selection)))
(private-field
[wx #f])
(private
[check-button
(lambda (method n)
(check-non-negative-integer `(method radio-box% ,method) n)
(unless (< n (length chcs))
(raise-mismatch-error (who->name `(method radio-box% ,method)) "no such button: " n)))])
(lambda (method n false-ok?)
((if false-ok?
check-non-negative-integer/false
check-non-negative-integer)
`(method radio-box% ,method) n)
(when n
(unless (< n (length chcs))
(raise-mismatch-error (who->name `(method radio-box% ,method)) "no such button: " n))))])
(override
[enable (entry-point
(case-lambda
[(on?) (send wx enable on?)]
[(which on?) (check-button 'enable which)
[(which on?) (check-button 'enable which #f)
(send wx enable which on?)]))]
[is-enabled? (entry-point
(case-lambda
[() (send wx is-enabled?)]
[(which) (check-button 'is-enabled? which)
[(which) (check-button 'is-enabled? which #f)
(send wx is-enabled? which)]))])
(public
[get-number (lambda () (length chcs))]
[get-item-label (lambda (n)
(check-button 'get-item-label n)
(check-button 'get-item-label n #f)
(list-ref chcs n))]
[get-item-plain-label (lambda (n)
(check-button 'get-item-plain-label n)
(check-button 'get-item-plain-label n #f)
(wx:label->plain-label (list-ref chcs n)))]
[get-selection (entry-point (lambda () (send wx get-selection)))]
[get-selection (entry-point (lambda () (let ([v (send wx get-selection)])
(if (equal? v -1)
#f
v))))]
[set-selection (entry-point
(lambda (v)
(check-button 'set-selection v)
(send wx set-selection v)))])
(check-button 'set-selection v #t)
(send wx set-selection (or v -1))))])
(sequence
(as-entry
(lambda ()
@ -317,7 +324,7 @@
(length choices))
selection))))
label parent callback #f)))
(when (positive? selection)
(when (or (not selection) (positive? selection))
(set-selection selection)))))
(define slider%

View File

@ -203,7 +203,7 @@ information@|details|, even if the editor currently has delayed refreshing (see
monitor @|whatsit| changes.})
(define (MonitorCallbackX a b c d)
(MonitorMethod a b @elem{the @|d|callback procedure (provided as an initialization argument)} c))
(MonitorMethod a b @elem{the @|d| callback procedure (provided as an initialization argument)} c))
(define (MonitorCallback a b c)
(MonitorCallbackX a b c "control"))

View File

@ -28,7 +28,7 @@ Whenever the user changes the selected radio button, the radio box's
'vertical-label 'horizontal-label
'deleted))
'(vertical)]
[selection exact-nonnegative-integer? 0]
[selection (or/c exact-nonnegative-integer? #f) 0]
[font (is-a?/c font%) normal-control-font]
[enabled any/c #t]
[vert-margin (integer-in 0 1000) 2]
@ -64,8 +64,9 @@ The @scheme[style] argument must include either @scheme['vertical] for a
@HVLabelNote[@scheme[style]]{radio box} @DeletedStyleNote[@scheme[style] @scheme[parent]]{radio box}
By default, the first radio button is initially selected. If
@scheme[selection] is positive, it is passed to @method[radio-box%
set-selection] to set the initial radio button selection.
@scheme[selection] is positive or @scheme[#f], it is passed to
@method[radio-box% set-selection] to set the initial radio button
selection.
@FontKWs[@scheme[font]] @WindowKWs[@scheme[enabled]] @SubareaKWs[] @AreaKWs[]
@ -115,10 +116,10 @@ Returns the number of radio buttons in the radio box.
}
@defmethod[(get-selection)
exact-nonnegative-integer?]{
(or/c exact-nonnegative-integer? #f)]{
Gets the position of the selected radio button. Radio buttons are
numbered from @scheme[0].
Gets the position of the selected radio button, returning @scheme[#f]
if no button is selected. Radio buttons are numbered from @scheme[0].
}
@ -139,10 +140,11 @@ box, @|MismatchExn|.
}
@defmethod[(set-selection [n exact-nonnegative-integer?])
@defmethod[(set-selection [n (or/c exact-nonnegative-integer? #f)])
void?]{
Sets the selected radio button by position. (The control's callback
Sets the selected radio button by position, or deselects all radio
buttons if @scheme[n] is @scheme[#f]. (The control's callback
procedure is @italic{not} invoked.) Radio buttons are numbered from
@scheme[0]. If @scheme[n] is equal to or larger than the number of
radio buttons in the radio box, @|MismatchExn|.

View File

@ -1299,6 +1299,7 @@
(define mismatch-err (mk-err exn:fail:contract?))
(define do-sel (lambda (sel n) (for-each (lambda (rb) (sel rb (n rb))) rbs)))
(define sel-false (lambda (sel) (do-sel sel (lambda (rb) #f))))
(define sel-minus (lambda (sel) (do-sel (type-err sel) (lambda (rb) -1))))
(define sel-first (lambda (sel) (do-sel sel (lambda (rb) 0))))
(define sel-middle (lambda (sel) (do-sel sel (lambda (rb) (floor (/ (send rb get-number) 2))))))
@ -1311,7 +1312,9 @@
(make-object button% (format "Select First~a" title) hp2 (lambda (b e) (sel-first sel)))
(make-object button% (format "Select Middle ~a" title) hp2 (lambda (b e) (sel-middle sel)))
(make-object button% (format "Select Last~a" title) hp2 (lambda (b e) (sel-last sel)))
(make-object button% (format "Select N~a" title) hp2 (lambda (b e) (sel-N sel))))
(make-object button% (format "Select N~a" title) hp2 (lambda (b e) (sel-N sel)))
(when (equal? title "")
(make-object button% (format "Select #f~a" title) hp2 (lambda (b e) (sel-false sel)))))
(make-selectors "" normal-sel)
(make-selectors " by Simulate" simulate-sel)
(make-object button% "Check" p

View File

@ -1,3 +1,10 @@
Version 4.2.4.1
Changed radio-box% to allow #f as a selection so that no buttons are
selected
----------------------------------------------------------------------
Version 4.2.4, January 2010
Minor bug fixes

View File

@ -3,3 +3,6 @@
@MACRO RANGERET[p.rv] = if ((x<p> < 0) || (x<p> >= THISOBJECT->Number())) { READY_TO_RETURN; return <rv>; }
@MACRO RANGE[p] = $$RANGERET[<p>.scheme_void]
@MACRO RANGEXRET[p.rv] = if ((x<p> < -1) || (x<p> >= THISOBJECT->Number())) { READY_TO_RETURN; return <rv>; }
@MACRO RANGEX[p] = $$RANGEXRET[<p>.scheme_void]

View File

@ -251,6 +251,7 @@ static l_TYPE l_POINT *l_MAKE_ARRAY(Scheme_Object *l, l_INTTYPE *c, char *who)
class os_wxChoice : public wxChoice {
public:
Scheme_Object *callback_closure;

View File

@ -289,6 +289,7 @@ static l_TYPE l_POINT *l_MAKE_ARRAY(Scheme_Object *l, l_INTTYPE *c, char *who)
class os_wxListBox : public wxListBox {
public:
Scheme_Object *callback_closure;

View File

@ -345,6 +345,7 @@ static l_TYPE l_POINT *l_MAKE_ARRAY(Scheme_Object *l, l_INTTYPE *c, char *who)
class os_wxRadioBox : public wxRadioBox {
public:
Scheme_Object *callback_closure;
@ -706,7 +707,7 @@ static Scheme_Object *os_wxRadioBoxSetSelection(int n, Scheme_Object *p[])
x0 = WITH_VAR_STACK(objscheme_unbundle_integer(p[POFFSET+0], "set-selection in radio-box%"));
if ((x0 < 0) || (x0 >= THISOBJECT->Number())) { READY_TO_RETURN; return scheme_void; }
if ((x0 < -1) || (x0 >= THISOBJECT->Number())) { READY_TO_RETURN; return scheme_void; }
WITH_VAR_STACK(((wxRadioBox *)((Scheme_Class_Object *)p[0])->primdata)->SetSelection(x0));

View File

@ -48,7 +48,7 @@
@ "get-selection" : int GetSelection();
@ "number" : int Number()
@ "set-selection" : void SetSelection(int); : : /RANGE[0]
@ "set-selection" : void SetSelection(int); : : /RANGEX[0]
@ "enable" : void Enable(int,bool); : : /RANGE[0] <> single-button
@ "enable" : void Enable(bool); <> all-buttons

View File

@ -274,6 +274,7 @@ static int unbundle_symset_tabStyle(Scheme_Object *v, const char *where) {
class os_wxTabChoice : public wxTabChoice {
public:
Scheme_Object *callback_closure;

View File

@ -282,7 +282,7 @@ void wxRadioBox::SetSelection(int N)
numberItems = cRadioButtons->Number();
if (0 <= N && N < numberItems) {
if (-1 <= N && N < numberItems) {
if (selected != N) {
if (0 <= selected && selected < numberItems) {
selectedNode = cRadioButtons->Nth(selected);
@ -290,9 +290,11 @@ void wxRadioBox::SetSelection(int N)
selectedRadioButton->SetValue(FALSE);
}
node = cRadioButtons->Nth(N);
radioButton = (wxRadioButton*)node->Data();
radioButton->SetValue(TRUE);
if (N != -1) {
node = cRadioButtons->Nth(N);
radioButton = (wxRadioButton*)node->Data();
radioButton->SetValue(TRUE);
}
selected = N;
}

View File

@ -424,7 +424,7 @@ void wxRadioBox::SetButton(int which, int value)
void wxRadioBox::SetSelection(int N)
{
if ((N < 0) || (N >= no_items))
if ((N < -1) || (N >= no_items))
return;
if (N == selected)
@ -433,7 +433,8 @@ void wxRadioBox::SetSelection(int N)
if (selected >= 0 && selected < no_items)
SetButton(selected, 0);
SetButton(N, 1);
if (N != -1)
SetButton(N, 1);
selected = N;
}

View File

@ -134,8 +134,7 @@ Bool wxRadioBox::Create(wxPanel *panel, wxFunction func, char *label,
X->frame = wgt;
// create group widget, which holds the toggles
wgt = XtVaCreateManagedWidget("radiobox", xfwfGroupWidgetClass, X->frame,
XtNselectionStyle, (style & wxAT_MOST_ONE) ?
XfwfSingleSelection : XfwfOneSelection,
XtNselectionStyle, XfwfSingleSelection,
XtNstoreByRow, FALSE,
XtNlabel, NULL,
XtNframeWidth, 0,
@ -265,8 +264,7 @@ Bool wxRadioBox::Create(wxPanel *panel, wxFunction func, char *label,
// create group widget, which holds the toggles
wgt = XtVaCreateManagedWidget("radiobox", xfwfGroupWidgetClass, X->frame,
XtNselectionStyle, (style & wxAT_MOST_ONE) ?
XfwfSingleSelection : XfwfOneSelection,
XtNselectionStyle, XfwfSingleSelection,
XtNstoreByRow, FALSE,
XtNlabel, NULL,
XtNframeWidth, 0,
@ -518,7 +516,7 @@ void wxRadioBox::SetLabel(int item, wxBitmap *bitmap)
void wxRadioBox::SetSelection(int item)
{
if (0 <= item && item < num_toggles)
if (-1 <= item && item < num_toggles)
XtVaSetValues(X->handle, XtNselection, (long)item, NULL);
}