void DisassociateNSWindow(WX_NSWindow cocoaNSWindow);
virtual void Cocoa_close(void) = 0;
virtual bool Cocoa_windowShouldClose(void) = 0;
- virtual void Cocoa_wxMenuItemAction(wxMenuItem& item) = 0;
virtual void CocoaNotification_DidBecomeKey(void) { }
virtual void CocoaNotification_DidResignKey(void) { }
protected:
#define _WX_COCOA_FRAME_H_
class WXDLLEXPORT wxMenuBar;
-class WXDLLEXPORT wxMenuItem;
class WXDLLEXPORT wxStatusBar;
class WXDLLEXPORT wxFrame: public wxFrameBase
// Cocoa specifics
// ------------------------------------------------------------------------
protected:
- virtual void Cocoa_wxMenuItemAction(wxMenuItem& item);
virtual void CocoaSetWxWindowSize(int width, int height);
// Helper function to position status/tool bars
protected:
WX_NSMenuItem m_cocoaNSMenuItem;
static wxMenuItemCocoaHash sm_cocoaHash;
+ static struct objc_object *sm_cocoaTarget;
// ------------------------------------------------------------------------
// Implementation
// ------------------------------------------------------------------------
inline WX_NSWindow GetNSWindow() { return m_cocoaNSWindow; }
virtual void Cocoa_close(void);
virtual bool Cocoa_windowShouldClose(void);
- virtual void Cocoa_wxMenuItemAction(wxMenuItem& item);
virtual void CocoaNotification_DidBecomeKey(void);
virtual void CocoaNotification_DidResignKey(void);
protected:
- (void)close;
- (BOOL)windowShouldClose: (id)sender;
-- (BOOL)wxMenuItemAction: (id)sender;
@end // wxPoserNSwindow
WX_IMPLEMENT_POSER(wxPoserNSWindow);
return YES;
}
-- (BOOL)wxMenuItemAction: (id)sender
-{
- wxLogDebug("wxMenuItemAction");
- wxMenuItem *item = wxMenuItem::GetFromCocoa(sender);
- if(!item)
- return NO;
-
- wxCocoaNSWindow *tlw = wxCocoaNSWindow::GetFromCocoa(self);
- wxASSERT(tlw);
- tlw->Cocoa_wxMenuItemAction(*item);
- return YES;
-}
@end // implementation wxPoserNSWindow
#include "wx/statusbr.h"
#endif // WX_PRECOMP
-#include "wx/menuitem.h"
-
#include "wx/cocoa/autorelease.h"
#import <AppKit/NSWindow.h>
[m_frameNSView release];
}
-void wxFrame::Cocoa_wxMenuItemAction(wxMenuItem& item)
-{
- Command(item.GetId());
-}
-
void wxFrame::AttachMenuBar(wxMenuBar *mbar)
{
wxFrameBase::AttachMenuBar(mbar);
void wxMenuBar::Attach(wxFrame *frame)
{
+ wxMenuBarBase::Attach(frame);
}
void wxMenuBar::Detach()
{
+ wxMenuBarBase::Detach();
}
wxSize wxMenuBar::DoGetBestClientSize() const
#include "wx/menuitem.h"
#include "wx/utils.h"
#include "wx/frame.h"
+ #include "wx/log.h"
#endif
#include "wx/cocoa/ObjcPose.h"
#if wxUSE_MENUS
-// ----------------------------------------------------------------------------
-// globals
-// ----------------------------------------------------------------------------
-wxMenuItemCocoaHash wxMenuItemCocoa::sm_cocoaHash;
-
// ----------------------------------------------------------------------------
// functions prototypes
// ----------------------------------------------------------------------------
+// ============================================================================
+// @class wxNSMenuItemTarget
+// ============================================================================
+@interface wxNSMenuItemTarget : NSObject
+{
+}
+
+- (void)wxMenuItemAction: (id)sender;
+@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->Command(item->GetId());
+ }
+}
+
+@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
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());
[m_cocoaNSWindow setContentView:newView];
}
-void wxTopLevelWindowCocoa::Cocoa_wxMenuItemAction(wxMenuItem& item)
-{
-}
-
void wxTopLevelWindowCocoa::CocoaNotification_DidBecomeKey(void)
{
wxLogDebug("wxTopLevelWindowCocoa=%p::CocoaNotification_DidBecomeKey",this);