]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/menu.cpp
Fixed a crash when GetMonthControl returns NULL
[wxWidgets.git] / src / gtk / menu.cpp
index e6789d180b90f95a260ada12558bf1f6c0a35bec..277353786ddc9b5a07cc1fd45ff7f91a50a199a3 100644 (file)
@@ -621,21 +621,25 @@ static void gtk_menu_clicked_callback( GtkWidget *widget, wxMenu *menu )
 
     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);
 }
 
 //-----------------------------------------------------------------------------
@@ -851,17 +855,20 @@ void wxMenuItem::Check( bool check )
 {
     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") );
     }
 }
 
@@ -964,8 +971,8 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem)
 #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() )
@@ -982,6 +989,9 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem)
 
         /* 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
@@ -1097,9 +1107,8 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem)
                     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:
@@ -1162,7 +1171,7 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem)
     mitem->SetMenuItem(menuItem);
 
 #if GTK_CHECK_VERSION(1, 2, 0)
-    if ( !isRadio )
+    if ( endOfRadioGroup )
     {
         m_pathLastRadio.clear();
     }