X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/fb896a322a2ed53d393ee738765ddd3f72cee004..7a21e692d22ec16a5de7dbbb73761d4c4456edaa:/src/cocoa/NSWindow.mm diff --git a/src/cocoa/NSWindow.mm b/src/cocoa/NSWindow.mm index 577f159868..7032045d68 100644 --- a/src/cocoa/NSWindow.mm +++ b/src/cocoa/NSWindow.mm @@ -23,69 +23,133 @@ #include "wx/menuitem.h" #endif // WX_PRECOMP +#include "wx/cocoa/ObjcPose.h" #include "wx/cocoa/NSWindow.h" -#import - -// ---------------------------------------------------------------------------- -// globals -// ---------------------------------------------------------------------------- -WX_IMPLEMENT_OBJC_INTERFACE_HASHMAP(NSWindow) - -void wxCocoaNSWindow::AssociateNSWindow(WX_NSWindow cocoaNSWindow) -{ - [cocoaNSWindow setReleasedWhenClosed: NO]; - sm_cocoaHash.insert(wxCocoaNSWindowHash::value_type(cocoaNSWindow,this)); -} +#import +#import +#import // ============================================================================ -// @class wxPoserNSWindow +// @class wxNSWindowDelegate // ============================================================================ -@interface wxPoserNSWindow : NSWindow +@interface wxNSWindowDelegate : NSObject { } -- (void)close; +- (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 -- (BOOL)wxMenuItemAction: (id)sender; -@end // wxPoserNSwindow +@implementation wxNSWindowDelegate : NSObject -WX_IMPLEMENT_POSER(wxPoserNSWindow); -@implementation wxPoserNSWindow : NSWindow +- (void)windowDidBecomeKey: (NSNotification *)notification +{ + wxCocoaNSWindow *win = wxCocoaNSWindow::GetFromCocoa([notification object]); + wxCHECK_RET(win,wxT("notificationDidBecomeKey received but no wxWindow exists")); + win->CocoaDelegate_windowDidBecomeKey(); +} -- (void)close +- (void)windowDidResignKey: (NSNotification *)notification { - wxLogDebug("close"); - wxCocoaNSWindow *tlw = wxCocoaNSWindow::GetFromCocoa(self); - if(tlw) - tlw->Cocoa_close(); - [super close]; + wxCocoaNSWindow *win = wxCocoaNSWindow::GetFromCocoa([notification object]); + wxCHECK_RET(win,wxT("notificationDidResignKey received but no wxWindow exists")); + win->CocoaDelegate_windowDidResignKey(); +} + +- (void)windowDidBecomeMain: (NSNotification *)notification +{ + wxCocoaNSWindow *win = wxCocoaNSWindow::GetFromCocoa([notification object]); + wxCHECK_RET(win,wxT("notificationDidBecomeMain received but no wxWindow exists")); + win->CocoaDelegate_windowDidBecomeMain(); +} + +- (void)windowDidResignMain: (NSNotification *)notification +{ + wxCocoaNSWindow *win = wxCocoaNSWindow::GetFromCocoa([notification object]); + wxCHECK_RET(win,wxT("notificationDidResignMain received but no wxWindow exists")); + win->CocoaDelegate_windowDidResignMain(); } - (BOOL)windowShouldClose: (id)sender { - wxLogDebug("windowShouldClose"); + wxLogTrace(wxTRACE_COCOA,wxT("windowShouldClose")); wxCocoaNSWindow *tlw = wxCocoaNSWindow::GetFromCocoa(sender); - if(tlw && !tlw->Cocoa_windowShouldClose()) + if(tlw && !tlw->CocoaDelegate_windowShouldClose()) + { + wxLogTrace(wxTRACE_COCOA,wxT("Window will not be closed")); return NO; - wxLogDebug("Window will most likely be CLOSED"); - if([[wxPoserNSWindow superclass] instancesRespondToSelector:@selector(windowShouldClose:)]) - return [super windowShouldClose: sender]; + } + wxLogTrace(wxTRACE_COCOA,wxT("Window will be closed")); return YES; } -- (BOOL)wxMenuItemAction: (id)sender +- (void)windowWillClose: (NSNotification *)notification { - wxLogDebug("wxMenuItemAction"); - wxMenuItem *item = wxMenuItem::GetFromCocoa(sender); - if(!item) - return NO; + wxCocoaNSWindow *win = wxCocoaNSWindow::GetFromCocoa([notification object]); + wxCHECK_RET(win,wxT("windowWillClose received but no wxWindow exists")); + win->CocoaDelegate_windowWillClose(); +} + +@end //implementation wxNSWindowDelegate + +// ============================================================================ +// class wxCocoaNSWindow +// ============================================================================ +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 +// ============================================================================ +@interface wxPoserNSWindow : NSWindow +{ +} + +- (BOOL)canBecomeMainWindow; +@end // wxPoserNSwindow + +WX_IMPLEMENT_POSER(wxPoserNSWindow); +@implementation wxPoserNSWindow : NSWindow + +- (BOOL)canBecomeMainWindow +{ + bool canBecome = false; wxCocoaNSWindow *tlw = wxCocoaNSWindow::GetFromCocoa(self); - wxASSERT(tlw); - tlw->Cocoa_wxMenuItemAction(*item); - return YES; + if(!tlw || !tlw->Cocoa_canBecomeMainWindow(canBecome)) + canBecome = [super canBecomeMainWindow]; + return canBecome; } + @end // implementation wxPoserNSWindow