X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2fc2d511d0f095ab5de3713cff6042832f886d15..8e54aaedb5329a49ffd9c5d50071f9c8cdd5c59e:/src/cocoa/NSWindow.mm?ds=sidebyside diff --git a/src/cocoa/NSWindow.mm b/src/cocoa/NSWindow.mm index 27d506a30b..ca5960caf0 100644 --- a/src/cocoa/NSWindow.mm +++ b/src/cocoa/NSWindow.mm @@ -26,38 +26,76 @@ #include "wx/cocoa/ObjcPose.h" #include "wx/cocoa/NSWindow.h" -#import +#import #import #import // ============================================================================ -// @class wxNSWindowNotificationObserver +// @class wxNSWindowDelegate // ============================================================================ -@interface wxNSWindowNotificationObserver : NSObject +@interface wxNSWindowDelegate : NSObject { } -- (void)notificationDidBecomeKey: (NSNotification *)notification; -- (void)notificationDidResignKey: (NSNotification *)notification; -@end //interface wxNSWindowNotificationObserver +- (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 -@implementation wxNSWindowNotificationObserver : NSObject +- (void)windowDidBecomeKey: (NSNotification *)notification +{ + wxCocoaNSWindow *win = wxCocoaNSWindow::GetFromCocoa([notification object]); + wxCHECK_RET(win,wxT("notificationDidBecomeKey received but no wxWindow exists")); + win->CocoaDelegate_windowDidBecomeKey(); +} + +- (void)windowDidResignKey: (NSNotification *)notification +{ + wxCocoaNSWindow *win = wxCocoaNSWindow::GetFromCocoa([notification object]); + wxCHECK_RET(win,wxT("notificationDidResignKey received but no wxWindow exists")); + win->CocoaDelegate_windowDidResignKey(); +} -- (void)notificationDidBecomeKey: (NSNotification *)notification +- (void)windowDidBecomeMain: (NSNotification *)notification { wxCocoaNSWindow *win = wxCocoaNSWindow::GetFromCocoa([notification object]); - wxCHECK_RET(win,"notificationDidBecomeKey received but no wxWindow exists"); - win->CocoaNotification_DidBecomeKey(); + 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(wxT("windowShouldClose")); + wxCocoaNSWindow *tlw = wxCocoaNSWindow::GetFromCocoa(sender); + if(tlw && !tlw->CocoaDelegate_windowShouldClose()) + { + wxLogDebug(wxT("Window will not be closed")); + return NO; + } + wxLogDebug(wxT("Window will be closed")); + return YES; } -- (void)notificationDidResignKey: (NSNotification *)notification +- (void)windowWillClose: (NSNotification *)notification { wxCocoaNSWindow *win = wxCocoaNSWindow::GetFromCocoa([notification object]); - wxCHECK_RET(win,"notificationDidResignKey received but no wxWindow exists"); - win->CocoaNotification_DidResignKey(); + wxCHECK_RET(win,wxT("windowWillClose received but no wxWindow exists")); + win->CocoaDelegate_windowWillClose(); } -@end //implementation wxNSWindowNotificationObserver +@end //implementation wxNSWindowDelegate // ============================================================================ // class wxCocoaNSWindow @@ -65,7 +103,7 @@ WX_IMPLEMENT_OBJC_INTERFACE_HASHMAP(NSWindow) -void *wxCocoaNSWindow::sm_cocoaObserver = [[wxNSWindowNotificationObserver alloc] init]; +struct objc_object *wxCocoaNSWindow::sm_cocoaDelegate = [[wxNSWindowDelegate alloc] init]; void wxCocoaNSWindow::AssociateNSWindow(WX_NSWindow cocoaNSWindow) { @@ -73,8 +111,7 @@ void wxCocoaNSWindow::AssociateNSWindow(WX_NSWindow cocoaNSWindow) { [cocoaNSWindow setReleasedWhenClosed: NO]; sm_cocoaHash.insert(wxCocoaNSWindowHash::value_type(cocoaNSWindow,this)); - [[NSNotificationCenter defaultCenter] addObserver:(id)sm_cocoaObserver selector:@selector(notificationDidBecomeKey:) name:@"NSWindowDidBecomeKeyNotification" object:cocoaNSWindow]; - [[NSNotificationCenter defaultCenter] addObserver:(id)sm_cocoaObserver selector:@selector(notificationDidResignKey:) name:@"NSWindowDidResignKeyNotification" object:cocoaNSWindow]; + [cocoaNSWindow setDelegate: sm_cocoaDelegate]; } } @@ -82,12 +119,16 @@ void wxCocoaNSWindow::DisassociateNSWindow(WX_NSWindow cocoaNSWindow) { if(cocoaNSWindow) { - [[NSNotificationCenter defaultCenter] removeObserver:(id)sm_cocoaObserver name:@"NSWindowDidBecomeKeyNotification" object:cocoaNSWindow]; - [[NSNotificationCenter defaultCenter] removeObserver:(id)sm_cocoaObserver name:@"NSWindowDidResignKeyNotification" object:cocoaNSWindow]; + [cocoaNSWindow setDelegate: nil]; sm_cocoaHash.erase(cocoaNSWindow); } } +wxMenuBar* wxCocoaNSWindow::GetAppMenuBar(wxCocoaNSWindow *win) +{ + return NULL; +} + // ============================================================================ // @class wxPoserNSWindow // ============================================================================ @@ -95,33 +136,19 @@ void wxCocoaNSWindow::DisassociateNSWindow(WX_NSWindow cocoaNSWindow) { } -- (void)close; -- (BOOL)windowShouldClose: (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; } @end // implementation wxPoserNSWindow