if (item->IsCheckable())
{
- bool isReallyChecked = item->IsChecked();
- if ( item->wxMenuItemBase::IsChecked() == isReallyChecked )
+ bool isReallyChecked = item->IsChecked(),
+ isInternallyChecked = item->wxMenuItemBase::IsChecked();
+
+ // ensure that the internal state is always consistent with what is
+ // shown on the screen
+ item->wxMenuItemBase::Check(isReallyChecked);
+
+ // we must not report the events for the radio button going up nor the
+ // events resulting from the calls to wxMenuItem::Check()
+ if ( (item->GetKind() == wxITEM_RADIO && !isReallyChecked) ||
+ (isInternallyChecked == isReallyChecked) )
{
- /* the menu item has been checked by calling wxMenuItem->Check() */
return;
}
- else
- {
- /* the user pressed on the menu item -> report and make consistent
- * again */
- item->wxMenuItemBase::Check(isReallyChecked);
- }
+
+ // the user pressed on the menu item: report the event below
}
- menu->SendEvent(item->GetId(), item->IsCheckable() ? item->IsChecked() : -1);
+ menu->SendEvent(id, item->IsCheckable() ? item->IsChecked() : -1);
}
//-----------------------------------------------------------------------------
wxMenu *subMenu)
: wxMenuItemBase(parentMenu, id, text, help, kind, subMenu)
{
- Init();
+ Init(text);
}
wxMenuItem::wxMenuItem(wxMenu *parentMenu,
: wxMenuItemBase(parentMenu, id, text, help,
isCheckable ? wxITEM_CHECK : wxITEM_NORMAL, subMenu)
{
- Init();
+ Init(text);
}
-void wxMenuItem::Init()
+void wxMenuItem::Init(const wxString& text)
{
m_labelWidget = (GtkWidget *) NULL;
m_menuItem = (GtkWidget *) NULL;
- DoSetText(m_text);
+ DoSetText(text);
}
wxMenuItem::~wxMenuItem()
{
wxCHECK_RET( m_menuItem, wxT("invalid menu item") );
- wxCHECK_RET( IsCheckable(), wxT("Can't check uncheckable item!") )
-
if (check == m_isChecked)
return;
wxMenuItemBase::Check( check );
- // GTK+ does it itself for the radio item
- if ( GetKind() == wxITEM_CHECK )
+ switch ( GetKind() )
{
- gtk_check_menu_item_set_state( (GtkCheckMenuItem*)m_menuItem, (gint)check );
+ case wxITEM_CHECK:
+ case wxITEM_RADIO:
+ gtk_check_menu_item_set_state( (GtkCheckMenuItem*)m_menuItem, (gint)check );
+ break;
+
+ default:
+ wxFAIL_MSG( _T("can't check this item") );
}
}
#endif
#if GTK_CHECK_VERSION(1, 2, 0)
- // is this a radio item?
- bool isRadio = FALSE;
+ // does this item terminate the current radio group?
+ bool endOfRadioGroup = TRUE;
#endif // GTK+ >= 1.2
if ( mitem->IsSeparator() )
/* this will be wrong for more than one separator. do we care? */
menuItem = gtk_item_factory_get_widget( m_factory, "<main>/sep" );
+
+ // we might have a separator inside a radio group
+ endOfRadioGroup = FALSE;
#else // GTK+ 1.0
menuItem = gtk_menu_item_new();
#endif // GTK 1.2/1.0
item_type = pathRadio;
}
- // remember that this one was a radio item to avoid resetting
- // m_pathLastRadio below
- isRadio = TRUE;
+ // continue the existing radio group, if any
+ endOfRadioGroup = FALSE;
break;
default:
mitem->SetMenuItem(menuItem);
#if GTK_CHECK_VERSION(1, 2, 0)
- if ( !isRadio )
+ if ( endOfRadioGroup )
{
m_pathLastRadio.clear();
}