- // start GRW fix
- if (label != "")
- {
- int label_width, label_height;
- GetTextExtent(label, &label_width, &label_height, NULL, NULL, GetFont());
- if (width < 0)
- width = (int)(label_width + RADIO_SIZE);
- if (height<0)
+void wxRadioButton::SetValue(bool value)
+{
+ ::SendMessage(GetHwnd(), BM_SETCHECK,
+ value ? BST_CHECKED : BST_UNCHECKED, 0);
+
+ m_isChecked = value;
+
+ if ( !value )
+ return;
+
+ // if we set the value of one radio button we also must clear all the other
+ // buttons in the same group: Windows doesn't do it automatically
+ //
+ // moreover, if another radiobutton in the group currently has the focus,
+ // we have to set it to this radiobutton, else the old radiobutton will be
+ // reselected automatically, if a parent window loses the focus and regains
+ // it.
+ wxWindow * const focus = FindFocus();
+ wxTopLevelWindow * const
+ tlw = wxDynamicCast(wxGetTopLevelParent(this), wxTopLevelWindow);
+ wxCHECK_RET( tlw, wxT("radio button outside of TLW?") );
+ wxWindow * const focusInTLW = tlw->GetLastFocus();
+
+ const wxWindowList& siblings = GetParent()->GetChildren();
+ wxWindowList::compatibility_iterator nodeThis = siblings.Find(this);
+ wxCHECK_RET( nodeThis, wxT("radio button not a child of its parent?") );
+
+ // this will be set to true in the code below if the focus is in our TLW
+ // and belongs to one of the other buttons in the same group
+ bool shouldSetFocus = false;
+
+ // this will be set to true if the focus is outside of our TLW currently
+ // but the remembered focus of this TLW is one of the other buttons in the
+ // same group
+ bool shouldSetTLWFocus = false;
+
+ // if it's not the first item of the group ...
+ if ( !HasFlag(wxRB_GROUP) )