X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/605c7e7ed81c740e80de66c751f50fc54bd77e4d..c0b0635cf69537ca32377bad5650b39402cb21b6:/src/cocoa/NSMenu.mm diff --git a/src/cocoa/NSMenu.mm b/src/cocoa/NSMenu.mm index bbf68e96d5..c71a2d2e9b 100644 --- a/src/cocoa/NSMenu.mm +++ b/src/cocoa/NSMenu.mm @@ -6,7 +6,7 @@ // Created: 2002/12/09 // RCS-ID: $Id$ // Copyright: (c) 2002 David Elliott -// Licence: wxWindows licence +// Licence: wxWidgets licence ///////////////////////////////////////////////////////////////////////////// #include "wx/wxprec.h" @@ -16,9 +16,11 @@ #endif // WX_PRECOMP #include "wx/cocoa/NSMenu.h" -//#include "wx/cocoa/ObjcPose.h" +#include "wx/cocoa/ObjcPose.h" + +#import +#import -#if 0 // There is no reason to pose for NSMenu at this time. // ============================================================================ // @class wxPoserNSMenu // ============================================================================ @@ -26,12 +28,111 @@ { } +- (void)dealloc; + @end // wxPoserNSMenu WX_IMPLEMENT_POSER(wxPoserNSMenu); @implementation wxPoserNSMenu : NSMenu +- (void)dealloc +{ + wxCocoaNSMenu *menu = wxCocoaNSMenu::GetFromCocoa(self); + if(menu) + menu->Cocoa_dealloc(); +} + @end // wxPoserNSMenu -#endif // 0 + +// ============================================================================ +// @class wxNSMenuNotificationObserver +// ============================================================================ +@interface wxNSMenuNotificationObserver : NSObject +{ +} + +struct objc_object *wxCocoaNSMenu::sm_cocoaObserver = [[wxNSMenuNotificationObserver alloc] init]; + +- (void)menuDidAddItem: (NSNotification *)notification; +- (void)menuDidChangeItem: (NSNotification *)notification; +- (void)menuDidRemoveItem: (NSNotification *)notification; +- (void)menuDidSendAction: (NSNotification *)notification; +- (void)menuWillSendAction: (NSNotification *)notification; +@end // interface wxNSMenuNotificationObserver + +@implementation wxNSMenuNotificationObserver : NSObject + +- (void)menuDidAddItem: (NSNotification *)notification +{ + wxCocoaNSMenu *menu = wxCocoaNSMenu::GetFromCocoa([notification object]); + wxCHECK_RET(menu,wxT("menuDidAddItem received but no wxMenu exists")); + menu->CocoaNotification_menuDidAddItem(notification); +} + +- (void)menuDidChangeItem: (NSNotification *)notification +{ + wxCocoaNSMenu *menu = wxCocoaNSMenu::GetFromCocoa([notification object]); + wxCHECK_RET(menu,wxT("menuDidChangeItem received but no wxMenu exists")); + menu->CocoaNotification_menuDidChangeItem(notification); +} + +- (void)menuDidRemoveItem: (NSNotification *)notification +{ + wxCocoaNSMenu *menu = wxCocoaNSMenu::GetFromCocoa([notification object]); + wxCHECK_RET(menu,wxT("menuDidRemoveItem received but no wxMenu exists")); + menu->CocoaNotification_menuDidRemoveItem(notification); +} + +- (void)menuDidSendAction: (NSNotification *)notification +{ + wxCocoaNSMenu *menu = wxCocoaNSMenu::GetFromCocoa([notification object]); + wxCHECK_RET(menu,wxT("menuDidSendAction received but no wxMenu exists")); + menu->CocoaNotification_menuDidSendAction(notification); +} + +- (void)menuWillSendAction: (NSNotification *)notification +{ + wxCocoaNSMenu *menu = wxCocoaNSMenu::GetFromCocoa([notification object]); + wxCHECK_RET(menu,wxT("menuWillSendAction received but no wxMenu exists")); + menu->CocoaNotification_menuWillSendAction(notification); +} + +@end // implementation wxNSMenuNotificationObserver + +// ======================================================================== +// wxCocoaNSMenu +// ======================================================================== +WX_IMPLEMENT_OBJC_INTERFACE_HASHMAP(NSMenu) + +void wxCocoaNSMenu::AssociateNSMenu(WX_NSMenu cocoaNSMenu, unsigned int flags) +{ + if(cocoaNSMenu) + { + sm_cocoaHash.insert(wxCocoaNSMenuHash::value_type(cocoaNSMenu,this)); + if(flags&OBSERVE_DidAddItem) + [[NSNotificationCenter defaultCenter] addObserver:(id)sm_cocoaObserver selector:@selector(menuDidAddItem:) name:NSMenuDidAddItemNotification object:cocoaNSMenu]; + if(flags&OBSERVE_DidChangeItem) + [[NSNotificationCenter defaultCenter] addObserver:(id)sm_cocoaObserver selector:@selector(menuDidChangeItem:) name:NSMenuDidChangeItemNotification object:cocoaNSMenu]; + if(flags&OBSERVE_DidRemoveItem) + [[NSNotificationCenter defaultCenter] addObserver:(id)sm_cocoaObserver selector:@selector(menuDidRemoveItem:) name:NSMenuDidRemoveItemNotification object:cocoaNSMenu]; + if(flags&OBSERVE_DidSendAction) + [[NSNotificationCenter defaultCenter] addObserver:(id)sm_cocoaObserver selector:@selector(menuDidSendAction:) name:NSMenuDidSendActionNotification object:cocoaNSMenu]; + if(flags&OBSERVE_WillSendAction) + [[NSNotificationCenter defaultCenter] addObserver:(id)sm_cocoaObserver selector:@selector(menuWillSendAction:) name:NSMenuWillSendActionNotification object:cocoaNSMenu]; + } +} + +void wxCocoaNSMenu::DisassociateNSMenu(WX_NSMenu cocoaNSMenu) +{ + if(cocoaNSMenu) + { + sm_cocoaHash.erase(cocoaNSMenu); + [[NSNotificationCenter defaultCenter] removeObserver:(id)sm_cocoaObserver name:NSMenuDidAddItemNotification object:cocoaNSMenu]; + [[NSNotificationCenter defaultCenter] removeObserver:(id)sm_cocoaObserver name:NSMenuDidChangeItemNotification object:cocoaNSMenu]; + [[NSNotificationCenter defaultCenter] removeObserver:(id)sm_cocoaObserver name:NSMenuDidRemoveItemNotification object:cocoaNSMenu]; + [[NSNotificationCenter defaultCenter] removeObserver:(id)sm_cocoaObserver name:NSMenuDidSendActionNotification object:cocoaNSMenu]; + [[NSNotificationCenter defaultCenter] removeObserver:(id)sm_cocoaObserver name:NSMenuWillSendActionNotification object:cocoaNSMenu]; + } +} #endif // wxUSE_MENUS