- m_acceptsFocus = TRUE;
- m_needParent = TRUE;
-
- wxSize newSize = size;
-
- PreCreation( parent, id, pos, newSize, style, name );
-
- SetValidator( validator );
-
- m_widget = gtk_radio_button_new_with_label( (GSList *) NULL, label );
-
- m_theOtherRadioButtton =
- gtk_radio_button_new_with_label(
- gtk_radio_button_group( GTK_RADIO_BUTTON(m_widget) ),
- "button2" );
-
- SetLabel(label);
+ if (!PreCreation( parent, pos, size ) ||
+ !CreateBase( parent, id, pos, size, style, validator, name ))
+ {
+ wxFAIL_MSG( wxT("wxRadioButton creation failed") );
+ return false;
+ }
+
+ // Check if this radio button should be put into an existing group. This
+ // shouldn't be done if it's given a style to explicitly start a new group
+ // or if it's not meant to be a part of a group at all.
+ GSList* radioButtonGroup = NULL;
+ if (!HasFlag(wxRB_GROUP) && !HasFlag(wxRB_SINGLE))
+ {
+ // search backward for last group start
+ wxWindowList::compatibility_iterator node = parent->GetChildren().GetLast();
+ for (; node; node = node->GetPrevious())
+ {
+ wxWindow *child = node->GetData();
+
+ // We stop at the first previous radio button in any case as it
+ // wouldn't make sense to put this button in a group with another
+ // one if there is a radio button that is not part of the same
+ // group between them.
+ if (wxIsKindOf(child, wxRadioButton))
+ {
+ // Any preceding radio button can be used to get its group, not
+ // necessarily one with wxRB_GROUP style, but exclude
+ // wxRB_SINGLE ones as their group should never be shared.
+ if (!child->HasFlag(wxRB_SINGLE))
+ {
+ radioButtonGroup = gtk_radio_button_get_group(
+ GTK_RADIO_BUTTON(child->m_widget));
+ }
+
+ break;
+ }
+ }
+ }
+
+ m_widget = gtk_radio_button_new_with_label( radioButtonGroup, wxGTK_CONV( label ) );
+ g_object_ref(m_widget);