X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/fb896a322a2ed53d393ee738765ddd3f72cee004..af5454a410ed37a8a1639716a0c96c191e60b7f0:/src/cocoa/menuitem.mm diff --git a/src/cocoa/menuitem.mm b/src/cocoa/menuitem.mm index e5cae2430e..e5e5e7659d 100644 --- a/src/cocoa/menuitem.mm +++ b/src/cocoa/menuitem.mm @@ -23,9 +23,11 @@ #include "wx/menuitem.h" #include "wx/utils.h" #include "wx/frame.h" + #include "wx/log.h" #endif #include "wx/cocoa/ObjcPose.h" +#include "wx/cocoa/autorelease.h" #import #import @@ -33,15 +35,51 @@ #if wxUSE_MENUS -// ---------------------------------------------------------------------------- -// globals -// ---------------------------------------------------------------------------- -wxMenuItemCocoaHash wxMenuItemCocoa::sm_cocoaHash; - // ---------------------------------------------------------------------------- // functions prototypes // ---------------------------------------------------------------------------- +// ============================================================================ +// @class wxNSMenuItemTarget +// ============================================================================ +@interface wxNSMenuItemTarget : NSObject +{ +} + +- (void)wxMenuItemAction: (id)sender; +- (BOOL)validateMenuItem: (id)menuItem; +@end //interface wxNSMenuItemTarget + +@implementation wxNSMenuItemTarget : NSObject + +- (void)wxMenuItemAction: (id)sender +{ + wxLogDebug("wxMenuItemAction"); + wxMenuItem *item = wxMenuItem::GetFromCocoa(sender); + wxCHECK_RET(item,"wxMenuItemAction received but no wxMenuItem exists!"); + + wxMenu *menu = item->GetMenu(); + wxCHECK_RET(menu,"wxMenuItemAction received but wxMenuItem is not in a wxMenu"); + wxMenuBar *menubar = menu->GetMenuBar(); + if(menubar) + { + wxFrame *frame = menubar->GetFrame(); + wxCHECK_RET(frame, "wxMenuBar MUST be attached to a wxFrame!"); + frame->ProcessCommand(item->GetId()); + } +} + +- (BOOL)validateMenuItem: (id)menuItem +{ + // TODO: Do wxWindows validation here and avoid sending during idle time + wxLogDebug("wxMenuItemAction"); + wxMenuItem *item = wxMenuItem::GetFromCocoa(menuItem); + wxCHECK_MSG(item,NO,"validateMenuItem received but no wxMenuItem exists!"); + return item->IsEnabled(); +} + +@end //implementation wxNSMenuItemTarget + // ============================================================================ // @class wxPoserNSMenuItem // ============================================================================ @@ -60,6 +98,9 @@ WX_IMPLEMENT_POSER(wxPoserNSMenuItem); // wxMenuItemCocoa implementation // ============================================================================ IMPLEMENT_DYNAMIC_CLASS(wxMenuItem, wxObject) +wxMenuItemCocoaHash wxMenuItemCocoa::sm_cocoaHash; + +struct objc_object *wxMenuItemCocoa::sm_cocoaTarget = [[wxNSMenuItemTarget alloc] init]; // ---------------------------------------------------------------------------- // wxMenuItemBase @@ -92,9 +133,11 @@ wxMenuItemCocoa::wxMenuItemCocoa(wxMenu *pParentMenu, wxMenu *pSubMenu) : wxMenuItemBase(pParentMenu, itemid, strName, strHelp, kind, pSubMenu) { + wxAutoNSAutoreleasePool pool; NSString *menuTitle = [[NSString alloc] initWithCString: wxStripMenuCodes(strName).c_str()]; m_cocoaNSMenuItem = [[NSMenuItem alloc] initWithTitle:menuTitle action:@selector(wxMenuItemAction:) keyEquivalent:@""]; sm_cocoaHash.insert(wxMenuItemCocoaHash::value_type(m_cocoaNSMenuItem,this)); + [m_cocoaNSMenuItem setTarget:sm_cocoaTarget]; if(pSubMenu) { wxASSERT(pSubMenu->GetNSMenu());