Send all menu item actions to a dedicated target. This is to ensure

the actions always make it to the proper wxFrame.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@23277 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
David Elliott
2003-08-28 17:49:51 +00:00
parent 0ff1f245a9
commit 2fc2d511d0
9 changed files with 39 additions and 33 deletions

View File

@@ -26,7 +26,6 @@ public:
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:

View File

@@ -13,7 +13,6 @@
#define _WX_COCOA_FRAME_H_
class WXDLLEXPORT wxMenuBar;
class WXDLLEXPORT wxMenuItem;
class WXDLLEXPORT wxStatusBar;
class WXDLLEXPORT wxFrame: public wxFrameBase
@@ -52,7 +51,6 @@ protected:
// Cocoa specifics
// ------------------------------------------------------------------------
protected:
virtual void Cocoa_wxMenuItemAction(wxMenuItem& item);
virtual void CocoaSetWxWindowSize(int width, int height);
// Helper function to position status/tool bars

View File

@@ -52,6 +52,7 @@ public:
protected:
WX_NSMenuItem m_cocoaNSMenuItem;
static wxMenuItemCocoaHash sm_cocoaHash;
static struct objc_object *sm_cocoaTarget;
// ------------------------------------------------------------------------
// Implementation
// ------------------------------------------------------------------------

View File

@@ -61,7 +61,6 @@ public:
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:

View File

@@ -98,7 +98,6 @@ void wxCocoaNSWindow::DisassociateNSWindow(WX_NSWindow cocoaNSWindow)
- (void)close;
- (BOOL)windowShouldClose: (id)sender;
- (BOOL)wxMenuItemAction: (id)sender;
@end // wxPoserNSwindow
WX_IMPLEMENT_POSER(wxPoserNSWindow);
@@ -125,17 +124,5 @@ 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

View File

@@ -19,8 +19,6 @@
#include "wx/statusbr.h"
#endif // WX_PRECOMP
#include "wx/menuitem.h"
#include "wx/cocoa/autorelease.h"
#import <AppKit/NSWindow.h>
@@ -57,11 +55,6 @@ wxFrame::~wxFrame()
[m_frameNSView release];
}
void wxFrame::Cocoa_wxMenuItemAction(wxMenuItem& item)
{
Command(item.GetId());
}
void wxFrame::AttachMenuBar(wxMenuBar *mbar)
{
wxFrameBase::AttachMenuBar(mbar);

View File

@@ -167,10 +167,12 @@ wxString wxMenuBar::GetLabelTop(size_t pos) const
void wxMenuBar::Attach(wxFrame *frame)
{
wxMenuBarBase::Attach(frame);
}
void wxMenuBar::Detach()
{
wxMenuBarBase::Detach();
}
wxSize wxMenuBar::DoGetBestClientSize() const

View File

@@ -23,6 +23,7 @@
#include "wx/menuitem.h"
#include "wx/utils.h"
#include "wx/frame.h"
#include "wx/log.h"
#endif
#include "wx/cocoa/ObjcPose.h"
@@ -34,15 +35,41 @@
#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
// ============================================================================
@@ -61,6 +88,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
@@ -97,6 +127,7 @@ wxMenuItemCocoa::wxMenuItemCocoa(wxMenu *pParentMenu,
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());

View File

@@ -128,10 +128,6 @@ void wxTopLevelWindowCocoa::CocoaReplaceView(WX_NSView oldView, WX_NSView newVie
[m_cocoaNSWindow setContentView:newView];
}
void wxTopLevelWindowCocoa::Cocoa_wxMenuItemAction(wxMenuItem& item)
{
}
void wxTopLevelWindowCocoa::CocoaNotification_DidBecomeKey(void)
{
wxLogDebug("wxTopLevelWindowCocoa=%p::CocoaNotification_DidBecomeKey",this);