]> git.saurik.com Git - wxWidgets.git/commitdiff
Add support for checked and radio menu items
authorDavid Elliott <dfe@tgwbd.org>
Fri, 26 Mar 2004 21:16:49 +0000 (21:16 +0000)
committerDavid Elliott <dfe@tgwbd.org>
Fri, 26 Mar 2004 21:16:49 +0000 (21:16 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@26377 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/cocoa/menuitem.mm

index 5d85321a8721c9445f16724ba1e54494f7143669..d64f475a58ff8bd9329e37e0ac4ec63933290d46 100644 (file)
@@ -33,6 +33,7 @@
 #import <AppKit/NSMenuItem.h>
 #import <AppKit/NSMenu.h>
 #import <Foundation/NSString.h>
+#import <AppKit/NSCell.h> // NSOnState, NSOffState
 
 #if wxUSE_MENUS
 
@@ -191,10 +192,43 @@ void wxMenuItem::Enable(bool bDoEnable)
     // NOTE: Nothing to do, we respond to validateMenuItem instead
 }
 
-void wxMenuItem::Check(bool bDoCheck)
+void wxMenuItem::Check(bool check)
 {
     wxCHECK_RET( IsCheckable(), wxT("only checkable items may be checked") );
-    wxMenuItemBase::Check(bDoCheck);
+    if(m_isChecked == check)
+        return;
+    wxAutoNSAutoreleasePool pool;
+    if(GetKind() == wxITEM_RADIO)
+    {
+        // it doesn't make sense to uncheck a radio item - what would this do?
+        if(!check)
+            return;
+        const wxMenuItemList& items = m_parentMenu->GetMenuItems();
+        // First search backwards for other radio items
+        wxMenuItemList::compatibility_iterator radioStart = items.Find(this);
+        for(wxMenuItemList::compatibility_iterator prevNode = radioStart;
+            prevNode && (prevNode->GetData()->GetKind() == wxITEM_RADIO);
+            prevNode = prevNode->GetPrevious())
+        {
+            radioStart = prevNode;
+        }
+        // Now starting there set the state of every item until we're
+        // out of radio items to set.
+        for(wxMenuItemList::compatibility_iterator node = radioStart;
+            node && (node->GetData()->GetKind() == wxITEM_RADIO);
+            node = node->GetNext())
+        {
+            wxMenuItem *item = node->GetData();
+            bool checkItem = (item == this);
+            item->wxMenuItemBase::Check(checkItem);
+            [item->m_cocoaNSMenuItem setState: checkItem?NSOnState:NSOffState];
+        }
+    }
+    else // normal check (non-radio) item
+    {
+        wxMenuItemBase::Check(check);
+        [m_cocoaNSMenuItem setState: check?NSOnState:NSOffState];
+    }
 }
 
 void wxMenuItem::SetText(const wxString& label)
@@ -206,7 +240,9 @@ void wxMenuItem::SetText(const wxString& label)
 
 void wxMenuItem::SetCheckable(bool checkable)
 {
+    wxCHECK_RET(m_kind != wxITEM_SEPARATOR, wxT("Separator items cannot be turned into normal menu items."));
     wxMenuItemBase::SetCheckable(checkable);
+    // NOTE: Cocoa does not discern between unchecked and normal items
 }
 
 #endif // wxUSE_MENUS