X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/bac6f2348d41e91d92baa2a35c19d35097547003..00cb0756b4ec3ff501ac6ba4351de51c7225de70:/src/cocoa/NSWindow.mm diff --git a/src/cocoa/NSWindow.mm b/src/cocoa/NSWindow.mm index d230b1a093..aef1f0ead5 100644 --- a/src/cocoa/NSWindow.mm +++ b/src/cocoa/NSWindow.mm @@ -27,21 +27,108 @@ #include "wx/cocoa/NSWindow.h" #import +#import +#import + +// ============================================================================ +// @class wxNSWindowDelegate +// ============================================================================ +@interface wxNSWindowDelegate : NSObject +{ +} + +- (void)windowDidBecomeKey: (NSNotification *)notification; +- (void)windowDidResignKey: (NSNotification *)notification; +- (void)windowDidBecomeMain: (NSNotification *)notification; +- (void)windowDidResignMain: (NSNotification *)notification; +- (BOOL)windowShouldClose: (id)sender; +- (void)windowWillClose: (NSNotification *)notification; +@end //interface wxNSWindowDelegate + +@implementation wxNSWindowDelegate : NSObject + +- (void)windowDidBecomeKey: (NSNotification *)notification +{ + wxCocoaNSWindow *win = wxCocoaNSWindow::GetFromCocoa([notification object]); + wxCHECK_RET(win,"notificationDidBecomeKey received but no wxWindow exists"); + win->CocoaDelegate_windowDidBecomeKey(); +} + +- (void)windowDidResignKey: (NSNotification *)notification +{ + wxCocoaNSWindow *win = wxCocoaNSWindow::GetFromCocoa([notification object]); + wxCHECK_RET(win,"notificationDidResignKey received but no wxWindow exists"); + win->CocoaDelegate_windowDidResignKey(); +} + +- (void)windowDidBecomeMain: (NSNotification *)notification +{ + wxCocoaNSWindow *win = wxCocoaNSWindow::GetFromCocoa([notification object]); + wxCHECK_RET(win,"notificationDidBecomeMain received but no wxWindow exists"); + win->CocoaDelegate_windowDidBecomeMain(); +} + +- (void)windowDidResignMain: (NSNotification *)notification +{ + wxCocoaNSWindow *win = wxCocoaNSWindow::GetFromCocoa([notification object]); + wxCHECK_RET(win,"notificationDidResignMain received but no wxWindow exists"); + win->CocoaDelegate_windowDidResignMain(); +} + +- (BOOL)windowShouldClose: (id)sender +{ + wxLogDebug("windowShouldClose"); + wxCocoaNSWindow *tlw = wxCocoaNSWindow::GetFromCocoa(sender); + if(tlw && !tlw->CocoaDelegate_windowShouldClose()) + { + wxLogDebug("Window will not be closed"); + return NO; + } + wxLogDebug("Window will be closed"); + return YES; +} + +- (void)windowWillClose: (NSNotification *)notification +{ + wxCocoaNSWindow *win = wxCocoaNSWindow::GetFromCocoa([notification object]); + wxCHECK_RET(win,"windowWillClose received but no wxWindow exists"); + win->CocoaDelegate_windowWillClose(); +} + +@end //implementation wxNSWindowDelegate + +// ============================================================================ +// class wxCocoaNSWindow +// ============================================================================ -// ---------------------------------------------------------------------------- -// globals -// ---------------------------------------------------------------------------- WX_IMPLEMENT_OBJC_INTERFACE_HASHMAP(NSWindow) +struct objc_object *wxCocoaNSWindow::sm_cocoaDelegate = [[wxNSWindowDelegate alloc] init]; + void wxCocoaNSWindow::AssociateNSWindow(WX_NSWindow cocoaNSWindow) { if(cocoaNSWindow) { [cocoaNSWindow setReleasedWhenClosed: NO]; sm_cocoaHash.insert(wxCocoaNSWindowHash::value_type(cocoaNSWindow,this)); + [cocoaNSWindow setDelegate: sm_cocoaDelegate]; + } +} + +void wxCocoaNSWindow::DisassociateNSWindow(WX_NSWindow cocoaNSWindow) +{ + if(cocoaNSWindow) + { + [cocoaNSWindow setDelegate: nil]; + sm_cocoaHash.erase(cocoaNSWindow); } } +wxMenuBar* wxCocoaNSWindow::GetAppMenuBar(wxCocoaNSWindow *win) +{ + return NULL; +} + // ============================================================================ // @class wxPoserNSWindow // ============================================================================ @@ -49,47 +136,20 @@ void wxCocoaNSWindow::AssociateNSWindow(WX_NSWindow cocoaNSWindow) { } -- (void)close; -- (BOOL)windowShouldClose: (id)sender; - -- (BOOL)wxMenuItemAction: (id)sender; +- (BOOL)canBecomeMainWindow; @end // wxPoserNSwindow WX_IMPLEMENT_POSER(wxPoserNSWindow); @implementation wxPoserNSWindow : NSWindow -- (void)close +- (BOOL)canBecomeMainWindow { - wxLogDebug("close"); + bool canBecome = false; wxCocoaNSWindow *tlw = wxCocoaNSWindow::GetFromCocoa(self); - if(tlw) - tlw->Cocoa_close(); - [super close]; -} - -- (BOOL)windowShouldClose: (id)sender -{ - wxLogDebug("windowShouldClose"); - wxCocoaNSWindow *tlw = wxCocoaNSWindow::GetFromCocoa(sender); - if(tlw && !tlw->Cocoa_windowShouldClose()) - return NO; - wxLogDebug("Window will most likely be CLOSED"); - if([[wxPoserNSWindow superclass] instancesRespondToSelector:@selector(windowShouldClose:)]) - return [super windowShouldClose: sender]; - return YES; + if(!tlw || !tlw->Cocoa_canBecomeMainWindow(canBecome)) + canBecome = [super canBecomeMainWindow]; + return canBecome; } -- (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