diff --git a/collects/mred/private/check.ss b/collects/mred/private/check.ss index 9872d3550e..d46c1996d1 100644 --- a/collects/mred/private/check.ss +++ b/collects/mred/private/check.ss @@ -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)))) diff --git a/collects/mred/private/mritem.ss b/collects/mred/private/mritem.ss index 226d144d1a..31231d5c1e 100644 --- a/collects/mred/private/mritem.ss +++ b/collects/mred/private/mritem.ss @@ -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% diff --git a/collects/scribblings/gui/blurbs.ss b/collects/scribblings/gui/blurbs.ss index 72800aaa37..a9210b9460 100644 --- a/collects/scribblings/gui/blurbs.ss +++ b/collects/scribblings/gui/blurbs.ss @@ -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")) diff --git a/collects/scribblings/gui/radio-box-class.scrbl b/collects/scribblings/gui/radio-box-class.scrbl index a9bc3275b7..17958e7aa7 100644 --- a/collects/scribblings/gui/radio-box-class.scrbl +++ b/collects/scribblings/gui/radio-box-class.scrbl @@ -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|. diff --git a/collects/tests/mred/item.ss b/collects/tests/mred/item.ss index 4dd6fd1bfb..f9ff3383b2 100644 --- a/collects/tests/mred/item.ss +++ b/collects/tests/mred/item.ss @@ -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 diff --git a/doc/release-notes/mred/HISTORY.txt b/doc/release-notes/mred/HISTORY.txt index cd20d38c70..0a1e5ca65f 100644 --- a/doc/release-notes/mred/HISTORY.txt +++ b/doc/release-notes/mred/HISTORY.txt @@ -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 diff --git a/src/mred/wxs/range.xci b/src/mred/wxs/range.xci index d9d0807da0..7b8b2d70d7 100644 --- a/src/mred/wxs/range.xci +++ b/src/mred/wxs/range.xci @@ -3,3 +3,6 @@ @MACRO RANGERET[p.rv] = if ((x

< 0) || (x

>= THISOBJECT->Number())) { READY_TO_RETURN; return ; } @MACRO RANGE[p] = $$RANGERET[

.scheme_void] + +@MACRO RANGEXRET[p.rv] = if ((x

< -1) || (x

>= THISOBJECT->Number())) { READY_TO_RETURN; return ; } +@MACRO RANGEX[p] = $$RANGEXRET[

.scheme_void] diff --git a/src/mred/wxs/wxs_chce.cxx b/src/mred/wxs/wxs_chce.cxx index 227a37a41c..519baf1cc6 100644 --- a/src/mred/wxs/wxs_chce.cxx +++ b/src/mred/wxs/wxs_chce.cxx @@ -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; diff --git a/src/mred/wxs/wxs_lbox.cxx b/src/mred/wxs/wxs_lbox.cxx index 9b407808c6..915aae2844 100644 --- a/src/mred/wxs/wxs_lbox.cxx +++ b/src/mred/wxs/wxs_lbox.cxx @@ -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; diff --git a/src/mred/wxs/wxs_rado.cxx b/src/mred/wxs/wxs_rado.cxx index 10816ea348..50d6ceb8cc 100644 --- a/src/mred/wxs/wxs_rado.cxx +++ b/src/mred/wxs/wxs_rado.cxx @@ -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)); diff --git a/src/mred/wxs/wxs_rado.xc b/src/mred/wxs/wxs_rado.xc index 3208c8691e..04f1bc90ab 100644 --- a/src/mred/wxs/wxs_rado.xc +++ b/src/mred/wxs/wxs_rado.xc @@ -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 diff --git a/src/mred/wxs/wxs_tabc.cxx b/src/mred/wxs/wxs_tabc.cxx index 497bf18388..7fc3ba40cb 100644 --- a/src/mred/wxs/wxs_tabc.cxx +++ b/src/mred/wxs/wxs_tabc.cxx @@ -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; diff --git a/src/wxmac/src/mac/wx_rbox.cc b/src/wxmac/src/mac/wx_rbox.cc index e85a1f3795..49cd26a2da 100644 --- a/src/wxmac/src/mac/wx_rbox.cc +++ b/src/wxmac/src/mac/wx_rbox.cc @@ -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; } diff --git a/src/wxwindow/src/msw/wx_rbox.cxx b/src/wxwindow/src/msw/wx_rbox.cxx index 1db07f443b..aa312f6f07 100644 --- a/src/wxwindow/src/msw/wx_rbox.cxx +++ b/src/wxwindow/src/msw/wx_rbox.cxx @@ -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; } diff --git a/src/wxxt/src/Windows/RadioBox.cc b/src/wxxt/src/Windows/RadioBox.cc index ff64a1ef26..cdd6285129 100644 --- a/src/wxxt/src/Windows/RadioBox.cc +++ b/src/wxxt/src/Windows/RadioBox.cc @@ -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); }