void BRadioButton::SetValue(int32 value) { if (value != Value()) { BControl::SetValueNoUpdate(value); Invalidate(_KnobFrame()); } if (value == 0) return; BView* parent = Parent(); BView* child = NULL; if (parent != NULL) { // If the parent is a BBox, the group parent is the parent of the BBox BBox* box = dynamic_cast<BBox*>(parent); if (box != NULL && box->LabelView() == this) parent = box->Parent(); if (parent != NULL) { BBox* box = dynamic_cast<BBox*>(parent); // If the parent is a BBox, skip the label if there is one if (box != NULL && box->LabelView()) child = parent->ChildAt(1); else child = parent->ChildAt(0); } else child = Window()->ChildAt(0); } else if (Window() != NULL) child = Window()->ChildAt(0); while (child != NULL) { BRadioButton* radio = dynamic_cast<BRadioButton*>(child); if (radio != NULL && (radio != this)) radio->SetValue(B_CONTROL_OFF); else { // If the child is a BBox, check if the label is a radiobutton BBox* box = dynamic_cast<BBox*>(child); if (box != NULL && box->LabelView()) { radio = dynamic_cast<BRadioButton*>(box->LabelView()); if (radio != NULL && (radio != this)) radio->SetValue(B_CONTROL_OFF); } } child = child->NextSibling(); } ASSERT(Value() == B_CONTROL_ON); }