#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"
+#include "wx/cocoa/string.h"
#import <AppKit/NSMenuItem.h>
#import <AppKit/NSMenu.h>
#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
+{
+ wxLogTrace(wxTRACE_COCOA,wxT("wxMenuItemAction"));
+ wxMenuItem *item = wxMenuItem::GetFromCocoa(sender);
+ wxCHECK_RET(item,wxT("wxMenuItemAction received but no wxMenuItem exists!"));
+
+ wxMenu *menu = item->GetMenu();
+ wxCHECK_RET(menu,wxT("wxMenuItemAction received but wxMenuItem is not in a wxMenu"));
+ wxMenuBar *menubar = menu->GetMenuBar();
+ if(menubar)
+ {
+ wxFrame *frame = menubar->GetFrame();
+ wxCHECK_RET(frame, wxT("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
+ wxLogTrace(wxTRACE_COCOA,wxT("wxMenuItemAction"));
+ wxMenuItem *item = wxMenuItem::GetFromCocoa(menuItem);
+ wxCHECK_MSG(item,NO,wxT("validateMenuItem received but no wxMenuItem exists!"));
+ return item->IsEnabled();
+}
+
+@end //implementation wxNSMenuItemTarget
+
// ============================================================================
// @class wxPoserNSMenuItem
// ============================================================================
// wxMenuItemCocoa implementation
// ============================================================================
IMPLEMENT_DYNAMIC_CLASS(wxMenuItem, wxObject)
+wxMenuItemCocoaHash wxMenuItemCocoa::sm_cocoaHash;
+
+struct objc_object *wxMenuItemCocoa::sm_cocoaTarget = [[wxNSMenuItemTarget alloc] init];
// ----------------------------------------------------------------------------
// wxMenuItemBase
wxMenu *pSubMenu)
: wxMenuItemBase(pParentMenu, itemid, strName, strHelp, kind, pSubMenu)
{
- NSString *menuTitle = [[NSString alloc] initWithCString: wxStripMenuCodes(strName).c_str()];
+ wxAutoNSAutoreleasePool pool;
+ NSString *menuTitle = wxInitNSStringWithWxString([NSString alloc],wxStripMenuCodes(strName));
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());
void wxMenuItem::Check(bool bDoCheck)
{
- wxCHECK_RET( IsCheckable(), "only checkable items may be checked" );
+ wxCHECK_RET( IsCheckable(), wxT("only checkable items may be checked") );
wxMenuItemBase::Check(bDoCheck);
}